This commit is contained in:
+165
@@ -0,0 +1,165 @@
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
console.log("Seeding database...");
|
||||
|
||||
// Create test user (Clerk will sync real users, this is for dev)
|
||||
const user = await prisma.user.upsert({
|
||||
where: { email: "demo@meseo.com" },
|
||||
update: {},
|
||||
create: {
|
||||
id: "user_demo",
|
||||
name: "Dylan Mazzei",
|
||||
email: "demo@meseo.com",
|
||||
},
|
||||
});
|
||||
console.log("Created user:", user.email);
|
||||
|
||||
// Create organization
|
||||
const org = await prisma.organization.upsert({
|
||||
where: { slug: "mazzei-agency" },
|
||||
update: {},
|
||||
create: {
|
||||
name: "Mazzei Agency",
|
||||
slug: "mazzei-agency",
|
||||
plan: "pro",
|
||||
},
|
||||
});
|
||||
console.log("Created org:", org.name);
|
||||
|
||||
// Add user as owner
|
||||
await prisma.orgMembership.upsert({
|
||||
where: { userId_orgId: { userId: user.id, orgId: org.id } },
|
||||
update: {},
|
||||
create: { userId: user.id, orgId: org.id, role: "owner" },
|
||||
});
|
||||
console.log("Added user as org owner");
|
||||
|
||||
// Create brands
|
||||
const brands = [
|
||||
{
|
||||
id: "acme-corp",
|
||||
name: "Acme Corp",
|
||||
domain: "acme.com",
|
||||
industry: "Technology",
|
||||
initials: "AC",
|
||||
color: "bg-brand-500",
|
||||
healthScore: 74,
|
||||
websites: [{ url: "https://acme.com", isPrimary: true, pageCount: 1248 }],
|
||||
dashboard: { seoScore: 74, aiVisibility: 12, crawlHealth: 94, monthlyTraffic: 8420, revenue: 24800, revenueChange: 14, alertCount: 7 },
|
||||
profile: {
|
||||
companyName: "Acme Corp",
|
||||
businessType: "SaaS",
|
||||
services: ["SEO Auditing", "Technical SEO", "Content Strategy", "AI Visibility Tracking"],
|
||||
locations: ["New York, NY", "San Francisco, CA"],
|
||||
brandColors: ["#3b5cf0", "#1e293b", "#f8fafc"],
|
||||
targetAudience: "Mid-market B2B SaaS companies",
|
||||
description: "Project management and productivity platform for modern teams.",
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "beacon-health",
|
||||
name: "Beacon Health",
|
||||
domain: "beaconhq.com",
|
||||
industry: "Healthcare",
|
||||
initials: "BH",
|
||||
color: "bg-emerald-500",
|
||||
healthScore: 82,
|
||||
websites: [{ url: "https://beaconhq.com", isPrimary: true, pageCount: 890 }],
|
||||
dashboard: { seoScore: 82, aiVisibility: 18, crawlHealth: 91, monthlyTraffic: 12300, revenue: 38200, revenueChange: 8, alertCount: 3 },
|
||||
profile: {
|
||||
companyName: "Beacon Health",
|
||||
businessType: "Healthcare",
|
||||
services: ["Primary Care", "Telehealth", "Wellness Programs", "Health Coaching"],
|
||||
locations: ["Boston, MA", "Providence, RI"],
|
||||
brandColors: ["#10b981", "#064e3b", "#ecfdf5"],
|
||||
targetAudience: "Health-conscious adults aged 25-55",
|
||||
description: "Modern healthcare platform connecting patients with providers.",
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "nova-digital",
|
||||
name: "Nova Digital",
|
||||
domain: "novadigital.io",
|
||||
industry: "Technology",
|
||||
initials: "ND",
|
||||
color: "bg-violet-500",
|
||||
healthScore: 61,
|
||||
websites: [{ url: "https://novadigital.io", isPrimary: true, pageCount: 412 }],
|
||||
dashboard: { seoScore: 61, aiVisibility: 5, crawlHealth: 78, monthlyTraffic: 3200, revenue: 8400, revenueChange: -3, alertCount: 12 },
|
||||
profile: {
|
||||
companyName: "Nova Digital",
|
||||
businessType: "Agency",
|
||||
services: ["Web Design", "SEO", "PPC", "Social Media Marketing"],
|
||||
locations: ["Austin, TX"],
|
||||
brandColors: ["#8b5cf6", "#4c1d95", "#f5f3ff"],
|
||||
targetAudience: "Small businesses looking for digital marketing services",
|
||||
description: "Full-service digital marketing agency for growing businesses.",
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
for (const b of brands) {
|
||||
await prisma.brand.deleteMany({ where: { id: b.id } });
|
||||
|
||||
const brand = await prisma.brand.create({
|
||||
data: {
|
||||
id: b.id,
|
||||
name: b.name,
|
||||
domain: b.domain,
|
||||
industry: b.industry,
|
||||
initials: b.initials,
|
||||
color: b.color,
|
||||
healthScore: b.healthScore,
|
||||
orgId: org.id,
|
||||
websites: {
|
||||
create: b.websites.map((w) => ({
|
||||
url: w.url,
|
||||
isPrimary: w.isPrimary,
|
||||
pageCount: w.pageCount,
|
||||
})),
|
||||
},
|
||||
dashboardData: {
|
||||
create: b.dashboard,
|
||||
},
|
||||
profile: {
|
||||
create: b.profile,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// Add default integrations per brand
|
||||
const defaultIntegrations: Record<string, string[]> = {
|
||||
"acme-corp": ["gsc", "ga4", "chatgpt", "claude", "callrail", "stripe", "pagespeed", "lighthouse", "sheets"],
|
||||
"beacon-health": ["gsc", "ga4", "gbp", "chatgpt", "claude", "callrail", "pagespeed", "lighthouse"],
|
||||
"nova-digital": ["gsc", "ga4", "chatgpt"],
|
||||
};
|
||||
|
||||
const brandIntegrations = defaultIntegrations[b.id] || [];
|
||||
for (const integrationId of brandIntegrations) {
|
||||
await prisma.brandIntegration.upsert({
|
||||
where: { brandId_integrationId: { brandId: brand.id, integrationId } },
|
||||
update: {},
|
||||
create: {
|
||||
brandId: brand.id,
|
||||
integrationId,
|
||||
connected: true,
|
||||
lastSynced: new Date(Date.now() - Math.random() * 86400000),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
console.log("Created brand:", brand.name, `with ${brandIntegrations.length} integrations`);
|
||||
}
|
||||
|
||||
console.log("Seeding complete!");
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(() => prisma.$disconnect());
|
||||
Reference in New Issue
Block a user