Skip to content

Commit fab3c2e

Browse files
author
Lucas Cosmo Rocha
committed
Exposing individually parse methods for filters, fields, sort and page.
1 parent 03bcb34 commit fab3c2e

File tree

8 files changed

+248
-168
lines changed

8 files changed

+248
-168
lines changed

index.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,27 @@
22

33
const read = require('./lib/read')
44

5+
56
exports = module.exports = function (params) {
6-
read.set_default()
7-
return read.options(params)
7+
return read.parser(params)
8+
}
9+
10+
exports = module.exports.parseFields = function (_query, _default) {
11+
return read.parseFields(_query, _default)
12+
}
13+
14+
exports = module.exports.parseSort = function (_query, _default) {
15+
return read.parseSort(_query, _default)
16+
}
17+
18+
exports = module.exports.parsePagination = function (_query, _default) {
19+
return read.parsePagination(_query, _default)
20+
}
21+
22+
exports = module.exports.parseFilter = function (_query, _default) {
23+
return read.parseFilter(_query, _default)
24+
}
25+
26+
exports = module.exports.parseDate = function (_query, _default) {
27+
return read.parseDate(_query, _default)
828
}

lib/mapper/fields.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
'use strict'
22

33
function fields(query, options) {
4+
var result = {}
45
if (query.fields) {
56
if (query.fields instanceof Array) {
6-
return processQuery(query.fields.join(','))
7+
result = processQuery(query.fields.join(','))
8+
} else {
9+
result = processQuery(query.fields)
710
}
8-
return processQuery(query.fields)
11+
return validate_fields(result, options.default.fields)
912
}
1013
return options.default.fields
1114
}
@@ -21,6 +24,10 @@ function processQuery(query) {
2124
return elems
2225
}
2326

27+
function validate_fields(_values, _default) {
28+
return {..._values, ..._default}
29+
}
30+
2431
exports = module.exports = {
2532
fields: fields
2633
}

lib/mapper/filters.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ function filters(query, options) {
3030
}
3131
if (result['$and'].length === 0) delete result['$and']
3232
if (result['$or'].length === 0) delete result['$or']
33-
return result
33+
return validate_filters(result, options.default.filters)
3434
}
3535
return options.default.filters
3636
}
@@ -92,26 +92,26 @@ function parseDate(query, options) {
9292
if (query.period) {
9393
(query.end_at && (isDate(query.end_at) || isDateTime(query.end_at))) ?
9494
result.push(
95-
processQuery(options.date_field, 'lt:'.concat(normalizeDate(query.end_at, false))),
96-
processQuery(options.date_field, 'gte:'.concat(normalizeDate(
95+
processQuery(options.date_field.end_at, 'lt:'.concat(normalizeDate(query.end_at, false))),
96+
processQuery(options.date_field.start_at, 'gte:'.concat(normalizeDate(
9797
getDateStartByPeriod(query.period, new Date(query.end_at)))))) :
9898
result.push(
99-
processQuery(options.date_field, 'lt:now'),
100-
processQuery(options.date_field, 'gte:'.concat(
99+
processQuery(options.date_field.end_at, 'lt:now'),
100+
processQuery(options.date_field.start_at, 'gte:'.concat(
101101
getDateStartByPeriod(query.period, new Date()))))
102102
return result
103103
}
104104

105105
if (query.start_at && (isDate(query.start_at) || isDateTime(query.start_at))) {
106106
if (query.end_at && (isDate(query.end_at) || isDateTime(query.end_at))) {
107107
result.push(
108-
processQuery(options.date_field, 'lt:'.concat(query.end_at)))
108+
processQuery(options.date_field.end_at, 'lt:'.concat(query.end_at)))
109109
} else {
110110
result.push(
111-
processQuery(options.date_field, 'lt:now'))
111+
processQuery(options.date_field.end_at, 'lt:now'))
112112
}
113113
result.push(
114-
processQuery(options.date_field, 'gte:'.concat(query.start_at)))
114+
processQuery(options.date_field.start_at, 'gte:'.concat(query.start_at)))
115115
}
116116
return result
117117
}
@@ -162,6 +162,10 @@ function normalizeDate(date, isDateStart) {
162162
return date.replace(/\D/g, '').replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3T23:59:59')
163163
}
164164

165+
function validate_filters(_values, _default) {
166+
return {..._values, ..._default}
167+
}
168+
165169
exports = module.exports = {
166170
filters: filters
167171
}

lib/mapper/ordination.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ function ordination(query, options) {
77
query.sort.forEach(function (elem) {
88
Object.assign(result, processQuery(elem))
99
})
10-
return result
10+
return validate_sort(result, options.default.sort)
1111
}
12-
return processQuery(query.sort)
12+
return validate_sort(processQuery(query.sort), options.default.sort)
1313
}
1414
return options.default.sort
1515
}
@@ -25,6 +25,11 @@ function processQuery(query) {
2525
return result
2626
}
2727

28+
29+
function validate_sort(_values, _default) {
30+
return {..._values, ..._default}
31+
}
32+
2833
exports = module.exports = {
2934
sort: ordination
3035
}

lib/read.js

Lines changed: 68 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,8 @@ const fields = require('./mapper/fields')
55
const ordination = require('./mapper/ordination')
66
const filters = require('./mapper/filters')
77

8-
var options = {}
9-
10-
function filter(req, res, next) {
11-
const default_query = {
12-
'pagination': pagination.pagination(req.query, options),
13-
'fields': fields.fields(req.query, options),
14-
'sort': ordination.sort(req.query, options),
15-
'filters': filters.filters(req.query, options)
16-
}
17-
req.query = default_query
18-
next()
19-
}
20-
21-
exports = module.exports.options = function (params) {
22-
return function (req, res, next) {
23-
if (typeof params === 'object' && Object.keys(params).length > 0) {
24-
if (params.default) {
25-
if (params.default.pagination) {
26-
options.default.pagination.limit = params.default.pagination.limit || options.default.pagination.limit
27-
options.default.pagination.skip = params.default.pagination.skip || options.default.pagination.skip
28-
options.default.pagination.page = params.default.pagination.page || options.default.pagination.page
29-
}
30-
options.default.fields = params.default.fields || options.default.fields
31-
options.default.sort = params.default.sort || options.default.sort
32-
options.default.filters = params.default.filters || options.default.filters
33-
}
34-
options.use_page = params.use_page || options.use_page
35-
options.client_db = params.client_db || options.client_db
36-
options.date_field = params.date_field || options.date_field
37-
}
38-
return filter(req, res, next)
39-
}
40-
}
41-
42-
exports = module.exports.set_default = function () {
43-
options = {
8+
function init_default() {
9+
return {
4410
default: {
4511
pagination: {
4612
limit: Number.MAX_SAFE_INTEGER,
@@ -53,6 +19,71 @@ exports = module.exports.set_default = function () {
5319
},
5420
use_page: false,
5521
client_db: 'mongodb',
56-
date_field: 'created_at'
22+
date_fields: {
23+
start_at: 'created_at',
24+
end_at: 'created_at'
25+
}
26+
}
27+
}
28+
29+
exports = module.exports.parser = function (params) {
30+
return function (req, res, next) {
31+
const options = validate_options(params)
32+
req.query = {
33+
'pagination': pagination.pagination(req.query, options),
34+
'fields': fields.fields(req.query, options),
35+
'sort': ordination.sort(req.query, options),
36+
'filters': filters.filters(req.query, options)
37+
}
38+
next()
39+
}
40+
}
41+
42+
function validate_options(params) {
43+
const options = init_default()
44+
if (typeof params === 'object' && Object.keys(params).length > 0) {
45+
if (params.default) {
46+
if (params.default.pagination) {
47+
options.default.pagination.limit = params.default.pagination.limit || options.default.pagination.limit
48+
options.default.pagination.skip = params.default.pagination.skip || options.default.pagination.skip
49+
options.default.pagination.page = params.default.pagination.page || options.default.pagination.page
50+
}
51+
options.default.fields = params.default.fields || options.default.fields
52+
options.default.sort = params.default.sort || options.default.sort
53+
options.default.filters = params.default.filters || options.default.filters
54+
}
55+
options.use_page = params.use_page || options.use_page
56+
options.client_db = params.client_db || options.client_db
57+
if (params.date_fields) {
58+
options.date_fields.start_at = params.date_fields.start_at || options.date_fields.start_at
59+
options.date_fields.end_at = params.date_fields.end_at || options.date_fields.end_at
60+
}
5761
}
62+
return options
63+
}
64+
65+
exports = module.exports.parseFields = function (query, fields_default) {
66+
const options = validate_options({'default': {'fields': fields_default}})
67+
return fields.fields(query, options)
68+
}
69+
70+
exports = module.exports.parseSort = function (query, sort_default) {
71+
const options = validate_options({'default': {'sort': sort_default}})
72+
return ordination.sort(query, options)
73+
}
74+
75+
exports = module.exports.parsePagination = function (query, pagination_default) {
76+
const options = validate_options({'default': {'pagination': pagination_default}})
77+
return pagination.pagination(query, options)
78+
}
79+
80+
exports = module.exports.parseFilter = function (query, filters_default, date_fields) {
81+
const options = validate_options({'default': {'filters': filters_default}, 'date_fields': date_fields})
82+
return filters.filters(query, options)
83+
}
84+
85+
exports = module.exports.parseDate = function (query, date_fields) {
86+
const options = validate_options({'date_fields': date_fields})
87+
return filters.filters(query, options)
5888
}
89+

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@
4444
"dependencies": {},
4545
"devDependencies": {
4646
"chai": "^4.2.0",
47+
"express": "^4.16.4",
4748
"mocha": "^5.2.0",
48-
"node-mocks-http": "^1.7.3",
49-
"nyc": "^13.1.0"
49+
"nyc": "^13.1.0",
50+
"supertest": "^3.4.2"
5051
}
5152
}

test/global.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ global.default_options = {
33
pagination: {
44
limit: Number.MAX_SAFE_INTEGER,
55
skip: 0,
6-
page:1
6+
page: 1
77
},
88
fields: {},
99
sort: {},
1010
filters: {}
1111
},
1212
use_page: false,
13-
client_db: 'mongodb'
13+
client_db: 'mongodb',
14+
date_fields: {
15+
start_at: 'created_at',
16+
end_at: 'created_at'
17+
}
1418
}

0 commit comments

Comments
 (0)