From 4a725de28e437008e12d5cb2e5dcac44e98ff747 Mon Sep 17 00:00:00 2001 From: Craig Edmunds Date: Tue, 1 Jul 2014 22:16:18 +0100 Subject: [PATCH] Added paging via naive limit / skip mechanism --- lib/adapters/mongodb.js | 7 +++++++ lib/route.js | 13 ++++++++++++- test/fortune/fields_and_filters.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/adapters/mongodb.js b/lib/adapters/mongodb.js index 332bcc94f..316660be4 100644 --- a/lib/adapters/mongodb.js +++ b/lib/adapters/mongodb.js @@ -325,6 +325,12 @@ adapter.findMany = function(model, query, projection) { projection.limit = projection.limit || model.schema.options.defaultLimit || 1000; projection.select = projection.select || ''; + if (projection.page && projection.page > 0) { + projection.skip = (projection.page - 1) * projection.pageSize; + console.log("skip", projection.skip); + projection.limit = projection.pageSize; + } + //Ensure business id is included to selection var pkNotRequested = false; if (_.isArray(projection.select)){ @@ -343,6 +349,7 @@ adapter.findMany = function(model, query, projection) { .select(projection.select) .sort(projection.sort) .lean(true) + .skip(projection.skip) .exec(function(error, resources) { if(error) { return reject(error); diff --git a/lib/route.js b/lib/route.js index 3c3325057..00223d8c2 100644 --- a/lib/route.js +++ b/lib/route.js @@ -309,10 +309,21 @@ function route(name, model, resources, inflect) { projection.limit = req.query.limit; } - if (req.query.sort){ + if (req.query.sort){ projection.sort = req.query.sort; } + if (req.query.page){ + projection.page = req.query.page; + + if (req.query.pageSize){ + projection.pageSize = req.query.pageSize; + } + else { + projection.pageSize = 10; + } + } + //run beforeRead beforeReadHook({}, req, res) .then(function(){ diff --git a/test/fortune/fields_and_filters.js b/test/fortune/fields_and_filters.js index 4cfb5087a..1d6f61eda 100644 --- a/test/fortune/fields_and_filters.js +++ b/test/fortune/fields_and_filters.js @@ -328,5 +328,33 @@ module.exports = function(options){ }); }); }); + + describe('paging', function(){ + it('should be possible to get page 1', function(done){ + request(baseUrl).get('/people?sort=name&page=1&pageSize=2') + .expect(200) + .end(function(err, res){ + should.not.exist(err); + var body = JSON.parse(res.text); + // console.log(body); + (body.people.length).should.equal(2); + _.pluck(body.people, "name").should.eql(["Dilbert", "Robert"]); + done(); + }); + }); + + it('should be possible to get page 2', function(done){ + request(baseUrl).get('/people?sort=name&page=2&pageSize=2') + .expect(200) + .end(function(err, res){ + should.not.exist(err); + var body = JSON.parse(res.text); + // console.log(body); + (body.people.length).should.equal(2); + _.pluck(body.people, "name").should.eql(["Sally", "Wally"]); + done(); + }); + }); + }); }); };