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

Commit 7282b5d

Browse files
authored
Improve lookup endpoint suggestions (#396)
* Add better suggestions to relayer lookup * Improve token lookup suggestions
1 parent 4d19b1f commit 7282b5d

File tree

4 files changed

+163
-21
lines changed

4 files changed

+163
-21
lines changed

src/app/routes/v1/relayer-lookup.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ const createRouter = () => {
1111

1212
const limit =
1313
request.query.limit !== undefined ? _.toNumber(request.query.limit) : 5;
14-
const relayers = await searchRelayers(q, { limit });
14+
const relayers = await searchRelayers(q || null, { limit });
1515

1616
response.body = {
1717
limit,
1818
relayers: relayers.map(relayer => relayer),
19-
q,
19+
q: q || null,
2020
};
2121

2222
await next();

src/app/routes/v1/token-lookup.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,20 @@ const createRouter = () => {
1313

1414
const limit =
1515
request.query.limit !== undefined ? _.toNumber(request.query.limit) : 5;
16-
const tokens = await searchTokens(q, { limit });
16+
const tokens = await searchTokens(q || null, { limit });
1717

1818
response.body = {
1919
limit,
2020
tokens: tokens.map(token => ({
2121
address: token.address,
22-
circulatingSupply: _.get(token, 'circulatingSupply', null),
2322
imageUrl: _.isString(token.imageUrl)
2423
? getCdnTokenImageUrl(token.imageUrl)
2524
: null,
2625
name: _.get(token, 'name', null),
2726
symbol: _.get(token, 'symbol', null),
28-
totalSupply: _.get(token, 'totalSupply', null),
2927
type: formatTokenType(token.type),
3028
})),
31-
q,
29+
q: q || null,
3230
};
3331

3432
await next();

src/relayers/search-relayers.js

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,89 @@
1+
const moment = require('moment');
2+
3+
const elasticsearch = require('../util/elasticsearch');
14
const Relayer = require('../model/relayer');
25

6+
const getSuggestedRelayers = async limit => {
7+
const response = await elasticsearch.getClient().search({
8+
index: 'fills',
9+
body: {
10+
aggs: {
11+
relayers: {
12+
terms: {
13+
field: 'relayerId',
14+
order: { tradeVolume: 'desc' },
15+
size: limit,
16+
},
17+
aggs: {
18+
tradeVolume: {
19+
sum: {
20+
field: 'tradeVolume',
21+
},
22+
},
23+
bucket_truncate: {
24+
bucket_sort: {
25+
size: limit,
26+
},
27+
},
28+
},
29+
},
30+
relayerCount: {
31+
cardinality: {
32+
field: 'relayerId',
33+
},
34+
},
35+
},
36+
size: 0,
37+
query: {
38+
range: {
39+
date: {
40+
gte: moment()
41+
.subtract(30, 'days')
42+
.toDate(),
43+
},
44+
},
45+
},
46+
},
47+
});
48+
49+
const relayerBuckets = response.body.aggregations.relayers.buckets;
50+
const relayerIds = relayerBuckets.map(bucket => bucket.key);
51+
const relayers = await Relayer.find({ lookupId: { $in: relayerIds } }).lean();
52+
53+
const relayersWithStats = relayerBuckets.map(bucket => {
54+
const relayer = relayers.find(r => r.lookupId === bucket.key);
55+
56+
return {
57+
id: relayer.id,
58+
imageUrl: relayer.imageUrl,
59+
name: relayer.name,
60+
slug: relayer.slug,
61+
url: relayer.url,
62+
};
63+
});
64+
65+
return relayersWithStats;
66+
};
67+
368
const searchRelayers = async (query, options) => {
4-
const relayers = await Relayer.find(
5-
query.length > 0 ? { name: new RegExp(query, 'ig') } : {},
6-
)
69+
if (query === '' || query === null) {
70+
const relayers = await getSuggestedRelayers(options.limit);
71+
72+
return relayers;
73+
}
74+
75+
const relayers = await Relayer.find({ name: new RegExp(query, 'ig') })
776
.sort({ name: 1 })
877
.limit(options.limit)
978
.lean();
1079

11-
return relayers;
80+
return relayers.map(relayer => ({
81+
id: relayer.id,
82+
imageUrl: relayer.imageUrl,
83+
name: relayer.name,
84+
slug: relayer.slug,
85+
url: relayer.url,
86+
}));
1287
};
1388

1489
module.exports = searchRelayers;

src/tokens/search-tokens.js

Lines changed: 80 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,86 @@
1+
const moment = require('moment');
2+
3+
const elasticsearch = require('../util/elasticsearch');
14
const Token = require('../model/token');
25

3-
const searchTokens = async (query, options) => {
4-
const tokens = await Token.find(
5-
query.length > 0
6-
? {
7-
$or: [
8-
{ address: query },
9-
{ name: new RegExp(query, 'ig') },
10-
{ symbol: new RegExp(query, 'ig') },
6+
const getSuggestedTokens = async limit => {
7+
const res = await elasticsearch.getClient().search({
8+
index: 'traded_tokens',
9+
body: {
10+
aggs: {
11+
tokenStats: {
12+
terms: {
13+
field: 'tokenAddress',
14+
order: { tradeVolumeUSD: 'desc' },
15+
size: limit,
16+
},
17+
aggs: {
18+
tradeVolumeUSD: {
19+
sum: { field: 'tradedAmountUSD' },
20+
},
21+
bucket_truncate: {
22+
bucket_sort: {
23+
size: limit,
24+
},
25+
},
26+
},
27+
},
28+
},
29+
size: 0,
30+
query: {
31+
bool: {
32+
filter: [
33+
{
34+
range: {
35+
date: {
36+
gte: moment()
37+
.subtract(30, 'days')
38+
.toDate(),
39+
},
40+
},
41+
},
1142
],
12-
}
13-
: {},
14-
)
43+
},
44+
},
45+
},
46+
});
47+
48+
const { buckets } = res.body.aggregations.tokenStats;
49+
const tokenAddresses = buckets.map(x => x.key);
50+
51+
const tokens = await Token.find({
52+
address: { $in: tokenAddresses },
53+
}).lean();
54+
55+
return buckets.map(bucket => {
56+
const token = tokens.find(t => t.address === bucket.key);
57+
58+
const { address, imageUrl, name, symbol, type } = token;
59+
60+
return {
61+
address,
62+
imageUrl,
63+
name,
64+
symbol,
65+
type,
66+
};
67+
});
68+
};
69+
70+
const searchTokens = async (query, options) => {
71+
if (query === '' || query === null) {
72+
const tokens = await getSuggestedTokens(options.limit);
73+
74+
return tokens;
75+
}
76+
77+
const tokens = await Token.find({
78+
$or: [
79+
{ address: query },
80+
{ name: new RegExp(query, 'ig') },
81+
{ symbol: new RegExp(query, 'ig') },
82+
],
83+
})
1584
.sort({ name: 1 })
1685
.limit(options.limit)
1786
.lean();

0 commit comments

Comments
 (0)