289 lines
10 KiB
Go
289 lines
10 KiB
Go
// Package user defines the public typed command and response payloads exposed
|
|
// at the authenticated Gateway -> User self-service boundary.
|
|
package user
|
|
|
|
import "time"
|
|
|
|
const (
|
|
// MessageTypeGetMyAccount is the authenticated gateway message type used to
|
|
// read the current regular-user account aggregate.
|
|
MessageTypeGetMyAccount = "user.account.get"
|
|
|
|
// MessageTypeUpdateMyProfile is the authenticated gateway message type used
|
|
// to mutate self-service profile fields.
|
|
MessageTypeUpdateMyProfile = "user.profile.update"
|
|
|
|
// MessageTypeUpdateMySettings is the authenticated gateway message type used
|
|
// to mutate self-service settings fields.
|
|
MessageTypeUpdateMySettings = "user.settings.update"
|
|
|
|
// MessageTypeListMySessions is the authenticated gateway message type used
|
|
// to read the caller's active device sessions.
|
|
MessageTypeListMySessions = "user.sessions.list"
|
|
|
|
// MessageTypeRevokeMySession is the authenticated gateway message type used
|
|
// to revoke one of the caller's device sessions.
|
|
MessageTypeRevokeMySession = "user.sessions.revoke"
|
|
|
|
// MessageTypeRevokeAllMySessions is the authenticated gateway message type
|
|
// used to revoke every device session belonging to the caller (logout
|
|
// everywhere).
|
|
MessageTypeRevokeAllMySessions = "user.sessions.revoke_all"
|
|
)
|
|
|
|
// GetMyAccountRequest stores the authenticated self-service read request for
|
|
// the current regular-user account aggregate.
|
|
//
|
|
// The request body is intentionally empty because gateway derives user
|
|
// identity from the authenticated device session rather than from client
|
|
// payload fields.
|
|
type GetMyAccountRequest struct{}
|
|
|
|
// UpdateMyProfileRequest stores the authenticated self-service profile
|
|
// mutation request.
|
|
type UpdateMyProfileRequest struct {
|
|
// DisplayName stores the requested replacement display name. An empty
|
|
// value resets the stored display name.
|
|
DisplayName string `json:"display_name"`
|
|
}
|
|
|
|
// UpdateMySettingsRequest stores the authenticated self-service settings
|
|
// mutation request.
|
|
type UpdateMySettingsRequest struct {
|
|
// PreferredLanguage stores the requested BCP 47 language tag.
|
|
PreferredLanguage string `json:"preferred_language"`
|
|
|
|
// TimeZone stores the requested IANA time-zone name.
|
|
TimeZone string `json:"time_zone"`
|
|
}
|
|
|
|
// ActorRef stores transport-ready audit actor metadata projected by User
|
|
// Service.
|
|
type ActorRef struct {
|
|
// Type stores the machine-readable actor type.
|
|
Type string `json:"type"`
|
|
|
|
// ID stores the optional stable actor identifier.
|
|
ID string `json:"id,omitempty"`
|
|
}
|
|
|
|
// EntitlementSnapshot stores the transport-ready current entitlement snapshot
|
|
// of one account.
|
|
type EntitlementSnapshot struct {
|
|
// PlanCode stores the effective entitlement plan code.
|
|
PlanCode string `json:"plan_code"`
|
|
|
|
// IsPaid reports whether the effective entitlement is currently paid.
|
|
IsPaid bool `json:"is_paid"`
|
|
|
|
// Source stores the machine-readable source that produced the snapshot.
|
|
Source string `json:"source"`
|
|
|
|
// Actor stores the audit actor metadata attached to the current snapshot.
|
|
Actor ActorRef `json:"actor"`
|
|
|
|
// ReasonCode stores the machine-readable reason attached to the snapshot.
|
|
ReasonCode string `json:"reason_code"`
|
|
|
|
// StartsAt stores when the effective state started.
|
|
StartsAt time.Time `json:"starts_at"`
|
|
|
|
// EndsAt stores the optional finite entitlement expiry.
|
|
EndsAt *time.Time `json:"ends_at,omitempty"`
|
|
|
|
// UpdatedAt stores when the snapshot was last recomputed.
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// MaxRegisteredRaceNames mirrors the per-tier quota carried in the
|
|
// backend HTTP response (`backend.EntitlementSnapshot`). Gateway
|
|
// re-validates the response shape with strict-unknown-field
|
|
// decoding, so the field must be present here even when the
|
|
// FlatBuffers schema does not yet carry it.
|
|
MaxRegisteredRaceNames int32 `json:"max_registered_race_names"`
|
|
}
|
|
|
|
// ActiveSanction stores one transport-ready active sanction returned in the
|
|
// shared account aggregate.
|
|
type ActiveSanction struct {
|
|
// SanctionCode stores the active sanction code.
|
|
SanctionCode string `json:"sanction_code"`
|
|
|
|
// Scope stores the machine-readable sanction scope.
|
|
Scope string `json:"scope"`
|
|
|
|
// ReasonCode stores the machine-readable sanction reason.
|
|
ReasonCode string `json:"reason_code"`
|
|
|
|
// Actor stores the audit actor metadata attached to the sanction.
|
|
Actor ActorRef `json:"actor"`
|
|
|
|
// AppliedAt stores when the sanction became active.
|
|
AppliedAt time.Time `json:"applied_at"`
|
|
|
|
// ExpiresAt stores the optional planned sanction expiry.
|
|
ExpiresAt *time.Time `json:"expires_at,omitempty"`
|
|
}
|
|
|
|
// ActiveLimit stores one transport-ready active user-specific limit override
|
|
// returned in the shared account aggregate.
|
|
type ActiveLimit struct {
|
|
// LimitCode stores the active limit code.
|
|
LimitCode string `json:"limit_code"`
|
|
|
|
// Value stores the current override value.
|
|
Value int `json:"value"`
|
|
|
|
// ReasonCode stores the machine-readable limit reason.
|
|
ReasonCode string `json:"reason_code"`
|
|
|
|
// Actor stores the audit actor metadata attached to the limit.
|
|
Actor ActorRef `json:"actor"`
|
|
|
|
// AppliedAt stores when the limit became active.
|
|
AppliedAt time.Time `json:"applied_at"`
|
|
|
|
// ExpiresAt stores the optional planned limit expiry.
|
|
ExpiresAt *time.Time `json:"expires_at,omitempty"`
|
|
}
|
|
|
|
// Account stores the transport-ready account aggregate shared by User Service
|
|
// self-service read and mutation responses.
|
|
type Account struct {
|
|
// UserID stores the durable regular-user identifier.
|
|
UserID string `json:"user_id"`
|
|
|
|
// Email stores the exact-after-trim login e-mail address.
|
|
Email string `json:"email"`
|
|
|
|
// UserName stores the immutable `player-<suffix>` handle assigned at
|
|
// account creation.
|
|
UserName string `json:"user_name"`
|
|
|
|
// DisplayName stores the current optional free-text user label.
|
|
DisplayName string `json:"display_name,omitempty"`
|
|
|
|
// PreferredLanguage stores the current BCP 47 language tag.
|
|
PreferredLanguage string `json:"preferred_language"`
|
|
|
|
// TimeZone stores the current IANA time-zone name.
|
|
TimeZone string `json:"time_zone"`
|
|
|
|
// DeclaredCountry stores the optional current effective declared country.
|
|
DeclaredCountry string `json:"declared_country,omitempty"`
|
|
|
|
// Entitlement stores the current entitlement snapshot.
|
|
Entitlement EntitlementSnapshot `json:"entitlement"`
|
|
|
|
// ActiveSanctions stores the current active sanctions sorted by code.
|
|
ActiveSanctions []ActiveSanction `json:"active_sanctions"`
|
|
|
|
// ActiveLimits stores the current active user-specific limits sorted by
|
|
// code.
|
|
ActiveLimits []ActiveLimit `json:"active_limits"`
|
|
|
|
// CreatedAt stores when the account was created.
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
// UpdatedAt stores when the account was last mutated.
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// AccountResponse stores the success payload shared by the authenticated
|
|
// GetMyAccount, UpdateMyProfile, and UpdateMySettings gateway message types.
|
|
type AccountResponse struct {
|
|
// Account stores the current account aggregate.
|
|
Account Account `json:"account"`
|
|
}
|
|
|
|
// ErrorBody stores the machine-readable and human-readable failure payload
|
|
// mirrored from the User Service trusted internal error envelope.
|
|
type ErrorBody struct {
|
|
// Code stores the stable machine-readable failure code.
|
|
Code string `json:"code"`
|
|
|
|
// Message stores the client-safe failure message.
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
// ErrorResponse stores the error payload returned by the authenticated
|
|
// Gateway -> User boundary when User Service rejects a request semantically.
|
|
type ErrorResponse struct {
|
|
// Error stores the mirrored error envelope body.
|
|
Error ErrorBody `json:"error"`
|
|
}
|
|
|
|
// DeviceSession stores the transport-ready snapshot of one device session
|
|
// served by the authenticated user-surface session endpoints.
|
|
type DeviceSession struct {
|
|
// DeviceSessionID stores the durable device-session identifier.
|
|
DeviceSessionID string `json:"device_session_id"`
|
|
|
|
// UserID stores the authenticated user identity bound to the session.
|
|
UserID string `json:"user_id"`
|
|
|
|
// Status stores the lifecycle state of the session
|
|
// (`active` or `revoked`).
|
|
Status string `json:"status"`
|
|
|
|
// ClientPublicKey stores the standard base64-encoded raw 32-byte
|
|
// Ed25519 client public key, when populated.
|
|
ClientPublicKey string `json:"client_public_key,omitempty"`
|
|
|
|
// CreatedAt stores when the session was created.
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
// RevokedAt stores when the session was revoked, if revoked.
|
|
RevokedAt *time.Time `json:"revoked_at,omitempty"`
|
|
|
|
// LastSeenAt stores when gateway last resolved this session.
|
|
LastSeenAt *time.Time `json:"last_seen_at,omitempty"`
|
|
}
|
|
|
|
// ListMySessionsRequest stores the authenticated self-service "list my
|
|
// active sessions" command. The body is intentionally empty.
|
|
type ListMySessionsRequest struct{}
|
|
|
|
// ListMySessionsResponse stores the success payload of MessageTypeListMySessions.
|
|
type ListMySessionsResponse struct {
|
|
// Items stores the caller's currently active device sessions.
|
|
Items []DeviceSession `json:"items"`
|
|
}
|
|
|
|
// RevokeMySessionRequest stores the authenticated self-service single
|
|
// session revocation request.
|
|
type RevokeMySessionRequest struct {
|
|
// DeviceSessionID identifies the device session to revoke. The
|
|
// session must belong to the caller; otherwise the response carries
|
|
// the same error shape as a missing session so foreign session ids
|
|
// cannot be probed.
|
|
DeviceSessionID string `json:"device_session_id"`
|
|
}
|
|
|
|
// RevokeMySessionResponse stores the success payload of
|
|
// MessageTypeRevokeMySession.
|
|
type RevokeMySessionResponse struct {
|
|
// Session stores the post-revoke snapshot of the affected session.
|
|
Session DeviceSession `json:"session"`
|
|
}
|
|
|
|
// RevokeAllMySessionsRequest stores the authenticated self-service
|
|
// "logout everywhere" command. The body is intentionally empty.
|
|
type RevokeAllMySessionsRequest struct{}
|
|
|
|
// DeviceSessionRevocationSummary stores the count of sessions revoked by a
|
|
// bulk operation.
|
|
type DeviceSessionRevocationSummary struct {
|
|
// UserID identifies the user whose sessions were affected.
|
|
UserID string `json:"user_id"`
|
|
|
|
// RevokedCount stores how many sessions transitioned to revoked.
|
|
RevokedCount int `json:"revoked_count"`
|
|
}
|
|
|
|
// RevokeAllMySessionsResponse stores the success payload of
|
|
// MessageTypeRevokeAllMySessions.
|
|
type RevokeAllMySessionsResponse struct {
|
|
// Summary stores the user_id and revoked_count snapshot.
|
|
Summary DeviceSessionRevocationSummary `json:"summary"`
|
|
}
|