import { PrismaClient, RoleType } from '@prisma/client'; import * as argon2 from 'argon2'; const prisma = new PrismaClient(); async function main() { console.log('🌱 Starting Luxe Platform Database Seeding...'); // 1. Seed Roles const rolesData: { name: string; code: RoleType; description: string }[] = [ { name: 'Super Admin', code: RoleType.SUPER_ADMIN, description: 'Full system root access' }, { name: 'Admin', code: RoleType.ADMIN, description: 'Platform administration and management' }, { name: 'Moderator', code: RoleType.MODERATOR, description: 'Content and report moderation' }, { name: 'Content Moderator', code: RoleType.CONTENT_MODERATOR, description: 'Blog and forum moderation' }, { name: 'Finance Manager', code: RoleType.FINANCE, description: 'Wallet, ledger, transaction and invoice access' }, { name: 'Support Agent', code: RoleType.SUPPORT, description: 'User support and verification processing' }, { name: 'Agency Advertiser', code: RoleType.AGENCY, description: 'Agency advertiser account managing multiple staff' }, { name: 'Advertiser', code: RoleType.ADVERTISER, description: 'Individual advertiser listing creator' }, { name: 'Registered User', code: RoleType.USER, description: 'Standard platform member' }, { name: 'Guest', code: RoleType.GUEST, description: 'Unauthenticated visitor' }, ]; for (const role of rolesData) { await prisma.role.upsert({ where: { code: role.code }, update: { name: role.name, description: role.description }, create: role, }); } // 2. Seed Permissions const permissionsData = [ { resource: 'users', action: 'read', description: 'View user profiles' }, { resource: 'users', action: 'write', description: 'Modify users' }, { resource: 'users', action: 'ban', description: 'Ban user accounts' }, { resource: 'listings', action: 'create', description: 'Create marketplace listings' }, { resource: 'listings', action: 'approve', description: 'Approve pending listings' }, { resource: 'listings', action: 'delete', description: 'Delete marketplace listings' }, { resource: 'verifications', action: 'approve', description: 'Approve ID verifications' }, { resource: 'wallet', action: 'credit', description: 'Add bonus credits to user wallet' }, { resource: 'admin', action: 'view_dashboard', description: 'Access admin analytics overview' }, ]; for (const perm of permissionsData) { await prisma.permission.upsert({ where: { resource_action: { resource: perm.resource, action: perm.action } }, update: { description: perm.description }, create: perm, }); } // 3. Seed Super Admin User const superAdminPasswordHash = await argon2.hash('LuxeSuperAdmin2026Secure!'); const superAdminUser = await prisma.user.upsert({ where: { email: 'admin@luxe.com' }, update: {}, create: { email: 'admin@luxe.com', username: 'superadmin', passwordHash: superAdminPasswordHash, role: RoleType.SUPER_ADMIN, status: 'ACTIVE', emailVerifiedAt: new Date(), }, }); // Seed Wallet for Super Admin await prisma.wallet.upsert({ where: { userId: superAdminUser.id }, update: {}, create: { userId: superAdminUser.id, balance: 100000.0, credits: 5000.0, currency: 'USD', }, }); // 4. Seed Cities const cities = [ { name: 'New York', slug: 'new-york', state: 'NY', country: 'US' }, { name: 'Los Angeles', slug: 'los-angeles', state: 'CA', country: 'US' }, { name: 'Miami', slug: 'miami', state: 'FL', country: 'US' }, { name: 'London', slug: 'london', state: 'Greater London', country: 'UK' }, { name: 'Dubai', slug: 'dubai', state: 'Dubai', country: 'AE' }, ]; for (const city of cities) { await prisma.city.upsert({ where: { slug: city.slug }, update: {}, create: city, }); } // 5. Seed Categories const categories = [ { name: 'VIP Escorts', slug: 'vip-escorts', icon: 'crown', description: 'Premium verified VIP companionship' }, { name: 'Massage & Spa', slug: 'massage-spa', icon: 'sparkles', description: 'Relaxing holistic & therapeutic wellness' }, { name: 'Model & Hostess', slug: 'model-hostess', icon: 'camera', description: 'High fashion models for events & dates' }, { name: 'Nightlife Companions', slug: 'nightlife-companions', icon: 'glass-cheers', description: 'Party & event escorts' }, ]; for (const cat of categories) { await prisma.category.upsert({ where: { slug: cat.slug }, update: {}, create: cat, }); } // 6. Seed Feature Flags const featureFlags = [ { key: 'ENABLE_AI_IMAGE_MODERATION', isEnabled: true, description: 'Automatic NSFW and duplicate detection' }, { key: 'ENABLE_CRYPTO_PAYMENTS', isEnabled: false, description: 'Accept Web3 crypto payments for wallet recharge' }, { key: 'ENABLE_WHATSAPP_OTP', isEnabled: true, description: 'WhatsApp Business API for phone verification' }, ]; for (const flag of featureFlags) { await prisma.featureFlag.upsert({ where: { key: flag.key }, update: {}, create: flag, }); } console.log('✅ Database Seeding Completed Successfully!'); } main() .catch((e) => { console.error('❌ Seeding failed:', e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });