|
|
@@ -0,0 +1,167 @@
|
|
|
+<?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' => 'Заявка окончательно удалена',
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+}
|