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
+35 -1
View File
@@ -28,9 +28,13 @@ var expectedNotificationTypeCatalog = []string{
"lobby.application.submitted",
"lobby.membership.approved",
"lobby.membership.rejected",
"lobby.membership.blocked",
"lobby.invite.created",
"lobby.invite.redeemed",
"lobby.invite.expired",
"lobby.race_name.registration_eligible",
"lobby.race_name.registered",
"lobby.race_name.registration_denied",
}
var expectedNotificationCatalog = map[string]notificationCatalogExpectation{
@@ -82,6 +86,12 @@ var expectedNotificationCatalog = map[string]notificationCatalogExpectation{
payloadSchema: "LobbyMembershipRejectedPayload",
requiredFields: []string{"game_id", "game_name"},
},
"lobby.membership.blocked": {
producer: "game_lobby",
audienceKind: "user",
payloadSchema: "LobbyMembershipBlockedPayload",
requiredFields: []string{"game_id", "game_name", "membership_user_id", "membership_user_name", "reason"},
},
"lobby.invite.created": {
producer: "game_lobby",
audienceKind: "user",
@@ -100,6 +110,24 @@ var expectedNotificationCatalog = map[string]notificationCatalogExpectation{
payloadSchema: "LobbyInviteExpiredPayload",
requiredFields: []string{"game_id", "game_name", "invitee_user_id", "invitee_name"},
},
"lobby.race_name.registration_eligible": {
producer: "game_lobby",
audienceKind: "user",
payloadSchema: "LobbyRaceNameRegistrationEligiblePayload",
requiredFields: []string{"game_id", "game_name", "race_name", "eligible_until_ms"},
},
"lobby.race_name.registered": {
producer: "game_lobby",
audienceKind: "user",
payloadSchema: "LobbyRaceNameRegisteredPayload",
requiredFields: []string{"race_name"},
},
"lobby.race_name.registration_denied": {
producer: "game_lobby",
audienceKind: "user",
payloadSchema: "LobbyRaceNameRegistrationDeniedPayload",
requiredFields: []string{"game_id", "game_name", "race_name", "reason"},
},
}
const expectedNotificationCatalogTable = `| ` + "`notification_type`" + ` | Producer | Audience | Channels | Required ` + "`payload_json`" + ` fields |
@@ -112,9 +140,13 @@ const expectedNotificationCatalogTable = `| ` + "`notification_type`" + ` | Prod
| ` + "`lobby.application.submitted`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | private owner (` + "`audience_kind=user`" + `) or public admins (` + "`audience_kind=admin_email`" + `) | private: ` + "`push+email`" + `, public: ` + "`email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`applicant_user_id`" + `, ` + "`applicant_name`" + ` |
| ` + "`lobby.membership.approved`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | applicant user (` + "`audience_kind=user`" + `) | ` + "`push+email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + ` |
| ` + "`lobby.membership.rejected`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | applicant user (` + "`audience_kind=user`" + `) | ` + "`push+email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + ` |
| ` + "`lobby.membership.blocked`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | private-game owner (` + "`audience_kind=user`" + `) | ` + "`push+email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`membership_user_id`" + `, ` + "`membership_user_name`" + `, ` + "`reason`" + ` |
| ` + "`lobby.invite.created`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | invited user (` + "`audience_kind=user`" + `) | ` + "`push+email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`inviter_user_id`" + `, ` + "`inviter_name`" + ` |
| ` + "`lobby.invite.redeemed`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | private-game owner (` + "`audience_kind=user`" + `) | ` + "`push+email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`invitee_user_id`" + `, ` + "`invitee_name`" + ` |
| ` + "`lobby.invite.expired`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | private-game owner (` + "`audience_kind=user`" + `) | ` + "`email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`invitee_user_id`" + `, ` + "`invitee_name`" + ` |`
| ` + "`lobby.invite.expired`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | private-game owner (` + "`audience_kind=user`" + `) | ` + "`email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`invitee_user_id`" + `, ` + "`invitee_name`" + ` |
| ` + "`lobby.race_name.registration_eligible`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | capable member (` + "`audience_kind=user`" + `) | ` + "`push+email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`race_name`" + `, ` + "`eligible_until_ms`" + ` |
| ` + "`lobby.race_name.registered`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | registering user (` + "`audience_kind=user`" + `) | ` + "`push+email`" + ` | ` + "`race_name`" + ` |
| ` + "`lobby.race_name.registration_denied`" + ` | ` + "`Game Lobby`" + ` (` + "`game_lobby`" + `) | incapable member (` + "`audience_kind=user`" + `) | ` + "`email`" + ` | ` + "`game_id`" + `, ` + "`game_name`" + `, ` + "`race_name`" + `, ` + "`reason`" + ` |`
var expectedSharedDocumentationSnippets = []string{
"`lobby.application.submitted` keeps one stable `notification_type` and one stable `payload_json` shape",
@@ -581,6 +613,8 @@ func TestGatewayREADMEFreezesExactPushVocabulary(t *testing.T) {
"- `lobby.membership.rejected`",
"- `lobby.invite.created`",
"- `lobby.invite.redeemed`",
"- `lobby.race_name.registration_eligible`",
"- `lobby.race_name.registered`",
}, "\n"),
)
require.Contains(