Re_Backend/src/config/system.config.ts

198 lines
6.9 KiB
TypeScript

/**
* System-wide Configuration
* Central configuration file for the Royal Enfield Workflow Management System
* All settings can be overridden via environment variables
*/
export const SYSTEM_CONFIG = {
// Application Information
APP_NAME: 'Royal Enfield Workflow Management',
APP_VERSION: '1.2.0',
APP_ENV: process.env.NODE_ENV || 'development',
// Working Hours Configuration
WORKING_HOURS: {
START_HOUR: parseInt(process.env.WORK_START_HOUR || '9', 10),
END_HOUR: parseInt(process.env.WORK_END_HOUR || '18', 10),
START_DAY: 1, // Monday
END_DAY: 5, // Friday
TIMEZONE: process.env.TZ || 'Asia/Kolkata',
},
// TAT (Turnaround Time) Settings
TAT: {
// Notification thresholds (percentage)
THRESHOLD_50_PERCENT: 50,
THRESHOLD_75_PERCENT: 75,
THRESHOLD_100_PERCENT: 100,
// Test mode for faster testing
TEST_MODE: process.env.TAT_TEST_MODE === 'true',
TEST_TIME_MULTIPLIER: process.env.TAT_TEST_MODE === 'true' ? 1/60 : 1, // 1 hour = 1 minute in test mode
// Default TAT values by priority (in hours)
DEFAULT_EXPRESS_TAT: parseInt(process.env.DEFAULT_EXPRESS_TAT || '24', 10),
DEFAULT_STANDARD_TAT: parseInt(process.env.DEFAULT_STANDARD_TAT || '72', 10),
},
// File Upload Limits
UPLOAD: {
MAX_FILE_SIZE_MB: parseInt(process.env.MAX_FILE_SIZE_MB || '10', 10),
MAX_FILE_SIZE_BYTES: parseInt(process.env.MAX_FILE_SIZE_MB || '10', 10) * 1024 * 1024,
ALLOWED_FILE_TYPES: ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'jpg', 'jpeg', 'png', 'gif', 'txt'],
MAX_FILES_PER_REQUEST: parseInt(process.env.MAX_FILES_PER_REQUEST || '10', 10),
},
// Workflow Limits
WORKFLOW: {
MAX_APPROVAL_LEVELS: parseInt(process.env.MAX_APPROVAL_LEVELS || '10', 10),
MAX_PARTICIPANTS: parseInt(process.env.MAX_PARTICIPANTS_PER_REQUEST || '50', 10),
MAX_SPECTATORS: parseInt(process.env.MAX_SPECTATORS || '20', 10),
MIN_APPROVAL_LEVELS: 1,
},
// Work Notes Configuration
WORK_NOTES: {
MAX_MESSAGE_LENGTH: parseInt(process.env.MAX_MESSAGE_LENGTH || '2000', 10),
MAX_ATTACHMENTS_PER_NOTE: parseInt(process.env.MAX_ATTACHMENTS_PER_NOTE || '5', 10),
ENABLE_REACTIONS: process.env.ENABLE_REACTIONS !== 'false',
ENABLE_MENTIONS: process.env.ENABLE_MENTIONS !== 'false',
},
// Pagination
PAGINATION: {
DEFAULT_PAGE_SIZE: parseInt(process.env.DEFAULT_PAGE_SIZE || '20', 10),
MAX_PAGE_SIZE: parseInt(process.env.MAX_PAGE_SIZE || '100', 10),
},
// Session & Security
SECURITY: {
SESSION_TIMEOUT_MINUTES: parseInt(process.env.SESSION_TIMEOUT_MINUTES || '480', 10), // 8 hours
JWT_EXPIRY: process.env.JWT_EXPIRY || '8h',
ENABLE_2FA: process.env.ENABLE_2FA === 'true',
},
// Notification Settings
NOTIFICATIONS: {
ENABLE_EMAIL: process.env.ENABLE_EMAIL_NOTIFICATIONS !== 'false',
ENABLE_PUSH: process.env.ENABLE_PUSH_NOTIFICATIONS !== 'false',
ENABLE_IN_APP: true, // Always enabled
BATCH_DELAY_MS: parseInt(process.env.NOTIFICATION_BATCH_DELAY || '5000', 10),
},
// Feature Flags
FEATURES: {
ENABLE_AI_CONCLUSION: process.env.ENABLE_AI_CONCLUSION !== 'false',
ENABLE_TEMPLATES: process.env.ENABLE_TEMPLATES === 'true', // Future feature
ENABLE_ANALYTICS: process.env.ENABLE_ANALYTICS !== 'false',
ENABLE_EXPORT: process.env.ENABLE_EXPORT !== 'false',
},
// Redis & Queue
REDIS: {
URL: process.env.REDIS_URL || 'redis://localhost:6379',
QUEUE_CONCURRENCY: parseInt(process.env.QUEUE_CONCURRENCY || '5', 10),
RATE_LIMIT_MAX: parseInt(process.env.RATE_LIMIT_MAX || '10', 10),
RATE_LIMIT_DURATION: parseInt(process.env.RATE_LIMIT_DURATION || '1000', 10),
},
// UI Preferences (can be overridden per user in future)
UI: {
DEFAULT_THEME: 'light',
DEFAULT_LANGUAGE: 'en',
DATE_FORMAT: 'DD/MM/YYYY',
TIME_FORMAT: '12h', // or '24h'
CURRENCY: 'INR',
CURRENCY_SYMBOL: '₹',
},
};
/**
* Get configuration for frontend consumption
* Returns only non-sensitive configuration values
*/
export async function getPublicConfig() {
// Get base configuration
const baseConfig = {
appName: SYSTEM_CONFIG.APP_NAME,
appVersion: SYSTEM_CONFIG.APP_VERSION,
workingHours: SYSTEM_CONFIG.WORKING_HOURS,
tat: {
thresholds: {
warning: SYSTEM_CONFIG.TAT.THRESHOLD_50_PERCENT,
critical: SYSTEM_CONFIG.TAT.THRESHOLD_75_PERCENT,
breach: SYSTEM_CONFIG.TAT.THRESHOLD_100_PERCENT,
},
testMode: SYSTEM_CONFIG.TAT.TEST_MODE,
},
upload: {
maxFileSizeMB: SYSTEM_CONFIG.UPLOAD.MAX_FILE_SIZE_MB,
allowedFileTypes: SYSTEM_CONFIG.UPLOAD.ALLOWED_FILE_TYPES,
maxFilesPerRequest: SYSTEM_CONFIG.UPLOAD.MAX_FILES_PER_REQUEST,
},
workflow: {
maxApprovalLevels: SYSTEM_CONFIG.WORKFLOW.MAX_APPROVAL_LEVELS,
maxParticipants: SYSTEM_CONFIG.WORKFLOW.MAX_PARTICIPANTS,
maxSpectators: SYSTEM_CONFIG.WORKFLOW.MAX_SPECTATORS,
},
workNotes: {
maxMessageLength: SYSTEM_CONFIG.WORK_NOTES.MAX_MESSAGE_LENGTH,
maxAttachmentsPerNote: SYSTEM_CONFIG.WORK_NOTES.MAX_ATTACHMENTS_PER_NOTE,
enableReactions: SYSTEM_CONFIG.WORK_NOTES.ENABLE_REACTIONS,
enableMentions: SYSTEM_CONFIG.WORK_NOTES.ENABLE_MENTIONS,
},
features: SYSTEM_CONFIG.FEATURES,
ui: SYSTEM_CONFIG.UI
};
// Get configuration from database first (always try to read from DB)
const { getConfigValue } = require('../services/configReader.service');
// Get AI configuration from admin settings (database)
const aiEnabled = (await getConfigValue('AI_ENABLED', 'true'))?.toLowerCase() === 'true';
const remarkGenerationEnabled = (await getConfigValue('AI_REMARK_GENERATION_ENABLED', 'true'))?.toLowerCase() === 'true';
const maxRemarkLength = parseInt(await getConfigValue('AI_MAX_REMARK_LENGTH', '2000') || '2000', 10);
// Try to get AI service status (gracefully handle if not available)
try {
const { aiService } = require('../services/ai.service');
return {
...baseConfig,
ai: {
enabled: aiEnabled && aiService.isAvailable(),
provider: aiService.getProviderName(),
remarkGenerationEnabled: remarkGenerationEnabled && aiEnabled && aiService.isAvailable(),
maxRemarkLength: maxRemarkLength,
features: {
conclusionGeneration: remarkGenerationEnabled && aiEnabled && aiService.isAvailable()
}
}
};
} catch (error) {
// AI service not available - return config with database values but AI disabled
return {
...baseConfig,
ai: {
enabled: false,
provider: 'None',
remarkGenerationEnabled: false,
maxRemarkLength: maxRemarkLength, // Use database value, not hardcoded
features: {
conclusionGeneration: false
}
}
};
}
}
/**
* Log system configuration on startup
*/
export function logSystemConfig(): void {
// System config logging disabled - use environment variables to verify settings
}
export default SYSTEM_CONFIG;