package shared import ( "fmt" "time" "galaxy/user/internal/domain/account" "galaxy/user/internal/domain/common" "galaxy/user/internal/ports" ) // BuildRaceNameReservation constructs one validated race-name reservation // record for userID and raceName at reservedAt. func BuildRaceNameReservation( policy ports.RaceNamePolicy, userID common.UserID, raceName common.RaceName, reservedAt time.Time, ) (account.RaceNameReservation, error) { if policy == nil { return account.RaceNameReservation{}, fmt.Errorf("build race-name reservation: race-name policy must not be nil") } if err := userID.Validate(); err != nil { return account.RaceNameReservation{}, fmt.Errorf("build race-name reservation: %w", err) } if err := raceName.Validate(); err != nil { return account.RaceNameReservation{}, fmt.Errorf("build race-name reservation: %w", err) } if err := common.ValidateTimestamp("build race-name reservation reserved at", reservedAt); err != nil { return account.RaceNameReservation{}, err } canonicalKey, err := policy.CanonicalKey(raceName) if err != nil { return account.RaceNameReservation{}, fmt.Errorf("build race-name reservation: %w", err) } record := account.RaceNameReservation{ CanonicalKey: canonicalKey, UserID: userID, RaceName: raceName, ReservedAt: reservedAt.UTC(), } if err := record.Validate(); err != nil { return account.RaceNameReservation{}, fmt.Errorf("build race-name reservation: %w", err) } return record, nil }