124 lines
4.0 KiB
Go
124 lines
4.0 KiB
Go
package model
|
|
|
|
import (
|
|
"github.com/google/uuid"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type Leaderboard struct {
|
|
ID uuid.UUID `gorm:"type:uuid;primary_key;" json:"id"`
|
|
ServerID uuid.UUID `gorm:"uniqueIndex;not null;type:uuid" json:"serverId"`
|
|
FLPoints int `gorm:"default:1" json:"flPoints"`
|
|
FLColor string `gorm:"default:'#8b5cf6'" json:"flColor"`
|
|
FLTextColor string `gorm:"default:'#000000'" json:"flTextColor"`
|
|
Drivers []LeaderboardDriver `gorm:"foreignKey:LeaderboardID;constraint:OnDelete:CASCADE" json:"drivers"`
|
|
Races []LeaderboardRace `gorm:"foreignKey:LeaderboardID;constraint:OnDelete:CASCADE" json:"races"`
|
|
PointRows []LeaderboardPointRow `gorm:"foreignKey:LeaderboardID;constraint:OnDelete:CASCADE" json:"pointRows"`
|
|
}
|
|
|
|
type LeaderboardDriver struct {
|
|
ID uuid.UUID `gorm:"type:uuid;primary_key;" json:"id"`
|
|
LeaderboardID uuid.UUID `gorm:"not null;type:uuid" json:"leaderboardId"`
|
|
Name string `gorm:"not null" json:"name"`
|
|
Initials string `json:"initials"`
|
|
Color string `json:"color"`
|
|
Position int `json:"position"`
|
|
}
|
|
|
|
type LeaderboardRace struct {
|
|
ID uuid.UUID `gorm:"type:uuid;primary_key;" json:"id"`
|
|
LeaderboardID uuid.UUID `gorm:"not null;type:uuid" json:"leaderboardId"`
|
|
Name string `gorm:"not null" json:"name"`
|
|
Position int `json:"position"`
|
|
FastestLapInitials string `json:"fastestLapInitials"`
|
|
Results []LeaderboardResult `gorm:"foreignKey:RaceID;constraint:OnDelete:CASCADE" json:"results"`
|
|
}
|
|
|
|
type LeaderboardResult struct {
|
|
ID uuid.UUID `gorm:"type:uuid;primary_key;" json:"id"`
|
|
RaceID uuid.UUID `gorm:"not null;type:uuid" json:"raceId"`
|
|
DriverID uuid.UUID `gorm:"not null;type:uuid" json:"driverId"`
|
|
Score string `json:"score"`
|
|
}
|
|
|
|
type LeaderboardPointRow struct {
|
|
ID uuid.UUID `gorm:"type:uuid;primary_key;" json:"id"`
|
|
LeaderboardID uuid.UUID `gorm:"not null;type:uuid" json:"leaderboardId"`
|
|
Label string `json:"label"`
|
|
Points int `json:"points"`
|
|
Color string `json:"color"`
|
|
TextColor string `json:"textColor"`
|
|
Priority int `json:"priority"`
|
|
}
|
|
|
|
// LeaderboardInput is the wire format matching the HTML's appData shape.
|
|
type LeaderboardInput struct {
|
|
Drivers []LeaderboardDriverInput `json:"drivers"`
|
|
PointsTable []LeaderboardPointRowInput `json:"pointsTable"`
|
|
FLPoints LeaderboardFLInput `json:"flPoints"`
|
|
Tracks []LeaderboardTrackInput `json:"tracks"`
|
|
}
|
|
|
|
type LeaderboardDriverInput struct {
|
|
Name string `json:"name"`
|
|
Color string `json:"color"`
|
|
Initials string `json:"initials"`
|
|
}
|
|
|
|
type LeaderboardPointRowInput struct {
|
|
Points int `json:"points"`
|
|
Label string `json:"label"`
|
|
Color string `json:"color"`
|
|
TextColor string `json:"textColor"`
|
|
Priority int `json:"priority"`
|
|
}
|
|
|
|
type LeaderboardFLInput struct {
|
|
Points int `json:"points"`
|
|
Label string `json:"label"`
|
|
Color string `json:"color"`
|
|
TextColor string `json:"textColor"`
|
|
Priority int `json:"priority"`
|
|
}
|
|
|
|
type LeaderboardTrackInput struct {
|
|
Name string `json:"name"`
|
|
Results []interface{} `json:"results"`
|
|
FastestLapInitials string `json:"fastestLapInitials"`
|
|
}
|
|
|
|
func (l *Leaderboard) BeforeCreate(tx *gorm.DB) error {
|
|
if l.ID == uuid.Nil {
|
|
l.ID = uuid.New()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (d *LeaderboardDriver) BeforeCreate(tx *gorm.DB) error {
|
|
if d.ID == uuid.Nil {
|
|
d.ID = uuid.New()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r *LeaderboardRace) BeforeCreate(tx *gorm.DB) error {
|
|
if r.ID == uuid.Nil {
|
|
r.ID = uuid.New()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r *LeaderboardResult) BeforeCreate(tx *gorm.DB) error {
|
|
if r.ID == uuid.Nil {
|
|
r.ID = uuid.New()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (p *LeaderboardPointRow) BeforeCreate(tx *gorm.DB) error {
|
|
if p.ID == uuid.Nil {
|
|
p.ID = uuid.New()
|
|
}
|
|
return nil
|
|
}
|