From 03d110a7a98fe5fb578ac7990362cf6fd3e3771d Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Wed, 17 Jun 2020 17:31:20 -0400 Subject: [PATCH] Add limit/offset --- src/middleware/sanitize-query.ts | 16 ++++++++++++++ src/services/items.ts | 38 +++++++------------------------- src/types/query.ts | 3 +++ 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/middleware/sanitize-query.ts b/src/middleware/sanitize-query.ts index 5d3474e411..2bbebebcc5 100644 --- a/src/middleware/sanitize-query.ts +++ b/src/middleware/sanitize-query.ts @@ -23,6 +23,14 @@ const sanitizeQuery: RequestHandler = (req, res, next) => { query.filter = sanitizeFilter(req.query.filter); } + if (req.query.limit) { + query.limit = sanitizeLimit(req.query.limit); + } + + if (req.query.offset) { + query.offset = sanitizeOffset(req.query.offset); + } + res.locals.query = query; return next(); }; @@ -63,3 +71,11 @@ function sanitizeFilter(rawFilter: any) { return filters; } + +function sanitizeLimit(rawLimit: any) { + return Number(rawLimit); +} + +function sanitizeOffset(rawOffset: any) { + return Number(rawOffset); +} diff --git a/src/services/items.ts b/src/services/items.ts index 65e3bf68fd..514507606d 100644 --- a/src/services/items.ts +++ b/src/services/items.ts @@ -36,42 +36,20 @@ export const readItems = async (collection: string, query: Query = {}) => { }); } + if (query.limit) { + dbQuery.limit(query.limit); + } + + if (query.offset) { + dbQuery.offset(query.offset); + } + return await dbQuery; }; export const readItem = async (collection: string, pk: number | string, query: Query = {}) => { const dbQuery = database.select('*').from(collection).where({ id: pk }); - /** - * @TODO - * Merge query building between items / item. It should be the same for both, with the exception - * of limit / page etc - */ - - if (query.sort) { - dbQuery.orderBy(query.sort); - } - - if (query.filter) { - query.filter.forEach((filter) => { - if (filter.operator === 'eq') { - dbQuery.where({ [filter.column]: filter.value }); - } - - if (filter.operator === 'neq') { - dbQuery.whereNot({ [filter.column]: filter.value }); - } - - if (filter.operator === 'null') { - dbQuery.whereNull(filter.column); - } - - if (filter.operator === 'nnull') { - dbQuery.whereNotNull(filter.column); - } - }); - } - const records = await dbQuery; return records[0]; diff --git a/src/types/query.ts b/src/types/query.ts index 89a7b3a4ed..fc032cdaed 100644 --- a/src/types/query.ts +++ b/src/types/query.ts @@ -2,6 +2,9 @@ export type Query = { fields?: string[]; sort?: Sort[]; filter?: Filter[]; + limit?: number; + offset?: number; + page?: number; }; export type Sort = {