98 lines
3.2 KiB
PHP
98 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Actions\Users\AssignRoleAction;
|
|
use App\Actions\Users\CreateUserAction;
|
|
use App\Actions\Users\DeleteUserAction;
|
|
use App\Actions\Users\UpdateUserAction;
|
|
use App\Events\RoleAssigned;
|
|
use App\Events\UserCreated;
|
|
use App\Events\UserDeleted;
|
|
use App\Events\UserUpdated;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Users\AssignRoleRequest;
|
|
use App\Http\Requests\Users\StoreUserRequest;
|
|
use App\Http\Requests\Users\UpdateUserRequest;
|
|
use App\Http\Resources\UserResource;
|
|
use App\Models\User;
|
|
use App\Services\Audit\AuditLogger;
|
|
use Illuminate\Http\Request;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$this->authorize('viewAny', User::class);
|
|
|
|
$query = User::query()->with('roles');
|
|
|
|
if ($search = $request->string('search')->toString()) {
|
|
$query->where(function ($q) use ($search) {
|
|
$q->where('name', 'like', "%{$search}%")
|
|
->orWhere('username', 'like', "%{$search}%")
|
|
->orWhere('email', 'like', "%{$search}%");
|
|
});
|
|
}
|
|
|
|
$sort = in_array($request->query('sort'), ['name', 'username', 'email', 'created_at'], true)
|
|
? $request->query('sort')
|
|
: 'created_at';
|
|
$direction = $request->query('direction') === 'asc' ? 'asc' : 'desc';
|
|
|
|
$users = $query->orderBy($sort, $direction)->paginate($request->integer('per_page', 15));
|
|
|
|
return UserResource::collection($users);
|
|
}
|
|
|
|
public function store(StoreUserRequest $request, CreateUserAction $action, AuditLogger $audit)
|
|
{
|
|
$user = $action->execute($request->validated(), $request->user());
|
|
|
|
event(new UserCreated($user, $request->user()));
|
|
$audit->log($request->user(), 'user.created', $user);
|
|
|
|
return UserResource::make($user)->response()->setStatusCode(201);
|
|
}
|
|
|
|
public function show(Request $request, User $user)
|
|
{
|
|
$this->authorize('view', $user);
|
|
|
|
return UserResource::make($user->load('roles'));
|
|
}
|
|
|
|
public function update(UpdateUserRequest $request, User $user, UpdateUserAction $action, AuditLogger $audit)
|
|
{
|
|
$user = $action->execute($user, $request->validated());
|
|
|
|
event(new UserUpdated($user, $request->user()));
|
|
$audit->log($request->user(), 'user.updated', $user);
|
|
|
|
return UserResource::make($user);
|
|
}
|
|
|
|
public function destroy(Request $request, User $user, DeleteUserAction $action, AuditLogger $audit)
|
|
{
|
|
$this->authorize('delete', $user);
|
|
|
|
$action->execute($user);
|
|
|
|
event(new UserDeleted($user, $request->user()));
|
|
$audit->log($request->user(), 'user.deleted', $user);
|
|
|
|
return response()->noContent();
|
|
}
|
|
|
|
public function assignRole(AssignRoleRequest $request, User $user, AssignRoleAction $action, AuditLogger $audit)
|
|
{
|
|
$role = $request->string('role')->toString();
|
|
$user = $action->execute($user, $role);
|
|
|
|
event(new RoleAssigned($user, $request->user(), $role));
|
|
$audit->log($request->user(), 'user.role_assigned', $user, ['role' => $role]);
|
|
|
|
return UserResource::make($user);
|
|
}
|
|
}
|