Skip to content

Commit 33ac0ff

Browse files
committed
feat: filter by witnet network and pair
1 parent 7efcfc9 commit 33ac0ff

File tree

11 files changed

+188
-25
lines changed

11 files changed

+188
-25
lines changed

packages/api/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class DataFeedsExplorer {
8282
}
8383
this.repositories.feedRepository.setLegacyFeeds(legacyFeeds)
8484
this.repositories.feedRepository.setV2Feeds(v2Feeds)
85+
this.repositories.feedRepository.setConfiguration(this.configuration)
8586

8687
const web3Middleware = new Web3Middleware(
8788
this.configuration,

packages/api/src/repository/Feed.ts

Lines changed: 103 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import { FeedsState } from './feedState'
2-
import { PaginatedFeedsObject, FeedInfo, ConfigByFullName } from '../../types'
2+
import {
3+
PaginatedFeedsObject,
4+
FeedInfo,
5+
ConfigByFullName,
6+
Network,
7+
FeedsFilters,
8+
} from '../../types'
9+
import { Configuration } from '../web3Middleware/Configuration'
310

411
export class FeedRepository {
512
feedsState: FeedsState
6-
// TODO: replace string with Network
13+
dataFeeds: Record<string, Record<Network, Array<FeedInfo>>>
714
dataFeedsByNetwork: Record<string, Array<FeedInfo>>
815
configByFullName: ConfigByFullName
916

@@ -15,15 +22,43 @@ export class FeedRepository {
1522
initialize() {
1623
const feeds = this.feedsState.listFeeds()
1724

25+
this.dataFeeds = feeds.reduce(
26+
(
27+
acc: Record<string, Record<Network, Array<FeedInfo>>>,
28+
feedInfo: FeedInfo,
29+
) => {
30+
let value
31+
const isPairKeyPresent: boolean = !!acc[feedInfo.name]
32+
const isNetworkAndPairKeyPresent: boolean =
33+
isPairKeyPresent && !!acc[feedInfo.name][feedInfo.network]
34+
if (isNetworkAndPairKeyPresent) {
35+
value = [...acc[feedInfo.name][feedInfo.network], feedInfo]
36+
} else {
37+
value = [feedInfo]
38+
}
39+
return {
40+
...acc,
41+
[feedInfo.name]: {
42+
...acc[feedInfo.name],
43+
[feedInfo.network]: value,
44+
},
45+
}
46+
},
47+
{},
48+
)
49+
1850
this.dataFeedsByNetwork = feeds.reduce(
19-
(acc: Record<string, Array<FeedInfo>>, feedInfo: FeedInfo) => ({
20-
...acc,
21-
[feedInfo.network]: acc[feedInfo.network]
22-
? [...acc[feedInfo.network], feedInfo]
23-
: [feedInfo],
24-
}),
51+
(acc: Record<string, Array<FeedInfo>>, feedInfo: FeedInfo) => {
52+
return {
53+
...acc,
54+
[feedInfo.network]: acc[feedInfo.network]
55+
? [...acc[feedInfo.network], feedInfo]
56+
: [feedInfo],
57+
}
58+
},
2559
{},
2660
)
61+
2762
this.configByFullName = feeds.reduce(
2863
(acc, feedInfo) => ({
2964
...acc,
@@ -43,19 +78,65 @@ export class FeedRepository {
4378
.find((feed) => feed.feedFullName === feedFullName)
4479
}
4580

46-
async getFeedsByNetwork(
47-
// starts in 1
48-
network: string,
49-
): Promise<PaginatedFeedsObject> {
50-
let feeds: Array<FeedInfo>
81+
async getFilteredFeeds({
82+
network,
83+
pair,
84+
mainnet,
85+
}: FeedsFilters): Promise<PaginatedFeedsObject> {
86+
let feeds: Array<FeedInfo> = []
5187
if (network === 'all') {
52-
feeds = Object.values(this.dataFeedsByNetwork).flat()
88+
feeds = this.feedsState.listFeeds()
89+
} else {
90+
if (network && pair) {
91+
feeds = this.dataFeeds[pair][network]
92+
} else if (network) {
93+
feeds = this.dataFeedsByNetwork[network]
94+
} else if (pair) {
95+
feeds = Object.values(this.dataFeeds[pair]).flat()
96+
}
97+
}
98+
console.log('data feeds FLAT', this.dataFeedsByNetwork[network])
99+
console.log(`network::${network} pair::${pair} mainnet::${mainnet}`)
100+
return this.getPaginatedFeedsByNet(feeds, mainnet)
101+
}
102+
103+
getPaginatedFeedsByNet(feeds: FeedInfo[], mainnet: boolean | null) {
104+
if (mainnet === null) {
105+
return {
106+
feeds: feeds || [],
107+
total: feeds ? feeds.length : 0,
108+
}
109+
}
110+
if (mainnet) {
111+
return this.getMainnetFeeds(feeds)
53112
} else {
54-
feeds = this.dataFeedsByNetwork[network]
113+
return this.getTestnetFeeds(feeds)
55114
}
115+
}
116+
117+
getConfigurationFromNetwork(network: Network) {
118+
return this.feedsState.getConfiguration().getNetworkConfiguration(network)
119+
}
120+
121+
getTestnetFeeds(feeds: Array<FeedInfo>): PaginatedFeedsObject {
122+
const filteredFeeds: FeedInfo[] =
123+
feeds?.filter(
124+
(feed) => !this.getConfigurationFromNetwork(feed.network).mainnet,
125+
) ?? []
56126
return {
57-
feeds: feeds || [],
58-
total: feeds ? feeds.length : 0,
127+
feeds: filteredFeeds,
128+
total: filteredFeeds.length,
129+
}
130+
}
131+
132+
getMainnetFeeds(feeds: Array<FeedInfo>): PaginatedFeedsObject {
133+
const filteredFeeds: FeedInfo[] =
134+
feeds?.filter(
135+
(feed) => this.getConfigurationFromNetwork(feed.network).mainnet,
136+
) ?? []
137+
return {
138+
feeds: filteredFeeds,
139+
total: filteredFeeds.length,
59140
}
60141
}
61142

@@ -98,4 +179,9 @@ export class FeedRepository {
98179
this.feedsState.setV2Feeds(v2Feeds)
99180
this.initialize()
100181
}
182+
183+
setConfiguration(configuration: Configuration) {
184+
this.feedsState.setConfiguration(configuration)
185+
this.initialize()
186+
}
101187
}

packages/api/src/repository/ResultRequest.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,25 @@ export class ResultRequestRepository {
4848
.map(this.normalizeId)
4949
}
5050

51+
async getFeedRequestsPageByPair(
52+
pair: string,
53+
page: number,
54+
size: number,
55+
): Promise<PaginatedRequests> {
56+
const query = { feedFullName: { $regex: pair } }
57+
return {
58+
requests: (
59+
await this.collection
60+
.find(query)
61+
.sort({ timestamp: -1 })
62+
.skip(size * (page - 1))
63+
.limit(size)
64+
.toArray()
65+
).map(this.normalizeId),
66+
total: (await this.collection.find(query).toArray()).length,
67+
}
68+
}
69+
5170
async getFeedRequestsPage(
5271
feedFullName: string,
5372
page: number,

packages/api/src/repository/feedState.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { FeedInfo } from '../../types'
2+
import { Configuration } from '../web3Middleware/Configuration'
23

34
export class FeedsState {
45
private legacyFeeds: Array<FeedInfo>
56
private v2Feeds: Array<FeedInfo>
7+
private configuration: Configuration
68

79
constructor() {
810
this.legacyFeeds = []
@@ -17,10 +19,18 @@ export class FeedsState {
1719
this.legacyFeeds = legacyFeeds
1820
}
1921

22+
setConfiguration(configuration: Configuration) {
23+
this.configuration = configuration
24+
}
25+
2026
getV2Feeds(): Array<FeedInfo> {
2127
return this.v2Feeds
2228
}
2329

30+
getConfiguration(): Configuration {
31+
return this.configuration
32+
}
33+
2434
getLegacyFeeds(): Array<FeedInfo> {
2535
return this.legacyFeeds
2636
}

packages/api/src/resolvers.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ import { Context } from '../types'
33
const resolvers = {
44
Query: {
55
feeds: async (_parent, args, { feedRepository }: Context) => {
6-
return await feedRepository.getFeedsByNetwork(args.network)
6+
console.log(args.network)
7+
return await feedRepository.getFilteredFeeds({
8+
network: args.network,
9+
pair: args.pair,
10+
mainnet: args.mainnet,
11+
})
712
},
813

914
networks: (_parent, _args, { config }: Context) => {

packages/api/src/typeDefs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const typeDefs = gql`
6363
6464
type Query {
6565
feed(feedFullName: String!): Feed
66-
feeds(network: String): FeedsPage!
66+
feeds(network: String, mainnet: Boolean, pair: String): FeedsPage!
6767
requests(
6868
feedFullName: String!
6969
page: Int!

packages/api/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ export type ConfigByFullName = {
4040
[key: string]: FeedInfo
4141
}
4242

43+
export type NetworkConfigByNetwork = {
44+
[key: string]: Configuration
45+
}
46+
4347
export enum Network {
4448
ArbitrumOne = 'arbitrum-one',
4549
ArbitrumGoerli = 'arbitrum-goerli',
@@ -259,6 +263,12 @@ export type LegacyRouterDataFeedsConfig = {
259263
chains: Record<string, Chain>
260264
}
261265

266+
export type FeedsFilters = {
267+
network: string | null
268+
pair: string | null
269+
mainnet: boolean
270+
}
271+
262272
export type FeedInfosWithoutAbis = Array<
263273
Omit<FeedInfoConfig, 'abi' | 'routerAbi'>
264274
>

packages/ui/api/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,22 @@ function getApiEndpoint() {
1010
return useRuntimeConfig().public.apiBase
1111
}
1212

13-
export const getAllFeedsRequests = async ({ network }: { network: string }) =>
13+
export const getAllFeedsRequests = async ({
14+
network,
15+
mainnet,
16+
pair,
17+
}: {
18+
network: string | null
19+
mainnet: boolean | null
20+
pair: string | null
21+
}) =>
1422
(await request(
1523
getApiEndpoint(),
1624
feedsQuery,
1725
{
1826
network,
27+
mainnet,
28+
pair,
1929
},
2030
{ accept: 'application/json' },
2131
)) as {

packages/ui/api/queries/feeds.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { gql } from 'graphql-request'
22

33
export default gql`
4-
query feeds($network: String!) {
5-
feeds(network: $network) {
4+
query feeds($network: String, $mainnet: Boolean, $pair: String) {
5+
feeds(network: $network, mainnet: $mainnet, pair: $pair) {
66
feeds {
77
isRouted
88
feedFullName

packages/ui/components/DataFeeds.vue

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,23 @@ watch(networkFeeds, () => {
9494
}
9595
})
9696
onMounted(async () => {
97-
networkFeeds.value = await store.fetchFeeds({
97+
const fetchedNetworks = await store.fetchFeeds({
9898
network: props.network.key.toLowerCase(),
99+
mainnet: null,
99100
})
101+
// const fetchedByPair = await store.fetchFeeds({
102+
// mainnet: null,
103+
// pair: 'eth/usd',
104+
// })
105+
// const fetchedByPairAndNetwork = await store.fetchFeeds({
106+
// mainnet: null,
107+
// network: props.network.key.toLowerCase(),
108+
// pair: 'eth/usd',
109+
// })
110+
console.log('fetch by network', fetchedNetworks)
111+
// console.log('Fetch eth/usd feeds >>>', fetchedByPair)
112+
// console.log('Fetch eth/usd and avalanche feeds >>>', fetchedByPairAndNetwork)
113+
networkFeeds.value = fetchedNetworks
100114
})
101115
</script>
102116

0 commit comments

Comments
 (0)