Add services layer, tests, streaming UI, and cleanup legacy code

This commit is contained in:
Viktor Barzin 2026-02-06 20:55:10 +00:00
parent 5514fa6381
commit d205d15c74
62 changed files with 3729 additions and 1024 deletions

View file

@ -5,7 +5,7 @@ from datetime import datetime, timedelta
import enum
import json
from typing import Any, Dict, List
from pydantic import BaseModel
from pydantic import BaseModel, Field as PydanticField
from rec import routing
from sqlmodel import JSON, TEXT, SQLModel, Field
@ -80,7 +80,10 @@ class Listing(SQLModel, table=False):
@property
def is_removed(self) -> bool:
return not self.additional_info["property"]["visible"]
if not self.additional_info:
return False
property_info = self.additional_info.get("property", {})
return not property_info.get("visible", True)
@property
def price_per_square_meter(self) -> float | None:
@ -231,14 +234,16 @@ class ListingType(enum.StrEnum):
RENT = "RENT"
@dataclass(frozen=True)
class QueryParameters(BaseModel):
"""Query parameters for filtering listings."""
model_config = {"frozen": True}
listing_type: ListingType
min_bedrooms: int = 1
max_bedrooms: int = 999
min_price: int = 0
max_price: int = 10_000_000
district_names: set[str] = dataclasses.field(default_factory=set)
district_names: set[str] = PydanticField(default_factory=set)
radius: float = 0
page_size: int = 500 # items per page
max_days_since_added: int = 14 # for buy listings