from __future__ import annotations import uuid from sqlalchemy import select from sqlalchemy.orm import selectinload from rehearsalhub.db.models import AudioVersion from rehearsalhub.repositories.base import BaseRepository class AudioVersionRepository(BaseRepository[AudioVersion]): model = AudioVersion async def get_by_etag(self, nc_file_etag: str) -> AudioVersion | None: stmt = select(AudioVersion).where(AudioVersion.nc_file_etag == nc_file_etag) result = await self.session.execute(stmt) return result.scalar_one_or_none() async def list_for_song(self, song_id: uuid.UUID) -> list[AudioVersion]: stmt = ( select(AudioVersion) .where(AudioVersion.song_id == song_id) .order_by(AudioVersion.version_number.desc()) ) result = await self.session.execute(stmt) return list(result.scalars().all()) async def get_latest_for_song(self, song_id: uuid.UUID) -> AudioVersion | None: stmt = ( select(AudioVersion) .where(AudioVersion.song_id == song_id) .order_by(AudioVersion.version_number.desc()) .limit(1) ) result = await self.session.execute(stmt) return result.scalar_one_or_none() async def get_with_annotations(self, version_id: uuid.UUID) -> AudioVersion | None: from rehearsalhub.db.models import Annotation, RangeAnalysis stmt = ( select(AudioVersion) .options( selectinload(AudioVersion.annotations).selectinload( Annotation.range_analysis ), selectinload(AudioVersion.annotations).selectinload(Annotation.reactions), selectinload(AudioVersion.annotations).selectinload(Annotation.author), ) .where(AudioVersion.id == version_id) ) result = await self.session.execute(stmt) return result.scalar_one_or_none()