141 lines
4.3 KiB
PHP
141 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Management;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Arr;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
use Spatie\Permission\Models\Permission;
|
|
use App\Services\RoleService;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
class RoleController extends Controller
|
|
{
|
|
protected $roleService;
|
|
public function __construct(RoleService $roleService)
|
|
{
|
|
$this->roleService = $roleService;
|
|
// $this->middleware('auth:web');
|
|
}
|
|
|
|
public function index(): Response
|
|
{
|
|
$roles = $this->roleService->getAllRoles();
|
|
return Inertia::render('management/roles/index', [
|
|
'roles' => $roles['data'],
|
|
]);
|
|
}
|
|
|
|
// public function create(): Response
|
|
// {
|
|
// $permissions = Permission::all()->mapWithKeys(fn (Permission $permission) => [
|
|
// $permission->name => false,
|
|
// ]);
|
|
|
|
// return Inertia::render('Admin/UserManagement/Role/Create', [
|
|
// 'permissions' => Arr::undot($permissions),
|
|
// ]);
|
|
// }
|
|
|
|
// public function store(Request $request): RedirectResponse
|
|
// {
|
|
// $request->validate([
|
|
// 'name' => ['required', 'string'],
|
|
// 'permissions' => ['required', 'array'],
|
|
// ]);
|
|
|
|
// $permissions = Arr::dot($request->permissions);
|
|
// $permissions = array_keys(array_filter($permissions, fn ($permission) => $permission === true));
|
|
|
|
// $role = Role::create([
|
|
// 'name' => $request->name,
|
|
// ]);
|
|
// $role->syncPermissions($permissions);
|
|
|
|
// return redirect()
|
|
// ->route('admin.user_management.role.index')
|
|
// ->with('message-info', 'Role ' . $role->name . ' has created successfully.');
|
|
// }
|
|
|
|
public function edit(int $id): Response
|
|
{
|
|
$role = Role::findOrFail($id);
|
|
|
|
// 1. Get all permissions with their "checked" state
|
|
$permissions = Permission::all()->map(function ($permission) use ($role) {
|
|
return [
|
|
'id' => $permission->id,
|
|
'name' => $permission->name, // e.g. "user.create"
|
|
'description' => $permission->description,
|
|
'checked' => $role->hasPermissionTo($permission->name),
|
|
];
|
|
});
|
|
|
|
// 2. Group them by the prefix (the part before the dot)
|
|
$grouped = $permissions->groupBy(function ($item) {
|
|
return explode('.', $item['name'])[0];
|
|
})->map(function ($group) {
|
|
// 3. Force it to be a sequential array so JS sees it as []
|
|
return $group->values()->toArray();
|
|
});
|
|
|
|
return Inertia::render('management/roles/edit', [
|
|
'role' => $role,
|
|
'permissions' => $grouped,
|
|
]);
|
|
}
|
|
|
|
public function update(int $id, Request $request): RedirectResponse
|
|
{
|
|
$role = Role::findOrFail($id);
|
|
|
|
$request->validate([
|
|
'name' => ['required', 'string'],
|
|
'permissions' => ['required', 'array'],
|
|
]);
|
|
|
|
// 1. Extract only the IDs of permissions that are checked
|
|
$permissionIds = [];
|
|
foreach ($request->permissions as $group => $items) {
|
|
foreach ($items as $permission) {
|
|
if (! empty($permission['checked'])) {
|
|
$permissionIds[] = $permission['id'];
|
|
}
|
|
}
|
|
}
|
|
|
|
// 2. Update Role name
|
|
$role->update([
|
|
'name' => $request->name
|
|
]);
|
|
|
|
// 3. Sync permissions using the collected IDs
|
|
$role->syncPermissions($permissionIds);
|
|
|
|
return redirect()
|
|
->route('management.roles.index')
|
|
->with('message-info', 'Role '.$role->name.' has updated successfully.');
|
|
}
|
|
|
|
|
|
// public function destroy(int $id): RedirectResponse
|
|
// {
|
|
// $role = Role::findOrFail($id);
|
|
|
|
// if ($role->name == 'Admin') {
|
|
// return redirect()
|
|
// ->route('user_management.user.index')
|
|
// ->with('message-error', 'User ' . $role->name . ' cannot be delete.');
|
|
// }
|
|
|
|
// $role->delete();
|
|
|
|
// return redirect()
|
|
// ->route('admin.user_management.role.index')
|
|
// ->with('message-info', 'Role has deleted successfully.');
|
|
// }
|
|
}
|