Initial commit
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user