validate([ 'search' => ['nullable', 'string', 'max:100'], 'role' => ['nullable', Rule::enum(RoleName::class)], 'status' => ['nullable', Rule::in(['active', 'inactive'])], ]); return Inertia::render('admin/users/index', [ 'users' => User::query() ->with('roles:id,name,description') ->when($filters['search'] ?? null, fn ($query, string $search) => $query ->where(fn ($query) => $query ->where('name', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%") ->orWhere('department', 'like', "%{$search}%"))) ->when($filters['role'] ?? null, fn ($query, string $role) => $query ->whereHas('roles', fn ($query) => $query->where('name', $role))) ->when(($filters['status'] ?? null) === 'active', fn ($query) => $query->where('active', true)) ->when(($filters['status'] ?? null) === 'inactive', fn ($query) => $query->where('active', false)) ->orderBy('name') ->paginate(20) ->withQueryString(), 'roles' => Role::query()->orderBy('name')->get(['id', 'name', 'description']), 'filters' => $filters, ]); } public function store(Request $request, UserAdministrationService $service): RedirectResponse { $data = $this->validatedData($request, null); $user = $service->create($request->user(), $data); return back()->with('success', "Utilizador {$user->name} criado."); } public function update(Request $request, User $user, UserAdministrationService $service): RedirectResponse { $data = $this->validatedData($request, $user); $service->update($user, $request->user(), $data); return back()->with('success', "Utilizador {$user->name} atualizado."); } /** * @return array{name:string,email:string,department:?string,snipe_user_id:?int,password:?string,active:bool,roles:list} */ private function validatedData(Request $request, ?User $user): array { $roleNames = array_map(fn (RoleName $role): string => $role->value, RoleName::cases()); /** @var array{name:string,email:string,department:?string,snipe_user_id:?int,password:?string,active:bool,roles:list} $data */ $data = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')->ignore($user?->id)], 'department' => ['nullable', 'string', 'max:255'], 'snipe_user_id' => ['nullable', 'integer', 'min:1'], 'password' => [$user === null ? 'required' : 'nullable', 'string', Password::min(12)], 'active' => ['required', 'boolean'], 'roles' => ['required', 'array', 'min:1'], 'roles.*' => ['required', 'string', 'distinct', Rule::in($roleNames)], ]); return $data; } }