Add basic pagination

This commit is contained in:
typicode
2016-07-04 20:13:41 +02:00
parent 706ab46d55
commit 3a23d8663b
2 changed files with 53 additions and 4 deletions

View File

@ -47,6 +47,7 @@ module.exports = function (db, name) {
var q = req.query.q var q = req.query.q
var _start = req.query._start var _start = req.query._start
var _end = req.query._end var _end = req.query._end
var _page = req.query._page
var _sort = req.query._sort var _sort = req.query._sort
var _order = req.query._order var _order = req.query._order
var _limit = req.query._limit var _limit = req.query._limit
@ -146,17 +147,23 @@ module.exports = function (db, name) {
} }
// Slice result // Slice result
if (_end || _limit) { if (_end || _limit || _page) {
res.setHeader('X-Total-Count', chain.size()) res.setHeader('X-Total-Count', chain.size())
res.setHeader('Access-Control-Expose-Headers', 'X-Total-Count') res.setHeader('Access-Control-Expose-Headers', 'X-Total-Count')
} }
if (_page) {
_page = parseInt(_page, 10)
_page = _page >= 1 ? _page : 1
_limit = parseInt(_limit, 10) || 10
_start = (_page - 1) * _limit
chain = chain.slice(_start, _start + _limit)
} else if (_end) {
_start = parseInt(_start, 10) || 0 _start = parseInt(_start, 10) || 0
if (_end) {
_end = parseInt(_end, 10) _end = parseInt(_end, 10)
chain = chain.slice(_start, _end) chain = chain.slice(_start, _end)
} else if (_limit) { } else if (_limit) {
_start = parseInt(_start, 10) || 0
_limit = parseInt(_limit, 10) _limit = parseInt(_limit, 10)
chain = chain.slice(_start, _start + _limit) chain = chain.slice(_start, _start + _limit)
} }

View File

@ -51,6 +51,24 @@ describe('Server', function () {
{resource: {name: 'howe'}} {resource: {name: 'howe'}}
] ]
db.list = [
{id: 1},
{id: 2},
{id: 3},
{id: 4},
{id: 5},
{id: 6},
{id: 7},
{id: 8},
{id: 9},
{id: 10},
{id: 11},
{id: 12},
{id: 13},
{id: 14},
{id: 15}
]
server = jsonServer.create() server = jsonServer.create()
router = jsonServer.router(db) router = jsonServer.router(db)
server.use(jsonServer.defaults()) server.use(jsonServer.defaults())
@ -236,6 +254,30 @@ describe('Server', function () {
}) })
}) })
describe('GET /:resource?_page=', function () {
it('should paginate', function (done) {
request(server)
.get('/list?_page=2')
.expect('Content-Type', /json/)
.expect('x-total-count', db.list.length.toString())
.expect('Access-Control-Expose-Headers', 'X-Total-Count')
.expect(db.list.slice(10, 20))
.expect(200, done)
})
})
describe('GET /:resource?_page=&_limit=', function () {
it('should paginate with a custom limit', function (done) {
request(server)
.get('/list?_page=2&_limit=1')
.expect('Content-Type', /json/)
.expect('x-total-count', db.list.length.toString())
.expect('Access-Control-Expose-Headers', 'X-Total-Count')
.expect(db.list.slice(1, 2))
.expect(200, done)
})
})
describe('GET /:resource?attr_gte=&attr_lte=', function () { describe('GET /:resource?attr_gte=&attr_lte=', function () {
it('should respond with a limited array', function (done) { it('should respond with a limited array', function (done) {
request(server) request(server)