query-strings-parser
Version:
Middleware to transform query strings in a format that is recognized by the MongoDB, MySQL and other databases...
111 lines (98 loc) • 4.14 kB
JavaScript
const url = require('url')
const pagination = require('./mapper/pagination')
const fields = require('./mapper/fields')
const ordination = require('./mapper/ordination')
const filters = require('./mapper/filters')
function init_default() {
return {
default: {
pagination: {
limit: Number.MAX_SAFE_INTEGER,
skip: 0,
page: 1
},
fields: {},
sort: {},
filters: {}
},
use_page: false,
client_db: 'mongodb',
date_fields: {
start_at: 'created_at',
end_at: 'created_at'
}
}
}
exports = module.exports.parser = function (params) {
return function (req, res, next) {
const options = validate_options(params)
req.query = {
'original': req.url,
'pagination': pagination.pagination(req.query, options),
'fields': fields.fields(req.query, options),
'sort': ordination.sort(req.query, options),
'filters': filters.filters(req.query, options)
}
next()
}
}
function validate_options(params) {
const options = init_default()
if (typeof params === 'object' && Object.keys(params).length > 0) {
if (params.default) {
if (params.default.pagination) {
options.default.pagination.limit = params.default.pagination.limit || options.default.pagination.limit
options.default.pagination.skip = params.default.pagination.skip || options.default.pagination.skip
options.default.pagination.page = params.default.pagination.page || options.default.pagination.page
}
options.default.fields = params.default.fields || options.default.fields
options.default.sort = params.default.sort || options.default.sort
options.default.filters = params.default.filters || options.default.filters
}
options.use_page = params.use_page || options.use_page
options.client_db = params.client_db || options.client_db
if (params.date_fields) {
options.date_fields.start_at = params.date_fields.start_at || options.date_fields.start_at
options.date_fields.end_at = params.date_fields.end_at || options.date_fields.end_at
}
}
return options
}
exports = module.exports.parseAll = function (_query, _default, _options) {
const params = validate_options(Object.assign({'default': _default}, _options || {}))
return {
fields: fields.fields(stringToJson(_query), params),
sort: ordination.sort(stringToJson(_query), params),
filters: filters.filters(stringToJson(_query), params),
pagination: pagination.pagination(stringToJson(_query), params),
original: _query
}
}
exports = module.exports.parseFields = function (query, fields_default) {
const options = validate_options({'default': {'fields': fields_default}})
return fields.fields(stringToJson(query), options)
}
exports = module.exports.parseSort = function (query, sort_default) {
const options = validate_options({'default': {'sort': sort_default}})
return ordination.sort(stringToJson(query), options)
}
exports = module.exports.parsePagination = function (query, pagination_default, use_page) {
const options = validate_options({
'default': {'pagination': pagination_default},
'use_page': use_page
})
return pagination.pagination(stringToJson(query), options)
}
exports = module.exports.parseFilter = function (query, filters_default, date_fields) {
const options = validate_options({'default': {'filters': filters_default}, 'date_fields': date_fields})
return filters.filters(stringToJson(query), options)
}
exports = module.exports.parseDate = function (query, date_fields) {
const options = validate_options({'date_fields': date_fields})
return filters.filters(stringToJson(query), options)
}
function stringToJson(query) {
if (typeof query === 'string') return url.parse(query, true).query
return query
}