UserController.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Resources\UserTypeResource;
  4. use App\Services\MediaService;
  5. use App\Services\UserService;
  6. use App\Http\Requests\UserRequest;
  7. use App\Http\Resources\UserResource;
  8. use Illuminate\Http\JsonResponse;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Auth;
  11. class UserController extends Controller
  12. {
  13. public function __construct(
  14. protected UserService $service,
  15. protected MediaService $mediaService,
  16. ) {}
  17. public function authUser(): JsonResponse
  18. {
  19. $user = $this->service->authUser();
  20. return $this->successResponse(payload: new UserResource($user));
  21. }
  22. public function index(): JsonResponse
  23. {
  24. $items = $this->service->getAll();
  25. return $this->successResponse(
  26. payload: UserResource::collection($items),
  27. );
  28. }
  29. public function store(UserRequest $request): JsonResponse
  30. {
  31. $item = $this->service->create($request->validated());
  32. return $this->successResponse(
  33. payload: new UserResource($item),
  34. message: __("messages.created"),
  35. code: 201,
  36. );
  37. }
  38. public function show(int $id): JsonResponse
  39. {
  40. $item = $this->service->findById($id);
  41. return $this->successResponse(payload: new UserResource($item));
  42. }
  43. public function update(UserRequest $request, int $id): JsonResponse
  44. {
  45. $item = $this->service->update($id, $request->validated());
  46. return $this->successResponse(
  47. payload: new UserResource($item),
  48. message: __("messages.updated"),
  49. );
  50. }
  51. public function destroy(int $id): JsonResponse
  52. {
  53. $this->service->delete($id);
  54. return $this->successResponse(
  55. message: __("messages.deleted"),
  56. code: 204,
  57. );
  58. }
  59. public function indexPaginated(Request $request): JsonResponse
  60. {
  61. $filters = $request->only(['type', 'status', 'search', 'position_id', 'sector_id']);
  62. $perPage = min((int) $request->get('per_page', 10), 100);
  63. $paginator = $this->service->getAllPaginated($filters, $perPage);
  64. $payload = [
  65. 'data' => UserResource::collection($paginator->items()),
  66. 'total' => $paginator->total(),
  67. 'from' => $paginator->firstItem() ?? 0,
  68. 'to' => $paginator->lastItem() ?? 0,
  69. ];
  70. if ($request->boolean('with_status_options')) {
  71. $payload['statuses'] = $this->service->getStatusOptions($filters);
  72. }
  73. return $this->successResponse(payload: $payload);
  74. }
  75. public function getUserTypes(): JsonResponse
  76. {
  77. $user_types = $this->service->getUserTypes();
  78. return $this->successResponse(
  79. payload: new UserTypeResource($user_types),
  80. );
  81. }
  82. public function uploadAvatar(Request $request): JsonResponse
  83. {
  84. $request->validate(['photo' => 'required|image|max:5120']);
  85. $user = Auth::user();
  86. $this->mediaService->uploadUserAvatar($request->file('photo'), $user);
  87. return $this->successResponse(
  88. payload: new UserResource($user->fresh()),
  89. message: __("messages.updated"),
  90. );
  91. }
  92. public function deleteAvatar(): JsonResponse
  93. {
  94. $user = Auth::user();
  95. $this->mediaService->deleteUserAvatar($user);
  96. return $this->successResponse(
  97. payload: new UserResource($user->fresh()),
  98. message: __("messages.updated"),
  99. );
  100. }
  101. public function updateMyProfile(Request $request): JsonResponse
  102. {
  103. $data = $request->validate([
  104. 'name' => 'sometimes|string|max:255',
  105. 'cpf' => 'sometimes|string|max:20',
  106. 'email' => 'sometimes|email|max:255',
  107. 'phone' => 'sometimes|string|max:20',
  108. 'position_id' => 'sometimes|nullable|integer|exists:positions,id',
  109. 'sector_id' => 'sometimes|nullable|integer|exists:sectors,id',
  110. ]);
  111. $user = Auth::user();
  112. $user->update($data);
  113. return $this->successResponse(
  114. payload: new UserResource($user->fresh()),
  115. message: __("messages.updated"),
  116. );
  117. }
  118. public function setOnLeave(int $id): JsonResponse
  119. {
  120. $item = $this->service->setOnLeave($id, Auth::id());
  121. if (!$item) {
  122. return $this->errorResponse(message: __('messages.not_found'), code: 404);
  123. }
  124. return $this->successResponse(
  125. payload: new UserResource($item),
  126. message: __("messages.updated"),
  127. );
  128. }
  129. public function approve(int $id): JsonResponse
  130. {
  131. $item = $this->service->approve($id);
  132. if (!$item) {
  133. return $this->errorResponse(message: __('messages.not_found'), code: 404);
  134. }
  135. return $this->successResponse(
  136. payload: new UserResource($item),
  137. message: __("messages.updated"),
  138. );
  139. }
  140. public function refuse(int $id): JsonResponse
  141. {
  142. $item = $this->service->refuse($id);
  143. if (!$item) {
  144. return $this->errorResponse(message: __('messages.not_found'), code: 404);
  145. }
  146. return $this->successResponse(
  147. payload: new UserResource($item),
  148. message: __("messages.updated"),
  149. );
  150. }
  151. }