import { databaseService } from './database'; import { AccountStatus } from './auth/auth.constants'; import { UserRole } from '../types'; import { hashPassword, isBcryptHash } from './auth/password.service'; import { logger } from './logging'; export class DatabaseSeeder { private static seedingInProgress = false; private static seedingCompleted = false; async seedDefaultAdmin(): Promise { const adminEmail = (import.meta as any)?.env?.VITE_ADMIN_EMAIL || 'admin@localhost'; const adminPassword = (import.meta as any)?.env?.VITE_ADMIN_PASSWORD || 'admin123!'; logger.db.info('🌱 Starting admin user seeding...'); logger.db.info('📧 Admin email:', adminEmail); try { // Check if admin already exists const existingAdmin = await databaseService.findUserByEmail(adminEmail); if (existingAdmin) { logger.db.info('✅ Default admin user already exists'); logger.db.info('👤 Existing admin:', existingAdmin); // Check if admin needs to be updated to correct role/status if ( existingAdmin.role !== UserRole.ADMIN || existingAdmin.status !== AccountStatus.ACTIVE ) { logger.db.info('🔧 Updating admin user role and status...'); const updatedAdmin = { ...existingAdmin, role: UserRole.ADMIN, status: AccountStatus.ACTIVE, emailVerified: true, }; await databaseService.updateUser(updatedAdmin); logger.db.info('✅ Admin user updated successfully'); logger.db.info('👤 Updated admin:', updatedAdmin); } return; } logger.db.info('🚀 Creating new admin user...'); // Create default admin user const passwordToUse = isBcryptHash(adminPassword) ? adminPassword : await hashPassword(adminPassword); const adminUser = await databaseService.createUserWithPassword( adminEmail, passwordToUse, 'admin' ); logger.db.info('👤 Admin user created:', adminUser); // Update user to admin role and active status const updatedAdmin = { ...adminUser, role: UserRole.ADMIN, status: AccountStatus.ACTIVE, emailVerified: true, createdAt: new Date(), lastLoginAt: new Date(), }; await databaseService.updateUser(updatedAdmin); logger.db.info('✅ Admin user created successfully'); logger.db.info('👤 Final admin user:', updatedAdmin); logger.db.info('📧 Email:', adminEmail); logger.db.info('🔑 Password:', adminPassword); logger.db.info( '⚠️ Please change the default password after first login!' ); } catch (error) { logger.db.error('❌ Failed to create default admin user:', error); throw error; } } async seedDatabase(): Promise { // Prevent multiple seeding attempts if (DatabaseSeeder.seedingInProgress || DatabaseSeeder.seedingCompleted) { logger.db.info( '🔄 Seeding already in progress or completed, skipping...' ); return; } DatabaseSeeder.seedingInProgress = true; logger.db.info('🌱 Starting database seeding...'); try { await this.seedDefaultAdmin(); DatabaseSeeder.seedingCompleted = true; logger.db.info('🎯 Admin seeding completed successfully'); } catch (error) { logger.db.error('💥 Database seeding failed:', error); throw error; } finally { DatabaseSeeder.seedingInProgress = false; } } } export const databaseSeeder = new DatabaseSeeder(); // The seeding will be called explicitly from App.tsx