From 407043c5be8521e29647256df296791501c956ee Mon Sep 17 00:00:00 2001 From: jd Date: Sat, 21 Feb 2026 17:51:17 +0000 Subject: [PATCH] Implemented PagedResponse --- src/endpoints/collections.ts | 4 ++-- src/endpoints/games.ts | 4 ++-- src/endpoints/players.ts | 4 ++-- src/routes/collections.ts | 2 +- src/routes/games.ts | 2 +- src/routes/players.ts | 2 +- src/utilities/responseHelper.ts | 14 ++++++++++++-- 7 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/endpoints/collections.ts b/src/endpoints/collections.ts index 75a2eed..1ce1ed7 100644 --- a/src/endpoints/collections.ts +++ b/src/endpoints/collections.ts @@ -1,6 +1,6 @@ import { orm } from '../orm/orm'; import { UnwrappedRequest } from '../utilities/guard'; -import { CreatedResponse, ErrorResponse, OkResponse } from '../utilities/responseHelper'; +import { CreatedResponse, ErrorResponse, OkResponse, PagedResponse } from '../utilities/responseHelper'; import { GameToCollectionRequest, CreateCollectionRequest, @@ -27,7 +27,7 @@ async function get(request: UnwrappedRequest): Promise { async function list(request: UnwrappedRequest): Promise { try { - return new OkResponse(await orm.collections.list(request.claims)); + return new PagedResponse(request, await orm.collections.list(request.claims)); } catch (error: any) { return new ErrorResponse(error as Error); } diff --git a/src/endpoints/games.ts b/src/endpoints/games.ts index a8bd145..9ec9c82 100644 --- a/src/endpoints/games.ts +++ b/src/endpoints/games.ts @@ -1,6 +1,6 @@ import { orm } from '../orm/orm'; import { UnwrappedRequest } from '../utilities/guard'; -import { CreatedResponse, ErrorResponse, OkResponse } from '../utilities/responseHelper'; +import { CreatedResponse, ErrorResponse, OkResponse, PagedResponse } from '../utilities/responseHelper'; import { CreateGameRequest, UpdateGameRequest, @@ -55,7 +55,7 @@ async function drop(request: UnwrappedRequest): Promise { async function query(request: UnwrappedRequest): Promise { try { - return new OkResponse(await orm.games.query(request.params.query)); + return new PagedResponse(request, await orm.games.query(request.params.query)); } catch (error: any) { return new ErrorResponse(error as Error); } diff --git a/src/endpoints/players.ts b/src/endpoints/players.ts index 5551291..c47435f 100644 --- a/src/endpoints/players.ts +++ b/src/endpoints/players.ts @@ -1,6 +1,6 @@ import { orm } from '../orm/orm'; import { UnwrappedRequest } from '../utilities/guard'; -import { CreatedResponse, ErrorResponse, OkResponse } from '../utilities/responseHelper'; +import { CreatedResponse, ErrorResponse, OkResponse, PagedResponse } from '../utilities/responseHelper'; import { CreatePlayerRequest, UpdatePlayerRequest } from '../utilities/requestModels'; import { PlayerId } from '../utilities/secureIds'; @@ -23,7 +23,7 @@ async function get(request: UnwrappedRequest): Promise { async function list(request: UnwrappedRequest): Promise { try { - return new OkResponse(await orm.players.list(request.claims)); + return new PagedResponse(request, await orm.players.list(request.claims)); } catch (error: any) { return new ErrorResponse(error as Error); } diff --git a/src/routes/collections.ts b/src/routes/collections.ts index 191e8fb..ef7c08e 100644 --- a/src/routes/collections.ts +++ b/src/routes/collections.ts @@ -25,7 +25,7 @@ export default { Claims.COLLECTIONS.OWNED.GAME.REMOVE, ]), }, - '/api/collection/list': { + '/api/collection/list/:pageSize/:page': { GET: guard(collections.list, [Claims.ADMIN, Claims.COLLECTIONS.OWNED.LIST]), }, }; diff --git a/src/routes/games.ts b/src/routes/games.ts index 7c4b709..c3b3092 100644 --- a/src/routes/games.ts +++ b/src/routes/games.ts @@ -11,7 +11,7 @@ export default { PATCH: guard(games.update, [Claims.ADMIN, Claims.GAMES.UPDATE]), DELETE: guard(games.drop, [Claims.ADMIN, Claims.GAMES.DELETE]), }, - '/api/game/search/:query': { + '/api/game/search/:query/:pageSize/:page': { GET: guard(games.query, [Claims.ADMIN, Claims.GAMES.READ]), }, }; diff --git a/src/routes/players.ts b/src/routes/players.ts index 7b2219d..3fd3472 100644 --- a/src/routes/players.ts +++ b/src/routes/players.ts @@ -11,7 +11,7 @@ export default { PATCH: guard(player.update, [Claims.ADMIN, Claims.PLAYERS.OTHER.UPDATE, Claims.PLAYERS.SELF.UPDATE]), DELETE: guard(player.drop, [Claims.ADMIN, Claims.PLAYERS.OTHER.DELETE, Claims.PLAYERS.SELF.DELETE]), }, - '/api/player/list': { + '/api/player/list/:pageSize/:page': { GET: guard(player.list, [Claims.ADMIN, Claims.PLAYERS.OTHER.READ]), }, }; diff --git a/src/utilities/responseHelper.ts b/src/utilities/responseHelper.ts index 825dde2..5d7fa27 100644 --- a/src/utilities/responseHelper.ts +++ b/src/utilities/responseHelper.ts @@ -1,5 +1,6 @@ import { BadRequestError, NotFoundError, UnauthorizedError } from './errors'; -import { isArray } from 'lodash'; +import { clamp, isArray } from 'lodash'; +import { UnwrappedRequest } from './guard'; export class ErrorResponse extends Response { //@ts-ignore @@ -37,9 +38,18 @@ export class NotFoundResponse extends Response { } } +export class PagedResponse extends Response { + //@ts-ignore + constructor(request: UnwrappedRequest, body: any[]) { + const pageSize = clamp(parseInt(request.params.pageSize ?? 100), 1, 100); + const page = Math.max(0, parseInt(request.params.page ?? 1) - 1); + return new OkResponse(body.slice(page * pageSize, page * pageSize + pageSize)); + } +} + export class OkResponse extends Response { // @ts-ignore - constructor(body?: Model | null) { + constructor(body?: any) { if (body) { return Response.json( isArray(body)