168 lines
3.8 KiB
Go
168 lines
3.8 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"resume-platform/internal/model"
|
|
"resume-platform/internal/service/knowledge"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type KnowledgeHandler struct {
|
|
knowledgeBaseService *knowledge.KnowledgeBaseService
|
|
ragService *knowledge.RAGService
|
|
}
|
|
|
|
func NewKnowledgeHandler(knowledgeBaseService *knowledge.KnowledgeBaseService, ragService *knowledge.RAGService) *KnowledgeHandler {
|
|
return &KnowledgeHandler{knowledgeBaseService: knowledgeBaseService, ragService: ragService}
|
|
}
|
|
|
|
func (h *KnowledgeHandler) Search(c *gin.Context) {
|
|
query := c.Query("q")
|
|
topK := 5
|
|
if k := c.Query("k"); k != "" {
|
|
fmt.Sscanf(k, "%d", &topK)
|
|
}
|
|
userID := c.GetHeader("X-User-ID")
|
|
|
|
if query == "" {
|
|
BadRequest(c, "Query parameter is required")
|
|
return
|
|
}
|
|
|
|
results, err := h.knowledgeBaseService.Retrieve(c.Request.Context(), query, topK, userID)
|
|
if err != nil {
|
|
Error(c, err.Error())
|
|
return
|
|
}
|
|
|
|
OK(c, results)
|
|
}
|
|
|
|
func (h *KnowledgeHandler) GetStats(c *gin.Context) {
|
|
userID := c.GetHeader("X-User-ID")
|
|
|
|
stats, err := h.knowledgeBaseService.GetStats(c.Request.Context(), userID)
|
|
if err != nil {
|
|
Error(c, err.Error())
|
|
return
|
|
}
|
|
|
|
OK(c, stats)
|
|
}
|
|
|
|
func (h *KnowledgeHandler) AddDocument(c *gin.Context) {
|
|
var req struct {
|
|
DocumentID string `json:"document_id"`
|
|
Content string `json:"content"`
|
|
UserID string `json:"user_id"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
BadRequest(c, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
if req.DocumentID == "" || req.Content == "" {
|
|
BadRequest(c, "document_id and content are required")
|
|
return
|
|
}
|
|
|
|
err := h.knowledgeBaseService.AddDocument(c.Request.Context(), req.DocumentID, req.Content, req.UserID)
|
|
if err != nil {
|
|
Error(c, err.Error())
|
|
return
|
|
}
|
|
|
|
OK(c, gin.H{"message": "Document added to knowledge base successfully"})
|
|
}
|
|
|
|
func (h *KnowledgeHandler) AddResume(c *gin.Context) {
|
|
var req struct {
|
|
ResumeID string `json:"resume_id"`
|
|
Resume map[string]interface{} `json:"resume"`
|
|
UserID string `json:"user_id"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
BadRequest(c, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
if req.ResumeID == "" {
|
|
BadRequest(c, "resume_id is required")
|
|
return
|
|
}
|
|
|
|
resumeJSON, _ := json.Marshal(req.Resume)
|
|
var resume model.Resume
|
|
if err := json.Unmarshal(resumeJSON, &resume); err != nil {
|
|
BadRequest(c, "Invalid resume format")
|
|
return
|
|
}
|
|
|
|
resume.ID = req.ResumeID
|
|
resume.UserID = req.UserID
|
|
|
|
err := h.knowledgeBaseService.AddResume(c.Request.Context(), req.ResumeID, &resume)
|
|
if err != nil {
|
|
Error(c, err.Error())
|
|
return
|
|
}
|
|
|
|
OK(c, gin.H{"message": "Resume added to knowledge base successfully"})
|
|
}
|
|
|
|
func (h *KnowledgeHandler) AddText(c *gin.Context) {
|
|
var req struct {
|
|
Text string `json:"text"`
|
|
SourceType string `json:"source_type"`
|
|
SourceID string `json:"source_id"`
|
|
SourceName string `json:"source_name"`
|
|
UserID string `json:"user_id"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
BadRequest(c, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
if req.Text == "" || req.SourceType == "" {
|
|
BadRequest(c, "text and source_type are required")
|
|
return
|
|
}
|
|
|
|
err := h.knowledgeBaseService.AddText(c.Request.Context(), req.Text, req.SourceType, req.SourceID, req.SourceName, req.UserID)
|
|
if err != nil {
|
|
Error(c, err.Error())
|
|
return
|
|
}
|
|
|
|
OK(c, gin.H{"message": "Text added to knowledge base successfully"})
|
|
}
|
|
|
|
func (h *KnowledgeHandler) Chat(c *gin.Context) {
|
|
var req struct {
|
|
Query string `json:"query"`
|
|
UserID string `json:"user_id"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
BadRequest(c, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
if req.Query == "" {
|
|
BadRequest(c, "query is required")
|
|
return
|
|
}
|
|
|
|
result, err := h.ragService.Generate(c.Request.Context(), req.Query, req.UserID)
|
|
if err != nil {
|
|
Error(c, err.Error())
|
|
return
|
|
}
|
|
|
|
OK(c, gin.H{"answer": result})
|
|
} |