// models/user_stats.go package models import ( "time" "gorm.io/gorm" ) type UserStats struct { ID uint `json:"id" gorm:"primaryKey"` UserID uint `json:"user_id" gorm:"uniqueIndex;not null"` TotalDistance float64 `json:"total_distance" gorm:"type:decimal(10,2);default:0"` // Общий пробег в км TotalTime int `json:"total_time" gorm:"default:0"` // Общее время в минутах AvgPace string `json:"avg_pace" gorm:"size:20"` // Средний темп WorkoutsCount int `json:"workouts_count" gorm:"default:0"` // Количество тренировок CurrentStreak int `json:"current_streak" gorm:"default:0"` // Текущая серия дней подряд LongestStreak int `json:"longest_streak" gorm:"default:0"` // Самая длинная серия WeeklyDistance float64 `json:"weekly_distance" gorm:"type:decimal(8,2);default:0"` // Пробег за неделю MonthlyDistance float64 `json:"monthly_distance" gorm:"type:decimal(8,2);default:0"` // Пробег за месяц Best5K string `json:"best_5k" gorm:"size:20"` // Лучший результат на 5к Best10K string `json:"best_10k" gorm:"size:20"` // Лучший результат на 10к BestHalf string `json:"best_half" gorm:"size:20"` // Лучший результат на полумарафон BestMarathon string `json:"best_marathon" gorm:"size:20"` // Лучший результат на марафон LastWorkout time.Time `json:"last_workout"` // Последняя тренировка CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` // Связи User User `json:"user,omitempty" gorm:"foreignKey:UserID"` } // BeforeCreate hook func (us *UserStats) BeforeCreate(tx *gorm.DB) error { if us.CreatedAt.IsZero() { us.CreatedAt = time.Now() } if us.UpdatedAt.IsZero() { us.UpdatedAt = time.Now() } return nil } // BeforeUpdate hook func (us *UserStats) BeforeUpdate(tx *gorm.DB) error { us.UpdatedAt = time.Now() return nil } // DTO для статистики пользователя type UserStatsResponse struct { TotalDistance float64 `json:"total_distance"` TotalTime int `json:"total_time"` AvgPace string `json:"avg_pace"` WorkoutsCount int `json:"workouts_count"` CurrentStreak int `json:"current_streak"` LongestStreak int `json:"longest_streak"` WeeklyDistance float64 `json:"weekly_distance"` MonthlyDistance float64 `json:"monthly_distance"` PersonalBests PersonalBestsSummary `json:"personal_bests"` }