15357fd3c0
yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarbacreate and moove into new directories for BegushiyBashkir and yalarba
61 lines
2.9 KiB
Go
61 lines
2.9 KiB
Go
// 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"`
|
|
} |