64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package nutrition
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
"rideaware/internal/config"
|
|
"rideaware/internal/middleware"
|
|
)
|
|
|
|
type Handler struct {
|
|
service *Service
|
|
}
|
|
|
|
func NewHandler() *Handler {
|
|
return &Handler{
|
|
service: NewService(),
|
|
}
|
|
}
|
|
|
|
// GetTargets GET /api/protected/nutrition/targets
|
|
func (h *Handler) GetTargets(w http.ResponseWriter, r *http.Request) {
|
|
claims := r.Context().Value(middleware.UserContextKey).(*config.CustomClaims)
|
|
if claims == nil {
|
|
respondError(w, http.StatusUnauthorized, "unauthorized")
|
|
return
|
|
}
|
|
|
|
targets, err := h.service.GetTargets(claims.UserID)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "failed to calculate targets")
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, targets)
|
|
}
|
|
|
|
// GetWeekly GET /api/protected/nutrition/weekly
|
|
func (h *Handler) GetWeekly(w http.ResponseWriter, r *http.Request) {
|
|
claims := r.Context().Value(middleware.UserContextKey).(*config.CustomClaims)
|
|
if claims == nil {
|
|
respondError(w, http.StatusUnauthorized, "unauthorized")
|
|
return
|
|
}
|
|
|
|
weekly, err := h.service.GetWeeklyNutrition(claims.UserID)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "failed to calculate weekly nutrition")
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, weekly)
|
|
}
|
|
|
|
func respondJSON(w http.ResponseWriter, status int, data interface{}) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(status)
|
|
json.NewEncoder(w).Encode(data)
|
|
}
|
|
|
|
func respondError(w http.ResponseWriter, status int, message string) {
|
|
respondJSON(w, status, map[string]string{"error": message})
|
|
}
|