diff --git a/src/app/Domain/Shared/Exceptions/AppException.php b/src/app/Domain/Shared/Exceptions/AppException.php new file mode 100644 index 0000000..660ddd0 --- /dev/null +++ b/src/app/Domain/Shared/Exceptions/AppException.php @@ -0,0 +1,73 @@ +errorSlug = $errorSlug; + parent::__construct($message, $code, $previous); + } + + public function getSlug(): string + { + return $this->errorSlug; + } + + public function toArray() + { + $data = [ + 'timestamp' => Carbon::now(), + 'error' => $this->getSlug(), + 'status' => $this->getCode(), + 'message' => $this->getMessage(), + ]; + + if (!app()->environment('production') || config('app.debug')) { + $data['trace'] = $this->getTrace(); + + if ($prev = $this->getPrevious()) { + $data['previous'] = [ + 'code' => $prev->getCode(), + 'message' => $prev->getMessage(), + 'trace' => $prev->getTrace() + ]; + } + } + + return $data; + } + + public function render(): JsonResponse + { + return response()->json( + $this->toArray(), + $this->getCode() ?: 500 + ); + } + + public static function new( + string $slug, + string $message, + int $code = 500, + Throwable|null $previous = null + ): never { + throw new self($slug, $message, $code, $previous); + } +} \ No newline at end of file diff --git a/src/app/Http/Controllers/UserController.php b/src/app/Http/Controllers/UserController.php index cde64ea..4601eb7 100644 --- a/src/app/Http/Controllers/UserController.php +++ b/src/app/Http/Controllers/UserController.php @@ -6,5 +6,8 @@ namespace App\Http\Controllers; class UserController extends Controller { - // + public function index() + { + return view('user.index', []); + } } diff --git a/src/app/Http/Middleware/CheckRoleMiddleware.php b/src/app/Http/Middleware/CheckRoleMiddleware.php new file mode 100644 index 0000000..05264aa --- /dev/null +++ b/src/app/Http/Middleware/CheckRoleMiddleware.php @@ -0,0 +1,45 @@ +auth->user(); + + if (!$user) { + AppException::new('UNAUTHORIZED', 'UNAUTHORIZED', Response::HTTP_UNAUTHORIZED); + } + + $userRole = $user->load('role')->role(); + + $hasRole = $userRole->whereIn('code', $roles) + ->count(); + + if (!$hasRole) { + AppException::new('forbidden', 'Недостаточно прав'); + } + + return $next($request); + } +} diff --git a/src/app/Models/User.php b/src/app/Models/User.php index f010c99..12aecd9 100644 --- a/src/app/Models/User.php +++ b/src/app/Models/User.php @@ -12,6 +12,16 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +/** + * @property string $uuid + * @property string $name + * @property string $email + * @property string $password + * @property string $role_uuid + * @property Carbon $created_at + * @property Carbon $updated_at + * @property-read Role $role + */ class User extends Authenticatable { /** @use HasFactory<\Database\Factories\UserFactory> */ diff --git a/src/bootstrap/app.php b/src/bootstrap/app.php index fa3eb42..62a8da4 100644 --- a/src/bootstrap/app.php +++ b/src/bootstrap/app.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use App\Http\Middleware\CheckRoleMiddleware; use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware; @@ -13,7 +14,9 @@ return Application::configure(basePath: dirname(__DIR__)) health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { - // + $middleware->alias([ + 'role' => CheckRoleMiddleware::class, + ]); }) ->withExceptions(function (Exceptions $exceptions): void { // diff --git a/src/resources/views/auth/login.blade.php b/src/resources/views/auth/login.blade.php index bc97756..f604c0e 100644 --- a/src/resources/views/auth/login.blade.php +++ b/src/resources/views/auth/login.blade.php @@ -1,47 +1,56 @@ @extends('layouts.default') @section('content') -
- @csrf - - -
- - - @error('email') -

{{ $message }}

- @enderror +
+
+

+ Вход в систему +

+ + @csrf - -
- - - @error('password') -

{{ $message }}

- @enderror -
+ +
+ + + @error('email') +

{{ $message }}

+ @enderror +
- -
- -
- + +
+ + + @error('password') +

{{ $message }}

+ @enderror +
+ + +
+ +
+ +
@endsection \ No newline at end of file diff --git a/src/resources/views/dashboard.blade.php b/src/resources/views/dashboard.blade.php index fdd696e..569302f 100644 --- a/src/resources/views/dashboard.blade.php +++ b/src/resources/views/dashboard.blade.php @@ -1,10 +1,5 @@ -@extends ('layouts.default') +@extends ('layouts.app') @section ('content')

dashboard

- -
- @csrf - -
-@endsection \ No newline at end of file +@endsection diff --git a/src/resources/views/layouts/app.blade.php b/src/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..954e491 --- /dev/null +++ b/src/resources/views/layouts/app.blade.php @@ -0,0 +1,16 @@ + + + + @include('layouts.partials.head') + + +
+
+ @include('layouts.partials.app-header') +
+ @yield('content') +
+
+
+ + \ No newline at end of file diff --git a/src/resources/views/layouts/default.blade.php b/src/resources/views/layouts/default.blade.php index 4dd3ff5..cb35cfd 100644 --- a/src/resources/views/layouts/default.blade.php +++ b/src/resources/views/layouts/default.blade.php @@ -3,6 +3,8 @@ @include('layouts.partials.head') - - @yield('content') + +
+ @yield('content') +
\ No newline at end of file diff --git a/src/resources/views/layouts/partials/app-header.blade.php b/src/resources/views/layouts/partials/app-header.blade.php new file mode 100644 index 0000000..7f27a61 --- /dev/null +++ b/src/resources/views/layouts/partials/app-header.blade.php @@ -0,0 +1,11 @@ +
+ +
+ @csrf + +
+
diff --git a/src/resources/views/user/index.blade.php b/src/resources/views/user/index.blade.php new file mode 100644 index 0000000..fb54acb --- /dev/null +++ b/src/resources/views/user/index.blade.php @@ -0,0 +1,5 @@ +@extends ('layouts.app') + +@section ('content') +

Users index

+@endsection diff --git a/src/routes/web.php b/src/routes/web.php index 85dfa6d..c239adf 100644 --- a/src/routes/web.php +++ b/src/routes/web.php @@ -3,6 +3,7 @@ declare(strict_types=1); use App\Http\Controllers\DashboardController; +use App\Http\Controllers\UserController; use Illuminate\Support\Facades\Route; Route::get('/', function () { @@ -10,5 +11,9 @@ Route::get('/', function () { }); Route::middleware(['auth', 'verified'])->group(function () { - Route::get('/dashboard', [DashboardController::class, 'index']); + Route::get('/dashboard', [DashboardController::class, 'index']) + ->name('dashboard'); + Route::get('/users', [UserController::class, 'index']) + ->name('user.index') + ->middleware('role:admin'); });