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'); // Admin credentials 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 } }); console.log('šŸ“Š Database Summary:'); console.log(` Total Users: ${userCount}`); console.log(` Admins: ${adminCount}`); console.log('\n🌱 Seeding completed!\n'); await prisma.$disconnect(); await pool.end(); } main() .catch((e) => { console.error('āŒ Seeding failed:', e); process.exit(1); });