Enhance configuration management with comprehensive environment setup

- Added detailed .env.example with extensive configuration options
- Created centralized configuration module with type-safe environment variable loading
- Implemented configuration validation and default value handling
- Added support for different environment modes (development, production, test)
- Introduced interfaces for robust type definitions across the project
- Implemented middleware for request validation, security, and input sanitization
This commit is contained in:
jango-blockchained
2025-02-03 00:32:14 +01:00
parent f81cb1af62
commit cee8cf8b1e
4 changed files with 455 additions and 4 deletions

87
src/config/index.ts Normal file
View File

@@ -0,0 +1,87 @@
import { config } from 'dotenv';
import { resolve } from 'path';
// Load environment variables based on NODE_ENV
const envFile = process.env.NODE_ENV === 'production'
? '.env'
: process.env.NODE_ENV === 'test'
? '.env.test'
: '.env.development';
console.log(`Loading environment from ${envFile}`);
config({ path: resolve(process.cwd(), envFile) });
// Home Assistant Configuration
export const HASS_CONFIG = {
HOST: process.env.HASS_HOST || 'http://homeassistant.local:8123',
TOKEN: process.env.HASS_TOKEN,
SOCKET_URL: process.env.HASS_SOCKET_URL || 'ws://homeassistant.local:8123/api/websocket'
};
// Server Configuration
export const SERVER_CONFIG = {
PORT: parseInt(process.env.PORT || '3000', 10),
NODE_ENV: process.env.NODE_ENV || 'development',
DEBUG: process.env.DEBUG === 'true',
LOG_LEVEL: process.env.LOG_LEVEL || 'info'
};
// AI Configuration
export const AI_CONFIG = {
PROCESSOR_TYPE: process.env.PROCESSOR_TYPE || 'claude',
OPENAI_API_KEY: process.env.OPENAI_API_KEY
};
// Rate Limiting Configuration
export const RATE_LIMIT_CONFIG = {
REGULAR: parseInt(process.env.RATE_LIMIT_REGULAR || '100', 10),
WEBSOCKET: parseInt(process.env.RATE_LIMIT_WEBSOCKET || '1000', 10)
};
// Security Configuration
export const SECURITY_CONFIG = {
JWT_SECRET: process.env.JWT_SECRET || 'default_secret_key_change_in_production',
CORS_ORIGINS: (process.env.CORS_ORIGINS || 'http://localhost:3000,http://localhost:8123')
.split(',')
.map(origin => origin.trim())
};
// Test Configuration
export const TEST_CONFIG = {
HASS_HOST: process.env.TEST_HASS_HOST || 'http://localhost:8123',
HASS_TOKEN: process.env.TEST_HASS_TOKEN || 'test_token',
HASS_SOCKET_URL: process.env.TEST_HASS_SOCKET_URL || 'ws://localhost:8123/api/websocket',
PORT: parseInt(process.env.TEST_PORT || '3001', 10)
};
// Mock Configuration (for testing)
export const MOCK_CONFIG = {
SERVICES: process.env.MOCK_SERVICES === 'true',
RESPONSES_DIR: process.env.MOCK_RESPONSES_DIR || '__tests__/mock-responses'
};
// Validate required configuration
function validateConfig() {
const missingVars: string[] = [];
if (!HASS_CONFIG.TOKEN) missingVars.push('HASS_TOKEN');
if (!SECURITY_CONFIG.JWT_SECRET) missingVars.push('JWT_SECRET');
if (missingVars.length > 0) {
throw new Error(`Missing required environment variables: ${missingVars.join(', ')}`);
}
}
// Export configuration validation
export const validateConfiguration = validateConfig;
// Export all configurations as a single object
export const AppConfig = {
HASS: HASS_CONFIG,
SERVER: SERVER_CONFIG,
AI: AI_CONFIG,
RATE_LIMIT: RATE_LIMIT_CONFIG,
SECURITY: SECURITY_CONFIG,
TEST: TEST_CONFIG,
MOCK: MOCK_CONFIG
};