116 lines
3.0 KiB
PHP
116 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\V1;
|
|
|
|
use App\Actions\Users\CreateUserAction;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Resources\UserResource;
|
|
use App\Models\User;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
|
|
|
|
/**
|
|
* @group User Management
|
|
*
|
|
* APIs for managing users
|
|
*/
|
|
class UserController extends Controller
|
|
{
|
|
/**
|
|
* List Users
|
|
*
|
|
* Get a paginated list of users.
|
|
*/
|
|
public function index(Request $request): AnonymousResourceCollection
|
|
{
|
|
$this->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']);
|
|
}
|
|
}
|