87 lines
2.7 KiB
Go
87 lines
2.7 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"go-server/internal/repository"
|
|
)
|
|
|
|
type DailyOverviewService struct {
|
|
dailyRepo *repository.DailyOverviewRepository
|
|
}
|
|
|
|
func NewDailyOverviewService(dailyRepo *repository.DailyOverviewRepository) *DailyOverviewService {
|
|
return &DailyOverviewService{
|
|
dailyRepo: dailyRepo,
|
|
}
|
|
}
|
|
|
|
// DailyNutrientSummary represents the complete daily overview
|
|
type DailyNutrientSummary struct {
|
|
NutrientTotals []repository.NutrientTotal `json:"nutrientTotals"`
|
|
ByCategory map[string][]repository.NutrientTotal `json:"byCategory"`
|
|
SupplementBreakdown []repository.SupplementNutrientDetails `json:"supplementBreakdown"`
|
|
Summary DailySummaryStats `json:"summary"`
|
|
}
|
|
|
|
type DailySummaryStats struct {
|
|
TotalNutrients int `json:"totalNutrients"`
|
|
TotalSupplements int `json:"totalSupplements"`
|
|
CategoriesCount int `json:"categoriesCount"`
|
|
}
|
|
|
|
// GetDailyOverview returns a comprehensive overview of daily nutrient intake
|
|
func (s *DailyOverviewService) GetDailyOverview(ctx context.Context) (*DailyNutrientSummary, error) {
|
|
// Get nutrient totals
|
|
totals, err := s.dailyRepo.GetNutrientTotals(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get breakdown by category
|
|
byCategory, err := s.dailyRepo.GetNutrientsByCategory(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get supplement breakdown
|
|
breakdown, err := s.dailyRepo.GetSupplementBreakdown(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Calculate summary stats
|
|
supplementMap := make(map[string]bool)
|
|
for _, item := range breakdown {
|
|
supplementMap[item.SupplementName] = true
|
|
}
|
|
|
|
summary := DailySummaryStats{
|
|
TotalNutrients: len(totals),
|
|
TotalSupplements: len(supplementMap),
|
|
CategoriesCount: len(byCategory),
|
|
}
|
|
|
|
return &DailyNutrientSummary{
|
|
NutrientTotals: totals,
|
|
ByCategory: byCategory,
|
|
SupplementBreakdown: breakdown,
|
|
Summary: summary,
|
|
}, nil
|
|
}
|
|
|
|
// GetNutrientTotals returns just the aggregated totals
|
|
func (s *DailyOverviewService) GetNutrientTotals(ctx context.Context) ([]repository.NutrientTotal, error) {
|
|
return s.dailyRepo.GetNutrientTotals(ctx)
|
|
}
|
|
|
|
// GetSupplementBreakdown returns detailed breakdown by supplement
|
|
func (s *DailyOverviewService) GetSupplementBreakdown(ctx context.Context) ([]repository.SupplementNutrientDetails, error) {
|
|
return s.dailyRepo.GetSupplementBreakdown(ctx)
|
|
}
|
|
|
|
// ExecuteCustomQuery allows executing custom SQL queries
|
|
// This gives you maximum flexibility for complex analytics
|
|
func (s *DailyOverviewService) ExecuteCustomQuery(ctx context.Context, query string, args ...interface{}) ([]map[string]interface{}, error) {
|
|
return s.dailyRepo.ExecuteRawQueryWithResult(ctx, query, args...)
|
|
}
|