Newer
Older
vmk-360-data_collector / src / vmk_data_collector / schemas / raw_data.py
@Eugene Sukhodolskiy Eugene Sukhodolskiy 1 day ago 1 KB feat: implement review items 1-7
from typing import Any

from pydantic import BaseModel, field_validator, model_validator


class PayloadSchema(BaseModel):
    """Strict schema for the ingest payload."""

    model_config = {"extra": "allow"}

    title: str | None = None
    description: str | None = None
    price: str | float | int | None = None
    url: str | None = None
    images: list[str] | None = None
    contact_phone: str | None = None
    address: str | None = None
    area: str | float | int | None = None
    rooms: str | int | None = None
    floor: str | int | None = None

    @model_validator(mode="after")
    def check_title_or_description(self):
        if not self.title and not self.description:
            raise ValueError("Payload must contain at least title or description")
        return self

    @field_validator("images")
    @classmethod
    def images_must_be_strings(cls, value: list[str] | None) -> list[str] | None:
        if value is None:
            return value
        if not isinstance(value, list):
            raise ValueError("images must be a list")
        for item in value:
            if not isinstance(item, str):
                raise ValueError("All images must be URLs (strings)")
        return value


class RawDataIngestRequest(BaseModel):
    source_slug: str
    external_id: str
    payload: dict[str, Any]


class IngestResponse(BaseModel):
    job_id: int
    property_id: int | None = None
    status: str
    reason: str | None = None
    message: str
    snapshot_id: int | None = None