feat: product search

This commit is contained in:
2024-09-08 03:36:42 +03:00
parent e5be667690
commit 780b3b4b32
2 changed files with 26 additions and 5 deletions

View File

@@ -32,6 +32,7 @@ class DealSummary(BaseSchema):
total_price: int
rank: int
base_marketplace: Optional[BaseMarketplaceSchema] = None
total_products: int
shipment_warehouse_id: Optional[int]
shipment_warehouse_name: Optional[str]

View File

@@ -6,7 +6,7 @@ from starlette import status
import models.deal
import models.secondary
from models import User, Service, Client
from models import User, Service, Client, DealProduct
from models.deal import *
from schemas.client import ClientDetailsSchema
from schemas.deal import *
@@ -15,6 +15,7 @@ from services.base import BaseService
from services.client import ClientService
from services.service import ServiceService
from services.shipping_warehouse import ShippingWarehouseService
from utils.list_utils import compile_query_to_plain_sql
class DealService(BaseService):
@@ -165,8 +166,20 @@ class DealService(BaseService):
)
return final_subquery
def _get_products_quantity_subquery(self):
deal_products_subquery = (
select(
models.secondary.DealProduct.deal_id,
func.sum(models.secondary.DealProduct.quantity).label('total_quantity')
)
.group_by(models.secondary.DealProduct.deal_id)
.subquery()
)
return deal_products_subquery
async def get_summary(self, full: bool = False) -> DealSummaryResponse:
price_subquery = self._get_price_subquery()
products_quantity_subquery = self._get_products_quantity_subquery()
q = (
select(
Deal,
@@ -174,7 +187,8 @@ class DealService(BaseService):
func.row_number().over(
partition_by=Deal.current_status,
order_by=Deal.lexorank
).label('rank')
).label('rank'),
func.coalesce(products_quantity_subquery.c.total_quantity, 0)
)
.options(
selectinload(Deal.status_history),
@@ -182,7 +196,11 @@ class DealService(BaseService):
joinedload(Deal.shipping_warehouse),
)
.outerjoin(
price_subquery, Deal.id == price_subquery.c.deal_id)
price_subquery, Deal.id == price_subquery.c.deal_id,
)
.outerjoin(
products_quantity_subquery, Deal.id == products_quantity_subquery.c.deal_id
)
.where(
Deal.is_deleted == False,
)
@@ -194,9 +212,10 @@ class DealService(BaseService):
)
else:
q = q.order_by(Deal.created_at.desc())
print(compile_query_to_plain_sql(q))
deals_query = await self.session.execute(q)
summaries = []
for deal, total_price, rank in deals_query.all():
for deal, total_price, rank, products_count in deals_query.all():
deal: Deal
last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
deadline = last_status.next_status_deadline
@@ -217,7 +236,8 @@ class DealService(BaseService):
base_marketplace=base_marketplace,
created_at=deal.created_at,
shipment_warehouse_id=deal.shipping_warehouse_id,
shipment_warehouse_name=shipment_warehouse_name
shipment_warehouse_name=shipment_warehouse_name,
total_products=products_count
)
)
return DealSummaryResponse(summaries=summaries)