UserController.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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']);
  62. $perPage = min((int) $request->get('per_page', 10), 100);
  63. $paginator = $this->service->getAllPaginated($filters, $perPage);
  64. return $this->successResponse(payload: [
  65. 'data' => UserResource::collection($paginator->items()),
  66. 'total' => $paginator->total(),
  67. 'from' => $paginator->firstItem() ?? 0,
  68. 'to' => $paginator->lastItem() ?? 0,
  69. ]);
  70. }
  71. public function getUserTypes(): JsonResponse
  72. {
  73. $user_types = $this->service->getUserTypes();
  74. return $this->successResponse(
  75. payload: new UserTypeResource($user_types),
  76. );
  77. }
  78. public function uploadAvatar(Request $request): JsonResponse
  79. {
  80. $request->validate(['photo' => 'required|image|max:5120']);
  81. $user = Auth::user();
  82. $this->mediaService->uploadUserAvatar($request->file('photo'), $user);
  83. return $this->successResponse(
  84. payload: new UserResource($user->fresh()),
  85. message: __("messages.updated"),
  86. );
  87. }
  88. public function deleteAvatar(): JsonResponse
  89. {
  90. $user = Auth::user();
  91. $this->mediaService->deleteUserAvatar($user);
  92. return $this->successResponse(
  93. payload: new UserResource($user->fresh()),
  94. message: __("messages.updated"),
  95. );
  96. }
  97. }