from idlelib.rpc import response_queue from typing import Union from sqlalchemy import select, update, delete import models from models import ShippingWarehouse from schemas.shipping_warehouse import GetAllShippingWarehousesResponse, ShippingWarehouseSchema, \ CreateShippingWarehouseResponse, CreateShippingWarehouseRequest, UpdateShippingWarehouseRequest, \ UpdateShippingWarehouseResponse, DeleteShippingWarehouseRequest, DeleteShippingWarehouseResponse from services.base import BaseService class ShippingWarehouseService(BaseService): async def get_all(self) -> GetAllShippingWarehousesResponse: stmt = ( select( models.ShippingWarehouse ) .where( models.ShippingWarehouse.is_deleted == False ) .order_by( models.ShippingWarehouse.id ) ) shipping_warehouses = (await self.session.scalars(stmt)).all() result = [] for shipping_warehouse in shipping_warehouses: result.append(ShippingWarehouseSchema.model_validate(shipping_warehouse)) 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, models.ShippingWarehouse.is_deleted == False ) ) shipping_warehouse = await self.session.scalar(stmt) return shipping_warehouse async def create_by_name(self, name: str) -> models.ShippingWarehouse: shipping_warehouse = models.ShippingWarehouse( name=name ) 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))