from __future__ import annotations from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.entities import Directory class DirectoryRepository: def __init__(self, session: AsyncSession) -> None: self.session = session async def get_by_id(self, directory_id: str) -> Directory | None: return await self.session.get(Directory, directory_id) async def get_root(self) -> Directory | None: result = await self.session.execute( select(Directory).where(Directory.parent_id.is_(None), Directory.deleted_at.is_(None)) ) return result.scalar_one_or_none() async def list_children(self, parent_id: str) -> list[Directory]: result = await self.session.execute( select(Directory) .where(Directory.parent_id == parent_id, Directory.deleted_at.is_(None)) .order_by(Directory.name.asc()) ) return list(result.scalars().all()) async def get_by_parent_and_name(self, parent_id: str | None, name: str) -> Directory | None: result = await self.session.execute( select(Directory).where( Directory.parent_id == parent_id, Directory.name == name, Directory.deleted_at.is_(None), ) ) return result.scalar_one_or_none() async def list_descendants_by_path_prefix(self, path_prefix: str) -> list[Directory]: like_pattern = f"{path_prefix}/%" result = await self.session.execute( select(Directory) .where(Directory.path_key.like(like_pattern), Directory.deleted_at.is_(None)) .order_by(Directory.path_key.asc()) ) return list(result.scalars().all()) async def create(self, directory: Directory) -> Directory: self.session.add(directory) await self.session.flush() await self.session.refresh(directory) return directory async def save(self, directory: Directory) -> Directory: await self.session.flush() await self.session.refresh(directory) return directory