diff --git a/app/Containers/Dashboard/Actions/Roles/CreateRoleAction.php b/app/Containers/Dashboard/Actions/Roles/CreateRoleAction.php new file mode 100644 index 0000000..ac6035d --- /dev/null +++ b/app/Containers/Dashboard/Actions/Roles/CreateRoleAction.php @@ -0,0 +1,19 @@ + $data['name']]); + + if (!empty($data['permissions'])) { + $role->syncPermissions($data['permissions']); + } + + return $role; + } +} diff --git a/app/Containers/Dashboard/Actions/Roles/DeleteRoleAction.php b/app/Containers/Dashboard/Actions/Roles/DeleteRoleAction.php new file mode 100644 index 0000000..ca27793 --- /dev/null +++ b/app/Containers/Dashboard/Actions/Roles/DeleteRoleAction.php @@ -0,0 +1,13 @@ +delete(); + } +} diff --git a/app/Containers/Dashboard/Actions/Roles/ListRolesAction.php b/app/Containers/Dashboard/Actions/Roles/ListRolesAction.php new file mode 100644 index 0000000..5051520 --- /dev/null +++ b/app/Containers/Dashboard/Actions/Roles/ListRolesAction.php @@ -0,0 +1,17 @@ +orderBy('name')->get(); + + return [ + 'roles' => $roles, + ]; + } +} diff --git a/app/Containers/Dashboard/Actions/Roles/UpdateRoleAction.php b/app/Containers/Dashboard/Actions/Roles/UpdateRoleAction.php new file mode 100644 index 0000000..7d4f8b1 --- /dev/null +++ b/app/Containers/Dashboard/Actions/Roles/UpdateRoleAction.php @@ -0,0 +1,17 @@ +update(['name' => $data['name']]); + + $role->syncPermissions($data['permissions'] ?? []); + + return $role; + } +} diff --git a/app/Containers/Dashboard/UI/WEB/Controllers/RolesController.php b/app/Containers/Dashboard/UI/WEB/Controllers/RolesController.php new file mode 100644 index 0000000..2a0eaba --- /dev/null +++ b/app/Containers/Dashboard/UI/WEB/Controllers/RolesController.php @@ -0,0 +1,98 @@ +listRolesAction->run(); + + return Inertia::render('Dashboard/Roles/Index', $data); + } + + public function create(): Response + { + $permissions = Permission::orderBy('name')->get(['id', 'name']); + + return Inertia::render('Dashboard/Roles/Create', [ + 'permissions' => $permissions, + ]); + } + + public function store(StoreRoleRequest $request): RedirectResponse + { + try { + $this->createRoleAction->run($request->validated()); + + return redirect()->route('dashboard.roles.index') + ->with('success', 'Роль успешно создана!'); + } catch (\Exception $e) { + return back() + ->withInput() + ->with('error', 'Ошибка при создании роли: ' . $e->getMessage()); + } + } + + public function edit(Role $role): Response + { + $role->load('permissions'); + $permissions = Permission::orderBy('name')->get(['id', 'name']); + + return Inertia::render('Dashboard/Roles/Edit', [ + 'role' => [ + 'id' => $role->id, + 'name' => $role->name, + 'permissions' => $role->permissions->pluck('name')->toArray(), + ], + 'permissions' => $permissions, + ]); + } + + public function update(UpdateRoleRequest $request, Role $role): RedirectResponse + { + try { + $this->updateRoleAction->run($role, $request->validated()); + + return redirect()->route('dashboard.roles.index') + ->with('success', 'Роль успешно обновлена!'); + } catch (\Exception $e) { + return back() + ->withInput() + ->with('error', 'Ошибка при обновлении роли: ' . $e->getMessage()); + } + } + + public function destroy(Role $role): RedirectResponse + { + try { + $this->deleteRoleAction->run($role); + + return redirect()->route('dashboard.roles.index') + ->with('success', 'Роль успешно удалена!'); + } catch (\Exception $e) { + return back() + ->with('error', 'Ошибка при удалении роли: ' . $e->getMessage()); + } + } +} diff --git a/app/Containers/Dashboard/UI/WEB/Requests/StoreRoleRequest.php b/app/Containers/Dashboard/UI/WEB/Requests/StoreRoleRequest.php new file mode 100644 index 0000000..c3d2be3 --- /dev/null +++ b/app/Containers/Dashboard/UI/WEB/Requests/StoreRoleRequest.php @@ -0,0 +1,30 @@ + ['required', 'string', 'max:255', 'unique:roles,name'], + 'permissions' => ['nullable', 'array'], + 'permissions.*' => ['string', 'exists:permissions,name'], + ]; + } + + public function messages(): array + { + return [ + 'name.required' => 'Название роли обязательно для заполнения', + 'name.unique' => 'Роль с таким названием уже существует', + ]; + } +} diff --git a/app/Containers/Dashboard/UI/WEB/Requests/UpdateRoleRequest.php b/app/Containers/Dashboard/UI/WEB/Requests/UpdateRoleRequest.php new file mode 100644 index 0000000..3048e21 --- /dev/null +++ b/app/Containers/Dashboard/UI/WEB/Requests/UpdateRoleRequest.php @@ -0,0 +1,31 @@ + ['required', 'string', 'max:255', Rule::unique('roles', 'name')->ignore($this->route('role'))], + 'permissions' => ['nullable', 'array'], + 'permissions.*' => ['string', 'exists:permissions,name'], + ]; + } + + public function messages(): array + { + return [ + 'name.required' => 'Название роли обязательно для заполнения', + 'name.unique' => 'Роль с таким названием уже существует', + ]; + } +} diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 2571216..0275d6f 100755 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -33,6 +33,8 @@ class HandleInertiaRequests extends Middleware ], 'auth' => [ 'user' => $request->user() ? $request->user()->only('id', 'name', 'email', 'created_at') : null, + 'permissions' => $request->user()?->getAllPermissions()->pluck('name')->toArray() ?? [], + 'roles' => $request->user()?->getRoleNames()->toArray() ?? [], ], 'ziggy' => function() { return array_merge((new Ziggy())->toArray(), [ diff --git a/app/Ship/Kernels/HttpKernel.php b/app/Ship/Kernels/HttpKernel.php index d57dcd0..12083fe 100644 --- a/app/Ship/Kernels/HttpKernel.php +++ b/app/Ship/Kernels/HttpKernel.php @@ -91,5 +91,6 @@ class HttpKernel extends LaravelHttpKernel 'limit.post' => LimitPost::class, 'form.time.period' => FormTimePeriodMiddleware::class, 'vikon.refresh' => \App\Http\Middleware\VikonTokenRefresh::class, + 'dashboard.permission' => \App\Ship\Middleware\CheckDashboardPermission::class, ]; } diff --git a/app/Ship/Middleware/HandleInertiaRequests.php b/app/Ship/Middleware/HandleInertiaRequests.php index 511a1d4..2561dee 100755 --- a/app/Ship/Middleware/HandleInertiaRequests.php +++ b/app/Ship/Middleware/HandleInertiaRequests.php @@ -34,6 +34,8 @@ class HandleInertiaRequests extends Middleware ], 'auth' => [ 'user' => $request->user() ? $request->user()->only('id', 'name', 'email', 'created_at') : null, + 'permissions' => $request->user()?->getAllPermissions()->pluck('name')->toArray() ?? [], + 'roles' => $request->user()?->getRoleNames()->toArray() ?? [], ], 'ziggy' => fn () => [ ...(new Ziggy)->toArray(), diff --git a/resources/js/Pages/Dashboard/Components/SidebarNav.vue b/resources/js/Pages/Dashboard/Components/SidebarNav.vue index 7b571aa..e23b112 100644 --- a/resources/js/Pages/Dashboard/Components/SidebarNav.vue +++ b/resources/js/Pages/Dashboard/Components/SidebarNav.vue @@ -2,7 +2,7 @@