express-query-params
Version:
Express.js middleware implementing the API Query Spec, converting the params to SQL or a Mongo query
46 lines (37 loc) • 1.8 kB
JavaScript
const format = require('../lib/format')
const { trimOperators, typeCast } = require('../lib/utils')
module.exports = (options = {}) => (
rawQuery => {
const seqQuery = {}
const cast = (options.typeCast || typeCast)({ returnJSDate: true, ...options })
const op = options.sequelizeOp
for (const key in rawQuery) {
if (!Object.prototype.hasOwnProperty.call(rawQuery, key)) continue
if (
Array.isArray(options.blacklistParams)
&& options.blacklistParams.length > 0
&& options.blacklistParams.indexOf(key) > -1
) continue
if (
Array.isArray(options.whitelistParams)
&& options.whitelistParams.length > 0
&& options.whitelistParams.indexOf(key) === -1
) continue
const value = rawQuery[key]
const insertValue = cast(trimOperators(value))
if (format.stringContains(value)) seqQuery[key] = { [op.like]: `%${insertValue}%` }
else if (format.stringIsCaseInsensitive(value)) seqQuery[key] = { [op.regexp]: RegExp(`${insertValue}$i`) }
else if (format.isGreaterThan(value)) seqQuery[key] = { [op.gt]: insertValue }
else if (format.isGreaterThanOrEqual(value)) seqQuery[key] = { [op.gte]: insertValue }
else if (format.isLesserThan(value)) seqQuery[key] = { [op.lt]: insertValue }
else if (format.isLesserThanOrEqual(value)) seqQuery[key] = { [op.lte]: insertValue }
else if (format.oneOf(value)) seqQuery[key] = { [op.in]: value.split(',') }
else if (format.isRange(value)) {
const [ from, to ] = insertValue.split('...')
seqQuery[key] = { [op.gte]: cast(from), [op.lte]: cast(to) }
} else seqQuery[key] = insertValue
if (format.negated(value)) seqQuery[key] = { [op.not]: seqQuery[key] }
}
return seqQuery
}
)