with('role') ->orderBy('name'); $this->applyTrashed($query, $request->input('trashed')); $this->applySearch($query, $request->input('search')); if ($request->filled('role_id')) { $query->where('role_id', $request->integer('role_id')); } $users = $query->paginate($request->integer('per_page') ?: 20); return $this->paginatedCollectionResponse($users); } /** * Dettaglio di un singolo utente (anche cestinato/anonimizzato). */ public function show(User $user): JsonResponse { $user->load('role'); return $this->okResponse($user); } /** * Include i soft-deleted nell'elenco: `with` (tutti) o `only` (solo cestinati). * * @param Builder $query */ private function applyTrashed(Builder $query, ?string $trashed): void { match ($trashed) { 'with' => $query->withTrashed(), 'only' => $query->onlyTrashed(), default => null, }; } /** * Filtra per nome o email (ricerca parziale, case-insensitive). * * @param Builder $query */ private function applySearch(Builder $query, ?string $search): void { if (blank($search)) { return; } $term = '%'.$search.'%'; $query->where(function (Builder $q) use ($term): void { $q->where('name', 'like', $term) ->orWhere('email', 'like', $term); }); } }