UserController.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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 App\Support\Cpf;
  9. use Illuminate\Http\JsonResponse;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Auth;
  12. use Illuminate\Validation\Rule;
  13. class UserController extends Controller
  14. {
  15. public function __construct(
  16. protected UserService $service,
  17. protected MediaService $mediaService,
  18. ) {}
  19. public function authUser(): JsonResponse
  20. {
  21. $user = $this->service->authUser();
  22. return $this->successResponse(payload: new UserResource($user));
  23. }
  24. public function index(): JsonResponse
  25. {
  26. $items = $this->service->getAll();
  27. return $this->successResponse(
  28. payload: UserResource::collection($items),
  29. );
  30. }
  31. public function store(UserRequest $request): JsonResponse
  32. {
  33. $item = $this->service->create($request->validated());
  34. return $this->successResponse(
  35. payload: new UserResource($item),
  36. message: __("messages.created"),
  37. code: 201,
  38. );
  39. }
  40. public function show(int $id): JsonResponse
  41. {
  42. $item = $this->service->findById($id);
  43. return $this->successResponse(payload: new UserResource($item));
  44. }
  45. public function update(UserRequest $request, int $id): JsonResponse
  46. {
  47. $item = $this->service->update($id, $request->validated());
  48. return $this->successResponse(
  49. payload: new UserResource($item),
  50. message: __("messages.updated"),
  51. );
  52. }
  53. public function destroy(int $id): JsonResponse
  54. {
  55. $this->service->delete($id);
  56. return $this->successResponse(
  57. message: __("messages.deleted"),
  58. code: 204,
  59. );
  60. }
  61. public function indexPaginated(Request $request): JsonResponse
  62. {
  63. $filters = $request->only(['type', 'status', 'search', 'position_id', 'sector_id']);
  64. $perPage = min((int) $request->get('per_page', 10), 100);
  65. $paginator = $this->service->getAllPaginated($filters, $perPage);
  66. $payload = [
  67. 'data' => UserResource::collection($paginator->items()),
  68. 'total' => $paginator->total(),
  69. 'from' => $paginator->firstItem() ?? 0,
  70. 'to' => $paginator->lastItem() ?? 0,
  71. ];
  72. if ($request->boolean('with_status_options')) {
  73. $payload['statuses'] = $this->service->getStatusOptions($filters);
  74. }
  75. return $this->successResponse(payload: $payload);
  76. }
  77. public function getUserTypes(): JsonResponse
  78. {
  79. $user_types = $this->service->getUserTypes();
  80. return $this->successResponse(
  81. payload: new UserTypeResource($user_types),
  82. );
  83. }
  84. public function uploadAvatar(Request $request): JsonResponse
  85. {
  86. $request->validate(['photo' => 'required|image|max:5120']);
  87. $user = Auth::user();
  88. $this->mediaService->uploadUserAvatar($request->file('photo'), $user);
  89. return $this->successResponse(
  90. payload: new UserResource($user->fresh()),
  91. message: __("messages.updated"),
  92. );
  93. }
  94. public function deleteAvatar(): JsonResponse
  95. {
  96. $user = Auth::user();
  97. $this->mediaService->deleteUserAvatar($user);
  98. return $this->successResponse(
  99. payload: new UserResource($user->fresh()),
  100. message: __("messages.updated"),
  101. );
  102. }
  103. public function updateMyProfile(Request $request): JsonResponse
  104. {
  105. if ($request->has('cpf')) {
  106. $request->merge(['cpf' => Cpf::digits($request->input('cpf'))]);
  107. }
  108. $data = $request->validate([
  109. 'name' => 'sometimes|string|max:255',
  110. 'cpf' => ['sometimes', 'string', 'digits:11', Rule::unique('users', 'cpf')->ignore(Auth::id())],
  111. 'email' => ['sometimes', 'email', 'max:255', Rule::unique('users', 'email')->ignore(Auth::id())],
  112. 'phone' => 'sometimes|string|max:20',
  113. 'position_id' => 'sometimes|nullable|integer|exists:positions,id',
  114. 'sector_id' => 'sometimes|nullable|integer|exists:sectors,id',
  115. 'terms_accepted' => 'sometimes|accepted',
  116. ]);
  117. $termsAccepted = (bool) ($data['terms_accepted'] ?? false);
  118. unset($data['terms_accepted']);
  119. $user = Auth::user();
  120. if ($termsAccepted && !$user->terms_accepted_at) {
  121. $data['terms_accepted_at'] = now();
  122. }
  123. $user->update($data);
  124. return $this->successResponse(
  125. payload: new UserResource($user->fresh()),
  126. message: __("messages.updated"),
  127. );
  128. }
  129. public function setOnLeave(int $id): JsonResponse
  130. {
  131. $item = $this->service->setOnLeave($id, Auth::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 approve(int $id): JsonResponse
  141. {
  142. $item = $this->service->approve($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. public function refuse(int $id): JsonResponse
  152. {
  153. $item = $this->service->refuse($id);
  154. if (!$item) {
  155. return $this->errorResponse(message: __('messages.not_found'), code: 404);
  156. }
  157. return $this->successResponse(
  158. payload: new UserResource($item),
  159. message: __("messages.updated"),
  160. );
  161. }
  162. }