aboutsummaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
authorPinapelz <yukais@pinapelz.com>2025-07-06 01:15:02 -0700
committerPinapelz <yukais@pinapelz.com>2025-07-06 01:16:45 -0700
commit002a51dec332765de66e82d45729986b8d1dace7 (patch)
tree7217264f9ee37547ece18d9901075f48b4e9dc0b /backend
parent9416c97b24d46f780c57627551795e40619ecc26 (diff)
add parameters for fetching scores by sort key
Diffstat (limited to 'backend')
-rw-r--r--backend/src/config/constants.ts2
-rw-r--r--backend/src/routes/score.ts46
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' });
}
};
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage