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, 5734685107, # Seller manager,
355242295, # Dsnonchik 355242295, # Dsnonchik
651158209, # kristina 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 from models import BaseModel
@@ -7,3 +7,4 @@ class ShippingWarehouse(BaseModel):
__tablename__ = 'shipping_warehouses' __tablename__ = 'shipping_warehouses'
id: Mapped[int] = mapped_column(primary_key=True) id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(nullable=False) 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 typing import Annotated
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from backend.dependecies import SessionDependency
from backend.session import get_session 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.auth import authorized_user
from services.shipping_warehouse import ShippingWarehouseService from services.shipping_warehouse import ShippingWarehouseService
@@ -26,3 +28,38 @@ async def get_all(
return await ShippingWarehouseService(session).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 rank: int
base_marketplace: Optional[BaseMarketplaceSchema] = None base_marketplace: Optional[BaseMarketplaceSchema] = None
shipment_warehouse_id: Optional[int]
class DealServiceSchema(BaseSchema): class DealServiceSchema(BaseSchema):
service: ServiceSchema service: ServiceSchema

View File

@@ -1,12 +1,47 @@
from typing import List from typing import List
from schemas.base import BaseSchema from schemas.base import BaseSchema, OkMessageSchema
class ShippingWarehouseSchema(BaseSchema): # region Entities
id: int class BaseShippingWarehouseSchema(BaseSchema):
name: str 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): class GetAllShippingWarehousesResponse(BaseSchema):
shipping_warehouses: List[ShippingWarehouseSchema] 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, total_price=total_price,
rank=rank, rank=rank,
base_marketplace=base_marketplace, 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) return DealSummaryResponse(summaries=summaries)

View File

@@ -1,9 +1,13 @@
from idlelib.rpc import response_queue
from typing import Union from typing import Union
from sqlalchemy import select from sqlalchemy import select, update, delete
import models 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 from services.base import BaseService
@@ -13,6 +17,9 @@ class ShippingWarehouseService(BaseService):
select( select(
models.ShippingWarehouse models.ShippingWarehouse
) )
.where(
models.ShippingWarehouse.is_deleted == False
)
.order_by( .order_by(
models.ShippingWarehouse.id models.ShippingWarehouse.id
) )
@@ -24,7 +31,15 @@ class ShippingWarehouseService(BaseService):
return GetAllShippingWarehousesResponse(shipping_warehouses=result) return GetAllShippingWarehousesResponse(shipping_warehouses=result)
async def get_by_name(self, name: str) -> Union[models.ShippingWarehouse, None]: 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) shipping_warehouse = await self.session.scalar(stmt)
return shipping_warehouse return shipping_warehouse
@@ -35,3 +50,60 @@ class ShippingWarehouseService(BaseService):
self.session.add(shipping_warehouse) self.session.add(shipping_warehouse)
await self.session.flush() await self.session.flush()
return shipping_warehouse 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))