From 08bcee21fb1bf9d79bb8f5dfde8c41ea5fb56927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B8b=C4=97rt=C3=B8?= <106074508+EchoDex@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:42:10 +0400 Subject: [PATCH] feat: update logic related to filters --- src/IndexerApi.ts | 35 +++---------- src/interface.ts | 3 +- src/query/index.ts | 87 +++++--------------------------- src/utils/generateWhereFilter.ts | 42 +++++++++++++++ 4 files changed, 64 insertions(+), 103 deletions(-) create mode 100644 src/utils/generateWhereFilter.ts diff --git a/src/IndexerApi.ts b/src/IndexerApi.ts index 240a7a0..02f8069 100644 --- a/src/IndexerApi.ts +++ b/src/IndexerApi.ts @@ -6,6 +6,7 @@ import { } from "@apollo/client"; import BN from "./utils/BN"; +import { generateWhereFilter } from "./utils/generateWhereFilter"; import { GraphClient } from "./utils/GraphClient"; import { ActiveOrderReturn, @@ -55,15 +56,7 @@ export class IndexerApi extends GraphClient { subscribeTradeOrderEvents = ( params: GetTradeOrderEventsParams, ): Observable> => { - const generateWhereFilter = (params: GetTradeOrderEventsParams) => { - const where: any = {}; - - if (params.market) { - where.market = { _eq: params.market }; - } - - return where; - }; + const { limit, ...restParams } = params; const query = gql` subscription ( @@ -99,31 +92,15 @@ export class IndexerApi extends GraphClient { }>({ query, variables: { - limit: params.limit, + limit, orderBy: "desc", - where: generateWhereFilter(params), + where: generateWhereFilter(restParams), }, }); }; getVolume = async (params: GetTradeOrderEventsParams): Promise => { - const generateWhereFilter = ( - params: GetTradeOrderEventsParams & { - timestamp: string; - }, - ) => { - const where: any = {}; - - if (params.market) { - where.market = { _eq: params.market }; - } - - if (params.timestamp) { - where.timestamp = { _gte: params.timestamp }; - } - - return where; - }; + const { limit, ...restParams } = params; const now = new Date(); const dayMilliseconds = 24 * 60 * 60 * 1000; const yesterday = new Date(now.getTime() - dayMilliseconds); @@ -150,7 +127,7 @@ export class IndexerApi extends GraphClient { query, variables: { where: generateWhereFilter({ - ...params, + ...restParams, timestamp, }), }, diff --git a/src/interface.ts b/src/interface.ts index d08ee0d..416a6ab 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -95,7 +95,7 @@ export interface WithdrawAllType { export interface GetOrdersParams { limit: number; - market: string[]; + market?: string[]; orderType?: OrderType; status?: Status[]; user?: string; @@ -166,6 +166,7 @@ export interface Order { status: Status; user: string; timestamp: string; + market: string; } export interface GetTradeOrderEventsParams { diff --git a/src/query/index.ts b/src/query/index.ts index ba2be1d..51d174a 100644 --- a/src/query/index.ts +++ b/src/query/index.ts @@ -1,4 +1,5 @@ import { gql, QueryOptions } from "@apollo/client"; +import { generateWhereFilter } from "src/utils/generateWhereFilter"; import { GetActiveOrdersParams, GetOrdersParams } from ".."; @@ -6,50 +7,9 @@ export const getOrdersQuery = ( type: "query" | "subscription", params: GetOrdersParams, ): QueryOptions => { - const generateWhereFilter = (params: GetOrdersParams) => { - const where: any = {}; - - if (params.orderType) { - where.orderType = { _eq: params.orderType }; - } - - if (params.market) { - where.market = { _eq: params.market }; - } - - if (params.market?.length) { - if (params.market.length > 1) { - where._or = params.market.map((market: string) => ({ - market: { _eq: market }, - })); - } else { - where.market = { _eq: params.market[0] }; - } - } - - if (params.status?.length) { - if (params.status.length > 1) { - where._or = params.status.map((status: string) => ({ - status: { _eq: status }, - })); - } else { - where.status = { _eq: params.status[0] }; - } - } - - if (params.user) { - where.user = { _eq: params.user }; - } - - if (params.asset) { - where.asset = { _eq: params.asset }; - } - - return where; - }; - - const priceOrder = params.orderType === "Buy" ? "desc" : "asc"; - const offsetInRange = params.offset ?? 0; + const { limit, orderType, offset, ...restParams } = params; + const priceOrder = orderType === "Buy" ? "desc" : "asc"; + const offsetInRange = offset ?? 0; const query = gql` ${type} OrderQuery( @@ -68,6 +28,7 @@ export const getOrdersQuery = ( status user timestamp + market } } `; @@ -75,9 +36,9 @@ export const getOrdersQuery = ( return { query, variables: { - limit: params.limit, + limit, offset: offsetInRange, - where: generateWhereFilter(params), + where: generateWhereFilter(restParams), priceOrder, }, }; @@ -87,31 +48,10 @@ export const getActiveOrdersQuery = ( type: "query" | "subscription", params: GetActiveOrdersParams, ): QueryOptions => { - const generateWhereFilter = (params: GetActiveOrdersParams) => { - const where: any = {}; - - if (params.orderType) { - where.orderType = { _eq: params.orderType }; - } - - if (params.market) { - where.market = { _eq: params.market }; - } - - if (params.user) { - where.user = { _eq: params.user }; - } - - if (params.asset) { - where.asset = { _eq: params.asset }; - } - - return where; - }; - - const priceOrder = params.orderType === "Buy" ? "desc" : "asc"; - const queryObject = `Active${params.orderType}Order`; - const offsetInRange = params.offset ?? 0; + const { limit, orderType, offset, ...restParams } = params; + const priceOrder = orderType === "Buy" ? "desc" : "asc"; + const queryObject = `Active${orderType}Order`; + const offsetInRange = offset ?? 0; const query = gql` ${type} ${queryObject}Query( @@ -130,6 +70,7 @@ export const getActiveOrdersQuery = ( status user timestamp + market } } `; @@ -137,9 +78,9 @@ export const getActiveOrdersQuery = ( return { query, variables: { - limit: params.limit, + limit, offset: offsetInRange, - where: generateWhereFilter(params), + where: generateWhereFilter(restParams), priceOrder, }, }; diff --git a/src/utils/generateWhereFilter.ts b/src/utils/generateWhereFilter.ts new file mode 100644 index 0000000..c405169 --- /dev/null +++ b/src/utils/generateWhereFilter.ts @@ -0,0 +1,42 @@ +type ComparisonOperator = { + _eq?: any; +}; + +type Condition = { + [key: string]: ComparisonOperator; +}; + +interface WhereFilter { + [key: string]: ComparisonOperator | Condition[] | undefined; + _or?: Condition[]; +} + +export const generateWhereFilter = ( + params: Record, +): WhereFilter => { + const where: WhereFilter = {}; + + for (const key in params) { + const value = params[key]; + + if (Array.isArray(value) && value.length) { + if (value.length === 1) { + where[key] = { _eq: value[0] }; + } else { + const orConditions = value.map((v) => ({ + [key]: { _eq: v }, + })); + + if (where._or) { + where._or = where._or.concat(orConditions); + } else { + where._or = orConditions; + } + } + } else if (value) { + where[key] = { _eq: value }; + } + } + + return where; +};