From fb884c83a9fd5b12a993c4c196764ea002c490db Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Wed, 11 Jan 2023 11:32:06 +0100 Subject: [PATCH] Added pagination to show GET route --- routes/shows.js | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/routes/shows.js b/routes/shows.js index 77ad238..70f2a33 100644 --- a/routes/shows.js +++ b/routes/shows.js @@ -25,9 +25,18 @@ function pushOrderByToFilter(filter, valueOrderPair) { filter.orderBy[valueOrderPair.value] = valueOrderPair.order } +function parseNumberFromQuery(query) { + const parsedQuery = parseInt(query) + if (isNaN(parsedQuery)) return undefined; + return parsedQuery +} + showsRouter.get('/', function (req, res, next) { const queries = req.query - const filter = {} + const filter = { + skip: parseNumberFromQuery(queries['start']) ?? 0, + take: parseNumberFromQuery(queries['per_page']) ?? 10 + } pushOrderByToFilter(filter, { value: queries?.sort_asc, order: 'asc' }) pushOrderByToFilter(filter, { value: queries?.sort_desc, order: 'desc' }) @@ -39,10 +48,21 @@ showsRouter.get('/', function (req, res, next) { pushQueryToFilter(filter, { key: 'likes', value: queries?.likes, query: 'equals' }) prisma.serie.findMany(filter) - .then(shows => res.send({ shows })) + .then(shows => res.send({ + shows, + pagination: { + start: filter.skip, + per_page: filter.take + }, + links: { + next: `/v1/shows?start=${filter.skip + filter.take}&per_page=${filter.take}`, + prev: `/v1/shows?start=${Math.max(0, filter.skip - filter.take)}&per_page=${filter.take}` + }, + total: shows.length + })) .catch(error => { if (error instanceof Prisma.PrismaClientValidationError) { - next(createHttpError(400, 'Incorrect field in sort query.')) + next(createHttpError(400, 'Incorrect field in sort query: ' + error)) } }) })