mirror of
https://github.com/typicode/json-server.git
synced 2025-08-02 19:52:20 +08:00
@ -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
|
||||
|
15
README.md
15
README.md
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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}
|
||||
|
Reference in New Issue
Block a user