33 lines
963 B
Python
33 lines
963 B
Python
"""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)
|