package v1 import ( "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/gochat/gochat/internal/service" applogger "github.com/gochat/gochat/pkg/logger" "github.com/gochat/gochat/pkg/response" ) // RAGHandler handles Captain RAG (Retrieval-Augmented Generation) Q&A endpoints. // Reference: M12 PRD §Captain AI — RAG Knowledge Base Q&A type RAGHandler struct { svc *service.RAGService } // NewRAGHandler creates a new RAGHandler. func NewRAGHandler(svc *service.RAGService) *RAGHandler { return &RAGHandler{svc: svc} } // Query performs a RAG query against the knowledge base. // POST /api/v1/accounts/:account_id/captain/rag/query func (h *RAGHandler) Query(c *gin.Context) { accountID, err := strconv.ParseUint(c.Param("account_id"), 10, 64) if err != nil { response.AbortWithStatusError(c, http.StatusBadRequest, "invalid_account_id", "Invalid account ID") return } var req service.RAGQueryRequest if err := c.ShouldBindJSON(&req); err != nil { response.AbortWithStatusError(c, http.StatusBadRequest, "invalid_request", err.Error()) return } result, err := h.svc.Query(c.Request.Context(), uint(accountID), &req) if err != nil { applogger.L().Errorf("RAGHandler.Query failed: %v", err) response.AbortWithStatusError(c, http.StatusInternalServerError, "query_failed", "Failed to process RAG query") return } response.OK(c, result) } // IndexResponse indexes an assistant response for RAG retrieval. // POST /api/v1/accounts/:account_id/captain/rag/index/:response_id func (h *RAGHandler) IndexResponse(c *gin.Context) { responseID, err := strconv.ParseUint(c.Param("response_id"), 10, 64) if err != nil { response.AbortWithStatusError(c, http.StatusBadRequest, "invalid_response_id", "Invalid response ID") return } if err := h.svc.IndexResponse(c.Request.Context(), uint(responseID)); err != nil { applogger.L().Errorf("RAGHandler.IndexResponse failed: %v", err) response.AbortWithStatusError(c, http.StatusInternalServerError, "index_failed", "Failed to index response for RAG") return } response.OK(c, map[string]string{"status": "indexed"}) }