import dotenv from 'dotenv'; dotenv.config(); import prisma from './src/utils/db'; import bcrypt from 'bcrypt'; async function seed() { console.log('Starting database seeding...'); // 1. Seed Active Legal Documents let ndaDoc = await prisma.legalDocument.findFirst({ where: { type: 'NDA', version: '1.0' } }); if (!ndaDoc) { ndaDoc = await prisma.legalDocument.create({ data: { type: 'NDA', version: '1.0', content: 'This is the standard Non-Disclosure Agreement content. By signing this document, you agree to keep all technical and business materials confidential.', isActive: true, } }); console.log('Seeded NDA Document.'); } else { console.log('NDA Document already exists.'); } let msaDoc = await prisma.legalDocument.findFirst({ where: { type: 'MSA', version: '1.0' } }); if (!msaDoc) { msaDoc = await prisma.legalDocument.create({ data: { type: 'MSA', version: '1.0', content: 'This is the standard Master Services Agreement content. It defines the core relationship, deliverables, and service levels between Tech4Biz and the partner.', isActive: true, } }); console.log('Seeded MSA Document.'); } else { console.log('MSA Document already exists.'); } // 2. Hash Password const passwordHash = await bcrypt.hash('Password123', 10); // Create default Partner organization let partnerOrg = await prisma.organization.findFirst({ where: { name: 'PARTNER' } }); if (!partnerOrg) { partnerOrg = await prisma.organization.create({ data: { name: 'PARTNER' } }); console.log('Seeded PARTNER organization.'); } // 3. Seed Admin const adminEmail = 'admin@tech4biz.com'; let adminUser = await prisma.user.findUnique({ where: { email: adminEmail } }); if (!adminUser) { adminUser = await prisma.user.create({ data: { email: adminEmail, passwordHash, role: 'ADMIN', onboardingStatus: 'APPROVED', mfaEnabled: false, } }); console.log(`Seeded Admin User: ${adminEmail}`); } else { console.log(`Admin User already exists: ${adminEmail}`); } // 4. Seed Partner 1: Awaiting onboarding const onboardingEmail = 'pending-onboarding@partner.com'; let onboardingUser = await prisma.user.findUnique({ where: { email: onboardingEmail } }); if (!onboardingUser) { onboardingUser = await prisma.user.create({ data: { email: onboardingEmail, passwordHash, role: 'PARTNER_USER', onboardingStatus: 'PENDING_ONBOARDING', mfaEnabled: false, organizationId: partnerOrg.id } }); console.log(`Seeded Partner (Pending Onboarding): ${onboardingEmail}`); } else { console.log(`Partner (Pending Onboarding) already exists: ${onboardingEmail}`); } // 5. Seed Partner 2: Awaiting admin approval (Signed NDA & MSA) const pendingApprovalEmail = 'pending-approval@partner.com'; let pendingApprovalUser = await prisma.user.findUnique({ where: { email: pendingApprovalEmail } }); if (!pendingApprovalUser) { pendingApprovalUser = await prisma.user.create({ data: { email: pendingApprovalEmail, passwordHash, role: 'PARTNER_USER', onboardingStatus: 'PENDING_APPROVAL', mfaEnabled: false, organizationId: partnerOrg.id } }); console.log(`Seeded Partner (Pending Approval): ${pendingApprovalEmail}`); // Seed LegalAcceptance for NDA await prisma.legalAcceptance.create({ data: { docId: ndaDoc.id, userId: pendingApprovalUser.id, ipAddress: '127.0.0.1', signatureHash: 'sha256-dummyndaaccept1234567890abcdef', acceptedAt: new Date() } }); // Seed LegalAcceptance for MSA await prisma.legalAcceptance.create({ data: { docId: msaDoc.id, userId: pendingApprovalUser.id, ipAddress: '127.0.0.1', signatureHash: 'sha256-dummymsaaccept1234567890abcdef', acceptedAt: new Date() } }); console.log('Seeded Legal Acceptances for NDA/MSA for pending-approval partner.'); } else { console.log(`Partner (Pending Approval) already exists: ${pendingApprovalEmail}`); } // 6. Seed Partner 3: Fully active & approved const activeEmail = 'active-partner@partner.com'; let activeUser = await prisma.user.findUnique({ where: { email: activeEmail } }); if (!activeUser) { activeUser = await prisma.user.create({ data: { email: activeEmail, passwordHash, role: 'PARTNER_USER', onboardingStatus: 'APPROVED', mfaEnabled: false, organizationId: partnerOrg.id } }); console.log(`Seeded Partner (Approved): ${activeEmail}`); // Seed LegalAcceptance for NDA await prisma.legalAcceptance.create({ data: { docId: ndaDoc.id, userId: activeUser.id, ipAddress: '127.0.0.1', signatureHash: 'sha256-dummyndaacceptactive987654321', acceptedAt: new Date() } }); // Seed LegalAcceptance for MSA await prisma.legalAcceptance.create({ data: { docId: msaDoc.id, userId: activeUser.id, ipAddress: '127.0.0.1', signatureHash: 'sha256-dummymsaacceptactive987654321', acceptedAt: new Date() } }); console.log('Seeded Legal Acceptances for NDA/MSA for active partner.'); } else { console.log(`Partner (Approved) already exists: ${activeEmail}`); } // 7. Seed Blog Posts const blogCount = await prisma.blogPost.count(); if (blogCount === 0) { await prisma.blogPost.createMany({ data: [ { title: "Unlocking Ultra-Low Latency: Synthesis of RISC-V in Edge Devices", content: "As edge intelligence grows, local compute units require custom processor topologies. In this article, we details the exact synthesis settings and pipelining optimizations that enabled our quad-core RISC-V IP block to achieve 35% better performance per watt compared to baseline architectures. We review cache organization, instruction fetch queue sizing, and how we tackled branch prediction overheads within tightly constrained FPGA silicon boundaries.", author: "Dr. Marcus Vance", publishDate: "2026-06-18", thumbnailUrl: "https://images.unsplash.com/photo-1601524909162-be87252be298?w=500&auto=format&fit=crop&q=60", readTime: "6 min read", tags: ["RISC-V", "Hardware-Design", "Edge-AI"], status: "published" }, { title: "Introduction to CodeNuk: Scalable Microservice Architecture", content: "Building distributed systems often involves navigating high configuration overhead. CodeNuk solves this by providing a unified, type-safe scaffolding that integrates telemetry, connection pools, and circuit-breakers out of the box. This deep-dive explains how CodeNuk leverages TypeScript decorators to declare service endpoints and automatically generate OpenAPI contracts and React Client hooks during the build phase, saving engineering weeks.", author: "Yasha Khandelwal", publishDate: "2026-06-25", thumbnailUrl: "https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=500&auto=format&fit=crop&q=60", readTime: "8 min read", tags: ["CodeNuk", "TypeScript", "Microservices"], status: "published" } ] }); console.log('Seeded Blog Posts.'); } console.log('Seeding completed successfully.'); } seed() .catch((err) => { console.error('Seeding failed:', err); process.exit(1); }) .finally(() => prisma.$disconnect());