diff --git a/.env b/.env index cf5abf7..6378a24 100644 --- a/.env +++ b/.env @@ -4,7 +4,8 @@ # Core Application Settings NODE_ENV=development -LOG_LEVEL=error +LOG_LEVEL=warn +LOG_HIDE_OBJECT=true # Data Service Configuration DATA_SERVICE_PORT=2001 diff --git a/apps/data-service/src/index.ts b/apps/data-service/src/index.ts index 77c91d1..19440a6 100644 --- a/apps/data-service/src/index.ts +++ b/apps/data-service/src/index.ts @@ -1,5 +1,5 @@ // Framework imports -import { initializeConfig } from '@stock-bot/config'; +import { initializeServiceConfig } from '@stock-bot/config'; import { Hono } from 'hono'; import { cors } from 'hono/cors'; // Library imports @@ -12,7 +12,7 @@ import { ProxyManager } from '@stock-bot/utils'; // Local imports import { exchangeRoutes, healthRoutes, queueRoutes } from './routes'; -const config = initializeConfig(); +const config = initializeServiceConfig(); console.log('Data Service Configuration:', JSON.stringify(config, null, 2)); const serviceConfig = config.service; const databaseConfig = config.database; @@ -24,6 +24,7 @@ if (config.log) { logConsole: true, logFile: false, environment: config.environment, + hideObject: config.log.hideObject, }); } diff --git a/libs/config/src/loaders/env.loader.ts b/libs/config/src/loaders/env.loader.ts index a3eb6ba..3e703f8 100644 --- a/libs/config/src/loaders/env.loader.ts +++ b/libs/config/src/loaders/env.loader.ts @@ -174,6 +174,7 @@ export class EnvLoader implements ConfigLoader { // Log mappings (using LOG_ prefix for all) LOG_LEVEL: ['log', 'level'], LOG_FORMAT: ['log', 'format'], + LOG_HIDE_OBJECT: ['log', 'hideObject'], LOG_LOKI_ENABLED: ['log', 'loki', 'enabled'], LOG_LOKI_HOST: ['log', 'loki', 'host'], LOG_LOKI_PORT: ['log', 'loki', 'port'], diff --git a/libs/config/src/schemas/index.ts b/libs/config/src/schemas/index.ts index 51dc699..eed8827 100644 --- a/libs/config/src/schemas/index.ts +++ b/libs/config/src/schemas/index.ts @@ -1,12 +1,12 @@ export * from './base.schema'; export * from './database.schema'; -export * from './service.schema'; export * from './provider.schema'; +export * from './service.schema'; import { z } from 'zod'; import { baseConfigSchema, environmentSchema } from './base.schema'; -import { queueConfigSchema, httpConfigSchema } from './service.schema'; import { providerConfigSchema, webshareProviderConfigSchema } from './provider.schema'; +import { httpConfigSchema, queueConfigSchema } from './service.schema'; // Flexible service schema with defaults const flexibleServiceConfigSchema = z.object({ @@ -74,6 +74,7 @@ const flexibleDatabaseConfigSchema = z.object({ const flexibleLogConfigSchema = z.object({ level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']).default('info'), format: z.enum(['json', 'pretty']).default('json'), + hideObject: z.boolean().default(false), loki: z.object({ enabled: z.boolean().default(false), host: z.string().default('localhost'), diff --git a/libs/logger/src/types.ts b/libs/logger/src/types.ts index 9e35776..557f9ae 100644 --- a/libs/logger/src/types.ts +++ b/libs/logger/src/types.ts @@ -26,4 +26,5 @@ export interface LoggerConfig { lokiUser?: string; lokiPassword?: string; environment?: string; + hideObject?: boolean; } diff --git a/libs/mongodb-client/src/singleton.ts b/libs/mongodb-client/src/singleton.ts index 5806b80..8bd84d5 100644 --- a/libs/mongodb-client/src/singleton.ts +++ b/libs/mongodb-client/src/singleton.ts @@ -7,19 +7,38 @@ import type { Db } from 'mongodb'; * Provides global access to a single MongoDB connection */ let instance: MongoDBClient | null = null; +let initPromise: Promise | null = null; /** * Initialize the singleton MongoDB client */ export async function connectMongoDB(config?: MongoDBClientConfig): Promise { - if (!instance) { - if (!config) { - throw new Error('MongoDB client not initialized. Call connectMongoDB(config) first.'); - } - instance = new MongoDBClient(config); - await instance.connect(); + if (instance) { + return instance; + } + + if (initPromise) { + return initPromise; + } + + if (!config) { + throw new Error('MongoDB client not initialized. Call connectMongoDB(config) first.'); + } + + initPromise = (async () => { + const client = new MongoDBClient(config); + await client.connect(); + instance = client; + return client; + })(); + + try { + return await initPromise; + } catch (error) { + // Reset promise on error so next call can retry + initPromise = null; + throw error; } - return instance; } /** @@ -59,4 +78,5 @@ export async function disconnectMongoDB(): Promise { await instance.disconnect(); instance = null; } + initPromise = null; } \ No newline at end of file