138 lines
5.3 KiB
TypeScript
138 lines
5.3 KiB
TypeScript
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();
|
|
});
|