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