from datetime import datetime from typing import Optional from sqlalchemy import select from sqlalchemy.orm import selectinload from models import Board from repositories.base import BaseRepository from schemas.board import UpdateBoardSchema, CreateBoardSchema class BoardRepository(BaseRepository): 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 create(self, data: CreateBoardSchema) -> Board: board_data = data.model_dump() board_data["created_at"] = datetime.now() board = Board(**board_data) self.session.add(board) await self.session.commit() await self.session.refresh(board) return board 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 async def delete(self, board: Board, is_soft: bool): if not is_soft: await self.session.delete(board) await self.session.commit() return board.is_deleted = True self.session.add(board) await self.session.commit()