Add pagination for .all methods

I removed rsvp as a dependency as we only use Promise.all
This commit is contained in:
fsmanuel 2019-04-12 21:20:06 +02:00
parent b6c06c289c
commit f6189bf910
6 changed files with 66 additions and 40 deletions

View File

@ -1,20 +1,13 @@
const ethers = require('ethers');
const ContributionSerializer = require('../serializers/contribution');
const Base = require('./base'); const Base = require('./base');
const ContributionSerializer = require('../serializers/contribution');
const paged = require('../utils/pagination');
class Contribution extends Base { class Contribution extends Base {
all() { all(options = {}) {
return this.functions.contributionsCount() return this.functions.contributionsCount()
.then(async (count) => { .then((count) => {
let contributions = []; let records = paged(count, options).map((id) => this.getById(id));
return Promise.all(records);
for (let id = 1; id <= count; id++) {
const contribution = await this.getById(id)
contributions.push(contribution);
}
return contributions;
}); });
} }

View File

@ -1,19 +1,13 @@
const RSVP = require('rsvp');
const ContributorSerializer = require('../serializers/contributor');
const Base = require('./base'); const Base = require('./base');
const ContributorSerializer = require('../serializers/contributor');
const paged = require('../utils/pagination');
class Contributor extends Base { class Contributor extends Base {
all() { all(options = {}) {
return this.functions.contributorsCount() return this.functions.contributorsCount()
.then(count => { .then((count) => {
let contributors = []; let records = paged(count, options).map((id) => this.getById(id));
return Promise.all(records);
for (let id = 1; id <= count; id++) {
contributors.push(this.getById(id));
}
return RSVP.all(contributors);
}); });
} }

View File

@ -1,19 +1,13 @@
const RSVP = require('rsvp');
const ContributionSerializer = require('../serializers/contribution');
const Base = require('./base'); const Base = require('./base');
const ContributionSerializer = require('../serializers/contribution');
const paged = require('../utils/pagination');
class Proposal extends Base { class Proposal extends Base {
all() { all(options = {}) {
return this.functions.proposalsCount() return this.functions.proposalsCount()
.then(count => { .then((count) => {
let proposals = []; let records = paged(count, options).map((id) => this.getById(id));
return Promise.all(records);
for (let id = 1; id <= count; id++) {
proposals.push(this.getById(id));
}
return RSVP.all(proposals);
}); });
} }

View File

@ -1,5 +1,4 @@
const ethers = require('ethers'); const ethers = require('ethers');
const RSVP = require('rsvp');
const Preflight = require('./utils/preflight'); const Preflight = require('./utils/preflight');
@ -57,7 +56,8 @@ class Kredits {
); );
}); });
}); });
return RSVP.all(addressPromises).then(() => { return this });
return Promise.all(addressPromises).then(() => { return this });
}); });
} }

46
lib/utils/pagination.js Normal file
View File

@ -0,0 +1,46 @@
function pageNumber(number, size, recordCount) {
let numberOfPages = Math.ceil(recordCount / size);
number = parseInt(number) || 1;
// Ensure page number is in range
number = number < 1 ? 1 : number;
number = number > numberOfPages ? numberOfPages : number;
return number;
}
function buildIds(order, number, size, recordCount) {
let offset = size * (number - 1);
let start;
let mapFunction;
if (order === 'asc') {
start = 1 + offset;
mapFunction = (_, i) => start + i;
} else {
start = recordCount - offset;
mapFunction = (_, i) => start - i;
}
// Ensure size is in range
let end = offset + size;
if (end > recordCount) {
let diff = end - recordCount;
size = size - diff;
}
return Array.from({ length: size }, mapFunction);
}
module.exports = function paged(recordCount, options = {}) {
let { order, page } = options;
order = order || 'desc';
page = page || {};
let size = parseInt(page.size) || 25;
let number = pageNumber(page.number, size, recordCount);
return buildIds(order, number, size, recordCount);
};

View File

@ -46,7 +46,6 @@
"ethers": "^4.0.27", "ethers": "^4.0.27",
"ipfs-http-client": "^30.1.1", "ipfs-http-client": "^30.1.1",
"kosmos-schemas": "github:67P/kosmos-schemas#feature/contribution_date_time", "kosmos-schemas": "github:67P/kosmos-schemas#feature/contribution_date_time",
"rsvp": "^4.8.2",
"tv4": "^1.3.0" "tv4": "^1.3.0"
}, },
"keywords": [ "keywords": [