Skip to content

Commit

Permalink
Merge pull request #685 from near/feature/migrate-findAccountsByPubli…
Browse files Browse the repository at this point in the history
…cKey-to-queryapi

Migrate findAccountsByPublicKey endpoint to QueryAPI
  • Loading branch information
eduohe authored Apr 25, 2024
2 parents 4d1a113 + 52a2bdf commit bdfe306
Showing 1 changed file with 44 additions and 9 deletions.
53 changes: 44 additions & 9 deletions src/middleware/indexer.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
const { Pool } = require('pg');
const Cache = require('node-cache');
const bunyan = require('bunyan');
const fetch = require('node-fetch');

const {
BRIDGE_TOKEN_FACTORY_ACCOUNT_ID = 'factory.bridge.near',
GRAPHQL_URL = 'https://near-queryapi.api.pagoda.co/v1/graphql',
NEAR_WALLET_ENV,
// INDEXER_DB_CONNECTION,
INDEXER_DB_REPLICAS,
Expand Down Expand Up @@ -119,15 +121,48 @@ const findAccountActivity = async (ctx) => {
const findAccountsByPublicKey = async (ctx) => {
try {
const { publicKey } = ctx.params;
const { rows } = await pool.query(`
SELECT DISTINCT account_id
FROM access_keys
JOIN accounts USING (account_id)
WHERE public_key = $1
AND accounts.deleted_by_receipt_id IS NULL
AND access_keys.deleted_by_receipt_id IS NULL
`, [publicKey]);
ctx.body = rows.map(({ account_id }) => account_id);
let accounts = [];

if (NEAR_WALLET_ENV.startsWith('mainnet')) {
const response = await fetch(GRAPHQL_URL, {
method: 'POST',
headers: {
'content-type': 'application/json',
'x-hasura-role': 'dataplatform_near'
},
body: JSON.stringify({
query: `
query access_keys_v1_by_public_key {
dataplatform_near_access_keys_v1_access_keys_v1(
where: {public_key: {_eq: "${publicKey}"}}
) {
account_id
}
}
`,
operationName: 'access_keys_v1_by_public_key'
}),
});

const respJson = await response.json();
const access_keys = respJson.data.dataplatform_near_access_keys_v1_access_keys_v1;
accounts = access_keys.map(item => item.account_id);
}

// fallback to indexer db for non-mainnet environments or if no results from graphql
if (accounts.length === 0) {
const { rows } = await pool.query(`
SELECT DISTINCT account_id
FROM access_keys
JOIN accounts USING (account_id)
WHERE public_key = $1
AND accounts.deleted_by_receipt_id IS NULL
AND access_keys.deleted_by_receipt_id IS NULL
`, [publicKey]);
accounts = rows.map(({ account_id }) => account_id);
}

ctx.body = accounts;
} catch (e) {
if (ctx.log && typeof ctx.log.error === 'function') {
ctx.log.error(e);
Expand Down

0 comments on commit bdfe306

Please sign in to comment.