48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
from sqlalchemy import select, update
|
|
from sqlalchemy.exc import IntegrityError
|
|
from sqlalchemy.orm import Session
|
|
from app.domain.Exception import DuplicateModelVersionError
|
|
from app.domain.Model import Model
|
|
from app.domain.ModelRepository import ModelRepository
|
|
from app.infrastructure.database import ModelRecord
|
|
|
|
|
|
class ModelRepositoryImpl(ModelRepository):
|
|
def __init__(self, session: Session) -> None:
|
|
self._session = session
|
|
|
|
def get_latest(self) -> Model | None:
|
|
stmt = (
|
|
select(ModelRecord)
|
|
.order_by(ModelRecord.is_latest.desc(), ModelRecord.created_at.desc())
|
|
.limit(1)
|
|
)
|
|
record = self._session.scalar(stmt)
|
|
return record.to_domain() if record else None
|
|
|
|
def get_by_version(self, version: str) -> Model | None:
|
|
stmt = select(ModelRecord).where(ModelRecord.version == version)
|
|
record = self._session.scalar(stmt)
|
|
return record.to_domain() if record else None
|
|
|
|
def add(self, model: Model) -> Model:
|
|
record = ModelRecord(
|
|
version=model.version,
|
|
filename=model.filename,
|
|
file_path=model.file_path,
|
|
created_at=model.created_at,
|
|
is_latest=model.is_latest,
|
|
)
|
|
try:
|
|
self._session.execute(update(ModelRecord).values(is_latest=False))
|
|
self._session.add(record)
|
|
self._session.commit()
|
|
self._session.refresh(record)
|
|
return record.to_domain()
|
|
except IntegrityError as exc:
|
|
self._session.rollback()
|
|
raise DuplicateModelVersionError(
|
|
f"Model version '{model.version}' already exists."
|
|
) from exc
|
|
|