Skip to content
This repository was archived by the owner on Aug 12, 2023. It is now read-only.

Commit 3ec58f8

Browse files
authored
Add pagination to token relayers endpoint (#368)
1 parent c7955a5 commit 3ec58f8

2 files changed

Lines changed: 69 additions & 32 deletions

File tree

src/app/routes/v1/token.js

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,14 @@ const createRouter = () => {
4747
['fillCount', 'fillVolumeUSD', 'tradeCount', 'tradeVolumeUSD'],
4848
'tradeVolumeUSD',
4949
),
50-
middleware.limit(50, 10),
51-
async ({ params, response }, next) => {
52-
const { limit, sortBy, statsPeriod, tokenAddress } = params;
50+
middleware.pagination({
51+
defaultLimit: 20,
52+
maxLimit: 50,
53+
maxPage: Infinity,
54+
}),
55+
async ({ pagination, params, response }, next) => {
56+
const { sortBy, statsPeriod, tokenAddress } = params;
57+
const { limit, page } = pagination;
5358

5459
const token = await Token.findOne({
5560
address: tokenAddress,
@@ -61,13 +66,25 @@ const createRouter = () => {
6166
return;
6267
}
6368

64-
const relayers = await getRelayersForTokenInPeriod(
69+
const { relayers, resultCount } = await getRelayersForTokenInPeriod(
6570
tokenAddress,
6671
statsPeriod,
67-
{ sortBy, limit },
72+
{
73+
sortBy,
74+
limit,
75+
page,
76+
},
6877
);
6978

70-
response.body = { limit, relayers, sortBy, statsPeriod };
79+
response.body = {
80+
limit,
81+
page,
82+
pageCount: Math.ceil(resultCount / limit),
83+
relayers,
84+
sortBy,
85+
statsPeriod,
86+
total: resultCount,
87+
};
7188

7289
await next();
7390
},

src/relayers/get-relayers-for-token-in-period.js

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ const getOrderByKey = sortBy => {
1313
};
1414

1515
const getRelayersForTokenInPeriod = async (tokenAddress, period, options) => {
16-
const { limit, sortBy } = options;
16+
const { limit, page, sortBy } = options;
1717
const { dateFrom, dateTo } = getDatesForPeriod(period);
1818

19+
const startIndex = (page - 1) * limit;
20+
1921
const response = await elasticsearch.getClient().search({
2022
index: 'traded_tokens',
2123
body: {
@@ -42,7 +44,7 @@ const getRelayersForTokenInPeriod = async (tokenAddress, period, options) => {
4244
stats_by_relayer: {
4345
terms: {
4446
field: 'relayerId',
45-
size: limit,
47+
size: limit * page,
4648
missing: -1,
4749
order: {
4850
[getOrderByKey(sortBy)]: 'desc',
@@ -74,6 +76,17 @@ const getRelayersForTokenInPeriod = async (tokenAddress, period, options) => {
7476
field: 'tradedAmountUSD',
7577
},
7678
},
79+
bucket_truncate: {
80+
bucket_sort: {
81+
size: limit,
82+
from: startIndex,
83+
},
84+
},
85+
},
86+
},
87+
relayerCount: {
88+
cardinality: {
89+
field: 'relayerId',
7790
},
7891
},
7992
},
@@ -86,32 +99,39 @@ const getRelayersForTokenInPeriod = async (tokenAddress, period, options) => {
8699

87100
const relayers = await Relayer.find({ lookupId: { $in: relayerIds } }).lean();
88101

89-
return response.body.aggregations.stats_by_relayer.buckets.map(bucket => {
90-
const relayer =
91-
bucket.key === -1
92-
? { id: 'unknown', name: 'Unknown', slug: 'unknown' }
93-
: relayers.find(r => r.lookupId === bucket.key);
102+
const relayerCount = response.body.aggregations.relayerCount.value;
94103

95-
return {
96-
id: _.get(relayer, 'id', null),
97-
imageUrl: _.get(relayer, 'imageUrl', null),
98-
name: _.get(relayer, 'name', null),
99-
slug: _.get(relayer, 'slug', null),
100-
stats: {
101-
fillCount: bucket.doc_count,
102-
fillVolume: {
103-
token: bucket.fillVolume.value,
104-
USD: bucket.fillVolumeUSD.value,
105-
},
106-
tradeCount: bucket.tradeCount.value,
107-
tradeVolume: {
108-
token: bucket.tradeVolume.value,
109-
USD: bucket.tradeVolumeUSD.value,
110-
},
104+
return {
105+
relayers: response.body.aggregations.stats_by_relayer.buckets.map(
106+
bucket => {
107+
const relayer =
108+
bucket.key === -1
109+
? { id: 'unknown', name: 'Unknown', slug: 'unknown' }
110+
: relayers.find(r => r.lookupId === bucket.key);
111+
112+
return {
113+
id: _.get(relayer, 'id', null),
114+
imageUrl: _.get(relayer, 'imageUrl', null),
115+
name: _.get(relayer, 'name', null),
116+
slug: _.get(relayer, 'slug', null),
117+
stats: {
118+
fillCount: bucket.doc_count,
119+
fillVolume: {
120+
token: bucket.fillVolume.value,
121+
USD: bucket.fillVolumeUSD.value,
122+
},
123+
tradeCount: bucket.tradeCount.value,
124+
tradeVolume: {
125+
token: bucket.tradeVolume.value,
126+
USD: bucket.tradeVolumeUSD.value,
127+
},
128+
},
129+
url: _.get(relayer, 'url', null),
130+
};
111131
},
112-
url: _.get(relayer, 'url', null),
113-
};
114-
});
132+
),
133+
resultCount: relayerCount,
134+
};
115135
};
116136

117137
module.exports = getRelayersForTokenInPeriod;

0 commit comments

Comments
 (0)