first commit

main
nocode 1 year ago
parent c9d88caaa6
commit 0762f95efd
  1. 59
      .env.example
  2. 3
      .gitignore
  3. 0
      Modules/API/Config/.gitkeep
  4. 5
      Modules/API/Config/config.php
  5. 0
      Modules/API/Console/.gitkeep
  6. 0
      Modules/API/Database/Migrations/.gitkeep
  7. 0
      Modules/API/Database/Seeders/.gitkeep
  8. 21
      Modules/API/Database/Seeders/APIDatabaseSeeder.php
  9. 0
      Modules/API/Database/factories/.gitkeep
  10. 0
      Modules/API/Entities/.gitkeep
  11. 0
      Modules/API/Http/Controllers/.gitkeep
  12. 14
      Modules/API/Http/Controllers/APIController.php
  13. 0
      Modules/API/Http/Middleware/.gitkeep
  14. 0
      Modules/API/Http/Requests/.gitkeep
  15. 0
      Modules/API/Providers/.gitkeep
  16. 114
      Modules/API/Providers/APIServiceProvider.php
  17. 69
      Modules/API/Providers/RouteServiceProvider.php
  18. 0
      Modules/API/Resources/assets/.gitkeep
  19. 0
      Modules/API/Resources/assets/js/app.js
  20. 0
      Modules/API/Resources/assets/sass/app.scss
  21. 0
      Modules/API/Resources/lang/.gitkeep
  22. 0
      Modules/API/Resources/views/.gitkeep
  23. 9
      Modules/API/Resources/views/index.blade.php
  24. 19
      Modules/API/Resources/views/layouts/master.blade.php
  25. 0
      Modules/API/Routes/.gitkeep
  26. 66
      Modules/API/Routes/api.php
  27. 16
      Modules/API/Routes/web.php
  28. 0
      Modules/API/Tests/Feature/.gitkeep
  29. 0
      Modules/API/Tests/Unit/.gitkeep
  30. 11
      Modules/API/module.json
  31. 24
      Modules/API/package.json
  32. 20
      Modules/API/tailwind.config.js
  33. 14
      Modules/API/webpack.mix.js
  34. 41
      app/Actions/Fortify/CreateNewUser.php
  35. 18
      app/Actions/Fortify/PasswordValidationRules.php
  36. 30
      app/Actions/Fortify/ResetUserPassword.php
  37. 35
      app/Actions/Fortify/UpdateUserPassword.php
  38. 61
      app/Actions/Fortify/UpdateUserProfileInformation.php
  39. 32
      app/Console/Kernel.php
  40. 50
      app/Exceptions/Handler.php
  41. 53
      app/Exports/ExampleExport.php
  42. 36
      app/Extends/DirCopy.php
  43. 62
      app/Extends/FileDB.php
  44. 1952
      app/Extends/FileType.php
  45. 60
      app/Helpers/helpers.php
  46. 54
      app/Http/Controllers/Auth/AuthenticatedSessionController.php
  47. 44
      app/Http/Controllers/Auth/ConfirmablePasswordController.php
  48. 27
      app/Http/Controllers/Auth/EmailVerificationNotificationController.php
  49. 23
      app/Http/Controllers/Auth/EmailVerificationPromptController.php
  50. 65
      app/Http/Controllers/Auth/NewPasswordController.php
  51. 47
      app/Http/Controllers/Auth/PasswordResetLinkController.php
  52. 54
      app/Http/Controllers/Auth/RegisteredUserController.php
  53. 30
      app/Http/Controllers/Auth/VerifyEmailController.php
  54. 174
      app/Http/Controllers/ClientController.php
  55. 13
      app/Http/Controllers/Controller.php
  56. 84
      app/Http/Controllers/KeygenController.php
  57. 82
      app/Http/Controllers/LangController.php
  58. 132
      app/Http/Controllers/OrganizationController.php
  59. 110
      app/Http/Controllers/PermissionController.php
  60. 130
      app/Http/Controllers/PostController.php
  61. 72
      app/Http/Controllers/Profile/ChangePasswordController.php
  62. 57
      app/Http/Controllers/Profile/InfoController.php
  63. 71
      app/Http/Controllers/RoleController.php
  64. 119
      app/Http/Controllers/System/CurrencyController.php
  65. 29
      app/Http/Controllers/UserController.php
  66. 229
      app/Http/Controllers/UserManagementController.php
  67. 73
      app/Http/Kernel.php
  68. 21
      app/Http/Middleware/Authenticate.php
  69. 48
      app/Http/Middleware/CheckForAnyScope.php
  70. 49
      app/Http/Middleware/CheckPermissions.php
  71. 49
      app/Http/Middleware/CheckRoles.php
  72. 43
      app/Http/Middleware/CheckScopes.php
  73. 17
      app/Http/Middleware/EncryptCookies.php
  74. 24
      app/Http/Middleware/LanguageManager.php
  75. 17
      app/Http/Middleware/PreventRequestsDuringMaintenance.php
  76. 32
      app/Http/Middleware/RedirectIfAuthenticated.php
  77. 19
      app/Http/Middleware/TrimStrings.php
  78. 20
      app/Http/Middleware/TrustHosts.php
  79. 28
      app/Http/Middleware/TrustProxies.php
  80. 22
      app/Http/Middleware/ValidateSignature.php
  81. 17
      app/Http/Middleware/VerifyCsrfToken.php
  82. 93
      app/Http/Requests/Auth/LoginRequest.php
  83. 20
      app/Models/Currency.php
  84. 19
      app/Models/File.php
  85. 24
      app/Models/Organization.php
  86. 9
      app/Models/Passport/AuthCode.php
  87. 9
      app/Models/Passport/Client.php
  88. 9
      app/Models/Passport/PersonalAccessClient.php
  89. 9
      app/Models/Passport/Token.php
  90. 31
      app/Models/Permission.php
  91. 11
      app/Models/Post.php
  92. 11
      app/Models/Role.php
  93. 49
      app/Models/User.php
  94. 28
      app/Providers/AppServiceProvider.php
  95. 54
      app/Providers/AuthServiceProvider.php
  96. 21
      app/Providers/BroadcastServiceProvider.php
  97. 42
      app/Providers/EventServiceProvider.php
  98. 88
      app/Providers/FortifyServiceProvider.php
  99. 52
      app/Providers/RouteServiceProvider.php
  100. 25
      app/Scopes/OrganizationScope.php
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,59 @@
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}"

3
.gitignore vendored

@ -0,0 +1,3 @@
vendor/
/storages/
.env

@ -0,0 +1,5 @@
<?php
return [
'name' => 'API'
];

@ -0,0 +1,21 @@
<?php
namespace Modules\API\Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class APIDatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
// $this->call("OthersTableSeeder");
}
}

@ -0,0 +1,14 @@
<?php
namespace Modules\API\Http\Controllers;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class APIController extends BaseController
{
use DispatchesJobs, ValidatesRequests;
}

@ -0,0 +1,114 @@
<?php
namespace Modules\API\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Database\Eloquent\Factory;
class APIServiceProvider extends ServiceProvider
{
/**
* @var string $moduleName
*/
protected $moduleName = 'API';
/**
* @var string $moduleNameLower
*/
protected $moduleNameLower = 'api';
/**
* Boot the application events.
*
* @return void
*/
public function boot()
{
$this->registerTranslations();
$this->registerConfig();
$this->registerViews();
$this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations'));
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->register(RouteServiceProvider::class);
}
/**
* Register config.
*
* @return void
*/
protected function registerConfig()
{
$this->publishes([
module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'),
], 'config');
$this->mergeConfigFrom(
module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower
);
}
/**
* Register views.
*
* @return void
*/
public function registerViews()
{
$viewPath = resource_path('views/modules/' . $this->moduleNameLower);
$sourcePath = module_path($this->moduleName, 'Resources/views');
$this->publishes([
$sourcePath => $viewPath
], ['views', $this->moduleNameLower . '-module-views']);
$this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower);
}
/**
* Register translations.
*
* @return void
*/
public function registerTranslations()
{
$langPath = resource_path('lang/modules/' . $this->moduleNameLower);
if (is_dir($langPath)) {
$this->loadTranslationsFrom($langPath, $this->moduleNameLower);
$this->loadJsonTranslationsFrom($langPath, $this->moduleNameLower);
} else {
$this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower);
$this->loadJsonTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower);
}
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return [];
}
private function getPublishableViewPaths(): array
{
$paths = [];
foreach (\Config::get('view.paths') as $path) {
if (is_dir($path . '/modules/' . $this->moduleNameLower)) {
$paths[] = $path . '/modules/' . $this->moduleNameLower;
}
}
return $paths;
}
}

@ -0,0 +1,69 @@
<?php
namespace Modules\API\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
/**
* The module namespace to assume when generating URLs to actions.
*
* @var string
*/
protected $moduleNamespace = 'Modules\API\Http\Controllers';
/**
* Called before routes are registered.
*
* Register any model bindings or pattern based filters.
*
* @return void
*/
public function boot()
{
parent::boot();
}
/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
}
/**
* Define the "web" routes for the application.
*
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->moduleNamespace)
->group(module_path('API', '/Routes/web.php'));
}
/**
* Define the "api" routes for the application.
*
* These routes are typically stateless.
*
* @return void
*/
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->moduleNamespace)
->group(module_path('API', '/Routes/api.php'));
}
}

@ -0,0 +1,9 @@
@extends('api::layouts.master')
@section('content')
<h1>Hello World</h1>
<p>
This view is loaded from module: {!! config('api.name') !!}
</p>
@endsection

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Module API</title>
{{-- Laravel Vite - CSS File --}}
{{-- {{ module_vite('build-api', 'Resources/assets/sass/app.scss') }} --}}
</head>
<body>
@yield('content')
{{-- Laravel Vite - JS File --}}
{{-- {{ module_vite('build-api', 'Resources/assets/js/app.js') }} --}}
</body>
</html>

@ -0,0 +1,66 @@
<?php
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
*/
Route::group( ['middleware' => ['auth:api']], function() {
Route::resource('/PL001', Modules\API\Http\Controllers\PL001Controller::class)->only(['index']);
Route::resource('/PL002', Modules\API\Http\Controllers\PL002Controller::class)->only(['store']);
Route::resource('/PL003', Modules\API\Http\Controllers\PL003Controller::class)->only(['index']);
Route::resource('/PL004', Modules\API\Http\Controllers\PL004Controller::class)->only(['index']);
Route::resource('/PL005', Modules\API\Http\Controllers\PL005Controller::class)->only(['index']);
Route::resource('/PL006', Modules\API\Http\Controllers\PL006Controller::class)->only(['index']);
Route::resource('/PL007', Modules\API\Http\Controllers\PL007Controller::class)->only(['index']);
Route::resource('/PL008', Modules\API\Http\Controllers\PL008Controller::class)->only(['index']);
Route::resource('/LE001', Modules\API\Http\Controllers\LE001Controller::class)->only(['index']);
Route::resource('/LE002', Modules\API\Http\Controllers\LE002Controller::class)->only(['index']);
Route::resource('/LE003', Modules\API\Http\Controllers\LE003Controller::class)->only(['index']);
Route::resource('/LE004', Modules\API\Http\Controllers\LE004Controller::class)->only(['index']);
Route::resource('/LE005', Modules\API\Http\Controllers\LE005Controller::class)->only(['index']);
Route::resource('/LE006', Modules\API\Http\Controllers\LE006Controller::class)->only(['index']);
Route::resource('/LE007', Modules\API\Http\Controllers\LE007Controller::class)->only(['store']);
Route::resource('/LE008', Modules\API\Http\Controllers\LE008Controller::class)->only(['index']);
Route::resource('/LE009', Modules\API\Http\Controllers\LE009Controller::class)->only(['index']);
Route::resource('/LE010', Modules\API\Http\Controllers\LE010Controller::class)->only(['index']);
Route::resource('/LE011', Modules\API\Http\Controllers\LE011Controller::class)->only(['index']);
Route::resource('/LE012', Modules\API\Http\Controllers\LE012Controller::class)->only(['index']);
Route::resource('/LE013', Modules\API\Http\Controllers\LE013Controller::class)->only(['index']);
Route::resource('/LE014', Modules\API\Http\Controllers\LE014Controller::class)->only(['index']);
Route::resource('/EX001', Modules\API\Http\Controllers\EX001Controller::class)->only(['index']);
Route::resource('/EX002', Modules\API\Http\Controllers\EX002Controller::class)->only(['index']);
Route::resource('/EX003', Modules\API\Http\Controllers\EX003Controller::class)->only(['index']);
Route::resource('/EX004', Modules\API\Http\Controllers\EX004Controller::class)->only(['index']);
Route::resource('/EX005', Modules\API\Http\Controllers\EX005Controller::class)->only(['index']);
Route::resource('/EX006', Modules\API\Http\Controllers\EX006Controller::class)->only(['index']);
Route::resource('/EX007', Modules\API\Http\Controllers\EX007Controller::class)->only(['index']);
Route::resource('/EX008', Modules\API\Http\Controllers\EX008Controller::class)->only(['index']);
Route::resource('/EX009', Modules\API\Http\Controllers\EX009Controller::class)->only(['store']);
Route::resource('/EX010', Modules\API\Http\Controllers\EX010Controller::class)->only(['index']);
Route::resource('/EX011', Modules\API\Http\Controllers\EX011Controller::class)->only(['index']);
Route::resource('/EX012', Modules\API\Http\Controllers\EX012Controller::class)->only(['index']);
Route::resource('/EX013', Modules\API\Http\Controllers\EX013Controller::class)->only(['index']);
Route::resource('/EX014', Modules\API\Http\Controllers\EX014Controller::class)->only(['index']);
Route::resource('/RP001', Modules\API\Http\Controllers\RP001Controller::class)->only(['index']);
Route::resource('/RP002', Modules\API\Http\Controllers\RP002Controller::class)->only(['index']);
Route::resource('/RP003', Modules\API\Http\Controllers\RP003Controller::class)->only(['index']);
Route::resource('/RP004', Modules\API\Http\Controllers\RP004Controller::class)->only(['index']);
Route::resource('/RP005', Modules\API\Http\Controllers\RP005Controller::class)->only(['index']);
Route::resource('/RP006', Modules\API\Http\Controllers\RP006Controller::class)->only(['index']);
Route::resource('/RP007', Modules\API\Http\Controllers\RP007Controller::class)->only(['index']);
});
// Route::get('/RP006', function(Request $request){
// var_dump( $request->bearerToken());
// })/*->middleware('auth:api')*/; //disable auth middleware to inspect header

@ -0,0 +1,16 @@
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::prefix('api')->group(function() {
Route::get('/', 'APIController@index');
});

@ -0,0 +1,11 @@
{
"name": "API",
"alias": "api",
"description": "",
"keywords": [],
"priority": 0,
"providers": [
"Modules\\API\\Providers\\APIServiceProvider"
],
"files": []
}

@ -0,0 +1,24 @@
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"prod": "npm run production",
"production": "mix --production"
},
"devDependencies": {
"axios": "^0.21.4",
"dotenv": "^10.0.0",
"dotenv-expand": "^5.1.0",
"laravel-mix": "^6.0.31",
"laravel-mix-merge-manifest": "^2.0.0",
"lodash": "^4.17.21",
"postcss": "^8.3.7",
"resolve-url-loader": "^5.0.0",
"sass": "^1.56.2",
"sass-loader": "^12.6.0"
}
}

@ -0,0 +1,20 @@
const defaultTheme = require('tailwindcss/defaultTheme');
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
'./storage/framework/views/*.php',
'./resources/views/**/*.blade.php',
],
theme: {
extend: {
fontFamily: {
sans: ['Nunito', ...defaultTheme.fontFamily.sans],
},
},
},
plugins: [require('@tailwindcss/forms')],
};

@ -0,0 +1,14 @@
const dotenvExpand = require('dotenv-expand');
dotenvExpand(require('dotenv').config({ path: '../../.env'/*, debug: true*/}));
const mix = require('laravel-mix');
require('laravel-mix-merge-manifest');
mix.setPublicPath('../../public').mergeManifest();
mix.js(__dirname + '/Resources/assets/js/app.js', '/public/modules/api/js/api.js')
.sass( __dirname + '/Resources/assets/sass/app.scss', '/public/modules/api/css/api.css');
if (mix.inProduction()) {
mix.version();
}

@ -0,0 +1,41 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Laravel\Fortify\Contracts\CreatesNewUsers;
class CreateNewUser implements CreatesNewUsers
{
use PasswordValidationRules;
/**
* Validate and create a newly registered user.
*
* @param array $input
* @return \App\Models\User
*/
public function create(array $input)
{
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique(User::class),
],
'password' => $this->passwordRules(),
])->validate();
return User::create([
'name' => $input['name'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]);
}
}

@ -0,0 +1,18 @@
<?php
namespace App\Actions\Fortify;
use Laravel\Fortify\Rules\Password;
trait PasswordValidationRules
{
/**
* Get the validation rules used to validate passwords.
*
* @return array
*/
protected function passwordRules()
{
return ['required', 'string', new Password, 'confirmed'];
}
}

@ -0,0 +1,30 @@
<?php
namespace App\Actions\Fortify;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\ResetsUserPasswords;
class ResetUserPassword implements ResetsUserPasswords
{
use PasswordValidationRules;
/**
* Validate and reset the user's forgotten password.
*
* @param mixed $user
* @param array $input
* @return void
*/
public function reset($user, array $input)
{
Validator::make($input, [
'password' => $this->passwordRules(),
])->validate();
$user->forceFill([
'password' => Hash::make($input['password']),
])->save();
}
}

@ -0,0 +1,35 @@
<?php
namespace App\Actions\Fortify;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\UpdatesUserPasswords;
class UpdateUserPassword implements UpdatesUserPasswords
{
use PasswordValidationRules;
/**
* Validate and update the user's password.
*
* @param mixed $user
* @param array $input
* @return void
*/
public function update($user, array $input)
{
Validator::make($input, [
'current_password' => ['required', 'string'],
'password' => $this->passwordRules(),
])->after(function ($validator) use ($user, $input) {
if (! isset($input['current_password']) || ! Hash::check($input['current_password'], $user->password)) {
$validator->errors()->add('current_password', __('The provided password does not match your current password.'));
}
})->validateWithBag('updatePassword');
$user->forceFill([
'password' => Hash::make($input['password']),
])->save();
}
}

@ -0,0 +1,61 @@
<?php
namespace App\Actions\Fortify;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Laravel\Fortify\Contracts\UpdatesUserProfileInformation;
class UpdateUserProfileInformation implements UpdatesUserProfileInformation
{
/**
* Validate and update the given user's profile information.
*
* @param mixed $user
* @param array $input
* @return void
*/
public function update($user, array $input)
{
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique('users')->ignore($user->id),
],
])->validateWithBag('updateProfileInformation');
if ($input['email'] !== $user->email &&
$user instanceof MustVerifyEmail) {
$this->updateVerifiedUser($user, $input);
} else {
$user->forceFill([
'name' => $input['name'],
'email' => $input['email'],
])->save();
}
}
/**
* Update the given verified user's profile information.
*
* @param mixed $user
* @param array $input
* @return void
*/
protected function updateVerifiedUser($user, array $input)
{
$user->forceFill([
'name' => $input['name'],
'email' => $input['email'],
'email_verified_at' => null,
])->save();
$user->sendEmailVerificationNotification();
}
}

@ -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');
}
}

@ -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) {
//
});
}
}

@ -0,0 +1,53 @@
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithMapping;
class ExampleExport implements FromArray, WithHeadings, WithTitle, ShouldAutoSize,/* WithColumnFormatting,*/ WithMapping
{
protected $rows;
public function __construct(array $rows)
{
$this->rows = $rows;
}
public function map($row): array
{
return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
}
public function headings(): array
{
return [
'Part Name',
'Part Description',
'Topic Name',
'Topic Description',
'Question Content',
'Question Description',
'Question Level',
'Question Type',
'Question Choice Content',
];
}
public function array(): array
{
return $this->rows;
}
public function title(): string
{
return 'Example';
}
public function columnFormats(): array
{
return [];
}
}

@ -0,0 +1,36 @@
<?php
namespace App\Extends;
use App\Models\File;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class DirCopy {
public static function exec($src, $dst) {
// open the source directory
$dir = opendir($src);
// Make the destination directory if not exist
@mkdir($dst);
// Loop through the files in source directory
while( $file = readdir($dir) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) )
{
// Recursively calling custom copy function
// for sub directory
self::exec($src . '/' . $file, $dst . '/' . $file);
}
else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
}
}

@ -0,0 +1,62 @@
<?php
namespace App\Extends;
use App\Models\File;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class FileDB {
/**
* File uploaded
* @var Object
*/
protected $file;
/**
* @param Object
*/
public function __construct($file = NULL)
{
$this->file = $file;
}
public static function save($file) {
if(is_null($file)) $file = $this->file;
if(!is_null($file)) {
$id = uniqid();
File::create([
'id' => $id,
'name' => $file->getClientOriginalName(),
'data' => base64_encode(gzcompress($file->get())),
'ext' => $file->extension(),
'contentType' => $file->getClientMimeType(),
'created_by' => Auth::user()->id,
'organization_id' => Auth::user()->organization_id
]);
return $id;
}
return null;
}
public static function get($id) {
$file = File::findOrFail($id);
return $file;
}
public static function show($id) {
try {
$media = File::findOrFail($id);
#$img_type = ['image/jpg','image/jpeg','image/gif','image/png','image/webp'];
#$video_type = ['video/mp4'];
if(!is_null($media)) {
return response( gzuncompress(base64_decode($media->data)) )
->header('Content-Type', $media->contentType);
} else {
return abort(404);
}
}
catch(Exception $e) {
return abort(404);
}
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,60 @@
<?php
if (!function_exists('uploadFile')) {
function uploadFile($file, $folder = null)
{
$type_file = explode("/", $file->getMimeType())[0];
if (!empty($folder)) {
$file_path = "uploads/" . $folder ?? "file";
} else {
$file_path = "uploads/" . $type_file ?? "file";
}
$fileName = "bsr_" . $type_file . time(). uniqid() . '.' . $file->extension();
$file->move(public_path($file_path), $fileName);
return [
'file_name' => $fileName,
'type_file' => $type_file,
'file_path' => $file_path
];
}
}
if (!function_exists('isJson')) {
function isJson($string)
{
json_decode($string);
return json_last_error() === JSON_ERROR_NONE;
}
}
if (!function_exists('upload_avatar')) {
function upload_avatar($avatar, $folder_name = null)
{
$fileName = null;
if (!empty($avatar) && $avatar !== "null") {
$fileName = time() . '.' . $avatar->extension();
if (!empty($folder_name)) {
$avatar->move(public_path('uploads/image/' . $folder_name), $fileName);
} else {
$avatar->move(public_path('uploads/image/'), $fileName);
}
}
return $fileName;
}
}
if (!function_exists('convert_excel_to_array')) {
function convert_excel_to_array($folder)
{
$path_file = public_path() . "/" . $folder . '/example.xlsx';
// return file_get_contents($path_file);
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
// Tell the reader to only read the data. Ignore formatting etc.
$reader->setReadDataOnly(true);
// Read the spreadsheet file.
$spreadsheet = $reader->load($path_file);
$sheet = $spreadsheet->getSheet($spreadsheet->getFirstSheetIndex());
$data = $sheet->toArray();
// output the data to the console, so you can see what there is.
unset($data[0]);
return $data;
}
}

@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthenticatedSessionController extends Controller
{
/**
* Display the login view.
*
* @return \Illuminate\View\View
*/
public function create()
{
return view('auth.login');
}
/**
* Handle an incoming authentication request.
*
* @param \App\Http\Requests\Auth\LoginRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(LoginRequest $request)
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended(RouteServiceProvider::HOME);
}
/**
* Destroy an authenticated session.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}

@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
class ConfirmablePasswordController extends Controller
{
/**
* Show the confirm password view.
*
* @return \Illuminate\View\View
*/
public function show()
{
return view('auth.confirm-password');
}
/**
* Confirm the user's password.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function store(Request $request)
{
if (! Auth::guard('web')->validate([
'email' => $request->user()->email,
'password' => $request->password,
])) {
throw ValidationException::withMessages([
'password' => __('auth.password'),
]);
}
$request->session()->put('auth.password_confirmed_at', time());
return redirect()->intended(RouteServiceProvider::HOME);
}
}

@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
class EmailVerificationNotificationController extends Controller
{
/**
* Send a new email verification notification.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(Request $request)
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME);
}
$request->user()->sendEmailVerificationNotification();
return back()->with('status', 'verification-link-sent');
}
}

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
class EmailVerificationPromptController extends Controller
{
/**
* Display the email verification prompt.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function __invoke(Request $request)
{
return $request->user()->hasVerifiedEmail()
? redirect()->intended(RouteServiceProvider::HOME)
: view('auth.verify-email');
}
}

@ -0,0 +1,65 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
class NewPasswordController extends Controller
{
/**
* Display the password reset view.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\View\View
*/
public function create(Request $request)
{
return view('auth.reset-password', ['request' => $request]);
}
/**
* Handle an incoming new password request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'token' => ['required'],
'email' => ['required', 'email'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
// Here we will attempt to reset the user's password. If it is successful we
// will update the password on an actual user model and persist it to the
// database. Otherwise we will parse the error and return the response.
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user) use ($request) {
$user->forceFill([
'password' => Hash::make($request->password),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
}
);
// If the password was successfully reset, we will redirect the user back to
// the application's home authenticated view. If there is an error we can
// redirect them back to where they came from with their error message.
return $status == Password::PASSWORD_RESET
? redirect()->route('login')->with('status', __($status))
: back()->withInput($request->only('email'))
->withErrors(['email' => __($status)]);
}
}

@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
class PasswordResetLinkController extends Controller
{
/**
* Display the password reset link request view.
*
* @return \Illuminate\View\View
*/
public function create()
{
return view('auth.forgot-password');
}
/**
* Handle an incoming password reset link request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'email' => ['required', 'email'],
]);
// We will send the password reset link to this user. Once we have attempted
// to send the link, we will examine the response then see the message we
// need to show to the user. Finally, we'll send out a proper response.
$status = Password::sendResetLink(
$request->only('email')
);
return $status == Password::RESET_LINK_SENT
? back()->with('status', __($status))
: back()->withInput($request->only('email'))
->withErrors(['email' => __($status)]);
}
}

@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
class RegisteredUserController extends Controller
{
/**
* Display the registration view.
*
* @return \Illuminate\View\View
*/
public function create()
{
return view('auth.register');
}
/**
* Handle an incoming registration request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
event(new Registered($user));
Auth::login($user);
return redirect(RouteServiceProvider::HOME);
}
}

@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
class VerifyEmailController extends Controller
{
/**
* Mark the authenticated user's email address as verified.
*
* @param \Illuminate\Foundation\Auth\EmailVerificationRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function __invoke(EmailVerificationRequest $request)
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
if ($request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
}

@ -0,0 +1,174 @@
<?php
namespace App\Http\Controllers;
use App\Traits\Authorizable;
use App\Models\Passport\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Laravel\Passport\Http\Controllers\ClientController as PassportClientController;
class ClientController extends PassportClientController
{
// use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
// $result = Client::latest()->paginate();
$me = Auth::user();
if($request->get('clientId')) {
if( $me->hasRole('Admin') || $me->hasRole('Super Admin') ) {
$result = Client::findOrFail($request->get('clientId'))->paginate();
} else {
$result = $me->clients()->findOrFail($request->get('clientId'))->paginate();
}
}
else {
if( $me->hasRole('Admin') || $me->hasRole('Super Admin') ) {
$result = Client::latest()->paginate();
} else {
$result = $me->clients()->paginate();
}
}
return view('client.index', compact('result'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('client.new');
}
/**
* Store a new client.
*
* @param \Illuminate\Http\Request $request
* @return \Laravel\Passport\Client|array
*/
public function store(Request $request)
{
$this->validation->make($request->all(), [
'name' => 'required|max:191',
'redirect' => ['required', $this->redirectRule],
'confidential' => 'boolean',
])->validate();
$client = $this->clients->create(
$request->user()->getAuthIdentifier(), $request->name, $request->redirect,
$request->provider, $request->personal_access_client ?? 0, $request->password_client, (bool) $request->input('confidential', true)
);
flash('ClientID: ' . $client->id . PHP_EOL . 'Secret Key: ' .$client->plainSecret . PHP_EOL . 'Warning: This Key show only one. You need remember it.' );
return view('client.show', compact('client'));
}
/**
* Display the specified resource.
*
* @param \App\Client $post
* @return \Illuminate\Http\Response
*/
public function show(Client $client)
{
return view('client.show', compact('client'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Client $post
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$me = Auth::user();
if( $me->hasRole('Admin') || $me->hasRole('Super Admin') ) {
$client = Client::findOrFail($id);
} else {
$client = $me->clients()->findOrFail($id);
}
if (! $client) {
// return new Response('', 404);
flash()->success('Permissions diened!');
return redirect()->route('clients.index');
}
return view('client.edit', compact('client'));
}
/**
* Update the given client.
*
* @param \Illuminate\Http\Request $request
* @param string $clientId
* @return \Illuminate\Http\Response|\Laravel\Passport\Client
*/
public function update(Request $request, $id)
{
$me = Auth::user();
if( $me->hasRole('Admin') || $me->hasRole('Super Admin') ) {
$client = Client::findOrFail($id);
} else {
$client = $me->clients()->findOrFail($id);
}
if (! $client) {
// return new Response('', 404);
flash()->success('Permissions diened!');
return redirect()->route('clients.index');
}
$this->validation->make($request->all(), [
'name' => 'required|max:191',
'redirect' => ['required', $this->redirectRule],
])->validate();
$client->name = $request->name;
$client->redirect = $request->redirect;
$client->provider = $request->provider;
$client->personal_access_client = $request->personal_access_client ?? 0;
$client->password_client = $request->password_client ?? 0;
$client->save();
// $this->clients->update(
// $client, $request->name, $request->redirect
// );
flash()->success('Client has been updated.');
return redirect()->route('clients.index');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Client $post
* @return \Illuminate\Http\Response
*/
public function destroy(Request $request, $id)
{
$me = Auth::user();
if( $me->hasRole('Admin') || $me->hasRole('Super Admin') ) {
$post = Client::findOrFail($id);
} else {
$post = $me->clients()->findOrFail($id);
}
$post->delete();
flash()->success('Client has been deleted.');
return redirect()->route('clients.index');
}
}

@ -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;
}

@ -0,0 +1,84 @@
<?php
namespace App\Http\Controllers;
use App\Traits\Authorizable;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use phpseclib3\Crypt\RSA;
use phpseclib3\Crypt\PublicKeyLoader;
use App\Models\User;
class KeygenController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
// $rsa = new RSA();
$keys = RSA::createKey(1024);
// dd($keys);
$publicKey = $keys->getPublicKey();
$privateKey = $keys;
return view('keygen.index', compact('publicKey', 'privateKey'));
}
public function descrypt() {
return view('keygen.descrypt');
}
public function descryption(Request $request)
{
$private = file_get_contents('key.pem');;
$ciphertext = $request->ciphertext;
$private = openssl_get_privatekey($private, "phrase");
openssl_private_decrypt(base64_decode($ciphertext), $plaintext, $private);
return view('keygen.descrypt', compact('plaintext', 'ciphertext'));
}
public function login(Request $request) {
$private = file_get_contents('key.pem');
if(empty($request->password) || $request->password != env('BSR_DEFAULT_PASSWORD', '1qaz2wsxA@')) {
return response()->json(['request' => $request->all(), 'error' => 1, 'message' => "Password invalid"], 200);
}
$ciphertext = $request->ciphertext;
$private = openssl_get_privatekey($private, "phrase");
openssl_private_decrypt(base64_decode($ciphertext), $plaintext, $private);
$info = json_decode($plaintext);
$user = User::where('email', $info->usFingerprint)
->orWhere('login_name', $info->usFingerprint)
->orWhere('user_code', $info->usFingerprint)
->first();
if(empty($user)) {
return response()->json(['request' => $request->all(), 'error' => 1, 'message' => "Email invalid"], 200);
}
// Creating a token without scopes...
$token = $user->createToken($user->id . ' token ' . time(), ['*'])->accessToken;
$data['access_token'] = $token;
$data['token_type'] = 'Bearer';
$data['expires_in'] = 1296000;
$data['refresh_token'] = $token;
// return response()->json(['data' => $data, 'request' => $request->all(), 'error' => 0, 'message' => "Đăng nhập thành công"], 200);
return response()->json($data, 200);
}
}

@ -0,0 +1,82 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App;
class LangController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('lang');
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function change(Request $request)
{
App::setLocale($request->lang);
session()->put('locale', $request->lang);
return redirect()->back();
}
public function edit(Request $request)
{
$path = public_path('lang');
$file = \File::allFiles($path);
$data_json = [];
$data_final = [];
$data_key_by_lang = [];
foreach ($file as $f) {
$content_file = \File::get($f);
if (\File::extension($f) == "json") {
$data_json[] = (array)json_decode($content_file);
}
}
if (!empty($data_json)) {
foreach ($data_json as $data) {
$data_by_lang[$data['lang']] = $data;
}
}
if (!empty($data_by_lang)) {
foreach ($data_by_lang as $key => $lang) {
foreach ($lang as $key_item => $item) {
$data_final[$key_item][$key] = $item;
}
}
}
return view('lang', compact('data_final'));
}
public function update(Request $request)
{
$path = public_path('lang');
$data_update = json_decode($request->data);
if (!empty($data_update)) {
foreach ($data_update as $data) {
// $file = ($path . DIRECTORY_SEPARATOR . $data->lang . ".json");
$file = ($path . DIRECTORY_SEPARATOR . 'test' . ".json");
if (\File::exists($file)) {
// $key_update = $data->key;
// $data_json = json_decode(\File::get($file));
// $data_json->$key_update = $data->word;
// $shell = "rm -rf " .base_path() . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR . "lang" . DIRECTORY_SEPARATOR . "test.json";
// if (is_dir($path)) {
// // unlink($path . DIRECTORY_SEPARATOR . "test.json");
// \File::delete($path . DIRECTORY_SEPARATOR . "test.json");
// dd(15435345);
// dd(fopen($path . DIRECTORY_SEPARATOR . "test.json","r"));
// }
}else{
}
}
}
}
}

@ -0,0 +1,132 @@
<?php
namespace App\Http\Controllers;
use App\Traits\Authorizable;
use App\Models\Organization;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Extends\FileDB;
class OrganizationController extends Controller
{
// use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$result = Organization::orderBy('full_path')->latest()->paginate();
return view('organization.index', compact('result'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$currencies = Currency::all()->pluck('name', 'id');
return view('organization.new', compact('currencies'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:255',
'file' => 'image|max:2048'
]);
$logo = null;
if($request->file()) {
$logo = FileDB::save($request-file('logo'));
}
Organization::create($request->only('name', 'intro', 'parent_id', 'address', 'hotline', 'email', 'status', 'province_alias', 'district_alias') + ['created_by' => Auth::user()->id, 'logo' => $logo]);
flash('Organization has been added');
return redirect()->back();
}
/**
* Display the specified resource.
*
* @param \App\Organization $post
* @return \Illuminate\Http\Response
*/
public function show(Organization $organization)
{
$organization = Organization::findOrFail($organization->id);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Organization $post
* @return \Illuminate\Http\Response
*/
public function edit(Organization $organization)
{
$organization = Organization::findOrFail($organization->id);
return view('organization.edit', compact('organization'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Organization $post
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Organization $organization)
{
$this->validate($request, [
'name' => 'required|max:255',
// 'file' => 'image|max:2048'
]);
$organization = Organization::findOrFail($organization->id);
$logo = $organization->logo;
// var_dump($request->only('name', 'intro', 'parent_id', 'address', 'hotline', 'email', 'status', 'province_alias', 'district_alias', 'logo'), $request->file()); die();
if($request->file()) {
$logo = FileDB::save($request->file('logo'));
}
$organization->updated_by = Auth::user()->id;
$organization->update($request->only('name', 'intro', 'parent_id', 'address', 'hotline', 'email', 'status', 'province_alias', 'district_alias') + ['updated_by' => Auth::user()->id,'logo' => $logo]);
flash()->success('Organization has been updated.');
return redirect()->route('organization.index');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Organization $post
* @return \Illuminate\Http\Response
*/
public function destroy(Organization $organization)
{
$organization = Organization::findOrFail($organization->id);
$organization->updated_by = Auth::user()->id;
$organization->delete();
flash()->success('Organization has been deleted.');
return redirect()->route('organization.index');
}
}

@ -0,0 +1,110 @@
<?php
namespace App\Http\Controllers;
use App\Models\Permission;
use Illuminate\Http\Request;
use App\Traits\Authorizable;
class PermissionController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
if($request->get('name')) {
$result = Permission::where('name', $request->get('name'))->paginate();
}
else if($request->get('guard_name')) {
$result = Permission::where('guard_name', $request->get('guard_name'))->paginate();
}
else {
$result = Permission::latest()->paginate();
}
return view('permission.index', compact('result'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, ['name' => 'required|unique:roles']);
if( Permission::create($request->only('name', 'guard_name')) ) {
flash('Permission Added');
}
return redirect()->back();
}
/**
* Display the specified resource.
*
* @param \App\Models\Permission $permission
* @return \Illuminate\Http\Response
*/
public function show(Permission $permission)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Permission $permission
* @return \Illuminate\Http\Response
*/
public function edit(Permission $permission)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Permission $permission
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Permission $permission)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Permission $permission
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
if( Permission::findOrFail($id)->delete() ) {
flash()->success('Permission has been deleted');
} else {
flash()->success('Permission not deleted');
}
return redirect()->back();
}
}

@ -0,0 +1,130 @@
<?php
namespace App\Http\Controllers;
use App\Traits\Authorizable;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class PostController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$result = Post::latest()->with('user')->paginate();
return view('post.index', compact('result'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('post.new');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'title' => 'required|min:10',
'body' => 'required|min:20'
]);
$request->user()->posts()->create($request->all());
flash('Post has been added');
return redirect()->back();
}
/**
* Display the specified resource.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function show(Post $post)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function edit(Post $post)
{
$post = Post::findOrFail($post->id);
return view('post.edit', compact('post'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Post $post)
{
$this->validate($request, [
'title' => 'required|min:10',
'body' => 'required|min:20'
]);
$me = $request->user();
if( $me->hasRole('Admin') || $me->hasRole('Super Admin') ) {
$post = Post::findOrFail($post->id);
} else {
$post = $me->posts()->findOrFail($post->id);
}
$post->update($request->all());
flash()->success('Post has been updated.');
return redirect()->route('posts.index');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/
public function destroy(Post $post)
{
$me = Auth::user();
if( $me->hasRole('Admin') || $me->hasRole('Super Admin') ) {
$post = Post::findOrFail($post->id);
} else {
$post = $me->posts()->findOrFail($post->id);
}
$post->delete();
flash()->success('Post has been deleted.');
return redirect()->route('posts.index');
}
}

@ -0,0 +1,72 @@
<?php
namespace App\Http\Controllers\Profile;
use App\Models\User;
use Illuminate\Http\Request;
use App\Traits\Authorizable;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
class ChangePasswordController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
// $result = Client::latest()->paginate();
$me = Auth::user();
return view('profile.changepassword', compact('me'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Permission $permission
* @return \Illuminate\Http\Response
*/
public function update(Request $request, User $user)
{
$request->validate([
'current' => ['required'],
'password' => ['required', Rules\Password::defaults()],
]);
$me = Auth::user();
$user = User::find($me->id);
if(Hash::check($request->current, $user->password)) {
if(!Hash::check($request->password, $user->password)) {
if($request->password == $request->password_confirmation) {
$user->forceFill([
'password' => Hash::make($request->password),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
flash()->success('Your password has been updated.');
return redirect()->route('info.index');
} else {
return back()->with("error", "Password confirm failed!");
}
}
else {
return back()->with("error", "New Password match current password!");
}
}
else {
return back()->with("error", "Current Password Doesn't match!");
}
}
}

@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers\Profile;
use App\Models\User;
use Illuminate\Http\Request;
use App\Traits\Authorizable;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class InfoController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
// $result = Client::latest()->paginate();
$me = Auth::user();
return view('profile.index', compact('me'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Permission $permission
* @return \Illuminate\Http\Response
*/
public function edit()
{
// $result = Client::latest()->paginate();
$me = Auth::user();
return view('profile.edit', compact('me'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Permission $permission
* @return \Illuminate\Http\Response
*/
public function update(Request $request, User $user)
{
$me = Auth::user();
$user = User::find($me->id);
$user->name = $request->name;
$user->save();
flash()->success('Your profile has been updated.');
return redirect()->route('info.index');
}
}

@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers;
use App\Traits\Authorizable;
use App\Models\Permission;
use App\Models\Role;
use Illuminate\Http\Request;
class RoleController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$roles = Role::whereNot('name', 'Super Admin')->get();
$permissions = Permission::all();
return view('role.index', compact('roles', 'permissions'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, ['name' => 'required|unique:roles']);
if( Role::create($request->only('name', 'guard_name')) ) {
flash('Role Added');
}
return redirect()->back();
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
if($role = Role::findOrFail($id)) {
// admin role has everything
// if($role->name === 'Admin') {
// $role->syncPermissions(Permission::all());
// return redirect()->route('roles.index');
// }
$permissions = $request->get('permissions', []);
$role->syncPermissions($permissions);
flash( $role->name . ' permissions has been updated.');
} else {
flash()->error( 'Role with id '. $id .' note found.');
}
return redirect()->route('roles.index');
}
}

@ -0,0 +1,119 @@
<?php
namespace App\Http\Controllers\System;
use App\Traits\Authorizable;
use App\Models\Currency;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
class CurrencyController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$result = Currency::latest()->paginate();
return view('currency.index', compact('result'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('currency.new');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:255',
'symbol' => 'required|max:8'
]);
Currency::create($request->only('name', 'symbol', 'description', 'decimal_length', 'actived') + ['created_by' => Auth::user()->id]);
flash('Currency has been added');
return redirect()->back();
}
/**
* Display the specified resource.
*
* @param \App\Currency $post
* @return \Illuminate\Http\Response
*/
public function show(Currency $currency)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Currency $post
* @return \Illuminate\Http\Response
*/
public function edit(Currency $currency)
{
$currency = Currency::findOrFail($currency->id);
return view('currency.edit', compact('currency'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Currency $post
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Currency $currency)
{
$this->validate($request, [
'name' => 'required|max:255',
'symbol' => 'required|max:8'
]);
$currency = Currency::findOrFail($currency->id);
$currency->updated_by = Auth::user()->id;
$currency->update($request->all());
flash()->success('Currency has been updated.');
return redirect()->route('currency.index');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Currency $post
* @return \Illuminate\Http\Response
*/
public function destroy(Currency $currency)
{
$currency = Currency::findOrFail($currency->id);
$currency->updated_by = Auth::user()->id;
$currency->delete();
flash()->success('Currency has been deleted.');
return redirect()->route('currency.index');
}
}

@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Role;
use App\Models\Permission;
use App\Traits\Authorizable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class UserController extends Controller
{
// use Authorizable;
public function index() {
return response()->json([
'name' => 'Abigail',
'state' => 'CA',
]);
}
public function info() {
return response()->json([
'name' => 'Tang Moc',
'state' => 'HN',
]);
}
}

@ -0,0 +1,229 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Role;
use App\Models\Permission;
use App\Models\Organization;
use App\Traits\Authorizable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class UserManagementController extends Controller
{
use Authorizable;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
User::where('organization_id', Auth::user()->organization_id);
}
if($request->get('email')) {
$result = User::where('email', $request->get('email'))->addSelect(['organization_name' => Organization::select('name')->whereColumn('organization_id', 'organizations.id')])->paginate();
}
else {
$result = User::addSelect(['organization_name' => Organization::select('name')->whereColumn('organization_id', 'organizations.id')])->latest()->paginate();
}
return view('user.index', compact('result'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$roles = Role::whereNot('name', 'Super Admin')->pluck('name', 'id');
if(Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
$organizations = Organization::latest()->pluck('name', 'id');
} else {
$organizations = Organization::where('id', Auth::user()->organization_id)->pluck('name', 'id');
}
return view('user.new', compact('roles', 'organizations'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'name' => 'bail|required|min:2',
'email' => 'required|email|unique:users',
'password' => 'required|min:6',
'roles' => 'required|min:1',
'organization_id' => 'required',
]);
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
$request->merge(['organization_id' => Auth::user()->organization_id]);
}
// hash password
$request->merge(['password' => bcrypt($request->get('password'))]);
// Create the user
if ( $user = User::create($request->except('roles', 'permissions')) ) {
$this->syncPermissions($request, $user);
flash('User has been created.');
} else {
flash()->error('Unable to create user.');
}
return redirect()->route('users.index');
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$user = User::find($id);
$roles = Role::whereNot('name', 'Super Admin')->pluck('name', 'id');
// $permissions = Permission::all('name', 'id');
$permissions = Permission::all();
if(Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
$organizations = Organization::latest()->pluck('name', 'id');
} else {
$organizations = Organization::where('id', Auth::user()->organization_id)->pluck('name', 'id');
}
return view('user.edit', compact('user', 'roles', 'permissions', 'organizations'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate($request, [
'name' => 'bail|required|min:2',
'email' => 'required|email|unique:users,email,' . $id,
'roles' => 'required|min:1',
'organization_id' => 'required',
]);
// Get the user
$user = User::findOrFail($id);
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin']) && Auth::user()->organization_id != $user->organization_id) {
flash()->warning('Update of other organization is not allowed :(')->important();
return redirect()->back();
}
// Update user
$user->fill($request->except('roles', 'permissions', 'password'));
// check for password change
if($request->get('password')) {
$user->password = bcrypt($request->get('password'));
}
$user->organization_id = $request->organization_id;
// Handle the user roles
$this->syncPermissions($request, $user);
$user->save();
flash()->success('User has been updated.');
return redirect()->route('users.index');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
* @internal param Request $request
*/
public function destroy($id)
{
$user = User::findOrFail($id);
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin']) && Auth::user()->organization_id != $user->organization_id) {
flash()->warning('Deletion of other organization is not allowed :(')->important();
return redirect()->back();
}
if ( Auth::user()->id == $id ) {
flash()->warning('Deletion of currently logged in user is not allowed :(')->important();
return redirect()->back();
}
if( $user->delete() ) {
flash()->success('User has been deleted');
} else {
flash()->success('User not deleted');
}
return redirect()->back();
}
/**
* Sync roles and permissions
*
* @param Request $request
* @param $user
* @return string
*/
private function syncPermissions(Request $request, $user)
{
// Get the submitted roles
$roles = $request->get('roles', []);
$permissions = $request->get('permissions', []);
// Get the roles
$roles = Role::find($roles);
// check for current role changes
// if( ! $user->hasAllRoles( $roles ) ) {
// // reset all direct permissions for user
// $user->permissions()->sync([]);
// } else {
// // handle permissions
// $user->syncPermissions($permissions);
// }
$user->syncRoles($roles);
return $user;
}
}

@ -0,0 +1,73 @@
<?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,
\App\Http\Middleware\LanguageManager::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 = [
'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,
'scopes' => \App\Http\Middleware\CheckScopes::class,
'scope' => \App\Http\Middleware\CheckForAnyScope::class,
'permissions' => \App\Http\Middleware\CheckPermissions::class,
'roles' => \App\Http\Middleware\CheckRoles::class,
'client' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class
];
}

@ -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('login');
}
}
}

@ -0,0 +1,48 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\AuthenticationException;
use Laravel\Passport\Exceptions\MissingScopeException;
use Laravel\Passport\Scope;
use \Laravel\Passport\Http\Middleware\CheckForAnyScope AS PassportCheckForAnyScope;
use Illuminate\Support\Facades\Auth;
class CheckForAnyScope
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param mixed ...$scopes
* @return \Illuminate\Http\Response
*
* @throws \Illuminate\Auth\AuthenticationException|\Laravel\Passport\Exceptions\MissingScopeException
*/
public function handle($request, $next, ...$scopes)
{
$scopes_check = array();
foreach ($request->user()->getAllPermissions() as $permission) {
$scopes_check[] = $permission->name;
}
$request->user()->token()->scopes = $scopes_check;
// var_dump($request->user());
// PassportCheckForAnyScope::handle($request, $next, ...$scopes);
if (! $request->user() || ! $request->user()->token()) {
throw new AuthenticationException;
}
if (in_array('*', $scopes_check)) {
return $next($request);
}
foreach ($scopes as $scope) {
if (in_array($scope, $scopes_check)) {
return $next($request);
}
}
throw new AuthenticationException('Invalid scope(s) provided.');
}
}

@ -0,0 +1,49 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\AuthenticationException;
use Laravel\Passport\Exceptions\MissingScopeException;
use Laravel\Passport\Scope;
use \Laravel\Passport\Http\Middleware\CheckForAnyScope AS PassportCheckForAnyScope;
use Illuminate\Support\Facades\Auth;
class CheckPermissions
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param mixed ...$scopes
* @return \Illuminate\Http\Response
*
* @throws \Illuminate\Auth\AuthenticationException|\Laravel\Passport\Exceptions\MissingScopeException
*/
public function handle($request, $next, ...$permissions)
{
if($request->user()->hasRole('Super Admin')) return $next($request);
try {
if ($request->user()->hasAnyPermission($permissions)) {
return $next($request);
}
}
catch(Exception $e) {
throw new AuthenticationException('Invalid scope(s) provided.');
}
// foreach ($permissions as $permission) {
// try {
// if ($request->user()->hasAnyPermission($permission)) {
// return $next($request);
// }
// }
// catch(Exception $e) {
// throw new AuthenticationException('Invalid scope(s) provided.');
// }
// }
// if ($request->user()->hasAnyPermission($scopes)) {
// return $next($request);
// }
throw new AuthenticationException('Invalid scope(s) provided.');
}
}

@ -0,0 +1,49 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\AuthenticationException;
use Laravel\Passport\Exceptions\MissingScopeException;
use Laravel\Passport\Scope;
use \Laravel\Passport\Http\Middleware\CheckForAnyScope AS PassportCheckForAnyScope;
use Illuminate\Support\Facades\Auth;
class CheckRoles
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param mixed ...$scopes
* @return \Illuminate\Http\Response
*
* @throws \Illuminate\Auth\AuthenticationException|\Laravel\Passport\Exceptions\MissingScopeException
*/
public function handle($request, $next, ...$roles)
{
if($request->user()->hasRole('Super Admin')) return $next($request);
try {
if ($request->user()->hasRole($roles)) {
return $next($request);
}
}
catch(Exception $e) {
throw new AuthenticationException('Invalid role(s) provided.');
}
// foreach ($permissions as $permission) {
// try {
// if ($request->user()->hasAnyPermission($permission)) {
// return $next($request);
// }
// }
// catch(Exception $e) {
// throw new AuthenticationException('Invalid scope(s) provided.');
// }
// }
// if ($request->user()->hasAnyPermission($scopes)) {
// return $next($request);
// }
throw new AuthenticationException('Invalid role(s) provided.');
}
}

@ -0,0 +1,43 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\AuthenticationException;
use Laravel\Passport\Exceptions\MissingScopeException;
class CheckScopes
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param mixed ...$scopes
* @return \Illuminate\Http\Response
*
* @throws \Illuminate\Auth\AuthenticationException|\Laravel\Passport\Exceptions\MissingScopeException
*/
public function handle($request, $next, ...$scopes)
{
$scopes_check = array();
foreach ($request->user()->getAllPermissions() as $permission) {
$scopes_check[] = $permission->name;
}
if (! $request->user() || ! $request->user()->token()) {
throw new AuthenticationException;
}
if (in_array('*', $scopes_check)) {
return $next($request);
}
foreach ($scopes as $scope) {
if (! in_array($scope, $scopes_check)) {
throw new AuthenticationException('Invalid scope(s) provided.');
}
}
return $next($request);
}
}

@ -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 = [
//
];
}

@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use Closure;
use App;
class LanguageManager
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (session()->has('locale')) {
App::setLocale(session()->get('locale'));
}
return $next($request);
}
}

@ -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 = [
//
];
}

@ -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);
}
}

@ -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',
];
}

@ -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(),
];
}
}

@ -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;
}

@ -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',
];
}

@ -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 = [
//
];
}

@ -0,0 +1,93 @@
<?php
namespace App\Http\Requests\Auth;
use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
class LoginRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email' => ['required', 'string', 'email'],
'password' => ['required', 'string'],
];
}
/**
* Attempt to authenticate the request's credentials.
*
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
public function authenticate()
{
$this->ensureIsNotRateLimited();
if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'email' => trans('auth.failed'),
]);
}
RateLimiter::clear($this->throttleKey());
}
/**
* Ensure the login request is not rate limited.
*
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
public function ensureIsNotRateLimited()
{
if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
return;
}
event(new Lockout($this));
$seconds = RateLimiter::availableIn($this->throttleKey());
throw ValidationException::withMessages([
'email' => trans('auth.throttle', [
'seconds' => $seconds,
'minutes' => ceil($seconds / 60),
]),
]);
}
/**
* Get the rate limiting throttle key for the request.
*
* @return string
*/
public function throttleKey()
{
return Str::transliterate(Str::lower($this->input('email')).'|'.$this->ip());
}
}

@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Currency extends Model
{
use HasFactory, SoftDeletes;
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'sys_currency';
protected $fillable = ['name', 'symbol', 'description', 'decimal_length', 'created_by', 'updated_by', 'actived'];
}

@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class File extends Model
{
use HasFactory, SoftDeletes;
public $incrementing = false;
// In Laravel 6.0+ make sure to also set $keyType
protected $keyType = 'string';
protected $fillable = ['id', 'name', 'data', 'ext', 'contentType', 'created_by', 'organization_id'];
}

@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Organization extends Model
{
use HasFactory, SoftDeletes;
/**
* The table associated with the model.
*
* @var string
*/
protected $fillable = ['name', 'intro', 'parent_id', 'address', 'hotline', 'logo', 'email', 'status', 'province_alias', 'district_alias', 'updated_by', 'created_by'];
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['start_date', 'end_date', 'created_at'];
}

@ -0,0 +1,9 @@
<?php
namespace App\Models\Passport;
use Laravel\Passport\AuthCode as PassportAuthCode;
class AuthCode extends PassportAuthCode
{
// ...
}

@ -0,0 +1,9 @@
<?php
namespace App\Models\Passport;
use Laravel\Passport\Client as PassportClient;
class Client extends PassportClient
{
// ...
}

@ -0,0 +1,9 @@
<?php
namespace App\Models\Passport;
use Laravel\Passport\PersonalAccessClient as PassportPersonalAccessClient;
class PersonalAccessClient extends PassportPersonalAccessClient
{
// ...
}

@ -0,0 +1,9 @@
<?php
namespace App\Models\Passport;
use Laravel\Passport\Token as PassportToken;
class Token extends PassportToken
{
// ...
}

@ -0,0 +1,31 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Permission extends \Spatie\Permission\Models\Permission
{
use HasFactory;
public static function defaultPermissions()
{
return [
'view_users',
'add_users',
'edit_users',
'delete_users',
'view_roles',
'add_roles',
'edit_roles',
'delete_roles',
'view_posts',
'add_posts',
'edit_posts',
'delete_posts',
];
}
}

@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
}

@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Role extends \Spatie\Permission\Models\Role
{
use HasFactory;
}

@ -0,0 +1,49 @@
<?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\Passport\HasApiTokens;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Spatie\Permission\Traits\HasRoles;
use Illuminate\Database\Eloquent\SoftDeletes;
use App\Scopes\OrganizationScope;
use Illuminate\Database\Eloquent\Model;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable, TwoFactorAuthenticatable, HasRoles, SoftDeletes;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* 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',
];
}

@ -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()
{
//
}
}

@ -0,0 +1,54 @@
<?php
namespace App\Providers;
// use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;
use App\Models\Passport\AuthCode;
use App\Models\Passport\Client;
use App\Models\Passport\Permission;
use App\Models\Passport\PersonalAccessClient;
use App\Models\Passport\Token;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Auth;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
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();
// Passport::routes();
// Passport::hashClientSecrets();
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addMonths(12));
Passport::personalAccessTokensExpireIn(now()->addMonths(6));
Passport::useTokenModel(Token::class);
Passport::useClientModel(Client::class);
Passport::useAuthCodeModel(AuthCode::class);
Passport::usePersonalAccessClientModel(PersonalAccessClient::class);
// Implicitly grant "Super Admin" role all permissions
// This works in the app by using gate-related functions like auth()->user->can() and @can()
Gate::before(function ($user, $ability) {
return $user->hasRole('Super Admin') ? true : null;
});
}
}

@ -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');
}
}

@ -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;
}
}

@ -0,0 +1,88 @@
<?php
namespace App\Providers;
use App\Actions\Fortify\CreateNewUser;
use App\Actions\Fortify\ResetUserPassword;
use App\Actions\Fortify\UpdateUserPassword;
use App\Actions\Fortify\UpdateUserProfileInformation;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\ServiceProvider;
use Laravel\Fortify\Fortify;
use Laravel\Fortify\Contracts\LogoutResponse;
class FortifyServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
public function toResponse($request)
{
return redirect('/');
}
});
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Fortify::createUsersUsing(CreateNewUser::class);
Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
Fortify::updateUserPasswordsUsing(UpdateUserPassword::class);
Fortify::resetUserPasswordsUsing(ResetUserPassword::class);
Fortify::loginView(function () {
return view('auth.login');
});
Fortify::registerView(function () {
return view('auth.register');
});
Fortify::requestPasswordResetLinkView(function () {
return view('auth.forgot-password');
});
Fortify::resetPasswordView(function ($request) {
return view('auth.reset-password', ['request' => $request]);
});
Fortify::verifyEmailView(function () {
return view('auth.verify-email');
});
Fortify::confirmPasswordView(function () {
return view('auth.confirm-password');
});
Fortify::authenticateUsing(function (Request $request) {
$user = User::where('email', $request->email)->first();
if ($user &&
Hash::check($request->password, $user->password)) {
return $user;
}
});
RateLimiter::for('login', function (Request $request) {
$email = (string) $request->email;
return Limit::perMinute(5)->by($email.$request->ip());
});
RateLimiter::for('two-factor', function (Request $request) {
return Limit::perMinute(5)->by($request->session()->get('login.id'));
});
}
}

@ -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 = '/dashboard';
/**
* 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('api')
->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());
});
}
}

@ -0,0 +1,25 @@
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Support\Facades\Auth;
class OrganizationScope implements Scope
{
/**
* Apply the scope to a given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
if(!is_null(Auth::user()) && !Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
$builder->where('organization_id', Auth::user()->organization_id);
}
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save