ADR-0031:DDL 生成 API 与版本生命周期 API 分域
- 状态:已接受(2026-08-09);已实施(2026-08-09)
- 前置:ADR-0030(Freemarker 终态、BE 权威生成);ADR-0022(A 层版本 / B 层实库)
- 关联:
HisProjectController、DbChangeService、ConnectorController
背景
ADR-0030 已将 product path 的 DDL 生成迁至后端 Freemarker,但 HTTP 路由仍挂在 HisProjectController(/ncnb/hisProject/*)。该 Controller 名与 Swagger tag dbChange 均表达「版本 / 变更历史」,却同时承载:
| 端点 | 语义 | 主要消费方 |
|---|---|---|
load / save / delete* | 版本快照 CRUD | 版本页、Save.hisProject* |
POST /dbChange | 分页列表 | useVersionStore |
diff | 工作区 ↔ 最新版本 structural diff + 增量 DDL | 版本面板、dirty chip |
syncSql | 全量/增量同步脚本(相对版本基线) | 版本「同步到库」预览 |
exportDdl | 全量 DDL 片段导出 | 导出对话框、exportSlice |
tableDdl | 单表元数据 DDL | 表属性 DDL 标签 |
previewDdlTemplate | 模板编辑器草稿预览(样例实体) | DDL 模板弹窗 |
问题:previewDdlTemplate / exportDdl / tableDdl 不读写 db_change,与版本生命周期无关;挂在 hisProject 误导 API 边界、OpenAPI 分组与后续 Public API / MCP 切片。用户已明确:previewDdlTemplate 放在 HisProjectController 不合适。
约束:Freemarker 引擎与 DbChangeService 编排 不变;@RequireProjectAccess + @ProjectId / @DbKey 不变;禁止并入 ConnectorController(该域负责活库连接、逆向、下发 DML/DDL 执行,见 ADR-0022 B 层 )。
决策
1. 分两个 Controller(路由分域,Service 复用)
| 域 | Controller | 路由前缀 | 职责 |
|---|---|---|---|
| 版本生命周期 | HisProjectController(保留) | /ncnb/hisProject/* + /ncnb/dbChange | 版本 CRUD、分页、A 层 diff;可选保留 syncSql |
| DDL 生成(只读渲染) | ProjectDdlController(新增) | /ncnb/projectDdl/* | 模板预览、全量导出、单表 DDL |
选用
projectDdl而非ddl:避免与 connector 下发 SQL、Public API 未来/ddl动词混淆;与projectId归属一致。
2. 端点归属(目标态)
留在 HisProjectController
| 方法 | 路径 | Service |
|---|---|---|
| POST | /ncnb/hisProject/load | loadHistory |
| POST | /ncnb/dbChange | getPage |
| POST | /ncnb/hisProject/save | saveVersion |
| POST | /ncnb/hisProject/delete/{changeId} | deleteHistory |
| POST | /ncnb/hisProject/deleteAll | deleteAllHistory |
| POST | /ncnb/hisProject/diff | diffAgainstLatest |
| POST | /ncnb/hisProject/syncSql | generateSyncSql |
syncSql 归属说明(已拍板):留在 hisProject。消费方为版本面板「同步到库」;入参依赖版本基线 / changes,语义是「相对已保存版本的同步脚本」,不是独立的全量 schema 导出。若未来 Public API 需要无版本上下文的 DDL,在 ProjectDdlController 另开参数化端点,不搬 syncSql。
迁至 ProjectDdlController
| 方法 | 现路径 | 目标路径 | Service |
|---|---|---|---|
| POST | /ncnb/hisProject/previewDdlTemplate | /ncnb/projectDdl/previewTemplate | previewDdlTemplate |
| POST | /ncnb/hisProject/exportDdl | /ncnb/projectDdl/export | generateExportDdl |
| POST | /ncnb/hisProject/tableDdl | /ncnb/projectDdl/table | generateTableDdl |
- 请求体 / 响应体 不变(仍
{ sql: string }或现有R包装)。 - 新方法名略短(去掉冗余
Ddl前缀),因路径已含projectDdl