Files

174 lines
14 KiB
Markdown
Raw Permalink 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.
# Codebase Concerns
**Analysis Date:** 2026-03-27
## Tech Debt
**配置与凭据管理严重级别Critical:**
- Issue: 仓库内存在已提交的生产/测试环境敏感配置与直连外部基础设施的写法,配置边界没有被代码、脚本和部署文件统一约束。
- Files: `docker-compose.prod.yml`, `Makefile`, `pkg/config/defaults/config.yaml`, `scripts/verify_migration/main.go`, `scripts/verify_indexes/main.go`, `docs/deployment/deployment-guide.md`
- Impact: 凭据轮换成本高泄漏后影响数据库、Redis、对象存储、短信网关、Gateway 与部署链路;开发、测试、生产边界容易串用。
- Supporting evidence:
- `docker-compose.prod.yml` 直接写入数据库、Redis、JWT、对象存储、Gateway、短信服务配置。
- `Makefile``DB_URL` 内嵌远程数据库连接串。
- `pkg/config/defaults/config.yaml``gateway.app_id``gateway.app_secret` 提供非空默认值,服务在未显式覆盖时仍会初始化 Gateway 客户端,见 `cmd/api/main.go:366-383`
- `scripts/verify_migration/main.go``scripts/verify_indexes/main.go` 直接写死远程 PostgreSQL DSN。
- `docs/deployment/deployment-guide.md` 把 Registry 凭据与数据库连接示例直接写进文档。
- Fix approach: 把所有密钥迁移到部署平台 Secret/环境注入;默认配置只保留空值;脚本统一改为读取环境变量;把示例文档改成占位符而不是真实值。
- Suggested follow-up investigation topics:
- 盘点 `openspec/`, `docs/`, `scripts/` 中所有历史凭据残留。
- 审查 Gitea Secrets、Docker Registry、数据库、Redis、对象存储、短信网关、Gateway 的轮换计划。
- 检查 `.env``.env.local` 是否已在团队机器与 Runner 上扩散。
**支付与微信配置迁移未闭环严重级别High:**
- Issue: 设计已经切到 `tb_wechat_config` + `payment_config_id`,但代码与文档仍保留环境变量和单例支付实现,处于半迁移状态。
- Files: `docs/wechat-config-management/功能总结.md`, `internal/service/order/service.go`, `internal/service/recharge/service.go`, `internal/handler/callback/payment.go`, `docs/environment-variables.md`, `scripts/verify-wechat.sh`, `docker-compose.prod.yml`
- Impact: 多支付配置切换、旧订单验签、客户端支付发起、OAuth 配置一致性存在行为不一致风险;运维很难判断哪些配置源仍然生效。
- Supporting evidence:
- `docs/wechat-config-management/功能总结.md:232-238` 明确写着客户端支付发起仍是留桩OAuth 仍从环境变量读取,且旧 `JUNHONG_WECHAT_PAYMENT_*` “可清理”。
- `internal/service/order/service.go:2107,2163,2356,2362``internal/service/recharge/service.go:271``internal/handler/callback/payment.go:66,143` 仍保留 TODO/留桩。
- `docs/environment-variables.md:36-69``scripts/verify-wechat.sh` 仍把微信支付环境变量当成必填启动前置条件。
- `docker-compose.prod.yml` 注释称“微信配置已迁移至数据库”,但部署文件仍维持部分旧式环境变量与其他支付相关外部配置模式。
- Fix approach: 明确单一配置源;把“已迁移”“留桩”“仍依赖环境变量”的边界写入运维文档;在代码层补齐动态加载或删除旧入口。
- Suggested follow-up investigation topics:
- 核实当前线上 OAuth 与支付分别读哪一套配置。
- 核查 `payment_config_id` 相关回调链路是否覆盖订单、资产充值、代理充值三条路径。
- 为未实现的客户端支付入口建立显式禁用清单。
**核心服务体量过大严重级别High:**
- Issue: 部分核心服务文件已经远超团队规范中的函数/文件规模要求,维护成本和回归风险高。
- Files: `internal/service/order/service.go`, `AGENTS.md`
- Impact: 改动难以局部验证;支付、幂等、库存/余额、回调逻辑耦合;新需求更容易引入回归。
- Supporting evidence:
- `AGENTS.md:371-375` 要求函数长度 ≤ 100 行,核心逻辑建议 ≤ 50 行。
- `internal/service/order/service.go` 的 TODO 已出现在 2107、2163、2356、2362 行,说明文件至少超过 2362 行。
- Fix approach: 按支付发起、支付回调、订单状态流转、幂等与锁、钱包扣款等职责拆分子服务/辅助组件。
- Suggested follow-up investigation topics:
- 统计 `internal/service/` 中超长文件与超长函数。
- 识别最常改动的热点段落与共享依赖。
## Known Bugs
**健康检查接口对故障返回 200 成功包裹严重级别High:**
- Symptoms: PostgreSQL 或 Redis 故障时,`/health` 仍通过 `response.Success` 返回成功包裹,只在 `data.status` 中标记 `degraded`
- Files: `internal/handler/health.go`, `docker-compose.prod.yml`, `Dockerfile.api`, `debug-deployment.sh`
- Trigger: 数据库或 Redis Ping 失败。
- Workaround: 监控端必须解析响应体里的 `data.status``services.*.status`,不能只看 HTTP 状态码。
- Supporting evidence:
- `internal/handler/health.go:101-111` 注释与实现都明确“端点本身能响应即视为成功”。
- `docker-compose.prod.yml``Dockerfile.api` 的健康检查只执行 `wget --spider http://127.0.0.1:3000/health`,不会校验 JSON 内容。
- Suggested follow-up investigation topics:
- 确认当前容器健康检查、反向代理、告警系统是否只看 200。
- 评估是否需要新增 `readyz`/`livez` 区分活性与依赖可用性。
**API 路径文档与实际路由不一致严重级别Medium:**
- Symptoms: 文档仍混用 `/api/v1``/api/auth``/api/c/v1`,读者很难判断当前真实入口。
- Files: `README.md`, `internal/routes/routes.go`, `scripts/check-comment-paths.sh`
- Trigger: 新人按 README 试运行、按旧注释实现客户端、或依据文档回归接口。
- Workaround: 以 `internal/routes/routes.go` 为准核对真实挂载路径。
- Supporting evidence:
- `internal/routes/routes.go:21-39` 当前真实路由为 `/api/auth``/api/admin``/api/c/v1``/api/callback`
- `README.md:577-583` 仍展示 `v1 := app.Group("/api/v1")` 的旧限流示例;`README.md:588-624` 仍以 `/api/v1/users` 讲解请求流。
- `scripts/check-comment-paths.sh` 只检查 `internal/handler/` 中残留 `/api/v1`,并不覆盖 `README.md``docs/``openspec/`
- Suggested follow-up investigation topics:
- 扫描所有 `docs/`, `README.md`, `openspec/`, `specs/` 中的旧路径。
- 明确哪些旧路径仍需要兼容,哪些应统一下线。
## Security Considerations
**部署流水线绕过 TLS 校验严重级别High:**
- Risk: 工作流检出步骤通过 `GIT_SSL_NO_VERIFY=1` 跳过证书校验,供应链完整性依赖内网信任而不是证书验证。
- Files: `.gitea/workflows/deploy.yaml`
- Current mitigation: 注释说明是“内网自签名证书”。
- Recommendations: 为 Gitea/Registry 配置受信 CA移除跳过校验至少把跳过范围限制在明确的单一主机与受控 Runner。
- Supporting evidence:
- `.gitea/workflows/deploy.yaml:23-27` 设置 `GIT_SSL_NO_VERIFY=1` 后执行 `git clone`
**对外/回调错误信息泄漏底层细节严重级别Medium:**
- Risk: 健康检查与富友回调把底层错误或内部状态直接返回给调用方,不符合统一错误暴露规范。
- Files: `internal/handler/health.go`, `internal/handler/callback/payment.go`, `AGENTS.md`
- Current mitigation: 有统一错误处理规范,但没有覆盖这两个特殊出口。
- Recommendations: 对外返回统一错误码/固定消息,把底层错误仅写日志。
- Supporting evidence:
- `AGENTS.md:124-129` 明确禁止直接暴露底层错误。
- `internal/handler/health.go:50-60,82-85` 直接返回 `err.Error()`
- `internal/handler/callback/payment.go:178-191` 直接把 `err.Error()` 拼入富友回调失败响应。
## Performance Bottlenecks
**默认限流仍使用内存存储且默认关闭严重级别Medium:**
- Problem: 默认配置既不开启限流,也默认使用 `memory` 存储;多实例部署时无法形成统一配额。
- Files: `pkg/config/defaults/config.yaml`, `cmd/api/main.go`, `README.md`
- Cause: 配置更偏向本地开发便利,缺少生产默认值与环境级约束。
- Improvement path: 明确生产必须启用 Redis 存储限流;在部署文档里给出环境变量模板;增加启动日志或自检提示当前限流模式。
- Supporting evidence:
- `pkg/config/defaults/config.yaml:87-93` 默认 `enable_rate_limiter: false``storage: memory`
- `cmd/api/main.go:236-278` 只有显式开启时才挂载限流,并根据配置选择 Redis 或内存存储。
## Fragile Areas
**OpenAPI 文档生成依赖手工双点维护严重级别Medium:**
- Files: `AGENTS.md`, `docs/api-documentation-guide.md`, `cmd/api/docs.go`, `cmd/gendocs/main.go`
- Why fragile: 新增 Handler 必须同时更新两个文件;流程靠人工记忆,历史上已经出现清单不一致并专门做过修复。
- Safe modification: 每次新增 Handler 时同时检查 `cmd/api/docs.go``cmd/gendocs/main.go` 与生成产物 `docs/admin-openapi.yaml`/`logs/openapi.yaml`
- Test coverage: 未发现自动化校验这两份清单一致性的 CI 步骤。
- Supporting evidence:
- `AGENTS.md:53-65` 明确要求手工更新两个文件。
- `docs/api-documentation-guide.md` 多处把“忘记在两个文件中添加新 Handler”列为最常见问题。
- `.gitea/workflows/deploy.yaml` 中未见 `go run cmd/gendocs/main.go`、diff 校验或文档一致性检查。
**部署脚本与运行时约定已漂移严重级别Medium:**
- Files: `debug-deployment.sh`, `docker-compose.prod.yml`, `README.md`, `docs/deployment/deployment-guide.md`
- Why fragile: 诊断脚本仍假定旧环境变量名与外置配置文件存在,文档与当前嵌入式配置实现不完全一致。
- Safe modification: 先以 `docker-compose.prod.yml``pkg/config/defaults/config.yaml``cmd/api/main.go` 为准修正运维脚本,再统一更新部署文档。
- Test coverage: 未发现对诊断脚本、部署文档、健康检查语义的自动验证。
- Supporting evidence:
- `debug-deployment.sh:52-57` 仍 grep `DB_|CONFIG_ENV`,并尝试读取 `/app/configs/config.yaml`;当前配置前缀实际是 `JUNHONG_`,配置默认嵌入二进制,见 `README.md:651-689``pkg/config/defaults/config.yaml`
- `docs/deployment/deployment-guide.md:302-305` 仍建议从 `/app/.env` 拼接迁移命令,但容器实际入口用环境变量构造 DSN`docker/entrypoint-api.sh:8-17`
## Scaling Limits
**CI/CD 质量闸门过窄严重级别High:**
- Current capacity: 当前工作流只做 clone、build、push、main 分支部署。
- Limit: 文档一致性、脚本检查、编译前规范、迁移安全、健康语义等问题都可能直接进入镜像与部署环境。
- Scaling path: 在 `.gitea/workflows/deploy.yaml` 前置独立质量作业,至少执行 `bash scripts/check-all.sh``go build ./...`、OpenAPI 生成/校验,并在部署前验证 compose 文件与镜像健康策略。
- Supporting evidence:
- `README.md:941-957` 声称脚本检查会在 CI/CD 自动执行。
- `.gitea/workflows/deploy.yaml` 未出现 `scripts/check-all.sh``go test``go vet``go build ./...`、OpenAPI 校验等步骤。
## Dependencies at Risk
**Go 版本与运行基础不统一严重级别Medium:**
- Risk: 版本声明分散在多个位置,升级与排障时容易出现“本地能过、容器不一致”的问题。
- Impact: 构建环境复现、依赖升级与 bug 排查成本上升。
- Migration plan: 约定单一权威版本源(如 `go.mod` + `.tool-versions`/`.go-version`),并让 Dockerfile、README、部署文档同步引用。
- Supporting evidence:
- `go.mod:3` 使用 `go 1.25.0`
- `Dockerfile.api:4``Dockerfile.worker:4` 使用 `golang:1.25.6-alpine`
- `README.md:884` 写的是 `Go 1.25.1`
## Missing Critical Features
**缺少可执行的自动化质量/回归入口严重级别High:**
- Problem: README、历史设计与测试文档大量提到 `go test``IntegrationTestEnv``tests/integration/`,但仓库当前未发现对应测试文件或 `tests/` 目录。
- Blocks: 无法快速验证重构、支付回调、权限过滤、部署脚本变更;文档中的测试命令无法直接落地。
- Supporting evidence:
- `AGENTS.md:324-354` 当前规范明确禁止自动化测试,和 `README.md:712-756``docs/testing/test-connection-guide.md` 的测试要求形成正面冲突。
- 读取仓库根目录未发现 `tests/` 目录;`glob` 搜索 `tests/**/*_test.go``internal/**/*_test.go` 未返回结果。
- `docs/testing/test-connection-guide.md` 仍宣称“204 个测试总耗时 ~10.5 秒”并要求所有新测试遵循该规范。
## Test Coverage Gaps
**部署、配置迁移、运维脚本与文档一致性未见自动验证优先级High:**
- What's not tested: `docker-compose.prod.yml``debug-deployment.sh``scripts/migrate.sh`、OpenAPI 文档生成器双清单、README/部署文档与代码的同步性。
- Files: `.gitea/workflows/deploy.yaml`, `docker-compose.prod.yml`, `debug-deployment.sh`, `scripts/migrate.sh`, `cmd/api/docs.go`, `cmd/gendocs/main.go`, `README.md`
- Risk: 配置漂移、凭据泄漏、文档错误、健康检查误报、迁移行为变化都可能在上线后才暴露。
- Priority: High
- Suggested follow-up investigation topics:
- 设计最小化“文档/脚本一致性检查”而不是恢复完整自动化测试体系。
- 评估是否要为部署文件与文档生成引入静态检查或 smoke check。
---
*Concerns audit: 2026-03-27*