/** * Application Configuration */ import dotenv from 'dotenv'; dotenv.config(); export const config = { app: { name: 'Trading Platform', version: '0.1.0', env: process.env.NODE_ENV || 'development', port: parseInt(process.env.PORT || '3000', 10), frontendUrl: process.env.FRONTEND_URL || 'http://localhost:5173', apiUrl: process.env.API_URL || 'http://localhost:3000', }, cors: { origins: process.env.CORS_ORIGINS?.split(',') || ['http://localhost:5173'], }, jwt: { accessSecret: process.env.JWT_ACCESS_SECRET || 'your-access-secret-change-in-production', refreshSecret: process.env.JWT_REFRESH_SECRET || 'your-refresh-secret-change-in-production', accessExpiry: process.env.JWT_ACCESS_EXPIRES || '15m', refreshExpiry: process.env.JWT_REFRESH_EXPIRES || '7d', }, database: { host: process.env.DB_HOST || 'localhost', port: parseInt(process.env.DB_PORT || '5432', 10), name: process.env.DB_NAME || 'trading', user: process.env.DB_USER || 'postgres', password: process.env.DB_PASSWORD || 'postgres', ssl: process.env.DB_SSL === 'true', poolMax: parseInt(process.env.DB_POOL_MAX || '20', 10), idleTimeout: parseInt(process.env.DB_IDLE_TIMEOUT || '30000', 10), connectionTimeout: parseInt(process.env.DB_CONNECTION_TIMEOUT || '5000', 10), }, redis: { url: process.env.REDIS_URL, host: process.env.REDIS_HOST || 'localhost', port: parseInt(process.env.REDIS_PORT || '6379', 10), password: process.env.REDIS_PASSWORD, db: parseInt(process.env.REDIS_DB || '0', 10), }, stripe: { secretKey: process.env.STRIPE_SECRET_KEY || '', webhookSecret: process.env.STRIPE_WEBHOOK_SECRET || '', publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || '', }, mlEngine: { baseUrl: process.env.ML_ENGINE_URL || 'http://localhost:3083', timeout: parseInt(process.env.ML_ENGINE_TIMEOUT || '5000', 10), }, rateLimit: { windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '60000', 10), max: parseInt(process.env.RATE_LIMIT_MAX || '100', 10), }, email: { host: process.env.EMAIL_HOST || 'smtp.gmail.com', port: parseInt(process.env.EMAIL_PORT || '587', 10), secure: process.env.EMAIL_SECURE === 'true', user: process.env.EMAIL_USER || '', password: process.env.EMAIL_PASSWORD || '', from: process.env.EMAIL_FROM || 'noreply@trading.io', }, twilio: { accountSid: process.env.TWILIO_ACCOUNT_SID || '', authToken: process.env.TWILIO_AUTH_TOKEN || '', phoneNumber: process.env.TWILIO_PHONE_NUMBER || '', whatsappNumber: process.env.TWILIO_WHATSAPP_NUMBER || '', verifyServiceSid: process.env.TWILIO_VERIFY_SERVICE_SID || '', useVerifyService: process.env.TWILIO_USE_VERIFY_SERVICE === 'true', }, oauth: { google: { clientId: process.env.GOOGLE_CLIENT_ID || '', clientSecret: process.env.GOOGLE_CLIENT_SECRET || '', callbackUrl: process.env.GOOGLE_CALLBACK_URL || 'http://localhost:3000/api/auth/google/callback', scope: ['openid', 'email', 'profile'], }, facebook: { clientId: process.env.FACEBOOK_CLIENT_ID || '', clientSecret: process.env.FACEBOOK_CLIENT_SECRET || '', callbackUrl: process.env.FACEBOOK_CALLBACK_URL || 'http://localhost:3000/api/auth/facebook/callback', scope: ['email', 'public_profile'], }, twitter: { clientId: process.env.TWITTER_CLIENT_ID || '', clientSecret: process.env.TWITTER_CLIENT_SECRET || '', callbackUrl: process.env.TWITTER_CALLBACK_URL || 'http://localhost:3000/api/auth/twitter/callback', scope: ['users.read', 'tweet.read', 'offline.access'], }, apple: { clientId: process.env.APPLE_CLIENT_ID || '', clientSecret: process.env.APPLE_CLIENT_SECRET || '', teamId: process.env.APPLE_TEAM_ID || '', keyId: process.env.APPLE_KEY_ID || '', privateKey: process.env.APPLE_PRIVATE_KEY || '', callbackUrl: process.env.APPLE_CALLBACK_URL || 'http://localhost:3000/api/auth/apple/callback', scope: ['name', 'email'], }, github: { clientId: process.env.GITHUB_CLIENT_ID || '', clientSecret: process.env.GITHUB_CLIENT_SECRET || '', callbackUrl: process.env.GITHUB_CALLBACK_URL || 'http://localhost:3000/api/auth/github/callback', scope: ['read:user', 'user:email'], }, }, }; export type Config = typeof config;