SubmissionController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Resources\SubmissionResource;
  5. use App\Models\Submission;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Http\JsonResponse;
  8. class SubmissionController extends Controller
  9. {
  10. // Список всех заявок с фильтрацией
  11. public function index(Request $request): JsonResponse
  12. {
  13. $query = Submission::query();
  14. // Query Scopes
  15. if ($request->has('status')) {
  16. if ($request->status === 'active') {
  17. $query->active();
  18. } elseif ($request->status === 'archived') {
  19. $query->archived();
  20. }
  21. }
  22. if ($request->has('search')) {
  23. $query->search($request->search);
  24. }
  25. if ($request->has('recent')) {
  26. $query->recent($request->recent);
  27. }
  28. // Eager loading связей
  29. $query->with(['comments', 'tags', 'attachments'])
  30. ->withCount(['comments', 'tags']);
  31. // Включить удаленные записи
  32. if ($request->boolean('with_trashed')) {
  33. $query->withTrashed();
  34. }
  35. $submissions = $query->latest()->paginate($request->get('per_page', 15));
  36. return response()->json([
  37. 'success' => true,
  38. 'data' => SubmissionResource::collection($submissions),
  39. 'meta' => [
  40. 'total' => $submissions->total(),
  41. 'per_page' => $submissions->perPage(),
  42. 'current_page' => $submissions->currentPage(),
  43. 'last_page' => $submissions->lastPage(),
  44. ]
  45. ]);
  46. }
  47. // Создание новой заявки
  48. public function store(Request $request): JsonResponse
  49. {
  50. $validated = $request->validate([
  51. 'name' => 'required|string|max:100',
  52. 'email' => 'required|email|max:255',
  53. 'message' => 'nullable|string|max:1000',
  54. 'status' => 'nullable|in:active,archived,pending',
  55. 'tags' => 'nullable|array',
  56. 'tags.*' => 'exists:tags,id',
  57. ]);
  58. $validated['ip_address'] = $request->ip();
  59. $submission = Submission::create($validated);
  60. // Прикрепление тегов (многие-ко-многим)
  61. if ($request->has('tags')) {
  62. $submission->tags()->attach($request->tags);
  63. }
  64. $submission->load(['comments', 'tags', 'attachments']);
  65. return response()->json([
  66. 'success' => true,
  67. 'message' => 'Заявка успешно создана',
  68. 'data' => new SubmissionResource($submission),
  69. ], 201);
  70. }
  71. // Просмотр одной заявки
  72. public function show(int $id): JsonResponse
  73. {
  74. $submission = Submission::with(['comments.attachments', 'tags', 'attachments'])
  75. ->withCount('comments')
  76. ->findOrFail($id);
  77. return response()->json([
  78. 'success' => true,
  79. 'data' => new SubmissionResource($submission),
  80. ]);
  81. }
  82. // Обновление заявки
  83. public function update(Request $request, int $id): JsonResponse
  84. {
  85. $submission = Submission::findOrFail($id);
  86. $validated = $request->validate([
  87. 'name' => 'sometimes|required|string|max:100',
  88. 'email' => 'sometimes|required|email|max:255',
  89. 'message' => 'nullable|string|max:1000',
  90. 'status' => 'nullable|in:active,archived,pending',
  91. 'tags' => 'nullable|array',
  92. 'tags.*' => 'exists:tags,id',
  93. ]);
  94. $submission->update($validated);
  95. // Синхронизация тегов
  96. if ($request->has('tags')) {
  97. $submission->tags()->sync($request->tags);
  98. }
  99. $submission->load(['comments', 'tags', 'attachments']);
  100. return response()->json([
  101. 'success' => true,
  102. 'message' => 'Заявка успешно обновлена',
  103. 'data' => new SubmissionResource($submission),
  104. ]);
  105. }
  106. // Мягкое удаление заявки
  107. public function destroy(int $id): JsonResponse
  108. {
  109. $submission = Submission::findOrFail($id);
  110. $submission->delete();
  111. return response()->json([
  112. 'success' => true,
  113. 'message' => 'Заявка успешно удалена (мягкое удаление)',
  114. ]);
  115. }
  116. // Восстановление удаленной заявки
  117. public function restore(int $id): JsonResponse
  118. {
  119. $submission = Submission::withTrashed()->findOrFail($id);
  120. $submission->restore();
  121. return response()->json([
  122. 'success' => true,
  123. 'message' => 'Заявка успешно восстановлена',
  124. 'data' => new SubmissionResource($submission),
  125. ]);
  126. }
  127. // Окончательное удаление
  128. public function forceDelete(int $id): JsonResponse
  129. {
  130. $submission = Submission::withTrashed()->findOrFail($id);
  131. $submission->forceDelete();
  132. return response()->json([
  133. 'success' => true,
  134. 'message' => 'Заявка окончательно удалена',
  135. ]);
  136. }
  137. }