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