Skip to content

Commit

Permalink
refactor: simplifies api dbs config and removes redundant connections
Browse files Browse the repository at this point in the history
  • Loading branch information
ygrishajev committed Jan 30, 2025
1 parent de67a91 commit 202cdd8
Showing 12 changed files with 51 additions and 65 deletions.
7 changes: 4 additions & 3 deletions apps/api/env/.env.functional.test
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
AKASH_SANDBOX_DATABASE_CS=postgres://postgres:password@localhost:5432/console-akash-sandbox
USER_DATABASE_CS=postgres://postgres:password@localhost:5432/console-users
CHAIN_INDEXER_POSTGRES_DB_URI=postgres://postgres:password@localhost:5432/console-akash-sandbox
POSTGRES_DB_URI=postgres://postgres:password@localhost:5432/console-users
MASTER_WALLET_MNEMONIC="motion isolate mother convince snack twenty tumble boost elbow bundle modify balcony"
UAKT_TOP_UP_MASTER_WALLET_MNEMONIC="since bread kind field rookie stairs elephant tent horror rice gain tongue collect goose rural garment cover client biology toe ability boat afford mind"
@@ -23,4 +22,6 @@ ALLOWED_CHECKOUT_REFERRERS=["http://localhost:3000"]
STRIPE_CHECKOUT_REDIRECT_URL=http://localhost:3000
AUTH0_M2M_DOMAIN=AUTH0_M2M_DOMAIN
AUTH0_M2M_SECRET=AUTH0_SECRET
AUTH0_M2M_CLIENT_ID=AUTH0_CLIENT_ID
AUTH0_M2M_CLIENT_ID=AUTH0_CLIENT_ID
STD_OUT_LOG_FORMAT=pretty
SQL_LOG_FORMAT=pretty
4 changes: 1 addition & 3 deletions apps/api/env/.env.local.sample
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
NETWORK=sandbox
DB_HOST_WITH_DEFAULT=${DB_HOST:-localhost}
AKASH_DATABASE_CS=postgres://postgres:password@${DB_HOST_WITH_DEFAULT}:5432/console-akash-sandbox
AKASH_SANDBOX_DATABASE_CS=postgres://postgres:password@${DB_HOST_WITH_DEFAULT}:5432/console-akash-sandbox
USER_DATABASE_CS=postgres://postgres:password@${DB_HOST_WITH_DEFAULT}:5432/console-users
CHAIN_INDEXER_POSTGRES_DB_URI=postgres://postgres:password@${DB_HOST_WITH_DEFAULT}:5432/console-akash-sandbox
POSTGRES_DB_URI=postgres://postgres:password@${DB_HOST_WITH_DEFAULT}:5432/console-users
ANONYMOUS_USER_TOKEN_SECRET=ANONYMOUS_USER_TOKEN_SECRET
MASTER_WALLET_MNEMONIC=MASTER_WALLET_MNEMONIC
5 changes: 2 additions & 3 deletions apps/api/env/.env.sample
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
# Secrets
AKASH_DATABASE_CS=
POSTGRES_DB_URI=
CHAIN_INDEXER_POSTGRES_DB_URI=
GITHUB_PAT=
ANONYMOUS_USER_TOKEN_SECRET=
HealthChecks_SyncAKTMarketData=
MASTER_WALLET_MNEMONIC=
POSTGRES_DB_URI=
SECRET_TOKEN=
SENTRY_DSN=
STRIPE_SECRET_KEY=
STRIPE_PRODUCT_ID=
USER_DATABASE_CS=

# Configuration
CORS_WEBSITE_URLS=
3 changes: 1 addition & 2 deletions apps/api/env/.env.unit.test
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
AKASH_SANDBOX_DATABASE_CS=postgres://postgres:password@localhost:5432/console-akash-sandbox
USER_DATABASE_CS=postgres://postgres:password@localhost:5432/console-users
CHAIN_INDEXER_POSTGRES_DB_URI=postgres://postgres:password@localhost:5432/console-akash-sandbox
POSTGRES_DB_URI=postgres://postgres:password@localhost:5432/console-users
MASTER_WALLET_MNEMONIC="motion isolate mother convince snack twenty tumble boost elbow bundle modify balcony"
UAKT_TOP_UP_MASTER_WALLET_MNEMONIC="since bread kind field rookie stairs elephant tent horror rice gain tongue collect goose rural garment cover client biology toe ability boat afford mind"
2 changes: 1 addition & 1 deletion apps/api/jest.config.js
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@ const MAP_ALIASES = {

const common = {
transform: {
"^.+\\.(t|j)s$": ["ts-jest", { tsconfig: "./tsconfig.json" }]
"^.+\\.(t|j)s$": ["ts-jest", { tsconfig: "./test/tsconfig.json" }]
},
rootDir: ".",
moduleNameMapper: {
4 changes: 2 additions & 2 deletions apps/api/package.json
Original file line number Diff line number Diff line change
@@ -23,8 +23,8 @@
"prod": "doppler run -- node dist/server.js",
"release": "release-it",
"start": "webpack --config webpack.dev.js --watch",
"test": "jest --selectProjects unit functional",
"test:cov": "jest --selectProjects unit functional --coverage",
"test": "jest --selectProjects unit functional --runInBand",
"test:cov": "jest --selectProjects unit functional --coverage --runInBand",
"test:functional": "jest --selectProjects functional --runInBand",
"test:functional:cov": "npm run test:functional -- --coverage",
"test:functional:watch": "npm run test:functional -- --watch",
5 changes: 5 additions & 0 deletions apps/api/src/chain/config/env.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { z } from "zod";

export const envSchema = z.object({
CHAIN_INDEXER_POSTGRES_DB_URI: z.string()
});
11 changes: 11 additions & 0 deletions apps/api/src/chain/services/chain-config/chain-config.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { singleton } from "tsyringe";

import { envSchema } from "@src/chain/config/env.config";
import { ConfigService } from "@src/core/services/config/config.service";

@singleton()
export class ChainConfigService extends ConfigService<typeof envSchema, unknown> {
constructor() {
super({ envSchema });
}
}
2 changes: 1 addition & 1 deletion apps/api/src/core/config/env.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { z } from "zod";

const envSchema = z.object({
export const envSchema = z.object({
LOG_LEVEL: z.enum(["fatal", "error", "warn", "info", "debug", "trace"]).optional().default("info"),
STD_OUT_LOG_FORMAT: z.enum(["json", "pretty"]).optional().default("json"),
SQL_LOG_FORMAT: z.enum(["raw", "pretty"]).optional().default("raw"),
11 changes: 11 additions & 0 deletions apps/api/src/core/services/core-config/core-config.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { singleton } from "tsyringe";

import { envSchema } from "@src/core/config/env.config";
import { ConfigService } from "@src/core/services/config/config.service";

@singleton()
export class CoreConfigService extends ConfigService<typeof envSchema, unknown> {
constructor() {
super({ envSchema });
}
}
57 changes: 11 additions & 46 deletions apps/api/src/db/dbConnection.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,23 @@
import { chainDefinitions } from "@akashnetwork/database/chainDefinitions";
import { chainModels, getChainModels, userModels } from "@akashnetwork/database/dbSchemas";
import { chainModels, userModels } from "@akashnetwork/database/dbSchemas";
import { Template, TemplateFavorite, UserSetting } from "@akashnetwork/database/dbSchemas/user";
import pg from "pg";
import { Transaction as DbTransaction } from "sequelize";
import { Sequelize } from "sequelize-typescript";
import { container } from "tsyringe";

import { config } from "@src/core/config";
import { ChainConfigService } from "@src/chain/services/chain-config/chain-config.service";
import { CoreConfigService } from "@src/core/services/core-config/core-config.service";
import { PostgresLoggerService } from "@src/core/services/postgres-logger/postgres-logger.service";
import { env } from "@src/utils/env";

function isValidNetwork(network: string): network is keyof typeof csMap {
return network in csMap;
}

const csMap = {
mainnet: env.AKASH_DATABASE_CS,
testnet: env.AKASH_TESTNET_DATABASE_CS,
sandbox: env.AKASH_SANDBOX_DATABASE_CS
};

if (!isValidNetwork(env.NETWORK)) {
throw new Error(`Invalid network: ${env.NETWORK}`);
}
const indexerDbUri = container.resolve(ChainConfigService).get("CHAIN_INDEXER_POSTGRES_DB_URI");
const coreConfig = container.resolve(CoreConfigService);
const dbUri = coreConfig.get("POSTGRES_DB_URI");

if (!csMap[env.NETWORK]) {
throw new Error(`Missing connection string for network: ${env.NETWORK}`);
}

const logger = new PostgresLoggerService({ orm: "sequelize", useFormat: config.SQL_LOG_FORMAT === "pretty" });
const logger = new PostgresLoggerService({ orm: "sequelize", useFormat: coreConfig.get("SQL_LOG_FORMAT") === "pretty" });
const logging = (msg: string) => logger.write(msg);

pg.defaults.parseInt8 = true;
export const chainDb = new Sequelize(csMap[env.NETWORK], {
export const chainDb = new Sequelize(indexerDbUri, {
dialectModule: pg,
logging,
logQueryParameters: true,
@@ -43,28 +29,7 @@ export const chainDb = new Sequelize(csMap[env.NETWORK], {
models: chainModels
});

export const chainDbs: { [key: string]: Sequelize } = Object.keys(chainDefinitions)
.filter(x => chainDefinitions[x].connectionString)
.reduce(
(obj, chain) => ({
...obj,
[chain]: new Sequelize(chainDefinitions[chain].connectionString, {
dialectModule: pg,
logging,
logQueryParameters: true,
repositoryMode: true,
transactionType: DbTransaction.TYPES.IMMEDIATE,
define: {
timestamps: false,
freezeTableName: true
},
models: getChainModels(chain)
})
}),
{}
);

export const userDb = new Sequelize(env.USER_DATABASE_CS, {
export const userDb = new Sequelize(dbUri, {
dialectModule: pg,
logging,
logQueryParameters: true,
@@ -82,4 +47,4 @@ export async function syncUserSchema() {
await TemplateFavorite.sync();
}

export const closeConnections = async () => await Promise.all([chainDb.close(), userDb.close(), ...Object.values(chainDbs).map(db => db.close())]);
export const closeConnections = async () => await Promise.all([chainDb.close(), userDb.close()]);
5 changes: 1 addition & 4 deletions apps/api/src/utils/env.ts
Original file line number Diff line number Diff line change
@@ -5,10 +5,7 @@ export const env = z
CORS_WEBSITE_URLS: z.string().optional(),
NODE_ENV: z.string().optional(),
HEALTHCHECKS_ENABLED: z.string().optional(),
AKASH_DATABASE_CS: z.string().optional(),
AKASH_TESTNET_DATABASE_CS: z.string().optional(),
AKASH_SANDBOX_DATABASE_CS: z.string().optional(),
USER_DATABASE_CS: z.string().optional(),
CHAIN_INDEXER_POSTGRES_DB_URI: z.string(),
NETWORK: z.string().default("mainnet"),
REST_API_NODE_URL: z.string().optional(),
SERVER_ORIGIN: z.string().optional().default("http://localhost:3080"),

0 comments on commit 202cdd8

Please sign in to comment.