├── .editorconfig
├── .env.example
├── .gitattributes
├── .gitignore
├── README.md
├── app
├── Console
│ └── Kernel.php
├── Exceptions
│ └── Handler.php
├── Field.php
├── Http
│ ├── Controllers
│ │ ├── Auth
│ │ │ ├── ForgotPasswordController.php
│ │ │ ├── LoginController.php
│ │ │ ├── RegisterController.php
│ │ │ ├── ResetPasswordController.php
│ │ │ └── VerificationController.php
│ │ ├── Controller.php
│ │ ├── FieldController.php
│ │ └── SubscriberController.php
│ ├── Kernel.php
│ └── Middleware
│ │ ├── Authenticate.php
│ │ ├── CheckForMaintenanceMode.php
│ │ ├── EncryptCookies.php
│ │ ├── RedirectIfAuthenticated.php
│ │ ├── TrimStrings.php
│ │ ├── TrustProxies.php
│ │ └── VerifyCsrfToken.php
├── Providers
│ ├── AppServiceProvider.php
│ ├── AuthServiceProvider.php
│ ├── BroadcastServiceProvider.php
│ ├── EventServiceProvider.php
│ └── RouteServiceProvider.php
├── Subscriber.php
├── SubscriberField.php
└── User.php
├── artisan
├── bootstrap
├── app.php
└── cache
│ └── .gitignore
├── composer.json
├── composer.lock
├── config
├── app.php
├── auth.php
├── broadcasting.php
├── cache.php
├── database.php
├── emailValidator.php
├── filesystems.php
├── hashing.php
├── logging.php
├── mail.php
├── queue.php
├── services.php
├── session.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
│ ├── 2018_11_23_135830_create_subscribers_table.php
│ ├── 2018_11_23_141222_create_fields_table.php
│ ├── 2018_11_23_164128_create_subscriber_fields_table.php
│ └── 2018_11_23_183516_adds_api_token_to_users_table.php
└── seeds
│ ├── DatabaseSeeder.php
│ ├── FieldsTableSeeder.php
│ ├── SubscribersTableSeeder.php
│ └── UsersTableSeeder.php
├── package.json
├── phpunit.xml
├── public
├── .htaccess
├── css
│ └── app.css
├── favicon.ico
├── index.php
├── js
│ └── app.js
├── robots.txt
├── svg
│ ├── 403.svg
│ ├── 404.svg
│ ├── 500.svg
│ └── 503.svg
└── web.config
├── readme.md
├── resources
├── js
│ ├── app.js
│ ├── bootstrap.js
│ └── components
│ │ └── ExampleComponent.vue
├── lang
│ └── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
├── sass
│ ├── _variables.scss
│ └── app.scss
└── views
│ ├── login.blade.php
│ └── welcome.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
├── CreatesApplication.php
├── Feature
│ ├── FieldTest.php
│ ├── LoginTest.php
│ ├── LogoutTest.php
│ ├── RegisterTest.php
│ └── SubscriberTest.php
├── TestCase.php
└── Unit
│ └── ExampleTest.php
└── webpack.mix.js
/.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 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
2 | *.css linguist-vendored
3 | *.scss linguist-vendored
4 | *.js linguist-vendored
5 | CHANGELOG.md export-ignore
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /public/hot
3 | /public/storage
4 | /storage/*.key
5 | /vendor
6 | /.idea
7 | /.vscode
8 | /nbproject
9 | /.vagrant
10 | Homestead.json
11 | Homestead.yaml
12 | npm-debug.log
13 | yarn-error.log
14 | .env
15 | .phpunit.result.cache
16 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Laravel 5.7 REST API With Simple API Authentication
2 | A PHP Laravel Authentication API with E-mail verification, developed with Laravel 5.7 framework.
3 |
4 | ## Resources
5 | The API has been built with two resources 1) Subcribers 2) Fields
6 |
7 | - The Subscriber resource contain fields : email address, name, state (active, unsubscribed, junk, bounced, unconfirmed)
8 | - The Fields resource contain fields : title, type (date, number, string, boolean)
9 | - Each subscriber can have many fields
10 |
11 | ## Prerequisite
12 |
13 | As it is build on the Laravel framework, it has a few system requirements. Of course, all of these requirements are satisfied by the Laravel Homestead virtual machine, so it's highly recommended that you use Homestead as your local Laravel development environment.
14 |
15 | However, if you are not using Homestead, you will need to make sure your server meets the following requirements:
16 |
17 | - PHP >= 7.1.3
18 | - MySql >= 5.7
19 | - Composer
20 | - OpenSSL PHP Extension
21 | - PDO PHP Extension
22 | - Mbstring PHP Extension
23 | - Tokenizer PHP Extension
24 | - XML PHP Extension
25 | - Ctype PHP Extension
26 | - JSON PHP Extension
27 | - BCMath PHP Extension
28 |
29 | You can check all the laravel related dependecies here .
30 |
31 | ## Installation steps
32 |
33 | Follow the bellow steps to install and set up the application.
34 |
35 | **Step 1: Clone the Application**
36 | You can download the ZIP file or git clone from my repo into your project directory.
37 |
38 | **Step 2: Configure the Application**
39 | After you clone the repo in to your project folder the project need to be set up by following commands-
40 |
41 | - In terminal go to your project directory and Run
42 |
43 | composer install
44 |
45 | - Then copy the .env.example file to .env file in the project root folder
46 |
47 | - Edit the .env file and fill all required data for the bellow variables
48 |
49 | APP_URL=http://localhost //your application domain URL go here
50 |
51 | DB_HOST=127.0.0.1 // Your DB host IP. Here we are assumed it to be local host
52 | DB_PORT=3306 //Port if you are using except the default
53 | DB_DATABASE=name_of_your_database
54 | DB_USERNAME=db_user_name
55 | DB_PASSWORD=db_password
56 |
57 | - To set the Application key run the bellow command in your terminal.
58 |
59 | php artisan key:generate
60 |
61 | - Make your storage and bootstrapp folder writable by your application user.
62 |
63 | - Create all the necessary tables need for the application by runing the bellow command.
64 |
65 | php artisan migrate
66 |
67 | - Fill default data if your need by running bellow command.
68 |
69 | php artisan db:seed
70 |
71 | Thats all! The application is configured now.
72 |
73 |
74 | ## API Endpoints and Routes
75 |
76 | Laravel follows the Model View Controller (MVC) pattern I have creatd models associated with each resource. You can check in the **routes/api.php** file for all the routes that map to controllers in order to send out JSON data that make requests to our API.
77 |
78 | Bellow are the all resources API endpoints -
79 |
80 | GET | api/fields | api,auth:api
81 |
82 | POST | api/fields | api,auth:api
83 |
84 | GET | api/fields/{field} | api,auth:api
85 |
86 | PUT | api/fields/{field} | api,auth:api
87 |
88 | DELETE | api/fields/{field} | api,auth:api
89 |
90 | POST | api/login | api,guest
91 |
92 | POST | api/logout | api
93 |
94 | POST | api/register | api,guest
95 |
96 | GET | api/subscribers | api,auth:api
97 |
98 | POST | api/subscribers | api,auth:api
99 |
100 | GET | api/subscribers/{subscriber} | api,auth:api
101 |
102 | PUT | api/subscribers/{subscriber} | api,auth:api
103 |
104 | DELETE | api/subscribers/{subscriber}| api,auth:api
105 |
106 |
107 | ## API Authentication
108 |
109 | All the api endpoints are protected by a simple API Authentication process. To access the resource data, the request header need api_token field. The **api_token** value need to be taken from the **api/login** API by passing valid username and password.
110 |
111 | **Example Of Login API request**
112 |
113 | $ curl -X POST appurl/api/login \
114 | -H "Accept: application/json" \
115 | -H "Content-type: application/json" \
116 | -d "{\"email\": \"user@user.com\", \"password\": \"1234\" }"
117 |
118 | **Response Of Valid Login API**
119 |
120 | {
121 | "data": {
122 | "id": 3,
123 | "name": "Default",
124 | "email": "user@user.com",
125 | "email_verified_at": "2018-11-23 15:01:31",
126 | "api_token": "fHsLHoHXpdqgYH8VPBFn1yEa5NV3NrxmizZUMuMxtSxZr60HfB",
127 | "created_at": "2018-11-23 15:01:31",
128 | "updated_at": "2018-11-26 16:27:07"
129 | }
130 | }
131 |
132 |
133 |
134 | To send the token in a request, you can do it by sending an attribute api_token as a bearer token in the request headers in the form of **Authorization: Bearer fHsLHoHXpdqgYH8VPBFn1yEa5NV3NrxmizZUMuMxtSxZr60HfB**
135 |
136 | **Example Of Api Request Using Auth Api Token**
137 |
138 | $ curl -X POST appurl/api/subscribers \
139 | -H "Accept: application/json" \
140 | -H "Authorization: Bearer fHsLHoHXpdqgYH8VPBFn1yEa5NV3NrxmizZUMuMxtSxZr60HfB" \
141 | -H "Content-type: application/json" \
142 | -d "{\"email\": \"user@user.com\", \"password\": \"1234\" }"
143 |
144 |
145 | ## Test Case
146 |
147 | I have created several test case to test all the API endpoints by using Laravel PHPUnit with a phpunit.xml set up.
148 |
149 | There are 16 test cases written to test the API endpoint crud operation, present in the **tests/Feature** folder. You can write more test case to test other scenario as well by adding test method in their respective file.
150 |
151 | To execute all the test case, move to the project root folder in terminal and then run -
152 |
153 | composer test
154 |
155 |
156 | ## Third party library used and configuration
157 |
158 | I have used a third party librery for email domain validation check. The package I have used here is https://github.com/unicodeveloper/laravel-email-validator#install .
159 |
160 | Set the API key for your quick email verification account in the config/emailValidator.php file. This is needed to check the active email domain.
161 |
162 |
163 |
164 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/app/Exceptions/Handler.php:
--------------------------------------------------------------------------------
1 | wantsJson() ) {
52 | return response()->json([
53 | 'error' => 'Resource not found!'
54 | ], 404);
55 | }
56 |
57 | return parent::render($request, $exception);
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/app/Field.php:
--------------------------------------------------------------------------------
1 | hasMany('App\SubscriberField', 'field_id');
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Auth/ForgotPasswordController.php:
--------------------------------------------------------------------------------
1 | middleware('guest');
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Auth/LoginController.php:
--------------------------------------------------------------------------------
1 | middleware('guest')->except('logout');
40 | }
41 |
42 | public function login(Request $request)
43 | {
44 | $this->validateLogin($request);
45 |
46 | if ($this->attemptLogin($request)) {
47 | $user = $this->guard()->user();
48 | $user->generateToken();
49 |
50 | return response()->json([
51 | 'data' => $user->toArray(),
52 | ]);
53 | }
54 |
55 | return $this->sendFailedLoginResponse($request);
56 | }
57 |
58 | public function logout(Request $request)
59 | {
60 | $user = Auth::guard('api')->user();
61 |
62 | if ($user) {
63 | $user->api_token = null;
64 | $user->save();
65 | }
66 |
67 | return response()->json(['data' => 'User logged out.'], 200);
68 | }
69 |
70 | protected function unauthenticated($request, AuthenticationException $exception)
71 | {
72 | return response()->json(['error' => 'Unauthenticated'], 401);
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Auth/RegisterController.php:
--------------------------------------------------------------------------------
1 | middleware('guest');
42 | }
43 |
44 | /**
45 | * Get a validator for an incoming registration request.
46 | *
47 | * @param array $data
48 | * @return \Illuminate\Contracts\Validation\Validator
49 | */
50 | protected function validator(array $data)
51 | {
52 | return Validator::make($data, [
53 | 'name' => ['required', 'string', 'max:255'],
54 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
55 | 'password' => ['required', 'string', 'min:6', 'confirmed'],
56 | ]);
57 | }
58 |
59 | /**
60 | * Create a new user instance after a valid registration.
61 | *
62 | * @param array $data
63 | * @return \App\User
64 | */
65 | protected function create(array $data)
66 | {
67 | return User::create([
68 | 'name' => $data['name'],
69 | 'email' => $data['email'],
70 | 'password' => Hash::make($data['password']),
71 | ]);
72 | }
73 |
74 | protected function registered(Request $request, $user)
75 | {
76 | $user->generateToken();
77 |
78 | return response()->json(['data' => $user->toArray()], 201);
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Auth/ResetPasswordController.php:
--------------------------------------------------------------------------------
1 | middleware('guest');
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/app/Http/Controllers/Controller.php:
--------------------------------------------------------------------------------
1 | all());
48 |
49 | return response()->json($field, 201);
50 | }
51 |
52 | /**
53 | * Upadte data for a particluar resource of Field
54 | *
55 | * @param Obj Request
56 | * @param Obj Field
57 | *
58 | * @return json
59 | */
60 | public function update(Request $request, Field $field)
61 | {
62 | $field->update($request->all());
63 |
64 | return response()->json($field, 200);
65 | }
66 |
67 | /**
68 | * Delete a particluar resource of Field
69 | *
70 | * @param Obj Field
71 | *
72 | * @return json
73 | */
74 | public function delete(Field $field)
75 | {
76 | $field->delete();
77 |
78 | return response()->json(null, 204);
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/app/Http/Controllers/SubscriberController.php:
--------------------------------------------------------------------------------
1 | input('email_address')) {
50 | if( !EmailValidator::verify($request->input('email_address'))->isValid()[0]){
51 | return response()->json(['email' => 'Email address is not valid.'], 422);
52 | }
53 | } else {
54 | return response()->json(['email' => 'The email field is required!'], 422);
55 | }
56 |
57 |
58 | $subscriber = Subscriber::create($request->all());
59 |
60 | return response()->json($subscriber, 201);
61 | }
62 |
63 | /**
64 | * Upadte data for a particluar resource of Subscriber
65 | *
66 | * @param Obj Request
67 | * @param Obj Subscriber
68 | *
69 | * @return json
70 | */
71 | public function update(Request $request, Subscriber $subscriber)
72 | {
73 | //Check for valid Email address
74 | if ($request->input('email_address')) {
75 | if( !EmailValidator::verify($request->input('email_address'))->isValid()[0]){
76 | return response()->json(['email' => 'Email address is not valid.'], 422);
77 | }
78 | } else {
79 | return response()->json(['email' => 'The email field is required!'], 422);
80 | }
81 |
82 | $subscriber->update($request->all());
83 |
84 | return response()->json($subscriber, 200);
85 | }
86 |
87 | /**
88 | * Delete a particluar resource of Subscriber
89 | *
90 | * @param Obj Subscriber
91 | *
92 | * @return json
93 | */
94 | public function delete(Subscriber $subscriber)
95 | {
96 | $subscriber->delete();
97 |
98 | return response()->json(null, 204);
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/app/Http/Kernel.php:
--------------------------------------------------------------------------------
1 | [
31 | \App\Http\Middleware\EncryptCookies::class,
32 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
33 | \Illuminate\Session\Middleware\StartSession::class,
34 | // \Illuminate\Session\Middleware\AuthenticateSession::class,
35 | \Illuminate\View\Middleware\ShareErrorsFromSession::class,
36 | \App\Http\Middleware\VerifyCsrfToken::class,
37 | \Illuminate\Routing\Middleware\SubstituteBindings::class,
38 | ],
39 |
40 | 'api' => [
41 | 'throttle:60,1',
42 | 'bindings',
43 | ],
44 | ];
45 |
46 | /**
47 | * The application's route middleware.
48 | *
49 | * These middleware may be assigned to groups or used individually.
50 | *
51 | * @var array
52 | */
53 | protected $routeMiddleware = [
54 | 'auth' => \App\Http\Middleware\Authenticate::class,
55 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
56 | 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
57 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
58 | 'can' => \Illuminate\Auth\Middleware\Authorize::class,
59 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
60 | 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
61 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
62 | 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
63 | ];
64 |
65 | /**
66 | * The priority-sorted list of middleware.
67 | *
68 | * This forces the listed middleware to always be in the given order.
69 | *
70 | * @var array
71 | */
72 | protected $middlewarePriority = [
73 | \Illuminate\Session\Middleware\StartSession::class,
74 | \Illuminate\View\Middleware\ShareErrorsFromSession::class,
75 | \App\Http\Middleware\Authenticate::class,
76 | \Illuminate\Session\Middleware\AuthenticateSession::class,
77 | \Illuminate\Routing\Middleware\SubstituteBindings::class,
78 | \Illuminate\Auth\Middleware\Authorize::class,
79 | ];
80 | }
81 |
--------------------------------------------------------------------------------
/app/Http/Middleware/Authenticate.php:
--------------------------------------------------------------------------------
1 | expectsJson()) {
18 | return json_encode([
19 | 'error' => 'invalid api token.'
20 | ], 404); // Status code here
21 | } else {
22 | return route('login');
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/Http/Middleware/CheckForMaintenanceMode.php:
--------------------------------------------------------------------------------
1 | check()) {
21 | return redirect('/home');
22 | }
23 |
24 | return $next($request);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/Http/Middleware/TrimStrings.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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/app/Subscriber.php:
--------------------------------------------------------------------------------
1 | hasMany('App\SubscriberField', 'subscriber_id');
22 | }
23 |
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/app/SubscriberField.php:
--------------------------------------------------------------------------------
1 | belongsTo('App\Subscriber', 'subscriber_id');
22 | }
23 |
24 | /**
25 | * Get the SubscriberField record associated with the Field.
26 | */
27 | public function field()
28 | {
29 | return $this->belongsTo('App\Field', 'field_id');
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/app/User.php:
--------------------------------------------------------------------------------
1 | api_token = str_random(50);
35 | $this->save();
36 |
37 | return $this->api_token;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/bootstrap/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "laravel/laravel",
3 | "description": "The Laravel Framework.",
4 | "keywords": ["framework", "laravel"],
5 | "license": "MIT",
6 | "type": "project",
7 | "require": {
8 | "php": "^7.1.3",
9 | "doctrine/dbal": "^2.8",
10 | "fideloper/proxy": "^4.0",
11 | "laravel/framework": "5.7.*",
12 | "laravel/tinker": "^1.0",
13 | "unicodeveloper/laravel-email-validator": "^1.0"
14 | },
15 | "require-dev": {
16 | "beyondcode/laravel-dump-server": "^1.0",
17 | "filp/whoops": "^2.0",
18 | "fzaninotto/faker": "^1.4",
19 | "mockery/mockery": "^1.0",
20 | "nunomaduro/collision": "^2.0",
21 | "phpunit/phpunit": "^7.0"
22 | },
23 | "autoload": {
24 | "classmap": [
25 | "database/seeds",
26 | "database/factories"
27 | ],
28 | "psr-4": {
29 | "App\\": "app/"
30 | }
31 | },
32 | "autoload-dev": {
33 | "psr-4": {
34 | "Tests\\": "tests/"
35 | }
36 | },
37 | "extra": {
38 | "laravel": {
39 | "dont-discover": [
40 | ]
41 | }
42 | },
43 | "scripts": {
44 | "post-root-package-install": [
45 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
46 | ],
47 | "post-create-project-cmd": [
48 | "@php artisan key:generate --ansi"
49 | ],
50 | "post-autoload-dump": [
51 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
52 | "@php artisan package:discover --ansi"
53 | ],
54 | "test" : [
55 | "vendor/bin/phpunit"
56 | ]
57 | },
58 | "config": {
59 | "preferred-install": "dist",
60 | "sort-packages": true,
61 | "optimize-autoloader": true
62 | },
63 | "minimum-stability": "dev",
64 | "prefer-stable": true
65 | }
66 |
--------------------------------------------------------------------------------
/config/app.php:
--------------------------------------------------------------------------------
1 | env('APP_NAME', 'Laravel'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Application Environment
21 | |--------------------------------------------------------------------------
22 | |
23 | | This value determines the "environment" your application is currently
24 | | running in. This may determine how you prefer to configure various
25 | | services the application utilizes. Set this in your ".env" file.
26 | |
27 | */
28 |
29 | 'env' => env('APP_ENV', 'production'),
30 |
31 | /*
32 | |--------------------------------------------------------------------------
33 | | Application Debug Mode
34 | |--------------------------------------------------------------------------
35 | |
36 | | When your application is in debug mode, detailed error messages with
37 | | stack traces will be shown on every error that occurs within your
38 | | application. If disabled, a simple generic error page is shown.
39 | |
40 | */
41 |
42 | 'debug' => env('APP_DEBUG', false),
43 |
44 | /*
45 | |--------------------------------------------------------------------------
46 | | Application URL
47 | |--------------------------------------------------------------------------
48 | |
49 | | This URL is used by the console to properly generate URLs when using
50 | | the Artisan command line tool. You should set this to the root of
51 | | your application so that it is used when running Artisan tasks.
52 | |
53 | */
54 |
55 | 'url' => env('APP_URL', 'http://localhost'),
56 |
57 | /*
58 | |--------------------------------------------------------------------------
59 | | Application Timezone
60 | |--------------------------------------------------------------------------
61 | |
62 | | Here you may specify the default timezone for your application, which
63 | | will be used by the PHP date and date-time functions. We have gone
64 | | ahead and set this to a sensible default for you out of the box.
65 | |
66 | */
67 |
68 | 'timezone' => 'UTC',
69 |
70 | /*
71 | |--------------------------------------------------------------------------
72 | | Application Locale Configuration
73 | |--------------------------------------------------------------------------
74 | |
75 | | The application locale determines the default locale that will be used
76 | | by the translation service provider. You are free to set this value
77 | | to any of the locales which will be supported by the application.
78 | |
79 | */
80 |
81 | 'locale' => 'en',
82 |
83 | /*
84 | |--------------------------------------------------------------------------
85 | | Application Fallback Locale
86 | |--------------------------------------------------------------------------
87 | |
88 | | The fallback locale determines the locale to use when the current one
89 | | is not available. You may change the value to correspond to any of
90 | | the language folders that are provided through your application.
91 | |
92 | */
93 |
94 | 'fallback_locale' => 'en',
95 |
96 | /*
97 | |--------------------------------------------------------------------------
98 | | Faker Locale
99 | |--------------------------------------------------------------------------
100 | |
101 | | This locale will be used by the Faker PHP library when generating fake
102 | | data for your database seeds. For example, this will be used to get
103 | | localized telephone numbers, street address information and more.
104 | |
105 | */
106 |
107 | 'faker_locale' => 'en_US',
108 |
109 | /*
110 | |--------------------------------------------------------------------------
111 | | Encryption Key
112 | |--------------------------------------------------------------------------
113 | |
114 | | This key is used by the Illuminate encrypter service and should be set
115 | | to a random, 32 character string, otherwise these encrypted strings
116 | | will not be safe. Please do this before deploying an application!
117 | |
118 | */
119 |
120 | 'key' => env('APP_KEY'),
121 |
122 | 'cipher' => 'AES-256-CBC',
123 |
124 | /*
125 | |--------------------------------------------------------------------------
126 | | Autoloaded Service Providers
127 | |--------------------------------------------------------------------------
128 | |
129 | | The service providers listed here will be automatically loaded on the
130 | | request to your application. Feel free to add your own services to
131 | | this array to grant expanded functionality to your applications.
132 | |
133 | */
134 |
135 | 'providers' => [
136 |
137 | /*
138 | * Laravel Framework Service Providers...
139 | */
140 | Illuminate\Auth\AuthServiceProvider::class,
141 | Illuminate\Broadcasting\BroadcastServiceProvider::class,
142 | Illuminate\Bus\BusServiceProvider::class,
143 | Illuminate\Cache\CacheServiceProvider::class,
144 | Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
145 | Illuminate\Cookie\CookieServiceProvider::class,
146 | Illuminate\Database\DatabaseServiceProvider::class,
147 | Illuminate\Encryption\EncryptionServiceProvider::class,
148 | Illuminate\Filesystem\FilesystemServiceProvider::class,
149 | Illuminate\Foundation\Providers\FoundationServiceProvider::class,
150 | Illuminate\Hashing\HashServiceProvider::class,
151 | Illuminate\Mail\MailServiceProvider::class,
152 | Illuminate\Notifications\NotificationServiceProvider::class,
153 | Illuminate\Pagination\PaginationServiceProvider::class,
154 | Illuminate\Pipeline\PipelineServiceProvider::class,
155 | Illuminate\Queue\QueueServiceProvider::class,
156 | Illuminate\Redis\RedisServiceProvider::class,
157 | Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
158 | Illuminate\Session\SessionServiceProvider::class,
159 | Illuminate\Translation\TranslationServiceProvider::class,
160 | Illuminate\Validation\ValidationServiceProvider::class,
161 | Illuminate\View\ViewServiceProvider::class,
162 |
163 | /*
164 | * Package Service Providers...
165 | */
166 |
167 | /*
168 | * Application Service Providers...
169 | */
170 | App\Providers\AppServiceProvider::class,
171 | App\Providers\AuthServiceProvider::class,
172 | // App\Providers\BroadcastServiceProvider::class,
173 | App\Providers\EventServiceProvider::class,
174 | App\Providers\RouteServiceProvider::class,
175 |
176 | //email validator
177 | Unicodeveloper\EmailValidator\EmailValidatorServiceProvider::class,
178 |
179 | ],
180 |
181 | /*
182 | |--------------------------------------------------------------------------
183 | | Class Aliases
184 | |--------------------------------------------------------------------------
185 | |
186 | | This array of class aliases will be registered when this application
187 | | is started. However, feel free to register as many as you wish as
188 | | the aliases are "lazy" loaded so they don't hinder performance.
189 | |
190 | */
191 |
192 | 'aliases' => [
193 |
194 | 'App' => Illuminate\Support\Facades\App::class,
195 | 'Artisan' => Illuminate\Support\Facades\Artisan::class,
196 | 'Auth' => Illuminate\Support\Facades\Auth::class,
197 | 'Blade' => Illuminate\Support\Facades\Blade::class,
198 | 'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
199 | 'Bus' => Illuminate\Support\Facades\Bus::class,
200 | 'Cache' => Illuminate\Support\Facades\Cache::class,
201 | 'Config' => Illuminate\Support\Facades\Config::class,
202 | 'Cookie' => Illuminate\Support\Facades\Cookie::class,
203 | 'Crypt' => Illuminate\Support\Facades\Crypt::class,
204 | 'DB' => Illuminate\Support\Facades\DB::class,
205 | 'Eloquent' => Illuminate\Database\Eloquent\Model::class,
206 | 'Event' => Illuminate\Support\Facades\Event::class,
207 | 'File' => Illuminate\Support\Facades\File::class,
208 | 'Gate' => Illuminate\Support\Facades\Gate::class,
209 | 'Hash' => Illuminate\Support\Facades\Hash::class,
210 | 'Lang' => Illuminate\Support\Facades\Lang::class,
211 | 'Log' => Illuminate\Support\Facades\Log::class,
212 | 'Mail' => Illuminate\Support\Facades\Mail::class,
213 | 'Notification' => Illuminate\Support\Facades\Notification::class,
214 | 'Password' => Illuminate\Support\Facades\Password::class,
215 | 'Queue' => Illuminate\Support\Facades\Queue::class,
216 | 'Redirect' => Illuminate\Support\Facades\Redirect::class,
217 | 'Redis' => Illuminate\Support\Facades\Redis::class,
218 | 'Request' => Illuminate\Support\Facades\Request::class,
219 | 'Response' => Illuminate\Support\Facades\Response::class,
220 | 'Route' => Illuminate\Support\Facades\Route::class,
221 | 'Schema' => Illuminate\Support\Facades\Schema::class,
222 | 'Session' => Illuminate\Support\Facades\Session::class,
223 | 'Storage' => Illuminate\Support\Facades\Storage::class,
224 | 'URL' => Illuminate\Support\Facades\URL::class,
225 | 'Validator' => Illuminate\Support\Facades\Validator::class,
226 | 'View' => Illuminate\Support\Facades\View::class,
227 |
228 | //Custom email validator
229 | 'EmailValidator' => Unicodeveloper\EmailValidator\EmailValidatorFacade::class,
230 |
231 | ],
232 |
233 | ];
234 |
--------------------------------------------------------------------------------
/config/auth.php:
--------------------------------------------------------------------------------
1 | [
17 | 'guard' => 'web',
18 | 'passwords' => 'users',
19 | ],
20 |
21 | /*
22 | |--------------------------------------------------------------------------
23 | | Authentication Guards
24 | |--------------------------------------------------------------------------
25 | |
26 | | Next, you may define every authentication guard for your application.
27 | | Of course, a great default configuration has been defined for you
28 | | here which uses session storage and the Eloquent user provider.
29 | |
30 | | All authentication drivers have a user provider. This defines how the
31 | | users are actually retrieved out of your database or other storage
32 | | mechanisms used by this application to persist your user's data.
33 | |
34 | | Supported: "session", "token"
35 | |
36 | */
37 |
38 | 'guards' => [
39 | 'web' => [
40 | 'driver' => 'session',
41 | 'provider' => 'users',
42 | ],
43 |
44 | 'api' => [
45 | 'driver' => 'token',
46 | 'provider' => 'users',
47 | ],
48 | ],
49 |
50 | /*
51 | |--------------------------------------------------------------------------
52 | | User Providers
53 | |--------------------------------------------------------------------------
54 | |
55 | | All authentication drivers have a user provider. This defines how the
56 | | users are actually retrieved out of your database or other storage
57 | | mechanisms used by this application to persist your user's data.
58 | |
59 | | If you have multiple user tables or models you may configure multiple
60 | | sources which represent each model / table. These sources may then
61 | | be assigned to any extra authentication guards you have defined.
62 | |
63 | | Supported: "database", "eloquent"
64 | |
65 | */
66 |
67 | 'providers' => [
68 | 'users' => [
69 | 'driver' => 'eloquent',
70 | 'model' => App\User::class,
71 | ],
72 |
73 | // 'users' => [
74 | // 'driver' => 'database',
75 | // 'table' => 'users',
76 | // ],
77 | ],
78 |
79 | /*
80 | |--------------------------------------------------------------------------
81 | | Resetting Passwords
82 | |--------------------------------------------------------------------------
83 | |
84 | | You may specify multiple password reset configurations if you have more
85 | | than one user table or model in the application and you want to have
86 | | separate password reset settings based on the specific user types.
87 | |
88 | | The expire time is the number of minutes that the reset token should be
89 | | considered valid. This security feature keeps tokens short-lived so
90 | | they have less time to be guessed. You may change this as needed.
91 | |
92 | */
93 |
94 | 'passwords' => [
95 | 'users' => [
96 | 'provider' => 'users',
97 | 'table' => 'password_resets',
98 | 'expire' => 60,
99 | ],
100 | ],
101 |
102 | ];
103 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/config/cache.php:
--------------------------------------------------------------------------------
1 | env('CACHE_DRIVER', 'file'),
21 |
22 | /*
23 | |--------------------------------------------------------------------------
24 | | Cache Stores
25 | |--------------------------------------------------------------------------
26 | |
27 | | Here you may define all of the cache "stores" for your application as
28 | | well as their drivers. You may even define multiple stores for the
29 | | same cache driver to group types of items stored in your caches.
30 | |
31 | */
32 |
33 | 'stores' => [
34 |
35 | 'apc' => [
36 | 'driver' => 'apc',
37 | ],
38 |
39 | 'array' => [
40 | 'driver' => 'array',
41 | ],
42 |
43 | 'database' => [
44 | 'driver' => 'database',
45 | 'table' => 'cache',
46 | 'connection' => null,
47 | ],
48 |
49 | 'file' => [
50 | 'driver' => 'file',
51 | 'path' => storage_path('framework/cache/data'),
52 | ],
53 |
54 | 'memcached' => [
55 | 'driver' => 'memcached',
56 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
57 | 'sasl' => [
58 | env('MEMCACHED_USERNAME'),
59 | env('MEMCACHED_PASSWORD'),
60 | ],
61 | 'options' => [
62 | // Memcached::OPT_CONNECT_TIMEOUT => 2000,
63 | ],
64 | 'servers' => [
65 | [
66 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
67 | 'port' => env('MEMCACHED_PORT', 11211),
68 | 'weight' => 100,
69 | ],
70 | ],
71 | ],
72 |
73 | 'redis' => [
74 | 'driver' => 'redis',
75 | 'connection' => 'cache',
76 | ],
77 |
78 | ],
79 |
80 | /*
81 | |--------------------------------------------------------------------------
82 | | Cache Key Prefix
83 | |--------------------------------------------------------------------------
84 | |
85 | | When utilizing a RAM based store such as APC or Memcached, there might
86 | | be other applications utilizing the same cache. So, we'll specify a
87 | | value to get prefixed to all our keys so we can avoid collisions.
88 | |
89 | */
90 |
91 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
92 |
93 | ];
94 |
--------------------------------------------------------------------------------
/config/database.php:
--------------------------------------------------------------------------------
1 | env('DB_CONNECTION', 'mysql'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Database Connections
21 | |--------------------------------------------------------------------------
22 | |
23 | | Here are each of the database connections setup for your application.
24 | | Of course, examples of configuring each database platform that is
25 | | supported by Laravel is shown below to make development simple.
26 | |
27 | |
28 | | All database work in Laravel is done through the PHP PDO facilities
29 | | so make sure you have the driver for your particular database of
30 | | choice installed on your machine before you begin development.
31 | |
32 | */
33 |
34 | 'connections' => [
35 |
36 | 'sqlite' => [
37 | 'driver' => 'sqlite',
38 | //'database' => env('DB_DATABASE', database_path('database.sqlite')),
39 | 'database' => ':memory:',
40 | 'prefix' => '',
41 | 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
42 | ],
43 |
44 | 'mysql' => [
45 | 'driver' => 'mysql',
46 | 'host' => env('DB_HOST', '127.0.0.1'),
47 | 'port' => env('DB_PORT', '3306'),
48 | 'database' => env('DB_DATABASE', 'forge'),
49 | 'username' => env('DB_USERNAME', 'forge'),
50 | 'password' => env('DB_PASSWORD', ''),
51 | 'unix_socket' => env('DB_SOCKET', ''),
52 | 'charset' => 'utf8mb4',
53 | 'collation' => 'utf8mb4_unicode_ci',
54 | 'prefix' => '',
55 | 'prefix_indexes' => true,
56 | 'strict' => true,
57 | 'engine' => null,
58 | ],
59 |
60 | 'pgsql' => [
61 | 'driver' => 'pgsql',
62 | 'host' => env('DB_HOST', '127.0.0.1'),
63 | 'port' => env('DB_PORT', '5432'),
64 | 'database' => env('DB_DATABASE', 'forge'),
65 | 'username' => env('DB_USERNAME', 'forge'),
66 | 'password' => env('DB_PASSWORD', ''),
67 | 'charset' => 'utf8',
68 | 'prefix' => '',
69 | 'prefix_indexes' => true,
70 | 'schema' => 'public',
71 | 'sslmode' => 'prefer',
72 | ],
73 |
74 | 'sqlsrv' => [
75 | 'driver' => 'sqlsrv',
76 | 'host' => env('DB_HOST', 'localhost'),
77 | 'port' => env('DB_PORT', '1433'),
78 | 'database' => env('DB_DATABASE', 'forge'),
79 | 'username' => env('DB_USERNAME', 'forge'),
80 | 'password' => env('DB_PASSWORD', ''),
81 | 'charset' => 'utf8',
82 | 'prefix' => '',
83 | 'prefix_indexes' => true,
84 | ],
85 |
86 | ],
87 |
88 | /*
89 | |--------------------------------------------------------------------------
90 | | Migration Repository Table
91 | |--------------------------------------------------------------------------
92 | |
93 | | This table keeps track of all the migrations that have already run for
94 | | your application. Using this information, we can determine which of
95 | | the migrations on disk haven't actually been run in the database.
96 | |
97 | */
98 |
99 | 'migrations' => 'migrations',
100 |
101 | /*
102 | |--------------------------------------------------------------------------
103 | | Redis Databases
104 | |--------------------------------------------------------------------------
105 | |
106 | | Redis is an open source, fast, and advanced key-value store that also
107 | | provides a richer body of commands than a typical key-value system
108 | | such as APC or Memcached. Laravel makes it easy to dig right in.
109 | |
110 | */
111 |
112 | 'redis' => [
113 |
114 | 'client' => 'predis',
115 |
116 | 'default' => [
117 | 'host' => env('REDIS_HOST', '127.0.0.1'),
118 | 'password' => env('REDIS_PASSWORD', null),
119 | 'port' => env('REDIS_PORT', 6379),
120 | 'database' => env('REDIS_DB', 0),
121 | ],
122 |
123 | 'cache' => [
124 | 'host' => env('REDIS_HOST', '127.0.0.1'),
125 | 'password' => env('REDIS_PASSWORD', null),
126 | 'port' => env('REDIS_PORT', 6379),
127 | 'database' => env('REDIS_CACHE_DB', 1),
128 | ],
129 |
130 | ],
131 |
132 | ];
133 |
--------------------------------------------------------------------------------
/config/emailValidator.php:
--------------------------------------------------------------------------------
1 | '84be744639768864defe6feffafd3123456875643trgdfsdf2223'
8 | ];
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/config/logging.php:
--------------------------------------------------------------------------------
1 | env('LOG_CHANNEL', 'stack'),
20 |
21 | /*
22 | |--------------------------------------------------------------------------
23 | | Log Channels
24 | |--------------------------------------------------------------------------
25 | |
26 | | Here you may configure the log channels for your application. Out of
27 | | the box, Laravel uses the Monolog PHP logging library. This gives
28 | | you a variety of powerful log handlers / formatters to utilize.
29 | |
30 | | Available Drivers: "single", "daily", "slack", "syslog",
31 | | "errorlog", "monolog",
32 | | "custom", "stack"
33 | |
34 | */
35 |
36 | 'channels' => [
37 | 'stack' => [
38 | 'driver' => 'stack',
39 | 'channels' => ['daily'],
40 | ],
41 |
42 | 'single' => [
43 | 'driver' => 'single',
44 | 'path' => storage_path('logs/laravel.log'),
45 | 'level' => 'debug',
46 | ],
47 |
48 | 'daily' => [
49 | 'driver' => 'daily',
50 | 'path' => storage_path('logs/laravel.log'),
51 | 'level' => 'debug',
52 | 'days' => 14,
53 | ],
54 |
55 | 'slack' => [
56 | 'driver' => 'slack',
57 | 'url' => env('LOG_SLACK_WEBHOOK_URL'),
58 | 'username' => 'Laravel Log',
59 | 'emoji' => ':boom:',
60 | 'level' => 'critical',
61 | ],
62 |
63 | 'papertrail' => [
64 | 'driver' => 'monolog',
65 | 'level' => 'debug',
66 | 'handler' => SyslogUdpHandler::class,
67 | 'handler_with' => [
68 | 'host' => env('PAPERTRAIL_URL'),
69 | 'port' => env('PAPERTRAIL_PORT'),
70 | ],
71 | ],
72 |
73 | 'stderr' => [
74 | 'driver' => 'monolog',
75 | 'handler' => StreamHandler::class,
76 | 'with' => [
77 | 'stream' => 'php://stderr',
78 | ],
79 | ],
80 |
81 | 'syslog' => [
82 | 'driver' => 'syslog',
83 | 'level' => 'debug',
84 | ],
85 |
86 | 'errorlog' => [
87 | 'driver' => 'errorlog',
88 | 'level' => 'debug',
89 | ],
90 | ],
91 |
92 | ];
93 |
--------------------------------------------------------------------------------
/config/mail.php:
--------------------------------------------------------------------------------
1 | env('MAIL_DRIVER', 'smtp'),
20 |
21 | /*
22 | |--------------------------------------------------------------------------
23 | | SMTP Host Address
24 | |--------------------------------------------------------------------------
25 | |
26 | | Here you may provide the host address of the SMTP server used by your
27 | | applications. A default option is provided that is compatible with
28 | | the Mailgun mail service which will provide reliable deliveries.
29 | |
30 | */
31 |
32 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
33 |
34 | /*
35 | |--------------------------------------------------------------------------
36 | | SMTP Host Port
37 | |--------------------------------------------------------------------------
38 | |
39 | | This is the SMTP port used by your application to deliver e-mails to
40 | | users of the application. Like the host we have set this value to
41 | | stay compatible with the Mailgun e-mail application by default.
42 | |
43 | */
44 |
45 | 'port' => env('MAIL_PORT', 587),
46 |
47 | /*
48 | |--------------------------------------------------------------------------
49 | | Global "From" Address
50 | |--------------------------------------------------------------------------
51 | |
52 | | You may wish for all e-mails sent by your application to be sent from
53 | | the same address. Here, you may specify a name and address that is
54 | | used globally for all e-mails that are sent by your application.
55 | |
56 | */
57 |
58 | 'from' => [
59 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
60 | 'name' => env('MAIL_FROM_NAME', 'Example'),
61 | ],
62 |
63 | /*
64 | |--------------------------------------------------------------------------
65 | | E-Mail Encryption Protocol
66 | |--------------------------------------------------------------------------
67 | |
68 | | Here you may specify the encryption protocol that should be used when
69 | | the application send e-mail messages. A sensible default using the
70 | | transport layer security protocol should provide great security.
71 | |
72 | */
73 |
74 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
75 |
76 | /*
77 | |--------------------------------------------------------------------------
78 | | SMTP Server Username
79 | |--------------------------------------------------------------------------
80 | |
81 | | If your SMTP server requires a username for authentication, you should
82 | | set it here. This will get used to authenticate with your server on
83 | | connection. You may also set the "password" value below this one.
84 | |
85 | */
86 |
87 | 'username' => env('MAIL_USERNAME'),
88 |
89 | 'password' => env('MAIL_PASSWORD'),
90 |
91 | /*
92 | |--------------------------------------------------------------------------
93 | | Sendmail System Path
94 | |--------------------------------------------------------------------------
95 | |
96 | | When using the "sendmail" driver to send e-mails, we will need to know
97 | | the path to where Sendmail lives on this server. A default path has
98 | | been provided here, which will work well on most of your systems.
99 | |
100 | */
101 |
102 | 'sendmail' => '/usr/sbin/sendmail -bs',
103 |
104 | /*
105 | |--------------------------------------------------------------------------
106 | | Markdown Mail Settings
107 | |--------------------------------------------------------------------------
108 | |
109 | | If you are using Markdown based email rendering, you may configure your
110 | | theme and component paths here, allowing you to customize the design
111 | | of the emails. Or, you may simply stick with the Laravel defaults!
112 | |
113 | */
114 |
115 | 'markdown' => [
116 | 'theme' => 'default',
117 |
118 | 'paths' => [
119 | resource_path('views/vendor/mail'),
120 | ],
121 | ],
122 |
123 | ];
124 |
--------------------------------------------------------------------------------
/config/queue.php:
--------------------------------------------------------------------------------
1 | env('QUEUE_CONNECTION', 'sync'),
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Queue Connections
21 | |--------------------------------------------------------------------------
22 | |
23 | | Here you may configure the connection information for each server that
24 | | is used by your application. A default configuration has been added
25 | | for each back-end shipped with Laravel. You are free to add more.
26 | |
27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
28 | |
29 | */
30 |
31 | 'connections' => [
32 |
33 | 'sync' => [
34 | 'driver' => 'sync',
35 | ],
36 |
37 | 'database' => [
38 | 'driver' => 'database',
39 | 'table' => 'jobs',
40 | 'queue' => 'default',
41 | 'retry_after' => 90,
42 | ],
43 |
44 | 'beanstalkd' => [
45 | 'driver' => 'beanstalkd',
46 | 'host' => 'localhost',
47 | 'queue' => 'default',
48 | 'retry_after' => 90,
49 | ],
50 |
51 | 'sqs' => [
52 | 'driver' => 'sqs',
53 | 'key' => env('SQS_KEY', 'your-public-key'),
54 | 'secret' => env('SQS_SECRET', 'your-secret-key'),
55 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
56 | 'queue' => env('SQS_QUEUE', 'your-queue-name'),
57 | 'region' => env('SQS_REGION', 'us-east-1'),
58 | ],
59 |
60 | 'redis' => [
61 | 'driver' => 'redis',
62 | 'connection' => 'default',
63 | 'queue' => env('REDIS_QUEUE', 'default'),
64 | 'retry_after' => 90,
65 | 'block_for' => null,
66 | ],
67 |
68 | ],
69 |
70 | /*
71 | |--------------------------------------------------------------------------
72 | | Failed Queue Jobs
73 | |--------------------------------------------------------------------------
74 | |
75 | | These options configure the behavior of failed queue job logging so you
76 | | can control which database and table are used to store the jobs that
77 | | have failed. You may change them to any database / table you wish.
78 | |
79 | */
80 |
81 | 'failed' => [
82 | 'database' => env('DB_CONNECTION', 'mysql'),
83 | 'table' => 'failed_jobs',
84 | ],
85 |
86 | ];
87 |
--------------------------------------------------------------------------------
/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 | 'ses' => [
24 | 'key' => env('SES_KEY'),
25 | 'secret' => env('SES_SECRET'),
26 | 'region' => env('SES_REGION', 'us-east-1'),
27 | ],
28 |
29 | 'sparkpost' => [
30 | 'secret' => env('SPARKPOST_SECRET'),
31 | ],
32 |
33 | 'stripe' => [
34 | 'model' => App\User::class,
35 | 'key' => env('STRIPE_KEY'),
36 | 'secret' => env('STRIPE_SECRET'),
37 | 'webhook' => [
38 | 'secret' => env('STRIPE_WEBHOOK_SECRET'),
39 | 'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
40 | ],
41 | ],
42 |
43 | ];
44 |
--------------------------------------------------------------------------------
/config/session.php:
--------------------------------------------------------------------------------
1 | env('SESSION_DRIVER', 'file'),
22 |
23 | /*
24 | |--------------------------------------------------------------------------
25 | | Session Lifetime
26 | |--------------------------------------------------------------------------
27 | |
28 | | Here you may specify the number of minutes that you wish the session
29 | | to be allowed to remain idle before it expires. If you want them
30 | | to immediately expire on the browser closing, set that option.
31 | |
32 | */
33 |
34 | 'lifetime' => env('SESSION_LIFETIME', 120),
35 |
36 | 'expire_on_close' => false,
37 |
38 | /*
39 | |--------------------------------------------------------------------------
40 | | Session Encryption
41 | |--------------------------------------------------------------------------
42 | |
43 | | This option allows you to easily specify that all of your session data
44 | | should be encrypted before it is stored. All encryption will be run
45 | | automatically by Laravel and you can use the Session like normal.
46 | |
47 | */
48 |
49 | 'encrypt' => false,
50 |
51 | /*
52 | |--------------------------------------------------------------------------
53 | | Session File Location
54 | |--------------------------------------------------------------------------
55 | |
56 | | When using the native session driver, we need a location where session
57 | | files may be stored. A default has been set for you but a different
58 | | location may be specified. This is only needed for file sessions.
59 | |
60 | */
61 |
62 | 'files' => storage_path('framework/sessions'),
63 |
64 | /*
65 | |--------------------------------------------------------------------------
66 | | Session Database Connection
67 | |--------------------------------------------------------------------------
68 | |
69 | | When using the "database" or "redis" session drivers, you may specify a
70 | | connection that should be used to manage these sessions. This should
71 | | correspond to a connection in your database configuration options.
72 | |
73 | */
74 |
75 | 'connection' => env('SESSION_CONNECTION', null),
76 |
77 | /*
78 | |--------------------------------------------------------------------------
79 | | Session Database Table
80 | |--------------------------------------------------------------------------
81 | |
82 | | When using the "database" session driver, you may specify the table we
83 | | should use to manage the sessions. Of course, a sensible default is
84 | | provided for you; however, you are free to change this as needed.
85 | |
86 | */
87 |
88 | 'table' => 'sessions',
89 |
90 | /*
91 | |--------------------------------------------------------------------------
92 | | Session Cache Store
93 | |--------------------------------------------------------------------------
94 | |
95 | | When using the "apc" or "memcached" session drivers, you may specify a
96 | | cache store that should be used for these sessions. This value must
97 | | correspond with one of the application's configured cache stores.
98 | |
99 | */
100 |
101 | 'store' => env('SESSION_STORE', null),
102 |
103 | /*
104 | |--------------------------------------------------------------------------
105 | | Session Sweeping Lottery
106 | |--------------------------------------------------------------------------
107 | |
108 | | Some session drivers must manually sweep their storage location to get
109 | | rid of old sessions from storage. Here are the chances that it will
110 | | happen on a given request. By default, the odds are 2 out of 100.
111 | |
112 | */
113 |
114 | 'lottery' => [2, 100],
115 |
116 | /*
117 | |--------------------------------------------------------------------------
118 | | Session Cookie Name
119 | |--------------------------------------------------------------------------
120 | |
121 | | Here you may change the name of the cookie used to identify a session
122 | | instance by ID. The name specified here will get used every time a
123 | | new session cookie is created by the framework for every driver.
124 | |
125 | */
126 |
127 | 'cookie' => env(
128 | 'SESSION_COOKIE',
129 | Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
130 | ),
131 |
132 | /*
133 | |--------------------------------------------------------------------------
134 | | Session Cookie Path
135 | |--------------------------------------------------------------------------
136 | |
137 | | The session cookie path determines the path for which the cookie will
138 | | be regarded as available. Typically, this will be the root path of
139 | | your application but you are free to change this when necessary.
140 | |
141 | */
142 |
143 | 'path' => '/',
144 |
145 | /*
146 | |--------------------------------------------------------------------------
147 | | Session Cookie Domain
148 | |--------------------------------------------------------------------------
149 | |
150 | | Here you may change the domain of the cookie used to identify a session
151 | | in your application. This will determine which domains the cookie is
152 | | available to in your application. A sensible default has been set.
153 | |
154 | */
155 |
156 | 'domain' => env('SESSION_DOMAIN', null),
157 |
158 | /*
159 | |--------------------------------------------------------------------------
160 | | HTTPS Only Cookies
161 | |--------------------------------------------------------------------------
162 | |
163 | | By setting this option to true, session cookies will only be sent back
164 | | to the server if the browser has a HTTPS connection. This will keep
165 | | the cookie from being sent to you if it can not be done securely.
166 | |
167 | */
168 |
169 | 'secure' => env('SESSION_SECURE_COOKIE', false),
170 |
171 | /*
172 | |--------------------------------------------------------------------------
173 | | HTTP Access Only
174 | |--------------------------------------------------------------------------
175 | |
176 | | Setting this value to true will prevent JavaScript from accessing the
177 | | value of the cookie and the cookie will only be accessible through
178 | | the HTTP protocol. You are free to modify this option if needed.
179 | |
180 | */
181 |
182 | 'http_only' => true,
183 |
184 | /*
185 | |--------------------------------------------------------------------------
186 | | Same-Site Cookies
187 | |--------------------------------------------------------------------------
188 | |
189 | | This option determines how your cookies behave when cross-site requests
190 | | take place, and can be used to mitigate CSRF attacks. By default, we
191 | | do not enable this as other CSRF protection services are in place.
192 | |
193 | | Supported: "lax", "strict"
194 | |
195 | */
196 |
197 | 'same_site' => null,
198 |
199 | ];
200 |
--------------------------------------------------------------------------------
/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' => realpath(storage_path('framework/views')),
32 |
33 | ];
34 |
--------------------------------------------------------------------------------
/database/.gitignore:
--------------------------------------------------------------------------------
1 | *.sqlite
2 |
--------------------------------------------------------------------------------
/database/factories/UserFactory.php:
--------------------------------------------------------------------------------
1 | define(App\User::class, function (Faker $faker) {
18 | return [
19 | 'name' => $faker->name,
20 | 'email' => $faker->unique()->safeEmail,
21 | 'email_verified_at' => now(),
22 | 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
23 | 'remember_token' => str_random(10),
24 | ];
25 | });
26 |
27 | //subscriber table data seeder
28 | $factory->define(App\Subscriber::class, function (Faker $faker) {
29 |
30 | $state = array('active', 'unsubscribed', 'junk', 'bounced', 'unconfirmed');
31 | // get random index from $state array
32 | $randIndex = array_rand($state);
33 | return [
34 | 'name' => $faker->name,
35 | 'email_address' => $faker->email,
36 | 'state' => $state[$randIndex],
37 | ];
38 | });
39 |
40 | //Filed table data seeder
41 | $factory->define(App\Field::class, function (Faker $faker) {
42 |
43 | $type = array('date', 'number', 'string', 'boolean');
44 | // get random index from $type array
45 | $randIndex = array_rand($type);
46 |
47 | return [
48 | 'title' => $faker->sentence,
49 | 'type' => $type[$randIndex],
50 | ];
51 | });
52 |
--------------------------------------------------------------------------------
/database/migrations/2014_10_12_000000_create_users_table.php:
--------------------------------------------------------------------------------
1 | increments('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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/database/migrations/2018_11_23_135830_create_subscribers_table.php:
--------------------------------------------------------------------------------
1 | increments('id');
18 | $table->string('name');
19 | $table->string('email_address');
20 | $table->enum('state', array('active', 'unsubscribed', 'junk', 'bounced', 'unconfirmed'))->default('unconfirmed');
21 | $table->timestamps();
22 | });
23 | }
24 |
25 | /**
26 | * Reverse the migrations.
27 | *
28 | * @return void
29 | */
30 | public function down()
31 | {
32 | Schema::dropIfExists('subscribers');
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/database/migrations/2018_11_23_141222_create_fields_table.php:
--------------------------------------------------------------------------------
1 | increments('id');
18 | $table->string('title');
19 | $table->enum('type', array('date', 'number', 'string', 'boolean'))->default('string');
20 | $table->timestamps();
21 | });
22 | }
23 |
24 | /**
25 | * Reverse the migrations.
26 | *
27 | * @return void
28 | */
29 | public function down()
30 | {
31 | Schema::dropIfExists('fields');
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/database/migrations/2018_11_23_164128_create_subscriber_fields_table.php:
--------------------------------------------------------------------------------
1 | increments('id');
18 | $table->integer('subscriber_id')->unsigned();
19 | $table->integer('field_id')->unsigned();
20 |
21 | $table->foreign('subscriber_id')
22 | ->references('id')
23 | ->on('subscribers')
24 | ->onDelete('cascade');
25 |
26 | $table->foreign('field_id')
27 | ->references('id')
28 | ->on('fields')
29 | ->onDelete('cascade');
30 | });
31 | }
32 |
33 | /**
34 | * Reverse the migrations.
35 | *
36 | * @return void
37 | */
38 | public function down()
39 | {
40 | Schema::dropIfExists('subscriber_fields');
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/database/migrations/2018_11_23_183516_adds_api_token_to_users_table.php:
--------------------------------------------------------------------------------
1 | string('api_token', 60)->unique()->after('remember_token')->nullable();
18 | });
19 | }
20 |
21 | /**
22 | * Reverse the migrations.
23 | *
24 | * @return void
25 | */
26 | public function down()
27 | {
28 | Schema::table('users', function (Blueprint $table) {
29 | $table->dropColumn(['api_token']);
30 | });
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/database/seeds/DatabaseSeeder.php:
--------------------------------------------------------------------------------
1 | call(UsersTableSeeder::class);
15 | $this->call(SubscribersTableSeeder::class);
16 | $this->call(FieldsTableSeeder::class);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/database/seeds/FieldsTableSeeder.php:
--------------------------------------------------------------------------------
1 | getDriverName() == 'mysql') {
17 | DB::statement('SET FOREIGN_KEY_CHECKS=0;');
18 | }
19 |
20 | if (DB::connection()->getDriverName() == 'mysql') {
21 | DB::table('fields')->truncate();
22 | } elseif (DB::connection()->getDriverName() == 'sqlite') {
23 | DB::statement('DELETE FROM fields');
24 | } else {
25 | //For PostgreSQL or anything else
26 | DB::statement('TRUNCATE TABLE fields CASCADE');
27 | }
28 |
29 | $faker = \Faker\Factory::create();
30 |
31 | $type = array('date', 'number', 'string', 'boolean');
32 |
33 | // And now, let's create a few fileds in our database:
34 | for ($i = 0; $i < 20; $i++) {
35 | // get random index from $type array
36 | $randIndex = array_rand($type);
37 |
38 | Field::create([
39 | 'title' => $faker->sentence,
40 | 'type' => $type[$randIndex],
41 | ]);
42 | }
43 |
44 | if (DB::connection()->getDriverName() == 'mysql') {
45 | DB::statement('SET FOREIGN_KEY_CHECKS=1;');
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/database/seeds/SubscribersTableSeeder.php:
--------------------------------------------------------------------------------
1 | getDriverName() == 'mysql') {
17 | DB::statement('SET FOREIGN_KEY_CHECKS=0;');
18 | }
19 |
20 | if (DB::connection()->getDriverName() == 'mysql') {
21 | DB::table('subscribers')->truncate();
22 | } elseif (DB::connection()->getDriverName() == 'sqlite') {
23 | DB::statement('DELETE FROM subscribers');
24 | } else {
25 | //For PostgreSQL or anything else
26 | DB::statement('TRUNCATE TABLE subscribers CASCADE');
27 | }
28 |
29 | $faker = \Faker\Factory::create();
30 |
31 | $state = array('active', 'unsubscribed', 'junk', 'bounced', 'unconfirmed');
32 |
33 | // And now, let's create a few subscriber in our database:
34 | for ($i = 0; $i < 20; $i++) {
35 | // get random index from $state array
36 | $randIndex = array_rand($state);
37 |
38 | Subscriber::create([
39 | 'name' => $faker->name,
40 | 'email_address' => $faker->email,
41 | 'state' => $state[$randIndex],
42 | ]);
43 | }
44 |
45 | if (DB::connection()->getDriverName() == 'mysql') {
46 | DB::statement('SET FOREIGN_KEY_CHECKS=1;');
47 | }
48 |
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/database/seeds/UsersTableSeeder.php:
--------------------------------------------------------------------------------
1 | getDriverName() == 'mysql') {
17 | DB::statement('SET FOREIGN_KEY_CHECKS=0;');
18 | }
19 |
20 | if (DB::connection()->getDriverName() == 'mysql') {
21 | DB::table('users')->truncate();
22 | } elseif (DB::connection()->getDriverName() == 'sqlite') {
23 | DB::statement('DELETE FROM users');
24 | } else {
25 | //For PostgreSQL or anything else
26 | DB::statement('TRUNCATE TABLE users CASCADE');
27 | }
28 |
29 |
30 | //Add the master administrator, user id of 1
31 | $users = [
32 | [
33 | 'name' => 'Administrator',
34 | 'email' => 'admin@admin.com',
35 | 'password' => bcrypt('123456'),
36 | 'email_verified_at' => Carbon::now(),
37 | 'created_at' => Carbon::now(),
38 | 'updated_at' => Carbon::now(),
39 | ],
40 | [
41 | 'name' => 'Backend',
42 | 'email' => 'executive@executive.com',
43 | 'password' => bcrypt('12345'),
44 | 'email_verified_at' => Carbon::now(),
45 | 'created_at' => Carbon::now(),
46 | 'updated_at' => Carbon::now(),
47 | ],
48 | [
49 | 'name' => 'Default',
50 | 'email' => 'user@user.com',
51 | 'password' => bcrypt('1234'),
52 | 'email_verified_at' => Carbon::now(),
53 | 'created_at' => Carbon::now(),
54 | 'updated_at' => Carbon::now(),
55 | ],
56 | ];
57 |
58 | DB::table('users')->insert($users);
59 |
60 | if (DB::connection()->getDriverName() == 'mysql') {
61 | DB::statement('SET FOREIGN_KEY_CHECKS=1;');
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/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 | "bootstrap": "^4.0.0",
15 | "cross-env": "^5.1",
16 | "jquery": "^3.2",
17 | "laravel-mix": "^2.0",
18 | "lodash": "^4.17.5",
19 | "popper.js": "^1.12",
20 | "vue": "^2.5.17"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |