Merge pull request #206 from typicode/v0.8.3

V0.8.3
This commit is contained in:
typicode
2015-11-29 19:37:05 +01:00
5 changed files with 64 additions and 11 deletions

View File

@ -1,5 +1,13 @@
# Change Log
## [0.8.3][2015-11-25]
### Added
* CLI option `-q/--quied`
* Nested route `POST /posts/1/comments`
* Not equal operator `GET /posts?id_ne=1`
## [0.8.2][2015-10-15]
### Added

View File

@ -98,14 +98,20 @@ GET /posts?_sort=views&_order=DESC
GET /posts/1/comments?_sort=votes&_order=ASC
```
### Range
### Operators
Add `_gte` or `_lte`
Add `_gte` or `_lte` for getting a range
```
GET /posts?views_gte=10&views_lte=20
```
Add `_ne` to exclude a value
```
GET /posts?id_ne=1
```
### Full-text search
Add `q`
@ -130,10 +136,11 @@ GET /comments?_expand=post
GET /comments/1?_expand=post
```
To get nested resources (by default one level, [add routes](#add-routes) for more)
To get or create nested resources (by default one level, [add routes](#add-routes) for more)
```
GET /posts/1/comments
GET /posts/1/comments
POST /posts/1/comments
```
### Database

View File

@ -6,13 +6,23 @@ module.exports = function () {
var router = express.Router()
// Rewrite url to /:nested?:resourceId=:id
router.get('/:resource/:id/:nested', function (req, res, next) {
// Rewrite URL (/:resource/:id/:nested -> /:nested) and request query
function get (req, res, next) {
var prop = pluralize.singular(req.params.resource)
req.query[prop + 'Id'] = utils.toNative(req.params.id)
req.url = '/' + req.params.nested
next()
})
}
// Rewrite URL (/:resource/:id/:nested -> /:nested) and request body
function post (req, res, next) {
var prop = pluralize.singular(req.params.resource)
req.body[prop + 'Id'] = utils.toNative(req.params.id)
req.url = '/' + req.params.nested
next()
}
return router
.get('/:resource/:id/:nested', get)
.post('/:resource/:id/:nested', post)
}

View File

@ -73,7 +73,8 @@ module.exports = function (db, name) {
query === 'callback' ||
query === '_' ||
query.indexOf('_lte') !== -1 ||
query.indexOf('_gte') !== -1
query.indexOf('_gte') !== -1 ||
query.indexOf('_ne') !== -1
) return
}
delete req.query[query]
@ -106,17 +107,23 @@ module.exports = function (db, name) {
return arr
.map(utils.toNative)
.map(function (value) {
var isDifferent = key.indexOf('_ne') !== -1
var isRange = key.indexOf('_lte') !== -1 || key.indexOf('_gte') !== -1
var path = key.replace(/(_lte|_gte|_ne)$/, '')
var elementValue
if (isRange) {
var path = key.replace(/(_lte|_gte)$/, '')
var isLowerThan = key.indexOf('_gte') !== -1
var elementValue = _.get(element, path)
elementValue = _.get(element, path)
if (isLowerThan) {
return value <= elementValue
} else {
return value >= elementValue
}
} else if (isDifferent) {
elementValue = _.get(element, path)
return value !== elementValue
} else {
return _.matchesProperty(key, value)(element)
}

View File

@ -224,7 +224,7 @@ describe('Server', function () {
})
})
describe('GET /:resource?attr>=&attr<=', function () {
describe('GET /:resource?attr_gte=&attr_lte=', function () {
it('should respond with a limited array', function (done) {
request(server)
.get('/comments?id_gte=2&id_lte=3')
@ -234,6 +234,16 @@ describe('Server', function () {
})
})
describe('GET /:resource?attr_ne=', function () {
it('should respond with a limited array', function (done) {
request(server)
.get('/comments?id_ne=1')
.expect('Content-Type', /json/)
.expect(db.comments.slice(1))
.expect(200, done)
})
})
describe('GET /:parent/:parentId/:resource', function () {
it('should respond with json and corresponding nested resources', function (done) {
request(server)
@ -407,6 +417,17 @@ describe('Server', function () {
})
})
describe('POST /:parent/:parentId/:resource', function () {
it('should respond with json and set parentId', function (done) {
request(server)
.post('/posts/1/comments')
.send({body: 'foo'})
.expect('Content-Type', /json/)
.expect({id: 6, postId: 1, body: 'foo'})
.expect(201, done)
})
})
describe('PUT /:resource/:id', function () {
it('should respond with json and replace resource', function (done) {
var post = {id: 1, booleanValue: true, integerValue: 1}