get('per_page', 12), 100); $paginator = $this->service->getAllPaginated($perPage); return $this->successResponse(payload: [ 'data' => EvaluationCampaignResource::collection($paginator->items()), 'total' => $paginator->total(), 'from' => $paginator->firstItem() ?? 0, 'to' => $paginator->lastItem() ?? 0, ]); } public function active(): JsonResponse { $campaign = $this->service->getActiveCampaign(); return $this->successResponse( payload: $campaign ? new EvaluationCampaignResource($campaign) : null, ); } public function store(EvaluationCampaignRequest $request): JsonResponse { $campaign = $this->service->create($request->validated()); return $this->successResponse( payload: new EvaluationCampaignResource($campaign), message: __('messages.created'), code: 201, ); } public function show(int $id): JsonResponse { $campaign = $this->service->findById($id); if (!$campaign) { return $this->errorResponse(message: __('messages.not_found')); } return $this->successResponse(payload: new EvaluationCampaignResource($campaign)); } public function update(EvaluationCampaignRequest $request, int $id): JsonResponse { $campaign = $this->service->update($id, $request->validated()); if (!$campaign) { return $this->errorResponse(message: __('messages.not_found')); } return $this->successResponse( payload: new EvaluationCampaignResource($campaign), message: __('messages.updated'), ); } public function destroy(int $id): JsonResponse { if (!$this->service->delete($id)) { return $this->errorResponse(message: __('messages.not_found')); } return $this->successResponse(message: __('messages.deleted'), code: 204); } public function finish(int $id): JsonResponse { $result = $this->service->finish($id); if (isset($result['error'])) { return match ($result['error']) { 'already_finished' => $this->errorResponse(message: __('messages.evaluation.already_finished'), code: 409), default => $this->errorResponse(message: __('messages.not_found')), }; } return $this->successResponse( payload: new EvaluationCampaignResource($result['campaign']), message: __('messages.evaluation.campaign_finished'), ); } public function stats(int $id): JsonResponse { $stats = $this->service->getStats($id); if (!$stats) { return $this->errorResponse(message: __('messages.not_found')); } return $this->successResponse(payload: $stats); } public function evaluations(Request $request, int $id): JsonResponse { $perPage = min((int) $request->get('per_page', 12), 100); $paginator = $this->service->getEvaluationsPaginated( campaignId: $id, filters: $request->only(['source', 'min_rating', 'max_rating', 'search']), perPage: $perPage, ); return $this->successResponse(payload: [ 'data' => EvaluationResource::collection($paginator->items()), 'total' => $paginator->total(), 'from' => $paginator->firstItem() ?? 0, 'to' => $paginator->lastItem() ?? 0, ]); } }