Files
xiaoxia-saas/packages/adapters/sqlalchemy_impl/edit_template_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

144 lines
5.2 KiB
Python
Executable File

"""SQLAlchemy implementation of EditTemplateRepository."""
from __future__ import annotations
from typing import List, Optional
from sqlalchemy.orm import Session
from packages.adapters.sqlalchemy_impl.models import EditTemplateModel
from packages.domain.edit_template import EditTemplate, EditTemplateStatus
class SQLAlchemyEditTemplateRepository:
"""SQLAlchemy 剪辑模板仓储"""
def __init__(self, session: Session) -> None:
self.session = session
def list_active(
self,
*,
template_type: Optional[str] = None,
skip: int = 0,
limit: int = 50,
) -> List[EditTemplate]:
"""列出所有激活的模板"""
query = self.session.query(EditTemplateModel).filter(
EditTemplateModel.status == EditTemplateStatus.ACTIVE,
)
if template_type:
query = query.filter(EditTemplateModel.template_type == template_type)
query = query.order_by(
EditTemplateModel.sort_weight.desc(),
EditTemplateModel.created_at.desc(),
)
models = query.offset(skip).limit(limit).all()
return [self._model_to_entity(m) for m in models]
def list_all(
self,
*,
template_type: Optional[str] = None,
status: Optional[EditTemplateStatus] = None,
skip: int = 0,
limit: int = 50,
) -> List[EditTemplate]:
"""列出所有模板(含非激活)"""
query = self.session.query(EditTemplateModel)
if template_type:
query = query.filter(EditTemplateModel.template_type == template_type)
if status:
query = query.filter(EditTemplateModel.status == status)
query = query.order_by(
EditTemplateModel.sort_weight.desc(),
EditTemplateModel.created_at.desc(),
)
models = query.offset(skip).limit(limit).all()
return [self._model_to_entity(m) for m in models]
def get(self, template_id: str) -> Optional[EditTemplate]:
"""根据 ID 获取模板"""
model = self.session.query(EditTemplateModel).filter(EditTemplateModel.id == template_id).first()
if model is None:
return None
return self._model_to_entity(model)
def create(self, template: EditTemplate) -> EditTemplate:
"""创建模板"""
model = EditTemplateModel(
id=template.id,
name=template.name,
description=template.description,
template_type=template.template_type,
editing_mode=template.editing_mode,
config=template.config,
preview_url=template.preview_url,
sort_weight=template.sort_weight,
status=template.status,
version=template.version,
)
self.session.add(model)
self.session.commit()
self.session.refresh(model)
return self._model_to_entity(model)
def update(self, template: EditTemplate) -> EditTemplate:
"""更新模板"""
model = self.session.query(EditTemplateModel).filter(EditTemplateModel.id == template.id).first()
if model is None:
raise ValueError(f"EditTemplate {template.id} not found")
model.name = template.name
model.description = template.description
model.template_type = template.template_type
model.editing_mode = template.editing_mode
model.config = template.config
model.preview_url = template.preview_url
model.sort_weight = template.sort_weight
model.status = template.status
model.version = template.version
model.updated_at = template.updated_at
self.session.commit()
self.session.refresh(model)
return self._model_to_entity(model)
def delete(self, template_id: str) -> bool:
"""删除模板"""
model = self.session.query(EditTemplateModel).filter(EditTemplateModel.id == template_id).first()
if model is None:
return False
self.session.delete(model)
self.session.commit()
return True
def count(
self,
*,
template_type: Optional[str] = None,
status: Optional[EditTemplateStatus] = None,
) -> int:
"""统计模板数量"""
query = self.session.query(EditTemplateModel)
if template_type:
query = query.filter(EditTemplateModel.template_type == template_type)
if status:
query = query.filter(EditTemplateModel.status == status)
return query.count()
@staticmethod
def _model_to_entity(model: EditTemplateModel) -> EditTemplate:
return EditTemplate(
id=model.id,
name=model.name,
description=model.description or "",
template_type=model.template_type or "default",
editing_mode=model.editing_mode or "one_take",
config=model.config or {},
preview_url=model.preview_url or "",
sort_weight=model.sort_weight or 0,
status=EditTemplateStatus(model.status) if model.status else EditTemplateStatus.ACTIVE,
version=model.version or 1,
created_at=model.created_at,
updated_at=model.updated_at,
)