feat: game lobby service

This commit is contained in:
Ilia Denisov
2026-04-25 23:20:55 +02:00
committed by GitHub
parent 32dc29359a
commit 48b0056b49
336 changed files with 57074 additions and 1418 deletions
+9 -4
View File
@@ -29,8 +29,9 @@ type GetMyAccountRequest struct{}
// UpdateMyProfileRequest stores the authenticated self-service profile
// mutation request.
type UpdateMyProfileRequest struct {
// RaceName stores the requested exact replacement race name.
RaceName string `json:"race_name"`
// 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
@@ -134,8 +135,12 @@ type Account struct {
// Email stores the exact-after-trim login e-mail address.
Email string `json:"email"`
// RaceName stores the current user-facing race name.
RaceName string `json:"race_name"`
// 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"`
+48 -3
View File
@@ -82,6 +82,13 @@ const (
// `lobby.membership.rejected` notification.
NotificationTypeLobbyMembershipRejected NotificationType = "lobby.membership.rejected"
// NotificationTypeLobbyMembershipBlocked identifies the
// `lobby.membership.blocked` notification published by Game Lobby
// to the private-game owner when an active membership is blocked
// by the user-lifecycle cascade reacting to a `permanent_block` or
// `DeleteUser` event.
NotificationTypeLobbyMembershipBlocked NotificationType = "lobby.membership.blocked"
// NotificationTypeLobbyInviteCreated identifies the
// `lobby.invite.created` notification.
NotificationTypeLobbyInviteCreated NotificationType = "lobby.invite.created"
@@ -93,6 +100,24 @@ const (
// NotificationTypeLobbyInviteExpired identifies the
// `lobby.invite.expired` notification.
NotificationTypeLobbyInviteExpired NotificationType = "lobby.invite.expired"
// NotificationTypeLobbyRaceNameRegistrationEligible identifies the
// `lobby.race_name.registration_eligible` notification published by
// Game Lobby when capability evaluation at game finish promotes a
// reservation to `pending_registration`.
NotificationTypeLobbyRaceNameRegistrationEligible NotificationType = "lobby.race_name.registration_eligible"
// NotificationTypeLobbyRaceNameRegistered identifies the
// `lobby.race_name.registered` notification published by Game Lobby
// when a user converts a `pending_registration` into a permanent
// registered race name.
NotificationTypeLobbyRaceNameRegistered NotificationType = "lobby.race_name.registered"
// NotificationTypeLobbyRaceNameRegistrationDenied identifies the
// `lobby.race_name.registration_denied` notification published by
// Game Lobby when capability evaluation at game finish releases a
// reservation because the member did not meet the capability rule.
NotificationTypeLobbyRaceNameRegistrationDenied NotificationType = "lobby.race_name.registration_denied"
)
// String returns the wire value for notificationType.
@@ -111,9 +136,13 @@ func (notificationType NotificationType) IsKnown() bool {
NotificationTypeLobbyApplicationSubmitted,
NotificationTypeLobbyMembershipApproved,
NotificationTypeLobbyMembershipRejected,
NotificationTypeLobbyMembershipBlocked,
NotificationTypeLobbyInviteCreated,
NotificationTypeLobbyInviteRedeemed,
NotificationTypeLobbyInviteExpired:
NotificationTypeLobbyInviteExpired,
NotificationTypeLobbyRaceNameRegistrationEligible,
NotificationTypeLobbyRaceNameRegistered,
NotificationTypeLobbyRaceNameRegistrationDenied:
return true
default:
return false
@@ -133,9 +162,13 @@ func (notificationType NotificationType) ExpectedProducer() Producer {
NotificationTypeLobbyApplicationSubmitted,
NotificationTypeLobbyMembershipApproved,
NotificationTypeLobbyMembershipRejected,
NotificationTypeLobbyMembershipBlocked,
NotificationTypeLobbyInviteCreated,
NotificationTypeLobbyInviteRedeemed,
NotificationTypeLobbyInviteExpired:
NotificationTypeLobbyInviteExpired,
NotificationTypeLobbyRaceNameRegistrationEligible,
NotificationTypeLobbyRaceNameRegistered,
NotificationTypeLobbyRaceNameRegistrationDenied:
return ProducerGameLobby
default:
return ""
@@ -169,7 +202,8 @@ func (notificationType NotificationType) SupportsChannel(audienceKind AudienceKi
return channel == ChannelEmail
}
return channel == ChannelPush || channel == ChannelEmail
case NotificationTypeLobbyInviteExpired:
case NotificationTypeLobbyInviteExpired,
NotificationTypeLobbyRaceNameRegistrationDenied:
return audienceKind == AudienceKindUser && channel == ChannelEmail
default:
return audienceKind == AudienceKindUser && (channel == ChannelPush || channel == ChannelEmail)
@@ -752,10 +786,21 @@ func validatePayloadObject(notificationType NotificationType, payload map[string
return validateStringFields(payload, "game_id", "game_name", "applicant_user_id", "applicant_name")
case NotificationTypeLobbyMembershipApproved, NotificationTypeLobbyMembershipRejected:
return validateStringFields(payload, "game_id", "game_name")
case NotificationTypeLobbyMembershipBlocked:
return validateStringFields(payload, "game_id", "game_name", "membership_user_id", "membership_user_name", "reason")
case NotificationTypeLobbyInviteCreated:
return validateStringFields(payload, "game_id", "game_name", "inviter_user_id", "inviter_name")
case NotificationTypeLobbyInviteRedeemed, NotificationTypeLobbyInviteExpired:
return validateStringFields(payload, "game_id", "game_name", "invitee_user_id", "invitee_name")
case NotificationTypeLobbyRaceNameRegistrationEligible:
if err := validateStringFields(payload, "game_id", "game_name", "race_name"); err != nil {
return err
}
return validatePositiveIntFields(payload, "eligible_until_ms")
case NotificationTypeLobbyRaceNameRegistered:
return validateStringFields(payload, "race_name")
case NotificationTypeLobbyRaceNameRegistrationDenied:
return validateStringFields(payload, "game_id", "game_name", "race_name", "reason")
default:
return fmt.Errorf("payload_json notification type %q is unsupported", notificationType)
}
+62
View File
@@ -159,6 +159,23 @@ func TestConstructorsBuildExpectedIntentValues(t *testing.T) {
recipientUserIDs: []string{"applicant-1"},
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash"}`,
},
{
name: "lobby membership blocked",
build: func() (Intent, error) {
return NewLobbyMembershipBlockedIntent(metadata, "owner-1", LobbyMembershipBlockedPayload{
GameID: "game-1",
GameName: "Nebula Clash",
MembershipUserID: "user-2",
MembershipUserName: "player-aabbccdd",
Reason: "permanent_blocked",
})
},
notificationType: NotificationTypeLobbyMembershipBlocked,
producer: ProducerGameLobby,
audienceKind: AudienceKindUser,
recipientUserIDs: []string{"owner-1"},
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","membership_user_id":"user-2","membership_user_name":"player-aabbccdd","reason":"permanent_blocked"}`,
},
{
name: "lobby invite created",
build: func() (Intent, error) {
@@ -207,6 +224,51 @@ func TestConstructorsBuildExpectedIntentValues(t *testing.T) {
recipientUserIDs: []string{"owner-1"},
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","invitee_user_id":"invitee-1","invitee_name":"Nova Pilot"}`,
},
{
name: "lobby race name registration eligible",
build: func() (Intent, error) {
return NewLobbyRaceNameRegistrationEligibleIntent(metadata, "user-7", LobbyRaceNameRegistrationEligiblePayload{
GameID: "game-1",
GameName: "Nebula Clash",
RaceName: "Skylancer",
EligibleUntilMs: 1775208100000,
})
},
notificationType: NotificationTypeLobbyRaceNameRegistrationEligible,
producer: ProducerGameLobby,
audienceKind: AudienceKindUser,
recipientUserIDs: []string{"user-7"},
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","race_name":"Skylancer","eligible_until_ms":1775208100000}`,
},
{
name: "lobby race name registered",
build: func() (Intent, error) {
return NewLobbyRaceNameRegisteredIntent(metadata, "user-8", LobbyRaceNameRegisteredPayload{
RaceName: "Skylancer",
})
},
notificationType: NotificationTypeLobbyRaceNameRegistered,
producer: ProducerGameLobby,
audienceKind: AudienceKindUser,
recipientUserIDs: []string{"user-8"},
payloadJSON: `{"race_name":"Skylancer"}`,
},
{
name: "lobby race name registration denied",
build: func() (Intent, error) {
return NewLobbyRaceNameRegistrationDeniedIntent(metadata, "user-9", LobbyRaceNameRegistrationDeniedPayload{
GameID: "game-1",
GameName: "Nebula Clash",
RaceName: "Skylancer",
Reason: "capability_not_met",
})
},
notificationType: NotificationTypeLobbyRaceNameRegistrationDenied,
producer: ProducerGameLobby,
audienceKind: AudienceKindUser,
recipientUserIDs: []string{"user-9"},
payloadJSON: `{"game_id":"game-1","game_name":"Nebula Clash","race_name":"Skylancer","reason":"capability_not_met"}`,
},
}
for _, tt := range tests {
+66
View File
@@ -62,6 +62,20 @@ type LobbyMembershipRejectedPayload struct {
GameName string `json:"game_name"`
}
// LobbyMembershipBlockedPayload stores the normalized payload for
// `lobby.membership.blocked` published by the user-lifecycle cascade
// when an active membership is blocked because the underlying user was
// permanently blocked or deleted.
type LobbyMembershipBlockedPayload struct {
GameID string `json:"game_id"`
GameName string `json:"game_name"`
MembershipUserID string `json:"membership_user_id"`
MembershipUserName string `json:"membership_user_name"`
// Reason captures the upstream lifecycle event that triggered the
// cascade. Frozen vocabulary: `permanent_blocked`, `deleted`.
Reason string `json:"reason"`
}
// LobbyInviteCreatedPayload stores the normalized payload for
// `lobby.invite.created`.
type LobbyInviteCreatedPayload struct {
@@ -89,6 +103,30 @@ type LobbyInviteExpiredPayload struct {
InviteeName string `json:"invitee_name"`
}
// LobbyRaceNameRegistrationEligiblePayload stores the normalized payload
// for `lobby.race_name.registration_eligible`.
type LobbyRaceNameRegistrationEligiblePayload struct {
GameID string `json:"game_id"`
GameName string `json:"game_name"`
RaceName string `json:"race_name"`
EligibleUntilMs int64 `json:"eligible_until_ms"`
}
// LobbyRaceNameRegisteredPayload stores the normalized payload for
// `lobby.race_name.registered`.
type LobbyRaceNameRegisteredPayload struct {
RaceName string `json:"race_name"`
}
// LobbyRaceNameRegistrationDeniedPayload stores the normalized payload for
// `lobby.race_name.registration_denied`.
type LobbyRaceNameRegistrationDeniedPayload struct {
GameID string `json:"game_id"`
GameName string `json:"game_name"`
RaceName string `json:"race_name"`
Reason string `json:"reason"`
}
// NewGeoReviewRecommendedIntent builds the admin-email intent published by Geo
// Profile Service when a user becomes review-worthy.
func NewGeoReviewRecommendedIntent(metadata Metadata, payload GeoReviewRecommendedPayload) (Intent, error) {
@@ -143,6 +181,14 @@ func NewLobbyMembershipRejectedIntent(metadata Metadata, applicantUserID string,
return newIntent(NotificationTypeLobbyMembershipRejected, ProducerGameLobby, AudienceKindUser, []string{applicantUserID}, metadata, payload)
}
// NewLobbyMembershipBlockedIntent builds the private-game owner intent
// published by Game Lobby when an active membership is blocked by the
// user-lifecycle cascade. ownerUserID is the recipient (private-game
// owner whose roster lost the affected member).
func NewLobbyMembershipBlockedIntent(metadata Metadata, ownerUserID string, payload LobbyMembershipBlockedPayload) (Intent, error) {
return newIntent(NotificationTypeLobbyMembershipBlocked, ProducerGameLobby, AudienceKindUser, []string{ownerUserID}, metadata, payload)
}
// NewLobbyInviteCreatedIntent builds the invited-user intent published by Game
// Lobby when a private-game invite is created.
func NewLobbyInviteCreatedIntent(metadata Metadata, invitedUserID string, payload LobbyInviteCreatedPayload) (Intent, error) {
@@ -160,3 +206,23 @@ func NewLobbyInviteRedeemedIntent(metadata Metadata, ownerUserID string, payload
func NewLobbyInviteExpiredIntent(metadata Metadata, ownerUserID string, payload LobbyInviteExpiredPayload) (Intent, error) {
return newIntent(NotificationTypeLobbyInviteExpired, ProducerGameLobby, AudienceKindUser, []string{ownerUserID}, metadata, payload)
}
// NewLobbyRaceNameRegistrationEligibleIntent builds the capable-member intent
// published by Game Lobby at game finish when a reservation is promoted to
// `pending_registration`.
func NewLobbyRaceNameRegistrationEligibleIntent(metadata Metadata, recipientUserID string, payload LobbyRaceNameRegistrationEligiblePayload) (Intent, error) {
return newIntent(NotificationTypeLobbyRaceNameRegistrationEligible, ProducerGameLobby, AudienceKindUser, []string{recipientUserID}, metadata, payload)
}
// NewLobbyRaceNameRegisteredIntent builds the registering-user intent
// published by Game Lobby on successful `lobby.race_name.register` commit.
func NewLobbyRaceNameRegisteredIntent(metadata Metadata, recipientUserID string, payload LobbyRaceNameRegisteredPayload) (Intent, error) {
return newIntent(NotificationTypeLobbyRaceNameRegistered, ProducerGameLobby, AudienceKindUser, []string{recipientUserID}, metadata, payload)
}
// NewLobbyRaceNameRegistrationDeniedIntent builds the incapable-member intent
// published by Game Lobby at game finish when a reservation is released
// without a pending-registration window.
func NewLobbyRaceNameRegistrationDeniedIntent(metadata Metadata, recipientUserID string, payload LobbyRaceNameRegistrationDeniedPayload) (Intent, error) {
return newIntent(NotificationTypeLobbyRaceNameRegistrationDenied, ProducerGameLobby, AudienceKindUser, []string{recipientUserID}, metadata, payload)
}
+16
View File
@@ -25,6 +25,12 @@ table LobbyMembershipRejectedEvent {
game_id:string;
}
table LobbyMembershipBlockedEvent {
game_id:string;
membership_user_id:string;
reason:string;
}
table LobbyInviteCreatedEvent {
game_id:string;
inviter_user_id:string;
@@ -35,4 +41,14 @@ table LobbyInviteRedeemedEvent {
invitee_user_id:string;
}
table LobbyRaceNameRegistrationEligibleEvent {
game_id:string;
race_name:string;
eligible_until_ms:int64;
}
table LobbyRaceNameRegisteredEvent {
race_name:string;
}
root_type GameTurnReadyEvent;
@@ -0,0 +1,82 @@
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
package notification
import (
flatbuffers "github.com/google/flatbuffers/go"
)
type LobbyMembershipBlockedEvent struct {
_tab flatbuffers.Table
}
func GetRootAsLobbyMembershipBlockedEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyMembershipBlockedEvent {
n := flatbuffers.GetUOffsetT(buf[offset:])
x := &LobbyMembershipBlockedEvent{}
x.Init(buf, n+offset)
return x
}
func FinishLobbyMembershipBlockedEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
builder.Finish(offset)
}
func GetSizePrefixedRootAsLobbyMembershipBlockedEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyMembershipBlockedEvent {
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
x := &LobbyMembershipBlockedEvent{}
x.Init(buf, n+offset+flatbuffers.SizeUint32)
return x
}
func FinishSizePrefixedLobbyMembershipBlockedEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
builder.FinishSizePrefixed(offset)
}
func (rcv *LobbyMembershipBlockedEvent) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
}
func (rcv *LobbyMembershipBlockedEvent) Table() flatbuffers.Table {
return rcv._tab
}
func (rcv *LobbyMembershipBlockedEvent) GameId() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
}
return nil
}
func (rcv *LobbyMembershipBlockedEvent) MembershipUserId() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
}
return nil
}
func (rcv *LobbyMembershipBlockedEvent) Reason() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
}
return nil
}
func LobbyMembershipBlockedEventStart(builder *flatbuffers.Builder) {
builder.StartObject(3)
}
func LobbyMembershipBlockedEventAddGameId(builder *flatbuffers.Builder, gameId flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(gameId), 0)
}
func LobbyMembershipBlockedEventAddMembershipUserId(builder *flatbuffers.Builder, membershipUserId flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(membershipUserId), 0)
}
func LobbyMembershipBlockedEventAddReason(builder *flatbuffers.Builder, reason flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(reason), 0)
}
func LobbyMembershipBlockedEventEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
return builder.EndObject()
}
@@ -0,0 +1,60 @@
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
package notification
import (
flatbuffers "github.com/google/flatbuffers/go"
)
type LobbyRaceNameRegisteredEvent struct {
_tab flatbuffers.Table
}
func GetRootAsLobbyRaceNameRegisteredEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegisteredEvent {
n := flatbuffers.GetUOffsetT(buf[offset:])
x := &LobbyRaceNameRegisteredEvent{}
x.Init(buf, n+offset)
return x
}
func FinishLobbyRaceNameRegisteredEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
builder.Finish(offset)
}
func GetSizePrefixedRootAsLobbyRaceNameRegisteredEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegisteredEvent {
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
x := &LobbyRaceNameRegisteredEvent{}
x.Init(buf, n+offset+flatbuffers.SizeUint32)
return x
}
func FinishSizePrefixedLobbyRaceNameRegisteredEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
builder.FinishSizePrefixed(offset)
}
func (rcv *LobbyRaceNameRegisteredEvent) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
}
func (rcv *LobbyRaceNameRegisteredEvent) Table() flatbuffers.Table {
return rcv._tab
}
func (rcv *LobbyRaceNameRegisteredEvent) RaceName() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
}
return nil
}
func LobbyRaceNameRegisteredEventStart(builder *flatbuffers.Builder) {
builder.StartObject(1)
}
func LobbyRaceNameRegisteredEventAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(raceName), 0)
}
func LobbyRaceNameRegisteredEventEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
return builder.EndObject()
}
@@ -0,0 +1,86 @@
// Code generated by the FlatBuffers compiler. DO NOT EDIT.
package notification
import (
flatbuffers "github.com/google/flatbuffers/go"
)
type LobbyRaceNameRegistrationEligibleEvent struct {
_tab flatbuffers.Table
}
func GetRootAsLobbyRaceNameRegistrationEligibleEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegistrationEligibleEvent {
n := flatbuffers.GetUOffsetT(buf[offset:])
x := &LobbyRaceNameRegistrationEligibleEvent{}
x.Init(buf, n+offset)
return x
}
func FinishLobbyRaceNameRegistrationEligibleEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
builder.Finish(offset)
}
func GetSizePrefixedRootAsLobbyRaceNameRegistrationEligibleEvent(buf []byte, offset flatbuffers.UOffsetT) *LobbyRaceNameRegistrationEligibleEvent {
n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:])
x := &LobbyRaceNameRegistrationEligibleEvent{}
x.Init(buf, n+offset+flatbuffers.SizeUint32)
return x
}
func FinishSizePrefixedLobbyRaceNameRegistrationEligibleEventBuffer(builder *flatbuffers.Builder, offset flatbuffers.UOffsetT) {
builder.FinishSizePrefixed(offset)
}
func (rcv *LobbyRaceNameRegistrationEligibleEvent) Init(buf []byte, i flatbuffers.UOffsetT) {
rcv._tab.Bytes = buf
rcv._tab.Pos = i
}
func (rcv *LobbyRaceNameRegistrationEligibleEvent) Table() flatbuffers.Table {
return rcv._tab
}
func (rcv *LobbyRaceNameRegistrationEligibleEvent) GameId() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
}
return nil
}
func (rcv *LobbyRaceNameRegistrationEligibleEvent) RaceName() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
}
return nil
}
func (rcv *LobbyRaceNameRegistrationEligibleEvent) EligibleUntilMs() int64 {
o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
if o != 0 {
return rcv._tab.GetInt64(o + rcv._tab.Pos)
}
return 0
}
func (rcv *LobbyRaceNameRegistrationEligibleEvent) MutateEligibleUntilMs(n int64) bool {
return rcv._tab.MutateInt64Slot(8, n)
}
func LobbyRaceNameRegistrationEligibleEventStart(builder *flatbuffers.Builder) {
builder.StartObject(3)
}
func LobbyRaceNameRegistrationEligibleEventAddGameId(builder *flatbuffers.Builder, gameId flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(gameId), 0)
}
func LobbyRaceNameRegistrationEligibleEventAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(raceName), 0)
}
func LobbyRaceNameRegistrationEligibleEventAddEligibleUntilMs(builder *flatbuffers.Builder, eligibleUntilMs int64) {
builder.PrependInt64Slot(2, eligibleUntilMs, 0)
}
func LobbyRaceNameRegistrationEligibleEventEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
return builder.EndObject()
}
+3 -2
View File
@@ -6,7 +6,7 @@ table GetMyAccountRequest {
}
table UpdateMyProfileRequest {
race_name:string;
display_name:string;
}
table UpdateMySettingsRequest {
@@ -51,7 +51,8 @@ table ActiveLimit {
table AccountView {
user_id:string;
email:string;
race_name:string;
user_name:string;
display_name:string;
preferred_language:string;
time_zone:string;
declared_country:string;
+44 -33
View File
@@ -57,7 +57,7 @@ func (rcv *AccountView) Email() []byte {
return nil
}
func (rcv *AccountView) RaceName() []byte {
func (rcv *AccountView) UserName() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
@@ -65,7 +65,7 @@ func (rcv *AccountView) RaceName() []byte {
return nil
}
func (rcv *AccountView) PreferredLanguage() []byte {
func (rcv *AccountView) DisplayName() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
@@ -73,7 +73,7 @@ func (rcv *AccountView) PreferredLanguage() []byte {
return nil
}
func (rcv *AccountView) TimeZone() []byte {
func (rcv *AccountView) PreferredLanguage() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
@@ -81,7 +81,7 @@ func (rcv *AccountView) TimeZone() []byte {
return nil
}
func (rcv *AccountView) DeclaredCountry() []byte {
func (rcv *AccountView) TimeZone() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(14))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
@@ -89,8 +89,16 @@ func (rcv *AccountView) DeclaredCountry() []byte {
return nil
}
func (rcv *AccountView) Entitlement(obj *EntitlementSnapshot) *EntitlementSnapshot {
func (rcv *AccountView) DeclaredCountry() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(16))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
}
return nil
}
func (rcv *AccountView) Entitlement(obj *EntitlementSnapshot) *EntitlementSnapshot {
o := flatbuffers.UOffsetT(rcv._tab.Offset(18))
if o != 0 {
x := rcv._tab.Indirect(o + rcv._tab.Pos)
if obj == nil {
@@ -103,7 +111,7 @@ func (rcv *AccountView) Entitlement(obj *EntitlementSnapshot) *EntitlementSnapsh
}
func (rcv *AccountView) ActiveSanctions(obj *ActiveSanction, j int) bool {
o := flatbuffers.UOffsetT(rcv._tab.Offset(18))
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
if o != 0 {
x := rcv._tab.Vector(o)
x += flatbuffers.UOffsetT(j) * 4
@@ -115,7 +123,7 @@ func (rcv *AccountView) ActiveSanctions(obj *ActiveSanction, j int) bool {
}
func (rcv *AccountView) ActiveSanctionsLength() int {
o := flatbuffers.UOffsetT(rcv._tab.Offset(18))
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
if o != 0 {
return rcv._tab.VectorLen(o)
}
@@ -123,7 +131,7 @@ func (rcv *AccountView) ActiveSanctionsLength() int {
}
func (rcv *AccountView) ActiveLimits(obj *ActiveLimit, j int) bool {
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
o := flatbuffers.UOffsetT(rcv._tab.Offset(22))
if o != 0 {
x := rcv._tab.Vector(o)
x += flatbuffers.UOffsetT(j) * 4
@@ -135,7 +143,7 @@ func (rcv *AccountView) ActiveLimits(obj *ActiveLimit, j int) bool {
}
func (rcv *AccountView) ActiveLimitsLength() int {
o := flatbuffers.UOffsetT(rcv._tab.Offset(20))
o := flatbuffers.UOffsetT(rcv._tab.Offset(22))
if o != 0 {
return rcv._tab.VectorLen(o)
}
@@ -143,18 +151,6 @@ func (rcv *AccountView) ActiveLimitsLength() int {
}
func (rcv *AccountView) CreatedAtMs() int64 {
o := flatbuffers.UOffsetT(rcv._tab.Offset(22))
if o != 0 {
return rcv._tab.GetInt64(o + rcv._tab.Pos)
}
return 0
}
func (rcv *AccountView) MutateCreatedAtMs(n int64) bool {
return rcv._tab.MutateInt64Slot(22, n)
}
func (rcv *AccountView) UpdatedAtMs() int64 {
o := flatbuffers.UOffsetT(rcv._tab.Offset(24))
if o != 0 {
return rcv._tab.GetInt64(o + rcv._tab.Pos)
@@ -162,12 +158,24 @@ func (rcv *AccountView) UpdatedAtMs() int64 {
return 0
}
func (rcv *AccountView) MutateUpdatedAtMs(n int64) bool {
func (rcv *AccountView) MutateCreatedAtMs(n int64) bool {
return rcv._tab.MutateInt64Slot(24, n)
}
func (rcv *AccountView) UpdatedAtMs() int64 {
o := flatbuffers.UOffsetT(rcv._tab.Offset(26))
if o != 0 {
return rcv._tab.GetInt64(o + rcv._tab.Pos)
}
return 0
}
func (rcv *AccountView) MutateUpdatedAtMs(n int64) bool {
return rcv._tab.MutateInt64Slot(26, n)
}
func AccountViewStart(builder *flatbuffers.Builder) {
builder.StartObject(11)
builder.StartObject(12)
}
func AccountViewAddUserId(builder *flatbuffers.Builder, userId flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(userId), 0)
@@ -175,38 +183,41 @@ func AccountViewAddUserId(builder *flatbuffers.Builder, userId flatbuffers.UOffs
func AccountViewAddEmail(builder *flatbuffers.Builder, email flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(email), 0)
}
func AccountViewAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(raceName), 0)
func AccountViewAddUserName(builder *flatbuffers.Builder, userName flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(userName), 0)
}
func AccountViewAddDisplayName(builder *flatbuffers.Builder, displayName flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(displayName), 0)
}
func AccountViewAddPreferredLanguage(builder *flatbuffers.Builder, preferredLanguage flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(preferredLanguage), 0)
builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(preferredLanguage), 0)
}
func AccountViewAddTimeZone(builder *flatbuffers.Builder, timeZone flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(timeZone), 0)
builder.PrependUOffsetTSlot(5, flatbuffers.UOffsetT(timeZone), 0)
}
func AccountViewAddDeclaredCountry(builder *flatbuffers.Builder, declaredCountry flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(5, flatbuffers.UOffsetT(declaredCountry), 0)
builder.PrependUOffsetTSlot(6, flatbuffers.UOffsetT(declaredCountry), 0)
}
func AccountViewAddEntitlement(builder *flatbuffers.Builder, entitlement flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(6, flatbuffers.UOffsetT(entitlement), 0)
builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(entitlement), 0)
}
func AccountViewAddActiveSanctions(builder *flatbuffers.Builder, activeSanctions flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(activeSanctions), 0)
builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(activeSanctions), 0)
}
func AccountViewStartActiveSanctionsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
return builder.StartVector(4, numElems, 4)
}
func AccountViewAddActiveLimits(builder *flatbuffers.Builder, activeLimits flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(activeLimits), 0)
builder.PrependUOffsetTSlot(9, flatbuffers.UOffsetT(activeLimits), 0)
}
func AccountViewStartActiveLimitsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
return builder.StartVector(4, numElems, 4)
}
func AccountViewAddCreatedAtMs(builder *flatbuffers.Builder, createdAtMs int64) {
builder.PrependInt64Slot(9, createdAtMs, 0)
builder.PrependInt64Slot(10, createdAtMs, 0)
}
func AccountViewAddUpdatedAtMs(builder *flatbuffers.Builder, updatedAtMs int64) {
builder.PrependInt64Slot(10, updatedAtMs, 0)
builder.PrependInt64Slot(11, updatedAtMs, 0)
}
func AccountViewEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
return builder.EndObject()
@@ -41,7 +41,7 @@ func (rcv *UpdateMyProfileRequest) Table() flatbuffers.Table {
return rcv._tab
}
func (rcv *UpdateMyProfileRequest) RaceName() []byte {
func (rcv *UpdateMyProfileRequest) DisplayName() []byte {
o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
if o != 0 {
return rcv._tab.ByteVector(o + rcv._tab.Pos)
@@ -52,8 +52,8 @@ func (rcv *UpdateMyProfileRequest) RaceName() []byte {
func UpdateMyProfileRequestStart(builder *flatbuffers.Builder) {
builder.StartObject(1)
}
func UpdateMyProfileRequestAddRaceName(builder *flatbuffers.Builder, raceName flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(raceName), 0)
func UpdateMyProfileRequestAddDisplayName(builder *flatbuffers.Builder, displayName flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(displayName), 0)
}
func UpdateMyProfileRequestEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
return builder.EndObject()
+179
View File
@@ -42,6 +42,16 @@ type LobbyMembershipRejectedEvent struct {
GameID string
}
// LobbyMembershipBlockedEvent is the independent Go representation of
// `notification.LobbyMembershipBlockedEvent`. Reason carries the upstream
// lifecycle event that triggered the cascade
// (`permanent_blocked`, `deleted`).
type LobbyMembershipBlockedEvent struct {
GameID string
MembershipUserID string
Reason string
}
// LobbyInviteCreatedEvent is the independent Go representation of
// `notification.LobbyInviteCreatedEvent`.
type LobbyInviteCreatedEvent struct {
@@ -56,6 +66,20 @@ type LobbyInviteRedeemedEvent struct {
InviteeUserID string
}
// LobbyRaceNameRegistrationEligibleEvent is the independent Go
// representation of `notification.LobbyRaceNameRegistrationEligibleEvent`.
type LobbyRaceNameRegistrationEligibleEvent struct {
GameID string
RaceName string
EligibleUntilMs int64
}
// LobbyRaceNameRegisteredEvent is the independent Go representation of
// `notification.LobbyRaceNameRegisteredEvent`.
type LobbyRaceNameRegisteredEvent struct {
RaceName string
}
// GameTurnReadyEventToPayload converts GameTurnReadyEvent to FlatBuffers bytes
// suitable for the authenticated gateway push transport.
func GameTurnReadyEventToPayload(event *GameTurnReadyEvent) ([]byte, error) {
@@ -272,6 +296,68 @@ func PayloadToLobbyMembershipRejectedEvent(data []byte) (result *LobbyMembership
return &LobbyMembershipRejectedEvent{GameID: gameID}, nil
}
// LobbyMembershipBlockedEventToPayload converts LobbyMembershipBlockedEvent
// to FlatBuffers bytes suitable for the authenticated gateway push
// transport.
func LobbyMembershipBlockedEventToPayload(event *LobbyMembershipBlockedEvent) ([]byte, error) {
if event == nil {
return nil, errors.New("encode lobby membership blocked payload: event is nil")
}
if event.GameID == "" {
return nil, errors.New("encode lobby membership blocked payload: game_id is empty")
}
if event.MembershipUserID == "" {
return nil, errors.New("encode lobby membership blocked payload: membership_user_id is empty")
}
if event.Reason == "" {
return nil, errors.New("encode lobby membership blocked payload: reason is empty")
}
builder := flatbuffers.NewBuilder(96)
gameID := builder.CreateString(event.GameID)
membershipUserID := builder.CreateString(event.MembershipUserID)
reason := builder.CreateString(event.Reason)
notificationfbs.LobbyMembershipBlockedEventStart(builder)
notificationfbs.LobbyMembershipBlockedEventAddGameId(builder, gameID)
notificationfbs.LobbyMembershipBlockedEventAddMembershipUserId(builder, membershipUserID)
notificationfbs.LobbyMembershipBlockedEventAddReason(builder, reason)
offset := notificationfbs.LobbyMembershipBlockedEventEnd(builder)
notificationfbs.FinishLobbyMembershipBlockedEventBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToLobbyMembershipBlockedEvent converts FlatBuffers payload bytes
// into LobbyMembershipBlockedEvent.
func PayloadToLobbyMembershipBlockedEvent(data []byte) (result *LobbyMembershipBlockedEvent, err error) {
if len(data) == 0 {
return nil, errors.New("decode lobby membership blocked payload: data is empty")
}
defer recoverNotificationDecodePanic("decode lobby membership blocked payload", &result, &err)
event := notificationfbs.GetRootAsLobbyMembershipBlockedEvent(data, 0)
gameID, err := requiredNotificationString(event.GameId(), "game_id")
if err != nil {
return nil, fmt.Errorf("decode lobby membership blocked payload: %w", err)
}
membershipUserID, err := requiredNotificationString(event.MembershipUserId(), "membership_user_id")
if err != nil {
return nil, fmt.Errorf("decode lobby membership blocked payload: %w", err)
}
reason, err := requiredNotificationString(event.Reason(), "reason")
if err != nil {
return nil, fmt.Errorf("decode lobby membership blocked payload: %w", err)
}
return &LobbyMembershipBlockedEvent{
GameID: gameID,
MembershipUserID: membershipUserID,
Reason: reason,
}, nil
}
// LobbyInviteCreatedEventToPayload converts LobbyInviteCreatedEvent to
// FlatBuffers bytes suitable for the authenticated gateway push transport.
func LobbyInviteCreatedEventToPayload(event *LobbyInviteCreatedEvent) ([]byte, error) {
@@ -374,6 +460,99 @@ func PayloadToLobbyInviteRedeemedEvent(data []byte) (result *LobbyInviteRedeemed
}, nil
}
// LobbyRaceNameRegistrationEligibleEventToPayload converts
// LobbyRaceNameRegistrationEligibleEvent to FlatBuffers bytes suitable for
// the authenticated gateway push transport.
func LobbyRaceNameRegistrationEligibleEventToPayload(event *LobbyRaceNameRegistrationEligibleEvent) ([]byte, error) {
if event == nil {
return nil, errors.New("encode lobby race name registration eligible payload: event is nil")
}
if event.GameID == "" {
return nil, errors.New("encode lobby race name registration eligible payload: game_id is empty")
}
if event.RaceName == "" {
return nil, errors.New("encode lobby race name registration eligible payload: race_name is empty")
}
builder := flatbuffers.NewBuilder(96)
gameID := builder.CreateString(event.GameID)
raceName := builder.CreateString(event.RaceName)
notificationfbs.LobbyRaceNameRegistrationEligibleEventStart(builder)
notificationfbs.LobbyRaceNameRegistrationEligibleEventAddGameId(builder, gameID)
notificationfbs.LobbyRaceNameRegistrationEligibleEventAddRaceName(builder, raceName)
notificationfbs.LobbyRaceNameRegistrationEligibleEventAddEligibleUntilMs(builder, event.EligibleUntilMs)
offset := notificationfbs.LobbyRaceNameRegistrationEligibleEventEnd(builder)
notificationfbs.FinishLobbyRaceNameRegistrationEligibleEventBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToLobbyRaceNameRegistrationEligibleEvent converts FlatBuffers
// payload bytes into LobbyRaceNameRegistrationEligibleEvent.
func PayloadToLobbyRaceNameRegistrationEligibleEvent(data []byte) (result *LobbyRaceNameRegistrationEligibleEvent, err error) {
if len(data) == 0 {
return nil, errors.New("decode lobby race name registration eligible payload: data is empty")
}
defer recoverNotificationDecodePanic("decode lobby race name registration eligible payload", &result, &err)
event := notificationfbs.GetRootAsLobbyRaceNameRegistrationEligibleEvent(data, 0)
gameID, err := requiredNotificationString(event.GameId(), "game_id")
if err != nil {
return nil, fmt.Errorf("decode lobby race name registration eligible payload: %w", err)
}
raceName, err := requiredNotificationString(event.RaceName(), "race_name")
if err != nil {
return nil, fmt.Errorf("decode lobby race name registration eligible payload: %w", err)
}
return &LobbyRaceNameRegistrationEligibleEvent{
GameID: gameID,
RaceName: raceName,
EligibleUntilMs: event.EligibleUntilMs(),
}, nil
}
// LobbyRaceNameRegisteredEventToPayload converts LobbyRaceNameRegisteredEvent
// to FlatBuffers bytes suitable for the authenticated gateway push transport.
func LobbyRaceNameRegisteredEventToPayload(event *LobbyRaceNameRegisteredEvent) ([]byte, error) {
if event == nil {
return nil, errors.New("encode lobby race name registered payload: event is nil")
}
if event.RaceName == "" {
return nil, errors.New("encode lobby race name registered payload: race_name is empty")
}
builder := flatbuffers.NewBuilder(48)
raceName := builder.CreateString(event.RaceName)
notificationfbs.LobbyRaceNameRegisteredEventStart(builder)
notificationfbs.LobbyRaceNameRegisteredEventAddRaceName(builder, raceName)
offset := notificationfbs.LobbyRaceNameRegisteredEventEnd(builder)
notificationfbs.FinishLobbyRaceNameRegisteredEventBuffer(builder, offset)
return builder.FinishedBytes(), nil
}
// PayloadToLobbyRaceNameRegisteredEvent converts FlatBuffers payload bytes
// into LobbyRaceNameRegisteredEvent.
func PayloadToLobbyRaceNameRegisteredEvent(data []byte) (result *LobbyRaceNameRegisteredEvent, err error) {
if len(data) == 0 {
return nil, errors.New("decode lobby race name registered payload: data is empty")
}
defer recoverNotificationDecodePanic("decode lobby race name registered payload", &result, &err)
event := notificationfbs.GetRootAsLobbyRaceNameRegisteredEvent(data, 0)
raceName, err := requiredNotificationString(event.RaceName(), "race_name")
if err != nil {
return nil, fmt.Errorf("decode lobby race name registered payload: %w", err)
}
return &LobbyRaceNameRegisteredEvent{RaceName: raceName}, nil
}
func requiredNotificationString(value []byte, field string) (string, error) {
if len(value) == 0 {
return "", fmt.Errorf("%s is missing", field)
+34
View File
@@ -71,6 +71,26 @@ func TestNotificationPayloadRoundTrips(t *testing.T) {
},
decode: func(data []byte) (any, error) { return PayloadToLobbyInviteRedeemedEvent(data) },
},
{
name: "lobby race name registration eligible",
source: &LobbyRaceNameRegistrationEligibleEvent{
GameID: "game-8",
RaceName: "Skylancer",
EligibleUntilMs: 1775208100000,
},
encode: func(value any) ([]byte, error) {
return LobbyRaceNameRegistrationEligibleEventToPayload(value.(*LobbyRaceNameRegistrationEligibleEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNameRegistrationEligibleEvent(data) },
},
{
name: "lobby race name registered",
source: &LobbyRaceNameRegisteredEvent{RaceName: "Skylancer"},
encode: func(value any) ([]byte, error) {
return LobbyRaceNameRegisteredEventToPayload(value.(*LobbyRaceNameRegisteredEvent))
},
decode: func(data []byte) (any, error) { return PayloadToLobbyRaceNameRegisteredEvent(data) },
},
}
for _, tt := range tests {
@@ -151,6 +171,20 @@ func TestNotificationPayloadEncodersRejectNilInputs(t *testing.T) {
return err
},
},
{
name: "lobby race name registration eligible",
call: func() error {
_, err := LobbyRaceNameRegistrationEligibleEventToPayload(nil)
return err
},
},
{
name: "lobby race name registered",
call: func() error {
_, err := LobbyRaceNameRegisteredEventToPayload(nil)
return err
},
},
}
for _, tt := range tests {
+14 -6
View File
@@ -47,10 +47,10 @@ func UpdateMyProfileRequestToPayload(request *usermodel.UpdateMyProfileRequest)
}
builder := flatbuffers.NewBuilder(128)
raceName := builder.CreateString(request.RaceName)
displayName := builder.CreateString(request.DisplayName)
userfbs.UpdateMyProfileRequestStart(builder)
userfbs.UpdateMyProfileRequestAddRaceName(builder, raceName)
userfbs.UpdateMyProfileRequestAddDisplayName(builder, displayName)
offset := userfbs.UpdateMyProfileRequestEnd(builder)
userfbs.FinishUpdateMyProfileRequestBuffer(builder, offset)
@@ -68,7 +68,7 @@ func PayloadToUpdateMyProfileRequest(data []byte) (result *usermodel.UpdateMyPro
request := userfbs.GetRootAsUpdateMyProfileRequest(data, 0)
return &usermodel.UpdateMyProfileRequest{
RaceName: string(request.RaceName()),
DisplayName: string(request.DisplayName()),
}, nil
}
@@ -236,7 +236,11 @@ func encodeAccount(builder *flatbuffers.Builder, account usermodel.Account) (fla
userID := builder.CreateString(account.UserID)
email := builder.CreateString(account.Email)
raceName := builder.CreateString(account.RaceName)
userName := builder.CreateString(account.UserName)
var displayName flatbuffers.UOffsetT
if account.DisplayName != "" {
displayName = builder.CreateString(account.DisplayName)
}
preferredLanguage := builder.CreateString(account.PreferredLanguage)
timeZone := builder.CreateString(account.TimeZone)
@@ -248,7 +252,10 @@ func encodeAccount(builder *flatbuffers.Builder, account usermodel.Account) (fla
userfbs.AccountViewStart(builder)
userfbs.AccountViewAddUserId(builder, userID)
userfbs.AccountViewAddEmail(builder, email)
userfbs.AccountViewAddRaceName(builder, raceName)
userfbs.AccountViewAddUserName(builder, userName)
if displayName != 0 {
userfbs.AccountViewAddDisplayName(builder, displayName)
}
userfbs.AccountViewAddPreferredLanguage(builder, preferredLanguage)
userfbs.AccountViewAddTimeZone(builder, timeZone)
if declaredCountry != 0 {
@@ -284,7 +291,8 @@ func decodeAccount(account *userfbs.AccountView) (usermodel.Account, error) {
result := usermodel.Account{
UserID: string(account.UserId()),
Email: string(account.Email()),
RaceName: string(account.RaceName()),
UserName: string(account.UserName()),
DisplayName: string(account.DisplayName()),
PreferredLanguage: string(account.PreferredLanguage()),
TimeZone: string(account.TimeZone()),
DeclaredCountry: string(account.DeclaredCountry()),
+7 -6
View File
@@ -29,7 +29,7 @@ func TestUserRequestPayloadRoundTrips(t *testing.T) {
t.Fatalf("get my account request mismatch: %#v", getDecoded)
}
profileSource := &usermodel.UpdateMyProfileRequest{RaceName: "Nova Prime"}
profileSource := &usermodel.UpdateMyProfileRequest{DisplayName: "NovaPrime"}
profilePayload, err := UpdateMyProfileRequestToPayload(profileSource)
if err != nil {
t.Fatalf("encode update my profile request: %v", err)
@@ -72,7 +72,8 @@ func TestAccountResponsePayloadRoundTrip(t *testing.T) {
Account: usermodel.Account{
UserID: "user-123",
Email: "pilot@example.com",
RaceName: "Pilot Nova",
UserName: "player-abcdefgh",
DisplayName: "PilotNova",
PreferredLanguage: "en",
TimeZone: "Europe/Kaliningrad",
DeclaredCountry: "DE",
@@ -342,14 +343,14 @@ func TestPayloadToAccountResponseRejectsMissingEntitlement(t *testing.T) {
payload := buildAccountResponsePayload(func(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
userID := builder.CreateString("user-123")
email := builder.CreateString("pilot@example.com")
raceName := builder.CreateString("Pilot Nova")
userName := builder.CreateString("player-abcdefgh")
preferredLanguage := builder.CreateString("en")
timeZone := builder.CreateString("Europe/Kaliningrad")
userfbs.AccountViewStart(builder)
userfbs.AccountViewAddUserId(builder, userID)
userfbs.AccountViewAddEmail(builder, email)
userfbs.AccountViewAddRaceName(builder, raceName)
userfbs.AccountViewAddUserName(builder, userName)
userfbs.AccountViewAddPreferredLanguage(builder, preferredLanguage)
userfbs.AccountViewAddTimeZone(builder, timeZone)
userfbs.AccountViewAddCreatedAtMs(builder, 1)
@@ -411,14 +412,14 @@ func TestPayloadToAccountResponseRejectsOverflowLimitValue(t *testing.T) {
userID := builder.CreateString("user-123")
email := builder.CreateString("pilot@example.com")
raceName := builder.CreateString("Pilot Nova")
userName := builder.CreateString("player-abcdefgh")
preferredLanguage := builder.CreateString("en")
timeZone := builder.CreateString("Europe/Kaliningrad")
userfbs.AccountViewStart(builder)
userfbs.AccountViewAddUserId(builder, userID)
userfbs.AccountViewAddEmail(builder, email)
userfbs.AccountViewAddRaceName(builder, raceName)
userfbs.AccountViewAddUserName(builder, userName)
userfbs.AccountViewAddPreferredLanguage(builder, preferredLanguage)
userfbs.AccountViewAddTimeZone(builder, timeZone)
userfbs.AccountViewAddEntitlement(builder, entitlementOffset)