feat: complete administration and reporting
This commit is contained in:
83
app/Http/Controllers/Admin/UserController.php
Normal file
83
app/Http/Controllers/Admin/UserController.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Domain\Identity\Enums\RoleName;
|
||||
use App\Domain\Identity\Models\Role;
|
||||
use App\Domain\Identity\Services\UserAdministrationService;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
public function index(Request $request): Response
|
||||
{
|
||||
$filters = $request->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<string>}
|
||||
*/
|
||||
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<string>} $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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user