Skip to content

Commit fd96ee0

Browse files
committed
Merge pull request typicode#206 from typicode/v0.8.3
V0.8.3
2 parents b598e75 + 9c40912 commit fd96ee0

File tree

5 files changed

+64
-11
lines changed

5 files changed

+64
-11
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Change Log
22

3+
## [0.8.3][2015-11-25]
4+
5+
### Added
6+
7+
* CLI option `-q/--quied`
8+
* Nested route `POST /posts/1/comments`
9+
* Not equal operator `GET /posts?id_ne=1`
10+
311
## [0.8.2][2015-10-15]
412

513
### Added

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,20 @@ GET /posts?_sort=views&_order=DESC
9898
GET /posts/1/comments?_sort=votes&_order=ASC
9999
```
100100

101-
### Range
101+
### Operators
102102

103-
Add `_gte` or `_lte`
103+
Add `_gte` or `_lte` for getting a range
104104

105105
```
106106
GET /posts?views_gte=10&views_lte=20
107107
```
108108

109+
Add `_ne` to exclude a value
110+
111+
```
112+
GET /posts?id_ne=1
113+
```
114+
109115
### Full-text search
110116

111117
Add `q`
@@ -130,10 +136,11 @@ GET /comments?_expand=post
130136
GET /comments/1?_expand=post
131137
```
132138

133-
To get nested resources (by default one level, [add routes](#add-routes) for more)
139+
To get or create nested resources (by default one level, [add routes](#add-routes) for more)
134140

135141
```
136-
GET /posts/1/comments
142+
GET /posts/1/comments
143+
POST /posts/1/comments
137144
```
138145

139146
### Database

src/server/router/nested.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,23 @@ module.exports = function () {
66

77
var router = express.Router()
88

9-
// Rewrite url to /:nested?:resourceId=:id
10-
router.get('/:resource/:id/:nested', function (req, res, next) {
9+
// Rewrite URL (/:resource/:id/:nested -> /:nested) and request query
10+
function get (req, res, next) {
1111
var prop = pluralize.singular(req.params.resource)
1212
req.query[prop + 'Id'] = utils.toNative(req.params.id)
1313
req.url = '/' + req.params.nested
1414
next()
15-
})
15+
}
16+
17+
// Rewrite URL (/:resource/:id/:nested -> /:nested) and request body
18+
function post (req, res, next) {
19+
var prop = pluralize.singular(req.params.resource)
20+
req.body[prop + 'Id'] = utils.toNative(req.params.id)
21+
req.url = '/' + req.params.nested
22+
next()
23+
}
1624

1725
return router
26+
.get('/:resource/:id/:nested', get)
27+
.post('/:resource/:id/:nested', post)
1828
}

src/server/router/plural.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ module.exports = function (db, name) {
7373
query === 'callback' ||
7474
query === '_' ||
7575
query.indexOf('_lte') !== -1 ||
76-
query.indexOf('_gte') !== -1
76+
query.indexOf('_gte') !== -1 ||
77+
query.indexOf('_ne') !== -1
7778
) return
7879
}
7980
delete req.query[query]
@@ -106,17 +107,23 @@ module.exports = function (db, name) {
106107
return arr
107108
.map(utils.toNative)
108109
.map(function (value) {
110+
var isDifferent = key.indexOf('_ne') !== -1
109111
var isRange = key.indexOf('_lte') !== -1 || key.indexOf('_gte') !== -1
112+
var path = key.replace(/(_lte|_gte|_ne)$/, '')
113+
var elementValue
114+
110115
if (isRange) {
111-
var path = key.replace(/(_lte|_gte)$/, '')
112116
var isLowerThan = key.indexOf('_gte') !== -1
113-
var elementValue = _.get(element, path)
117+
elementValue = _.get(element, path)
114118

115119
if (isLowerThan) {
116120
return value <= elementValue
117121
} else {
118122
return value >= elementValue
119123
}
124+
} else if (isDifferent) {
125+
elementValue = _.get(element, path)
126+
return value !== elementValue
120127
} else {
121128
return _.matchesProperty(key, value)(element)
122129
}

test/server/plural.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ describe('Server', function () {
224224
})
225225
})
226226

227-
describe('GET /:resource?attr>=&attr<=', function () {
227+
describe('GET /:resource?attr_gte=&attr_lte=', function () {
228228
it('should respond with a limited array', function (done) {
229229
request(server)
230230
.get('/comments?id_gte=2&id_lte=3')
@@ -234,6 +234,16 @@ describe('Server', function () {
234234
})
235235
})
236236

237+
describe('GET /:resource?attr_ne=', function () {
238+
it('should respond with a limited array', function (done) {
239+
request(server)
240+
.get('/comments?id_ne=1')
241+
.expect('Content-Type', /json/)
242+
.expect(db.comments.slice(1))
243+
.expect(200, done)
244+
})
245+
})
246+
237247
describe('GET /:parent/:parentId/:resource', function () {
238248
it('should respond with json and corresponding nested resources', function (done) {
239249
request(server)
@@ -407,6 +417,17 @@ describe('Server', function () {
407417
})
408418
})
409419

420+
describe('POST /:parent/:parentId/:resource', function () {
421+
it('should respond with json and set parentId', function (done) {
422+
request(server)
423+
.post('/posts/1/comments')
424+
.send({body: 'foo'})
425+
.expect('Content-Type', /json/)
426+
.expect({id: 6, postId: 1, body: 'foo'})
427+
.expect(201, done)
428+
})
429+
})
430+
410431
describe('PUT /:resource/:id', function () {
411432
it('should respond with json and replace resource', function (done) {
412433
var post = {id: 1, booleanValue: true, integerValue: 1}

0 commit comments

Comments
 (0)