parent
c9d88caaa6
commit
0762f95efd
9617 changed files with 1523564 additions and 0 deletions
@ -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}" |
||||
|
@ -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…
Reference in new issue