55 lines
1.9 KiB
Python
Executable File
55 lines
1.9 KiB
Python
Executable File
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()
|