Re_Backend/src/scripts/seed-admin-config.ts

393 lines
8.9 KiB
TypeScript

/**
* Manual script to seed admin configurations
* Run this if configurations are not auto-seeding on server startup
*
* Usage: npm run seed:config
*/
import { sequelize } from '../config/database';
import { QueryTypes } from 'sequelize';
async function seedAdminConfigurations() {
try {
await sequelize.authenticate();
// Check if configurations already exist
const count = await sequelize.query(
'SELECT COUNT(*) as count FROM admin_configurations',
{ type: QueryTypes.SELECT }
);
const existingCount = (count[0] as any).count;
if (existingCount > 0) {
console.log(`⚠️ Found ${existingCount} existing configurations. Delete them first or skip this script.`);
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
const answer = await new Promise<string>((resolve) => {
readline.question('Delete existing and re-seed? (yes/no): ', resolve);
});
readline.close();
if (answer.toLowerCase() !== 'yes') {
console.log('❌ Aborted. No changes made.');
process.exit(0);
}
await sequelize.query('DELETE FROM admin_configurations');
console.log('✅ Existing configurations deleted');
}
console.log('📝 Seeding admin configurations...');
// Insert all default configurations
await sequelize.query(`
INSERT INTO admin_configurations (
config_id, config_key, config_category, config_value, value_type,
display_name, description, default_value, is_editable, is_sensitive,
validation_rules, ui_component, sort_order, requires_restart,
created_at, updated_at
) VALUES
-- TAT Settings
(
gen_random_uuid(),
'DEFAULT_TAT_EXPRESS_HOURS',
'TAT_SETTINGS',
'24',
'NUMBER',
'Default TAT for Express Priority',
'Default turnaround time in hours for express priority requests (calendar days, 24/7)',
'24',
true,
false,
'{"min": 1, "max": 168}'::jsonb,
'number',
1,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'DEFAULT_TAT_STANDARD_HOURS',
'TAT_SETTINGS',
'48',
'NUMBER',
'Default TAT for Standard Priority',
'Default turnaround time in hours for standard priority requests (working hours only)',
'48',
true,
false,
'{"min": 1, "max": 336}'::jsonb,
'number',
2,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'TAT_THRESHOLD_WARNING',
'TAT_SETTINGS',
'50',
'NUMBER',
'TAT Warning Threshold (%)',
'Percentage of TAT elapsed when first warning notification is sent',
'50',
true,
false,
'{"min": 1, "max": 100}'::jsonb,
'number',
3,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'TAT_THRESHOLD_CRITICAL',
'TAT_SETTINGS',
'75',
'NUMBER',
'TAT Critical Threshold (%)',
'Percentage of TAT elapsed when critical notification is sent',
'75',
true,
false,
'{"min": 1, "max": 100}'::jsonb,
'number',
4,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'TAT_TEST_MODE',
'TAT_SETTINGS',
'false',
'BOOLEAN',
'TAT Test Mode',
'Enable test mode where 1 TAT hour = 1 minute (for development/testing only)',
'false',
true,
false,
'{}'::jsonb,
'switch',
5,
true,
NOW(),
NOW()
),
-- Working Hours Settings
(
gen_random_uuid(),
'WORK_START_HOUR',
'WORKING_HOURS',
'9',
'NUMBER',
'Work Day Start Hour',
'Hour when work day starts (24-hour format, e.g., 9 for 9:00 AM)',
'9',
true,
false,
'{"min": 0, "max": 23}'::jsonb,
'number',
10,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'WORK_END_HOUR',
'WORKING_HOURS',
'18',
'NUMBER',
'Work Day End Hour',
'Hour when work day ends (24-hour format, e.g., 18 for 6:00 PM)',
'18',
true,
false,
'{"min": 0, "max": 23}'::jsonb,
'number',
11,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'WORK_START_DAY',
'WORKING_HOURS',
'1',
'NUMBER',
'Work Week Start Day',
'Day when work week starts (1 = Monday, 7 = Sunday)',
'1',
true,
false,
'{"min": 1, "max": 7}'::jsonb,
'number',
12,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'WORK_END_DAY',
'WORKING_HOURS',
'5',
'NUMBER',
'Work Week End Day',
'Day when work week ends (1 = Monday, 7 = Sunday)',
'5',
true,
false,
'{"min": 1, "max": 7}'::jsonb,
'number',
13,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'TIMEZONE',
'WORKING_HOURS',
'Asia/Kolkata',
'STRING',
'System Timezone',
'Timezone for all TAT calculations and scheduling',
'Asia/Kolkata',
true,
false,
'{}'::jsonb,
'select',
14,
true,
NOW(),
NOW()
),
-- Workflow Settings
(
gen_random_uuid(),
'MAX_APPROVAL_LEVELS',
'WORKFLOW',
'10',
'NUMBER',
'Maximum Approval Levels',
'Maximum number of approval levels allowed per workflow',
'10',
true,
false,
'{"min": 1, "max": 20}'::jsonb,
'number',
20,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'MAX_PARTICIPANTS',
'WORKFLOW',
'50',
'NUMBER',
'Maximum Participants',
'Maximum number of participants (spectators + approvers) per request',
'50',
true,
false,
'{"min": 1, "max": 100}'::jsonb,
'number',
21,
false,
NOW(),
NOW()
),
-- File Upload Settings
(
gen_random_uuid(),
'MAX_FILE_SIZE_MB',
'FILE_UPLOAD',
'10',
'NUMBER',
'Maximum File Size (MB)',
'Maximum size for uploaded files in megabytes',
'10',
true,
false,
'{"min": 1, "max": 100}'::jsonb,
'number',
30,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'ALLOWED_FILE_TYPES',
'FILE_UPLOAD',
'pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif,txt',
'STRING',
'Allowed File Types',
'Comma-separated list of allowed file extensions',
'pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif,txt',
true,
false,
'{}'::jsonb,
'text',
31,
false,
NOW(),
NOW()
),
-- Feature Toggles
(
gen_random_uuid(),
'ENABLE_AI_CONCLUSION',
'FEATURES',
'true',
'BOOLEAN',
'Enable AI-Generated Conclusions',
'Allow AI to generate automatic conclusion remarks for approved/rejected requests',
'true',
true,
false,
'{}'::jsonb,
'switch',
40,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'ENABLE_PUSH_NOTIFICATIONS',
'FEATURES',
'true',
'BOOLEAN',
'Enable Push Notifications',
'Send browser push notifications for real-time events',
'true',
true,
false,
'{}'::jsonb,
'switch',
41,
false,
NOW(),
NOW()
),
(
gen_random_uuid(),
'ENABLE_EMAIL_NOTIFICATIONS',
'FEATURES',
'true',
'BOOLEAN',
'Enable Email Notifications',
'Send email notifications for workflow events',
'true',
true,
false,
'{}'::jsonb,
'switch',
42,
true,
NOW(),
NOW()
)
`);
const finalCount = await sequelize.query(
'SELECT COUNT(*) as count FROM admin_configurations',
{ type: QueryTypes.SELECT }
);
console.log(`✅ Seeded ${(finalCount[0] as any).count} admin configurations`);
process.exit(0);
} catch (error) {
console.error('❌ Error seeding admin configurations:', error);
process.exit(1);
}
}
// Run if called directly
if (require.main === module) {
seedAdminConfigurations();
}
export default seedAdminConfigurations;