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