diff --git a/src/db/services/dappAnalyticsService.ts b/src/db/services/dappAnalyticsService.ts index 59db1a1..f042256 100644 --- a/src/db/services/dappAnalyticsService.ts +++ b/src/db/services/dappAnalyticsService.ts @@ -134,6 +134,7 @@ interface ArgFilter { interface GetMetricsRequest { breakdown?: boolean; filters?: Filter[]; + segmentId?: string; } interface Filter { name?: string; @@ -156,12 +157,20 @@ const buildQueryForFilter = ( dAppId: string, filter: Filter, breakdown: boolean, - metric: "wallets" | "interactions" | "transferredTokens" + metric: "wallets" | "interactions" | "transferredTokens", + segmentId?: string ): { query: string; values: any[] } => { const dapp_activity_table = `"dapp_analytics"."dapp_analytics_${dAppId}"`; const conditions: string[] = []; const values: any[] = []; + if (segmentId) { + const segment_members_table = `"dapp_analytics"."segment_members_${dAppId}"`; + const segmentQuery = `(SELECT user_address FROM ${segment_members_table} WHERE segment_id = ?)`; + conditions.push(`src.caller IN ${segmentQuery}`); + values.push(segmentId); + } + if (filter.name) { conditions.push("src.name ILIKE ? "); values.push(`%${filter.name.replace("::", "_")}%`); @@ -254,13 +263,15 @@ const getDataForFilter = async ( dAppId: string, filter: Filter, breakdown: boolean, - metric: "wallets" | "interactions" | "transferredTokens" + metric: "wallets" | "interactions" | "transferredTokens", + segmentId?: string ): Promise | number>>> => { const { query, values } = buildQueryForFilter( dAppId, filter, breakdown, - metric + metric, + segmentId ); try { @@ -565,6 +576,7 @@ const intersectWalletsByDay = ( return result; }; + export const getUniqueWallets = async ( dAppId: string, body: GetMetricsRequest @@ -574,10 +586,11 @@ export const getUniqueWallets = async ( ? body.filters : [{ name: null, type: null, args: {} }]; const breakdown = body.breakdown || false; + const segmentId = body.segmentId; const filterResults = await Promise.all( filters.map((filter) => - getDataForFilter(dAppId, filter, breakdown, "wallets") + getDataForFilter(dAppId, filter, breakdown, "wallets", segmentId) ) ); @@ -596,10 +609,11 @@ export const getInteractions = async ( ? body.filters : [{ name: null, type: null, args: {} }]; const breakdown = body.breakdown || false; + const segmentId = body.segmentId; const filterResults = await Promise.all( filters.map((filter) => - getDataForFilter(dAppId, filter, breakdown, "interactions") + getDataForFilter(dAppId, filter, breakdown, "interactions", segmentId) ) ); @@ -618,10 +632,17 @@ export const getTransferredTokens = async ( ? body.filters : [{ name: null, type: null, args: {} }]; const breakdown = body.breakdown || false; + const segmentId = body.segmentId; const filterResults = await Promise.all( filters.map((filter) => - getDataForFilter(dAppId, filter, breakdown, "transferredTokens") + getDataForFilter( + dAppId, + filter, + breakdown, + "transferredTokens", + segmentId + ) ) ); diff --git a/src/validation/dapp-analytics-validations.ts b/src/validation/dapp-analytics-validations.ts index d41814b..fc8844b 100644 --- a/src/validation/dapp-analytics-validations.ts +++ b/src/validation/dapp-analytics-validations.ts @@ -164,6 +164,7 @@ export const dappDataMetricsValidation = { ), }) ), + segmentId: Joi.string(), }), };