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 from schemas.project import CreateProjectSchema, UpdateProjectSchema class ProjectRepository(BaseRepository, RepDeleteMixin[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 create(self, data: CreateProjectSchema) -> Project: project = Project(**data.model_dump()) self.session.add(project) await self.session.commit() await self.session.refresh(project) return project 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