from typing import Optional from sqlalchemy import select, func from models import Status, Deal from repositories.base import BaseRepository from repositories.mixins import RepDeleteMixin, RepCreateMixin from schemas.status import UpdateStatusSchema, CreateStatusSchema class StatusRepository( BaseRepository, RepDeleteMixin[Status], RepCreateMixin[Deal, CreateStatusSchema], ): entity_class = Status async def get_all(self, board_id: int) -> list[Status]: stmt = ( select(Status) .where(Status.is_deleted.is_(False), Status.board_id == board_id) .order_by(Status.lexorank) ) result = await self.session.execute(stmt) return list(result.scalars().all()) async def get_by_id(self, status_id: int) -> Optional[Status]: stmt = select(Status).where( Status.id == status_id, Status.is_deleted.is_(False) ) result = await self.session.execute(stmt) return result.scalar_one_or_none() async def get_deals_count(self, status_id: int) -> int: stmt = select(func.count(Deal.id)).where(Deal.status_id == status_id) result = await self.session.execute(stmt) return result.scalar() async def update(self, status: Status, data: UpdateStatusSchema) -> Status: status.lexorank = data.lexorank if data.lexorank else status.lexorank status.name = data.name if data.name else status.name self.session.add(status) await self.session.commit() await self.session.refresh(status) return status