"""Artist repository — adapter over ``AsyncSession``.""" from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.domain.entities.track import Artist from app.infrastructure.db.models.artist import ArtistModel def _to_entity(row: ArtistModel) -> Artist: return Artist( id=row.id, name=row.name, created_at=row.created_at, updated_at=row.updated_at, ) class SqlAlchemyArtistRepository: def __init__(self, session: AsyncSession) -> None: self._session = session async def get_or_create(self, name: str) -> Artist: row = ( await self._session.execute(select(ArtistModel).where(ArtistModel.name == name)) ).scalar_one_or_none() if row is None: row = ArtistModel(name=name) self._session.add(row) await self._session.flush() await self._session.refresh(row) return _to_entity(row)