Commit Graph

7 Commits

Author SHA1 Message Date
Your Name
6c3474e23b feat(ai-customer-service): add gate readiness verification and handoff docs 2026-05-06 09:39:33 +08:00
Your Name
087de4e102 fix(audit): use uuid.New() for ticket workflow audit IDs
Fixes 'invalid input syntax for type uuid' error when writing ticket
workflow audit logs. The audit Event.ID field was using fmt.Sprintf
with nanoseconds ('wf-%d') which doesn't match PostgreSQL's uuid type.

Also adds uuid import to ticket_workflow.go.

Verified: full chain webhook→assign→resolve→close produces 3 audit
logs correctly, no more 'invalid uuid' errors in logs.
2026-05-04 13:44:39 +08:00
Your Name
142b991334 fix(config+app): production fail-fast + readiness收紧
1. config.go: AI_CS_ENV runtime mode with production restriction
   - New RuntimeConfig.Env field (AI_CS_ENV / AI_CS_RUNTIME_ENV)
   - production + Postgres.Enabled=false → Load() returns error
   - production + empty webhook secret → Load() returns error
   - normalizeRuntimeEnv: dev/dev/ → development, prod/production → production, test → test

2. app.go: probe.SetReady only when store is confirmed ready
   - Postgres.Enabled: probe.SetReady(true) after DB+migration OK
   - Memory mode: probe.SetReady(false) — not production-ready

3. health_handler_test.go: add probe live+ready state transition tests

4. config_test.go: add TestLoad_RejectsProdWhenPostgresDisabled,
   TestLoad_RejectsProdWhenWebhookSecretMissing

5. app_test.go: add TestNew_RejectsMemoryModeWithoutExplicitNonProdEnv,
   TestNew_AllowsMemoryModeInTestEnv, TestNew_WithPostgresEnabled_*
   for invalid DSN and migration-failure paths

Phase 1 (code gate) objectives met:
 prod cannot fall back to memory store
 readiness reflects actual store readiness
 both changes have test coverage
2026-05-04 07:38:10 +08:00
Your Name
cf46b27610 fix: P0-1 RateLimiter并发写安全 + P0-2工单操作错误码区分 + P1 rows.Close修复
P0-1 (limits.go): Allow()方法改为全程使用写锁保护counters map读写,避免RLock写入时的data race
P0-2 (ticket_workflow.go+ticket_handler.go): Assign/Resolve/Close操作先查询ticket存在性和状态,返回明确的CS_TICKET_4001/CS_TKT_4002/CS_TICKET_4092/CS_TICKET_4093错误码,handler根据错误前缀路由HTTP状态码
P1-1 (ticket_store.go): 移除GetStats中3处手动rows.Close(),只保留defer Close()
2026-05-01 20:56:25 +08:00
Your Name
cefbe946b2 fix(ticket_handler): 将 auditTicketChange 死代码接入 Assign/Resolve/Close
auditTicketChange (ticket_handler.go:104) 自定义义以来从未被调用:
- Assign/Resolve/Close 成功后均未记录状态变更审计日志
- 已有的单元测试在 mockTicketService 里单独记录事件,但 handler 层缺失

修改内容:
- Assign/Resolve/Close 成功后调用 h.auditTicketChange()
- auditTicketChange 新增 actorID 参数(原来硬编码为 system)
- 修改后 handler 层和 service 层各自记录一条 audit 日志(测试断言相应改为 len==2,取 [1])
- nil 保护保持不变(h==nil || h.audit==nil)

同时更新 ticket_handler_test.go:
- assign/resolve 测试断言从 len==1 改为 len==2,取最后一条
- 新增 TestTicketHandlerCloseAuditsStateChange 测试

handlers 覆盖率:85.9% → 87.1%
2026-05-01 13:29:00 +08:00
Your Name
533b4a1b0c test(P1): 补齐 webhook HandleChannel 和 clientIP 测试
新增测试(internal/http/handlers):
- TestHandleChannel_OverridesChannel: channelOverride 覆盖请求 body 中的 channel
- TestHandleChannel_WithEmptyOverride: 空 channelOverride 使用 body 中的 channel
- TestHandleChannel_RejectsNonPost: GET 方法返回 405
- TestHandleChannel_RejectsMissingFields: 缺失必填字段返回 400
- TestHandleChannel_EmptyBody: 空 body 返回 400
- TestClientIP_WithPort: 带端口的 remoteAddr 解析
- TestClientIP_NoPort: 不带端口的 remoteAddr 解析

**覆盖率提升**:
- internal/http/handlers: 84.4% → **85.9%** (+1.5%)
- 整体覆盖率: 76.3% → **76.6%** (+0.3%)
- P1 目标达成  (handlers >85%)

Ref: test/PHASE2_TEST_PLAN.md P1
2026-05-01 10:41:39 +08:00
Your Name
3d18b1a34d test(P0-5): 补齐 health handler 和 ticket stats handler 测试
新增 internal/http/handlers/health_handler_test.go:
- TestHealthHandler_Live_ReturnsUPWhenLive
- TestHealthHandler_Live_ReturnsDOWNWhenNotLive
- TestHealthHandler_Live_WithNilProbe
- TestHealthHandler_Ready_WithFailingChecker
- TestHealthHandler_Ready_WithPassingChecker
- TestHealthHandler_Health_ReturnsOK
- TestTicketStatsHandler_Get_Success
- TestTicketStatsHandler_Get_Error
- TestTicketStatsHandler_Get_NilAudit

**覆盖率提升**:
- internal/http/handlers: 78.4% → **84.4%** (+6.0%)
- 整体覆盖率: 74.8% → **76.3%** (+1.5%)

所有 P0 任务完成!Phase 2 测试补齐全部达成 🎉

Ref: test/PHASE2_TEST_PLAN.md P0-5
2026-05-01 10:03:51 +08:00