diff --git a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts index 430f00294..61f44fb88 100644 --- a/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts +++ b/apps/api/src/guild/leaderboards/guild-leaderboard.service.ts @@ -55,23 +55,30 @@ export class GuildLeaderboardService extends LeaderboardService { return acc; }, {} as Record); + selector.id = true; selector.nameFormatted = true; - return await Promise.all( - ids.map(async (id) => { - const guild = await this.guildModel - .findOne() - .where("id") - .equals(id) - .select(selector) - .lean() - .exec(); - - const additionalStats = flatten(guild) as LeaderboardAdditionalStats; - additionalStats.name = additionalStats.nameFormatted; - - return additionalStats; - }) - ); + const uniqueIds = [...new Set(ids)]; + + const guilds = await this.guildModel + .find({ id: { $in: uniqueIds } }) + .select(selector) + .lean() + .exec(); + + const guildsById = new Map(guilds.map((guild) => [guild.id, guild])); + + return ids.map((id) => { + const guild = guildsById.get(id); + + if (!guild) { + return { name: "Unknown" } as LeaderboardAdditionalStats; + } + + const additionalStats = flatten(guild) as LeaderboardAdditionalStats; + additionalStats.name = additionalStats.nameFormatted; + + return additionalStats; + }); } } diff --git a/apps/api/src/leaderboards/leaderboard.service.ts b/apps/api/src/leaderboards/leaderboard.service.ts index fd054864b..c512b79d7 100644 --- a/apps/api/src/leaderboards/leaderboard.service.ts +++ b/apps/api/src/leaderboards/leaderboard.service.ts @@ -135,13 +135,15 @@ export abstract class LeaderboardService { LeaderboardScanner.getLeaderboardField(constructor, extraDisplay, false) : undefined; - const additionalStats = await this.getAdditionalStats( - leaderboard.map(({ id }) => id), - [ - ...additionalFields.filter((k) => k !== field), - ...(extraDisplay ? [extraDisplay] : []), - ] - ); + const additionalStats = leaderboard.length ? + await this.getAdditionalStats( + leaderboard.map(({ id }) => id), + [ + ...additionalFields.filter((k) => k !== field), + ...(extraDisplay ? [extraDisplay] : []), + ] + ) : + []; const data = leaderboard.map((doc, index) => { const stats = additionalStats[index]; diff --git a/apps/api/src/player/leaderboards/player-leaderboard.service.ts b/apps/api/src/player/leaderboards/player-leaderboard.service.ts index 5877de527..330885040 100644 --- a/apps/api/src/player/leaderboards/player-leaderboard.service.ts +++ b/apps/api/src/player/leaderboards/player-leaderboard.service.ts @@ -55,22 +55,29 @@ export class PlayerLeaderboardService extends LeaderboardService { }, {} as Record); selector.displayName = true; + selector.uuid = true; - return await Promise.all( - ids.map(async (id) => { - const player = await this.playerModel - .findOne() - .where("uuid") - .equals(id) - .select(selector) - .lean() - .exec(); - - const additionalStats = flatten(player) as LeaderboardAdditionalStats; - additionalStats.name = additionalStats.displayName; - - return additionalStats; - }) - ); + const uniqueIds = [...new Set(ids)]; + + const players = await this.playerModel + .find({ uuid: { $in: uniqueIds } }) + .select(selector) + .lean() + .exec(); + + const playersById = new Map(players.map((player) => [player.uuid, player])); + + return ids.map((id) => { + const player = playersById.get(id); + + if (!player) { + return { name: "Unknown" } as LeaderboardAdditionalStats; + } + + const additionalStats = flatten(player) as LeaderboardAdditionalStats; + additionalStats.name = additionalStats.displayName; + + return additionalStats; + }); } }