from models import DealGroup, Deal from repositories import DealRepository from repositories.mixins import * from schemas.deal_group import UpdateDealGroupSchema class DealGroupRepository( BaseRepository, RepGetByIdMixin[DealGroup], RepUpdateMixin[DealGroup, UpdateDealGroupSchema], ): entity_class = DealGroup async def create(self, deals: list[Deal], lexorank: str) -> DealGroup: group = DealGroup(deals=deals, lexorank=lexorank) self.session.add(group) await self.session.commit() await self.session.refresh(group) return group async def update(self, entity: DealGroup, data: UpdateDealGroupSchema) -> DealGroup: if data.status_id: deal_repo = DealRepository(self.session) deals = await deal_repo.get_by_group_id(entity.id) for deal in deals: await deal_repo.update_status(deal, data.status_id) del data.status_id return await self._apply_update_data_to_model(entity, data, True) async def update_group_deals( self, group_id: int, old_deals: list[Deal], new_deals: list[Deal] ): old_set = set(old_deals) new_set = set(new_deals) deals_to_remove = old_set - new_set deals_to_add = new_set - old_set for deal in deals_to_remove: deal.group_id = None for deal in deals_to_add: deal.group_id = group_id self.session.add_all([*deals_to_remove, *deals_to_add]) await self.session.commit() async def delete(self, group_id: int) -> None: deal_repo = DealRepository(self.session) deals = await deal_repo.get_by_group_id(group_id) for deal in deals: deal.is_deleted = True self.session.add(deal) await self.session.commit()