auth tests
This commit is contained in:
85
backend/app/Http/Controllers/UserController.php
Normal file
85
backend/app/Http/Controllers/UserController.php
Normal file
@@ -0,0 +1,85 @@
|
||||
<?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);
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user