feat: 封面模板 CRUD API #1323
Reference in New Issue
Block a user
Delete Branch "feat/cover-templates-crud-api"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
变更内容
新增封面模板 CRUD API,对接前端封面设置 UI 改造。
API 接口
GET /api/v1/cover-templates— 列出系统模板 + 用户自定义模板POST /api/v1/cover-templates— 创建自定义模板PUT /api/v1/cover-templates/{id}— 更新模板(系统模板不可改)DELETE /api/v1/cover-templates/{id}— 删除自定义模板(系统模板不可删)技术实现
CoverTemplate(packages/domain/cover_template.py)CoverTemplate类型定义权限控制
is_system=true):所有用户可见,但不可修改/删除ba7434cfecto0bccd4fb60🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
新增 cover_templates 表及完整 CRUD 接口: - GET /api/v1/cover-templates 列出系统+用户模板 - POST /api/v1/cover-templates 创建自定义模板 - PUT /api/v1/cover-templates/{id} 更新模板(系统模板不可改) - DELETE /api/v1/cover-templates/{id} 删除自定义模板(系统模板不可删) 技术实现: - 领域实体 CoverTemplate(packages/domain/cover_template.py) - 仓储接口 + SQLAlchemy 实现 + InMemory 实现 - Schema 对齐前端 CoverTemplate 类型定义 - Alembic migration 055,含 8 个系统模板 seed 数据 - 28 个新单测,全量 13704 单测通过c8779eb8b7to70e4d3e53770e4d3e537to54c16765e9【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[alembic/versions/055_cover_templates.py: 72] 数据迁移中 JSON 字段处理错误
json.dumps(config)将字典转换为字符串。由于数据库列定义为sa.JSON,SQLAlchemy 会自动处理 Python 字典到 JSON 类型的转换。手动json.dumps会导致数据库中存储的是 JSON 字符串(如"{\"key\":\"value\"}")而不是 JSON 对象(如{"key":"value"})。这会导致应用程序读取数据时得到字符串而非字典,从而引发类型错误或逻辑崩溃。config字典对象,删除json.dumps()调用。[packages/adapters/sqlalchemy_impl/cover_template_repository.py: 19, 55, 73] 仓储层破坏了事务边界
create、update和delete方法中直接调用了self.session.commit()。在 FastAPI 结合 SQLAlchemy 的标准实践中,Session 通常由请求作用域的依赖项(如get_db_session)管理,并在请求结束时统一提交或回滚。在仓储内部提前提交会导致:1. 如果后续业务逻辑抛出异常,已提交的数据无法回滚,造成数据不一致;2. 破坏了 Unit of Work 模式。self.session.commit(),将事务控制权交由上层的依赖项管理。💡 改进建议(不阻塞合并)
[apps/api/app/api/routes/cover_templates.py: 20, 47] 依赖注入类型标注缺失
repo: Any = Depends(...)使用了Any类型。建议将其标注为具体的接口类型CoverTemplateRepository,以提高代码的可读性和 IDE 的支持度(如自动补全)。[apps/api/app/api/routes/cover_templates.py: 79] 异常处理不够友好
update_cover_template中调用了repo.update(template),如果该模板在get之后被删除(并发场景),仓储层会抛出ValueError。目前未捕获该异常,FastAPI 会将其处理为 500 Internal Server Error。建议捕获ValueError并返回 404 或 400 错误,提升 API 用户体验。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-08-09 09:09:48 | 模型:
🗑️ 预览环境已清理
PR #1323 已关闭或合并,对应的预览环境已被清理。