package local import ( "crypto/rand" "encoding/base32" "fmt" "strings" "galaxy/user/internal/domain/common" "galaxy/user/internal/domain/entitlement" "galaxy/user/internal/domain/policy" ) var base32NoPadding = base32.StdEncoding.WithPadding(base32.NoPadding) // IDGenerator creates opaque stable user identifiers and generated initial // race names. type IDGenerator struct{} // NewUserID returns one newly generated opaque user identifier. func (IDGenerator) NewUserID() (common.UserID, error) { token, err := randomToken(10) if err != nil { return "", fmt.Errorf("generate user id: %w", err) } userID := common.UserID("user-" + token) if err := userID.Validate(); err != nil { return "", fmt.Errorf("generate user id: %w", err) } return userID, nil } // NewInitialRaceName returns one generated race name in the `player-` // form. func (IDGenerator) NewInitialRaceName() (common.RaceName, error) { token, err := randomToken(5) if err != nil { return "", fmt.Errorf("generate initial race name: %w", err) } raceName := common.RaceName("player-" + token) if err := raceName.Validate(); err != nil { return "", fmt.Errorf("generate initial race name: %w", err) } return raceName, nil } // NewEntitlementRecordID returns one generated entitlement history record // identifier. func (IDGenerator) NewEntitlementRecordID() (entitlement.EntitlementRecordID, error) { token, err := randomToken(10) if err != nil { return "", fmt.Errorf("generate entitlement record id: %w", err) } recordID := entitlement.EntitlementRecordID("entitlement-" + token) if err := recordID.Validate(); err != nil { return "", fmt.Errorf("generate entitlement record id: %w", err) } return recordID, nil } // NewSanctionRecordID returns one generated sanction history record // identifier. func (IDGenerator) NewSanctionRecordID() (policy.SanctionRecordID, error) { token, err := randomToken(10) if err != nil { return "", fmt.Errorf("generate sanction record id: %w", err) } recordID := policy.SanctionRecordID("sanction-" + token) if err := recordID.Validate(); err != nil { return "", fmt.Errorf("generate sanction record id: %w", err) } return recordID, nil } // NewLimitRecordID returns one generated limit history record identifier. func (IDGenerator) NewLimitRecordID() (policy.LimitRecordID, error) { token, err := randomToken(10) if err != nil { return "", fmt.Errorf("generate limit record id: %w", err) } recordID := policy.LimitRecordID("limit-" + token) if err := recordID.Validate(); err != nil { return "", fmt.Errorf("generate limit record id: %w", err) } return recordID, nil } func randomToken(size int) (string, error) { buffer := make([]byte, size) if _, err := rand.Read(buffer); err != nil { return "", err } return strings.ToLower(base32NoPadding.EncodeToString(buffer)), nil }