import { PrismaClient } from '@prisma/client'; import * as bcrypt from 'bcrypt'; const prisma = new PrismaClient(); async function main() { console.log('🌱 ContentGen AI — Seed Data Yükleniyor...\n'); // ── 1. Roller ────────────────────────────────────────────────────── console.log('👤 Roller oluşturuluyor...'); const adminRole = await prisma.role.upsert({ where: { name: 'admin' }, update: {}, create: { name: 'admin', description: 'Tam yetkili yönetici — sınırsız erişim', isSystem: true, }, }); const userRole = await prisma.role.upsert({ where: { name: 'user' }, update: {}, create: { name: 'user', description: 'Standart kullanıcı rolü', isSystem: true, }, }); console.log(` ✅ admin (${adminRole.id})`); console.log(` ✅ user (${userRole.id})`); // ── 2. İzinler ───────────────────────────────────────────────────── console.log('\n🔑 İzinler oluşturuluyor...'); const permissionDefs = [ // Projects { name: 'projects:create', resource: 'projects', action: 'create', description: 'Proje oluşturabilir' }, { name: 'projects:read', resource: 'projects', action: 'read', description: 'Projeleri görüntüleyebilir' }, { name: 'projects:update', resource: 'projects', action: 'update', description: 'Proje düzenleyebilir' }, { name: 'projects:delete', resource: 'projects', action: 'delete', description: 'Proje silebilir' }, // Templates { name: 'templates:read', resource: 'templates', action: 'read', description: 'Şablonları görüntüleyebilir' }, { name: 'templates:create', resource: 'templates', action: 'create', description: 'Şablon oluşturabilir' }, { name: 'templates:manage', resource: 'templates', action: 'manage', description: 'Şablonları yönetebilir' }, // Billing { name: 'billing:read', resource: 'billing', action: 'read', description: 'Fatura bilgilerini görüntüleyebilir' }, { name: 'billing:manage', resource: 'billing', action: 'manage', description: 'Abonelik ve ödeme yönetimi' }, // Admin { name: 'admin:access', resource: 'admin', action: 'access', description: 'Admin paneline erişebilir' }, { name: 'admin:users', resource: 'admin', action: 'users', description: 'Kullanıcıları yönetebilir' }, { name: 'admin:system', resource: 'admin', action: 'system', description: 'Sistem ayarlarını yönetebilir' }, // Notifications { name: 'notifications:read', resource: 'notifications', action: 'read', description: 'Bildirimleri görüntüleyebilir' }, { name: 'notifications:manage', resource: 'notifications', action: 'manage', description: 'Bildirimleri yönetebilir' }, ]; const permissions: Record = {}; for (const perm of permissionDefs) { const p = await prisma.permission.upsert({ where: { resource_action: { resource: perm.resource, action: perm.action } }, update: { description: perm.description }, create: perm, }); permissions[perm.name] = p; console.log(` ✅ ${perm.name}`); } // ── 3. Rol-İzin Eşlemeleri ───────────────────────────────────────── console.log('\n🔗 Rol-İzin eşlemeleri oluşturuluyor...'); // Admin: Tüm izinler for (const perm of Object.values(permissions)) { await prisma.rolePermission.upsert({ where: { roleId_permissionId: { roleId: adminRole.id, permissionId: perm.id } }, update: {}, create: { roleId: adminRole.id, permissionId: perm.id }, }); } console.log(` ✅ admin → ${Object.keys(permissions).length} izin`); // User: Temel izinler const userPermNames = [ 'projects:create', 'projects:read', 'projects:update', 'projects:delete', 'templates:read', 'billing:read', 'billing:manage', 'notifications:read', ]; for (const permName of userPermNames) { const perm = permissions[permName]; if (perm) { await prisma.rolePermission.upsert({ where: { roleId_permissionId: { roleId: userRole.id, permissionId: perm.id } }, update: {}, create: { roleId: userRole.id, permissionId: perm.id }, }); } } console.log(` ✅ user → ${userPermNames.length} izin`); // ── 4. Planlar ───────────────────────────────────────────────────── console.log('\n💳 Planlar oluşturuluyor...'); const plans = [ { name: 'free', displayName: 'Free', description: 'Başlangıç planı — temel video üretimi', monthlyPrice: 0, yearlyPrice: 0, currency: 'usd', monthlyCredits: 3, maxDuration: 30, maxResolution: '720p', maxProjects: 5, sortOrder: 0, features: { templates: true, priorityQueue: false, customBranding: false, apiAccess: false, analytics: false, support: 'community', }, }, { name: 'pro', displayName: 'Pro', description: 'Profesyonel içerik üreticileri için — gelişmiş özellikler', monthlyPrice: 1900, // $19.00 yearlyPrice: 19000, // $190.00 (yıllık ~%17 indirim) currency: 'usd', monthlyCredits: 25, maxDuration: 120, maxResolution: '1080p', maxProjects: 50, sortOrder: 1, features: { templates: true, priorityQueue: true, customBranding: true, apiAccess: false, analytics: true, support: 'email', }, }, { name: 'business', displayName: 'Business', description: 'Ajanslar ve ekipler için — sınırsız üretim kapasitesi', monthlyPrice: 4900, // $49.00 yearlyPrice: 49000, // $490.00 (yıllık ~%17 indirim) currency: 'usd', monthlyCredits: 100, maxDuration: 300, maxResolution: '4k', maxProjects: 500, sortOrder: 2, features: { templates: true, priorityQueue: true, customBranding: true, apiAccess: true, analytics: true, support: 'priority', }, }, ]; for (const plan of plans) { await prisma.plan.upsert({ where: { name: plan.name }, update: { displayName: plan.displayName, description: plan.description, monthlyPrice: plan.monthlyPrice, yearlyPrice: plan.yearlyPrice, monthlyCredits: plan.monthlyCredits, maxDuration: plan.maxDuration, maxResolution: plan.maxResolution, maxProjects: plan.maxProjects, features: plan.features, sortOrder: plan.sortOrder, }, create: plan, }); console.log(` ✅ ${plan.displayName} — ${plan.monthlyCredits} kredi/ay, $${(plan.monthlyPrice / 100).toFixed(0)}/ay`); } // ── 5. Admin Kullanıcı — haruncan@gmail.com ──────────────────────── console.log('\n👑 Admin kullanıcı oluşturuluyor...'); const adminPassword = await bcrypt.hash('Admin123!', 12); const adminEmail = 'haruncan@gmail.com'; const adminUser = await prisma.user.upsert({ where: { email: adminEmail }, update: {}, create: { email: adminEmail, password: adminPassword, firstName: 'Harun', lastName: 'Can', isActive: true, roles: { create: { roleId: adminRole.id, }, }, }, }); console.log(` ✅ ${adminEmail} (${adminUser.id})`); // Admin kullanıcıya sınırsız kredi ver (999999 başlangıç kredisi) const existingGrant = await prisma.creditTransaction.findFirst({ where: { userId: adminUser.id, type: 'grant', description: 'Admin başlangıç kredisi' }, }); if (!existingGrant) { await prisma.creditTransaction.create({ data: { userId: adminUser.id, amount: 999999, type: 'grant', description: 'Admin başlangıç kredisi — sınırsız', balanceAfter: 999999, }, }); console.log(' ✅ 999.999 kredi yüklendi (sınırsız)'); } else { console.log(' ⏭️ Kredi zaten mevcut'); } // Admin kullanıcıya Business planına aktif abonelik oluştur const businessPlan = await prisma.plan.findUnique({ where: { name: 'business' } }); if (businessPlan) { const existingSub = await prisma.subscription.findFirst({ where: { userId: adminUser.id, status: 'active' }, }); if (!existingSub) { await prisma.subscription.create({ data: { userId: adminUser.id, planId: businessPlan.id, status: 'active', currentPeriodStart: new Date(), currentPeriodEnd: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000), // 1 yıl }, }); console.log(' ✅ Business plan aboneliği oluşturuldu (sınırsız)'); } else { console.log(' ⏭️ Aktif abonelik zaten mevcut'); } } // Admin tercihlerini oluştur await prisma.userPreference.upsert({ where: { userId: adminUser.id }, update: {}, create: { userId: adminUser.id, defaultLanguage: 'tr', defaultVideoStyle: 'CINEMATIC', defaultDuration: 60, theme: 'dark', emailNotifications: true, pushNotifications: true, }, }); console.log(' ✅ Kullanıcı tercihleri ayarlandı'); // ── Özet ──────────────────────────────────────────────────────────── console.log('\n═══════════════════════════════════════════════════════════'); console.log('🎉 Seed data başarıyla yüklendi!'); console.log(` 📁 Roller: ${2}`); console.log(` 🔑 İzinler: ${Object.keys(permissions).length}`); console.log(` 💳 Planlar: ${plans.length}`); console.log(` 👤 Admin: ${adminEmail}`); console.log('═══════════════════════════════════════════════════════════\n'); } main() .catch((e) => { console.error('❌ Seed hatası:', e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });