from __future__ import annotations from uuid import UUID from pydantic import Field from .common import ApiEnvelope, JsonObject, JsonValue, RouteContract, SchemaModel class SoilDataCoordinatesRequest(SchemaModel): lat: float lon: float class SoilDepthDataSchema(SchemaModel): depth_label: str bdod: float | None = None cec: float | None = None cfvo: float | None = None clay: float | None = None nitrogen: float | None = None ocd: float | None = None ocs: float | None = None phh2o: float | None = None sand: float | None = None silt: float | None = None soc: float | None = None wv0010: float | None = None wv0033: float | None = None wv1500: float | None = None class SoilLocationPayload(SchemaModel): source: str id: int lon: float lat: float depths: list[SoilDepthDataSchema] = Field(default_factory=list) class SoilTaskQueuedResponseData(SchemaModel): source: str = 'task' task_id: str lon: float lat: float status_url: str | None = None class SoilTaskStatusResponseData(SchemaModel): task_id: str status: str message: str | None = None progress: JsonObject = Field(default_factory=dict) result: JsonValue | None = None error: str | None = None class NdviHealthRequest(SchemaModel): farm_uuid: UUID class NdviHealthDataItem(SchemaModel): title: str value: JsonValue | None = None color: str icon: str class NdviHealthResponseData(SchemaModel): ndviIndex: float | None = None mean_ndvi: float | None = None ndvi_map: JsonObject = Field(default_factory=dict) vegetation_health_class: str | None = None observation_date: str | None = None satellite_source: str | None = None healthData: list[NdviHealthDataItem] = Field(default_factory=list) class SoilDataResponse(ApiEnvelope[SoilLocationPayload]): pass class SoilTaskQueuedResponse(ApiEnvelope[SoilTaskQueuedResponseData]): pass class SoilTaskStatusResponse(ApiEnvelope[SoilTaskStatusResponseData]): pass class NdviHealthResponse(ApiEnvelope[NdviHealthResponseData]): pass CONTRACTS = [ RouteContract( method='GET', path='/api/soil-data/', request_model=SoilDataCoordinatesRequest.__name__, response_model=SoilDataResponse.__name__, ), RouteContract( method='POST', path='/api/soil-data/', request_model=SoilDataCoordinatesRequest.__name__, response_model=SoilDataResponse.__name__, ), RouteContract( method='GET', path='/api/soil-data/tasks//status/', request_model='SoilTaskStatusRequest', response_model=SoilTaskStatusResponse.__name__, ), RouteContract( method='POST', path='/api/soil-data/ndvi-health/', request_model=NdviHealthRequest.__name__, response_model=NdviHealthResponse.__name__, ), ] class SoilTaskStatusRequest(SchemaModel): task_id: str