middleware('auth:web'); // } public function index(): Response { $users = User::with(['roles', 'manager'])->get(); $roles = Role::all(); return Inertia::render('management/users/index', [ 'users' => $users, 'roles' => $roles, ]); } public function create(): Response { $roles = Role::all(); $managers = $this->managerOptions(); return Inertia::render('management/users/create', [ 'roles' => $roles, 'managers' => $managers, ]); } public function store(Request $request): RedirectResponse { $request->validate([ 'name' => ['required', 'string'], 'email' => ['required', 'email', 'unique:users,email'], 'password' => ['required', 'string', 'min:8'], 'manager_id' => ['nullable', 'integer', 'exists:users,id'], 'roles' => ['required', 'array'], 'roles.*' => ['required', 'string'], ]); $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), 'manager_id' => $request->manager_id, ]); $user->syncRoles($request->roles); return redirect() ->route('management.users.index') ->with('message-info', 'User ' . $user->name . ' has created successfully.'); } public function edit(int $id): Response { $user = User::with(['roles', 'manager'])->findOrFail($id); $roles = Role::all(); $managers = $this->managerOptions($user->id); return Inertia::render('management/users/edit', [ 'user' => $user, 'roles' => $roles, 'managers' => $managers, ]); } public function update(int $id, Request $request): RedirectResponse { $user = User::findOrFail($id); $request->validate([ 'name' => ['required', 'string'], 'email' => ['required', 'email', 'unique:users,email,' . $user->id], 'password' => ['nullable', 'string', 'min:8'], 'manager_id' => [ 'nullable', 'integer', Rule::exists('users', 'id')->where(fn ($query) => $query->where('id', '!=', $user->id)), ], 'roles' => ['required', 'array'], 'roles.*' => ['required', 'string'], ]); if ($this->hierarchyService->wouldCreateCycle($user, $request->integer('manager_id') ?: null)) { return redirect() ->back() ->withInput() ->withErrors(['manager_id' => 'A user cannot report to themselves or one of their reports.']); } $user->name = $request->name; $user->email = $request->email; $user->manager_id = $request->manager_id; if ($request->password !== null) { $user->password = Hash::make($request->password); } $user->save(); $user->syncRoles($request->roles); return redirect() ->route('management.users.index') ->with('message-info', 'User ' . $user->name . ' has updated successfully.'); } public function destroy(int $id): RedirectResponse { $user = User::findOrFail($id); if ($user->id === 1) { return redirect() ->route('management.users.index') ->with('message-error', 'User ' . $user->name . ' cannot be delete.'); } $user->delete(); return redirect() ->route('management.users.index') ->with('message-info', 'User ' . $user->name . ' has deleted successfully.'); } private function managerOptions(?int $excludedUserId = null): array { return User::query() ->when($excludedUserId !== null, fn ($query) => $query->where('id', '!=', $excludedUserId)) ->orderBy('name') ->get(['id', 'name', 'email']) ->map(fn (User $user) => [ 'value' => (string) $user->id, 'label' => trim($user->name . ' (' . $user->email . ')'), ]) ->all(); } }