diff options
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/src/config/constants.ts | 2 | ||||
| -rw-r--r-- | backend/src/routes/score.ts | 46 |
2 files changed, 33 insertions, 15 deletions
diff --git a/backend/src/config/constants.ts b/backend/src/config/constants.ts index 45d559e..5ade0a7 100644 --- a/backend/src/config/constants.ts +++ b/backend/src/config/constants.ts @@ -1 +1 @@ -export const PAGE_SIZE = 25; +export const PAGE_SIZE = 30; diff --git a/backend/src/routes/score.ts b/backend/src/routes/score.ts index 4bbedb4..6e4dc19 100644 --- a/backend/src/routes/score.ts +++ b/backend/src/routes/score.ts @@ -78,32 +78,50 @@ export const handleScoreUpload = async (req: express.Request, res: express.Respo export const handleGetScores = async (req: express.Request, res: express.Response) => { try { - const { userId, internalGameName, pageNum } = req.query; + const { userId, internalGameName, pageNum, sortKey, direction } = req.query; if (!userId || !internalGameName || !pageNum) { return res.status(400).json({ error: 'Missing required parameters' }); } + const pageNumber = parseInt(pageNum as string); const gameInternalName = internalGameName as string; const userIdNumber = parseInt(userId as string); + const sortKeyString = (sortKey as string) || 'timestamp'; + const directionString = ((direction as string)?.toLowerCase() === 'asc') ? 'asc' : 'desc'; const num_pages = Math.ceil(await prisma.score.count({ where: { - gameInternalName: gameInternalName, + gameInternalName, userId: userIdNumber } }) / PAGE_SIZE); - const scores = await prisma.score.findMany({ - where: { - gameInternalName: gameInternalName, - userId: userIdNumber - }, - orderBy: { - timestamp: 'desc' - }, - skip: (pageNumber - 1) * PAGE_SIZE, - take: PAGE_SIZE - }); + let scores; + + if (sortKeyString === 'timestamp') { + scores = await prisma.score.findMany({ + where: { + gameInternalName, + userId: userIdNumber + }, + orderBy: { + timestamp: directionString + }, + skip: (pageNumber - 1) * PAGE_SIZE, + take: PAGE_SIZE + }); + } else if (sortKeyString === 'score') { + // raw SQL for JSON field ordering + scores = await prisma.$queryRawUnsafe<any[]>(` + SELECT * FROM "Score" + WHERE "gameInternalName" = $1 AND "userId" = $2 + ORDER BY (data->>'score')::numeric ${directionString.toUpperCase()} + OFFSET $3 + LIMIT $4 + `, gameInternalName, userIdNumber, (pageNumber - 1) * PAGE_SIZE, PAGE_SIZE); + } else { + return res.status(400).json({ error: 'Invalid sort key' }); + } const safeScores = scores.map(score => ({ ...score, @@ -118,6 +136,6 @@ export const handleGetScores = async (req: express.Request, res: express.Respons }); } catch (error) { console.error('Failed to fetch scores:', error); - res.status(500).json({ error: 'Internal server error. Unable to process score upload' }); + res.status(500).json({ error: 'Internal server error. Unable to fetch scores' }); } }; |
