resourceAccess->canSeeAll($request->user())) { $query->where(function ($scope) use ($request) { $scope->where('created_by', $request->user()->id) ->orWhereIn('project_id', $this->resourceAccess->projects($request->user())->select('projects.id')); }); } if ($request->filled('project_id')) { $query->where('project_id', $request->project_id); } if ($request->filled('type')) { $query->where('type', $request->type); } if ($request->filled('status')) { $query->where('status', $request->status); } if ($request->filled('priority')) { $query->where('priority', $request->priority); } $perPage = min(max((int) $request->input('per_page', 15), 1), 100); $sortBy = in_array($request->input('sort_by'), ['id', 'title', 'priority', 'status', 'created_at', 'updated_at'], true) ? $request->input('sort_by') : 'created_at'; $sortDir = $request->input('sort_dir', 'desc'); $items = $query->orderBy($sortBy, $sortDir)->paginate($perPage); return response()->json([ 'success' => true, 'data' => BacklogItemResource::collection($items), 'meta' => [ 'current_page' => $items->currentPage(), 'last_page' => $items->lastPage(), 'per_page' => $items->perPage(), 'total' => $items->total(), ], 'message' => 'لیست بکلاگ', ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'خطا در دریافت بکلاگ', ], 500); } } public function show(BacklogItem $backlogItem): JsonResponse { try { $backlogItem->load(['project', 'assignedSprint', 'creator']); return response()->json([ 'success' => true, 'data' => new BacklogItemResource($backlogItem), 'message' => 'اطلاعات آیتم بکلاگ', ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'خطا در دریافت اطلاعات آیتم بکلاگ', ], 500); } } public function store(StoreBacklogItemRequest $request): JsonResponse { try { $data = $request->validated(); if (! empty($data['project_id'])) { abort_unless( $this->resourceAccess->projects($request->user())->whereKey($data['project_id'])->exists(), 403, 'شما به پروژه انتخاب‌شده دسترسی ندارید.' ); } $data['created_by'] = $request->user()->id; $item = BacklogItem::create($data); $item->load(['project', 'assignedSprint', 'creator']); return response()->json([ 'success' => true, 'data' => new BacklogItemResource($item), 'message' => 'آیتم بکلاگ ایجاد شد', ], 201); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'خطا در ایجاد آیتم بکلاگ', ], 500); } } public function update(Request $request, BacklogItem $backlogItem): JsonResponse { try { $request->validate([ 'title' => 'sometimes|required|string|max:255', 'description' => 'nullable|string', 'type' => 'sometimes|required|string|max:50', 'priority' => 'nullable|string|max:50', 'estimated_effort' => 'nullable|numeric', 'status' => 'nullable|string|max:50', 'assigned_sprint_id' => 'nullable|exists:sprints,id', ]); $backlogItem->update($request->only([ 'title', 'description', 'type', 'priority', 'estimated_effort', 'status', 'assigned_sprint_id', ])); $backlogItem->load(['project', 'assignedSprint', 'creator']); return response()->json([ 'success' => true, 'data' => new BacklogItemResource($backlogItem->fresh()), 'message' => 'آیتم بکلاگ به‌روزرسانی شد', ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'خطا در به‌روزرسانی آیتم بکلاگ', ], 500); } } public function destroy(BacklogItem $backlogItem): JsonResponse { try { $backlogItem->delete(); return response()->json([ 'success' => true, 'message' => 'آیتم بکلاگ حذف شد', ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'خطا در حذف آیتم بکلاگ', ], 500); } } public function convertToTask(Request $request, BacklogItem $backlogItem): JsonResponse { try { $request->validate([ 'assignee_id' => 'nullable|exists:users,id', 'priority' => 'nullable|string', 'due_date' => 'nullable|date', ]); $task = Task::create([ 'title' => $backlogItem->title, 'description' => $backlogItem->description, 'project_id' => $backlogItem->project_id, 'assignee_id' => $request->assignee_id, 'reporter_id' => $request->user()->id, 'created_by' => $request->user()->id, 'priority' => $request->priority ?? $backlogItem->priority, 'status' => 'todo', ]); $backlogItem->update(['status' => 'converted']); $task->load(['project', 'assignee', 'reporter']); return response()->json([ 'success' => true, 'data' => new TaskResource($task), 'message' => 'آیتم بکلاگ به وظیفه تبدیل شد', ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'خطا در تبدیل آیتم بکلاگ به وظیفه', ], 500); } } }