from drf_spectacular.utils import OpenApiExample, extend_schema from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from config.openapi import build_envelope_serializer, build_response from .serializers import FarmAlertsRequestSerializer from .services import get_farm_alerts_tracker FarmAlertsValidationErrorSerializer = build_envelope_serializer( "FarmAlertsValidationErrorSerializer", data_required=False, allow_null=True, ) FarmAlertsTrackerResponseSerializer = build_envelope_serializer( "FarmAlertsTrackerResponseSerializer", data_schema=None, ) class FarmAlertsTrackerView(APIView): @extend_schema( tags=["Farm Alerts"], summary="ارزیابی tracker هشدارهای مزرعه", description=( "با دریافت farm_uuid، هشدارهای مزرعه را تحلیل می کند، " "کانتکست مزرعه و لیست alertهای ورودی را به RAG می فرستد، " "و notificationهای سطح خطر/هشدار/اطلاع رسانی را در دیتابیس ذخیره می کند." ), request=FarmAlertsRequestSerializer, responses={ 200: build_response(FarmAlertsTrackerResponseSerializer, "خروجی tracker هشدارهای مزرعه."), 400: build_response(FarmAlertsValidationErrorSerializer, "پارامتر ورودی نامعتبر است."), 500: build_response(FarmAlertsValidationErrorSerializer, "خطا در تولید خروجی tracker هشدارها."), }, examples=[ OpenApiExample( "نمونه درخواست tracker", value={ "farm_uuid": "11111111-1111-1111-1111-111111111111", "alerts": [ { "alert_id": "soil-moisture-001", "level": "warning", "title": "افت رطوبت خاک", "message": "رطوبت خاک کمتر از حد مطلوب گزارش شده است.", "suggested_action": "آبیاری اصلاحی بررسی شود.", "source_metric_type": "moisture", } ], }, request_only=True, ), ], ) def post(self, request): serializer = FarmAlertsRequestSerializer(data=request.data) if not serializer.is_valid(): return Response( {"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST, ) validated = serializer.validated_data try: result = get_farm_alerts_tracker( farm_uuid=validated["farm_uuid"], query=validated.get("query"), alerts=validated.get("alerts"), ) except Exception as exc: return Response( {"code": 500, "msg": f"خطا در تولید tracker هشدارها: {exc}", "data": None}, status=status.HTTP_500_INTERNAL_SERVER_ERROR, ) return Response({"code": 200, "msg": "success", "data": result}, status=status.HTTP_200_OK)