feat: user service
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user