package db import ( "context" "strings" "time" "github.com/pkg/errors" "github.com/uptrace/bun" ) type Season struct { bun.BaseModel `bun:"table:seasons,alias:s"` ID int `bun:"id,pk,autoincrement"` Name string `bun:"name,unique"` ShortName string `bun:"short_name,unique"` StartDate time.Time `bun:"start_date,notnull"` EndDate bun.NullTime `bun:"end_date"` FinalsStartDate bun.NullTime `bun:"finals_start_date"` FinalsEndDate bun.NullTime `bun:"finals_end_date"` } func NewSeason(ctx context.Context, tx bun.Tx, name, shortname string, start time.Time) (*Season, error) { if name == "" { return nil, errors.New("name cannot be empty") } if shortname == "" { return nil, errors.New("shortname cannot be empty") } season := &Season{ Name: name, ShortName: strings.ToUpper(shortname), StartDate: start.Truncate(time.Hour * 24), } _, err := tx.NewInsert(). Model(season). Returning("id"). Exec(ctx) if err != nil { return nil, errors.Wrap(err, "tx.NewInsert") } return season, nil } func ListSeasons(ctx context.Context, tx bun.Tx, pageOpts *PageOpts) (*List[Season], error) { defaults := &PageOpts{ 1, 10, bun.OrderDesc, "start_date", } return GetList[Season](tx, pageOpts, defaults).GetAll(ctx) } func GetSeason(ctx context.Context, tx bun.Tx, shortname string) (*Season, error) { if shortname == "" { return nil, errors.New("short_name not provided") } return GetByField[Season](tx, "short_name", shortname).GetFirst(ctx) } func UpdateSeason(ctx context.Context, tx bun.Tx, season *Season) error { if season == nil { return errors.New("season cannot be nil") } if season.ID == 0 { return errors.New("season ID cannot be 0") } // Truncate dates to day precision season.StartDate = season.StartDate.Truncate(time.Hour * 24) if !season.EndDate.IsZero() { season.EndDate.Time = season.EndDate.Time.Truncate(time.Hour * 24) } if !season.FinalsStartDate.IsZero() { season.FinalsStartDate.Time = season.FinalsStartDate.Time.Truncate(time.Hour * 24) } if !season.FinalsEndDate.IsZero() { season.FinalsEndDate.Time = season.FinalsEndDate.Time.Truncate(time.Hour * 24) } _, err := tx.NewUpdate(). Model(season). Column("start_date", "end_date", "finals_start_date", "finals_end_date"). Where("id = ?", season.ID). Exec(ctx) if err != nil { return errors.Wrap(err, "tx.NewUpdate") } return nil }