package handlers import ( "go-server/internal/service" "net/http" "strings" "github.com/gin-gonic/gin" ) type DailyOverviewController struct { service *service.DailyOverviewService } func NewDailyOverviewController(service *service.DailyOverviewService) *DailyOverviewController { return &DailyOverviewController{ service: service, } } // GetDailyOverview returns comprehensive daily nutrient overview // GET /api/daily-overview/overview func (h *DailyOverviewController) GetDailyOverview(c *gin.Context) { overview, err := h.service.GetDailyOverview(c.Request.Context()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get daily overview"}) return } c.JSON(http.StatusOK, overview) } // GetNutrientTotals returns just the aggregated nutrient totals // GET /api/daily-overview/totals func (h *DailyOverviewController) GetNutrientTotals(c *gin.Context) { totals, err := h.service.GetNutrientTotals(c.Request.Context()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get nutrient totals"}) return } c.JSON(http.StatusOK, totals) } // GetSupplementBreakdown returns detailed breakdown by supplement // GET /api/daily-overview/breakdown func (h *DailyOverviewController) GetSupplementBreakdown(c *gin.Context) { breakdown, err := h.service.GetSupplementBreakdown(c.Request.Context()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get supplement breakdown"}) return } c.JSON(http.StatusOK, breakdown) } // ExecuteCustomQuery allows executing custom SQL queries via API // POST /api/daily-overview/query // Body: {"query": "SELECT ...", "args": [...]} func (h *DailyOverviewController) ExecuteCustomQuery(c *gin.Context) { var request struct { Query string `json:"query"` Args []interface{} `json:"args"` } if err := c.ShouldBindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body"}) return } if request.Query == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "Query is required"}) return } // Basic security: only allow SELECT statements queryUpper := strings.ToUpper(strings.TrimSpace(request.Query)) if !strings.HasPrefix(queryUpper, "SELECT") { c.JSON(http.StatusBadRequest, gin.H{"error": "Only SELECT queries are allowed"}) return } results, err := h.service.ExecuteCustomQuery(c.Request.Context(), request.Query, request.Args...) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to execute query"}) return } c.JSON(http.StatusOK, gin.H{ "results": results, "count": len(results), }) }