Files
xiaoxia-saas/packages/adapters/sqlalchemy_impl/template_version_repository.py
T
xiaoxia 419cc3fb6a
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Build Staging Web Image (push) Successful in 3m12s
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 5m56s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 5m58s
CI/CD Pipeline / Frontend Lint (push) Successful in 6m32s
CI/CD Pipeline / Unit Tests (push) Failing after 6m48s
CI/CD Pipeline / Build Staging API Image (push) Successful in 8m5s
CI/CD Pipeline / Integration Tests (push) Successful in 2m9s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 9m50s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 2m1s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 41s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 1m34s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m40s
feat(phase2): 模板发布版本化 + 回滚能力 (#646)
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
2026-07-20 18:15:00 +08:00

80 lines
2.7 KiB
Python
Executable File

"""SQLAlchemy implementation of EditTemplateVersionRepository."""
from __future__ import annotations
from typing import List
from sqlalchemy.orm import Session
from packages.domain.template_version import EditTemplateVersion
class SQLAlchemyTemplateVersionRepository:
"""模板版本仓储实现(SQLAlchemy)。"""
def __init__(self, db: Session) -> None:
self._db = db
def create(self, version: EditTemplateVersion) -> EditTemplateVersion:
"""保存新版本快照"""
from packages.adapters.sqlalchemy_impl.models import EditTemplateVersionModel
model = EditTemplateVersionModel(
id=version.id,
template_id=version.template_id,
version=version.version,
name=version.name,
editing_mode=version.editing_mode,
config=version.config,
clip_configs=version.clip_configs,
change_note=version.change_note,
published_by=version.published_by,
created_at=version.created_at,
)
self._db.add(model)
self._db.flush()
return version
def get_by_version(self, template_id: str, version: int) -> EditTemplateVersion | None:
"""按版本号获取快照"""
from packages.adapters.sqlalchemy_impl.models import EditTemplateVersionModel
model = (
self._db.query(EditTemplateVersionModel)
.filter(
EditTemplateVersionModel.template_id == template_id,
EditTemplateVersionModel.version == version,
)
.first()
)
if model is None:
return None
return self._to_entity(model)
def list_by_template(self, template_id: str, limit: int = 50) -> List[EditTemplateVersion]:
"""列出模板的所有历史版本(按版本号倒序)"""
from packages.adapters.sqlalchemy_impl.models import EditTemplateVersionModel
models = (
self._db.query(EditTemplateVersionModel)
.filter(EditTemplateVersionModel.template_id == template_id)
.order_by(EditTemplateVersionModel.version.desc())
.limit(limit)
.all()
)
return [self._to_entity(m) for m in models]
def _to_entity(self, model) -> EditTemplateVersion:
return EditTemplateVersion(
id=model.id,
template_id=model.template_id,
version=model.version,
name=model.name or "",
editing_mode=model.editing_mode or "one_take",
config=model.config or {},
clip_configs=model.clip_configs or [],
change_note=model.change_note or "",
published_by=model.published_by or "",
created_at=model.created_at,
)