diff options
| author | Pinapelz <yukais@pinapelz.com> | 2025-12-07 17:18:45 -0800 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2025-12-07 17:18:45 -0800 |
| commit | 4195eb5f8fad4fe7923b8c77757061a414029564 (patch) | |
| tree | 4da04beb75c53d248658698502d423cb77503a79 | |
| parent | b646335055f74a78056fa888f58c6435399ad24d (diff) | |
add api route to allow score export
| -rw-r--r-- | backend/src/index.ts | 1 | ||||
| -rw-r--r-- | backend/src/routes/score.ts | 27 |
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, |
