Skip to content

Commit a0fbe8e

Browse files
committed
Add query params support for filter, order & limit
This adds query params to filter, order and limit for the GET interface /api/places.
1 parent 546e7c5 commit a0fbe8e

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed

controller/place.controller.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
* @author C. Mayer (meggsimum)
55
*/
66
const db = require('../config/db.config.js');
7+
const queryResolver = require('../query/resolver');
78
const Places = db.places;
89

910
// fetch all places
1011
exports.findAll = (req, res) => {
11-
Places.findAll().then(places => {
12+
// resolve query params (filter, limit, ...) as Sequelize opts
13+
const seqOpts = queryResolver.getSequelizeOpts(req.query);
14+
Places.findAll(seqOpts).then(places => {
1215
// send all Customers to Client
1316
res.json(places);
1417
}).catch(err => {

query/resolver.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* Resolves a query string to a Sequelize DB query options object.
3+
*
4+
* @param {*} query The Express request query object
5+
*
6+
* @author C. Mayer (meggsimum)
7+
*/
8+
exports.getSequelizeOpts = (query) => {
9+
let order = null;
10+
let where = null;
11+
let limit = null;
12+
13+
// ORDER BY
14+
const orderByColumn = query.order_by;
15+
if (orderByColumn && orderByColumn !== '') {
16+
const orderByDir = query.order_dir || 'ASC';
17+
order = [
18+
[orderByColumn, orderByDir]
19+
];
20+
}
21+
22+
// LIMIT
23+
limit = query.limit ? Number(query.limit) : null;
24+
25+
// FILTER (equals)
26+
const filterParts = query.filter ? query.filter.split('=') : null;
27+
if (filterParts && filterParts.length === 2) {
28+
const whereProp = filterParts[0];
29+
const whereVal = filterParts[1];
30+
where = {};
31+
32+
const { Op } = require('sequelize');
33+
where[whereProp] = {
34+
[Op.eq]: whereVal
35+
};
36+
}
37+
38+
return {
39+
where: where,
40+
limit: limit,
41+
order: order
42+
}
43+
};

route/place.route.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,32 @@ module.exports = function (app) {
1515
* /api/places:
1616
* get:
1717
* summary: Retrieve all places
18+
* parameters:
19+
* - in: query
20+
* name: limit
21+
* schema:
22+
* type: integer
23+
* required: false
24+
* description: Maximum number of result objects
25+
* - in: query
26+
* name: filter
27+
* schema:
28+
* type: string
29+
* required: false
30+
* description: CQL-like filter (only 'equals' at the moment) in the form 'name=Mutterstadt'
31+
* - in: query
32+
* name: order_by
33+
* schema:
34+
* type: string
35+
* required: false
36+
* description: Field to use to order results by
37+
* - in: query
38+
* name: order_dir
39+
* schema:
40+
* type: string
41+
* required: false
42+
* default: ASC
43+
* description: Order direction, either 'ASC' or 'DESC'
1844
* responses:
1945
* "200":
2046
* description: JSON with all places objects as array

0 commit comments

Comments
 (0)