This commit is contained in:
2025-11-03 12:24:01 +02:00
commit 0806865287
177 changed files with 18453 additions and 0 deletions

View File

@@ -0,0 +1,93 @@
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),
})
}