This commit is contained in:
Boki 2025-06-18 19:33:04 -04:00
parent bd8a5bfe9e
commit eb66086b2a
5 changed files with 59 additions and 37 deletions

View file

@ -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}`);

View file

@ -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,

View file

@ -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": {

View file

@ -27,7 +27,7 @@ export class ConfigManager<T = Record<string, unknown>> {
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
];
}
}

View file

@ -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<AppConfig> | 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<AppConfig> {
if (!configInstance) {
const environment = process.env.NODE_ENV || 'development';
configInstance = new ConfigManager<AppConfig>({
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
*/