package inbox import ( "net/http" "strconv" "github.com/gin-gonic/gin" "senlinai-agent/backend/internal/auth" ) type Handler struct { service *Service } func NewHandler(service *Service) *Handler { return &Handler{service: service} } func (h *Handler) Register(router gin.IRouter) { router.POST("/projects/:projectID/inbox", h.capture) router.POST("/inbox/:id/analyze", h.analyze) router.POST("/inbox/:id/confirm", h.confirm) } func (h *Handler) capture(c *gin.Context) { userID, ok := auth.CurrentUserID(c) if !ok { c.JSON(http.StatusUnauthorized, gin.H{"error": "missing current user"}) return } projectID, err := strconv.ParseUint(c.Param("projectID"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid project id"}) return } var input struct { SourceType string `json:"source_type"` Title string `json:"title"` Body string `json:"body"` } if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request"}) return } item, err := h.service.Capture(CaptureInput{ProjectID: uint(projectID), UserID: userID, SourceType: input.SourceType, Title: input.Title, Body: input.Body}) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, item) } func (h *Handler) analyze(c *gin.Context) { userID, ok := auth.CurrentUserID(c) if !ok { c.JSON(http.StatusUnauthorized, gin.H{"error": "missing current user"}) return } itemID, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid inbox id"}) return } suggestions, err := h.service.Analyze(uint(itemID), userID) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"suggestions": suggestions}) } func (h *Handler) confirm(c *gin.Context) { itemID, err := strconv.ParseUint(c.Param("id"), 10, 64) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid inbox id"}) return } var input struct { Suggestions []Suggestion `json:"suggestions"` } if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request"}) return } if err := h.service.Confirm(uint(itemID), input.Suggestions); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.Status(http.StatusNoContent) }