فهرست منبع

Basic for API

Rosy Stephen 3 سال پیش
والد
کامیت
064e62af72
100فایلهای تغییر یافته به همراه13076 افزوده شده و 0 حذف شده
  1. 18 0
      .editorconfig
  2. 58 0
      .env.example
  3. 11 0
      .gitattributes
  4. 18 0
      .gitignore
  5. 32 0
      app/Console/Kernel.php
  6. 50 0
      app/Exceptions/Handler.php
  7. 127 0
      app/Http/Controllers/Admin/AssetController.php
  8. 242 0
      app/Http/Controllers/Admin/CmsController.php
  9. 42 0
      app/Http/Controllers/Admin/LoginController.php
  10. 255 0
      app/Http/Controllers/Admin/UserController.php
  11. 33 0
      app/Http/Controllers/Api/v1/CmsController.php
  12. 179 0
      app/Http/Controllers/Api/v1/LoginController.php
  13. 118 0
      app/Http/Controllers/App/UserController.php
  14. 54 0
      app/Http/Controllers/AppController.php
  15. 45 0
      app/Http/Controllers/CheckoutController.php
  16. 13 0
      app/Http/Controllers/Controller.php
  17. 45 0
      app/Http/Controllers/ProfileController.php
  18. 68 0
      app/Http/Kernel.php
  19. 21 0
      app/Http/Middleware/Authenticate.php
  20. 17 0
      app/Http/Middleware/EncryptCookies.php
  21. 17 0
      app/Http/Middleware/PreventRequestsDuringMaintenance.php
  22. 32 0
      app/Http/Middleware/RedirectIfAuthenticated.php
  23. 19 0
      app/Http/Middleware/TrimStrings.php
  24. 20 0
      app/Http/Middleware/TrustHosts.php
  25. 28 0
      app/Http/Middleware/TrustProxies.php
  26. 22 0
      app/Http/Middleware/ValidateSignature.php
  27. 17 0
      app/Http/Middleware/VerifyCsrfToken.php
  28. 27 0
      app/Http/Resources/User.php
  29. 32 0
      app/Http/Resources/ZapPage.php
  30. 19 0
      app/Http/Resources/ZapPageCollection.php
  31. 23 0
      app/Http/Resources/ZapPageFormButtons.php
  32. 21 0
      app/Http/Resources/ZapPageFormButtonsCollection.php
  33. 26 0
      app/Http/Resources/ZapPageFormFields.php
  34. 21 0
      app/Http/Resources/ZapPageFormFieldsCollection.php
  35. 71 0
      app/Models/Asset.php
  36. 106 0
      app/Models/Order.php
  37. 35 0
      app/Models/Settings.php
  38. 104 0
      app/Models/User.php
  39. 19 0
      app/Models/UserCorporate.php
  40. 28 0
      app/Models/UserData.php
  41. 53 0
      app/Models/UserDocuments.php
  42. 26 0
      app/Models/UserLocation.php
  43. 27 0
      app/Models/WalletHistoryUsers.php
  44. 49 0
      app/Models/ZapPage.php
  45. 37 0
      app/Models/ZapPageFormButtons.php
  46. 38 0
      app/Models/ZapPageFormFields.php
  47. 28 0
      app/Providers/AppServiceProvider.php
  48. 30 0
      app/Providers/AuthServiceProvider.php
  49. 21 0
      app/Providers/BroadcastServiceProvider.php
  50. 42 0
      app/Providers/EventServiceProvider.php
  51. 52 0
      app/Providers/RouteServiceProvider.php
  52. 53 0
      artisan
  53. 55 0
      bootstrap/app.php
  54. 2 0
      bootstrap/cache/.gitignore
  55. 66 0
      composer.json
  56. 7878 0
      composer.lock
  57. 216 0
      config/app.php
  58. 115 0
      config/auth.php
  59. 70 0
      config/broadcasting.php
  60. 110 0
      config/cache.php
  61. 34 0
      config/cors.php
  62. 151 0
      config/database.php
  63. 77 0
      config/filesystems.php
  64. 52 0
      config/hashing.php
  65. 122 0
      config/logging.php
  66. 118 0
      config/mail.php
  67. 93 0
      config/queue.php
  68. 13 0
      config/rbac.php
  69. 67 0
      config/sanctum.php
  70. 34 0
      config/services.php
  71. 201 0
      config/session.php
  72. 36 0
      config/view.php
  73. 1 0
      database/.gitignore
  74. 40 0
      database/factories/UserFactory.php
  75. 38 0
      database/migrations/2014_10_12_000000_create_users_table.php
  76. 32 0
      database/migrations/2014_10_12_100000_create_password_resets_table.php
  77. 36 0
      database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  78. 37 0
      database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
  79. 37 0
      database/migrations/2020_07_11_151756_create_roles_table.php
  80. 75 0
      database/migrations/2020_07_11_151834_create_user_role_table.php
  81. 37 0
      database/migrations/2020_07_11_151894_create_permissions_table.php
  82. 38 0
      database/migrations/2020_07_11_151925_create_role_permission_table.php
  83. 49 0
      database/migrations/2023_02_02_065537_assets_table.php
  84. 28 0
      database/migrations/2023_02_02_065816_assets_table.php
  85. 24 0
      database/seeders/DatabaseSeeder.php
  86. 22 0
      database/seeders/LaRbacDatabaseSeeder.php
  87. 65 0
      database/seeders/PermissionSeeder.php
  88. 89 0
      database/seeders/RoleSeeder.php
  89. 20 0
      lang/en/auth.php
  90. 19 0
      lang/en/pagination.php
  91. 22 0
      lang/en/passwords.php
  92. 179 0
      lang/en/validation.php
  93. 14 0
      package.json
  94. 31 0
      phpunit.xml
  95. 21 0
      public/.htaccess
  96. BIN
      public/assets/Dist-DataTables-SearchPanes-Bootstrap4-master.zip
  97. BIN
      public/assets/Dist-DataTables-Select-Bootstrap4-master.zip
  98. 1 0
      public/assets/Dist-DataTables-Select-Bootstrap4-master/Dist-DataTables-Select-Bootstrap4-master/.gitignore
  99. 22 0
      public/assets/Dist-DataTables-Select-Bootstrap4-master/Dist-DataTables-Select-Bootstrap4-master/License.txt
  100. 0 0
      public/assets/Dist-DataTables-Select-Bootstrap4-master/Dist-DataTables-Select-Bootstrap4-master/Readme.md

+ 18 - 0
.editorconfig

@@ -0,0 +1,18 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[docker-compose.yml]
+indent_size = 4

+ 58 - 0
.env.example

@@ -0,0 +1,58 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_URL=http://localhost
+
+LOG_CHANNEL=stack
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=laravel
+DB_USERNAME=root
+DB_PASSWORD=
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+FILESYSTEM_DISK=local
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+MEMCACHED_HOST=127.0.0.1
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailhog
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="hello@example.com"
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+AWS_USE_PATH_STYLE_ENDPOINT=false
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_HOST=
+PUSHER_PORT=443
+PUSHER_SCHEME=https
+PUSHER_APP_CLUSTER=mt1
+
+VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+VITE_PUSHER_HOST="${PUSHER_HOST}"
+VITE_PUSHER_PORT="${PUSHER_PORT}"
+VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
+VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

+ 11 - 0
.gitattributes

@@ -0,0 +1,11 @@
+* text=auto
+
+*.blade.php diff=html
+*.css diff=css
+*.html diff=html
+*.md diff=markdown
+*.php diff=php
+
+/.github export-ignore
+CHANGELOG.md export-ignore
+.styleci.yml export-ignore

+ 18 - 0
.gitignore

@@ -0,0 +1,18 @@
+/node_modules
+/public/build
+/public/hot
+/public/storage
+/storage/*.key
+/vendor
+.env
+.env.backup
+.env.production
+.phpunit.result.cache
+Homestead.json
+Homestead.yaml
+auth.json
+npm-debug.log
+yarn-error.log
+/.fleet
+/.idea
+/.vscode

+ 32 - 0
app/Console/Kernel.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Console;
+
+use Illuminate\Console\Scheduling\Schedule;
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+
+class Kernel extends ConsoleKernel
+{
+    /**
+     * Define the application's command schedule.
+     *
+     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
+     * @return void
+     */
+    protected function schedule(Schedule $schedule)
+    {
+        // $schedule->command('inspire')->hourly();
+    }
+
+    /**
+     * Register the commands for the application.
+     *
+     * @return void
+     */
+    protected function commands()
+    {
+        $this->load(__DIR__.'/Commands');
+
+        require base_path('routes/console.php');
+    }
+}

+ 50 - 0
app/Exceptions/Handler.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Exceptions;
+
+use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+use Throwable;
+
+class Handler extends ExceptionHandler
+{
+    /**
+     * A list of exception types with their corresponding custom log levels.
+     *
+     * @var array<class-string<\Throwable>, \Psr\Log\LogLevel::*>
+     */
+    protected $levels = [
+        //
+    ];
+
+    /**
+     * A list of the exception types that are not reported.
+     *
+     * @var array<int, class-string<\Throwable>>
+     */
+    protected $dontReport = [
+        //
+    ];
+
+    /**
+     * A list of the inputs that are never flashed to the session on validation exceptions.
+     *
+     * @var array<int, string>
+     */
+    protected $dontFlash = [
+        'current_password',
+        'password',
+        'password_confirmation',
+    ];
+
+    /**
+     * Register the exception handling callbacks for the application.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        $this->reportable(function (Throwable $e) {
+            //
+        });
+    }
+}

+ 127 - 0
app/Http/Controllers/Admin/AssetController.php

@@ -0,0 +1,127 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Http\Request;
+use Hash;
+use Session;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Redirect;
+use App\Models\User;
+use App\Models\Asset;
+use App\Models\UserDocuments;
+use App\Models\WalletHistoryUsers;
+use Illuminate\Support\Facades\Validator;
+class AssetController extends BaseController
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function index()
+    {
+       
+        $assets = Asset::whereNull('deleted_at')->get();
+        return view('admin.assets.index', compact('assets'));
+    }
+    
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function validate(Request $request)
+    {
+        $asset = new Asset();
+        return $asset->validate($request);
+    }
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function create()
+    {
+        return view('admin.assets.create');
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param \Illuminate\Http\Request $request
+     *
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function store(Request $request)
+    {
+        
+        $requestData = $request->all();
+        
+        Asset::create($requestData);
+
+        return redirect('admin/assets')->with('flash_message', 'Post added!');
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  int  $id
+     *
+     * @return \Illuminate\View\View
+     */
+    public function show($id)
+    {
+        $asset = Asset::findOrFail($id);
+
+        return view('admin.assets.show', compact('asset'));
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  int  $id
+     *
+     * @return \Illuminate\View\View
+     */
+    public function edit($id)
+    {
+        $asset = Asset::findOrFail($id);
+
+        return view('admin.assets.edit', compact('asset'));
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param \Illuminate\Http\Request $request
+     * @param  int  $id
+     *
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function update(Request $request, $id)
+    {
+        
+        $requestData = $request->all();
+        
+        $asset = Asset::findOrFail($id);
+        $asset->update($requestData);
+
+        return redirect('admin/assets')->with('flash_message', 'Assets updated!');
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  int  $id
+     *
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function destroy($id)
+    {
+        Asset::destroy($id);
+
+        return redirect('admin/assets')->with('flash_message', 'Post deleted!');
+    }
+}

+ 242 - 0
app/Http/Controllers/Admin/CmsController.php

@@ -0,0 +1,242 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Support\Facades\Session;
+use Illuminate\Support\Facades\Redirect;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use App\Models\ZapPage;
+use App\Models\ZapPageFormButtons;
+use App\Models\ZapPageFormFields;
+use App\Http\Controllers\AppController;
+//use Illuminate\Support\Facades\Schema;
+//use Illuminate\Support\Facades\DB;
+
+class CmsController extends AppController
+{
+    
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function index()
+    {
+       
+        $zapPages = ZapPage::get();
+        return view('admin.zap_pages.index', compact('zapPages'));
+    }
+    
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function validate(Request $request)
+    {
+        $zapPage = new ZapPage();
+        $validate = Validator::make($request->all(), [
+            'slug' => 'required|unique:zap_pages,slug',
+            'title' => 'required',
+        ]);
+        if($validate->fails()){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => $validate->errors()
+            ], 400);
+        }
+        return response()->json([
+            'status' => true,
+            'message' => 'sucess',
+            'errors' => ''
+        ], 200);
+        //return $zapPage->validate($request);
+    }
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\View\View
+     */
+    public function create()
+    {
+        return view('admin.zap_pages.create');
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param \Illuminate\Http\Request $request
+     *
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function store(Request $request)
+    {
+        
+        $requestData = $request->all();
+        $filePath ='';
+        //print_r($file); exit;
+        if(isset($request->file()['image'])){
+            $file = $request->file()['image'];
+            $savedAs = $requestData['slug'] . '_'.$requestData['title'].'.'.$file->extension();
+            $filePath = $file->storeAs('uploads', $savedAs, 'public');
+        }
+        $zapPageData = [
+            'slug' => $requestData['slug'],
+            'title' => $requestData['title'],
+            'sub_title' => $requestData['sub_title'],
+            'image' => $filePath,
+            'content' =>  $requestData['content'],
+        ];
+        $zapPage = ZapPage::create($zapPageData);
+
+        foreach($requestData['form-fields'] as $formFields){
+            $formFieldsData = [
+               'zap_page_id' => $zapPage['id'],
+                'type' => $formFields['field_type'],
+                'name' => $formFields['field_name'],
+                'title' => $formFields['field_title'],
+                'place_holder' => $formFields['place_holder'],    
+            ];
+            $zapPageForm = ZapPageFormFields::create($formFieldsData);
+        }
+        //exit;
+        foreach($requestData['form-buttons'] as $buttonFields){
+            $formButtonData = [
+                'zap_page_id' => $zapPage['id'],
+                'button_type' => $buttonFields['button_type'],
+                'button_value' => $buttonFields['button_value'],
+                'on_submit' => $buttonFields['button_submit']
+            ];
+            $zapPageButton = ZapPageFormButtons::create($formButtonData);
+        }
+
+        return redirect('admin/zap-pages')->with('flash_message', 'Zap Pages added!');
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  int  $id
+     *
+     * @return \Illuminate\View\View
+     */
+    public function show($id)
+    {
+        $zapPage = ZapPage::findOrFail($id);
+        $zapPageFormFields = ZapPageFormFields::where('zap_page_id', $id)->get();
+        $zapPageFormButtons = ZapPageFormButtons::where('zap_page_id', $id)->get();
+        return view('admin.zapPages.show', compact('zapPage', 'zapPageFormFields', 'zapPageFormButtons'));
+
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  int  $id
+     *
+     * @return \Illuminate\View\View
+     */
+    public function edit($id)
+    {
+        $zapPage = ZapPage::findOrFail($id);
+        $zapPageFormFields = ZapPageFormFields::where('zap_page_id', $id)->get();
+        $zapPageFormButtons = ZapPageFormButtons::where('zap_page_id', $id)->get();
+        //print_r($zapPageFormFields); exit;
+        return view('admin.zap_pages.edit', compact('zapPage', 'zapPageFormFields', 'zapPageFormButtons'));
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param \Illuminate\Http\Request $request
+     * @param  int  $id
+     *
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function update(Request $request, $id)
+    {
+        
+        $requestData = $request->all();
+        
+        $zapPage = ZapPage::findOrFail($id);
+        
+        $filePath ='';
+        //print_r($file); exit;
+        if(isset($request->file()['image'])){
+            $file = $request->file()['image'];
+            $savedAs = $requestData['slug'] . '_'.$requestData['title'].'.'.$file->extension();
+            $filePath = $file->storeAs('uploads', $savedAs, 'public');
+        }
+        $zapPageData = [
+            'slug' => $requestData['slug'],
+            'title' => $requestData['title'],
+            'sub_title' => $requestData['sub_title'],
+            'image' => $filePath,
+           // 'content' =>  $requestData['content'],
+        ];
+        $zapPage->update($zapPageData);
+        $formFields = ZapPageFormFields::where('zap_page_id', $id)->get()->toArray();
+        foreach($formFields as $formField){
+            $this->destroyFormField($formField['id']);
+        } 
+        foreach($requestData['form-fields'] as $formFields){
+            $formFieldsData = [
+               'zap_page_id' => $zapPage['id'],
+                'type' => $formFields['field_type'],
+                'name' => $formFields['field_name'],
+                'title' => $formFields['field_title'],
+                'place_holder' => $formFields['place_holder'],    
+            ];
+            $zapPageForm = ZapPageFormFields::create($formFieldsData);
+        }
+        $formButtons = ZapPageFormButtons::where('zap_page_id', $id)->get()->toArray();
+        foreach($formButtons as $formButton){
+            $this->destroyFormButton($formButton['id']);
+        }
+        foreach($requestData['form-buttons'] as $buttonFields){
+            $formButtonData = [
+                'zap_page_id' => $zapPage['id'],
+                'button_type' => $buttonFields['button_type'],
+                'button_value' => $buttonFields['button_value'],
+                'on_submit' => $buttonFields['button_submit']
+            ];
+            $zapPageButton = ZapPageFormButtons::create($formButtonData);
+        }
+        return redirect('admin/zap-pages')->with('flash_message', 'Zap Pages updated!');
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  int  $id
+     *
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function destroy($id)
+    {
+        ZapPage::destroy($id);
+        $formFields = ZapPageFormFields::where('zap_page_id', $id)->get()->toArray();
+        foreach($formFields as $formField){
+            $this->destroyFormField($formField['id']);
+        } 
+        $formButtons = ZapPageFormButtons::where('zap_page_id', $id)->get()->toArray();
+        foreach($formButtons as $formButton){
+            $this->destroyFormButton($formButton['id']);
+        }
+        return redirect('admin/zap-pages')->with('flash_message', 'Zap Pages  deleted!');
+    }
+    public function destroyFormField($id){
+        if(ZapPageFormFields::destroy($id)){
+            return true;
+        }
+    }
+    public function destroyFormButton($id){
+        if(ZapPageFormButtons::destroy($id)){
+            return true;
+        }
+    }
+}

+ 42 - 0
app/Http/Controllers/Admin/LoginController.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Http\Request;
+use Hash;
+use Session;
+use App\Models\User;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Redirect;
+
+class LoginController extends BaseController
+{
+    
+    
+    public function admin_login_form(){
+
+        return view('admin.users.auth-login')
+        ->with('pageHeading', 'Admin Login');
+    }
+    public function admin_login(Request $request){
+        if (Auth::check()) {
+            return Redirect::to('admin/dashboard');
+        }else{
+            $request->validate([
+                'email' => 'required',
+                'password' => 'required',
+            ]);
+    
+            $credentials = $request->only('email', 'password');
+            //print_r($credentials ); exit;
+            if (Auth::attempt($credentials)) {
+                return Redirect::to('admin/dashboard');
+            }else{
+                echo 'test'; exit;
+            }
+        }
+  
+        
+    }
+}

+ 255 - 0
app/Http/Controllers/Admin/UserController.php

@@ -0,0 +1,255 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Http\Request;
+use Hash;
+use Session;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Redirect;
+use App\Models\User;
+use App\Models\UserData;
+use App\Models\UserDocuments;
+use App\Models\WalletHistoryUsers;
+use Illuminate\Support\Facades\Validator;
+
+class UserController extends BaseController
+{
+    
+    /**
+     * Customer List View
+     */
+    public function customers(){
+        $users = User::with('UserData')->where('user_type', '=', 'Subscribers')->orWhere('user_type', '=', 'Corporate')->get();
+
+        return view('admin.users.customers', compact('users'));
+    }
+    /**
+     * Angels(Driver) List View
+     */
+    public function angels(){
+
+        $users = User::with('UserData')->where('user_type', '=', 'Corporate')->get();
+
+        return view('admin.users.customers', compact('users'));
+    }
+    /**
+     * Staff (Admin,Manager) List View
+     */
+    public function staff(){
+        $users = User::with('UserData')->where('user_type', '=', 'Staff')->get();
+
+        return view('admin.users.customers', compact('users'));
+    }
+    /**
+     * Render Customer add form in GET Method
+     */
+    public function add_customer(){
+
+        return view('admin.users.add_customer');
+    }
+    /**
+     * Render Angels add form in GET Method
+     */
+    public function add_angel(){
+
+        return view('admin.users.add_customer');
+    }
+    /**
+     *  Validate New user form request in User Model
+     *  return json responsr with HTTP status
+     */
+    public function new_user_form_validate(Request $request){
+        $user = new User();
+        return $user->signupValidate($request);
+    }
+    /**
+     *  Store New Subscriber or Corporate user to table from Admin portal
+     *  User, UserData, UserDocuments, Update Wallet History if wallet amount added
+     */
+    public function store_customer(Request $request){
+        $postData = $request->all();
+        $user = [
+            'name' => $postData['first_name'] .' ' . $postData['last_name'],
+            'email' => $postData['email'],
+            'phone_number' => $postData['phone_number'],
+            'user_type' => $postData['user_type'],
+            'password' => '123456'
+        ];
+        
+        $user = User::create($user);
+        
+        $userData = [
+            'user_id' => $user['id'],
+            'first_name' => $postData['first_name'],
+            'last_name' => $postData['last_name'],
+            'phone_number' => $postData['phone_number'],
+            'wallet_amount' => ( $postData['wallet_amount'] > 0) ? $postData['wallet_amount'] : 0
+        ];
+        $userData = UserData::create($userData);
+        
+        foreach($request['user-docs'] as $userDoc){
+            if($userDoc['doc']){
+                (new UserDocuments())->uploadFile($userDoc, $user);
+            }
+        }
+        if($postData['user_type']  == 'Corporate'){
+            $userCorporate = [
+                'user_id' => $user['id'],
+                'employee_id' => 'EMP'.$user['id'].$postData['business_name'],
+                'business_model' => $postData['business_name'],
+                'business_for' => $postData['business_for'],
+            ];
+            
+            $userCorporate = WalletHistoryUsers::create($userCorporate);
+        }
+        if($postData['wallet_amount'] > 0){
+            $walletHistory = [
+                'user_id' => $user['id'],
+                'purpose' => $postData['reason'],
+                'amount' => $postData['wallet_amount'],
+                'transaction_type' => 'Credited',
+            ];
+            
+            $walletHistory = WalletHistoryUsers::create($walletHistory);
+        }
+        return Redirect::to(route('admin.customers'));
+        
+    }
+    
+    /**
+     * Render Customer Edit form in GET Method
+     */
+    public function edit_customer($id){
+        $user = User::with(['UserData'])->where('id', '=', $id)->first();
+        //$userDocuments = UserDocuments::where('user_id', $id)->get()->keyBy('doc_page')->toArray();
+        $userDocuments = UserDocuments::where('user_id', $id)->get()->toArray();
+
+        return view('admin.users.edit_customer', compact('user', 'userDocuments'));
+    }
+    /**
+     *  Update Subscriber or Corporate user to table from Admin portal
+     *  User, UserData, UserDocuments, Update Wallet History if wallet amount added
+     */
+    public function update_customer(Request $request, $id){
+        $request->validate([
+            'email' => 'required|email',
+            'first_name' => 'required',
+            'last_name' => 'required',
+            'phone_number' => 'required',
+            'user_type' => 'required',
+        ]);
+        $postData = $request->all();
+        $user = User::findOrFail($id);
+        $userUpdate = [
+            'name' => $postData['first_name'] .' ' . $postData['last_name'],
+            'email' => $postData['email'],
+            'phone_number' => $postData['phone_number'],
+            'user_type' => $postData['user_type'],
+            'password' => '123456'
+        ];
+        $userDataUpdate = [
+            'user_id' => $user['id'],
+            'first_name' => $postData['first_name'],
+            'last_name' => $postData['last_name'],
+            'phone_number' => $postData['phone_number'],
+            'wallet_amount' => ( $postData['wallet_amount'] > 0) ? $postData['wallet_amount'] : 0
+        ];
+        $userData = UserData::where('user_id', $user['id'])->first();
+        if($postData['wallet_amount'] != $userData['wallet_amount']){
+            $amount  = $userData['wallet_amount'] > $postData['wallet_amount'] ? $userData['wallet_amount'] - $postData['wallet_amount'] : $postData['wallet_amount'] - $userData['wallet_amount'];
+            $transaction_type  = $userData['wallet_amount'] > $postData['wallet_amount'] ? 'Debited' : 'Credited';
+            $walletHistory = [
+                'user_id' => $user['id'],
+                'purpose' => $postData['reason'],
+                'amount' => $amount,
+                'transaction_type' => $transaction_type,
+            ];
+            
+            $walletHistory = WalletHistoryUsers::create($walletHistory);
+        }
+        $user->update($userUpdate);
+        $userData->update($userDataUpdate);
+        //$userDocs = UserDocuments::where('user_id', $id)->get()->toArray();
+        // foreach($userDocs as $userDoc){
+        //     $this->destroyUserDoc($userDoc['id']);
+        // }
+        
+        foreach($request['user-docs'] as $userDoc){
+            if($userDoc['doc']){
+                (new UserDocuments())->uploadFile($userDoc, $user);
+            }elseif($userDoc['doc_id']){
+                if($userDocument = UserDocuments::findOrFail($userDoc['doc_id'])){
+                    $userDocUpdate = [
+                        'user_id' => $user['id'],
+                        'doc_name' => $userDoc['doc_name'],
+                        'doc_number' => $userDoc['doc_number'],
+                        'doc_page' =>  $userDoc['doc_page'],
+                        'description' => isset($userDoc['description']) ? $userDoc['description'] : '',
+                        'verify' => isset($userDoc['verify']) ? $userDoc['verify'] : 0
+                    ];
+                    $userDocument->update($userDocUpdate);
+                }
+            }
+        }
+        
+        return Redirect::to(route('admin.customers'));
+        
+    }
+    public function admin_login(Request $request){
+        if (Auth::check()) {
+            return Redirect::to('admin/dashboard');
+        }else{
+            $request->validate([
+                'email' => 'required',
+                'password' => 'required',
+            ]);
+    
+            $credentials = $request->only('email', 'password');
+            //print_r($credentials ); exit;
+            if (Auth::attempt($credentials)) {
+                return Redirect::to('admin/dashboard');
+            }else{
+                echo 'test'; exit;
+            }
+        }
+  
+        
+    }
+    public function signup(){
+        
+    }
+    public function destroy($id)
+    {
+        User::destroy($id);
+        $userDocs = UserDocuments::where('user_id', $id)->get()->toArray();
+        foreach($userDocs as $userDoc){
+            $this->destroyUserDoc($userDoc['id']);
+        } 
+        $userData = UserData::where('user_id', $id)->first();
+        UserData::destroy($userData['id']);
+        $walletHistory = WalletHistoryUsers::where('user_id', $id)->get()->toArray();
+        foreach($walletHistory as $history){
+            WalletHistoryUsers::destroy($history['id']);
+        } 
+        return redirect('admin/customers')->with('flash_message', 'users  deleted!');
+    }
+    public function destroyUserDoc($id){
+        if(UserDocuments::destroy($id)){
+            return true;
+        }
+    }
+    /**
+     * Display the specified resource.
+     *
+     * @param  int  $id
+     *
+     * @return \Illuminate\View\View
+     */
+    public function show($id)
+    {
+        
+
+    }
+}

+ 33 - 0
app/Http/Controllers/Api/v1/CmsController.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Http\Controllers\Api\v1;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\Session;
+use Illuminate\Support\Facades\Redirect;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use App\Models\User;
+use App\Http\Controllers\AppController;
+use App\Models\ZapPage;
+use App\Models\ZapPageFormButtons;
+use App\Models\ZapPageFormFields;
+use App\Http\Resources\ZapPage as ZapPageResource;
+
+
+class CmsController extends AppController
+{
+    /**
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function get_zap_pages($slug){
+        $zapPage = ZapPage::where('slug', $slug)->first();
+        return new ZapPageResource($zapPage);
+    }
+}

+ 179 - 0
app/Http/Controllers/Api/v1/LoginController.php

@@ -0,0 +1,179 @@
+<?php
+
+namespace App\Http\Controllers\Api\v1;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+use App\Http\Controllers\AppController;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\Session;
+use Illuminate\Support\Facades\Redirect;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use App\Models\User;
+use App\Models\UserData;
+use App\Models\UserDocuments;
+use App\Http\Resources\User as UserResource;
+
+class LoginController extends AppController
+{
+    /**
+     * @param Request $request
+     * @return JsonResponse
+     */
+    public function register(Request $request){
+        try {
+            //Validated
+            $validate = Validator::make($request->all(), 
+            [
+                'user_name' => 'required',
+              //  'email' => 'required|email|unique:users,email',
+               // 'password' => 'required'
+            ]);
+
+            if($validate->fails()){
+                return response()->json([
+                    'status' => false,
+                    'message' => 'validation error',
+                    'errors' => $validate->errors()
+                ], 400);
+            }
+            $user = User::where('phone_number', '=', $request->user_name)->first();
+            if(empty($user)){
+                $user = User::where('email', '=', $request->user_name)->first();
+                if(empty($user)){
+                    $phoneNumber = NULL;
+                    $email = NULL;
+                    if(filter_var($request->user_name, FILTER_VALIDATE_EMAIL)) {
+                        $email = $request->user_name;
+                    } else {
+                        $phoneNumber = $request->user_name;
+                    }
+                    $user = User::create([
+                        'phone_number' => $phoneNumber,
+                        'email' => $email,
+
+                    ]);
+                }else{
+                    return response()->json([
+                        'status' => false,
+                        'message' => 'This Email already registered',
+                    ], 400);
+                }
+            }else{
+                return response()->json([
+                    'status' => false,
+                    'message' => 'This Phone Number already registered',
+                ], 400);
+            }
+
+            return response()->json([
+                'status' => true,
+                'message' => 'User Created Successfully',
+                'token' => $user->createToken($request->user_name)->plainTextToken
+            ], 200);
+
+        } catch (\Throwable $e) {
+            return response()->json([
+                'status' => false,
+                'message' => $e->getMessage()
+            ], 500);
+        }
+    }
+    /**
+     * Customer login
+     */
+    public function login(Request $request){
+        try {
+            $response =[];
+            $validate = Validator::make($request->all(), [
+                'user_name' => 'required',
+                'password' => 'required'
+            ]);
+            
+            if($validate->fails()){
+                return response()->json([
+                    'status' => false,
+                    'message' => 'Validation errors in your request',
+                    'errors' => $validate->errors()
+                ], 400);
+            }
+            $credentials = $request->only('user_name', 'password');
+            $user = User::where('email', $request->user_name)->first();
+            $credentials = ['email' => $request->user_name, 'password' => $request->password];
+            if(empty($user)){
+                $user = User::where('email', $request->user_name)->first();
+                $credentials = ['phone_number' => $request->user_name, 'password' => $request->password];
+            }
+            if (Auth::attempt($credentials)) {
+                $token = auth()->user()->createToken("Gozap-". $request->user_name, ['*'], now()->addHours(3) );
+                return response()->json([
+                    'status' => true,
+                    'message' => 'User Logged In Successfully',
+                    'token' => $token->plainTextToken,
+                    'expired_at' => $token->accessToken->expires_at
+                ], 200);
+            }else{
+                return response()->json([
+                    'status' => false,
+                    'message' => 'Email & Password does not match.',
+                ], 401);
+                
+            }
+        } catch (\Throwable $e) {
+            return response()->json([
+                'status' => false,
+                'message' => $e->getMessage()
+            ], 500);
+        }
+    }
+    public function user_details(Request $request){
+        $user = $request->user('api');
+        return response()->json([
+            'status' => true,
+            'message' => 'User Details',
+            'user' => new UserResource($user),
+        ], 200);
+    }
+    public function kyc(Request $request){
+        $postData = $request->all();
+        $user = $request->user('api');
+        if($userDoc['doc']){
+            (new UserDocuments())->uploadFile($postData, $user);
+        }
+    }
+    public function update_user(Request $request){
+        $postData = $request->all();
+        $user = $request->user('api');
+        $userUpdate = [
+            'name' => $postData['first_name'] .' ' . $postData['last_name'],
+            'email' => $postData['email'],
+            'phone_number' => $postData['phone_number'],
+            'user_type' => $postData['user_type']
+        ];
+        $user->update($userUpdate);
+        $userData = UserData::where('user_id', $user['id'])->first();
+        $userDataUpdate = [
+            'user_id' => $user['id'],
+            'first_name' => isset($postData['first_name']) ? $postData['first_name'] : '',
+            'last_name' => isset($postData['last_name']) ? $postData['last_name'] : '',
+            'user_country_code' => isset($postData['user_country_code']) ? $postData['user_country_code'] :  $this->siteSettings['country_code'],
+            'phone_number' => isset($postData['phone_number']) ? $postData['phone_number'] : '',
+            'wallet_amount' => ( isset($postData['wallet_amount']) && $postData['wallet_amount'] > 0) ? $postData['wallet_amount'] : 0
+        ];
+        if($userData){
+            $userData = $userData->update($userDataUpdate);
+        }else{
+            $userData = UserData::create($userDataUpdate);
+        }
+        return response()->json([
+            'status' => true,
+            'message' => 'User Updated Successfully',
+            'user' => new UserResource($user),
+        ], 200);
+    }
+}

+ 118 - 0
app/Http/Controllers/App/UserController.php

@@ -0,0 +1,118 @@
+<?php
+
+namespace App\Http\Controllers\App;
+
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Http\Request;
+use Hash;
+use Session;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Redirect;
+use App\Models\User;
+use App\Models\UserData;
+use App\Models\UserDocuments;
+use Illuminate\Support\Facades\Validator;
+
+class UserController extends BaseController
+{
+    public function loginForm(Request $request){
+        
+        
+    }
+    public function signup(Request $request){
+        $validate = Validator::make($request->all(), [
+            'email' => 'required|email',
+            'first_name' => 'required',
+            'last_name' => 'required',
+            'phone_number' => 'required',
+            'user_type' => 'required',
+            'gender' => 'required',
+        ]);
+        
+        if($validate->fails()){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => $validate->errors()
+            ], 400);
+        }
+        $postData = $request->all();
+        $userPhone = User::with(['UserData'])->whereRelation('user_data', 'phone_number', '=', $postData['phone_number'])->first();
+        if($userPhone){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => 'Phone number already exist'
+            ], 400);
+        }
+        $userEmail = User::with(['UserData'])->where('email', '=', $postData['email'])->first();
+        if($userEmail){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => 'Email already exist'
+            ], 400);
+        }
+        $user = [
+            'name' => $postData['first_name'] .' ' . $postData['last_name'],
+            'email' => $postData['email'],
+            'user_type' => 'Subscribers',
+            'password' => '123456'
+        ];
+        
+        $user = User::create($user);
+        
+        $userData = [
+            'user_id' => $user['id'],
+            'first_name' => $postData['first_name'],
+            'last_name' => $postData['last_name'],
+            'phone_number' => $postData['phone_number'],
+            'wallet_amount' => $postData['wallet_amount']
+        ];
+        $userData = UserData::create($userData);
+    }
+    
+    /**
+     * Customer login
+     */
+    public function login(Request $request){
+        try {
+            $response =[];
+            $validate = Validator::make($request->all(), [
+                'email' => 'required|email',
+                'password' => 'required'
+            ]);
+            
+            if($validate->fails()){
+                return response()->json([
+                    'status' => false,
+                    'message' => 'Validation errors in your request',
+                    'errors' => $validate->errors()
+                ], 400);
+            }
+            $credentials = $request->only('email', 'password');
+            if (!Auth::attempt($credentials)) {
+                return response()->json([
+                    'status' => false,
+                    'message' => 'Email & Password does not match.',
+                ], 401);
+            }else{
+                $user = User::where('email', $request->email)->first();
+                //print_r($user); exit;
+                return response()->json([
+                    'status' => true,
+                    'message' => 'User Logged In Successfully',
+                    'token' => $user->createToken("Gozap API Token")->plainTextToken
+                ], 200);
+            }
+        } catch (\Throwable $e) {
+            return response()->json([
+                'status' => false,
+                'message' => $e->getMessage()
+            ], 500);
+        }
+    }
+    public function customer_kyc(){
+
+    }
+}

+ 54 - 0
app/Http/Controllers/AppController.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\Session;
+use Illuminate\Support\Facades\Redirect;
+use Illuminate\Support\Facades\Auth;
+use App\Models\Settings;
+
+class AppController extends BaseController
+{
+    public $siteSettings ;
+    public function __construct()
+    {
+        $settings = Settings::get()->keyBy('key');
+        $siteSettings[] = $settings->map(function($settings, $key) {									
+            return $siteSettings[] = $settings->value;
+            });
+        $this->siteSettings = $siteSettings[0];
+    }
+    /*Language Translation*/
+    public function lang($locale)
+    {
+        if ($locale) {
+            App::setLocale($locale);
+            Session::put('lang', $locale);
+            Session::save();
+            return redirect()->back()->with('locale', $locale);
+        } else {
+            return redirect()->back();
+        }
+    }
+    public function dashboard(){
+        return view('admin.index');
+    }
+    public function admin(){
+        if (Auth::check()) {
+            return Redirect::to('admin/dashboard');
+        }else{
+            return Redirect::to('admin/login');
+        }
+    }
+    public function checkredirect(){
+        if (Auth::check()) {
+
+        }
+    }
+}

+ 45 - 0
app/Http/Controllers/CheckoutController.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\Session;
+use Illuminate\Support\Facades\Redirect;
+use Illuminate\Support\Facades\Auth;
+use App\models\Order;
+
+class CheckoutController extends BaseController
+{
+    public function index(){
+        return view('products');
+    }
+    public function add_to_cart(){
+        
+    }
+    public function checkout(){
+        if(Auth::user()){
+            if(Auth::user()->hasRole('Admin')){
+                return response()->json([
+                    'status' => false,
+                    'message' => 'Please logout our Admin panel',
+                ], 400);
+            }else{
+                
+            }
+
+        }else{
+            return response()->json([
+                'status' => false,
+                'message' => 'Please log in to your accout',
+            ], 400);
+        }
+   }
+   public function placeOrder(){
+        
+   }
+}

+ 13 - 0
app/Http/Controllers/Controller.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+
+class Controller extends BaseController
+{
+    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
+}

+ 45 - 0
app/Http/Controllers/ProfileController.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\Session;
+use Illuminate\Support\Facades\Redirect;
+use Illuminate\Support\Facades\Auth;
+
+class AppController extends BaseController
+{
+    
+    /*Language Translation*/
+    public function lang($locale)
+    {
+        if ($locale) {
+            App::setLocale($locale);
+            Session::put('lang', $locale);
+            Session::save();
+            return redirect()->back()->with('locale', $locale);
+        } else {
+            return redirect()->back();
+        }
+    }
+    public function dashboard(){
+        return view('admin.index');
+    }
+    public function admin(){
+        if (Auth::check()) {
+            return Redirect::to('admin/dashboard');
+        }else{
+            return Redirect::to('admin/login');
+        }
+    }
+    public function redirect(){
+        if (Auth::check()) {
+
+        }
+    }
+}

+ 68 - 0
app/Http/Kernel.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Http;
+
+use Illuminate\Foundation\Http\Kernel as HttpKernel;
+
+class Kernel extends HttpKernel
+{
+    /**
+     * The application's global HTTP middleware stack.
+     *
+     * These middleware are run during every request to your application.
+     *
+     * @var array<int, class-string|string>
+     */
+    protected $middleware = [
+        // \App\Http\Middleware\TrustHosts::class,
+        \App\Http\Middleware\TrustProxies::class,
+        \Illuminate\Http\Middleware\HandleCors::class,
+        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
+        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
+        \App\Http\Middleware\TrimStrings::class,
+        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+    ];
+
+    /**
+     * The application's route middleware groups.
+     *
+     * @var array<string, array<int, class-string|string>>
+     */
+    protected $middlewareGroups = [
+        'web' => [
+            \App\Http\Middleware\EncryptCookies::class,
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+            \Illuminate\Session\Middleware\StartSession::class,
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+            \App\Http\Middleware\VerifyCsrfToken::class,
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+
+        'api' => [
+            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
+            'throttle:api',
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+    ];
+
+    /**
+     * The application's route middleware.
+     *
+     * These middleware may be assigned to groups or used individually.
+     *
+     * @var array<string, class-string|string>
+     */
+    protected $routeMiddleware = [
+        'api' => \App\Http\Middleware\ApiAuthenticate::class,
+        'auth' => \App\Http\Middleware\Authenticate::class,
+        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
+        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
+        'can' => \Illuminate\Auth\Middleware\Authorize::class,
+        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
+        'signed' => \App\Http\Middleware\ValidateSignature::class,
+        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
+    ];
+}

+ 21 - 0
app/Http/Middleware/Authenticate.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Auth\Middleware\Authenticate as Middleware;
+
+class Authenticate extends Middleware
+{
+    /**
+     * Get the path the user should be redirected to when they are not authenticated.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return string|null
+     */
+    protected function redirectTo($request)
+    {
+        if (! $request->expectsJson()) {
+            return route('/');
+        }
+    }
+}

+ 17 - 0
app/Http/Middleware/EncryptCookies.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
+
+class EncryptCookies extends Middleware
+{
+    /**
+     * The names of the cookies that should not be encrypted.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        //
+    ];
+}

+ 17 - 0
app/Http/Middleware/PreventRequestsDuringMaintenance.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
+
+class PreventRequestsDuringMaintenance extends Middleware
+{
+    /**
+     * The URIs that should be reachable while maintenance mode is enabled.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        //
+    ];
+}

+ 32 - 0
app/Http/Middleware/RedirectIfAuthenticated.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Providers\RouteServiceProvider;
+use Closure;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class RedirectIfAuthenticated
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
+     * @param  string|null  ...$guards
+     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
+     */
+    public function handle(Request $request, Closure $next, ...$guards)
+    {
+        $guards = empty($guards) ? [null] : $guards;
+
+        foreach ($guards as $guard) {
+            if (Auth::guard($guard)->check()) {
+                return redirect(RouteServiceProvider::HOME);
+            }
+        }
+
+        return $next($request);
+    }
+}

+ 19 - 0
app/Http/Middleware/TrimStrings.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
+
+class TrimStrings extends Middleware
+{
+    /**
+     * The names of the attributes that should not be trimmed.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        'current_password',
+        'password',
+        'password_confirmation',
+    ];
+}

+ 20 - 0
app/Http/Middleware/TrustHosts.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Http\Middleware\TrustHosts as Middleware;
+
+class TrustHosts extends Middleware
+{
+    /**
+     * Get the host patterns that should be trusted.
+     *
+     * @return array<int, string|null>
+     */
+    public function hosts()
+    {
+        return [
+            $this->allSubdomainsOfApplicationUrl(),
+        ];
+    }
+}

+ 28 - 0
app/Http/Middleware/TrustProxies.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Http\Middleware\TrustProxies as Middleware;
+use Illuminate\Http\Request;
+
+class TrustProxies extends Middleware
+{
+    /**
+     * The trusted proxies for this application.
+     *
+     * @var array<int, string>|string|null
+     */
+    protected $proxies;
+
+    /**
+     * The headers that should be used to detect proxies.
+     *
+     * @var int
+     */
+    protected $headers =
+        Request::HEADER_X_FORWARDED_FOR |
+        Request::HEADER_X_FORWARDED_HOST |
+        Request::HEADER_X_FORWARDED_PORT |
+        Request::HEADER_X_FORWARDED_PROTO |
+        Request::HEADER_X_FORWARDED_AWS_ELB;
+}

+ 22 - 0
app/Http/Middleware/ValidateSignature.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Routing\Middleware\ValidateSignature as Middleware;
+
+class ValidateSignature extends Middleware
+{
+    /**
+     * The names of the query string parameters that should be ignored.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        // 'fbclid',
+        // 'utm_campaign',
+        // 'utm_content',
+        // 'utm_medium',
+        // 'utm_source',
+        // 'utm_term',
+    ];
+}

+ 17 - 0
app/Http/Middleware/VerifyCsrfToken.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
+
+class VerifyCsrfToken extends Middleware
+{
+    /**
+     * The URIs that should be excluded from CSRF verification.
+     *
+     * @var array<int, string>
+     */
+    protected $except = [
+        //
+    ];
+}

+ 27 - 0
app/Http/Resources/User.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\JsonResource;
+
+
+class User extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        return [
+            'name' => $this->name,
+            'email' => $this->email,
+            'phone_number' => $this->phone_number,
+            'user_type' => $this->user_type,
+            'email_verified_at' => $this->email_verified_at,
+            'userData' => $this->userData,
+        ];
+    }
+}

+ 32 - 0
app/Http/Resources/ZapPage.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\JsonResource;
+use App\Http\Resources\ZapPageFormFields;
+use App\Http\Resources\ZapPageFormButtons;
+
+
+class ZapPage extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        return [
+            'slug' => $this->slug,
+            'title' => $this->title,
+            'sub_title' => $this->sub_title,
+            'description' => $this->description,
+            'image' => $this->image,
+            'content' => $this->content,
+            'is_back_button' => $this->is_back_button,
+            'fields' => ZapPageFormFields::collection($this->zapPageFormFields),
+            'buttons' => ZapPageFormButtons::collection($this->zapPageFormButtons),
+        ];
+    }
+}

+ 19 - 0
app/Http/Resources/ZapPageCollection.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\ResourceCollection;
+
+class ZapPageCollection extends ResourceCollection
+{
+    /**
+     * Transform the resource collection into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        return ['status' => true, 'data' => parent::toArray($request)];
+    }
+}

+ 23 - 0
app/Http/Resources/ZapPageFormButtons.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ZapPageFormButtons extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        return [
+            'button_type' => $this->button_type,
+            'button_value' => $this->button_value,
+            'on_submit' => $this->on_submit           
+        ];
+    }
+}

+ 21 - 0
app/Http/Resources/ZapPageFormButtonsCollection.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\ResourceCollection;
+
+class ZapPageFormButtonsCollection extends ResourceCollection
+{
+    /**
+     * Transform the resource collection into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        return [
+            'data' => $this->collection,
+        ];
+    }
+}

+ 26 - 0
app/Http/Resources/ZapPageFormFields.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ZapPageFormFields extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        
+        return [
+            'type' => $this->type,
+            'title' => $this->title,
+            'name' => $this->name,
+            'place_holder' => $this->place_holder     
+
+        ];
+    }
+}

+ 21 - 0
app/Http/Resources/ZapPageFormFieldsCollection.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\ResourceCollection;
+
+class ZapPageFormFieldsCollection extends ResourceCollection
+{
+    /**
+     * Transform the resource collection into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        return [
+            'data' => $this->collection,
+        ];
+    }
+}

+ 71 - 0
app/Models/Asset.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Validator;
+
+class Asset extends Model
+{
+    use HasFactory;
+    
+    /**
+     * The database table used by the model.
+     *
+     * @var string
+     */
+    protected $table = 'assets';
+
+    /**
+    * The database primary key value.
+    *
+    * @var string
+    */
+    protected $primaryKey = 'id';
+
+    /**
+     * Attributes that should be mass-assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'vendor_id',
+        'category_id',
+        'name', 
+        'model_name', 
+        'model_number', 
+        'registered_number', 
+        'brand', 
+        'duration',  
+        'asset_type', 
+        'cost', 
+        'description', 
+        'image', 
+        'weight', 
+        'size', 
+        'return_policy', 
+        'status',
+        'meta_keyword',
+        'meta_description',
+        'created_by',
+    ];
+    public function validate($request){
+        $validate = Validator::make($request->all(), [
+            'name' => 'required',
+            'cost' => 'required',
+        ]);
+        if($validate->fails()){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => $validate->errors()
+            ], 400);
+        }
+        return response()->json([
+            'status' => true,
+            'message' => 'sucess',
+            'errors' => ''
+        ], 200);
+    }
+}

+ 106 - 0
app/Models/Order.php

@@ -0,0 +1,106 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Order extends Model
+{
+    use HasFactory;
+    
+    /**
+     * The database table used by the model.
+     *
+     * @var string
+     */
+    protected $table = 'orders';
+
+    /**
+    * The database primary key value.
+    *
+    * @var string
+    */
+    protected $primaryKey = 'id';
+
+    /**
+     * Attributes that should be mass-assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'order_number',
+        'user_id',
+        'angel_id', 
+        'is_subscription', 
+        'subscription_id', 
+        'ref_number', 
+        'customer_name', 
+        'customer_email',  
+        'customer_phone', 
+        'source_latitude', 
+        'source_longitude', 
+        'destination_latitude', 
+        'destination_longitude', 
+        'flat_no', 
+        'google_address', 
+        'address',
+        'landmark',
+        'state_name',
+        'city_name',
+        'source_postal_code',
+        'destination_postal_code',
+        'source_google_place_id',
+        'destination_google_place_id',
+        'location_name',
+        'user_type',
+        'order_type',
+        'vehicle_number',
+        'table_number',
+        'pickup_type',
+        'assoonas',
+        'contact_less_delivery',
+        'order_description',
+        'order_assign_datetime',
+        'delivery_date',
+        'time_to_pack',
+        'delivery_time_slot',
+        'delivered_time',
+        'offer_percentage',
+        'offer_amount',
+        'tax_percentage',
+        'tax_amount',
+        'delivery_charge',
+        'order_sub_total',
+        'order_grand_total',
+        'cardfee_percentage',
+        'cardfee_price',
+        'payment_status',
+        'payment_method',
+        'payment_method_id',
+        'referral_wallet_id',
+        'referral_used',
+        'payment_wallet',
+        'paid_full',
+        'split_payment',
+        'wallet_amount',
+        'transaction_id',
+        'distance',
+        'angel_invoice',
+        'angel_invoice_number',
+        'angel_deliver_date',
+        'angel_charge',
+        'angel_cash_in_hand_status',
+        'failed_reason',
+        'voucher_code',
+        'voucher_id',
+        'voucher_mode',
+        'voucher_percentage',
+        'voucher_amount',
+        'status',
+        'order_mode',
+        'accepted_by',
+        'ip',
+        'otp'
+    ];
+}

+ 35 - 0
app/Models/Settings.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Settings extends Model
+{
+    use HasFactory;
+    
+    /**
+     * The database table used by the model.
+     *
+     * @var string
+     */
+    protected $table = 'settings';
+
+    /**
+    * The database primary key value.
+    *
+    * @var string
+    */
+    protected $primaryKey = 'id';
+
+    /**
+     * Attributes that should be mass-assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'key',
+        'value',
+    ];
+}

+ 104 - 0
app/Models/User.php

@@ -0,0 +1,104 @@
+<?php
+
+namespace App\Models;
+
+// use Illuminate\Contracts\Auth\MustVerifyEmail;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Foundation\Auth\User as Authenticatable;
+use Illuminate\Notifications\Notifiable;
+use Laravel\Sanctum\HasApiTokens;
+use Itstructure\LaRbac\Interfaces\RbacUserInterface;
+use Itstructure\LaRbac\Traits\Administrable;
+use Illuminate\Support\Facades\Validator;
+
+class User extends Authenticatable implements RbacUserInterface
+{
+    use HasApiTokens, HasFactory, Notifiable, Administrable;
+
+    /**
+     * The attributes that are mass assignable.
+     *
+     * @var array<int, string>
+     */
+    protected $fillable = [
+        'name',
+        'email',
+        'password',
+        'user_type',
+        'phone_number',
+        'roles'
+    ];
+
+    /**
+     * The attributes that should be hidden for serialization.
+     *
+     * @var array<int, string>
+     */
+    protected $hidden = [
+        'password',
+        'remember_token',
+    ];
+
+    /**
+     * The attributes that should be cast.
+     *
+     * @var array<string, string>
+     */
+    protected $casts = [
+        'email_verified_at' => 'datetime',
+    ];
+    public function hasRole($hasRole)
+    {
+        foreach ($this->roles()->get() as $role) {
+            if($role->name == $hasRole){
+                return true;
+            }else{
+                return false;
+            }
+        }
+    }
+    public function userData(){
+        return $this->hasOne('App\Models\UserData', 'user_id');
+    }
+    public function userDocuments(){
+        return $this->hasMany('App\Models\UserDocuments', 'user_id');
+    }
+    public function signupValidate($request){
+        $validate = Validator::make($request->all(), [
+            'email' => 'required|email',
+            'first_name' => 'required',
+            'last_name' => 'required',
+            'phone_number' => 'required',
+            'user_type' => 'required',
+        ]);
+        if($validate->fails()){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => $validate->errors()
+            ], 400);
+        }
+        $postData = $request->all();
+        $userPhone = User::with(['UserData'])->whereRelation('UserData', 'phone_number', '=', $postData['phone_number'])->first();
+        if($userPhone){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => 'Phone number already exist'
+            ], 400);
+        }
+        $userEmail = User::with(['UserData'])->where('email', '=', $postData['email'])->first();
+        if($userEmail){
+            return response()->json([
+                'status' => false,
+                'message' => 'Validation errors in your request',
+                'errors' => 'Email already exist'
+            ], 400);
+        }
+        return response()->json([
+            'status' => true,
+            'message' => 'sucess',
+            'errors' => ''
+        ], 200);
+    }
+}

+ 19 - 0
app/Models/UserCorporate.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class UserCorporate extends Model
+{
+    use HasFactory;
+    
+    protected $fillable = [
+        'user_id',
+        'employee_id',
+        'business_name',
+        'business_model',
+        'business_for',
+    ];
+}

+ 28 - 0
app/Models/UserData.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class UserData extends Model
+{
+    use HasFactory;
+     /**
+     * The attributes that are mass assignable.
+     *
+     * @var array<int, string>
+     */
+    protected $fillable = [
+        'user_id',
+        'first_name',
+        'last_name',
+        'phone_number',
+        'user_country_code',
+        'device_type',
+        'device_id',
+        'designation',
+        'wallet_amount'
+    ];
+    
+}

+ 53 - 0
app/Models/UserDocuments.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Auth;
+
+class UserDocuments extends Model
+{
+    use HasFactory;
+     /**
+     * The attributes that are mass assignable.
+     *
+     * @var array<int, string>
+     */
+    protected $fillable = [
+        'user_id',
+        'doc_name',
+        'doc_number',
+        'doc_page',
+        'description',
+        'path',
+        'uploaded_name',
+        'saved_as',
+        'status',
+        'created_by'
+    ];
+
+    
+    public function uploadFile($userDoc, $user, $postData = []){
+        ini_set('memory_limit', '1024M');
+        ini_set('max_execution_time', 180); //3 minutes
+        
+        $file = $userDoc['doc'];
+        $savedAs = $user['id'] . '_'.$userDoc['doc_name'].'_'.$userDoc['doc_page'].'.'.$file->extension();
+        $filePath = $file->storeAs('uploads', $savedAs, 'public');
+        $userDocs = [
+            'user_id' => $user['id'],
+            'doc_name' => $userDoc['doc_name'],
+            'doc_number' => $userDoc['doc_number'],
+            'doc_page' =>  $userDoc['doc_page'],
+            'description' => isset($userDoc['description']) ? $userDoc['description'] : '',
+            'path' => '/'.$filePath,
+            'uploaded_name' => $file->getClientOriginalName(),
+            'saved_as' => $savedAs,
+            'verify' => isset($userDoc['verify']) ? $userDoc['verify'] : 0,
+            'created_by' => Auth::id(),
+        ];
+        $userDocs = self::create($userDocs);
+        return $userDocs;
+    }
+}

+ 26 - 0
app/Models/UserLocation.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class UserLocation extends Model
+{
+    use HasFactory;
+
+    protected $fillable = [
+        'user_id',
+        'name',
+        'address',
+        'street',
+        'city',
+        'state',
+        'postal_code',
+        'country',
+        'sourcelatitude',
+        'sourcelongitude',
+        'google_place_id'
+
+    ];
+}

+ 27 - 0
app/Models/WalletHistoryUsers.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class WalletHistoryUsers extends Model
+{
+    use HasFactory;
+    /**
+     * The attributes that are mass assignable.
+     *
+     * @var array<int, string>
+     */
+    protected $fillable = [
+        'user_id',
+        'purpose',
+        'transaction_type',
+        'transaction_id',
+        'transaction_details',
+        'amount',
+        'status',
+        'paid_date'
+    ];
+
+}

+ 49 - 0
app/Models/ZapPage.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class ZapPage extends Model
+{
+    use HasFactory;
+
+    
+    /**
+     * The database table used by the model.
+     *
+     * @var string
+     */
+    protected $table = 'zap_pages';
+
+    /**
+    * The database primary key value.
+    *
+    * @var string
+    */
+    protected $primaryKey = 'id';
+
+    /**
+     * Attributes that should be mass-assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'slug',
+        'name',
+        'title', 
+        'sub_title', 
+        'description', 
+        'content', 
+        'is_back_button', 
+        'created_by',
+    ];
+    
+    public function zapPageFormButtons(){
+        return $this->hasMany('App\Models\ZapPageFormButtons', 'zap_page_id');
+    }
+    public function zapPageFormFields(){
+        return $this->hasMany('App\Models\ZapPageFormFields', 'zap_page_id');
+    }
+}

+ 37 - 0
app/Models/ZapPageFormButtons.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class ZapPageFormButtons extends Model
+{
+    use HasFactory;
+    
+    /**
+     * The database table used by the model.
+     *
+     * @var string
+     */
+    protected $table = 'zap_page_form_buttons';
+
+    /**
+    * The database primary key value.
+    *
+    * @var string
+    */
+    protected $primaryKey = 'id';
+
+    /**
+     * Attributes that should be mass-assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'zap_page_id',
+        'button_type',
+        'button_value', 
+        'on_submit', 
+    ];
+}

+ 38 - 0
app/Models/ZapPageFormFields.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class ZapPageFormFields extends Model
+{
+    use HasFactory;
+
+    /**
+     * The database table used by the model.
+     *
+     * @var string
+     */
+    protected $table = 'zap_page_form_fields';
+
+    /**
+    * The database primary key value.
+    *
+    * @var string
+    */
+    protected $primaryKey = 'id';
+
+    /**
+     * Attributes that should be mass-assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'zap_page_id',
+        'type',
+        'title', 
+        'name', 
+        'place_holder', 
+    ];
+}

+ 28 - 0
app/Providers/AppServiceProvider.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\ServiceProvider;
+
+class AppServiceProvider extends ServiceProvider
+{
+    /**
+     * Register any application services.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        //
+    }
+
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        //
+    }
+}

+ 30 - 0
app/Providers/AuthServiceProvider.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Providers;
+
+// use Illuminate\Support\Facades\Gate;
+use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
+
+class AuthServiceProvider extends ServiceProvider
+{
+    /**
+     * The model to policy mappings for the application.
+     *
+     * @var array<class-string, class-string>
+     */
+    protected $policies = [
+        // 'App\Models\Model' => 'App\Policies\ModelPolicy',
+    ];
+
+    /**
+     * Register any authentication / authorization services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        $this->registerPolicies();
+
+        //
+    }
+}

+ 21 - 0
app/Providers/BroadcastServiceProvider.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Broadcast;
+use Illuminate\Support\ServiceProvider;
+
+class BroadcastServiceProvider extends ServiceProvider
+{
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        Broadcast::routes();
+
+        require base_path('routes/channels.php');
+    }
+}

+ 42 - 0
app/Providers/EventServiceProvider.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Auth\Events\Registered;
+use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
+use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
+use Illuminate\Support\Facades\Event;
+
+class EventServiceProvider extends ServiceProvider
+{
+    /**
+     * The event to listener mappings for the application.
+     *
+     * @var array<class-string, array<int, class-string>>
+     */
+    protected $listen = [
+        Registered::class => [
+            SendEmailVerificationNotification::class,
+        ],
+    ];
+
+    /**
+     * Register any events for your application.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        //
+    }
+
+    /**
+     * Determine if events and listeners should be automatically discovered.
+     *
+     * @return bool
+     */
+    public function shouldDiscoverEvents()
+    {
+        return false;
+    }
+}

+ 52 - 0
app/Providers/RouteServiceProvider.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Cache\RateLimiting\Limit;
+use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\RateLimiter;
+use Illuminate\Support\Facades\Route;
+
+class RouteServiceProvider extends ServiceProvider
+{
+    /**
+     * The path to the "home" route for your application.
+     *
+     * Typically, users are redirected here after authentication.
+     *
+     * @var string
+     */
+    public const HOME = '/home';
+
+    /**
+     * Define your route model bindings, pattern filters, and other route configuration.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        $this->configureRateLimiting();
+
+        $this->routes(function () {
+            Route::middleware('api')
+                ->prefix('v1')
+                ->group(base_path('routes/api.php'));
+
+            Route::middleware('web')
+                ->group(base_path('routes/web.php'));
+        });
+    }
+
+    /**
+     * Configure the rate limiters for the application.
+     *
+     * @return void
+     */
+    protected function configureRateLimiting()
+    {
+        RateLimiter::for('api', function (Request $request) {
+            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
+        });
+    }
+}

+ 53 - 0
artisan

@@ -0,0 +1,53 @@
+#!/usr/bin/env php
+<?php
+
+define('LARAVEL_START', microtime(true));
+
+/*
+|--------------------------------------------------------------------------
+| Register The Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader
+| for our application. We just need to utilize it! We'll require it
+| into the script here so that we do not have to worry about the
+| loading of any of our classes manually. It's great to relax.
+|
+*/
+
+require __DIR__.'/vendor/autoload.php';
+
+$app = require_once __DIR__.'/bootstrap/app.php';
+
+/*
+|--------------------------------------------------------------------------
+| Run The Artisan Application
+|--------------------------------------------------------------------------
+|
+| When we run the console application, the current CLI command will be
+| executed in this console and the response sent back to a terminal
+| or another output device for the developers. Here goes nothing!
+|
+*/
+
+$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
+
+$status = $kernel->handle(
+    $input = new Symfony\Component\Console\Input\ArgvInput,
+    new Symfony\Component\Console\Output\ConsoleOutput
+);
+
+/*
+|--------------------------------------------------------------------------
+| Shutdown The Application
+|--------------------------------------------------------------------------
+|
+| Once Artisan has finished running, we will fire off the shutdown events
+| so that any final work may be done by the application before we shut
+| down the process. This is the last thing to happen to the request.
+|
+*/
+
+$kernel->terminate($input, $status);
+
+exit($status);

+ 55 - 0
bootstrap/app.php

@@ -0,0 +1,55 @@
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Create The Application
+|--------------------------------------------------------------------------
+|
+| The first thing we will do is create a new Laravel application instance
+| which serves as the "glue" for all the components of Laravel, and is
+| the IoC container for the system binding all of the various parts.
+|
+*/
+
+$app = new Illuminate\Foundation\Application(
+    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
+);
+
+/*
+|--------------------------------------------------------------------------
+| Bind Important Interfaces
+|--------------------------------------------------------------------------
+|
+| Next, we need to bind some important interfaces into the container so
+| we will be able to resolve them when needed. The kernels serve the
+| incoming requests to this application from both the web and CLI.
+|
+*/
+
+$app->singleton(
+    Illuminate\Contracts\Http\Kernel::class,
+    App\Http\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Console\Kernel::class,
+    App\Console\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Debug\ExceptionHandler::class,
+    App\Exceptions\Handler::class
+);
+
+/*
+|--------------------------------------------------------------------------
+| Return The Application
+|--------------------------------------------------------------------------
+|
+| This script returns the application instance. The instance is given to
+| the calling script so we can separate the building of the instances
+| from the actual running of the application and sending responses.
+|
+*/
+
+return $app;

+ 2 - 0
bootstrap/cache/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 66 - 0
composer.json

@@ -0,0 +1,66 @@
+{
+    "name": "laravel/laravel",
+    "type": "project",
+    "description": "The Laravel Framework.",
+    "keywords": ["framework", "laravel"],
+    "license": "MIT",
+    "require": {
+        "php": "^8.0.2",
+        "guzzlehttp/guzzle": "^7.2",
+        "laravel/framework": "^9.19",
+        "laravel/sanctum": "^3.0",
+        "laravel/tinker": "^2.7",
+        "itstructure/laravel-rbac": "~3.0.7"
+    },
+    "require-dev": {
+        "fakerphp/faker": "^1.9.1",
+        "laravel/pint": "^1.0",
+        "laravel/sail": "^1.0.1",
+        "mockery/mockery": "^1.4.4",
+        "nunomaduro/collision": "^6.1",
+        "phpunit/phpunit": "^9.5.10",
+        "spatie/laravel-ignition": "^1.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "App\\": "app/",
+            "Database\\Factories\\": "database/factories/",
+            "Database\\Seeders\\": "database/seeders/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Tests\\": "tests/"
+        }
+    },
+    "scripts": {
+        "post-autoload-dump": [
+            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
+            "@php artisan package:discover --ansi"
+        ],
+        "post-update-cmd": [
+            "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
+        ],
+        "post-root-package-install": [
+            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+        ],
+        "post-create-project-cmd": [
+            "@php artisan key:generate --ansi"
+        ]
+    },
+    "extra": {
+        "laravel": {
+            "dont-discover": []
+        }
+    },
+    "config": {
+        "optimize-autoloader": true,
+        "preferred-install": "dist",
+        "sort-packages": true,
+        "allow-plugins": {
+            "pestphp/pest-plugin": true
+        }
+    },
+    "minimum-stability": "stable",
+    "prefer-stable": true
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 7878 - 0
composer.lock


+ 216 - 0
config/app.php

@@ -0,0 +1,216 @@
+<?php
+
+use Illuminate\Support\Facades\Facade;
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Name
+    |--------------------------------------------------------------------------
+    |
+    | This value is the name of your application. This value is used when the
+    | framework needs to place the application's name in a notification or
+    | any other location as required by the application or its packages.
+    |
+    */
+
+    'name' => env('APP_NAME', 'Laravel'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Environment
+    |--------------------------------------------------------------------------
+    |
+    | This value determines the "environment" your application is currently
+    | running in. This may determine how you prefer to configure various
+    | services the application utilizes. Set this in your ".env" file.
+    |
+    */
+
+    'env' => env('APP_ENV', 'production'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Debug Mode
+    |--------------------------------------------------------------------------
+    |
+    | When your application is in debug mode, detailed error messages with
+    | stack traces will be shown on every error that occurs within your
+    | application. If disabled, a simple generic error page is shown.
+    |
+    */
+
+    'debug' => (bool) env('APP_DEBUG', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application URL
+    |--------------------------------------------------------------------------
+    |
+    | This URL is used by the console to properly generate URLs when using
+    | the Artisan command line tool. You should set this to the root of
+    | your application so that it is used when running Artisan tasks.
+    |
+    */
+
+    'url' => env('APP_URL', 'http://app.loc'),
+
+    'asset_url' => env('ASSET_URL'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Timezone
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default timezone for your application, which
+    | will be used by the PHP date and date-time functions. We have gone
+    | ahead and set this to a sensible default for you out of the box.
+    |
+    */
+
+    'timezone' => 'UTC',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Locale Configuration
+    |--------------------------------------------------------------------------
+    |
+    | The application locale determines the default locale that will be used
+    | by the translation service provider. You are free to set this value
+    | to any of the locales which will be supported by the application.
+    |
+    */
+
+    'locale' => 'en',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Fallback Locale
+    |--------------------------------------------------------------------------
+    |
+    | The fallback locale determines the locale to use when the current one
+    | is not available. You may change the value to correspond to any of
+    | the language folders that are provided through your application.
+    |
+    */
+
+    'fallback_locale' => 'en',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Faker Locale
+    |--------------------------------------------------------------------------
+    |
+    | This locale will be used by the Faker PHP library when generating fake
+    | data for your database seeds. For example, this will be used to get
+    | localized telephone numbers, street address information and more.
+    |
+    */
+
+    'faker_locale' => 'en_US',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Encryption Key
+    |--------------------------------------------------------------------------
+    |
+    | This key is used by the Illuminate encrypter service and should be set
+    | to a random, 32 character string, otherwise these encrypted strings
+    | will not be safe. Please do this before deploying an application!
+    |
+    */
+
+    'key' => env('APP_KEY'),
+
+    'cipher' => 'AES-256-CBC',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Maintenance Mode Driver
+    |--------------------------------------------------------------------------
+    |
+    | These configuration options determine the driver used to determine and
+    | manage Laravel's "maintenance mode" status. The "cache" driver will
+    | allow maintenance mode to be controlled across multiple machines.
+    |
+    | Supported drivers: "file", "cache"
+    |
+    */
+
+    'maintenance' => [
+        'driver' => 'file',
+        // 'store'  => 'redis',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Autoloaded Service Providers
+    |--------------------------------------------------------------------------
+    |
+    | The service providers listed here will be automatically loaded on the
+    | request to your application. Feel free to add your own services to
+    | this array to grant expanded functionality to your applications.
+    |
+    */
+
+    'providers' => [
+
+        /*
+         * Laravel Framework Service Providers...
+         */
+        Illuminate\Auth\AuthServiceProvider::class,
+        Illuminate\Broadcasting\BroadcastServiceProvider::class,
+        Illuminate\Bus\BusServiceProvider::class,
+        Illuminate\Cache\CacheServiceProvider::class,
+        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
+        Illuminate\Cookie\CookieServiceProvider::class,
+        Illuminate\Database\DatabaseServiceProvider::class,
+        Illuminate\Encryption\EncryptionServiceProvider::class,
+        Illuminate\Filesystem\FilesystemServiceProvider::class,
+        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
+        Illuminate\Hashing\HashServiceProvider::class,
+        Illuminate\Mail\MailServiceProvider::class,
+        Illuminate\Notifications\NotificationServiceProvider::class,
+        Illuminate\Pagination\PaginationServiceProvider::class,
+        Illuminate\Pipeline\PipelineServiceProvider::class,
+        Illuminate\Queue\QueueServiceProvider::class,
+        Illuminate\Redis\RedisServiceProvider::class,
+        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
+        Illuminate\Session\SessionServiceProvider::class,
+        Illuminate\Translation\TranslationServiceProvider::class,
+        Illuminate\Validation\ValidationServiceProvider::class,
+        Illuminate\View\ViewServiceProvider::class,
+
+        /*
+         * Package Service Providers...
+         */
+
+        /*
+         * Application Service Providers...
+         */
+        App\Providers\AppServiceProvider::class,
+        App\Providers\AuthServiceProvider::class,
+        // App\Providers\BroadcastServiceProvider::class,
+        App\Providers\EventServiceProvider::class,
+        App\Providers\RouteServiceProvider::class,
+        Itstructure\LaRbac\RbacServiceProvider::class,
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Class Aliases
+    |--------------------------------------------------------------------------
+    |
+    | This array of class aliases will be registered when this application
+    | is started. However, feel free to register as many as you wish as
+    | the aliases are "lazy" loaded so they don't hinder performance.
+    |
+    */
+
+    'aliases' => Facade::defaultAliases()->merge([
+        // 'ExampleClass' => App\Example\ExampleClass::class,
+    ])->toArray(),
+
+];

+ 115 - 0
config/auth.php

@@ -0,0 +1,115 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Defaults
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default authentication "guard" and password
+    | reset options for your application. You may change these defaults
+    | as required, but they're a perfect start for most applications.
+    |
+    */
+
+    'defaults' => [
+        'guard' => 'web',
+        'passwords' => 'users',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Guards
+    |--------------------------------------------------------------------------
+    |
+    | Next, you may define every authentication guard for your application.
+    | Of course, a great default configuration has been defined for you
+    | here which uses session storage and the Eloquent user provider.
+    |
+    | All authentication drivers have a user provider. This defines how the
+    | users are actually retrieved out of your database or other storage
+    | mechanisms used by this application to persist your user's data.
+    |
+    | Supported: "session"
+    |
+    */
+
+    'guards' => [
+        'web' => [
+            'driver' => 'session',
+            'provider' => 'users',
+        ],
+        'api' => [
+            'driver' => 'sanctum',
+            'provider' => 'users',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | User Providers
+    |--------------------------------------------------------------------------
+    |
+    | All authentication drivers have a user provider. This defines how the
+    | users are actually retrieved out of your database or other storage
+    | mechanisms used by this application to persist your user's data.
+    |
+    | If you have multiple user tables or models you may configure multiple
+    | sources which represent each model / table. These sources may then
+    | be assigned to any extra authentication guards you have defined.
+    |
+    | Supported: "database", "eloquent"
+    |
+    */
+
+    'providers' => [
+        'users' => [
+            'driver' => 'eloquent',
+            'model' => App\Models\User::class,
+        ],
+
+        // 'users' => [
+        //     'driver' => 'database',
+        //     'table' => 'users',
+        // ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Resetting Passwords
+    |--------------------------------------------------------------------------
+    |
+    | You may specify multiple password reset configurations if you have more
+    | than one user table or model in the application and you want to have
+    | separate password reset settings based on the specific user types.
+    |
+    | The expire time is the number of minutes that each reset token will be
+    | considered valid. This security feature keeps tokens short-lived so
+    | they have less time to be guessed. You may change this as needed.
+    |
+    */
+
+    'passwords' => [
+        'users' => [
+            'provider' => 'users',
+            'table' => 'password_resets',
+            'expire' => 60,
+            'throttle' => 60,
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Password Confirmation Timeout
+    |--------------------------------------------------------------------------
+    |
+    | Here you may define the amount of seconds before a password confirmation
+    | times out and the user is prompted to re-enter their password via the
+    | confirmation screen. By default, the timeout lasts for three hours.
+    |
+    */
+
+    'password_timeout' => 10800,
+
+];

+ 70 - 0
config/broadcasting.php

@@ -0,0 +1,70 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Broadcaster
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default broadcaster that will be used by the
+    | framework when an event needs to be broadcast. You may set this to
+    | any of the connections defined in the "connections" array below.
+    |
+    | Supported: "pusher", "ably", "redis", "log", "null"
+    |
+    */
+
+    'default' => env('BROADCAST_DRIVER', 'null'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Broadcast Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here you may define all of the broadcast connections that will be used
+    | to broadcast events to other systems or over websockets. Samples of
+    | each available type of connection are provided inside this array.
+    |
+    */
+
+    'connections' => [
+
+        'pusher' => [
+            'driver' => 'pusher',
+            'key' => env('PUSHER_APP_KEY'),
+            'secret' => env('PUSHER_APP_SECRET'),
+            'app_id' => env('PUSHER_APP_ID'),
+            'options' => [
+                'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
+                'port' => env('PUSHER_PORT', 443),
+                'scheme' => env('PUSHER_SCHEME', 'https'),
+                'encrypted' => true,
+                'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
+            ],
+            'client_options' => [
+                // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
+            ],
+        ],
+
+        'ably' => [
+            'driver' => 'ably',
+            'key' => env('ABLY_KEY'),
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+        ],
+
+        'log' => [
+            'driver' => 'log',
+        ],
+
+        'null' => [
+            'driver' => 'null',
+        ],
+
+    ],
+
+];

+ 110 - 0
config/cache.php

@@ -0,0 +1,110 @@
+<?php
+
+use Illuminate\Support\Str;
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Cache Store
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default cache connection that gets used while
+    | using this caching library. This connection is used when another is
+    | not explicitly specified when executing a given caching function.
+    |
+    */
+
+    'default' => env('CACHE_DRIVER', 'file'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Cache Stores
+    |--------------------------------------------------------------------------
+    |
+    | Here you may define all of the cache "stores" for your application as
+    | well as their drivers. You may even define multiple stores for the
+    | same cache driver to group types of items stored in your caches.
+    |
+    | Supported drivers: "apc", "array", "database", "file",
+    |         "memcached", "redis", "dynamodb", "octane", "null"
+    |
+    */
+
+    'stores' => [
+
+        'apc' => [
+            'driver' => 'apc',
+        ],
+
+        'array' => [
+            'driver' => 'array',
+            'serialize' => false,
+        ],
+
+        'database' => [
+            'driver' => 'database',
+            'table' => 'cache',
+            'connection' => null,
+            'lock_connection' => null,
+        ],
+
+        'file' => [
+            'driver' => 'file',
+            'path' => storage_path('framework/cache/data'),
+        ],
+
+        'memcached' => [
+            'driver' => 'memcached',
+            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
+            'sasl' => [
+                env('MEMCACHED_USERNAME'),
+                env('MEMCACHED_PASSWORD'),
+            ],
+            'options' => [
+                // Memcached::OPT_CONNECT_TIMEOUT => 2000,
+            ],
+            'servers' => [
+                [
+                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
+                    'port' => env('MEMCACHED_PORT', 11211),
+                    'weight' => 100,
+                ],
+            ],
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'cache',
+            'lock_connection' => 'default',
+        ],
+
+        'dynamodb' => [
+            'driver' => 'dynamodb',
+            'key' => env('AWS_ACCESS_KEY_ID'),
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
+            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+            'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
+            'endpoint' => env('DYNAMODB_ENDPOINT'),
+        ],
+
+        'octane' => [
+            'driver' => 'octane',
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Cache Key Prefix
+    |--------------------------------------------------------------------------
+    |
+    | When utilizing the APC, database, memcached, Redis, or DynamoDB cache
+    | stores there might be other applications using the same cache. For
+    | that reason, you may prefix every cache key to avoid collisions.
+    |
+    */
+
+    'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),
+
+];

+ 34 - 0
config/cors.php

@@ -0,0 +1,34 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Cross-Origin Resource Sharing (CORS) Configuration
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure your settings for cross-origin resource sharing
+    | or "CORS". This determines what cross-origin operations may execute
+    | in web browsers. You are free to adjust these settings as needed.
+    |
+    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
+    |
+    */
+
+    'paths' => ['api/*', 'sanctum/csrf-cookie'],
+
+    'allowed_methods' => ['*'],
+
+    'allowed_origins' => ['*'],
+
+    'allowed_origins_patterns' => [],
+
+    'allowed_headers' => ['*'],
+
+    'exposed_headers' => [],
+
+    'max_age' => 0,
+
+    'supports_credentials' => false,
+
+];

+ 151 - 0
config/database.php

@@ -0,0 +1,151 @@
+<?php
+
+use Illuminate\Support\Str;
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Database Connection Name
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify which of the database connections below you wish
+    | to use as your default connection for all database work. Of course
+    | you may use many connections at once using the Database library.
+    |
+    */
+
+    'default' => env('DB_CONNECTION', 'mysql'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Database Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here are each of the database connections setup for your application.
+    | Of course, examples of configuring each database platform that is
+    | supported by Laravel is shown below to make development simple.
+    |
+    |
+    | All database work in Laravel is done through the PHP PDO facilities
+    | so make sure you have the driver for your particular database of
+    | choice installed on your machine before you begin development.
+    |
+    */
+
+    'connections' => [
+
+        'sqlite' => [
+            'driver' => 'sqlite',
+            'url' => env('DATABASE_URL'),
+            'database' => env('DB_DATABASE', database_path('database.sqlite')),
+            'prefix' => '',
+            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
+        ],
+
+        'mysql' => [
+            'driver' => 'mysql',
+            'url' => env('DATABASE_URL'),
+            'host' => env('DB_HOST', '127.0.0.1'),
+            'port' => env('DB_PORT', '3306'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'unix_socket' => env('DB_SOCKET', ''),
+            'charset' => 'utf8mb4',
+            'collation' => 'utf8mb4_unicode_ci',
+            'prefix' => '',
+            'prefix_indexes' => true,
+            'strict' => true,
+            'engine' => null,
+            'options' => extension_loaded('pdo_mysql') ? array_filter([
+                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+            ]) : [],
+        ],
+
+        'pgsql' => [
+            'driver' => 'pgsql',
+            'url' => env('DATABASE_URL'),
+            'host' => env('DB_HOST', '127.0.0.1'),
+            'port' => env('DB_PORT', '5432'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'charset' => 'utf8',
+            'prefix' => '',
+            'prefix_indexes' => true,
+            'search_path' => 'public',
+            'sslmode' => 'prefer',
+        ],
+
+        'sqlsrv' => [
+            'driver' => 'sqlsrv',
+            'url' => env('DATABASE_URL'),
+            'host' => env('DB_HOST', 'localhost'),
+            'port' => env('DB_PORT', '1433'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'charset' => 'utf8',
+            'prefix' => '',
+            'prefix_indexes' => true,
+            // 'encrypt' => env('DB_ENCRYPT', 'yes'),
+            // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Migration Repository Table
+    |--------------------------------------------------------------------------
+    |
+    | This table keeps track of all the migrations that have already run for
+    | your application. Using this information, we can determine which of
+    | the migrations on disk haven't actually been run in the database.
+    |
+    */
+
+    'migrations' => 'migrations',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Redis Databases
+    |--------------------------------------------------------------------------
+    |
+    | Redis is an open source, fast, and advanced key-value store that also
+    | provides a richer body of commands than a typical key-value system
+    | such as APC or Memcached. Laravel makes it easy to dig right in.
+    |
+    */
+
+    'redis' => [
+
+        'client' => env('REDIS_CLIENT', 'phpredis'),
+
+        'options' => [
+            'cluster' => env('REDIS_CLUSTER', 'redis'),
+            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
+        ],
+
+        'default' => [
+            'url' => env('REDIS_URL'),
+            'host' => env('REDIS_HOST', '127.0.0.1'),
+            'username' => env('REDIS_USERNAME'),
+            'password' => env('REDIS_PASSWORD'),
+            'port' => env('REDIS_PORT', '6379'),
+            'database' => env('REDIS_DB', '0'),
+        ],
+
+        'cache' => [
+            'url' => env('REDIS_URL'),
+            'host' => env('REDIS_HOST', '127.0.0.1'),
+            'username' => env('REDIS_USERNAME'),
+            'password' => env('REDIS_PASSWORD'),
+            'port' => env('REDIS_PORT', '6379'),
+            'database' => env('REDIS_CACHE_DB', '1'),
+        ],
+
+    ],
+
+];

+ 77 - 0
config/filesystems.php

@@ -0,0 +1,77 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Filesystem Disk
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default filesystem disk that should be used
+    | by the framework. The "local" disk, as well as a variety of cloud
+    | based disks are available to your application. Just store away!
+    |
+    */
+
+    'default' => env('FILESYSTEM_DISK', 'local'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Filesystem Disks
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure as many filesystem "disks" as you wish, and you
+    | may even configure multiple disks of the same driver. Defaults have
+    | been set up for each driver as an example of the required values.
+    |
+    | Supported Drivers: "local", "ftp", "sftp", "s3"
+    |
+    */
+
+    'disks' => [
+
+        'local' => [
+            'driver' => 'local',
+            'root' => storage_path('app'),
+            'throw' => false,
+        ],
+
+        'public' => [
+            'driver' => 'local',
+            //'root' => storage_path('app/public'),
+            'root' => public_path(),
+            'url' => env('APP_URL').'/uploads',
+            'visibility' => 'public',
+            'throw' => false,
+        ],
+
+        's3' => [
+            'driver' => 's3',
+            'key' => env('AWS_ACCESS_KEY_ID'),
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
+            'region' => env('AWS_DEFAULT_REGION'),
+            'bucket' => env('AWS_BUCKET'),
+            'url' => env('AWS_URL'),
+            'endpoint' => env('AWS_ENDPOINT'),
+            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
+            'throw' => false,
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Symbolic Links
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure the symbolic links that will be created when the
+    | `storage:link` Artisan command is executed. The array keys should be
+    | the locations of the links and the values should be their targets.
+    |
+    */
+
+    'links' => [
+        public_path('storage') => storage_path('app/public'),
+    ],
+
+];

+ 52 - 0
config/hashing.php

@@ -0,0 +1,52 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Hash Driver
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default hash driver that will be used to hash
+    | passwords for your application. By default, the bcrypt algorithm is
+    | used; however, you remain free to modify this option if you wish.
+    |
+    | Supported: "bcrypt", "argon", "argon2id"
+    |
+    */
+
+    'driver' => 'bcrypt',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Bcrypt Options
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the configuration options that should be used when
+    | passwords are hashed using the Bcrypt algorithm. This will allow you
+    | to control the amount of time it takes to hash the given password.
+    |
+    */
+
+    'bcrypt' => [
+        'rounds' => env('BCRYPT_ROUNDS', 10),
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Argon Options
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the configuration options that should be used when
+    | passwords are hashed using the Argon algorithm. These will allow you
+    | to control the amount of time it takes to hash the given password.
+    |
+    */
+
+    'argon' => [
+        'memory' => 65536,
+        'threads' => 1,
+        'time' => 4,
+    ],
+
+];

+ 122 - 0
config/logging.php

@@ -0,0 +1,122 @@
+<?php
+
+use Monolog\Handler\NullHandler;
+use Monolog\Handler\StreamHandler;
+use Monolog\Handler\SyslogUdpHandler;
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Log Channel
+    |--------------------------------------------------------------------------
+    |
+    | This option defines the default log channel that gets used when writing
+    | messages to the logs. The name specified in this option should match
+    | one of the channels defined in the "channels" configuration array.
+    |
+    */
+
+    'default' => env('LOG_CHANNEL', 'stack'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Deprecations Log Channel
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the log channel that should be used to log warnings
+    | regarding deprecated PHP and library features. This allows you to get
+    | your application ready for upcoming major versions of dependencies.
+    |
+    */
+
+    'deprecations' => [
+        'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
+        'trace' => false,
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Log Channels
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure the log channels for your application. Out of
+    | the box, Laravel uses the Monolog PHP logging library. This gives
+    | you a variety of powerful log handlers / formatters to utilize.
+    |
+    | Available Drivers: "single", "daily", "slack", "syslog",
+    |                    "errorlog", "monolog",
+    |                    "custom", "stack"
+    |
+    */
+
+    'channels' => [
+        'stack' => [
+            'driver' => 'stack',
+            'channels' => ['single'],
+            'ignore_exceptions' => false,
+        ],
+
+        'single' => [
+            'driver' => 'single',
+            'path' => storage_path('logs/laravel.log'),
+            'level' => env('LOG_LEVEL', 'debug'),
+        ],
+
+        'daily' => [
+            'driver' => 'daily',
+            'path' => storage_path('logs/laravel.log'),
+            'level' => env('LOG_LEVEL', 'debug'),
+            'days' => 14,
+        ],
+
+        'slack' => [
+            'driver' => 'slack',
+            'url' => env('LOG_SLACK_WEBHOOK_URL'),
+            'username' => 'Laravel Log',
+            'emoji' => ':boom:',
+            'level' => env('LOG_LEVEL', 'critical'),
+        ],
+
+        'papertrail' => [
+            'driver' => 'monolog',
+            'level' => env('LOG_LEVEL', 'debug'),
+            'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
+            'handler_with' => [
+                'host' => env('PAPERTRAIL_URL'),
+                'port' => env('PAPERTRAIL_PORT'),
+                'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
+            ],
+        ],
+
+        'stderr' => [
+            'driver' => 'monolog',
+            'level' => env('LOG_LEVEL', 'debug'),
+            'handler' => StreamHandler::class,
+            'formatter' => env('LOG_STDERR_FORMATTER'),
+            'with' => [
+                'stream' => 'php://stderr',
+            ],
+        ],
+
+        'syslog' => [
+            'driver' => 'syslog',
+            'level' => env('LOG_LEVEL', 'debug'),
+        ],
+
+        'errorlog' => [
+            'driver' => 'errorlog',
+            'level' => env('LOG_LEVEL', 'debug'),
+        ],
+
+        'null' => [
+            'driver' => 'monolog',
+            'handler' => NullHandler::class,
+        ],
+
+        'emergency' => [
+            'path' => storage_path('logs/laravel.log'),
+        ],
+    ],
+
+];

+ 118 - 0
config/mail.php

@@ -0,0 +1,118 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Mailer
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default mailer that is used to send any email
+    | messages sent by your application. Alternative mailers may be setup
+    | and used as needed; however, this mailer will be used by default.
+    |
+    */
+
+    'default' => env('MAIL_MAILER', 'smtp'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Mailer Configurations
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure all of the mailers used by your application plus
+    | their respective settings. Several examples have been configured for
+    | you and you are free to add your own as your application requires.
+    |
+    | Laravel supports a variety of mail "transport" drivers to be used while
+    | sending an e-mail. You will specify which one you are using for your
+    | mailers below. You are free to add additional mailers as required.
+    |
+    | Supported: "smtp", "sendmail", "mailgun", "ses",
+    |            "postmark", "log", "array", "failover"
+    |
+    */
+
+    'mailers' => [
+        'smtp' => [
+            'transport' => 'smtp',
+            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
+            'port' => env('MAIL_PORT', 587),
+            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
+            'username' => env('MAIL_USERNAME'),
+            'password' => env('MAIL_PASSWORD'),
+            'timeout' => null,
+            'local_domain' => env('MAIL_EHLO_DOMAIN'),
+        ],
+
+        'ses' => [
+            'transport' => 'ses',
+        ],
+
+        'mailgun' => [
+            'transport' => 'mailgun',
+        ],
+
+        'postmark' => [
+            'transport' => 'postmark',
+        ],
+
+        'sendmail' => [
+            'transport' => 'sendmail',
+            'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
+        ],
+
+        'log' => [
+            'transport' => 'log',
+            'channel' => env('MAIL_LOG_CHANNEL'),
+        ],
+
+        'array' => [
+            'transport' => 'array',
+        ],
+
+        'failover' => [
+            'transport' => 'failover',
+            'mailers' => [
+                'smtp',
+                'log',
+            ],
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Global "From" Address
+    |--------------------------------------------------------------------------
+    |
+    | You may wish for all e-mails sent by your application to be sent from
+    | the same address. Here, you may specify a name and address that is
+    | used globally for all e-mails that are sent by your application.
+    |
+    */
+
+    'from' => [
+        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
+        'name' => env('MAIL_FROM_NAME', 'Example'),
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Markdown Mail Settings
+    |--------------------------------------------------------------------------
+    |
+    | If you are using Markdown based email rendering, you may configure your
+    | theme and component paths here, allowing you to customize the design
+    | of the emails. Or, you may simply stick with the Laravel defaults!
+    |
+    */
+
+    'markdown' => [
+        'theme' => 'default',
+
+        'paths' => [
+            resource_path('views/vendor/mail'),
+        ],
+    ],
+
+];

+ 93 - 0
config/queue.php

@@ -0,0 +1,93 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Queue Connection Name
+    |--------------------------------------------------------------------------
+    |
+    | Laravel's queue API supports an assortment of back-ends via a single
+    | API, giving you convenient access to each back-end using the same
+    | syntax for every one. Here you may define a default connection.
+    |
+    */
+
+    'default' => env('QUEUE_CONNECTION', 'sync'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Queue Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure the connection information for each server that
+    | is used by your application. A default configuration has been added
+    | for each back-end shipped with Laravel. You are free to add more.
+    |
+    | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
+    |
+    */
+
+    'connections' => [
+
+        'sync' => [
+            'driver' => 'sync',
+        ],
+
+        'database' => [
+            'driver' => 'database',
+            'table' => 'jobs',
+            'queue' => 'default',
+            'retry_after' => 90,
+            'after_commit' => false,
+        ],
+
+        'beanstalkd' => [
+            'driver' => 'beanstalkd',
+            'host' => 'localhost',
+            'queue' => 'default',
+            'retry_after' => 90,
+            'block_for' => 0,
+            'after_commit' => false,
+        ],
+
+        'sqs' => [
+            'driver' => 'sqs',
+            'key' => env('AWS_ACCESS_KEY_ID'),
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
+            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
+            'queue' => env('SQS_QUEUE', 'default'),
+            'suffix' => env('SQS_SUFFIX'),
+            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+            'after_commit' => false,
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+            'queue' => env('REDIS_QUEUE', 'default'),
+            'retry_after' => 90,
+            'block_for' => null,
+            'after_commit' => false,
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Failed Queue Jobs
+    |--------------------------------------------------------------------------
+    |
+    | These options configure the behavior of failed queue job logging so you
+    | can control which database and table are used to store the jobs that
+    | have failed. You may change them to any database / table you wish.
+    |
+    */
+
+    'failed' => [
+        'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
+        'database' => env('DB_CONNECTION', 'mysql'),
+        'table' => 'failed_jobs',
+    ],
+
+];

+ 13 - 0
config/rbac.php

@@ -0,0 +1,13 @@
+<?php
+
+return [
+    'layout' => 'layouts.master', // You must set it. Example: 'layout' => 'adminlte::page'
+    'userModelClass' => App\Models\User::class, // You can change it
+    'adminUserId' => 1, // You must set it. This is the initial user id, which must be an administrator, at least at the first stage.
+    'routesMainPermission' => Itstructure\LaRbac\Models\Permission::ADMINISTRATE_PERMISSION,  // You can change it
+    'routesAuthMiddlewares' => ['auth'],  // You can change it
+    'memberNameAttributeKey' => function ($row) { // You can change it. And can simply set 'memberNameAttributeKey' => 'name'
+        return $row->name;
+    },
+    'rowsPerPage' => 10,
+];

+ 67 - 0
config/sanctum.php

@@ -0,0 +1,67 @@
+<?php
+
+use Laravel\Sanctum\Sanctum;
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Stateful Domains
+    |--------------------------------------------------------------------------
+    |
+    | Requests from the following domains / hosts will receive stateful API
+    | authentication cookies. Typically, these should include your local
+    | and production domains which access your API via a frontend SPA.
+    |
+    */
+
+    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
+        '%s%s',
+        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
+        Sanctum::currentApplicationUrlWithPort()
+    ))),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Sanctum Guards
+    |--------------------------------------------------------------------------
+    |
+    | This array contains the authentication guards that will be checked when
+    | Sanctum is trying to authenticate a request. If none of these guards
+    | are able to authenticate the request, Sanctum will use the bearer
+    | token that's present on an incoming request for authentication.
+    |
+    */
+
+    'guard' => ['web'],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Expiration Minutes
+    |--------------------------------------------------------------------------
+    |
+    | This value controls the number of minutes until an issued token will be
+    | considered expired. If this value is null, personal access tokens do
+    | not expire. This won't tweak the lifetime of first-party sessions.
+    |
+    */
+
+    'expiration' => null,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Sanctum Middleware
+    |--------------------------------------------------------------------------
+    |
+    | When authenticating your first-party SPA with Sanctum you may need to
+    | customize some of the middleware Sanctum uses while processing the
+    | request. You may change the middleware listed below as required.
+    |
+    */
+
+    'middleware' => [
+        'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
+        'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
+    ],
+
+];

+ 34 - 0
config/services.php

@@ -0,0 +1,34 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Third Party Services
+    |--------------------------------------------------------------------------
+    |
+    | This file is for storing the credentials for third party services such
+    | as Mailgun, Postmark, AWS and more. This file provides the de facto
+    | location for this type of information, allowing packages to have
+    | a conventional file to locate the various service credentials.
+    |
+    */
+
+    'mailgun' => [
+        'domain' => env('MAILGUN_DOMAIN'),
+        'secret' => env('MAILGUN_SECRET'),
+        'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
+        'scheme' => 'https',
+    ],
+
+    'postmark' => [
+        'token' => env('POSTMARK_TOKEN'),
+    ],
+
+    'ses' => [
+        'key' => env('AWS_ACCESS_KEY_ID'),
+        'secret' => env('AWS_SECRET_ACCESS_KEY'),
+        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+    ],
+
+];

+ 201 - 0
config/session.php

@@ -0,0 +1,201 @@
+<?php
+
+use Illuminate\Support\Str;
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Session Driver
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default session "driver" that will be used on
+    | requests. By default, we will use the lightweight native driver but
+    | you may specify any of the other wonderful drivers provided here.
+    |
+    | Supported: "file", "cookie", "database", "apc",
+    |            "memcached", "redis", "dynamodb", "array"
+    |
+    */
+
+    'driver' => env('SESSION_DRIVER', 'file'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Lifetime
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the number of minutes that you wish the session
+    | to be allowed to remain idle before it expires. If you want them
+    | to immediately expire on the browser closing, set that option.
+    |
+    */
+
+    'lifetime' => env('SESSION_LIFETIME', 120),
+
+    'expire_on_close' => false,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Encryption
+    |--------------------------------------------------------------------------
+    |
+    | This option allows you to easily specify that all of your session data
+    | should be encrypted before it is stored. All encryption will be run
+    | automatically by Laravel and you can use the Session like normal.
+    |
+    */
+
+    'encrypt' => false,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session File Location
+    |--------------------------------------------------------------------------
+    |
+    | When using the native session driver, we need a location where session
+    | files may be stored. A default has been set for you but a different
+    | location may be specified. This is only needed for file sessions.
+    |
+    */
+
+    'files' => storage_path('framework/sessions'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Database Connection
+    |--------------------------------------------------------------------------
+    |
+    | When using the "database" or "redis" session drivers, you may specify a
+    | connection that should be used to manage these sessions. This should
+    | correspond to a connection in your database configuration options.
+    |
+    */
+
+    'connection' => env('SESSION_CONNECTION'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Database Table
+    |--------------------------------------------------------------------------
+    |
+    | When using the "database" session driver, you may specify the table we
+    | should use to manage the sessions. Of course, a sensible default is
+    | provided for you; however, you are free to change this as needed.
+    |
+    */
+
+    'table' => 'sessions',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cache Store
+    |--------------------------------------------------------------------------
+    |
+    | While using one of the framework's cache driven session backends you may
+    | list a cache store that should be used for these sessions. This value
+    | must match with one of the application's configured cache "stores".
+    |
+    | Affects: "apc", "dynamodb", "memcached", "redis"
+    |
+    */
+
+    'store' => env('SESSION_STORE'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Sweeping Lottery
+    |--------------------------------------------------------------------------
+    |
+    | Some session drivers must manually sweep their storage location to get
+    | rid of old sessions from storage. Here are the chances that it will
+    | happen on a given request. By default, the odds are 2 out of 100.
+    |
+    */
+
+    'lottery' => [2, 100],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Name
+    |--------------------------------------------------------------------------
+    |
+    | Here you may change the name of the cookie used to identify a session
+    | instance by ID. The name specified here will get used every time a
+    | new session cookie is created by the framework for every driver.
+    |
+    */
+
+    'cookie' => env(
+        'SESSION_COOKIE',
+        Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
+    ),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Path
+    |--------------------------------------------------------------------------
+    |
+    | The session cookie path determines the path for which the cookie will
+    | be regarded as available. Typically, this will be the root path of
+    | your application but you are free to change this when necessary.
+    |
+    */
+
+    'path' => '/',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Domain
+    |--------------------------------------------------------------------------
+    |
+    | Here you may change the domain of the cookie used to identify a session
+    | in your application. This will determine which domains the cookie is
+    | available to in your application. A sensible default has been set.
+    |
+    */
+
+    'domain' => env('SESSION_DOMAIN'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | HTTPS Only Cookies
+    |--------------------------------------------------------------------------
+    |
+    | By setting this option to true, session cookies will only be sent back
+    | to the server if the browser has a HTTPS connection. This will keep
+    | the cookie from being sent to you when it can't be done securely.
+    |
+    */
+
+    'secure' => env('SESSION_SECURE_COOKIE'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | HTTP Access Only
+    |--------------------------------------------------------------------------
+    |
+    | Setting this value to true will prevent JavaScript from accessing the
+    | value of the cookie and the cookie will only be accessible through
+    | the HTTP protocol. You are free to modify this option if needed.
+    |
+    */
+
+    'http_only' => true,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Same-Site Cookies
+    |--------------------------------------------------------------------------
+    |
+    | This option determines how your cookies behave when cross-site requests
+    | take place, and can be used to mitigate CSRF attacks. By default, we
+    | will set this value to "lax" since this is a secure default value.
+    |
+    | Supported: "lax", "strict", "none", null
+    |
+    */
+
+    'same_site' => 'lax',
+
+];

+ 36 - 0
config/view.php

@@ -0,0 +1,36 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | View Storage Paths
+    |--------------------------------------------------------------------------
+    |
+    | Most templating systems load templates from disk. Here you may specify
+    | an array of paths that should be checked for your views. Of course
+    | the usual Laravel view path has already been registered for you.
+    |
+    */
+
+    'paths' => [
+        resource_path('views'),
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Compiled View Path
+    |--------------------------------------------------------------------------
+    |
+    | This option determines where all the compiled Blade templates will be
+    | stored for your application. Typically, this is within the storage
+    | directory. However, as usual, you are free to change this value.
+    |
+    */
+
+    'compiled' => env(
+        'VIEW_COMPILED_PATH',
+        realpath(storage_path('framework/views'))
+    ),
+
+];

+ 1 - 0
database/.gitignore

@@ -0,0 +1 @@
+*.sqlite*

+ 40 - 0
database/factories/UserFactory.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace Database\Factories;
+
+use Illuminate\Database\Eloquent\Factories\Factory;
+use Illuminate\Support\Str;
+
+/**
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
+ */
+class UserFactory extends Factory
+{
+    /**
+     * Define the model's default state.
+     *
+     * @return array<string, mixed>
+     */
+    public function definition()
+    {
+        return [
+            'name' => fake()->name(),
+            'email' => fake()->unique()->safeEmail(),
+            'email_verified_at' => now(),
+            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
+            'remember_token' => Str::random(10),
+        ];
+    }
+
+    /**
+     * Indicate that the model's email address should be unverified.
+     *
+     * @return static
+     */
+    public function unverified()
+    {
+        return $this->state(fn (array $attributes) => [
+            'email_verified_at' => null,
+        ]);
+    }
+}

+ 38 - 0
database/migrations/2014_10_12_000000_create_users_table.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('users', function (Blueprint $table) {
+            $table->id();
+            $table->string('name')->nullable();
+            $table->string('email')->unique()->nullable();
+            $table->string('user_type');
+            $table->string('phone_number')->nullable();
+            $table->timestamp('email_verified_at')->nullable();
+            $table->string('password')->nullable();
+            $table->rememberToken();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('users');
+    }
+};

+ 32 - 0
database/migrations/2014_10_12_100000_create_password_resets_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('password_resets', function (Blueprint $table) {
+            $table->string('email')->primary();
+            $table->string('token');
+            $table->timestamp('created_at')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('password_resets');
+    }
+};

+ 36 - 0
database/migrations/2019_08_19_000000_create_failed_jobs_table.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('failed_jobs', function (Blueprint $table) {
+            $table->id();
+            $table->string('uuid')->unique();
+            $table->text('connection');
+            $table->text('queue');
+            $table->longText('payload');
+            $table->longText('exception');
+            $table->timestamp('failed_at')->useCurrent();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('failed_jobs');
+    }
+};

+ 37 - 0
database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('personal_access_tokens', function (Blueprint $table) {
+            $table->id();
+            $table->morphs('tokenable');
+            $table->string('name');
+            $table->string('token', 64)->unique();
+            $table->text('abilities')->nullable();
+            $table->timestamp('last_used_at')->nullable();
+            $table->timestamp('expires_at')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('personal_access_tokens');
+    }
+};

+ 37 - 0
database/migrations/2020_07_11_151756_create_roles_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+/**
+ * Class CreateRolesTable
+ *
+ * @author Andrey Girnik <girnikandrey@gmail.com>
+ */
+class CreateRolesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('roles', function (Blueprint $table) {
+            $table->increments('id');
+            $table->string('name', 191);
+            $table->string('slug', 191)->unique();
+            $table->string('description', 191);
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('roles');
+    }
+}

+ 75 - 0
database/migrations/2020_07_11_151834_create_user_role_table.php

@@ -0,0 +1,75 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+use Itstructure\LaRbac\Helpers\Helper;
+
+/**
+ * Class CreateUserRoleTable
+ *
+ * @author Andrey Girnik <girnikandrey@gmail.com>
+ */
+class CreateUserRoleTable extends Migration
+{
+    /**
+     * @var string
+     */
+    protected $userModelClass;
+
+    /**
+     * UserController constructor.
+     */
+    public function __construct()
+    {
+        $this->userModelClass = config('rbac.userModelClass');
+    }
+
+    /**
+     * Run the migrations.
+     * @throws Exception
+     * @throws \Exception
+     */
+    public function up()
+    {
+        Helper::checkUserModel($this->userModelClass);
+
+        /* @var Illuminate\Foundation\Auth\User $userNewModel */
+        $userNewModel = new $this->userModelClass();
+
+        Helper::checkUserModelKeyType($userNewModel);
+
+        $userModelTable = $userNewModel->getTable();
+
+        $userModelKeyName = $userNewModel->getAuthIdentifierName();
+
+        $userTablePrimaryType = Schema::getConnection()->getDoctrineColumn($userModelTable, $userModelKeyName)->getType()->getName();
+
+        Helper::checkUserTablePrimaryType($userTablePrimaryType, $userModelKeyName, $userModelTable);
+
+        Schema::create('user_role', function (Blueprint $table) use ($userModelKeyName, $userModelTable, $userTablePrimaryType) {
+            switch ($userTablePrimaryType) {
+                case 'bigint':
+                    $table->unsignedBigInteger('user_id');
+                    break;
+                case 'integer':
+                    $table->unsignedInteger('user_id');
+                    break;
+            }
+            $table->unsignedInteger('role_id');
+            $table->timestamps();
+            $table->unique(['user_id','role_id']);
+            $table->foreign('user_id')->references($userModelKeyName)->on($userModelTable)->onDelete('cascade');
+            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('user_role');
+    }
+}

+ 37 - 0
database/migrations/2020_07_11_151894_create_permissions_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+/**
+ * Class CreatePermissionsTable
+ *
+ * @author Andrey Girnik <girnikandrey@gmail.com>
+ */
+class CreatePermissionsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('permissions', function (Blueprint $table) {
+            $table->increments('id');
+            $table->string('name', 191);
+            $table->string('slug', 191)->unique();
+            $table->string('description', 191);
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('permissions');
+    }
+}

+ 38 - 0
database/migrations/2020_07_11_151925_create_role_permission_table.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+/**
+ * Class CreateRolePermissionTable
+ *
+ * @author Andrey Girnik <girnikandrey@gmail.com>
+ */
+class CreateRolePermissionTable extends Migration
+{
+    /**
+     * Run the migrations.
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('role_permission', function (Blueprint $table) {
+            $table->unsignedInteger('role_id');
+            $table->unsignedInteger('permission_id');
+            $table->timestamps();
+            $table->unique(['permission_id','role_id']);
+            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
+            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('role_permission');
+    }
+}

+ 49 - 0
database/migrations/2023_02_02_065537_assets_table.php

@@ -0,0 +1,49 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        
+        Schema::create('assets', function (Blueprint $table) {
+            $table->id();
+            $table->integer('vendor_id', 11)->nullable();
+            $table->integer('category_id', 11)->nullable();
+            $table->string('name', 100)->nullable();
+            $table->string('model_name', 100)->nullable();
+            $table->string('model_number', 100)->nullable();
+            $table->string('registered_number', 100)->nullable();
+            $table->string('brand', 20)->nullable();
+            $table->integer('duration', 20)->nullable();
+            $table->string('duration_type', 50)->nullable();
+            $table->string('asset_type', 50)->nullable();
+            $table->double('cost')->nullable();
+            $table->text('description', 50)->nullable();
+            $table->text('image', 50)->nullable();
+            $table->enum('status')->unique();
+            $table->timestamp('email_verified_at')->nullable();
+            $table->string('password');
+            $table->rememberToken();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+};

+ 28 - 0
database/migrations/2023_02_02_065816_assets_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        //
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+};

+ 24 - 0
database/seeders/DatabaseSeeder.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace Database\Seeders;
+
+// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
+use Illuminate\Database\Seeder;
+
+class DatabaseSeeder extends Seeder
+{
+    /**
+     * Seed the application's database.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        // \App\Models\User::factory(10)->create();
+
+        // \App\Models\User::factory()->create([
+        //     'name' => 'Test User',
+        //     'email' => 'test@example.com',
+        // ]);
+    }
+}

+ 22 - 0
database/seeders/LaRbacDatabaseSeeder.php

@@ -0,0 +1,22 @@
+<?php
+namespace Database\Seeders;
+
+use Illuminate\Database\Seeder;
+
+/**
+ * Class LaRbacDatabaseSeeder
+ *
+ * @author Andrey Girnik <girnikandrey@gmail.com>
+ */
+class LaRbacDatabaseSeeder extends Seeder
+{
+    /**
+     * Seed the application's database with RBAC data.
+     * @return void
+     */
+    public function run()
+    {
+        $this->call(PermissionSeeder::class);
+        $this->call(RoleSeeder::class);
+    }
+}

+ 65 - 0
database/seeders/PermissionSeeder.php

@@ -0,0 +1,65 @@
+<?php
+namespace Database\Seeders;
+
+use Illuminate\Database\Seeder;
+use Itstructure\LaRbac\Models\Permission;
+
+/**
+ * Class PermissionSeeder
+ *
+ * @author Andrey Girnik <girnikandrey@gmail.com>
+ */
+class PermissionSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     * @return void
+     */
+    public function run()
+    {
+        $this->createRecord(
+            Permission::ADMINISTRATE_PERMISSION,
+            'Total administrate of users and content'
+        );
+
+        $this->createRecord(
+            Permission::VIEW_RECORD_PERMISSION,
+            'Permission to view record'
+        );
+
+        $this->createRecord(
+            Permission::CREATE_RECORD_PERMISSION,
+            'Permission to create record'
+        );
+
+        $this->createRecord(
+            Permission::UPDATE_RECORD_PERMISSION,
+            'Permission to update record'
+        );
+
+        $this->createRecord(
+            Permission::DELETE_RECORD_PERMISSION,
+            'Permission to delete record'
+        );
+
+        $this->createRecord(
+            Permission::PUBLISH_RECORD_PERMISSION,
+            'Permission to publish record'
+        );
+    }
+
+    /**
+     * Create permission record in database.
+     * @param string $slug
+     * @param string $description
+     * @return void
+     */
+    private function createRecord(string $slug, string $description): void
+    {
+        Permission::create([
+            'name' => str_replace('-', ' ', ucfirst($slug)),
+            'slug' => $slug,
+            'description' => $description,
+        ]);
+    }
+}

+ 89 - 0
database/seeders/RoleSeeder.php

@@ -0,0 +1,89 @@
+<?php
+namespace Database\Seeders;
+
+use Illuminate\Database\Seeder;
+use Itstructure\LaRbac\Models\{Role, Permission};
+
+/**
+ * Class RoleSeeder
+ *
+ * @author Andrey Girnik <girnikandrey@gmail.com>
+ */
+class RoleSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     * @return void
+     */
+    public function run()
+    {
+        $totalPermissionId   = Permission::where('slug', Permission::ADMINISTRATE_PERMISSION)->firstOrFail()->id;
+        $viewPermissionId    = Permission::where('slug', Permission::VIEW_RECORD_PERMISSION)->firstOrFail()->id;
+        $createPermissionId  = Permission::where('slug', Permission::CREATE_RECORD_PERMISSION)->firstOrFail()->id;
+        $updatePermissionId  = Permission::where('slug', Permission::UPDATE_RECORD_PERMISSION)->firstOrFail()->id;
+        $deletePermissionId  = Permission::where('slug', Permission::DELETE_RECORD_PERMISSION)->firstOrFail()->id;
+        $publishPermissionId = Permission::where('slug', Permission::PUBLISH_RECORD_PERMISSION)->firstOrFail()->id;
+
+        $this->createRecord(
+            Role::ADMIN_ROLE,
+            'Administrator',
+            [
+                $totalPermissionId,
+                $viewPermissionId,
+                $createPermissionId,
+                $updatePermissionId,
+                $deletePermissionId,
+                $publishPermissionId
+            ]
+        );
+
+        $this->createRecord(
+            Role::MANAGER_ROLE,
+            'Content manager',
+            [
+                $viewPermissionId,
+                $createPermissionId,
+                $updatePermissionId,
+                $deletePermissionId,
+                $publishPermissionId
+            ]
+        );
+
+        $this->createRecord(
+            Role::EDITOR_ROLE,
+            'Record editor',
+            [
+                $viewPermissionId,
+                $createPermissionId,
+                $updatePermissionId,
+                $deletePermissionId,
+                $publishPermissionId
+            ]
+        );
+
+        $this->createRecord(
+            Role::USER_ROLE,
+            'Simple user',
+            [
+                $viewPermissionId
+            ]
+        );
+    }
+
+    /**
+     * Create role record in database.
+     * @param string $slug
+     * @param string $description
+     * @param array $permissions
+     * @return void
+     */
+    private function createRecord(string $slug, string $description, array $permissions): void
+    {
+        Role::create([
+            'name' => ucfirst($slug),
+            'slug' => $slug,
+            'description' => $description,
+        ])->permissions()
+            ->attach($permissions);
+    }
+}

+ 20 - 0
lang/en/auth.php

@@ -0,0 +1,20 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used during authentication for various
+    | messages that we need to display to the user. You are free to modify
+    | these language lines according to your application's requirements.
+    |
+    */
+
+    'failed' => 'These credentials do not match our records.',
+    'password' => 'The provided password is incorrect.',
+    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
+
+];

+ 19 - 0
lang/en/pagination.php

@@ -0,0 +1,19 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Pagination Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used by the paginator library to build
+    | the simple pagination links. You are free to change them to anything
+    | you want to customize your views to better match your application.
+    |
+    */
+
+    'previous' => '&laquo; Previous',
+    'next' => 'Next &raquo;',
+
+];

+ 22 - 0
lang/en/passwords.php

@@ -0,0 +1,22 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are the default lines which match reasons
+    | that are given by the password broker for a password update attempt
+    | has failed, such as for an invalid token or invalid new password.
+    |
+    */
+
+    'reset' => 'Your password has been reset!',
+    'sent' => 'We have emailed your password reset link!',
+    'throttled' => 'Please wait before retrying.',
+    'token' => 'This password reset token is invalid.',
+    'user' => "We can't find a user with that email address.",
+
+];

+ 179 - 0
lang/en/validation.php

@@ -0,0 +1,179 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Validation Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines contain the default error messages used by
+    | the validator class. Some of these rules have multiple versions such
+    | as the size rules. Feel free to tweak each of these messages here.
+    |
+    */
+
+    'accepted' => 'The :attribute must be accepted.',
+    'accepted_if' => 'The :attribute must be accepted when :other is :value.',
+    'active_url' => 'The :attribute is not a valid URL.',
+    'after' => 'The :attribute must be a date after :date.',
+    'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
+    'alpha' => 'The :attribute must only contain letters.',
+    'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.',
+    'alpha_num' => 'The :attribute must only contain letters and numbers.',
+    'array' => 'The :attribute must be an array.',
+    'ascii' => 'The :attribute must only contain single-byte alphanumeric characters and symbols.',
+    'before' => 'The :attribute must be a date before :date.',
+    'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
+    'between' => [
+        'array' => 'The :attribute must have between :min and :max items.',
+        'file' => 'The :attribute must be between :min and :max kilobytes.',
+        'numeric' => 'The :attribute must be between :min and :max.',
+        'string' => 'The :attribute must be between :min and :max characters.',
+    ],
+    'boolean' => 'The :attribute field must be true or false.',
+    'confirmed' => 'The :attribute confirmation does not match.',
+    'current_password' => 'The password is incorrect.',
+    'date' => 'The :attribute is not a valid date.',
+    'date_equals' => 'The :attribute must be a date equal to :date.',
+    'date_format' => 'The :attribute does not match the format :format.',
+    'decimal' => 'The :attribute must have :decimal decimal places.',
+    'declined' => 'The :attribute must be declined.',
+    'declined_if' => 'The :attribute must be declined when :other is :value.',
+    'different' => 'The :attribute and :other must be different.',
+    'digits' => 'The :attribute must be :digits digits.',
+    'digits_between' => 'The :attribute must be between :min and :max digits.',
+    'dimensions' => 'The :attribute has invalid image dimensions.',
+    'distinct' => 'The :attribute field has a duplicate value.',
+    'doesnt_end_with' => 'The :attribute may not end with one of the following: :values.',
+    'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.',
+    'email' => 'The :attribute must be a valid email address.',
+    'ends_with' => 'The :attribute must end with one of the following: :values.',
+    'enum' => 'The selected :attribute is invalid.',
+    'exists' => 'The selected :attribute is invalid.',
+    'file' => 'The :attribute must be a file.',
+    'filled' => 'The :attribute field must have a value.',
+    'gt' => [
+        'array' => 'The :attribute must have more than :value items.',
+        'file' => 'The :attribute must be greater than :value kilobytes.',
+        'numeric' => 'The :attribute must be greater than :value.',
+        'string' => 'The :attribute must be greater than :value characters.',
+    ],
+    'gte' => [
+        'array' => 'The :attribute must have :value items or more.',
+        'file' => 'The :attribute must be greater than or equal to :value kilobytes.',
+        'numeric' => 'The :attribute must be greater than or equal to :value.',
+        'string' => 'The :attribute must be greater than or equal to :value characters.',
+    ],
+    'image' => 'The :attribute must be an image.',
+    'in' => 'The selected :attribute is invalid.',
+    'in_array' => 'The :attribute field does not exist in :other.',
+    'integer' => 'The :attribute must be an integer.',
+    'ip' => 'The :attribute must be a valid IP address.',
+    'ipv4' => 'The :attribute must be a valid IPv4 address.',
+    'ipv6' => 'The :attribute must be a valid IPv6 address.',
+    'json' => 'The :attribute must be a valid JSON string.',
+    'lowercase' => 'The :attribute must be lowercase.',
+    'lt' => [
+        'array' => 'The :attribute must have less than :value items.',
+        'file' => 'The :attribute must be less than :value kilobytes.',
+        'numeric' => 'The :attribute must be less than :value.',
+        'string' => 'The :attribute must be less than :value characters.',
+    ],
+    'lte' => [
+        'array' => 'The :attribute must not have more than :value items.',
+        'file' => 'The :attribute must be less than or equal to :value kilobytes.',
+        'numeric' => 'The :attribute must be less than or equal to :value.',
+        'string' => 'The :attribute must be less than or equal to :value characters.',
+    ],
+    'mac_address' => 'The :attribute must be a valid MAC address.',
+    'max' => [
+        'array' => 'The :attribute must not have more than :max items.',
+        'file' => 'The :attribute must not be greater than :max kilobytes.',
+        'numeric' => 'The :attribute must not be greater than :max.',
+        'string' => 'The :attribute must not be greater than :max characters.',
+    ],
+    'max_digits' => 'The :attribute must not have more than :max digits.',
+    'mimes' => 'The :attribute must be a file of type: :values.',
+    'mimetypes' => 'The :attribute must be a file of type: :values.',
+    'min' => [
+        'array' => 'The :attribute must have at least :min items.',
+        'file' => 'The :attribute must be at least :min kilobytes.',
+        'numeric' => 'The :attribute must be at least :min.',
+        'string' => 'The :attribute must be at least :min characters.',
+    ],
+    'min_digits' => 'The :attribute must have at least :min digits.',
+    'multiple_of' => 'The :attribute must be a multiple of :value.',
+    'not_in' => 'The selected :attribute is invalid.',
+    'not_regex' => 'The :attribute format is invalid.',
+    'numeric' => 'The :attribute must be a number.',
+    'password' => [
+        'letters' => 'The :attribute must contain at least one letter.',
+        'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.',
+        'numbers' => 'The :attribute must contain at least one number.',
+        'symbols' => 'The :attribute must contain at least one symbol.',
+        'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
+    ],
+    'present' => 'The :attribute field must be present.',
+    'prohibited' => 'The :attribute field is prohibited.',
+    'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
+    'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
+    'prohibits' => 'The :attribute field prohibits :other from being present.',
+    'regex' => 'The :attribute format is invalid.',
+    'required' => 'The :attribute field is required.',
+    'required_array_keys' => 'The :attribute field must contain entries for: :values.',
+    'required_if' => 'The :attribute field is required when :other is :value.',
+    'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
+    'required_unless' => 'The :attribute field is required unless :other is in :values.',
+    'required_with' => 'The :attribute field is required when :values is present.',
+    'required_with_all' => 'The :attribute field is required when :values are present.',
+    'required_without' => 'The :attribute field is required when :values is not present.',
+    'required_without_all' => 'The :attribute field is required when none of :values are present.',
+    'same' => 'The :attribute and :other must match.',
+    'size' => [
+        'array' => 'The :attribute must contain :size items.',
+        'file' => 'The :attribute must be :size kilobytes.',
+        'numeric' => 'The :attribute must be :size.',
+        'string' => 'The :attribute must be :size characters.',
+    ],
+    'starts_with' => 'The :attribute must start with one of the following: :values.',
+    'string' => 'The :attribute must be a string.',
+    'timezone' => 'The :attribute must be a valid timezone.',
+    'unique' => 'The :attribute has already been taken.',
+    'uploaded' => 'The :attribute failed to upload.',
+    'uppercase' => 'The :attribute must be uppercase.',
+    'url' => 'The :attribute must be a valid URL.',
+    'ulid' => 'The :attribute must be a valid ULID.',
+    'uuid' => 'The :attribute must be a valid UUID.',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Custom Validation Language Lines
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify custom validation messages for attributes using the
+    | convention "attribute.rule" to name the lines. This makes it quick to
+    | specify a specific custom language line for a given attribute rule.
+    |
+    */
+
+    'custom' => [
+        'attribute-name' => [
+            'rule-name' => 'custom-message',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Custom Validation Attributes
+    |--------------------------------------------------------------------------
+    |
+    | The following language lines are used to swap our attribute placeholder
+    | with something more reader friendly such as "E-Mail Address" instead
+    | of "email". This simply helps us make our message more expressive.
+    |
+    */
+
+    'attributes' => [],
+
+];

+ 14 - 0
package.json

@@ -0,0 +1,14 @@
+{
+    "private": true,
+    "scripts": {
+        "dev": "vite",
+        "build": "vite build"
+    },
+    "devDependencies": {
+        "axios": "^1.1.2",
+        "laravel-vite-plugin": "^0.7.2",
+        "lodash": "^4.17.19",
+        "postcss": "^8.1.14",
+        "vite": "^4.0.0"
+    }
+}

+ 31 - 0
phpunit.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
+         bootstrap="vendor/autoload.php"
+         colors="true"
+>
+    <testsuites>
+        <testsuite name="Unit">
+            <directory suffix="Test.php">./tests/Unit</directory>
+        </testsuite>
+        <testsuite name="Feature">
+            <directory suffix="Test.php">./tests/Feature</directory>
+        </testsuite>
+    </testsuites>
+    <coverage processUncoveredFiles="true">
+        <include>
+            <directory suffix=".php">./app</directory>
+        </include>
+    </coverage>
+    <php>
+        <env name="APP_ENV" value="testing"/>
+        <env name="BCRYPT_ROUNDS" value="4"/>
+        <env name="CACHE_DRIVER" value="array"/>
+        <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
+        <!-- <env name="DB_DATABASE" value=":memory:"/> -->
+        <env name="MAIL_MAILER" value="array"/>
+        <env name="QUEUE_CONNECTION" value="sync"/>
+        <env name="SESSION_DRIVER" value="array"/>
+        <env name="TELESCOPE_ENABLED" value="false"/>
+    </php>
+</phpunit>

+ 21 - 0
public/.htaccess

@@ -0,0 +1,21 @@
+<IfModule mod_rewrite.c>
+    <IfModule mod_negotiation.c>
+        Options -MultiViews -Indexes
+    </IfModule>
+
+    RewriteEngine On
+
+    # Handle Authorization Header
+    RewriteCond %{HTTP:Authorization} .
+    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+    # Redirect Trailing Slashes If Not A Folder...
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteCond %{REQUEST_URI} (.+)/$
+    RewriteRule ^ %1 [L,R=301]
+
+    # Send Requests To Front Controller...
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteRule ^ index.php [L]
+</IfModule>

BIN
public/assets/Dist-DataTables-SearchPanes-Bootstrap4-master.zip


BIN
public/assets/Dist-DataTables-Select-Bootstrap4-master.zip


+ 1 - 0
public/assets/Dist-DataTables-Select-Bootstrap4-master/Dist-DataTables-Select-Bootstrap4-master/.gitignore

@@ -0,0 +1 @@
+*.lock

+ 22 - 0
public/assets/Dist-DataTables-Select-Bootstrap4-master/Dist-DataTables-Select-Bootstrap4-master/License.txt

@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright SpryMedia Limited and other contributors
+http://datatables.net
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 0 - 0
public/assets/Dist-DataTables-Select-Bootstrap4-master/Dist-DataTables-Select-Bootstrap4-master/Readme.md


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است