From f74a673b2711b29dd495476e94ce2c229490fd7f Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 24 Mar 2025 14:24:31 +0100 Subject: [PATCH] ensure that leaderboard-accountId pair is unique --- src/models/leaderboardModel.ts | 1 + src/services/leaderboardService.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/models/leaderboardModel.ts b/src/models/leaderboardModel.ts index 6ff6d53a..7cd9d1e7 100644 --- a/src/models/leaderboardModel.ts +++ b/src/models/leaderboardModel.ts @@ -13,6 +13,7 @@ const leaderboardEntrySchema = new Schema( ); leaderboardEntrySchema.index({ leaderboard: 1 }); +leaderboardEntrySchema.index({ leaderboard: 1, accountId: 1 }, { unique: true }); leaderboardEntrySchema.index({ expiry: 1 }, { expireAfterSeconds: 0 }); // With this, MongoDB will automatically delete expired entries. export const Leaderboard = model("Leaderboard", leaderboardEntrySchema); diff --git a/src/services/leaderboardService.ts b/src/services/leaderboardService.ts index a8d933f7..72110b37 100644 --- a/src/services/leaderboardService.ts +++ b/src/services/leaderboardService.ts @@ -20,8 +20,8 @@ export const submitLeaderboardScore = async ( expiry = new Date(weekEnd); } await Leaderboard.findOneAndUpdate( - { leaderboard, displayName }, - { $max: { score }, $set: { accountId, expiry } }, + { leaderboard, accountId }, + { $max: { score }, $set: { displayName, expiry } }, { upsert: true } ); };