Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: simplifies api dbs config and removes redundant connections #759

Merged
merged 1 commit into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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"
Expand All @@ -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
Expand Down
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=
Expand Down
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"
Expand Down
2 changes: 1 addition & 1 deletion apps/api/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
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()
});
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"),
Expand Down
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,
Expand All @@ -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)
ygrishajev marked this conversation as resolved.
Show resolved Hide resolved
.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)
})
}),
baktun14 marked this conversation as resolved.
Show resolved Hide resolved
{}
);

export const userDb = new Sequelize(env.USER_DATABASE_CS, {
export const userDb = new Sequelize(dbUri, {
dialectModule: pg,
logging,
logQueryParameters: true,
Expand All @@ -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
Expand Up @@ -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"),
Expand Down
Loading
Loading