feat: product search

This commit is contained in:
2024-08-25 04:19:42 +03:00
parent 2b79e0deba
commit a95aafb54b
7 changed files with 159 additions and 10 deletions

View File

@@ -11,5 +11,6 @@ allowed_telegram_ids = [
5734685107, # Seller manager,
355242295, # Dsnonchik
651158209, # kristina
502869937 # Sasha
502869937, # Sasha
7399730533
]

View File

@@ -1,4 +1,4 @@
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy.orm import Mapped, mapped_column, MapperEvents
from models import BaseModel
@@ -7,3 +7,4 @@ class ShippingWarehouse(BaseModel):
__tablename__ = 'shipping_warehouses'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(nullable=False)
is_deleted: Mapped[bool] = mapped_column(nullable=False, default=False, server_default='0')

View File

@@ -1,10 +1,12 @@
from idlelib.rpc import response_queue
from typing import Annotated
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from backend.dependecies import SessionDependency
from backend.session import get_session
from schemas.shipping_warehouse import GetAllShippingWarehousesResponse
from schemas.shipping_warehouse import *
from services.auth import authorized_user
from services.shipping_warehouse import ShippingWarehouseService
@@ -26,3 +28,38 @@ async def get_all(
return await ShippingWarehouseService(session).get_all()
@shipping_warehouse_router.post(
'/create',
response_model=CreateShippingWarehouseResponse,
operation_id='create_shipping_warehouse'
)
async def create(
session: SessionDependency,
request: CreateShippingWarehouseRequest
):
return await ShippingWarehouseService(session).create(request)
@shipping_warehouse_router.post(
'/update',
response_model=UpdateShippingWarehouseResponse,
operation_id='update_shipping_warehouse'
)
async def update(
session: SessionDependency,
request: UpdateShippingWarehouseRequest
):
return await ShippingWarehouseService(session).update(request)
@shipping_warehouse_router.post(
'/delete',
response_model=DeleteShippingWarehouseResponse,
operation_id='delete_shipping_warehouse'
)
async def delete(
session: SessionDependency,
request: DeleteShippingWarehouseRequest
):
return await ShippingWarehouseService(session).delete(request)

View File

@@ -33,6 +33,8 @@ class DealSummary(BaseSchema):
rank: int
base_marketplace: Optional[BaseMarketplaceSchema] = None
shipment_warehouse_id: Optional[int]
class DealServiceSchema(BaseSchema):
service: ServiceSchema

View File

@@ -1,12 +1,47 @@
from typing import List
from schemas.base import BaseSchema
from schemas.base import BaseSchema, OkMessageSchema
class ShippingWarehouseSchema(BaseSchema):
id: int
# region Entities
class BaseShippingWarehouseSchema(BaseSchema):
name: str
class ShippingWarehouseSchema(BaseShippingWarehouseSchema):
id: int
# endregion
# region Requests
class CreateShippingWarehouseRequest(BaseSchema):
shipping_warehouse: BaseShippingWarehouseSchema
class UpdateShippingWarehouseRequest(BaseSchema):
shipping_warehouse: ShippingWarehouseSchema
class DeleteShippingWarehouseRequest(BaseSchema):
shipping_warehouse_id: int
# endregion
# region Responses
class GetAllShippingWarehousesResponse(BaseSchema):
shipping_warehouses: List[ShippingWarehouseSchema]
class CreateShippingWarehouseResponse(OkMessageSchema):
pass
class UpdateShippingWarehouseResponse(OkMessageSchema):
pass
class DeleteShippingWarehouseResponse(OkMessageSchema):
pass
# endregion

View File

@@ -213,7 +213,8 @@ class DealService(BaseService):
total_price=total_price,
rank=rank,
base_marketplace=base_marketplace,
created_at=deal.created_at
created_at=deal.created_at,
shipment_warehouse_id=deal.shipping_warehouse_id
)
)
return DealSummaryResponse(summaries=summaries)

View File

@@ -1,9 +1,13 @@
from idlelib.rpc import response_queue
from typing import Union
from sqlalchemy import select
from sqlalchemy import select, update, delete
import models
from schemas.shipping_warehouse import GetAllShippingWarehousesResponse, ShippingWarehouseSchema
from models import ShippingWarehouse
from schemas.shipping_warehouse import GetAllShippingWarehousesResponse, ShippingWarehouseSchema, \
CreateShippingWarehouseResponse, CreateShippingWarehouseRequest, UpdateShippingWarehouseRequest, \
UpdateShippingWarehouseResponse, DeleteShippingWarehouseRequest, DeleteShippingWarehouseResponse
from services.base import BaseService
@@ -13,6 +17,9 @@ class ShippingWarehouseService(BaseService):
select(
models.ShippingWarehouse
)
.where(
models.ShippingWarehouse.is_deleted == False
)
.order_by(
models.ShippingWarehouse.id
)
@@ -24,7 +31,15 @@ class ShippingWarehouseService(BaseService):
return GetAllShippingWarehousesResponse(shipping_warehouses=result)
async def get_by_name(self, name: str) -> Union[models.ShippingWarehouse, None]:
stmt = select(models.ShippingWarehouse).where(models.ShippingWarehouse.name == name)
stmt = (
select(
models.ShippingWarehouse
)
.where(
models.ShippingWarehouse.name == name,
models.ShippingWarehouse.is_deleted == False
)
)
shipping_warehouse = await self.session.scalar(stmt)
return shipping_warehouse
@@ -35,3 +50,60 @@ class ShippingWarehouseService(BaseService):
self.session.add(shipping_warehouse)
await self.session.flush()
return shipping_warehouse
async def create(self, request: CreateShippingWarehouseRequest) -> CreateShippingWarehouseResponse:
try:
if await self.get_by_name(request.shipping_warehouse.name):
return CreateShippingWarehouseResponse(ok=False,
message="Склад отгрузки с таким названием уже существует")
await self.create_by_name(request.shipping_warehouse.name)
await self.session.commit()
return CreateShippingWarehouseResponse(
ok=True,
message="Склад отгрузки успешно создан"
)
except Exception as e:
return CreateShippingWarehouseResponse(ok=False,
message=str(e))
async def update(self, request: UpdateShippingWarehouseRequest) -> UpdateShippingWarehouseResponse:
try:
stmt = (
update(
ShippingWarehouse
)
.values(
request.shipping_warehouse.model_dump(
by_alias=False
)
)
.where(
ShippingWarehouse.id == request.shipping_warehouse.id
)
)
await self.session.execute(
stmt
)
await self.session.commit()
return UpdateShippingWarehouseResponse(ok=True, message='Склад отгрузки успешно обновлен')
except Exception as e:
return UpdateShippingWarehouseResponse(ok=False, message=str(e))
async def delete(self, request: DeleteShippingWarehouseRequest) -> DeleteShippingWarehouseResponse:
try:
stmt = (
update(
ShippingWarehouse
)
.values({
'is_deleted': True
})
.where(
ShippingWarehouse.id == request.shipping_warehouse_id
)
)
await self.session.execute(stmt)
await self.session.commit()
return DeleteShippingWarehouseResponse(ok=True, message='Склад отгрузки успешно удален')
except Exception as e:
return DeleteShippingWarehouseResponse(ok=False, message=str(e))