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
86 lines
3.5 KiB
Go
86 lines
3.5 KiB
Go
// models/training_plan.go
|
|
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type TrainingPlan struct {
|
|
ID uint `json:"id" gorm:"primaryKey"`
|
|
UserID uint `json:"user_id" gorm:"not null;index"`
|
|
Title string `json:"title" gorm:"size:255;not null"`
|
|
Description string `json:"description" gorm:"type:text"`
|
|
Weeks int `json:"weeks" gorm:"not null;default:12"` // Длительность плана в неделях
|
|
WorkoutsPerWeek int `json:"workouts_per_week" gorm:"not null;default:3"` // Тренировок в неделю
|
|
TargetDistance string `json:"target_distance" gorm:"size:50"` // Целевая дистанция
|
|
TargetDate time.Time `json:"target_date"` // Дата цели
|
|
CurrentWeek int `json:"current_week" gorm:"default:1"` // Текущая неделя
|
|
Completed bool `json:"completed" gorm:"default:false"` // Завершен ли план
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// Связи
|
|
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
|
|
Workouts []TrainingWorkout `json:"workouts,omitempty" gorm:"foreignKey:PlanID"`
|
|
}
|
|
|
|
type TrainingWorkout struct {
|
|
ID uint `json:"id" gorm:"primaryKey"`
|
|
PlanID uint `json:"plan_id" gorm:"not null;index"`
|
|
Week int `json:"week" gorm:"not null"` // Неделя плана
|
|
Day int `json:"day" gorm:"not null"` // День недели (1-7)
|
|
Type WorkoutType `json:"type" gorm:"type:varchar(20);not null"`
|
|
Description string `json:"description" gorm:"type:text"`
|
|
Distance float64 `json:"distance_km" gorm:"type:decimal(5,2)"`
|
|
Duration int `json:"duration_min"`
|
|
Completed bool `json:"completed" gorm:"default:false"`
|
|
CompletedAt *time.Time `json:"completed_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// BeforeCreate hooks
|
|
func (tp *TrainingPlan) BeforeCreate(tx *gorm.DB) error {
|
|
if tp.CreatedAt.IsZero() {
|
|
tp.CreatedAt = time.Now()
|
|
}
|
|
if tp.UpdatedAt.IsZero() {
|
|
tp.UpdatedAt = time.Now()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (tw *TrainingWorkout) BeforeCreate(tx *gorm.DB) error {
|
|
if tw.CreatedAt.IsZero() {
|
|
tw.CreatedAt = time.Now()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// BeforeUpdate hook
|
|
func (tp *TrainingPlan) BeforeUpdate(tx *gorm.DB) error {
|
|
tp.UpdatedAt = time.Now()
|
|
return nil
|
|
}
|
|
|
|
// DTO для создания плана тренировок
|
|
type TrainingPlanCreateRequest struct {
|
|
Title string `json:"title" validate:"required,min=5,max=255"`
|
|
Description string `json:"description" validate:"max=1000"`
|
|
Weeks int `json:"weeks" validate:"required,min=1,max=52"`
|
|
WorkoutsPerWeek int `json:"workouts_per_week" validate:"required,min=1,max=7"`
|
|
TargetDistance string `json:"target_distance" validate:"max=50"`
|
|
TargetDate time.Time `json:"target_date"`
|
|
}
|
|
|
|
// DTO для обновления плана тренировок
|
|
type TrainingPlanUpdateRequest struct {
|
|
Title string `json:"title" validate:"min=5,max=255"`
|
|
Description string `json:"description" validate:"max=1000"`
|
|
Weeks int `json:"weeks" validate:"min=1,max=52"`
|
|
WorkoutsPerWeek int `json:"workouts_per_week" validate:"min=1,max=7"`
|
|
TargetDistance string `json:"target_distance" validate:"max=50"`
|
|
TargetDate time.Time `json:"target_date"`
|
|
}
|