Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

Commit

Permalink
feat(helpers): Add gqlFetchAll to AppToolkit (#792)
Browse files Browse the repository at this point in the history
  • Loading branch information
FiboApe committed Jun 29, 2022
1 parent 44a6e64 commit 5d81318
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 80 deletions.
69 changes: 68 additions & 1 deletion src/app-toolkit/helpers/the-graph/the-graph.helper.ts
Expand Up @@ -16,18 +16,85 @@ type RequestGraphParams = {
headers?: Record<string, string>;
};

interface gqlFetchAllParams<T> {
query: string;
endpoint: string;
variables?: Variables;
dataToSearch: string;
offset?: number;
first?: number;
prevResults?: T;
}

@Injectable()
export class TheGraphHelper {
async request<T = any>({ endpoint, query, variables, headers }: RequestParams) {
const client = new GraphQLClient(endpoint, { headers });
return client.request<T>(query, variables);
}

async requestGraph<T>({ endpoint, query, variables = {} }: RequestGraphParams) {
async requestGraph<T = any>({ endpoint, query, variables = {} }: RequestGraphParams) {
const presentQuery = typeof query === 'string' ? query : query.present;
const pastQuery = typeof query === 'string' ? null : query.past;
const finalQuery = typeof variables.blockTag === 'number' && pastQuery ? pastQuery : presentQuery;

return this.request<T>({ endpoint, query: finalQuery, variables });
}

async gqlFetchAll<T = any>({
query,
endpoint,
variables = {},
dataToSearch,
offset = 0,
first = 1000,
prevResults,
}: gqlFetchAllParams<T>): Promise<T> {
const results = await this.requestGraph<T>({
endpoint,
query,
variables: {
...variables,
first: first,
skip: offset,
},
});

if (results[dataToSearch].length === first) {
let newPrevResults = results;
if (prevResults) {
newPrevResults = {
...prevResults,
...results,
[dataToSearch]: [
...prevResults[dataToSearch],
...results[dataToSearch],
],
};
}

return this.gqlFetchAll({
query,
endpoint,
variables,
dataToSearch,
first: first,
offset: offset + first,
prevResults: newPrevResults,
});
}

if (prevResults) {
return {
...prevResults,
...results,
[dataToSearch]: [
...prevResults[dataToSearch],
...results[dataToSearch],
],
};
} else {
return results;
}
}
}
82 changes: 3 additions & 79 deletions src/apps/mean-finance/helpers/graph.ts
@@ -1,81 +1,8 @@
import { gql } from 'graphql-request';

import { TheGraphHelper } from '~app-toolkit/helpers/the-graph/the-graph.helper';
import { GET_PAIRS } from '../graphql/getPairs';
import { GET_POSITIONS } from '../graphql/getPositions';
import { GET_USER_POSITIONS } from '../graphql/getUserPositions';

interface gqlFetchAllParams<T> {
graphHelper: TheGraphHelper;
query: string;
endpoint: string;
variables: any;
dataToSearch: string;
offset?: number;
first?: number;
prevResults?: T;
}
export const gqlFetchAll = async <T>({
graphHelper,
query,
endpoint,
variables,
dataToSearch,
offset,
first,
prevResults,
}: gqlFetchAllParams<T>): Promise<T> => {
const firstToUse = first || 1000;
const offsetToUse = offset || 0;

const results = await graphHelper.requestGraph<T>({
endpoint,
query,
variables: {
...variables,
first: firstToUse,
skip: offsetToUse,
},
});

if (results[dataToSearch].length === firstToUse + offsetToUse) {
let newPrevResults = results;
if (prevResults) {
newPrevResults = {
...prevResults,
...results,
[dataToSearch]: [
...prevResults[dataToSearch],
...results[dataToSearch],
],
};
}
return gqlFetchAll({
graphHelper,
query,
endpoint,
variables,
dataToSearch,
first: offsetToUse + firstToUse,
offset: firstToUse,
prevResults: newPrevResults,
});
}

if (prevResults) {
return {
...prevResults,
...results,
[dataToSearch]: [
...prevResults[dataToSearch],
...results[dataToSearch],
],
};
} else {
return results;
}
}

type MeanFinancePosition = {
positions: {
id: string;
Expand Down Expand Up @@ -109,8 +36,7 @@ type MeanFinancePosition = {
};

export const getUserPositions = (address: string, network: string, graphHelper: TheGraphHelper) => {
return gqlFetchAll<MeanFinancePosition>({
graphHelper,
return graphHelper.gqlFetchAll<MeanFinancePosition>({
endpoint: `https://api.thegraph.com/subgraphs/name/mean-finance/dca-v2-${network}`,
query: GET_USER_POSITIONS,
variables: { address },
Expand All @@ -119,8 +45,7 @@ export const getUserPositions = (address: string, network: string, graphHelper:
};

export const getPositions = (network: string, graphHelper: TheGraphHelper) => {
return gqlFetchAll<MeanFinancePosition>({
graphHelper,
return graphHelper.gqlFetchAll<MeanFinancePosition>({
endpoint: `https://api.thegraph.com/subgraphs/name/mean-finance/dca-v2-${network}`,
query: GET_POSITIONS,
variables: {},
Expand All @@ -147,8 +72,7 @@ type MeanFinancePair = {
};

export const getPairs = (network: string, graphHelper: TheGraphHelper) => {
return gqlFetchAll<MeanFinancePair>({
graphHelper,
return graphHelper.gqlFetchAll<MeanFinancePair>({
endpoint: `https://api.thegraph.com/subgraphs/name/mean-finance/dca-v2-${network}`,
query: GET_PAIRS,
variables: {},
Expand Down

0 comments on commit 5d81318

Please sign in to comment.