import { PrismaClient, UserRole, UserStatus, AuthProvider } from '@prisma/client'; import { PrismaPg } from '@prisma/adapter-pg'; import { Pool } from 'pg'; import * as argon2 from 'argon2'; async function main() { const connectionString = process.env.DATABASE_URL; const pool = new Pool({ connectionString }); const adapter = new PrismaPg(pool); const prisma = new PrismaClient({ adapter }); console.log('🌱 Starting database seeding...\n'); // ============================================= // Seed Agent Types // ============================================= console.log('šŸ“‹ Seeding Agent Types...'); const agentTypes = [ { name: 'Professional', description: 'Licensed real estate professionals', icon: 'briefcase', sortOrder: 1, }, { name: 'Lender', description: 'Mortgage and loan specialists', icon: 'bank', sortOrder: 2, }, ]; for (const agentType of agentTypes) { const existing = await prisma.agentType.findUnique({ where: { name: agentType.name }, }); if (existing) { console.log(` āš ļø Agent type "${agentType.name}" already exists`); } else { await prisma.agentType.create({ data: agentType, }); console.log(` āœ… Created agent type: ${agentType.name}`); } } console.log(''); // ============================================= // Seed Admin User // ============================================= console.log('šŸ‘¤ Seeding Admin User...'); const adminEmail = process.env.ADMIN_EMAIL || 'admin@realestate.com'; const adminPassword = process.env.ADMIN_PASSWORD || 'Admin@123456'; // Hash password with Argon2 (more secure than bcrypt) const hashedPassword = await argon2.hash(adminPassword); // Check if admin already exists const existingAdmin = await prisma.user.findUnique({ where: { email: adminEmail }, }); if (existingAdmin) { console.log(` āš ļø Admin user already exists: ${adminEmail}`); } else { // Create admin user const admin = await prisma.user.create({ data: { email: adminEmail, password: hashedPassword, role: UserRole.ADMIN, status: UserStatus.ACTIVE, emailVerified: true, emailVerifiedAt: new Date(), authProvider: AuthProvider.LOCAL, }, }); console.log(' āœ… Admin user created successfully!'); console.log(' ───────────────────────────────'); console.log(` šŸ“§ Email: ${adminEmail}`); console.log(` šŸ”‘ Password: ${adminPassword}`); console.log(` šŸ‘¤ Role: ${admin.role}`); console.log(` šŸ†” ID: ${admin.id}`); console.log(' ───────────────────────────────\n'); } // ============================================= // Summary // ============================================= const userCount = await prisma.user.count(); const adminCount = await prisma.user.count({ where: { role: UserRole.ADMIN } }); const agentTypeCount = await prisma.agentType.count(); console.log('šŸ“Š Database Summary:'); console.log(` Total Users: ${userCount}`); console.log(` Admins: ${adminCount}`); console.log(` Agent Types: ${agentTypeCount}`); console.log('\n🌱 Seeding completed!\n'); await prisma.$disconnect(); await pool.end(); } main() .catch((e) => { console.error('āŒ Seeding failed:', e); process.exit(1); });