50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
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
|
|
}
|