authorize('user.view'); $users = User::query() ->when($request->search, function ($query, $search) { $query->where('first_name', 'like', "%{$search}%") ->orWhere('last_name', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%"); }) ->paginate($request->perPage ?? 15); return UserResource::collection($users); } /** * Create User * * Create a new user with roles. */ public function store(Request $request, CreateUserAction $action): UserResource { $this->authorize('user.create'); $validated = $request->validate([ 'firstName' => 'required|string|max:100', 'lastName' => 'required|string|max:100', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', 'status' => 'string|in:active,inactive,suspended', 'roles' => 'array', ]); $user = $action->execute($validated); return new UserResource($user); } /** * Get User * * Get details of a specific user. */ public function show(User $user): UserResource { $this->authorize('user.view'); return new UserResource($user); } /** * Update User * * Update a user's details. */ public function update(Request $request, User $user): UserResource { $this->authorize('user.edit'); $validated = $request->validate([ 'firstName' => 'string|max:100', 'lastName' => 'string|max:100', 'email' => 'email|unique:users,email,' . $user->id, 'status' => 'string|in:active,inactive,suspended', ]); // Mapping camelCase to snake_case for DB if (isset($validated['firstName'])) $user->first_name = $validated['firstName']; if (isset($validated['lastName'])) $user->last_name = $validated['lastName']; if (isset($validated['email'])) $user->email = $validated['email']; if (isset($validated['status'])) $user->status = $validated['status']; $user->save(); return new UserResource($user); } /** * Delete User * * Soft delete a user. */ public function destroy(User $user): JsonResponse { $this->authorize('user.delete'); $user->delete(); return response()->json(['message' => 'User deleted successfully']); } }