From ed780efb1ea9db3a64fc1020e64610e26305e167 Mon Sep 17 00:00:00 2001 From: Andrea Toska Date: Fri, 31 Jan 2025 09:29:12 +0100 Subject: [PATCH 1/3] feat(servers): use the server a tier below if it does not exist If a server does not exist in a tier, use the tier below it. For example, if a user is in the test access level, but a server for that game only exists on prod, use that server. Same for the dev access level, but it goes dev --> test --> prod --- src/database.ts | 54 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/src/database.ts b/src/database.ts index b6d443e1..e250717d 100644 --- a/src/database.ts +++ b/src/database.ts @@ -22,6 +22,12 @@ const discordConnectionSchema = joi.object({ id: joi.string() }); +const accessModeOrder: Record = { + prod: ['prod'], + test: ['test', 'prod'], + dev: ['dev', 'test', 'prod'] +}; + let _connection: mongoose.Connection; export async function connect(): Promise { @@ -206,24 +212,48 @@ export async function getPNIDProfileJSONByPID(pid: number): Promise { - return await Server.findOne({ - game_server_id: gameServerID, - access_mode: accessMode - }); + const searchModes = accessModeOrder[accessMode] || ['prod']; + + for (const mode of searchModes) { + const server = await Server.findOne({ + game_server_id: gameServerID, + access_mode: mode + }); + + if (server) return server; + } + + return null; } export async function getServerByTitleID(titleID: string, accessMode: string): Promise { - return await Server.findOne({ - title_ids: titleID, - access_mode: accessMode - }); + const searchModes = accessModeOrder[accessMode] || ['prod']; + + for (const mode of searchModes) { + const server = await Server.findOne({ + title_ids: titleID, + access_mode: mode + }); + + if (server) return server; + } + + return null; } export async function getServerByClientID(clientID: string, accessMode: string): Promise { - return await Server.findOne({ - client_id: clientID, - access_mode: accessMode - }); + const searchModes = accessModeOrder[accessMode] || ['prod']; + + for (const mode of searchModes) { + const server = await Server.findOne({ + client_id: clientID, + access_mode: mode + }); + + if (server) return server; + } + + return null; } From c769cf3d23f1a23c12e7ddbab81121a282992f3f Mon Sep 17 00:00:00 2001 From: Andrea Toska Date: Fri, 31 Jan 2025 17:03:03 +0100 Subject: [PATCH 2/3] fix(servers): use find query to lessen db load --- src/database.ts | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/database.ts b/src/database.ts index e250717d..2511b787 100644 --- a/src/database.ts +++ b/src/database.ts @@ -212,14 +212,15 @@ export async function getPNIDProfileJSONByPID(pid: number): Promise { - const searchModes = accessModeOrder[accessMode] || ['prod']; + const searchModes = accessModeOrder[accessMode] ?? accessModeOrder.prod; // Default to prod if invalid mode - for (const mode of searchModes) { - const server = await Server.findOne({ - game_server_id: gameServerID, - access_mode: mode - }); + const servers = await Server.find({ + game_server_id: gameServerID, + access_mode: { $in: searchModes } + }) + for (const mode of searchModes) { + const server = servers.find(s => s.access_mode === mode); if (server) return server; } @@ -227,14 +228,15 @@ export async function getServerByGameServerID(gameServerID: string, accessMode: } export async function getServerByTitleID(titleID: string, accessMode: string): Promise { - const searchModes = accessModeOrder[accessMode] || ['prod']; + const searchModes = accessModeOrder[accessMode] ?? accessModeOrder.prod; - for (const mode of searchModes) { - const server = await Server.findOne({ - title_ids: titleID, - access_mode: mode - }); + const servers = await Server.find({ + title_ids: titleID, + access_mode: { $in: searchModes } + }) + for (const mode of searchModes) { + const server = servers.find(s => s.access_mode === mode); if (server) return server; } @@ -242,21 +244,21 @@ export async function getServerByTitleID(titleID: string, accessMode: string): P } export async function getServerByClientID(clientID: string, accessMode: string): Promise { - const searchModes = accessModeOrder[accessMode] || ['prod']; + const searchModes = accessModeOrder[accessMode] ?? accessModeOrder.prod; - for (const mode of searchModes) { - const server = await Server.findOne({ - client_id: clientID, - access_mode: mode - }); + const servers = await Server.find({ + client_id: clientID, + access_mode: { $in: searchModes } + }) + for (const mode of searchModes) { + const server = servers.find(s => s.access_mode === mode); if (server) return server; } return null; } - export async function addPNIDConnection(pnid: HydratedPNIDDocument, data: ConnectionData, type: string): Promise { if (type === 'discord') { return await addPNIDConnectionDiscord(pnid, data); From 8604d1999367fe82e5f651b2d098ca243b9e405e Mon Sep 17 00:00:00 2001 From: Andrea Toska Date: Fri, 31 Jan 2025 17:05:05 +0100 Subject: [PATCH 3/3] fix(servers): missed a few semicolons, oops --- src/database.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/database.ts b/src/database.ts index 2511b787..72c1f7ed 100644 --- a/src/database.ts +++ b/src/database.ts @@ -217,7 +217,7 @@ export async function getServerByGameServerID(gameServerID: string, accessMode: const servers = await Server.find({ game_server_id: gameServerID, access_mode: { $in: searchModes } - }) + }); for (const mode of searchModes) { const server = servers.find(s => s.access_mode === mode); @@ -233,7 +233,7 @@ export async function getServerByTitleID(titleID: string, accessMode: string): P const servers = await Server.find({ title_ids: titleID, access_mode: { $in: searchModes } - }) + }); for (const mode of searchModes) { const server = servers.find(s => s.access_mode === mode); @@ -249,7 +249,7 @@ export async function getServerByClientID(clientID: string, accessMode: string): const servers = await Server.find({ client_id: clientID, access_mode: { $in: searchModes } - }) + }); for (const mode of searchModes) { const server = servers.find(s => s.access_mode === mode);