From 4195eb5f8fad4fe7923b8c77757061a414029564 Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Sun, 7 Dec 2025 17:18:45 -0800 Subject: add api route to allow score export --- backend/src/index.ts | 1 + backend/src/routes/score.ts | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) 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, -- cgit v1.2.3