inspiren-sem-tool/app/Http/Controllers/Management/RoleController.php
brian-inspiren 221d3f8173
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
feat: sem codebase
2026-05-21 11:28:03 +08:00

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