106 lines
2.8 KiB
Go
106 lines
2.8 KiB
Go
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-<shortid>`
|
|
// 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
|
|
}
|