package server import ( "encoding/json" "net/http" "strings" "chat-agent-system/internal/app/chatflow" "chat-agent-system/internal/ctxmgr" ) // handleListDailyDigests 获取会话的历史每日摘要列表 (时间轴侧栏数据源) // GET /api/v1/chat/digests?session_id=&from=&to= func (s *Server) handleListDailyDigests(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { writeSafeError(w, r, http.StatusMethodNotAllowed, "Method Not Allowed") return } if s.chatLog == nil { writeSafeError(w, r, http.StatusServiceUnavailable, "context manager not initialized") return } user, ok := s.requireAuthenticatedUser(w, r) if !ok { return } sessionID := strings.TrimSpace(r.URL.Query().Get("session_id")) if sessionID == "" { writeSafeError(w, r, http.StatusBadRequest, "missing required query param 'session_id'") return } from := strings.TrimSpace(r.URL.Query().Get("from")) to := strings.TrimSpace(r.URL.Query().Get("to")) digests, err := s.chatLog.ListDigests(r.Context(), s.chatPrincipal(user, chatflow.ActionDigest), sessionID, from, to) if err != nil { s.writeChatLogError(w, err) return } if digests == nil { digests = []ctxmgr.DailyDigest{} } w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(digests) } // GenerateDigestRequest 手动触发单日摘要生成请求体 type GenerateDigestRequest struct { SessionID string `json:"session_id"` DayKey string `json:"day_key"` } // handleGenerateDailyDigest 手动触发或重试生成单日摘要 // POST /api/v1/chat/digests/generate func (s *Server) handleGenerateDailyDigest(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { writeSafeError(w, r, http.StatusMethodNotAllowed, "Method Not Allowed") return } if s.chatLog == nil { writeSafeError(w, r, http.StatusServiceUnavailable, "context manager not initialized") return } user, ok := s.requireAuthenticatedUser(w, r) if !ok { return } var req GenerateDigestRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeSafeError(w, r, http.StatusBadRequest, "invalid request json body: "+err.Error()) return } req.SessionID = strings.TrimSpace(req.SessionID) req.DayKey = strings.TrimSpace(req.DayKey) if req.SessionID == "" || req.DayKey == "" { writeSafeError(w, r, http.StatusBadRequest, "missing required fields 'session_id' or 'day_key'") return } digest, err := s.chatLog.GenerateDigest(r.Context(), s.chatPrincipal(user, chatflow.ActionDigest), req.SessionID, req.DayKey) if err != nil { s.writeChatLogError(w, err) return } resp := map[string]any{ "queued": true, "digest": digest, } w.Header().Set("Content-Type", "application/json") _ = json.NewEncoder(w).Encode(resp) }