package handler import ( "net/http" "time" "github.com/gin-gonic/gin" "github.com/yuxingu/digital-psychology/apps/api/internal/middleware" companionsvc "github.com/yuxingu/digital-psychology/apps/api/internal/service/companion" "github.com/yuxingu/digital-psychology/apps/api/pkg/response" ) // CompanionHandler exposes solar terms and moods. type CompanionHandler struct { Svc *companionsvc.Service } // Register mounts companion routes. func (h *CompanionHandler) Register(rg *gin.RouterGroup) { rg.GET("/solar-terms/today", h.TodaySolar) rg.POST("/moods", h.SaveMood) rg.GET("/moods/today", h.TodayMood) } // TodaySolar handles GET /solar-terms/today (auth optional via group). func (h *CompanionHandler) TodaySolar(c *gin.Context) { response.OK(c, h.Svc.TodaySolar()) } // SaveMood handles POST /moods. func (h *CompanionHandler) SaveMood(c *gin.Context) { userID, ok := middleware.UserIDFromContext(c) if !ok { response.Fail(c, http.StatusUnauthorized, 40100, "unauthorized") return } var req struct { Score *int `json:"score"` Note *string `json:"note"` Day *string `json:"day"` } if err := c.ShouldBindJSON(&req); err != nil { response.Fail(c, http.StatusBadRequest, 10000, "invalid request") return } in := companionsvc.SaveMoodInput{Score: req.Score, Note: req.Note} if req.Day != nil && *req.Day != "" { d, err := time.Parse("2006-01-02", *req.Day) if err != nil { response.Fail(c, http.StatusBadRequest, 10000, "invalid day") return } in.Day = &d } m, err := h.Svc.SaveMood(c.Request.Context(), userID, in) if err != nil { response.Fail(c, http.StatusBadRequest, 30010, err.Error()) return } response.OK(c, m) } // TodayMood handles GET /moods/today. func (h *CompanionHandler) TodayMood(c *gin.Context) { userID, ok := middleware.UserIDFromContext(c) if !ok { response.Fail(c, http.StatusUnauthorized, 40100, "unauthorized") return } m, err := h.Svc.GetTodayMood(c.Request.Context(), userID) if err != nil { response.Fail(c, http.StatusInternalServerError, 50000, err.Error()) return } response.OK(c, gin.H{"mood": m}) }