Skip to content

Commit 3056b96

Browse files
committed
Make q and other query parameters not mutually exclusive
1 parent 29469cc commit 3056b96

File tree

2 files changed

+46
-41
lines changed

2 files changed

+46
-41
lines changed

src/server/router.js

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -62,28 +62,30 @@ module.exports = function (source) {
6262
// Filters list
6363
var filters = {}
6464

65-
// Result array
66-
var array
65+
// Resource chain
66+
var chain = db(req.params.resource).chain()
6767

68-
// Remove _start, _end and _limit from req.query to avoid filtering using those
68+
// Remove q, _start, _end, ... from req.query to avoid filtering using those
6969
// parameters
70+
var q = req.query.q
7071
var _start = req.query._start
7172
var _end = req.query._end
7273
var _sort = req.query._sort
7374
var _order = req.query._order
7475
var _limit = req.query._limit
76+
delete req.query.q
7577
delete req.query._start
7678
delete req.query._end
7779
delete req.query._sort
7880
delete req.query._order
7981
delete req.query._limit
8082

81-
if (req.query.q) {
83+
if (q) {
8284

8385
// Full-text search
84-
var q = req.query.q.toLowerCase()
86+
q = q.toLowerCase()
8587

86-
array = db(req.params.resource).filter(function (obj) {
88+
chain = chain.filter(function (obj) {
8789
for (var key in obj) {
8890
var value = obj[key]
8991
if (db._.deepQuery(value, q)) {
@@ -92,67 +94,62 @@ module.exports = function (source) {
9294
}
9395
})
9496

95-
} else {
97+
}
9698

97-
// Add :parentId filter in case URL is like /:parent/:parentId/:resource
98-
if (req.params.parent) {
99-
var parent = pluralize.singular(req.params.parent)
100-
filters[parent + 'Id'] = +req.params.parentId
101-
}
99+
// Add :parentId filter in case URL is like /:parent/:parentId/:resource
100+
if (req.params.parent) {
101+
var parent = pluralize.singular(req.params.parent)
102+
filters[parent + 'Id'] = +req.params.parentId
103+
}
102104

103-
// Add query parameters filters
104-
// Convert query parameters to their native counterparts
105-
for (var key in req.query) {
106-
// don't take into account JSONP query parameters
107-
// jQuery adds a '_' query parameter too
108-
if (key !== 'callback' && key !== '_') {
109-
filters[key] = utils.toNative(req.query[key])
110-
}
105+
// Add query parameters filters
106+
// Convert query parameters to their native counterparts
107+
for (var key in req.query) {
108+
// don't take into account JSONP query parameters
109+
// jQuery adds a '_' query parameter too
110+
if (key !== 'callback' && key !== '_') {
111+
filters[key] = utils.toNative(req.query[key])
111112
}
113+
}
112114

113-
// Filter
114-
if (_(filters).isEmpty()) {
115-
array = db(req.params.resource).value()
116-
} else {
117-
var chain = db(req.params.resource).chain()
118-
for (var f in filters) {
119-
// This syntax allow for deep filtering using lodash (i.e. a.b.c[0])
120-
chain = chain.filter(f, filters[f])
121-
}
122-
array = chain.value()
115+
// Filter
116+
if (!_(filters).isEmpty()) {
117+
for (var f in filters) {
118+
// This syntax allow for deep filtering using lodash (i.e. a.b.c[0])
119+
chain = chain.filter(f, filters[f])
123120
}
124121
}
125122

126123
// Sort
127124
if (_sort) {
128125
_order = _order || 'ASC'
129126

130-
array = _.sortBy(array, function (element) {
127+
chain = chain.sortBy(function (element) {
131128
return element[_sort]
132129
})
133130

134131
if (_order === 'DESC') {
135-
array.reverse()
132+
chain = chain.reverse()
136133
}
137134
}
138135

139136
// Slice result
140137
if (_end || _limit) {
141-
res.setHeader('X-Total-Count', array.length)
138+
res.setHeader('X-Total-Count', chain.size())
142139
res.setHeader('Access-Control-Expose-Headers', 'X-Total-Count')
143140
}
144141

145142
_start = parseInt(_start, 10) || 0
146143

147144
if (_end) {
148145
_end = parseInt(_end, 10)
149-
array = array.slice(_start, _end)
146+
chain = chain.slice(_start, _end)
150147
} else if (_limit) {
151148
_limit = parseInt(_limit, 10)
152-
array = array.slice(_start, _start + _limit)
149+
chain = chain.slice(_start, _start + _limit)
153150
}
154151

155-
res.locals.data = array
152+
res.locals.data = chain.value()
156153
next()
157154
}
158155

test/server/index.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ describe('Server', function () {
2525
]
2626

2727
db.comments = [
28-
{id: 1, published: true, postId: 1},
29-
{id: 2, published: false, postId: 1},
30-
{id: 3, published: false, postId: 2},
31-
{id: 4, published: false, postId: 2},
32-
{id: 5, published: false, postId: 2}
28+
{id: 1, body: 'foo', published: true, postId: 1},
29+
{id: 2, body: 'bar', published: false, postId: 1},
30+
{id: 3, body: 'baz', published: false, postId: 2},
31+
{id: 4, body: 'qux', published: true, postId: 2},
32+
{id: 5, body: 'quux', published: false, postId: 2}
3333
]
3434

3535
db.refs = [
@@ -122,6 +122,14 @@ describe('Server', function () {
122122
.expect([])
123123
.expect(200, done)
124124
})
125+
126+
it('should support other query parameters', function (done) {
127+
request(server)
128+
.get('/comments?q=qu&published=true')
129+
.expect('Content-Type', /json/)
130+
.expect([db.comments[3]])
131+
.expect(200, done)
132+
})
125133
})
126134

127135
describe('GET /:resource?_end=', function () {

0 commit comments

Comments
 (0)