kra-oa/docs/audit/structure-optimization-plan.md

86 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Kra 分层与结构优化计划
## 1. 目标与约束
本轮优化以现有 Kratos 分层契约为准,不改变 GVA 兼容接口的请求、响应、
事务和错误语义。目标是收紧 DTO/DO/PO 边界、降低单文件职责密度,并删除
确认未接入的代码;不按业务资源重建整套子包,也不创建泛化 `utils`
结构决策遵循以下规则:
1. DTO 及 JSON/form/binding tag 只放在 `internal/service/dto`
2. DO、usecase、repo interface 和领域上下文保留在 `internal/biz`
3. PO、GORM/Casbin/缓存/文件存储等实现保留在 `internal/data`
4. HTTP 绑定、路由和中间件保留在 `internal/server`DTO -> DO 转换交给 service。
5. 只有无业务状态、至少有两个稳定消费者的能力才建立专用 `internal/<name>` 包。
6. 同包拆文件优先于新建 Go 子包,避免扩大导出面和破坏 Wire/事务协作。
## 2. 总体结论
静态依赖扫描未发现四层之间的硬性反向 import`biz` 不依赖 data/service/server
`data` 不依赖 service/server/DTO`service` 不依赖 data/server`server` 不依赖
data。当前架构无需推倒重建重点应放在文件职责和边界收紧。
不建议新增 `pkg/utils`。现有 `pkg/adminauth`、`pkg/logging` 已有清晰复用价值;
其他应用专属能力应留在 `internal`,防止把内部实现误扩成公共 API。
## 3. 按模块审查与执行计划
| 模块 | 当前判断 | 本轮动作 | 后续动作 |
| --- | --- | --- | --- |
| 登录与会话 | `LoginResult` 是传输响应,却位于 service 根包 | 移入 `service/dto` | `TokenAuthentication/AuthClaims` 仍跨到 middleware待专门设计 service 视图后再收口 |
| 用户 | handler 构造导出的 `service.UserInput`,边界不够明确 | 将输入模型私有化,新增 DTO request 方法 | `data/user.go` 按 read/write/relations 同包拆分 |
| API/Casbin | `data/api.go` 混合目录 CRUD、策略和同步 | 同包拆为 `api.go`、`api_policy.go`、`api_sync.go` | 继续保留 `casbin.go` 作为共享持久化辅助,不建 data 子包 |
| 初始化 | `DatabaseInit` 带 binding tag却位于 service 根包 | 移入 `service/dto` | 初始化事务和 seed 保持在 data不拆独立 package |
| 路由目录/Swagger | 路由分组表由 service 和 server 共同使用 | 抽到无状态的 `internal/routeinfo` | 后续评估与 operation-audit 路由目录合并,避免一次性大改 |
| 字典 | handler 直接构造 `biz.DictionaryDetailFilter` | 增加 service request 转换入口 | DTO 文件可在自然增长时再按资源拆分 |
| 媒体 | handler 直接构造 `biz.MediaFilter` | 增加 service request 转换入口 | `MediaConfig` 的 biz 类型暴露可在配置 DTO 整理时一并处理 |
| 审计/导出 | `page`、`IDsFromQuery` 放在 `audit.go`,但被多个 handler 使用 | 移到 `handler/query.go`,删除未引用 `queryUintValue` | 审计错误映射保留在 handler它属于 HTTP 展示语义 |
| 权限/组织 | data 文件较大,但 PO、事务和权限检查高度协作 | 本轮保持行为不动 | `authority.go` 同包拆 CRUD/relations/data-scope`system.go` 改为更明确的 identity model/constructor 文件 |
| 配置/热更新 | compat、merge、store、watch、bootstrap 已形成职责组 | 保持现状 | 仅在单文件继续增长时同包拆分,不创建 `internal/data/config` 子包 |
| 系统指标 | service 直接调用 gopsutil属于基础设施实现 | 本轮不动,避免扩大改动面 | 建立 biz provider interface由 data 实现指标采集service 只转 DTO |
| 定时任务 | biz 中存在全局可变 registryworker 负责具体注册 | 本轮不动 | 中期改为向 `TaskUsecase` 注入方法目录;仍不放入 pkg |
| 公共包 | `pkg/validate` 无任何调用,未接入 Gin/Kratos 链路 | 删除 `pkg/validate` | `biz/pagination.go` 按仓库分层契约保留,不因当前调用少而删除 |
## 4. data 层拆分边界
### 已执行API/Casbin
- `api.go`repo 构造、PO、转换、API CRUD 与列表。
- `api_policy.go`角色关联、授权判断、policy path 查询与替换。
- `api_sync.go`ignore API 与 API registry 同步。
- `casbin.go`:继续保存跨 repo 使用的 Casbin rule 和数据库辅助函数。
这些文件仍为同一个 `package data`PO 和事务辅助无需导出。
### 后续:身份与权限
建议在后续单独变更中完成,避免与接口兼容整改混在一起:
- `user.go` 拆为读取/装载、写入、用户关系三个文件;
- `authority.go` 拆为角色 CRUD/用户关系和 strict-auth/data-scope
- `system.go` 中共享 PO 与 repo 构造器改用能表达 identity 职责的文件名;
- 不把 user/authority/menu PO 移到公共 model 包。
## 5. 测试文件处理
本轮不按文件数量删除测试。现有测试主要保护 GVA 兼容语义、事务原子性、
Casbin/数据权限、安全、迁移、路由契约、日志路径和调度器行为,删除收益小于
回归风险。
可以在后续纯测试整理中做两类无损合并:
- 将少量 service 转换测试合并为按资源命名的 conversion 测试文件;
- 先用覆盖率确认部门树重复断言,再删除真正被更完整用例覆盖的函数。
`transactions_test.go`、`gin_test.go`、认证/安全、策略/数据权限、日志文件、
任务执行器和初始化 ignore 测试必须保留。
## 6. 验收
1. `gofmt` 覆盖全部修改的 Go 文件。
2. `go test ./...` 使用仓库内可写 `GOCACHE` 执行。
3. 结构调整后重新扫描层间 import 和已删除符号引用。
4. 任何全量测试失败都区分为本轮回归或已有环境/资源清理问题。
5. 不修改生成文件,不改变 Wire provider、路由数量或外部 JSON 字段。