| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Http\Controllers\Controller;
- use App\Http\Resources\SubmissionResource;
- use App\Models\Submission;
- use Illuminate\Http\Request;
- use Illuminate\Http\JsonResponse;
- class SubmissionController extends Controller
- {
- // Список всех заявок с фильтрацией
- public function index(Request $request): JsonResponse
- {
- $query = Submission::query();
-
- // Query Scopes
- if ($request->has('status')) {
- if ($request->status === 'active') {
- $query->active();
- } elseif ($request->status === 'archived') {
- $query->archived();
- }
- }
-
- if ($request->has('search')) {
- $query->search($request->search);
- }
-
- if ($request->has('recent')) {
- $query->recent($request->recent);
- }
-
- // Eager loading связей
- $query->with(['comments', 'tags', 'attachments'])
- ->withCount(['comments', 'tags']);
-
- // Включить удаленные записи
- if ($request->boolean('with_trashed')) {
- $query->withTrashed();
- }
-
- $submissions = $query->latest()->paginate($request->get('per_page', 15));
-
- return response()->json([
- 'success' => true,
- 'data' => SubmissionResource::collection($submissions),
- 'meta' => [
- 'total' => $submissions->total(),
- 'per_page' => $submissions->perPage(),
- 'current_page' => $submissions->currentPage(),
- 'last_page' => $submissions->lastPage(),
- ]
- ]);
- }
- // Создание новой заявки
- public function store(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'name' => 'required|string|max:100',
- 'email' => 'required|email|max:255',
- 'message' => 'nullable|string|max:1000',
- 'status' => 'nullable|in:active,archived,pending',
- 'tags' => 'nullable|array',
- 'tags.*' => 'exists:tags,id',
- ]);
-
- $validated['ip_address'] = $request->ip();
-
- $submission = Submission::create($validated);
-
- // Прикрепление тегов (многие-ко-многим)
- if ($request->has('tags')) {
- $submission->tags()->attach($request->tags);
- }
-
- $submission->load(['comments', 'tags', 'attachments']);
-
- return response()->json([
- 'success' => true,
- 'message' => 'Заявка успешно создана',
- 'data' => new SubmissionResource($submission),
- ], 201);
- }
- // Просмотр одной заявки
- public function show(int $id): JsonResponse
- {
- $submission = Submission::with(['comments.attachments', 'tags', 'attachments'])
- ->withCount('comments')
- ->findOrFail($id);
-
- return response()->json([
- 'success' => true,
- 'data' => new SubmissionResource($submission),
- ]);
- }
- // Обновление заявки
- public function update(Request $request, int $id): JsonResponse
- {
- $submission = Submission::findOrFail($id);
-
- $validated = $request->validate([
- 'name' => 'sometimes|required|string|max:100',
- 'email' => 'sometimes|required|email|max:255',
- 'message' => 'nullable|string|max:1000',
- 'status' => 'nullable|in:active,archived,pending',
- 'tags' => 'nullable|array',
- 'tags.*' => 'exists:tags,id',
- ]);
-
- $submission->update($validated);
-
- // Синхронизация тегов
- if ($request->has('tags')) {
- $submission->tags()->sync($request->tags);
- }
-
- $submission->load(['comments', 'tags', 'attachments']);
-
- return response()->json([
- 'success' => true,
- 'message' => 'Заявка успешно обновлена',
- 'data' => new SubmissionResource($submission),
- ]);
- }
- // Мягкое удаление заявки
- public function destroy(int $id): JsonResponse
- {
- $submission = Submission::findOrFail($id);
- $submission->delete();
-
- return response()->json([
- 'success' => true,
- 'message' => 'Заявка успешно удалена (мягкое удаление)',
- ]);
- }
- // Восстановление удаленной заявки
- public function restore(int $id): JsonResponse
- {
- $submission = Submission::withTrashed()->findOrFail($id);
- $submission->restore();
-
- return response()->json([
- 'success' => true,
- 'message' => 'Заявка успешно восстановлена',
- 'data' => new SubmissionResource($submission),
- ]);
- }
- // Окончательное удаление
- public function forceDelete(int $id): JsonResponse
- {
- $submission = Submission::withTrashed()->findOrFail($id);
- $submission->forceDelete();
-
- return response()->json([
- 'success' => true,
- 'message' => 'Заявка окончательно удалена',
- ]);
- }
- }
|