ScheduleController.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Exceptions\ScheduleStatusTransitionException;
  4. use App\Http\Requests\ScheduleRequest;
  5. use App\Http\Resources\ScheduleResource;
  6. use App\Services\ScheduleService;
  7. use Illuminate\Http\JsonResponse;
  8. use Illuminate\Http\Request;
  9. class ScheduleController extends Controller
  10. {
  11. protected $scheduleService;
  12. public function __construct(ScheduleService $scheduleService)
  13. {
  14. $this->scheduleService = $scheduleService;
  15. }
  16. public function index(): JsonResponse
  17. {
  18. $schedules = $this->scheduleService->getAll();
  19. return $this->successResponse(
  20. ScheduleResource::collection($schedules),
  21. );
  22. }
  23. public function store(ScheduleRequest $request): JsonResponse
  24. {
  25. try {
  26. $validated = $request->validated();
  27. $schedule = $this->scheduleService->create($validated);
  28. return $this->successResponse(
  29. payload: new ScheduleResource($schedule),
  30. message: __('messages.created'),
  31. code: 201,
  32. );
  33. } catch (\Exception $e) {
  34. return $this->errorResponse($e->getMessage(), 422);
  35. }
  36. }
  37. public function show(string $id): JsonResponse
  38. {
  39. $schedule = $this->scheduleService->getById($id);
  40. return $this->successResponse(
  41. new ScheduleResource($schedule),
  42. );
  43. }
  44. public function update(ScheduleRequest $request, string $id): JsonResponse
  45. {
  46. try {
  47. $schedule = $this->scheduleService->update($id, $request->validated());
  48. return $this->successResponse(
  49. payload: new ScheduleResource($schedule),
  50. message: __('messages.updated'),
  51. );
  52. } catch (\Exception $e) {
  53. return $this->errorResponse($e->getMessage(), 422);
  54. }
  55. }
  56. public function destroy(string $id): JsonResponse
  57. {
  58. $this->scheduleService->delete($id);
  59. return $this->successResponse(
  60. message: __('messages.deleted'),
  61. code: 204,
  62. );
  63. }
  64. //
  65. public function finished(): JsonResponse
  66. {
  67. $schedules = $this->scheduleService->getFinished();
  68. return $this->successResponse(
  69. ScheduleResource::collection($schedules),
  70. );
  71. }
  72. public function clientProviderBlocks(Request $request): JsonResponse
  73. {
  74. $validated = $request->validate([
  75. 'client_id' => 'required|integer|exists:clients,id',
  76. 'provider_id' => 'required|integer|exists:providers,id',
  77. ]);
  78. $blocks = $this->scheduleService->getClientProviderBlocks(
  79. (int) data_get($validated, 'client_id'),
  80. (int) data_get($validated, 'provider_id'),
  81. );
  82. return $this->successResponse(payload: $blocks);
  83. }
  84. public function groupedByClient(): JsonResponse
  85. {
  86. $grouped = $this->scheduleService->getSchedulesDefaultGroupedByClient();
  87. return $this->successResponse($grouped);
  88. }
  89. //
  90. public function cancelWithReason(string $id, Request $request): JsonResponse
  91. {
  92. try {
  93. $validated = $request->validate([
  94. 'cancel_text' => 'required|string|min:5|max:1000',
  95. ]);
  96. $schedule = $this->scheduleService->cancelWithReason((int) $id, data_get($validated, 'cancel_text'));
  97. return $this->successResponse(
  98. payload: new ScheduleResource($schedule),
  99. message: __('messages.updated'),
  100. );
  101. } catch (ScheduleStatusTransitionException) {
  102. return $this->errorResponse(__('messages.cancellation_not_allowed_for_status'), 422);
  103. } catch (\Exception $e) {
  104. return $this->errorResponse($e->getMessage(), 422);
  105. }
  106. }
  107. public function updateStatus(string $id, ScheduleRequest $request): JsonResponse
  108. {
  109. try {
  110. $validated = $request->validate([
  111. 'status' => 'required|in:pending,accepted,rejected,paid,cancelled,started,finished',
  112. ]);
  113. $schedule = $this->scheduleService->updateStatus($id, data_get($validated, 'status'));
  114. return $this->successResponse(
  115. payload: new ScheduleResource($schedule),
  116. message: __('messages.updated'),
  117. );
  118. } catch (ScheduleStatusTransitionException) {
  119. return $this->errorResponse(__('messages.status_transition_not_allowed'), 422);
  120. } catch (\Exception $e) {
  121. return $this->errorResponse($e->getMessage(), 422);
  122. }
  123. }
  124. }