feat: game lobby service
This commit is contained in:
@@ -154,6 +154,29 @@ func encodePayload(notificationType intentstream.NotificationType, payloadJSON s
|
||||
return wrapPayloadEncoding(transcoder.LobbyMembershipRejectedEventToPayload(&transcoder.LobbyMembershipRejectedEvent{
|
||||
GameID: payload.GameID,
|
||||
}))
|
||||
case intentstream.NotificationTypeLobbyMembershipBlocked:
|
||||
var payload struct {
|
||||
GameID string `json:"game_id"`
|
||||
MembershipUserID string `json:"membership_user_id"`
|
||||
Reason string `json:"reason"`
|
||||
}
|
||||
if err := decodePayload(payloadJSON, &payload); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if payload.GameID == "" {
|
||||
return nil, errors.New("payload_encoding_failed: game_id is empty")
|
||||
}
|
||||
if payload.MembershipUserID == "" {
|
||||
return nil, errors.New("payload_encoding_failed: membership_user_id is empty")
|
||||
}
|
||||
if payload.Reason == "" {
|
||||
return nil, errors.New("payload_encoding_failed: reason is empty")
|
||||
}
|
||||
return wrapPayloadEncoding(transcoder.LobbyMembershipBlockedEventToPayload(&transcoder.LobbyMembershipBlockedEvent{
|
||||
GameID: payload.GameID,
|
||||
MembershipUserID: payload.MembershipUserID,
|
||||
Reason: payload.Reason,
|
||||
}))
|
||||
case intentstream.NotificationTypeLobbyInviteCreated:
|
||||
var payload struct {
|
||||
GameID string `json:"game_id"`
|
||||
@@ -190,6 +213,42 @@ func encodePayload(notificationType intentstream.NotificationType, payloadJSON s
|
||||
GameID: payload.GameID,
|
||||
InviteeUserID: payload.InviteeUserID,
|
||||
}))
|
||||
case intentstream.NotificationTypeLobbyRaceNameRegistrationEligible:
|
||||
var payload struct {
|
||||
GameID string `json:"game_id"`
|
||||
RaceName string `json:"race_name"`
|
||||
EligibleUntilMs int64 `json:"eligible_until_ms"`
|
||||
}
|
||||
if err := decodePayload(payloadJSON, &payload); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if payload.GameID == "" {
|
||||
return nil, errors.New("payload_encoding_failed: game_id is empty")
|
||||
}
|
||||
if payload.RaceName == "" {
|
||||
return nil, errors.New("payload_encoding_failed: race_name is empty")
|
||||
}
|
||||
if payload.EligibleUntilMs < 1 {
|
||||
return nil, errors.New("payload_encoding_failed: eligible_until_ms must be at least 1")
|
||||
}
|
||||
return wrapPayloadEncoding(transcoder.LobbyRaceNameRegistrationEligibleEventToPayload(&transcoder.LobbyRaceNameRegistrationEligibleEvent{
|
||||
GameID: payload.GameID,
|
||||
RaceName: payload.RaceName,
|
||||
EligibleUntilMs: payload.EligibleUntilMs,
|
||||
}))
|
||||
case intentstream.NotificationTypeLobbyRaceNameRegistered:
|
||||
var payload struct {
|
||||
RaceName string `json:"race_name"`
|
||||
}
|
||||
if err := decodePayload(payloadJSON, &payload); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if payload.RaceName == "" {
|
||||
return nil, errors.New("payload_encoding_failed: race_name is empty")
|
||||
}
|
||||
return wrapPayloadEncoding(transcoder.LobbyRaceNameRegisteredEventToPayload(&transcoder.LobbyRaceNameRegisteredEvent{
|
||||
RaceName: payload.RaceName,
|
||||
}))
|
||||
default:
|
||||
return nil, fmt.Errorf("payload_encoding_failed: notification type %q does not support push", notificationType)
|
||||
}
|
||||
|
||||
@@ -103,6 +103,30 @@ func TestEncoderEncodesSupportedPushNotificationTypes(t *testing.T) {
|
||||
require.Equal(t, "user-10", event.InviteeUserID)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "lobby race name registration eligible",
|
||||
notificationType: intentstream.NotificationTypeLobbyRaceNameRegistrationEligible,
|
||||
payloadJSON: `{"eligible_until_ms":1775208100000,"game_id":"game-8","game_name":"Aurora","race_name":"Skylancer"}`,
|
||||
assertPayload: func(t *testing.T, payload []byte) {
|
||||
t.Helper()
|
||||
event, err := transcoder.PayloadToLobbyRaceNameRegistrationEligibleEvent(payload)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "game-8", event.GameID)
|
||||
require.Equal(t, "Skylancer", event.RaceName)
|
||||
require.Equal(t, int64(1775208100000), event.EligibleUntilMs)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "lobby race name registered",
|
||||
notificationType: intentstream.NotificationTypeLobbyRaceNameRegistered,
|
||||
payloadJSON: `{"race_name":"Skylancer"}`,
|
||||
assertPayload: func(t *testing.T, payload []byte) {
|
||||
t.Helper()
|
||||
event, err := transcoder.PayloadToLobbyRaceNameRegisteredEvent(payload)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "Skylancer", event.RaceName)
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
Reference in New Issue
Block a user