Skip to content

Commit c8cf1ea

Browse files
committed
refactor: optimise fetching last result timestamp when adding a result
1 parent 984cb3c commit c8cf1ea

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

backend/src/api/controllers/result.ts

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,9 @@ export async function addResult(
329329
// );
330330
// return res.status(400).json({ message: "Time traveler detected" });
331331

332-
const { data: lastResult } = await tryCatch(ResultDAL.getLastResult(uid));
332+
const { data: lastResultTimestamp } = await tryCatch(
333+
ResultDAL.getLastResultTimestamp(uid)
334+
);
333335

334336
//convert result test duration to miliseconds
335337
completedEvent.timestamp = Math.floor(Date.now() / 1000) * 1000;
@@ -338,16 +340,16 @@ export async function addResult(
338340
const testDurationMilis = completedEvent.testDuration * 1000;
339341
const incompleteTestsMilis = completedEvent.incompleteTestSeconds * 1000;
340342
const earliestPossible =
341-
(lastResult?.timestamp ?? 0) + testDurationMilis + incompleteTestsMilis;
343+
(lastResultTimestamp ?? 0) + testDurationMilis + incompleteTestsMilis;
342344
const nowNoMilis = Math.floor(Date.now() / 1000) * 1000;
343345
if (
344-
isSafeNumber(lastResult?.timestamp) &&
346+
isSafeNumber(lastResultTimestamp) &&
345347
nowNoMilis < earliestPossible - 1000
346348
) {
347349
void addLog(
348350
"invalid_result_spacing",
349351
{
350-
lastTimestamp: lastResult.timestamp,
352+
lastTimestamp: lastResultTimestamp,
351353
earliestPossible,
352354
now: nowNoMilis,
353355
testDuration: testDurationMilis,
@@ -590,7 +592,7 @@ export async function addResult(
590592
const xpGained = await calculateXp(
591593
completedEvent,
592594
req.ctx.configuration.users.xp,
593-
uid,
595+
lastResultTimestamp,
594596
user.xp ?? 0,
595597
streak
596598
);
@@ -689,7 +691,7 @@ type XpResult = {
689691
async function calculateXp(
690692
result: CompletedEvent,
691693
xpConfiguration: Configuration["users"]["xp"],
692-
uid: string,
694+
lastResultTimestamp: number | null,
693695
currentTotalXp: number,
694696
streak: number
695697
): Promise<XpResult> {
@@ -802,16 +804,8 @@ async function calculateXp(
802804
const accuracyModifier = (acc - 50) / 50;
803805

804806
let dailyBonus = 0;
805-
const { data: lastResult, error: getLastResultError } = await tryCatch(
806-
ResultDAL.getLastResult(uid)
807-
);
808-
809-
if (getLastResultError) {
810-
Logger.error(`Could not fetch last result: ${getLastResultError}`);
811-
}
812-
813-
if (isSafeNumber(lastResult?.timestamp)) {
814-
const lastResultDay = getStartOfDayTimestamp(lastResult.timestamp);
807+
if (isSafeNumber(lastResultTimestamp)) {
808+
const lastResultDay = getStartOfDayTimestamp(lastResultTimestamp);
815809
const today = getCurrentDayTimestamp();
816810
if (lastResultDay !== today) {
817811
const proportionalXp = Math.round(currentTotalXp * 0.05);

backend/src/dal/result.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,20 @@ export async function getLastResult(uid: string): Promise<DBResult> {
7575
.sort({ timestamp: -1 })
7676
.limit(1)
7777
.toArray();
78-
if (!lastResult) throw new MonkeyError(404, "No results found");
78+
if (!lastResult) throw new MonkeyError(404, "No last result found");
7979
return convert(lastResult);
8080
}
8181

82+
export async function getLastResultTimestamp(uid: string): Promise<number> {
83+
const [lastResult] = await getResultCollection()
84+
.find({ uid }, { projection: { timestamp: 1, _id: 0 } })
85+
.sort({ timestamp: -1 })
86+
.limit(1)
87+
.toArray();
88+
if (!lastResult) throw new MonkeyError(404, "No last result found");
89+
return lastResult.timestamp;
90+
}
91+
8292
export async function getResultByTimestamp(
8393
uid: string,
8494
timestamp: number

0 commit comments

Comments
 (0)