add support for querying buying listings as well as by max price

This commit is contained in:
Viktor Barzin 2025-06-18 20:38:50 +00:00
parent ba4a95825b
commit 69d15e9a16
No known key found for this signature in database
GPG key ID: 4056458DBDBF8863
5 changed files with 95 additions and 31 deletions

View file

@ -4,6 +4,7 @@ from models.listing import (
BuyListing,
FurnishType,
Listing as modelListing,
ListingType,
QueryParameters,
RentListing,
)
@ -32,12 +33,19 @@ class ListingRepository:
"""
only_ids = only_ids or []
query = select(
RentListing
) # TODO: one nice day I will think of a way to query both rent and buy
model = RentListing # if no query params, default to renting listings
if query_parameters:
model = (
RentListing
if query_parameters.listing_type == ListingType.RENT
else BuyListing
# else RentListing
)
query = select(model)
if only_ids:
query = query.where(RentListing.id.in_(only_ids)) # type: ignore
query = self._add_where_from_query_parameters(query, query_parameters)
query = query.where(model.id.in_(only_ids)) # type: ignore
query = self._add_where_from_query_parameters(query, model, query_parameters)
if limit:
query = query.limit(limit)
@ -47,34 +55,31 @@ class ListingRepository:
def _add_where_from_query_parameters(
self,
query: SelectOfScalar[RentListing],
query: SelectOfScalar[Listing],
model: type[Listing],
query_parameters: QueryParameters | None = None,
) -> SelectOfScalar[RentListing]:
) -> SelectOfScalar[Listing]:
if query_parameters is None:
return query
query = query.where(
RentListing.number_of_bedrooms.between(
model.number_of_bedrooms.between(
query_parameters.min_bedrooms, query_parameters.max_bedrooms
),
RentListing.price.between(
query_parameters.min_price, query_parameters.max_price
),
model.price.between(query_parameters.min_price, query_parameters.max_price),
)
if query_parameters.min_sqm is not None:
query = query.where(RentListing.square_meters >= query_parameters.min_sqm)
query = query.where(model.square_meters >= query_parameters.min_sqm)
if query_parameters.furnish_types:
query = query.where(
RentListing.furnish_type.in_(query_parameters.furnish_types)
)
query = query.where(model.furnish_type.in_(query_parameters.furnish_types))
if query_parameters.let_date_available_from is not None:
query = query.where(
RentListing.available_from >= query_parameters.let_date_available_from
model.available_from >= query_parameters.let_date_available_from
)
if query_parameters.last_seen_days is not None:
last_seen_threshold = datetime.now() - timedelta(
days=query_parameters.last_seen_days
)
query = query.where(RentListing.last_seen >= last_seen_threshold)
query = query.where(model.last_seen >= last_seen_threshold)
return query
async def upsert_listings(