updates
This commit is contained in:
93
server/internal/handlers/daily_overview_handler.go
Normal file
93
server/internal/handlers/daily_overview_handler.go
Normal 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),
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user