from __future__ import annotations from uuid import UUID from pydantic import Field, model_validator from .common import ApiEnvelope, JsonObject, RouteContract, SchemaModel HTTP_METHOD = 'POST' ROUTE_PATH = '/api/farm-data/' class FarmBoundaryCorner(SchemaModel): lat: float lon: float class FarmDataUpsertRequest(SchemaModel): farm_uuid: UUID farm_boundary: JsonObject sensor_key: str | None = 'sensor-7-1' sensor_payload: JsonObject | None = None plant_ids: list[int] = Field(default_factory=list) irrigation_method_id: int | None = None @model_validator(mode='after') def validate_payload_sources(self) -> 'FarmDataUpsertRequest': if not self.sensor_payload and not self.plant_ids and self.irrigation_method_id is None: raise ValueError('At least one of sensor_payload, plant_ids or irrigation_method_id must be provided.') return self class FarmDataUpsertResponseData(SchemaModel): farm_uuid: UUID center_location_id: int | None = None weather_forecast_id: int | None = None sensor_payload: JsonObject = Field(default_factory=dict) plant_ids: list[int] = Field(default_factory=list) irrigation_method_id: int | None = None created_at: str | None = None updated_at: str | None = None class FarmDataUpsertResponse(ApiEnvelope[FarmDataUpsertResponseData]): pass CONTRACT = RouteContract( method=HTTP_METHOD, path=ROUTE_PATH, request_model=FarmDataUpsertRequest.__name__, response_model=FarmDataUpsertResponse.__name__, )