import math from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession from repositories import DealRepository from schemas.base import PaginationSchema from schemas.deal import * class DealService: def __init__(self, session: AsyncSession): self.repository = DealRepository(session) async def get_deals( self, pagination: PaginationSchema, board_id: Optional[int], project_id: Optional[int], ) -> GetDealsResponse: deals, total_items = await self.repository.get_all( board_id, project_id, pagination.page, pagination.items_per_page ) total_pages = 1 if pagination.items_per_page: total_pages = math.ceil(total_items / pagination.items_per_page) return GetDealsResponse( items=[DealSchema.model_validate(deal) for deal in deals], pagination_info=PaginationInfoSchema( total_pages=total_pages, total_items=total_items ), ) async def create_deal(self, request: CreateDealRequest) -> CreateDealResponse: deal = await self.repository.create(request.entity) return CreateDealResponse( entity=DealSchema.model_validate(deal), message="Сделка успешно создана", ) async def update_deal(self, deal_id: int, request: UpdateDealRequest): deal = await self.repository.get_by_id(deal_id) if not deal: raise HTTPException(status_code=404, detail="Сделка не найдена") await self.repository.update(deal, request.entity) return UpdateDealResponse(message="Сделка успешно обновлена") async def delete_deal(self, deal_id: int) -> DeleteDealResponse: deal = await self.repository.get_by_id(deal_id) if not deal: raise HTTPException(status_code=404, detail="Сделка не найдена") await self.repository.delete(deal, False) return DeleteDealResponse(message="Сделка успешно удалена")