diff --git a/apps/data-sync-service/src/index.ts b/apps/data-sync-service/src/index.ts index 4a20573..f6638c0 100644 --- a/apps/data-sync-service/src/index.ts +++ b/apps/data-sync-service/src/index.ts @@ -3,28 +3,28 @@ */ import { Hono } from 'hono'; import { cors } from 'hono/cors'; -import { initializeConfig, getServiceConfig, getLoggingConfig, getDatabaseConfig } from '@stock-bot/config-new'; -import { getLogger, shutdownLoggers, setLoggerConfig } from '@stock-bot/logger'; +import { initializeServiceConfig } from '@stock-bot/config-new'; +import { getLogger, setLoggerConfig, shutdownLoggers } from '@stock-bot/logger'; import { createAndConnectMongoDBClient, MongoDBClient } from '@stock-bot/mongodb-client'; import { createAndConnectPostgreSQLClient, PostgreSQLClient } from '@stock-bot/postgres-client'; import { Shutdown } from '@stock-bot/shutdown'; import { enhancedSyncManager } from './services/enhanced-sync-manager'; import { syncManager } from './services/sync-manager'; -import { setPostgreSQLClient, setMongoDBClient } from './clients'; +import { setMongoDBClient, setPostgreSQLClient } from './clients'; -// Initialize configuration -await initializeConfig('./config'); -const serviceConfig = getServiceConfig(); -const databaseConfig = getDatabaseConfig(); +// Initialize configuration with automatic monorepo config inheritance +const config = await initializeServiceConfig(); +const serviceConfig = config.service; +const databaseConfig = config.database; // Initialize logger with config -const loggingConfig = getLoggingConfig(); +const loggingConfig = config.logging; if (loggingConfig) { setLoggerConfig({ logLevel: loggingConfig.level, logConsole: true, logFile: false, - environment: serviceConfig.environment, + environment: config.environment, }); } @@ -245,7 +245,7 @@ async function startServer() { server = Bun.serve({ port: PORT, fetch: app.fetch, - development: serviceConfig.environment === 'development', + development: config.environment === 'development', }); logger.info(`Data Sync Service started on port ${PORT}`); diff --git a/apps/web-api/src/index.ts b/apps/web-api/src/index.ts index 4449272..d3c5fdd 100644 --- a/apps/web-api/src/index.ts +++ b/apps/web-api/src/index.ts @@ -3,7 +3,7 @@ */ import { Hono } from 'hono'; import { cors } from 'hono/cors'; -import { initializeConfig, getServiceConfig, getLoggingConfig, getDatabaseConfig } from '@stock-bot/config-new'; +import { initializeServiceConfig } from '@stock-bot/config-new'; import { getLogger, shutdownLoggers, setLoggerConfig } from '@stock-bot/logger'; import { createAndConnectMongoDBClient, MongoDBClient } from '@stock-bot/mongodb-client'; import { createAndConnectPostgreSQLClient, PostgreSQLClient } from '@stock-bot/postgres-client'; @@ -13,13 +13,13 @@ import { setPostgreSQLClient, setMongoDBClient } from './clients'; import { exchangeRoutes } from './routes/exchange.routes'; import { healthRoutes } from './routes/health.routes'; -// Initialize configuration -await initializeConfig(); -const serviceConfig = getServiceConfig(); -const databaseConfig = getDatabaseConfig(); +// Initialize configuration with automatic monorepo config inheritance +const config = await initializeServiceConfig(); +const serviceConfig = config.service; +const databaseConfig = config.database; // Initialize logger with config -const loggingConfig = getLoggingConfig(); +const loggingConfig = config.logging; if (loggingConfig) { setLoggerConfig({ logLevel: loggingConfig.level, diff --git a/config/default.json b/config/default.json index 87e1d7b..bba0511 100644 --- a/config/default.json +++ b/config/default.json @@ -1,12 +1,19 @@ { - "app": { - "name": "stock-bot", - "version": "1.0.0" - }, + "name": "stock-bot", + "version": "1.0.0", + "environment": "development", "service": { "name": "default-service", "port": 3000, - "environment": "development" + "host": "0.0.0.0", + "healthCheckPath": "/health", + "metricsPath": "/metrics", + "shutdownTimeout": 30000, + "cors": { + "enabled": true, + "origin": "*", + "credentials": true + } }, "database": { "postgres": { @@ -57,22 +64,14 @@ }, "providers": { "yahoo": { + "name": "yahoo", "enabled": true, - "rateLimit": 5, - "timeout": 30000 - }, - "quoteMedia": { - "enabled": false, - "apiKey": "", - "baseUrl": "https://app.quotemedia.com/data", - "rateLimit": 10, - "timeout": 30000 - }, - "interactiveBrokers": { - "enabled": false, - "host": "localhost", - "port": 7497, - "clientId": 1 + "rateLimit": { + "maxRequests": 5, + "windowMs": 60000 + }, + "timeout": 30000, + "baseUrl": "https://query1.finance.yahoo.com" } }, "features": { diff --git a/libs/config-new/src/config-manager.ts b/libs/config-new/src/config-manager.ts index 220eac8..246340d 100644 --- a/libs/config-new/src/config-manager.ts +++ b/libs/config-new/src/config-manager.ts @@ -27,7 +27,7 @@ export class ConfigManager> { const configPath = options.configPath || join(process.cwd(), 'config'); this.loaders = [ new FileLoader(configPath, this.environment), - new EnvLoader('STOCKBOT_'), // Prefix for env vars + new EnvLoader(''), // No prefix for env vars to match our .env file ]; } } diff --git a/libs/config-new/src/index.ts b/libs/config-new/src/index.ts index db45332..41da483 100644 --- a/libs/config-new/src/index.ts +++ b/libs/config-new/src/index.ts @@ -21,6 +21,8 @@ export * from './utils/validation'; // Import necessary types for singleton import { ConfigManager } from './config-manager'; import { AppConfig, appConfigSchema } from './schemas'; +import { FileLoader } from './loaders/file.loader'; +import { EnvLoader } from './loaders/env.loader'; // Create singleton instance let configInstance: ConfigManager | null = null; @@ -39,6 +41,27 @@ export async function initializeConfig( return configInstance.initialize(appConfigSchema); } +/** + * Initialize configuration for a service in a monorepo + * Automatically loads configs from: + * 1. Root config directory (../../config) + * 2. Service-specific config directory (./config) + * 3. Environment variables + */ +export async function initializeServiceConfig(): Promise { + if (!configInstance) { + const environment = process.env.NODE_ENV || 'development'; + configInstance = new ConfigManager({ + loaders: [ + new FileLoader('../../config', environment), // Root config + new FileLoader('./config', environment), // Service config + new EnvLoader(''), // Environment variables + ] + }); + } + return configInstance.initialize(appConfigSchema); +} + /** * Get the current configuration */