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); } }