72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
package stats
|
|
|
|
import (
|
|
"rideaware/pkg/database"
|
|
)
|
|
|
|
type Service struct {
|
|
repo *Repository
|
|
}
|
|
|
|
func NewService() *Service {
|
|
return &Service{
|
|
repo: NewRepository(),
|
|
}
|
|
}
|
|
|
|
func (s *Service) GetSummary(userID uint) (*Summary, error) {
|
|
return s.repo.GetSummary(userID)
|
|
}
|
|
|
|
func (s *Service) GetWeeklyStats(userID uint, weeks int) ([]PeriodStats, error) {
|
|
if weeks <= 0 || weeks > 52 {
|
|
weeks = 12
|
|
}
|
|
return s.repo.GetWeeklyStats(userID, weeks)
|
|
}
|
|
|
|
func (s *Service) GetMonthlyStats(userID uint, months int) ([]PeriodStats, error) {
|
|
if months <= 0 || months > 24 {
|
|
months = 12
|
|
}
|
|
return s.repo.GetMonthlyStats(userID, months)
|
|
}
|
|
|
|
func (s *Service) GetPersonalBests(userID uint) ([]PersonalBest, error) {
|
|
return s.repo.GetPersonalBests(userID)
|
|
}
|
|
|
|
// getUserFTP retrieves the user's FTP from the user_profiles table.
|
|
func (s *Service) getUserFTP(userID uint) int {
|
|
var ftp int
|
|
database.DB.Table("user_profiles").
|
|
Where("user_id = ?", userID).
|
|
Select("ftp").
|
|
Scan(&ftp)
|
|
return ftp
|
|
}
|
|
|
|
// GetTrainingLoad returns daily TSS data and the user's FTP.
|
|
func (s *Service) GetTrainingLoad(userID uint, days int) ([]DailyTSS, int, error) {
|
|
if days <= 0 || days > 730 {
|
|
days = 180
|
|
}
|
|
|
|
ftp := s.getUserFTP(userID)
|
|
|
|
data, err := s.repo.GetDailyTSS(userID, ftp, days)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return data, ftp, nil
|
|
}
|
|
|
|
// GetPowerHistory returns power data points for completed workouts.
|
|
func (s *Service) GetPowerHistory(userID uint, days int) ([]PowerPoint, error) {
|
|
if days <= 0 || days > 730 {
|
|
days = 365
|
|
}
|
|
return s.repo.GetPowerHistory(userID, days)
|
|
}
|