Files
Enterprise-Knowledge-Base/internal/handler/session/REFACTORING_SUMMARY.md
T
wizardchen 83721f98d4 feat: Integrate Swiper library and enhance chat functionality
- Added Swiper library to package dependencies for improved UI components.
- Updated chat API to include summary model ID in message handling, allowing for more flexible model selection.
- Enhanced InputField component to manage model selection and state more effectively.
- Improved event handling in chat components to support new model features and ensure accurate message processing.
- Refactored SVG assets for better visual consistency and updated styles for improved user experience.
2025-11-09 00:02:31 +08:00

6.2 KiB
Raw Blame History

Session Handler 重构总结

📋 优化概述

本次重构主要通过提取公共辅助函数来简化代码,消除重复逻辑,提高代码的可维护性和可读性。

🆕 新增文件

helpers.go - 辅助函数集合

创建了一个专门的辅助函数文件,包含以下功能:

SSE 相关

  • setSSEHeaders(c *gin.Context) - 设置 SSE 标准头部
  • sendCompletionEvent(c, requestID) - 发送完成事件
  • buildStreamResponse(evt, requestID) - 从 StreamEvent 构建 StreamResponse

事件和流处理

  • createAgentQueryEvent(sessionID, assistantMessageID) - 创建 agent query 事件
  • writeAgentQueryEvent(ctx, sessionID, assistantMessageID) - 写入 agent query 事件到流管理器

消息处理

  • createUserMessage(ctx, sessionID, query, requestID) - 创建用户消息
  • createAssistantMessage(ctx, assistantMessage) - 创建助手消息

StreamHandler 设置

  • setupStreamHandler(...) - 创建并订阅流处理器
  • setupStopEventHandler(...) - 注册停止事件处理器

配置相关

  • createDefaultSummaryConfig() - 创建默认摘要配置
  • fillSummaryConfigDefaults(config) - 填充摘要配置默认值

工具函数

  • validateSessionID(c) - 验证并提取 session ID
  • getRequestID(c) - 获取 request ID
  • getString(m, key) - 安全获取字符串值
  • getFloat64(m, key) - 安全获取浮点数值

🔄 优化的文件

1. agent_stream_handler.go

减少行数: 428 → 410 行 (-18 行)

优化内容:

  • 移除了重复的辅助函数 getString 和 getFloat64(现在在 helpers.go 中)

2. stream.go

减少行数: 440 → 364 行 (-76 行, -17.3%)

优化内容:

  • 使用 setSSEHeaders() 替代重复的 4 行头部设置代码
  • 使用 buildStreamResponse() 替代 10+ 行的响应构建逻辑(3 处)
  • 使用 sendCompletionEvent() 替代重复的完成事件发送代码(3 处)

优化示例:

// Before (10+ lines)
response := &types.StreamResponse{
    ID:           message.RequestID,
    ResponseType: evt.Type,
    Content:      evt.Content,
    Done:         evt.Done,
    Data:         evt.Data,
}
if evt.Type == types.ResponseTypeReferences {
    if refs, ok := evt.Data["references"].(types.References); ok {
        response.KnowledgeReferences = refs
    }
}

// After (1 line)
response := buildStreamResponse(evt, message.RequestID)

3. qa.go

减少行数: 536 → 485 行 (-51 行, -9.5%)

优化内容:

  • 使用 setSSEHeaders() 替代重复的头部设置(2 处)
  • 使用 createUserMessage() 替代 9 行的用户消息创建(3 处)
  • 使用 createAssistantMessage() 替代 3 行的助手消息创建(3 处)
  • 使用 writeAgentQueryEvent() 替代 15+ 行的事件写入代码(2 处)
  • 使用 setupStreamHandler() 替代 7 行的处理器设置(2 处)
  • 使用 setupStopEventHandler() 替代 7 行的停止事件处理器设置(2 处)
  • 使用 getRequestID() 简化请求 ID 获取(1 处)

4. handler.go

减少行数: 354 → 312 行 (-42 行, -11.9%)

优化内容:

  • 使用 createDefaultSummaryConfig() 替代 12 行的配置创建(2 处)
  • 使用 fillSummaryConfigDefaults() 替代 9 行的默认值填充(1 处)

优化示例:

// Before (21 lines)
if request.SessionStrategy.SummaryParameters != nil {
    createdSession.SummaryParameters = request.SessionStrategy.SummaryParameters
} else {
    createdSession.SummaryParameters = &types.SummaryConfig{
        MaxTokens:           h.config.Conversation.Summary.MaxTokens,
        TopP:                h.config.Conversation.Summary.TopP,
        // ... 8 more fields
    }
}
if createdSession.SummaryParameters.Prompt == "" {
    createdSession.SummaryParameters.Prompt = h.config.Conversation.Summary.Prompt
}
// ... 2 more field checks

// After (5 lines)
if request.SessionStrategy.SummaryParameters != nil {
    createdSession.SummaryParameters = request.SessionStrategy.SummaryParameters
} else {
    createdSession.SummaryParameters = h.createDefaultSummaryConfig()
}
h.fillSummaryConfigDefaults(createdSession.SummaryParameters)

📊 总体统计

文件 优化前 优化后 减少 比例
agent_stream_handler.go 428 410 -18 -4.2%
stream.go 440 364 -76 -17.3%
qa.go 536 485 -51 -9.5%
handler.go 354 312 -42 -11.9%
总计 1,758 1,571 -187 -10.6%
helpers.go (新增) 0 204 +204 -
净变化 1,758 1,775 +17 +1.0%

虽然总行数略有增加(+17 行),但代码质量显著提升:

  • ✅ 消除了大量重复代码
  • ✅ 提高了代码复用性
  • ✅ 增强了可维护性
  • ✅ 统一了代码风格
  • ✅ 便于未来扩展

🎯 关键改进

1. 代码复用性

通过提取公共函数,同样的逻辑只需维护一处,修改时更新一个地方即可。

2. 可读性提升

// Before: 需要阅读 10+ 行才能理解
response := &types.StreamResponse{ /* 10 lines */ }

// After: 一行就能明白意图
response := buildStreamResponse(evt, requestID)

3. 一致性

所有 SSE 头部设置、消息创建、事件处理都使用统一的方法,降低出错风险。

4. 易于测试

辅助函数可以独立测试,提高单元测试的覆盖率。

5. 便于维护

如果需要修改 SSE 头部或事件格式,只需修改辅助函数,不需要搜索整个代码库。

✅ 验证结果

  • ✅ 无 linter 错误
  • ✅ 编译成功
  • ✅ 保持原有功能不变
  • ✅ 代码结构更清晰

🔮 未来建议

  1. 测试覆盖: 为 helpers.go 中的辅助函数添加单元测试
  2. 文档完善: 为复杂的辅助函数添加使用示例
  3. 持续优化: 定期审查是否有新的重复代码可以提取

📝 总结

本次重构成功地消除了代码重复,提高了代码质量。虽然增加了一个新文件,但整体代码结构更加清晰,维护成本大幅降低。重构遵循了 DRY(Don't Repeat Yourself)原则,为未来的开发和维护打下了良好的基础。