aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPinapelz <yukais@pinapelz.com>2025-12-07 17:18:45 -0800
committerPinapelz <yukais@pinapelz.com>2025-12-07 17:18:45 -0800
commit4195eb5f8fad4fe7923b8c77757061a414029564 (patch)
tree4da04beb75c53d248658698502d423cb77503a79
parentb646335055f74a78056fa888f58c6435399ad24d (diff)
add api route to allow score export
-rw-r--r--backend/src/index.ts1
-rw-r--r--backend/src/routes/score.ts27
2 files changed, 28 insertions, 0 deletions
diff --git a/backend/src/index.ts b/backend/src/index.ts
index e9de8b4..558661e 100644
--- a/backend/src/index.ts
+++ b/backend/src/index.ts
@@ -64,6 +64,7 @@ app.get('/api/scores', requireAuth, scoreRoutes.handleGetScores);
app.delete('/api/scores', requireAuth, scoreRoutes.handleScoreDeletion);
app.get('/api/scores/:chartId', requireAuth, scoreRoutes.handleGetScoresByChartId);
app.get('/api/allScores', requireAuth, scoreRoutes.handleGetAllGameScores);
+app.get('/api/exportScores', requireAuth, scoreRoutes.handleExportScoreForGame);
app.post('/api/admin/createGame', requireAuth, adminRoutes.handleCreateGame);
app.delete('/api/admin/user/:userId', requireAuth, adminRoutes.handleDeleteUser);
diff --git a/backend/src/routes/score.ts b/backend/src/routes/score.ts
index 168629a..a10833d 100644
--- a/backend/src/routes/score.ts
+++ b/backend/src/routes/score.ts
@@ -141,6 +141,33 @@ export const handleScoreUpload = async (
}
};
+export const handleExportScoreForGame = async (
+ req: express.Request,
+ res: express.Response,
+) => {
+ const { internalGameName, page } = req.query;
+ const userId = req.session.userId;
+ if (!userId || !internalGameName) {
+ return res.status(400).json({ error: "Missing required parameters" });
+ }
+ const offset = (Math.max(parseInt(page as string) || 1, 1) - 1) * 50;
+ const scores: any = await prisma.$queryRaw`
+ SELECT * FROM "Score"
+ WHERE "userId" = ${userId}
+ AND "gameInternalName" = ${internalGameName}
+ ORDER BY (data->>'timestamp')::numeric desc
+ OFFSET ${offset} LIMIT 50
+ `;
+ const safeScores = scores.map((score: any) => ({
+ ...score,
+ timestamp: typeof score.timestamp === "bigint" ? Number(score.timestamp) : score.timestamp,
+ }));
+
+ res.status(200).json({
+ scores: safeScores,
+ });
+};
+
export const handleScoreDeletion = async (
req: express.Request,
res: express.Response,
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage