72 lines
2.6 KiB
Go
72 lines
2.6 KiB
Go
// models/achievement.go
|
|
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type AchievementType string
|
|
|
|
const (
|
|
AchievementTypeDistance AchievementType = "distance"
|
|
AchievementTypeSpeed AchievementType = "speed"
|
|
AchievementTypeConsistency AchievementType = "consistency"
|
|
AchievementTypeEvent AchievementType = "event"
|
|
AchievementTypeSpecial AchievementType = "special"
|
|
)
|
|
|
|
type Achievement struct {
|
|
ID uint `json:"id" gorm:"primaryKey"`
|
|
UserID uint `json:"user_id" gorm:"not null;index"`
|
|
Type AchievementType `json:"type" gorm:"type:varchar(20);not null"`
|
|
Title string `json:"title" gorm:"size:255;not null"`
|
|
Description string `json:"description" gorm:"type:text"`
|
|
Result string `json:"result" gorm:"size:100"` // Достигнутый результат
|
|
Distance string `json:"distance" gorm:"size:50"` // Дистанция достижения
|
|
Date time.Time `json:"date" gorm:"not null"`
|
|
Verified bool `json:"verified" gorm:"default:false"`
|
|
BadgeImage string `json:"badge_image" gorm:"size:500"` // Изображение бейджа
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// Связи
|
|
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
|
|
}
|
|
|
|
// BeforeCreate hook
|
|
func (a *Achievement) BeforeCreate(tx *gorm.DB) error {
|
|
if a.CreatedAt.IsZero() {
|
|
a.CreatedAt = time.Now()
|
|
}
|
|
if a.UpdatedAt.IsZero() {
|
|
a.UpdatedAt = time.Now()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// BeforeUpdate hook
|
|
func (a *Achievement) BeforeUpdate(tx *gorm.DB) error {
|
|
a.UpdatedAt = time.Now()
|
|
return nil
|
|
}
|
|
|
|
// DTO для создания достижения
|
|
type AchievementCreateRequest struct {
|
|
Type AchievementType `json:"type" validate:"required,oneof=distance speed consistency event special"`
|
|
Title string `json:"title" validate:"required,min=5,max=255"`
|
|
Description string `json:"description" validate:"max=1000"`
|
|
Result string `json:"result" validate:"max=100"`
|
|
Distance string `json:"distance" validate:"max=50"`
|
|
Date time.Time `json:"date" validate:"required"`
|
|
BadgeImage string `json:"badge_image" validate:"max=500"`
|
|
}
|
|
|
|
// DTO для ответа с достижениями пользователя
|
|
type UserAchievementsResponse struct {
|
|
TotalAchievements int `json:"total_achievements"`
|
|
Completed int `json:"completed"`
|
|
ProgressPercent float64 `json:"progress_percent"`
|
|
Achievements []Achievement `json:"achievements"`
|
|
} |