86 lines
2.3 KiB
PHP
86 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\IndexUserRequest;
|
|
use App\Http\Traits\ApiResponse;
|
|
use App\Models\User;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Http\JsonResponse;
|
|
|
|
/**
|
|
* Gestione utenti riservata agli amministratori (sola lettura per ora:
|
|
* la creazione/invito e la modifica arriveranno con la gestione account).
|
|
*
|
|
* Ogni utente è serializzato col ruolo correlato e l'accessor `setup_status`
|
|
* (password_required / 2fa_setup_required / complete), utile alla dashboard admin.
|
|
*/
|
|
class UserController extends Controller
|
|
{
|
|
use ApiResponse;
|
|
|
|
/**
|
|
* Elenco paginato degli utenti, con filtri opzionali (ricerca, ruolo, cestino).
|
|
*/
|
|
public function index(IndexUserRequest $request): JsonResponse
|
|
{
|
|
$query = User::query()
|
|
->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<User> $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<User> $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);
|
|
});
|
|
}
|
|
}
|