├── 2018 ├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── app │ ├── Console │ │ └── Kernel.php │ ├── Exceptions │ │ ├── ApiCommunicationException.php │ │ ├── Handler.php │ │ ├── InvalidMeetupEventException.php │ │ └── TwitterApiCommunicationException.php │ ├── Http │ │ ├── Controllers │ │ │ ├── Auth │ │ │ │ ├── ForgotPasswordController.php │ │ │ │ ├── LoginController.php │ │ │ │ ├── RegisterController.php │ │ │ │ ├── ResetPasswordController.php │ │ │ │ └── VerificationController.php │ │ │ ├── ContactController.php │ │ │ ├── Controller.php │ │ │ ├── HomeController.php │ │ │ └── TalksController.php │ │ ├── Kernel.php │ │ └── Middleware │ │ │ ├── Authenticate.php │ │ │ ├── CheckForMaintenanceMode.php │ │ │ ├── EncryptCookies.php │ │ │ ├── RedirectIfAuthenticated.php │ │ │ ├── TrimStrings.php │ │ │ ├── TrustProxies.php │ │ │ └── VerifyCsrfToken.php │ ├── Mail │ │ └── ContactSubmitted.php │ ├── Meetup.php │ ├── Presenters │ │ └── TweetPresenter.php │ ├── Providers │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── BroadcastServiceProvider.php │ │ ├── EventServiceProvider.php │ │ ├── RouteServiceProvider.php │ │ └── ServicesServiceProvider.php │ ├── Services │ │ ├── MeetupDotCom.php │ │ └── Twitter.php │ ├── Sponsor.php │ ├── Talk.php │ ├── User.php │ └── UserProfile.php ├── artisan ├── bootstrap │ ├── app.php │ ├── cache │ │ └── .gitignore │ └── helpers.php ├── composer.json ├── composer.lock ├── config │ ├── app.php │ ├── auth.php │ ├── broadcasting.php │ ├── cache.php │ ├── contact.php │ ├── database.php │ ├── debugbar.php │ ├── filesystems.php │ ├── hashing.php │ ├── logging.php │ ├── mail.php │ ├── queue.php │ ├── services.php │ ├── session.php │ └── view.php ├── database │ ├── .gitignore │ ├── factories │ │ ├── MeetupFactory.php │ │ ├── SponsorFactory.php │ │ ├── TalkFactory.php │ │ ├── UserFactory.php │ │ └── UserProfileFactory.php │ ├── migrations │ │ ├── 2014_10_12_000000_create_users_table.php │ │ ├── 2014_10_12_000001_create_user_profiles_table.php │ │ ├── 2014_10_12_100000_create_password_resets_table.php │ │ ├── 2017_06_14_224930_create_meetups_table.php │ │ ├── 2017_06_15_224148_create_talks_table.php │ │ └── 2017_06_24_164832_create_sponsors_table.php │ └── seeds │ │ ├── DatabaseSeeder.php │ │ ├── MeetupsTableSeeder.php │ │ ├── SponsorsTableSeeder.php │ │ ├── TalksTableSeeder.php │ │ └── UsersTableSeeder.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── public │ ├── .DS_Store │ ├── .htaccess │ ├── css │ │ └── app.css │ ├── favicon.ico │ ├── img │ │ ├── android-browser-icon.png │ │ ├── avatars │ │ │ ├── chris.jpg │ │ │ ├── lawrence.jpg │ │ │ ├── neo.jpg │ │ │ ├── ore.jpg │ │ │ ├── stephen.jpg │ │ │ └── vanessa.jpg │ │ ├── community.jpg │ │ ├── conference.svg │ │ ├── contribute.jpg │ │ ├── empty.svg │ │ ├── favicon.png │ │ ├── file-search.svg │ │ ├── heart.svg │ │ ├── jumbo.jpg │ │ ├── logo-icon.png │ │ ├── logo.png │ │ ├── logo@2x.png │ │ ├── photo-placeholder.png │ │ ├── speaker.jpg │ │ ├── sponsor-andela.png │ │ ├── sponsor-ck.png │ │ ├── sponsor-devcenter.png │ │ ├── sponsor-findworka.png │ │ ├── sponsor-gigalayer.png │ │ ├── sponsor-nexmo.png │ │ ├── sponsor-pusher.png │ │ ├── sponsor-scotch.png │ │ ├── sprite.svg │ │ ├── talks.jpg │ │ ├── track-placeholder.png │ │ └── under-construction.svg │ ├── index.php │ ├── js │ │ └── app.js │ ├── mix-manifest.json │ ├── robots.txt │ ├── svg │ │ ├── 403.svg │ │ ├── 404.svg │ │ ├── 500.svg │ │ └── 503.svg │ └── videos │ │ ├── .gitignore │ │ └── readme.md ├── readme.md ├── resources │ ├── css │ │ └── app.css │ ├── img │ │ ├── android-browser-icon.png │ │ ├── community.jpg │ │ ├── conference.svg │ │ ├── contribute.jpg │ │ ├── empty.svg │ │ ├── favicon.png │ │ ├── file-search.svg │ │ ├── heart.svg │ │ ├── jumbo.jpg │ │ ├── logo-icon.png │ │ ├── logo.png │ │ ├── logo@2x.png │ │ ├── photo-placeholder.png │ │ ├── speaker.jpg │ │ ├── sponsor-andela.png │ │ ├── sponsor-ck.png │ │ ├── sponsor-devcenter.png │ │ ├── sponsor-findworka.png │ │ ├── sponsor-gigalayer.png │ │ ├── sponsor-nexmo.png │ │ ├── sponsor-pusher.png │ │ ├── sponsor-scotch.png │ │ ├── sprite.svg │ │ ├── talks.jpg │ │ ├── track-placeholder.png │ │ └── under-construction.svg │ ├── js │ │ ├── app.js │ │ ├── bootstrap.js │ │ ├── components │ │ │ ├── ContactFormComponent.vue │ │ │ ├── JumboComponent.vue │ │ │ ├── LearnComponent.vue │ │ │ ├── SlackInviterComponent.vue │ │ │ ├── SpeakerCallComponent.vue │ │ │ ├── SpeakerComponent.vue │ │ │ ├── SponsorsComponent.vue │ │ │ ├── TinyLetterSubscribeComponent.vue │ │ │ └── TweetComponent.vue │ │ └── utilities │ │ │ ├── mobileCheck.js │ │ │ ├── parallaxBackgroundImage.js │ │ │ ├── smoothScroll.js │ │ │ ├── snackbar.js │ │ │ ├── toggleContactModal.js │ │ │ └── validEmail.js │ ├── lang │ │ └── en │ │ │ ├── auth.php │ │ │ ├── pagination.php │ │ │ ├── passwords.php │ │ │ └── validation.php │ └── views │ │ ├── emails │ │ └── contact.blade.php │ │ ├── index.blade.php │ │ ├── layouts │ │ └── app.blade.php │ │ ├── partials │ │ ├── contact-modal.blade.php │ │ ├── footer.blade.php │ │ ├── gtm.blade.php │ │ ├── nav.blade.php │ │ └── popups.blade.php │ │ └── talks.blade.php ├── routes │ ├── api.php │ ├── channels.php │ ├── console.php │ └── web.php ├── server.php ├── storage │ ├── app │ │ ├── .gitignore │ │ └── public │ │ │ └── .gitignore │ ├── debugbar │ │ └── .gitignore │ ├── framework │ │ ├── .gitignore │ │ ├── cache │ │ │ ├── .gitignore │ │ │ └── data │ │ │ │ └── .gitignore │ │ ├── sessions │ │ │ └── .gitignore │ │ ├── testing │ │ │ └── .gitignore │ │ └── views │ │ │ └── .gitignore │ └── logs │ │ └── .gitignore ├── tailwind.js ├── tests │ ├── CreatesApplication.php │ ├── Feature │ │ └── ExampleTest.php │ ├── TestCase.php │ └── Unit │ │ └── ExampleTest.php ├── todo.md └── webpack.mix.js ├── 2019 ├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .styleci.yml ├── app │ ├── Console │ │ └── Kernel.php │ ├── Events │ │ └── TicketRegistrationComplete.php │ ├── Exceptions │ │ └── Handler.php │ ├── Http │ │ ├── Controllers │ │ │ ├── Api │ │ │ │ ├── SlackInviteController.php │ │ │ │ └── SpeakersController.php │ │ │ ├── Auth │ │ │ │ ├── ForgotPasswordController.php │ │ │ │ ├── LoginController.php │ │ │ │ ├── RegisterController.php │ │ │ │ ├── ResetPasswordController.php │ │ │ │ └── VerificationController.php │ │ │ ├── CodeOfConductController.php │ │ │ ├── Controller.php │ │ │ ├── HomeController.php │ │ │ └── RegistrationWebhookController.php │ │ ├── Kernel.php │ │ ├── Middleware │ │ │ ├── Authenticate.php │ │ │ ├── CheckForMaintenanceMode.php │ │ │ ├── EncryptCookies.php │ │ │ ├── RedirectIfAuthenticated.php │ │ │ ├── TrimStrings.php │ │ │ ├── TrustProxies.php │ │ │ └── VerifyCsrfToken.php │ │ └── Requests │ │ │ └── WebhookRequest.php │ ├── Listeners │ │ └── SendSponsorContactOptInNotification.php │ ├── Notifications │ │ └── VerifySponsorshipContactOptIn.php │ ├── Providers │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── BroadcastServiceProvider.php │ │ ├── EventServiceProvider.php │ │ └── RouteServiceProvider.php │ ├── TicketUser.php │ └── User.php ├── artisan ├── bootstrap │ ├── app.php │ └── cache │ │ └── .gitignore ├── composer.json ├── composer.lock ├── config │ ├── app.php │ ├── auth.php │ ├── broadcasting.php │ ├── cache.php │ ├── database.php │ ├── filesystems.php │ ├── hashing.php │ ├── logging.php │ ├── mail.php │ ├── queue.php │ ├── services.php │ ├── session.php │ ├── tito.php │ └── view.php ├── database │ ├── .gitignore │ ├── factories │ │ └── UserFactory.php │ ├── migrations │ │ ├── 2014_10_12_000000_create_users_table.php │ │ ├── 2014_10_12_100000_create_password_resets_table.php │ │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ │ └── 2019_09_29_133502_create_ticket_user_table.php │ └── seeders │ │ └── DatabaseSeeder.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── public │ ├── .DS_Store │ ├── .htaccess │ ├── css │ │ └── app.css │ ├── favicon.ico │ ├── img │ │ ├── .DS_Store │ │ ├── android-browser-icon.png │ │ ├── arrow.png │ │ ├── arrow.svg │ │ ├── community-slant-1.png │ │ ├── community-slant-2.png │ │ ├── community.jpg │ │ ├── facebook.png │ │ ├── github.png │ │ ├── logo-colored.png │ │ ├── logo.png │ │ ├── no-photo.png │ │ ├── play.png │ │ ├── play.svg │ │ ├── sample-icons │ │ │ ├── sponsor1.png │ │ │ ├── sponsor2.png │ │ │ ├── sponsor3.png │ │ │ ├── sponsor4.png │ │ │ ├── sponsor5.png │ │ │ ├── sponsor6.png │ │ │ ├── sponsor7.png │ │ │ └── sponsor8.png │ │ ├── speaker-stage.png │ │ ├── speaker1.png │ │ ├── speaker2.png │ │ ├── speaker3.png │ │ ├── speaker4.png │ │ ├── speaker5.png │ │ ├── speaker6.png │ │ ├── sponsor-ay.png │ │ ├── sponsor-ck-icon.png │ │ ├── sponsor-ck.png │ │ ├── sponsor-laravel.png │ │ ├── sponsor-pusher.png │ │ ├── sponsor.png │ │ ├── twitter.png │ │ └── video.png │ ├── index.php │ ├── js │ │ └── app.js │ ├── mix-manifest.json │ ├── robots.txt │ └── videos │ │ ├── bg.mp4 │ │ ├── bg.ogv │ │ └── bg.webm ├── resources │ ├── js │ │ ├── app.js │ │ ├── bootstrap.js │ │ └── components │ │ │ ├── ScheduleComponent.vue │ │ │ ├── SlackInviteComponent.vue │ │ │ └── SpeakersComponent.vue │ ├── lang │ │ └── en │ │ │ ├── auth.php │ │ │ ├── pagination.php │ │ │ ├── passwords.php │ │ │ └── validation.php │ ├── sass │ │ ├── _components.scss │ │ ├── _variables.scss │ │ ├── app.scss │ │ └── pages │ │ │ ├── _home.scss │ │ │ └── _single.scss │ └── views │ │ ├── layouts │ │ └── front.blade.php │ │ ├── pages │ │ ├── code-of-conduct.blade.php │ │ └── home.blade.php │ │ └── partials │ │ ├── footer.blade.php │ │ ├── gtm.blade.php │ │ └── nav.blade.php ├── routes │ ├── api.php │ ├── channels.php │ ├── console.php │ └── web.php ├── server.php ├── storage │ ├── app │ │ ├── .gitignore │ │ └── public │ │ │ └── .gitignore │ ├── framework │ │ ├── .gitignore │ │ ├── cache │ │ │ ├── .gitignore │ │ │ └── data │ │ │ │ └── .gitignore │ │ ├── sessions │ │ │ └── .gitignore │ │ ├── testing │ │ │ └── .gitignore │ │ └── views │ │ │ └── .gitignore │ └── logs │ │ └── .gitignore ├── tests │ ├── Bootstrap.php │ ├── CreatesApplication.php │ ├── Feature │ │ └── ExampleTest.php │ ├── TestCase.php │ └── Unit │ │ └── ExampleTest.php ├── todo.md └── webpack.mix.js ├── .gitignore ├── LICENSE ├── current └── deploy.sh /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | -------------------------------------------------------------------------------- /2018/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.yml] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /2018/.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | LOG_CHANNEL=stack 8 | 9 | DB_CONNECTION=mysql 10 | DB_HOST=127.0.0.1 11 | DB_PORT=3306 12 | DB_DATABASE=homestead 13 | DB_USERNAME=homestead 14 | DB_PASSWORD=secret 15 | 16 | BROADCAST_DRIVER=log 17 | CACHE_DRIVER=file 18 | QUEUE_CONNECTION=sync 19 | SESSION_DRIVER=file 20 | SESSION_LIFETIME=120 21 | 22 | REDIS_HOST=127.0.0.1 23 | REDIS_PASSWORD=null 24 | REDIS_PORT=6379 25 | 26 | MAIL_DRIVER=smtp 27 | MAIL_HOST=smtp.mailtrap.io 28 | MAIL_PORT=2525 29 | MAIL_USERNAME=null 30 | MAIL_PASSWORD=null 31 | MAIL_ENCRYPTION=null 32 | 33 | PUSHER_APP_ID= 34 | PUSHER_APP_KEY= 35 | PUSHER_APP_SECRET= 36 | PUSHER_APP_CLUSTER=mt1 37 | 38 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 39 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 40 | -------------------------------------------------------------------------------- /2018/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /2018/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | .env 7 | .phpunit.result.cache 8 | Homestead.json 9 | Homestead.yaml 10 | npm-debug.log 11 | yarn-error.log 12 | .env.bak 13 | -------------------------------------------------------------------------------- /2018/app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire') 28 | // ->hourly(); 29 | } 30 | 31 | /** 32 | * Register the commands for the application. 33 | * 34 | * @return void 35 | */ 36 | protected function commands() 37 | { 38 | $this->load(__DIR__.'/Commands'); 39 | 40 | require base_path('routes/console.php'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /2018/app/Exceptions/ApiCommunicationException.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /2018/app/Http/Controllers/Auth/LoginController.php: -------------------------------------------------------------------------------- 1 | middleware('guest')->except('logout'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /2018/app/Http/Controllers/Auth/RegisterController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 41 | } 42 | 43 | /** 44 | * Get a validator for an incoming registration request. 45 | * 46 | * @param array $data 47 | * @return \Illuminate\Contracts\Validation\Validator 48 | */ 49 | protected function validator(array $data) 50 | { 51 | return Validator::make($data, [ 52 | 'name' => ['required', 'string', 'max:255'], 53 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 54 | 'password' => ['required', 'string', 'min:6', 'confirmed'], 55 | ]); 56 | } 57 | 58 | /** 59 | * Create a new user instance after a valid registration. 60 | * 61 | * @param array $data 62 | * @return \App\User 63 | */ 64 | protected function create(array $data) 65 | { 66 | return User::create([ 67 | 'name' => $data['name'], 68 | 'email' => $data['email'], 69 | 'password' => Hash::make($data['password']), 70 | ]); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /2018/app/Http/Controllers/Auth/ResetPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /2018/app/Http/Controllers/Auth/VerificationController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 38 | $this->middleware('signed')->only('verify'); 39 | $this->middleware('throttle:6,1')->only('verify', 'resend'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /2018/app/Http/Controllers/ContactController.php: -------------------------------------------------------------------------------- 1 | validate([ 20 | 'email' => 'required|email', 21 | 'name' => 'required|string|between:5,100', 22 | 'message' => 'required|string|between:100,2000', 23 | ]); 24 | 25 | $to = config('contact.to'); 26 | 27 | // TODO: Make this an event instead. This is so we can hook other listeners. 28 | Mail::to($to['email'], $to['name'])->send(new ContactSubmitted( 29 | collect([ 30 | 'name' => $request->get('name'), 31 | 'replyTo' => $request->get('email'), 32 | 'message' => $request->get('message'), 33 | 'email' => config('contact.from.email'), 34 | ]) 35 | )); 36 | 37 | return response()->json(['success' => true]); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /2018/app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | get(); 20 | 21 | $tweets = Twitter::searchWithFallbackQuery()->get('tweets'); 22 | 23 | $tweet = $tweets->isNotEmpty() ? new TweetPresenter($tweets->random()) : false; 24 | 25 | return view('index', compact('sponsors', 'tweet')); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /2018/app/Http/Controllers/TalksController.php: -------------------------------------------------------------------------------- 1 | first()->get('details')); 13 | 14 | return view('talks', compact('meetups')); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /2018/app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /2018/app/Http/Middleware/CheckForMaintenanceMode.php: -------------------------------------------------------------------------------- 1 | check()) { 21 | return redirect('/home'); 22 | } 23 | 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /2018/app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | data = $data; 25 | } 26 | 27 | /** 28 | * Build the message. 29 | * 30 | * @return $this 31 | */ 32 | public function build() 33 | { 34 | return $this->markdown('emails.contact') 35 | ->with($this->data->toArray()) 36 | ->from($this->data->get('email'), $this->data->get('name')) 37 | ->replyTo($this->data->get('replyTo')) 38 | ->subject('Laravel Nigeria New Message'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /2018/app/Presenters/TweetPresenter.php: -------------------------------------------------------------------------------- 1 | tweet = new Collection([ 28 | 'original' => $tweet, 29 | 'user_name' => $tweet->user->name, 30 | 'user_screen_name' => $tweet->user->screen_name, 31 | 'text' => $tweet ? TwitterApi::linkify($tweet->text) : '', 32 | 'user_profile_link' => $tweet ? TwitterApi::linkUser($tweet->user) : '', 33 | 'user_avatar' => $tweet ? Twitter::avatar($tweet->user, 'bigger') : '', 34 | ]); 35 | } 36 | 37 | /** 38 | * Get a key from the tweet collection. 39 | * 40 | * @param string $key 41 | * @return mixed 42 | */ 43 | public function get(string $key) 44 | { 45 | return $this->tweet->get($key); 46 | } 47 | 48 | /** 49 | * Returns an array representation of the Tweet. 50 | * 51 | * @return array 52 | */ 53 | public function toArray(): array 54 | { 55 | return $this->tweet->toArray(); 56 | } 57 | 58 | /** 59 | * Returns a Collection representation of the Tweet. 60 | * 61 | * @return \Illuminate\Support\Collection 62 | */ 63 | public function toCollection(): \Illuminate\Support\Collection 64 | { 65 | return $this->tweet; 66 | } 67 | 68 | /** 69 | * Json serialisable data. 70 | * 71 | * @return array 72 | */ 73 | public function jsonSerialize(): array 74 | { 75 | return $this->toArray(); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /2018/app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | loadDevelopmentServiceProviders(); 17 | 18 | $this->loadPublicConfigItems(); 19 | } 20 | 21 | /** 22 | * Register any application services. 23 | * 24 | * @return void 25 | */ 26 | public function register() 27 | { 28 | } 29 | 30 | /** 31 | * Load the service providers that should only be available in development environment. 32 | * 33 | * @return void 34 | */ 35 | protected function loadDevelopmentServiceProviders() 36 | { 37 | if (app()->environment('local')) { 38 | app()->register(\Barryvdh\Debugbar\ServiceProvider::class); 39 | } 40 | } 41 | 42 | /** 43 | * Load the configuration items to make available to JavaScript. 44 | * 45 | * @return void 46 | */ 47 | protected function loadPublicConfigItems() 48 | { 49 | $appConfigKeys = [ 50 | 'name', 'url', 'twitter', 'welcome_message', 'jumbo_videos', 'cfp_link' 51 | ]; 52 | 53 | view()->share('lnConfig', json_encode([ 54 | 'app' => array_only(config('app'), $appConfigKeys) 55 | ])); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /2018/app/Providers/AuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | * 22 | * @return void 23 | */ 24 | public function boot() 25 | { 26 | $this->registerPolicies(); 27 | 28 | // 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /2018/app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 19 | SendEmailVerificationNotification::class, 20 | ], 21 | ]; 22 | 23 | /** 24 | * Register any events for your application. 25 | * 26 | * @return void 27 | */ 28 | public function boot() 29 | { 30 | parent::boot(); 31 | 32 | // 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /2018/app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 39 | 40 | $this->mapWebRoutes(); 41 | 42 | // 43 | } 44 | 45 | /** 46 | * Define the "web" routes for the application. 47 | * 48 | * These routes all receive session state, CSRF protection, etc. 49 | * 50 | * @return void 51 | */ 52 | protected function mapWebRoutes() 53 | { 54 | Route::middleware('web') 55 | ->namespace($this->namespace) 56 | ->group(base_path('routes/web.php')); 57 | } 58 | 59 | /** 60 | * Define the "api" routes for the application. 61 | * 62 | * These routes are typically stateless. 63 | * 64 | * @return void 65 | */ 66 | protected function mapApiRoutes() 67 | { 68 | Route::prefix('api') 69 | ->middleware('api') 70 | ->namespace($this->namespace) 71 | ->group(base_path('routes/api.php')); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /2018/app/Providers/ServicesServiceProvider.php: -------------------------------------------------------------------------------- 1 | loadMeetupCommunityDetails(); 19 | } 20 | 21 | /** 22 | * Register any application services. 23 | * 24 | * @return void 25 | */ 26 | public function register() 27 | { 28 | $this->app->bind('App\\Services\\MeetupDotCom', function () { 29 | return new MeetupDotCom([ 30 | 'key' => config('services.meetup.key'), 31 | 'urlName' => config('services.meetup.urlName'), 32 | ]); 33 | }); 34 | } 35 | 36 | /** 37 | * Loads some global view variables. 38 | * 39 | * @return void 40 | */ 41 | protected function loadMeetupCommunityDetails() 42 | { 43 | try { 44 | view()->share( 45 | 'meetup__next_event', 46 | Meetup::groupDetailsWithNextEvent()->get('next_event') 47 | ); 48 | } catch (\Exception $e) { 49 | // Possibly a database connection error happened 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /2018/app/Sponsor.php: -------------------------------------------------------------------------------- 1 | 'int', 30 | ]; 31 | 32 | /** 33 | * Indicates if the model should be timestamped. 34 | * 35 | * @var bool 36 | */ 37 | public $timestamps = false; 38 | 39 | /** 40 | * Get all the sponsors. 41 | * 42 | * @param $query 43 | * @return mixed 44 | */ 45 | public function scopeOrderedByLevel($query) 46 | { 47 | return $query->orderBy('level', 'desc'); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /2018/app/User.php: -------------------------------------------------------------------------------- 1 | hasOne(UserProfile::class); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /2018/app/UserProfile.php: -------------------------------------------------------------------------------- 1 | 'array', 34 | ]; 35 | 36 | /** 37 | * The accessors to append to the model's array form. 38 | * 39 | * @var array 40 | */ 41 | protected $appends = [ 42 | 'fullName', 43 | ]; 44 | 45 | /** 46 | * Get the users full name. 47 | * 48 | * @return string 49 | */ 50 | public function getFullNameAttribute(): string 51 | { 52 | return "{$this->attributes['first_name']} {$this->attributes['last_name']}"; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /2018/artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /2018/bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /2018/bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/bootstrap/helpers.php: -------------------------------------------------------------------------------- 1 | {$line}

"; 17 | } 18 | } 19 | 20 | return $paragraphs; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /2018/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "type": "project", 4 | "description": "The Laravel Framework.", 5 | "keywords": [ 6 | "framework", 7 | "laravel" 8 | ], 9 | "license": "MIT", 10 | "require": { 11 | "php": "^7.1.3", 12 | "fideloper/proxy": "^4.0", 13 | "laravel-frontend-presets/tailwindcss": "^0.7.0", 14 | "laravel/framework": "5.7.*", 15 | "laravel/tinker": "^1.0", 16 | "thujohn/twitter": "^2.2" 17 | }, 18 | "require-dev": { 19 | "barryvdh/laravel-debugbar": "^3.2", 20 | "beyondcode/laravel-dump-server": "^1.0", 21 | "filp/whoops": "^2.0", 22 | "fzaninotto/faker": "^1.4", 23 | "mockery/mockery": "^1.0", 24 | "nunomaduro/collision": "^2.0", 25 | "phpunit/phpunit": "^7.0" 26 | }, 27 | "config": { 28 | "optimize-autoloader": true, 29 | "preferred-install": "dist", 30 | "sort-packages": true 31 | }, 32 | "extra": { 33 | "laravel": { 34 | "dont-discover": [ 35 | "barryvdh/laravel-debugbar" 36 | ] 37 | } 38 | }, 39 | "autoload": { 40 | "psr-4": { 41 | "App\\": "app/" 42 | }, 43 | "classmap": [ 44 | "database/seeds", 45 | "database/factories" 46 | ], 47 | "files": [ 48 | "bootstrap/helpers.php" 49 | ] 50 | }, 51 | "autoload-dev": { 52 | "psr-4": { 53 | "Tests\\": "tests/" 54 | } 55 | }, 56 | "minimum-stability": "dev", 57 | "prefer-stable": true, 58 | "scripts": { 59 | "post-autoload-dump": [ 60 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 61 | "@php artisan package:discover --ansi" 62 | ], 63 | "post-root-package-install": [ 64 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 65 | ], 66 | "post-create-project-cmd": [ 67 | "@php artisan key:generate --ansi" 68 | ] 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /2018/config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'encrypted' => true, 41 | ], 42 | ], 43 | 44 | 'redis' => [ 45 | 'driver' => 'redis', 46 | 'connection' => 'default', 47 | ], 48 | 49 | 'log' => [ 50 | 'driver' => 'log', 51 | ], 52 | 53 | 'null' => [ 54 | 'driver' => 'null', 55 | ], 56 | 57 | ], 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /2018/config/contact.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'name' => env('CONTACT_MSG_SEND_TO_NAME', 'Neo Ighodaro'), 6 | 'email' => env('CONTACT_MSG_SEND_TO_EMAIL', 'neo@creativitykills.co'), 7 | ], 8 | 9 | 'from' => [ 10 | 'email' => env('CONTACT_MSG_SEND_FROM_EMAIL', 'neo@creativitykills.co'), 11 | ], 12 | ]; 13 | -------------------------------------------------------------------------------- /2018/config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | 'url' => env('AWS_URL'), 65 | ], 66 | 67 | ], 68 | 69 | ]; 70 | -------------------------------------------------------------------------------- /2018/config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Bcrypt Options 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may specify the configuration options that should be used when 26 | | passwords are hashed using the Bcrypt algorithm. This will allow you 27 | | to control the amount of time it takes to hash the given password. 28 | | 29 | */ 30 | 31 | 'bcrypt' => [ 32 | 'rounds' => env('BCRYPT_ROUNDS', 10), 33 | ], 34 | 35 | /* 36 | |-------------------------------------------------------------------------- 37 | | Argon Options 38 | |-------------------------------------------------------------------------- 39 | | 40 | | Here you may specify the configuration options that should be used when 41 | | passwords are hashed using the Argon algorithm. These will allow you 42 | | to control the amount of time it takes to hash the given password. 43 | | 44 | */ 45 | 46 | 'argon' => [ 47 | 'memory' => 1024, 48 | 'threads' => 2, 49 | 'time' => 2, 50 | ], 51 | 52 | ]; 53 | -------------------------------------------------------------------------------- /2018/config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /2018/database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /2018/database/factories/MeetupFactory.php: -------------------------------------------------------------------------------- 1 | define(App\Meetup::class, function (Faker $faker) { 6 | static $event_id; 7 | 8 | if ($event_id) { 9 | // Quite specific to Laravel Nigeria's meetup page and its events... 10 | $event_id = $event_id === 238642730 ? 240522436 : rand(100000000, 999999999); 11 | } 12 | 13 | $meetup_name = config('services.meetup.urlName'); 14 | 15 | return [ 16 | 'event_id' => $event_id ?: $event_id = 238642730, 17 | 'link' => "https://www.meetup.com/{$meetup_name}/events/{$event_id}/", 18 | ]; 19 | }); 20 | -------------------------------------------------------------------------------- /2018/database/factories/SponsorFactory.php: -------------------------------------------------------------------------------- 1 | define(App\Sponsor::class, function (Faker $faker) { 6 | return [ 7 | 'name' => $faker->company, 8 | 'description' => $faker->realText(90), 9 | 'level' => rand(1, 10), 10 | 'responsible_for' => $faker->realText(20), 11 | 'link' => $faker->url, 12 | 'logo' => $faker->imageUrl(100, 30), 13 | ]; 14 | }); 15 | -------------------------------------------------------------------------------- /2018/database/factories/TalkFactory.php: -------------------------------------------------------------------------------- 1 | define(App\Talk::class, function (Faker $faker) { 6 | return [ 7 | 'user_id' => App\User::inRandomOrder()->first()->id, 8 | 'meetup_id' => App\Meetup::inRandomOrder()->first()->id, 9 | 'topic' => $faker->sentence, 10 | 'overview' => $faker->paragraphs(3, true), 11 | 'accepted' => (bool) rand(0, 1), 12 | 'video_url' => $faker->url, 13 | 'slides_url' => $faker->url, 14 | ]; 15 | }); 16 | -------------------------------------------------------------------------------- /2018/database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(App\User::class, function (Faker $faker) { 17 | return [ 18 | 'email' => $faker->unique()->safeEmail, 19 | // 'email_verified_at' => now(), 20 | 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 21 | 'remember_token' => str_random(10), 22 | ]; 23 | }); 24 | -------------------------------------------------------------------------------- /2018/database/factories/UserProfileFactory.php: -------------------------------------------------------------------------------- 1 | define(App\UserProfile::class, function (Faker $faker) { 6 | return [ 7 | 'first_name' => $faker->firstName, 8 | 'last_name' => $faker->lastName, 9 | 'gender' => rand(0, 1) ? 'Male' : 'Female', 10 | 'bio' => $faker->realText(200), 11 | 'stack' => json_encode(['php', 'laravel', 'vue']), 12 | 'job' => "{$faker->jobTitle}, {$faker->company}", 13 | 'social_links' => ['twitter' => '#', 'facebook' => '#'], 14 | 'avatar' => 'https://randomuser.me/api/portraits/men/' . rand(50, 80) . '.jpg', 15 | ]; 16 | }); 17 | -------------------------------------------------------------------------------- /2018/database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('email')->unique(); 19 | $table->string('password'); 20 | $table->rememberToken(); 21 | $table->timestamps(); 22 | 23 | $table->softDeletes(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('users'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /2018/database/migrations/2014_10_12_000001_create_user_profiles_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->unsignedInteger('user_id'); 19 | $table->string('first_name'); 20 | $table->string('last_name'); 21 | $table->string('gender')->nullable(); 22 | $table->string('bio', 300)->nullable(); 23 | $table->json('stack')->nullable(); 24 | $table->string('avatar')->default('/img/nophoto.png'); 25 | $table->string('job')->nullable(); 26 | $table->json('social_links')->nullable(); 27 | $table->timestamps(); 28 | $table->softDeletes(); 29 | 30 | $table->foreign('user_id')->references('id')->on('users'); 31 | }); 32 | } 33 | 34 | /** 35 | * Reverse the migrations. 36 | * 37 | * @return void 38 | */ 39 | public function down() 40 | { 41 | Schema::dropIfExists('user_profiles'); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /2018/database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /2018/database/migrations/2017_06_14_224930_create_meetups_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->unsignedInteger('event_id')->unique(); 19 | $table->string('link'); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('meetups'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /2018/database/migrations/2017_06_15_224148_create_talks_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->unsignedInteger('user_id'); 19 | $table->unsignedInteger('meetup_id'); 20 | $table->string('topic'); 21 | $table->string('overview', 1000); 22 | $table->string('video_url')->nullable(); 23 | $table->string('slides_url')->nullable(); 24 | $table->boolean('accepted')->default(false); 25 | $table->timestamps(); 26 | $table->softDeletes(); 27 | 28 | $table->foreign('user_id')->references('id')->on('users'); 29 | $table->foreign('meetup_id')->references('id')->on('meetups'); 30 | }); 31 | } 32 | 33 | /** 34 | * Reverse the migrations. 35 | * 36 | * @return void 37 | */ 38 | public function down() 39 | { 40 | Schema::dropIfExists('talks'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /2018/database/migrations/2017_06_24_164832_create_sponsors_table.php: -------------------------------------------------------------------------------- 1 | string('name'); 18 | $table->string('description', 100)->nullable(); 19 | $table->unsignedSmallInteger('level')->default(1); 20 | $table->string('responsible_for', 100)->nullable(); 21 | $table->string('link'); 22 | $table->string('logo'); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('sponsors'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /2018/database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call([ 15 | UsersTableSeeder::class, 16 | MeetupsTableSeeder::class, 17 | SponsorsTableSeeder::class, 18 | TalksTableSeeder::class, 19 | ]); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /2018/database/seeds/MeetupsTableSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /2018/database/seeds/TalksTableSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /2018/database/seeds/UsersTableSeeder.php: -------------------------------------------------------------------------------- 1 | create()->each(function ($user) { 15 | $user->profile()->save(factory(App\UserProfile::class)->make()); 16 | }); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /2018/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "npm run development -- --watch", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.18", 14 | "copy-webpack-plugin": "^4.6.0", 15 | "cross-env": "^5.1", 16 | "imagemin-mozjpeg": "^8.0.0", 17 | "imagemin-webpack-plugin": "^2.3.0", 18 | "laravel-mix": "^2.1.14", 19 | "laravel-mix-purgecss": "^2.2", 20 | "laravel-mix-tailwind": "^0.1.0", 21 | "lodash": "^4.17.13", 22 | "popper.js": "^1.12", 23 | "resolve-url-loader": "^2.3.1", 24 | "sass": "^1.15.2", 25 | "sass-loader": "^7.1.0", 26 | "tailwindcss": "^0.7.3", 27 | "vue": "^2.5.17", 28 | "vue-moment": "^4.0.0" 29 | }, 30 | "dependencies": { 31 | "vue-owl-carousel": "^2.0.3" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /2018/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Unit 14 | 15 | 16 | 17 | ./tests/Feature 18 | 19 | 20 | 21 | 22 | ./app 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /2018/public/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/.DS_Store -------------------------------------------------------------------------------- /2018/public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /2018/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/favicon.ico -------------------------------------------------------------------------------- /2018/public/img/android-browser-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/android-browser-icon.png -------------------------------------------------------------------------------- /2018/public/img/avatars/chris.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/avatars/chris.jpg -------------------------------------------------------------------------------- /2018/public/img/avatars/lawrence.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/avatars/lawrence.jpg -------------------------------------------------------------------------------- /2018/public/img/avatars/neo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/avatars/neo.jpg -------------------------------------------------------------------------------- /2018/public/img/avatars/ore.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/avatars/ore.jpg -------------------------------------------------------------------------------- /2018/public/img/avatars/stephen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/avatars/stephen.jpg -------------------------------------------------------------------------------- /2018/public/img/avatars/vanessa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/avatars/vanessa.jpg -------------------------------------------------------------------------------- /2018/public/img/community.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/community.jpg -------------------------------------------------------------------------------- /2018/public/img/contribute.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/contribute.jpg -------------------------------------------------------------------------------- /2018/public/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/favicon.png -------------------------------------------------------------------------------- /2018/public/img/heart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /2018/public/img/jumbo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/jumbo.jpg -------------------------------------------------------------------------------- /2018/public/img/logo-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/logo-icon.png -------------------------------------------------------------------------------- /2018/public/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/logo.png -------------------------------------------------------------------------------- /2018/public/img/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/logo@2x.png -------------------------------------------------------------------------------- /2018/public/img/photo-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/photo-placeholder.png -------------------------------------------------------------------------------- /2018/public/img/speaker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/speaker.jpg -------------------------------------------------------------------------------- /2018/public/img/sponsor-andela.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-andela.png -------------------------------------------------------------------------------- /2018/public/img/sponsor-ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-ck.png -------------------------------------------------------------------------------- /2018/public/img/sponsor-devcenter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-devcenter.png -------------------------------------------------------------------------------- /2018/public/img/sponsor-findworka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-findworka.png -------------------------------------------------------------------------------- /2018/public/img/sponsor-gigalayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-gigalayer.png -------------------------------------------------------------------------------- /2018/public/img/sponsor-nexmo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-nexmo.png -------------------------------------------------------------------------------- /2018/public/img/sponsor-pusher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-pusher.png -------------------------------------------------------------------------------- /2018/public/img/sponsor-scotch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/sponsor-scotch.png -------------------------------------------------------------------------------- /2018/public/img/talks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/talks.jpg -------------------------------------------------------------------------------- /2018/public/img/track-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/public/img/track-placeholder.png -------------------------------------------------------------------------------- /2018/public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | define('LARAVEL_START', microtime(true)); 11 | 12 | /* 13 | |-------------------------------------------------------------------------- 14 | | Register The Auto Loader 15 | |-------------------------------------------------------------------------- 16 | | 17 | | Composer provides a convenient, automatically generated class loader for 18 | | our application. We just need to utilize it! We'll simply require it 19 | | into the script here so that we don't have to worry about manual 20 | | loading any of our classes later on. It feels great to relax. 21 | | 22 | */ 23 | 24 | require __DIR__.'/../vendor/autoload.php'; 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Turn On The Lights 29 | |-------------------------------------------------------------------------- 30 | | 31 | | We need to illuminate PHP development, so let us turn on the lights. 32 | | This bootstraps the framework and gets it ready for use, then it 33 | | will load up this application so that we can run it and send 34 | | the responses back to the browser and delight our users. 35 | | 36 | */ 37 | 38 | $app = require_once __DIR__.'/../bootstrap/app.php'; 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Run The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once we have the application, we can handle the incoming request 46 | | through the kernel, and send the associated response back to 47 | | the client's browser allowing them to enjoy the creative 48 | | and wonderful application we have prepared for them. 49 | | 50 | */ 51 | 52 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 53 | 54 | $response = $kernel->handle( 55 | $request = Illuminate\Http\Request::capture() 56 | ); 57 | 58 | $response->send(); 59 | 60 | $kernel->terminate($request, $response); 61 | -------------------------------------------------------------------------------- /2018/public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/app.js": "/js/app.js?id=8f94480444ffca9e0334", 3 | "/css/app.css": "/css/app.css?id=e595d7fc243b673b7743" 4 | } 5 | -------------------------------------------------------------------------------- /2018/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /2018/public/videos/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | !readme.md 4 | -------------------------------------------------------------------------------- /2018/public/videos/readme.md: -------------------------------------------------------------------------------- 1 | ## Video files 2 | 3 | The video files are available here: https://www.dropbox.com/sh/tmwntdsatwq0da9/AAB-JH4yMdLaexMsrVXIZCyya?dl=0 4 | -------------------------------------------------------------------------------- /2018/resources/img/android-browser-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/android-browser-icon.png -------------------------------------------------------------------------------- /2018/resources/img/community.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/community.jpg -------------------------------------------------------------------------------- /2018/resources/img/contribute.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/contribute.jpg -------------------------------------------------------------------------------- /2018/resources/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/favicon.png -------------------------------------------------------------------------------- /2018/resources/img/heart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /2018/resources/img/jumbo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/jumbo.jpg -------------------------------------------------------------------------------- /2018/resources/img/logo-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/logo-icon.png -------------------------------------------------------------------------------- /2018/resources/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/logo.png -------------------------------------------------------------------------------- /2018/resources/img/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/logo@2x.png -------------------------------------------------------------------------------- /2018/resources/img/photo-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/photo-placeholder.png -------------------------------------------------------------------------------- /2018/resources/img/speaker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/speaker.jpg -------------------------------------------------------------------------------- /2018/resources/img/sponsor-andela.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-andela.png -------------------------------------------------------------------------------- /2018/resources/img/sponsor-ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-ck.png -------------------------------------------------------------------------------- /2018/resources/img/sponsor-devcenter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-devcenter.png -------------------------------------------------------------------------------- /2018/resources/img/sponsor-findworka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-findworka.png -------------------------------------------------------------------------------- /2018/resources/img/sponsor-gigalayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-gigalayer.png -------------------------------------------------------------------------------- /2018/resources/img/sponsor-nexmo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-nexmo.png -------------------------------------------------------------------------------- /2018/resources/img/sponsor-pusher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-pusher.png -------------------------------------------------------------------------------- /2018/resources/img/sponsor-scotch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/sponsor-scotch.png -------------------------------------------------------------------------------- /2018/resources/img/talks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/talks.jpg -------------------------------------------------------------------------------- /2018/resources/img/track-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2018/resources/img/track-placeholder.png -------------------------------------------------------------------------------- /2018/resources/js/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * First we will load all of this project's JavaScript dependencies which 3 | * includes Vue and other libraries. It is a great starting point when 4 | * building robust, powerful web applications using Vue and Laravel. 5 | */ 6 | 7 | require('./bootstrap'); 8 | 9 | window.Vue = require('vue'); 10 | 11 | Vue.use(require('vue-moment')); 12 | 13 | /** 14 | * The following block of code may be used to automatically register your 15 | * Vue components. It will recursively scan this directory for the Vue 16 | * components and automatically register them with their "basename". 17 | * 18 | * Eg. ./components/ExampleComponent.vue -> 19 | */ 20 | 21 | // const files = require.context('./', true, /\.vue$/i) 22 | // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)) 23 | 24 | Vue.component('jumbo', require('./components/JumboComponent.vue')); 25 | Vue.component('single-tweet', require('./components/TweetComponent.vue')); 26 | Vue.component('learn-laravel', require('./components/LearnComponent.vue')); 27 | Vue.component('single-speaker', require('./components/SpeakerComponent.vue')); 28 | Vue.component('contact-form', require('./components/ContactFormComponent.vue')); 29 | Vue.component('sponsors-slider', require('./components/SponsorsComponent.vue')); 30 | Vue.component('speaker-call', require('./components/SpeakerCallComponent.vue')); 31 | Vue.component('slack-inviter', require('./components/SlackInviterComponent.vue')); 32 | Vue.component('tinyletter-subscribe', require('./components/TinyLetterSubscribeComponent.vue')); 33 | 34 | /** 35 | * Next, we will create a fresh Vue application instance and attach it to 36 | * the page. Then, you may begin adding components to this application 37 | * or customize the JavaScript scaffolding to fit your unique needs. 38 | */ 39 | 40 | const app = new Vue({ 41 | el: '#app' 42 | }); 43 | -------------------------------------------------------------------------------- /2018/resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | import snackbar from './utilities/snackbar'; 2 | 3 | window._ = require('lodash'); 4 | // window.Popper = require('popper.js').default; 5 | 6 | try { 7 | window.$ = window.jQuery = require('jquery'); 8 | 9 | require('./utilities/smoothScroll'); 10 | require('./utilities/toggleContactModal'); 11 | require('./utilities/parallaxBackgroundImage'); 12 | 13 | // Override the alert function...its too meh! 14 | window.alert = (msg, type) => snackbar(msg, type || 'error'); 15 | } catch (e) { 16 | // 17 | } 18 | 19 | /** 20 | * We'll load the axios HTTP library which allows us to easily issue requests 21 | * to our Laravel back-end. This library automatically handles sending the 22 | * CSRF token as a header based on the value of the "XSRF" token cookie. 23 | */ 24 | 25 | window.axios = require('axios'); 26 | 27 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 28 | 29 | /** 30 | * Next we will register the CSRF Token as a common header with Axios so that 31 | * all outgoing HTTP requests automatically have it attached. This is just 32 | * a simple convenience so we don't have to attach every token manually. 33 | */ 34 | 35 | let token = document.head.querySelector('meta[name="csrf-token"]'); 36 | 37 | if (token) { 38 | window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; 39 | } else { 40 | console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); 41 | } 42 | 43 | /** 44 | * Echo exposes an expressive API for subscribing to channels and listening 45 | * for events that are broadcast by Laravel. Echo and event broadcasting 46 | * allows your team to easily build robust real-time web applications. 47 | */ 48 | 49 | // import Echo from 'laravel-echo' 50 | 51 | // window.Pusher = require('pusher-js'); 52 | 53 | // window.Echo = new Echo({ 54 | // broadcaster: 'pusher', 55 | // key: process.env.MIX_PUSHER_APP_KEY, 56 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 57 | // encrypted: true 58 | // }); 59 | -------------------------------------------------------------------------------- /2018/resources/js/components/LearnComponent.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 31 | -------------------------------------------------------------------------------- /2018/resources/js/components/SlackInviterComponent.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 25 | 26 | 60 | -------------------------------------------------------------------------------- /2018/resources/js/components/SpeakerCallComponent.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 32 | 33 | 34 | 46 | 47 | -------------------------------------------------------------------------------- /2018/resources/js/components/SponsorsComponent.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 42 | 43 | 44 | 57 | 58 | -------------------------------------------------------------------------------- /2018/resources/js/components/TinyLetterSubscribeComponent.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 49 | 50 | 81 | 82 | -------------------------------------------------------------------------------- /2018/resources/js/utilities/mobileCheck.js: -------------------------------------------------------------------------------- 1 | export default function() { 2 | let mobileCheck = false; 3 | (function(a) { 4 | if ( 5 | /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test( 6 | a 7 | ) || 8 | /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( 9 | a.substr(0, 4) 10 | ) 11 | ) 12 | mobileCheck = true; 13 | })(navigator.userAgent || navigator.vendor || window.opera); 14 | return mobileCheck; 15 | } 16 | -------------------------------------------------------------------------------- /2018/resources/js/utilities/parallaxBackgroundImage.js: -------------------------------------------------------------------------------- 1 | (() => { 2 | $(document).ready(() => { 3 | const div = $('*[parallax]'); 4 | 5 | const movementStrength = 15; 6 | const height = movementStrength / $(window).height(); 7 | const width = movementStrength / $(window).width(); 8 | 9 | $(window).resize(() => div.css('background-position', 'center center')); 10 | 11 | div.mousemove(e => { 12 | const pageWidth = $(window).width(); 13 | const pageHeight = $(window).width(); 14 | 15 | if (pageWidth >= 768) { 16 | const pageX = e.pageX - pageWidth / 2; 17 | const pageY = e.pageY - pageHeight / 2; 18 | const newvalueX = width * pageX * -1 - 2; 19 | const newvalueY = height * pageY * -1 - 50; 20 | div.css('background-position', `${newvalueX}px ${newvalueY}px`); 21 | } 22 | }); 23 | }); 24 | })(); 25 | -------------------------------------------------------------------------------- /2018/resources/js/utilities/smoothScroll.js: -------------------------------------------------------------------------------- 1 | $(document).ready(() => { 2 | $('[smooth-scroll] a').on('click', function() { 3 | if ($(this).attr('href') !== '#') { 4 | $('.active').removeClass('active'); 5 | $(this).closest('li').addClass('active'); 6 | 7 | $('.' + $(this).attr("class")).parent('li').addClass('active'); 8 | 9 | try { 10 | $('html, body').stop().animate({ 11 | scrollTop: $($(this).attr('href').replace('/', '')).offset().top 12 | }, 400); 13 | } catch (e) { 14 | // 15 | return true; 16 | } 17 | 18 | return false; 19 | } 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /2018/resources/js/utilities/snackbar.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Snackbar is the notification function to display quick notifications on the site. 3 | * 4 | * @param message 5 | */ 6 | export default (message, type = 'error') => { 7 | let snackbar = document.getElementById('snackbar'); 8 | snackbar.innerHTML = message; 9 | snackbar.className = `show ${type}`; 10 | setTimeout(() => (snackbar.className = snackbar.className.replace(`show ${type}`, '')), 3000); 11 | }; 12 | -------------------------------------------------------------------------------- /2018/resources/js/utilities/toggleContactModal.js: -------------------------------------------------------------------------------- 1 | window.toggleContactModal = () => $('#contact-modal').toggleClass('show'); 2 | -------------------------------------------------------------------------------- /2018/resources/js/utilities/validEmail.js: -------------------------------------------------------------------------------- 1 | export default function(email) { 2 | const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 3 | return re.test(email); 4 | } 5 | -------------------------------------------------------------------------------- /2018/resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /2018/resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /2018/resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Passwords must be at least six characters and match the confirmation.', 17 | 'reset' => 'Your password has been reset!', 18 | 'sent' => 'We have e-mailed your password reset link!', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that e-mail address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /2018/resources/views/emails/contact.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | Hello, 3 | 4 | {{ $message }} 5 | 6 | Thanks,
7 | {{ config('app.name') }} 8 | @endcomponent 9 | -------------------------------------------------------------------------------- /2018/resources/views/partials/contact-modal.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 9 | 10 | 11 |
12 | 13 |
14 |
15 | -------------------------------------------------------------------------------- /2018/resources/views/partials/footer.blade.php: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /2018/resources/views/partials/gtm.blade.php: -------------------------------------------------------------------------------- 1 | {{-- Google Tag Manager --}} 2 | @if (config('services.google_tag_manager.id')) 3 | 4 | 5 | @endif 6 | -------------------------------------------------------------------------------- /2018/resources/views/partials/nav.blade.php: -------------------------------------------------------------------------------- 1 | 33 | -------------------------------------------------------------------------------- /2018/routes/api.php: -------------------------------------------------------------------------------- 1 | name('contact'); 15 | -------------------------------------------------------------------------------- /2018/routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 16 | }); 17 | -------------------------------------------------------------------------------- /2018/routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 18 | })->describe('Display an inspiring quote'); 19 | -------------------------------------------------------------------------------- /2018/routes/web.php: -------------------------------------------------------------------------------- 1 | name('talks'); 15 | Route::get('/', 'HomeController')->name('index'); 16 | -------------------------------------------------------------------------------- /2018/server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /2018/storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /2018/storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/storage/debugbar/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /2018/storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /2018/storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2018/tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /2018/tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /2018/tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /2018/todo.md: -------------------------------------------------------------------------------- 1 | ## Todo List 2 | 3 | [ ] Use an event instead of the Mail class directly `app/Http/Controllers/ContactController.php`. 4 | [ ] Jobs portal. 5 | [ ] Learning portal. 6 | [ ] Create Twitter app for the Laravel Nigeria application. 7 | [ ] Team page with contribution instructions. 8 | [ ] Administrative panel to manage users and talks. 9 | [ ] Meetup feedback popup with link to leave review and photos. 10 | -------------------------------------------------------------------------------- /2018/webpack.mix.js: -------------------------------------------------------------------------------- 1 | const mix = require('laravel-mix'); 2 | const ImageminPlugin = require('imagemin-webpack-plugin').default; 3 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 4 | const imageminMozjpeg = require('imagemin-mozjpeg'); 5 | 6 | require('laravel-mix-tailwind'); 7 | require('laravel-mix-purgecss'); 8 | 9 | /** 10 | * Webpack config 11 | */ 12 | 13 | mix.webpackConfig({ 14 | plugins: [ 15 | new CopyWebpackPlugin([{ from: 'resources/img', to: 'img' }]), 16 | new ImageminPlugin({ 17 | test: /\.(jpe?g|png|gif)$/i, 18 | plugins: [imageminMozjpeg({ quality: 70 })] 19 | }) 20 | ] 21 | }); 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Mix Asset Management 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Mix provides a clean, fluent API for defining some Webpack build steps 29 | | for your Laravel application. By default, we are compiling the Sass 30 | | file for the application as well as bundling up all the JS files. 31 | | 32 | */ 33 | 34 | mix.js('resources/js/app.js', 'public/js') 35 | .postCss('resources/css/app.css', 'public/css') 36 | .tailwind() 37 | .options({ processCssUrls: false }) 38 | .purgeCss({ whitelistPatternsChildren: [/CommunityInviter$/] }); 39 | 40 | if (mix.inProduction()) { 41 | mix.version(); 42 | } 43 | -------------------------------------------------------------------------------- /2019/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /2019/.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | TITO_WEBHOOK_URL="webhook" 8 | TITO_TICKET_CONFIRMATION_SLUG= 9 | 10 | LOG_CHANNEL=stack 11 | 12 | DB_CONNECTION=mysql 13 | DB_HOST=127.0.0.1 14 | DB_PORT=3306 15 | DB_DATABASE=laravel 16 | DB_USERNAME=root 17 | DB_PASSWORD= 18 | 19 | BROADCAST_DRIVER=log 20 | CACHE_DRIVER=file 21 | QUEUE_CONNECTION=sync 22 | SESSION_DRIVER=file 23 | SESSION_LIFETIME=120 24 | 25 | REDIS_HOST=127.0.0.1 26 | REDIS_PASSWORD=null 27 | REDIS_PORT=6379 28 | 29 | MAIL_DRIVER=smtp 30 | MAIL_HOST=smtp.mailtrap.io 31 | MAIL_PORT=2525 32 | MAIL_USERNAME=null 33 | MAIL_PASSWORD=null 34 | MAIL_ENCRYPTION=null 35 | 36 | AWS_ACCESS_KEY_ID= 37 | AWS_SECRET_ACCESS_KEY= 38 | AWS_DEFAULT_REGION=us-east-1 39 | AWS_BUCKET= 40 | 41 | GOOGLE_TAG_MANAGER_ID= 42 | 43 | SLACK_TOKEN= 44 | SLACK_HOSTNAME= 45 | 46 | PUSHER_APP_ID= 47 | PUSHER_APP_KEY= 48 | PUSHER_APP_SECRET= 49 | PUSHER_APP_CLUSTER=mt1 50 | 51 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 52 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 53 | -------------------------------------------------------------------------------- /2019/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /2019/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | /.idea 7 | .env 8 | .env.backup 9 | .phpunit.result.cache 10 | Homestead.json 11 | Homestead.yaml 12 | npm-debug.log 13 | yarn-error.log 14 | -------------------------------------------------------------------------------- /2019/.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | disabled: 4 | - unused_use 5 | finder: 6 | not-name: 7 | - index.php 8 | - server.php 9 | js: 10 | finder: 11 | not-name: 12 | - webpack.mix.js 13 | css: true 14 | -------------------------------------------------------------------------------- /2019/app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire') 28 | // ->hourly(); 29 | } 30 | 31 | /** 32 | * Register the commands for the application. 33 | * 34 | * @return void 35 | */ 36 | protected function commands() 37 | { 38 | $this->load(__DIR__.'/Commands'); 39 | 40 | require base_path('routes/console.php'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /2019/app/Events/TicketRegistrationComplete.php: -------------------------------------------------------------------------------- 1 | ticketUser = $ticketUser; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /2019/app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | validate(['email' => 'required|email']); 17 | 18 | return response()->json( 19 | json_decode(Slack::invite($data['email']), true) 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /2019/app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /2019/app/Http/Controllers/Auth/LoginController.php: -------------------------------------------------------------------------------- 1 | middleware('guest')->except('logout'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /2019/app/Http/Controllers/Auth/RegisterController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 41 | } 42 | 43 | /** 44 | * Get a validator for an incoming registration request. 45 | * 46 | * @param array $data 47 | * @return \Illuminate\Contracts\Validation\Validator 48 | */ 49 | protected function validator(array $data) 50 | { 51 | return Validator::make($data, [ 52 | 'name' => ['required', 'string', 'max:255'], 53 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 54 | 'password' => ['required', 'string', 'min:8', 'confirmed'], 55 | ]); 56 | } 57 | 58 | /** 59 | * Create a new user instance after a valid registration. 60 | * 61 | * @param array $data 62 | * @return \App\User 63 | */ 64 | protected function create(array $data) 65 | { 66 | return User::create([ 67 | 'name' => $data['name'], 68 | 'email' => $data['email'], 69 | 'password' => Hash::make($data['password']), 70 | ]); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /2019/app/Http/Controllers/Auth/ResetPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /2019/app/Http/Controllers/Auth/VerificationController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 38 | $this->middleware('signed')->only('verify'); 39 | $this->middleware('throttle:6,1')->only('verify', 'resend'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /2019/app/Http/Controllers/CodeOfConductController.php: -------------------------------------------------------------------------------- 1 | ['title' => 'Code of Conduct']]); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /2019/app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | $this->sponsors(), 13 | 'page' => ['title' => "Nigeria's biggest PHP conference"] 14 | ]); 15 | } 16 | 17 | private function sponsors(): array 18 | { 19 | return [ 20 | [ 21 | 'image' => 'img/sponsor-ay.png', 22 | 'link' => 'https://corporate.aboutyou.de/en/?utm_source=laravel-nigeria&utm_medium=referral&utm_campaign=tech', 23 | 'title' => 'Laravel Nigeria Sponsor - ABOUT YOU GmbH', 24 | ], 25 | [ 26 | 'image' => 'img/sponsor-pusher.png', 27 | 'link' => 'https://pusher.com', 28 | 'title' => 'Laravel Nigeria Sponsor - Pusher', 29 | ], 30 | [ 31 | 'image' => 'img/sponsor-laravel.png', 32 | 'link' => 'https://laravel.com', 33 | 'title' => 'Laravel Nigeria Sponsor - Laravel', 34 | ], 35 | [ 36 | 'image' => 'img/sponsor-ck-icon.png', 37 | 'link' => 'https://creativitykills.co', 38 | 'title' => 'Laravel Nigeria Sponsor - CreativityKills', 39 | ], 40 | ]; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /2019/app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /2019/app/Http/Middleware/CheckForMaintenanceMode.php: -------------------------------------------------------------------------------- 1 | check()) { 21 | return redirect('/home'); 22 | } 23 | 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /2019/app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | except[] = config('tito.webhook_url'); 30 | 31 | return parent::inExceptArray($request); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /2019/app/Http/Requests/WebhookRequest.php: -------------------------------------------------------------------------------- 1 | $this->webhookName()]); 16 | Log::info('[Webhook] Payload', $this->all()); 17 | 18 | $allowedWebhooks = (array) config('tito.allowed_webhooks'); 19 | 20 | return in_array($this->webhookName(), $allowedWebhooks); 21 | } 22 | 23 | public function rules(): array 24 | { 25 | if ($this->isRegistrationWebhook()) { 26 | return $this->registrationRules(); 27 | } 28 | 29 | return []; 30 | } 31 | 32 | public function isRegistrationWebhook(): bool 33 | { 34 | return Str::startsWith($this->webhookName(), 'registration.'); 35 | } 36 | 37 | protected function registrationRules(): array 38 | { 39 | return [ 40 | 'tickets.*.slug' => 'required|string', 41 | 'tickets.*.reference' => 'required|string', 42 | 'tickets.*.name' => 'required|string', 43 | 'tickets.*.email' => 'required|email', 44 | 'tickets.*.responses' => 'required|array', 45 | 'tickets.*.responses.*' => 'required|string', 46 | 'event.id' => 'required|integer', 47 | 'event.slug' => 'required|string', 48 | ]; 49 | } 50 | 51 | private function webhookName(): string 52 | { 53 | return (string) $this->header('X-Webhook-Name'); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /2019/app/Listeners/SendSponsorContactOptInNotification.php: -------------------------------------------------------------------------------- 1 | ticketUser->sendOptInConfirmationNotification(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /2019/app/Notifications/VerifySponsorshipContactOptIn.php: -------------------------------------------------------------------------------- 1 | verificationUrl($notifiable); 28 | 29 | return (new MailMessage) 30 | ->subject(Lang::get('Laravel Nigeria: Verify Opt-in')) 31 | ->line(Lang::get('You specified you would like to be contacted by our sponsors regarding job oppurtunities and more. Please click below to confirm this.')) 32 | ->action(Lang::get('Sure, Sign me up'), $verificationUrl) 33 | ->line(Lang::get('If you do not want to hear about new oppurtunities and more, no further action is required.')); 34 | } 35 | 36 | /** 37 | * @param mixed $notifiable 38 | * @return string 39 | */ 40 | protected function verificationUrl($notifiable) 41 | { 42 | return URL::temporarySignedRoute( 43 | 'sponsor.optin.verify', 44 | Carbon::now()->addMinutes(Config::get('tito.verification.expire', 60)), 45 | [ 46 | 'id' => $notifiable->getKey(), 47 | 'hash' => sha1($notifiable->getEmailForVerification()), 48 | ] 49 | ); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /2019/app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | * 22 | * @return void 23 | */ 24 | public function boot() 25 | { 26 | $this->registerPolicies(); 27 | 28 | // 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /2019/app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 21 | SendEmailVerificationNotification::class, 22 | ], 23 | TicketRegistrationComplete::class => [ 24 | SendSponsorContactOptInNotification::class, 25 | ], 26 | ]; 27 | 28 | /** 29 | * Register any events for your application. 30 | * 31 | * @return void 32 | */ 33 | public function boot() 34 | { 35 | parent::boot(); 36 | 37 | // 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /2019/app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | configureRateLimiting(); 39 | 40 | $this->routes(function () { 41 | Route::middleware('web') 42 | ->namespace($this->namespace) 43 | ->group(base_path('routes/web.php')); 44 | 45 | Route::prefix('api') 46 | ->middleware('api') 47 | ->namespace($this->namespace) 48 | ->group(base_path('routes/api.php')); 49 | }); 50 | } 51 | 52 | /** 53 | * Configure the rate limiters for the application. 54 | * 55 | * @return void 56 | */ 57 | protected function configureRateLimiting() 58 | { 59 | RateLimiter::for('api', function (Request $request) { 60 | return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); 61 | }); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /2019/app/TicketUser.php: -------------------------------------------------------------------------------- 1 | 'bool', 28 | 'opted_in_to_be_contacted' => 'bool', 29 | ]; 30 | 31 | public function __construct(array $attributes = []) 32 | { 33 | $this->marketingContactOptInConfirmation($attributes['responses'] ?? []); 34 | 35 | if (isset($attributes['responses'])) { 36 | unset($attributes['responses']); 37 | } 38 | 39 | parent::__construct($attributes); 40 | } 41 | 42 | private function marketingContactOptInConfirmation(array $responses): void 43 | { 44 | $this->attributes['opt_in_confirmed'] = false; 45 | 46 | if (!$confirmationSlug = config('tito.ticket_confirmation_slug')) { 47 | $this->attributes['opted_in_to_be_contacted'] = false; 48 | return; 49 | } 50 | 51 | $confirmation = $responses[$confirmationSlug] ?? false; 52 | $confirmed = $confirmation ? strtolower($confirmation) === 'yes' : false; 53 | 54 | $this->attributes['opted_in_to_be_contacted'] = $confirmed; 55 | } 56 | 57 | public function sendOptInConfirmationNotification(): void 58 | { 59 | $this->notify(new VerifySponsorshipContactOptIn($this)); 60 | } 61 | 62 | public function getEmailForVerification(): string 63 | { 64 | return $this->email; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /2019/app/User.php: -------------------------------------------------------------------------------- 1 | 'datetime', 38 | ]; 39 | } 40 | -------------------------------------------------------------------------------- /2019/artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /2019/bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /2019/bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2019/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "type": "project", 4 | "description": "The Laravel Framework.", 5 | "keywords": [ 6 | "framework", 7 | "laravel" 8 | ], 9 | "license": "MIT", 10 | "require": { 11 | "php": "^7.3|^8.0", 12 | "danrovito/laravelslackinvite": "^1.1", 13 | "fideloper/proxy": "^4.0", 14 | "guzzlehttp/guzzle": "^7.0.1", 15 | "laravel/framework": "^8.0", 16 | "laravel/tinker": "^2.0", 17 | "laravel/ui": "^3.0" 18 | }, 19 | "require-dev": { 20 | "facade/ignition": "^2.3.6", 21 | "fzaninotto/faker": "^1.4", 22 | "mockery/mockery": "^1.0", 23 | "nunomaduro/collision": "^5.0", 24 | "phpunit/phpunit": "^9.0" 25 | }, 26 | "config": { 27 | "optimize-autoloader": true, 28 | "preferred-install": "dist", 29 | "sort-packages": true 30 | }, 31 | "extra": { 32 | "laravel": { 33 | "dont-discover": [] 34 | } 35 | }, 36 | "autoload": { 37 | "psr-4": { 38 | "App\\": "app/", 39 | "Database\\Factories\\": "database/factories/", 40 | "Database\\Seeders\\": "database/seeders/" 41 | }, 42 | "classmap": [ 43 | "database/factories" 44 | ] 45 | }, 46 | "autoload-dev": { 47 | "psr-4": { 48 | "Tests\\": "tests/" 49 | } 50 | }, 51 | "minimum-stability": "dev", 52 | "prefer-stable": true, 53 | "scripts": { 54 | "post-autoload-dump": [ 55 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 56 | "@php artisan package:discover --ansi" 57 | ], 58 | "post-root-package-install": [ 59 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 60 | ], 61 | "post-create-project-cmd": [ 62 | "@php artisan key:generate --ansi" 63 | ] 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /2019/config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'useTLS' => true, 41 | ], 42 | ], 43 | 44 | 'redis' => [ 45 | 'driver' => 'redis', 46 | 'connection' => 'default', 47 | ], 48 | 49 | 'log' => [ 50 | 'driver' => 'log', 51 | ], 52 | 53 | 'null' => [ 54 | 'driver' => 'null', 55 | ], 56 | 57 | ], 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /2019/config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "sftp", "s3" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | 'url' => env('AWS_URL'), 65 | ], 66 | 67 | ], 68 | 69 | ]; 70 | -------------------------------------------------------------------------------- /2019/config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Bcrypt Options 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may specify the configuration options that should be used when 26 | | passwords are hashed using the Bcrypt algorithm. This will allow you 27 | | to control the amount of time it takes to hash the given password. 28 | | 29 | */ 30 | 31 | 'bcrypt' => [ 32 | 'rounds' => env('BCRYPT_ROUNDS', 10), 33 | ], 34 | 35 | /* 36 | |-------------------------------------------------------------------------- 37 | | Argon Options 38 | |-------------------------------------------------------------------------- 39 | | 40 | | Here you may specify the configuration options that should be used when 41 | | passwords are hashed using the Argon algorithm. These will allow you 42 | | to control the amount of time it takes to hash the given password. 43 | | 44 | */ 45 | 46 | 'argon' => [ 47 | 'memory' => 1024, 48 | 'threads' => 2, 49 | 'time' => 2, 50 | ], 51 | 52 | ]; 53 | -------------------------------------------------------------------------------- /2019/config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | ], 22 | 23 | 'postmark' => [ 24 | 'token' => env('POSTMARK_TOKEN'), 25 | ], 26 | 27 | 'ses' => [ 28 | 'key' => env('AWS_ACCESS_KEY_ID'), 29 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 30 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 31 | ], 32 | 33 | 'google_tag_manager' => [ 34 | 'id' => env('GOOGLE_TAG_MANAGER_ID'), 35 | ], 36 | 37 | 'slack' => [ 38 | 'token' => env('SLACK_TOKEN'), 39 | 'hostname' => env('SLACK_HOSTNAME', 'laravelnigeria') 40 | ], 41 | 42 | ]; 43 | -------------------------------------------------------------------------------- /2019/config/tito.php: -------------------------------------------------------------------------------- 1 | env('TITO_WEBHOOK_URL', 'webhook'), 5 | 6 | // Usually a "Yes" or "No" question attached to the ticket... 7 | 'ticket_confirmation_slug' => env('TITO_TICKET_CONFIRMATION_SLUG'), 8 | 9 | 'verification' => [ 10 | 'expire' => env('TITO_SPONSOR_CONTACT_VERIFICATION_EMAIL_LINK_EXPIRE', 1440), 11 | ], 12 | 13 | 'allowed_webhooks' => [ 14 | // "checkin.created", 15 | // "ticket.created", 16 | // "ticket.completed", 17 | // "ticket.reassigned", 18 | // "ticket.updated", 19 | // "ticket.unsnoozed", 20 | // "ticket.unvoided", 21 | // "ticket.voided", 22 | // "registration.started", 23 | // "registration.filling", 24 | // "registration.updated", 25 | // "registration.finished", 26 | "registration.completed", 27 | // "registration.cancelled", 28 | ], 29 | 30 | ]; 31 | -------------------------------------------------------------------------------- /2019/config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /2019/database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | *.sqlite-journal 3 | -------------------------------------------------------------------------------- /2019/database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(User::class, function (Faker $faker) { 20 | return [ 21 | 'name' => $faker->name, 22 | 'email' => $faker->unique()->safeEmail, 23 | 'email_verified_at' => now(), 24 | 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 25 | 'remember_token' => Str::random(10), 26 | ]; 27 | }); 28 | -------------------------------------------------------------------------------- /2019/database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->timestamp('email_verified_at')->nullable(); 21 | $table->string('password'); 22 | $table->rememberToken(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('users'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /2019/database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /2019/database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->text('connection'); 19 | $table->text('queue'); 20 | $table->longText('payload'); 21 | $table->longText('exception'); 22 | $table->timestamp('failed_at')->useCurrent(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('failed_jobs'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /2019/database/migrations/2019_09_29_133502_create_ticket_user_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->string('slug'); 19 | $table->string('reference'); 20 | $table->string('name'); 21 | $table->string('email'); 22 | $table->unsignedBigInteger('event_id'); 23 | $table->string('event_slug'); 24 | $table->boolean('opt_in_confirmed')->default(false); 25 | $table->boolean('opted_in_to_be_contacted')->default(false); 26 | $table->timestamps(); 27 | 28 | $table->unique(['email', 'event_id']); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('ticket_users'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /2019/database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(UsersTableSeeder::class); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /2019/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "npm run development -- --watch", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.19.2", 14 | "bootstrap": "^4.6.0", 15 | "cross-env": "^5.1", 16 | "jquery": "^3.6.0", 17 | "laravel-mix": "^4.0.7", 18 | "lodash": "^4.17.21", 19 | "popper.js": "^1.16.1", 20 | "resolve-url-loader": "2.3.1", 21 | "sass": "^1.35.2", 22 | "sass-loader": "7.*", 23 | "vue": "^2.6.14", 24 | "vue-template-compiler": "^2.6.14" 25 | }, 26 | "dependencies": { 27 | "sweetalert": "^2.1.2", 28 | "wowjs": "^1.1.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /2019/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Unit 14 | 15 | 16 | 17 | ./tests/Feature 18 | 19 | 20 | 21 | 22 | ./app 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /2019/public/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/.DS_Store -------------------------------------------------------------------------------- /2019/public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /2019/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/favicon.ico -------------------------------------------------------------------------------- /2019/public/img/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/.DS_Store -------------------------------------------------------------------------------- /2019/public/img/android-browser-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/android-browser-icon.png -------------------------------------------------------------------------------- /2019/public/img/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/arrow.png -------------------------------------------------------------------------------- /2019/public/img/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /2019/public/img/community-slant-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/community-slant-1.png -------------------------------------------------------------------------------- /2019/public/img/community-slant-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/community-slant-2.png -------------------------------------------------------------------------------- /2019/public/img/community.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/community.jpg -------------------------------------------------------------------------------- /2019/public/img/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/facebook.png -------------------------------------------------------------------------------- /2019/public/img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/github.png -------------------------------------------------------------------------------- /2019/public/img/logo-colored.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/logo-colored.png -------------------------------------------------------------------------------- /2019/public/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/logo.png -------------------------------------------------------------------------------- /2019/public/img/no-photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/no-photo.png -------------------------------------------------------------------------------- /2019/public/img/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/play.png -------------------------------------------------------------------------------- /2019/public/img/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor1.png -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor2.png -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor3.png -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor4.png -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor5.png -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor6.png -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor7.png -------------------------------------------------------------------------------- /2019/public/img/sample-icons/sponsor8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sample-icons/sponsor8.png -------------------------------------------------------------------------------- /2019/public/img/speaker-stage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/speaker-stage.png -------------------------------------------------------------------------------- /2019/public/img/speaker1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/speaker1.png -------------------------------------------------------------------------------- /2019/public/img/speaker2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/speaker2.png -------------------------------------------------------------------------------- /2019/public/img/speaker3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/speaker3.png -------------------------------------------------------------------------------- /2019/public/img/speaker4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/speaker4.png -------------------------------------------------------------------------------- /2019/public/img/speaker5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/speaker5.png -------------------------------------------------------------------------------- /2019/public/img/speaker6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/speaker6.png -------------------------------------------------------------------------------- /2019/public/img/sponsor-ay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sponsor-ay.png -------------------------------------------------------------------------------- /2019/public/img/sponsor-ck-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sponsor-ck-icon.png -------------------------------------------------------------------------------- /2019/public/img/sponsor-ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sponsor-ck.png -------------------------------------------------------------------------------- /2019/public/img/sponsor-laravel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sponsor-laravel.png -------------------------------------------------------------------------------- /2019/public/img/sponsor-pusher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sponsor-pusher.png -------------------------------------------------------------------------------- /2019/public/img/sponsor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/sponsor.png -------------------------------------------------------------------------------- /2019/public/img/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/twitter.png -------------------------------------------------------------------------------- /2019/public/img/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/img/video.png -------------------------------------------------------------------------------- /2019/public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | define('LARAVEL_START', microtime(true)); 11 | 12 | if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) { 13 | require __DIR__.'/../storage/framework/maintenance.php'; 14 | } 15 | 16 | /* 17 | |-------------------------------------------------------------------------- 18 | | Register The Auto Loader 19 | |-------------------------------------------------------------------------- 20 | | 21 | | Composer provides a convenient, automatically generated class loader for 22 | | our application. We just need to utilize it! We'll simply require it 23 | | into the script here so that we don't have to worry about manual 24 | | loading any of our classes later on. It feels great to relax. 25 | | 26 | */ 27 | 28 | require __DIR__.'/../vendor/autoload.php'; 29 | 30 | /* 31 | |-------------------------------------------------------------------------- 32 | | Turn On The Lights 33 | |-------------------------------------------------------------------------- 34 | | 35 | | We need to illuminate PHP development, so let us turn on the lights. 36 | | This bootstraps the framework and gets it ready for use, then it 37 | | will load up this application so that we can run it and send 38 | | the responses back to the browser and delight our users. 39 | | 40 | */ 41 | 42 | $app = require_once __DIR__.'/../bootstrap/app.php'; 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Run The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | Once we have the application, we can handle the incoming request 50 | | through the kernel, and send the associated response back to 51 | | the client's browser allowing them to enjoy the creative 52 | | and wonderful application we have prepared for them. 53 | | 54 | */ 55 | 56 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 57 | 58 | $response = $kernel->handle( 59 | $request = Illuminate\Http\Request::capture() 60 | ); 61 | 62 | $response->send(); 63 | 64 | $kernel->terminate($request, $response); 65 | -------------------------------------------------------------------------------- /2019/public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/app.js": "/js/app.js", 3 | "/css/app.css": "/css/app.css" 4 | } 5 | -------------------------------------------------------------------------------- /2019/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /2019/public/videos/bg.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/videos/bg.mp4 -------------------------------------------------------------------------------- /2019/public/videos/bg.ogv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/videos/bg.ogv -------------------------------------------------------------------------------- /2019/public/videos/bg.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laravelnigeria/website/adde114769b9b963a567b9e80ab83b440b070781/2019/public/videos/bg.webm -------------------------------------------------------------------------------- /2019/resources/js/app.js: -------------------------------------------------------------------------------- 1 | import swal from 'sweetalert'; 2 | 3 | require('./bootstrap'); 4 | window.Vue = require('vue'); 5 | 6 | // Ignore the custom tito button HTML 7 | Vue.config.ignoredElements = ['tito-button']; 8 | 9 | // Load Vue components... 10 | Vue.component('schedule', require('./components/ScheduleComponent.vue').default); 11 | Vue.component('speakers', require('./components/SpeakersComponent.vue').default); 12 | Vue.component('slack-invite', require('./components/SlackInviteComponent.vue').default); 13 | 14 | const app = new Vue({ el: '#app' }); 15 | -------------------------------------------------------------------------------- /2019/resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | window._ = require('lodash'); 2 | window.WOW = require('wowjs').WOW; 3 | 4 | /** 5 | * We'll load jQuery and the Bootstrap jQuery plugin which provides support 6 | * for JavaScript based Bootstrap features such as modals and tabs. This 7 | * code may be modified to fit the specific needs of your application. 8 | */ 9 | 10 | try { 11 | window.Popper = require('popper.js').default; 12 | window.$ = window.jQuery = require('jquery'); 13 | 14 | new WOW().init(); 15 | 16 | require('bootstrap'); 17 | } catch (e) {} 18 | 19 | /** 20 | * We'll load the axios HTTP library which allows us to easily issue requests 21 | * to our Laravel back-end. This library automatically handles sending the 22 | * CSRF token as a header based on the value of the "XSRF" token cookie. 23 | */ 24 | 25 | window.axios = require('axios'); 26 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 27 | 28 | /** 29 | * Next we will register the CSRF Token as a common header with Axios so that 30 | * all outgoing HTTP requests automatically have it attached. This is just 31 | * a simple convenience so we don't have to attach every token manually. 32 | */ 33 | 34 | let token = document.head.querySelector('meta[name="csrf-token"]'); 35 | 36 | if (token) { 37 | window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; 38 | } else { 39 | console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); 40 | } 41 | 42 | /** 43 | * Echo exposes an expressive API for subscribing to channels and listening 44 | * for events that are broadcast by Laravel. Echo and event broadcasting 45 | * allows your team to easily build robust real-time web applications. 46 | */ 47 | 48 | // import Echo from 'laravel-echo' 49 | 50 | // window.Pusher = require('pusher-js'); 51 | 52 | // window.Echo = new Echo({ 53 | // broadcaster: 'pusher', 54 | // key: process.env.MIX_PUSHER_APP_KEY, 55 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 56 | // encrypted: true 57 | // }); 58 | -------------------------------------------------------------------------------- /2019/resources/js/components/ScheduleComponent.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 46 | -------------------------------------------------------------------------------- /2019/resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /2019/resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /2019/resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Your password has been reset!', 17 | 'sent' => 'We have e-mailed your password reset link!', 18 | 'token' => 'This password reset token is invalid.', 19 | 'user' => "We can't find a user with that e-mail address.", 20 | 21 | ]; 22 | -------------------------------------------------------------------------------- /2019/resources/sass/_variables.scss: -------------------------------------------------------------------------------- 1 | // Body 2 | $body-bg: #fff; 3 | 4 | // Typography 5 | $font-family-sans-serif: 'Open Sans', 'Karla', 'Nunito', sans-serif; 6 | $font-size-base: 1rem; 7 | $line-height-base: 1.6; 8 | 9 | // Colors 10 | $deepGreen: rgba(0, 83, 83, 0.95); 11 | $lightGreen: #01baba; 12 | $primary: #01baba; 13 | $blue: #3490dc; 14 | $indigo: #6574cd; 15 | $purple: #9561e2; 16 | $pink: #f66d9b; 17 | $red: #e3342f; 18 | $orange: #f6993f; 19 | $yellow: #ffed4a; 20 | $green: #38c172; 21 | $teal: #4dc0b5; 22 | $cyan: #6cb2eb; 23 | $white: #ffffff; 24 | -------------------------------------------------------------------------------- /2019/resources/sass/app.scss: -------------------------------------------------------------------------------- 1 | // Fonts 2 | @import url('https://fonts.googleapis.com/css?family=Nunito|Karla|Open+Sans:400,600'); 3 | 4 | // Variables 5 | @import 'variables'; 6 | 7 | // Bootstrap 8 | @import '~bootstrap/scss/bootstrap'; 9 | 10 | // Globals 11 | @import 'components'; 12 | 13 | // Pages 14 | @import 'pages/home'; 15 | @import 'pages/single'; 16 | 17 | #navigation-bar { 18 | #navDropdown { 19 | height: 100vh !important; 20 | overflow: hidden; 21 | margin-top: -66px; 22 | padding-top: 66px; 23 | ul { 24 | display: flex; 25 | height: 100%; 26 | align-items: center; 27 | justify-content: center; 28 | } 29 | @media only screen and (min-width: 992px) { 30 | height: inherit !important; 31 | } 32 | } 33 | .navbar-toggler:hover, 34 | .navbar-toggler:focus { 35 | outline: none; 36 | } 37 | 38 | .ham { 39 | cursor: pointer; 40 | -webkit-tap-highlight-color: transparent; 41 | transition: transform 400ms; 42 | user-select: none; 43 | @media only screen and (min-width: 992px) { 44 | display: none; 45 | } 46 | } 47 | .hamRotate.active { 48 | transform: rotate(45deg); 49 | } 50 | .line { 51 | fill: none; 52 | stroke: #fff; 53 | stroke-width: 5.5; 54 | stroke-linecap: round; 55 | transition: stroke-dasharray 400ms, stroke-dashoffset 400ms; 56 | } 57 | .ham1 { 58 | .top { 59 | stroke-dasharray: 40 160; 60 | } 61 | .middle { 62 | stroke-dasharray: 40 142; 63 | transform-origin: 50%; 64 | transition: transform 400ms; 65 | } 66 | .bottom { 67 | stroke-dasharray: 40 85; 68 | transform-origin: 50%; 69 | transition: transform 400ms, stroke-dashoffset 400ms; 70 | } 71 | &.active { 72 | .top { 73 | stroke-dashoffset: -64px; 74 | } 75 | .middle { 76 | transform: rotate(90deg); 77 | } 78 | .bottom { 79 | stroke-dashoffset: -64px; 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /2019/resources/sass/pages/_single.scss: -------------------------------------------------------------------------------- 1 | .single-jumbo-wrapper { 2 | padding: 180px 0 180px; 3 | background-color: $deepGreen; 4 | h2 { 5 | color: white; 6 | font-size: 30px; 7 | text-align: center; 8 | width: 85%; 9 | margin: 0 auto; 10 | text-transform: uppercase; 11 | font-weight: 600; 12 | line-height: 1.5; 13 | @media only screen and (min-width: 768px) { 14 | font-size: 40px; 15 | } 16 | } 17 | .faqs-green-div { 18 | width: 35px; 19 | height: 5px; 20 | background-color: #01baba; 21 | border-radius: 100px; 22 | display: block; 23 | margin: 15px auto 0; 24 | } 25 | } 26 | .single-page-text { 27 | .white-wrap { 28 | font-size: 15px; 29 | line-height: 1.7rem; 30 | background-color: #f5f5f5; 31 | margin: -80px auto 0; 32 | justify-content: center; 33 | border-radius: 10px 10px 0 0; 34 | padding: 16px; 35 | @media only screen and (min-width: 768px) { 36 | background: white; 37 | font-size: 17px; 38 | line-height: 2.2rem; 39 | padding: 50px; 40 | margin-bottom: 80px; 41 | background-color: #f9f9f9; 42 | border-radius: 10px; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /2019/resources/views/partials/gtm.blade.php: -------------------------------------------------------------------------------- 1 | @if ($gtmId = config('services.google_tag_manager.id')) 2 | 3 | 4 | @endif 5 | -------------------------------------------------------------------------------- /2019/resources/views/partials/nav.blade.php: -------------------------------------------------------------------------------- 1 | 24 | -------------------------------------------------------------------------------- /2019/routes/api.php: -------------------------------------------------------------------------------- 1 | post('/slack/invite', 'Api\SlackInviteController'); 18 | -------------------------------------------------------------------------------- /2019/routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 16 | }); 17 | -------------------------------------------------------------------------------- /2019/routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 18 | })->describe('Display an inspiring quote'); 19 | -------------------------------------------------------------------------------- /2019/routes/web.php: -------------------------------------------------------------------------------- 1 | name('sponsor.optin.verify'); 6 | Route::post(config('tito.webhook_url'), 'RegistrationWebhookController@handle'); 7 | Route::get('/code-of-conduct', 'CodeOfConductController')->name('code-of-conduct'); 8 | Route::redirect('/cfp', 'https://laravelnigeria.typeform.com/to/rosG3K'); 9 | Route::get('/', 'HomeController')->name('index'); 10 | -------------------------------------------------------------------------------- /2019/server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /2019/storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /2019/storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2019/storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /2019/storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /2019/storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2019/storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2019/storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2019/storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2019/storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /2019/tests/Bootstrap.php: -------------------------------------------------------------------------------- 1 | createApplication()->make(Kernel::class); 27 | 28 | $commands = [ 29 | 'config:cache', 30 | 'event:cache', 31 | ]; 32 | 33 | foreach ($commands as $command) { 34 | $console->call($command); 35 | } 36 | } 37 | 38 | public function executeAfterLastTest(): void 39 | { 40 | array_map('unlink', glob('bootstrap/cache/*.phpunit.php')); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /2019/tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /2019/tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /2019/tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /2019/todo.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | 3 | - [x] Code of conduct page 4 | - [x] Copy content of the site 5 | - [x] YouTube page 6 | - [x] Tito embedding 7 | - [x] Video background of the header 8 | - [x] Slack integration 9 | - [x] Change icons and swap sponsor logos (AY, Laravel, Pusher, CreativityKills) 10 | - [x] Speaker topic (pop up mobile / change on desktop) 11 | - [x] Submit talk link 12 | 13 | * [] Upload old videos to YouTube 14 | -------------------------------------------------------------------------------- /2019/webpack.mix.js: -------------------------------------------------------------------------------- 1 | const mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel application. By default, we are compiling the Sass 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.js('resources/js/app.js', 'public/js').sass('resources/sass/app.scss', 'public/css'); 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010-2016 David Majda 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /current: -------------------------------------------------------------------------------- 1 | 2019 -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | if [[ -d "./.git" ]]; then 3 | git pull origin master 4 | fi 5 | 6 | if [[ -z $1 ]] || [[ ! -d $1 ]]; then 7 | echo "Specify directory to deploy to..." 8 | exit 9 | fi 10 | 11 | cd $1 12 | 13 | composer install --no-interaction 14 | 15 | php artisan optimize 16 | php artisan migrate --force 17 | 18 | php artisan cache:clear 19 | 20 | php artisan config:clear 21 | php artisan config:cache 22 | 23 | php artisan route:clear 24 | php artisan route:cache 25 | --------------------------------------------------------------------------------