import { PrismaClient } from "@prisma/client"; import bcrypt from "bcryptjs"; const prisma = new PrismaClient(); async function main() { console.log("Seeding database..."); // 1. Initial System Settings const initialSettings = [ { key: "default_url_length", value: "5" }, { key: "site_name", value: "EZBio - URL Shortener & Link in Bio" }, { key: "allow_registration", value: "1" }, { key: "header_color", value: "#4F46E5" }, { key: "background_color", value: "#F9FAFB" }, { key: "seo_title", value: "EZBio - Fast URL Shortener & Dynamic Bio Link" }, { key: "seo_description", value: "Rút gọn link thông minh, tạo mã QR và trang Bio Link đỉnh cao." }, { key: "seo_keywords", value: "url shortener, link in bio, bio link, qr code generator" }, { key: "r2_storage_limit_mb", value: "10240" }, { key: "r2_warning_threshold", value: "80" }, ]; for (const s of initialSettings) { await prisma.setting.upsert({ where: { key: s.key }, update: { value: s.value }, create: { key: s.key, value: s.value }, }); } // 2. Admin User const adminPassword = await bcrypt.hash("password123", 10); const admin = await prisma.user.upsert({ where: { email: "admin@example.com" }, update: {}, create: { name: "Admin User", email: "admin@example.com", username: "admin", password: adminPassword, role: "admin", isActive: true, portal: { create: { title: "Admin Official Bio", description: "Quản trị viên hệ thống EZBio Platform", headerColor: "#000000", titleColorStyle: "gradient-1", backgroundStyle: "gradient-2", vcard: { fullName: "EZBio Administrator", email: "admin@example.com", company: "EZBio Corp", website: "https://ezbio.io", }, socialLinks: { facebook: "https://facebook.com", twitter: "https://x.com", youtube: "https://youtube.com", telegram: "https://t.me", }, }, }, }, }); // 3. Demo User const demoPassword = await bcrypt.hash("password123", 10); const demo = await prisma.user.upsert({ where: { email: "demo@example.com" }, update: {}, create: { name: "Demo Creator", email: "demo@example.com", username: "demo", password: demoPassword, role: "user", isActive: true, portal: { create: { title: "Trần Tiến • Content Creator", description: "Chia sẻ kiến thức công nghệ, lập trình Fullstack & AI Agent", headerColor: "#000000", titleColorStyle: "gradient-5", backgroundStyle: "gradient-5", vcard: { fullName: "Trần Tiến", phone: "+84 901 234 567", email: "demo@example.com", company: "Tech Creator", website: "https://github.com", }, socialLinks: { facebook: "https://facebook.com", twitter: "https://x.com", instagram: "https://instagram.com", tiktok: "https://tiktok.com", youtube: "https://youtube.com", telegram: "https://t.me", }, }, }, }, }); // 4. Sample Links const sampleLinks = [ { originalUrl: "https://github.com", shortCode: "github", title: "GitHub - Build and ship software", displayOnPortal: true, userId: demo.id, tags: ["tech", "coding"], }, { originalUrl: "https://nextjs.org", shortCode: "nextjs", title: "Next.js by Vercel - The React Framework for the Web", displayOnPortal: true, userId: demo.id, tags: ["framework", "react"], }, { originalUrl: "https://vercel.com", shortCode: "vercel", title: "Vercel - Build and deploy web applications", displayOnPortal: true, userId: demo.id, tags: ["cloud", "deploy"], }, ]; for (const link of sampleLinks) { await prisma.shortUrl.upsert({ where: { shortCode: link.shortCode }, update: {}, create: { originalUrl: link.originalUrl, shortCode: link.shortCode, title: link.title, displayOnPortal: link.displayOnPortal, userId: link.userId, tags: { connectOrCreate: link.tags.map((name) => ({ where: { name }, create: { name }, })), }, }, }); } console.log("Database seeded successfully!"); console.log("Admin account: admin@example.com / password123"); console.log("Demo account: demo@example.com / password123"); } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });