"use strict"; /* Sort middleware This module exports a function that takes a configuration object parameter with the following properties: { validKeys: Array of strings (case sensitive), default: String (optional, by default assigned to the first element of the validKeys array with ascending sorting order unless prefixed by a "-") } and returns an express compatible middleware function (req, res, next) that parses the following parameters from the req.query object and sets an object on the res.locals.sort having the following properties: Object - with keys for the sort value fields and value a boolean denoting ascending order or not */ const middleware = (config) => { if (typeof config !== "object" || config === null) { throw new Error("The config parameter is mandatory and should be an object!"); } config = config || {}; if (!config.default && (!Array.isArray(config.validKeys) || config.validKeys.length === 0)) { throw new Error("config.validKeys should be a non empty array of strings or a config.default key should be defined!"); } config.default = config.default || config.validKeys[0]; const defaultSortIsAscending = config.default.substring(0, 1) !== "-"; return function (req, res, next) { const sortKeys = Array.isArray(req.query.sort) ? req.query.sort : req.query.sort ? [req.query.sort] : []; const sortObject = sortKeys.reduce(function (c, key) { const ascending = key.substring(0, 1) !== "-"; if (!ascending) { key = key.substr(1); } if (key && config.validKeys && config.validKeys.indexOf(key) !== -1 ) { c[key] = ascending; } return c; }, {}); if (Object.keys(sortObject).length === 0) { sortObject[ defaultSortIsAscending ? config.default : config.default.substr(1) ] = defaultSortIsAscending; } res.locals.sort = sortObject; next(); }; } module.exports = { middleware }