from typing import Optional from sqlalchemy import select from sqlalchemy.orm import selectinload from models import Board from repositories.base import BaseRepository from repositories.mixins import RepDeleteMixin, RepCreateMixin from schemas.board import UpdateBoardSchema, CreateBoardSchema class BoardRepository( BaseRepository, RepDeleteMixin[Board], RepCreateMixin[Board, CreateBoardSchema], ): entity_class = Board async def get_all(self, project_id: int) -> list[Board]: stmt = ( select(Board) .where(Board.is_deleted.is_(False), Board.project_id == project_id) .order_by(Board.lexorank) ) result = await self.session.execute(stmt) return list(result.scalars().all()) async def get_by_id(self, board_id: int) -> Optional[Board]: stmt = ( select(Board) .where(Board.id == board_id, Board.is_deleted.is_(False)) .options(selectinload(Board.deals)) ) result = await self.session.execute(stmt) return result.scalar_one_or_none() async def update(self, board: Board, data: UpdateBoardSchema) -> Board: board.lexorank = data.lexorank if data.lexorank else board.lexorank board.name = data.name if data.name else board.name self.session.add(board) await self.session.commit() await self.session.refresh(board) return board