from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession from modules.fulfillment_base.models import DealProduct from modules.fulfillment_base.repositories import ( DealProductRepository, ServicesKitRepository, ProductServiceRepository, ) from modules.fulfillment_base.schemas.deal_product import * from services.mixins import ServiceGetAllMixin class DealProductService(ServiceGetAllMixin[DealProduct, DealProductSchema]): schema_class = DealProductSchema entity_not_found_msg = "Связь товара со сделкой не найдена" def __init__(self, session: AsyncSession): self.repository = DealProductRepository(session) async def create( self, request: CreateDealProductRequest ) -> CreateDealProductResponse: await self.repository.create(request.entity) deal_product = await self.repository.get_by_id( request.entity.deal_id, request.entity.product_id ) return CreateDealProductResponse( entity=DealProductSchema.model_validate(deal_product), message="Товар добавлен в сделку", ) async def update( self, deal_id: int, product_id: int, data: UpdateDealProductRequest ) -> UpdateDealProductResponse: entity = await self.repository.get_by_id(deal_id, product_id) if not entity: raise HTTPException(status_code=404, detail=self.entity_not_found_msg) await self.repository.update(entity, data.entity) return UpdateDealProductResponse(message="Товар сделки обновлен") async def delete(self, deal_id: int, product_id: int) -> DeleteDealProductResponse: entity = await self.repository.get_by_id(deal_id, product_id) if not entity: raise HTTPException(status_code=404, detail=self.entity_not_found_msg) await self.repository.delete(entity) return DeleteDealProductResponse(message="Товар удален из сделки") async def add_services_kit( self, request: DealProductAddKitRequest ) -> DealProductAddKitResponse: services_kit_repo = ServicesKitRepository(self.repository.session) services_kit = await services_kit_repo.get_by_id(request.kit_id) deal_product = await self.repository.get_by_id(request.deal_id, request.product_id) product_service_repo = ProductServiceRepository(self.repository.session) await product_service_repo.delete_product_services( request.deal_id, [request.product_id] ) await self.repository.add_services_kit(deal_product, services_kit) return DealProductAddKitResponse(message="Комплект добавлен в товар")