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
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"`
|
|
} |