From 69380e1e693ff57dbae66251aa1fd9a8a30cedb7 Mon Sep 17 00:00:00 2001 From: Morgan Mccauley Date: Fri, 28 Jul 2023 12:17:17 +1200 Subject: [PATCH] feat: Create script to preemptively provision user DBs --- .../scripts/provision-user-dbs.js | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 indexer-js-queue-handler/scripts/provision-user-dbs.js diff --git a/indexer-js-queue-handler/scripts/provision-user-dbs.js b/indexer-js-queue-handler/scripts/provision-user-dbs.js new file mode 100644 index 000000000..ece7487b7 --- /dev/null +++ b/indexer-js-queue-handler/scripts/provision-user-dbs.js @@ -0,0 +1,54 @@ +// export HASURA_ENDPOINT='http://localhost:8080' +// export HASURA_ADMIN_SECRET='myadminsecretkey' +// export PG_ADMIN_USER='postgres' +// export PG_ADMIN_PASSWORD='postgrespassword' +// export PG_ADMIN_DATABASE='postgres' +// export PG_HOST='localhost' +// export PG_PORT=5432 + +import { execSync } from 'child_process' +import { providers } from 'near-api-js' + +import Provisioner from '../provisioner.js' +import HasuraClient from '../hasura-client.js' + +const provisioner = new Provisioner(); + +const { rows } = await provisioner.pgClient.query('SELECT nspname AS name FROM pg_namespace;') + +const schemaNames = rows.map((row) => row.name); + +const accountIdsSet = schemaNames.reduce((accountIdsSet, schemaName) => { + const parts = schemaName.split('_near_'); + if (parts.length > 1) { + accountIdsSet.add(`${parts[0]}_near`); + } + return accountIdsSet; +}, new Set()); + +const accountIds = Array.from(accountIdsSet); + +console.log(`Creating datasources for accounts: ${accountIds.join(', ')}`) + +for (const accountId of accountIds) { + console.log('---'); + const sanitizedAccountId = provisioner.replaceSpecialChars(accountId); + + const databaseName = sanitizedAccountId; + const userName = sanitizedAccountId; + + if (await provisioner.hasuraClient.doesSourceExist(databaseName)) { + console.log(`Datasource ${databaseName} already exists, skipping.`) + continue; + } + + const password = provisioner.generatePassword() + console.log(`Creating user: ${userName} and database: ${databaseName} with password: ${password}`); + await provisioner.createUserDb(userName, password, databaseName); + + console.log(`Adding datasource ${databaseName} to Hasura`) + await provisioner.addDatasource(userName, password, databaseName); +} +console.log('---'); + +console.log('Done');