From 765f6a2ac8d8879613c0127ebab846060b0d2d23 Mon Sep 17 00:00:00 2001 From: Christopher Cali Date: Tue, 22 Aug 2023 13:59:30 -0400 Subject: [PATCH] Commit small changes before switching branches --- apps/web/src/composables/contracts.ts | 2 +- apps/web/src/composables/users.ts | 19 ++++++++--- services/users/src/routes/analytics.ts | 45 +++++++++++++++++++++----- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/apps/web/src/composables/contracts.ts b/apps/web/src/composables/contracts.ts index 43489289e..b43fc9f8d 100644 --- a/apps/web/src/composables/contracts.ts +++ b/apps/web/src/composables/contracts.ts @@ -108,7 +108,7 @@ export default function useContracts() { const stakedDepositedETH = userEventTotalsSum.StakeDeposited const withdrawalInitiatedETH = userEventTotalsSum.WithdrawalInitiated - /* Get User's All Time Rewards by Subtracting (StakeDesposited + WithdrawalInitiated) from CurrentStake */ + /* Get User's All Time Rewards by Subtracting (StakeDeposited + WithdrawalInitiated) from CurrentStake */ const currentUserStakeMinusEvents = currentUserStakeETH - (stakedDepositedETH as number) - (withdrawalInitiatedETH as number) return { eth: `${formatNumber(currentUserStakeMinusEvents)} ETH`, diff --git a/apps/web/src/composables/users.ts b/apps/web/src/composables/users.ts index fb311acef..61e0336bc 100644 --- a/apps/web/src/composables/users.ts +++ b/apps/web/src/composables/users.ts @@ -120,6 +120,7 @@ export default function useUsers() { function computeUserAnalytics() { // const result = userAnalytics.value + console.log('rawUserAnalytics in computeAnalytics :>> ', rawUserAnalytics) const sortedTransactions = rawUserAnalytics.value.sort((a: any, b: any) => { new Date(a.receivedAt).getTime() - new Date(b.receivedAt).getTime() }) @@ -237,16 +238,24 @@ export default function useUsers() { } } // TODO: Re-enable this when athena is ready - // const response = await fetch(`${usersUrl}/analytics`, requestOptions) - // const { error, message, data } = await response.json() - const error = false - const message = 'User analytics found' - const data = txData.value + const response = await fetch(`${usersUrl}/analytics`, requestOptions) + const { error, message, data } = await response.json() + console.log('data from analytics :>> ', data) + // const error = false + // const message = 'User analytics found' + + // TODO: Get events, actions, and contract data from the API + // Then format the data to be used in the charts (see computeUserAnalytics) and give to Steve. + + // We get the user's analytics (wallet balance) data here. + // const data = txData.value if (error) throw new Error(message) // TODO: Pass data from above when the API / data is ready setRawAnalytics(data) + + // This compute's the user's wallet balance over time computeUserAnalytics() return { error, message, data } } catch (error: any) { diff --git a/services/users/src/routes/analytics.ts b/services/users/src/routes/analytics.ts index 840208277..90a1442f7 100644 --- a/services/users/src/routes/analytics.ts +++ b/services/users/src/routes/analytics.ts @@ -3,6 +3,7 @@ import { verifySession } from 'supertokens-node/recipe/session/framework/express import { SessionRequest } from 'supertokens-node/framework/express' import useDB from '../providers/db' import { query } from 'athena-query' +import { UserWithAccountsAndOperators } from '@casimir/types' const router = express.Router() @@ -10,17 +11,27 @@ const { formatResult, getUserById } = useDB() router.get('/', verifySession(), async (req: SessionRequest, res: express.Response) => { try { + console.log('got to athena route') + // Two tables + // Events + // any events on the blockchain (including the block itself) + // so all txs + 1 for block + // Athena currently has all of this Goerli tx data + // Actions <-- this is the one we want for Overview Chart + // contract data (StakeDeposited, Withdrawal, etc.) + // includes tx data (outgoing, incoming, etc.) const id = req.session?.getUserId() as string const userId = id.toString() const user = await getUserById(userId) - const { accounts } = user + const { accounts } = user as UserWithAccountsAndOperators const addresses = accounts.map((account) => account.address) const database = 'casimir_analytics_database_dev' const athenaTable = 'casimir_analytics_action_table_dev1' const opt = { profile: process.env.AWS_PROFILE as string, database, - output: 's3://casimir-analytics-wallet-bucket-dev1/', + // output: 's3://casimir-analytics-wallet-bucket-dev1/', + output: 's3://casimir-analytics-action-bucket-dev1/', workgroup: 'primary', catalog: 'AwsDataCatalog', backoff: 1000, @@ -37,14 +48,32 @@ router.get('/', verifySession(), async (req: SessionRequest, res: express.Respon * price * gas_fee */ - const stmt = ` - SELECT * FROM ${database}.${athenaTable} - WHERE address IN (${addresses.map((address) => `'${address}'`).join(',')}) + // TODO: Include type in WHERE to decrease query time + // const testStmt = 'SELECT * FROM "casimir_analytics_action_table_dev1" limit 10;' + // const stmt = ` + // SELECT * FROM ${database}.${athenaTable} + // WHERE address IN (${addresses.map((address: string) => `'${address}'`).join(',')}) + // ORDER BY received_at DESC + // LIMIT 100; + // ` + // const { rows } = await query(testStmt, opt) + // console.log('rows :>> ', rows) + console.log('addresses :>> ', addresses) + const stmt = `SELECT * FROM "casimir_analytics_database_dev"."casimir_analytics_action_table_dev1" + WHERE "address" IN (${addresses.map((address: string) => `'${address}'`).join(',')}) ORDER BY received_at DESC - LIMIT 100 - ` - const { rows } = query(stmt, opt) + LIMIT 100;` + const [columns, rows ] = await query(stmt, { + database: 'casimir_analytics_database_dev', + workgroup: 'primary', + profile: 'consensus-networks-dev', + output: 's3://cms-lds-agg/cms_hcf_aggregates/', + catalog: 'AwsDataCatalog', + backoff: 1000, + region: 'us-east-2', + }) const data = formatResult(rows) + console.log('data :>> ', data) res.status(200).json({ error: false, message: 'Analytics data successfully fetched.',