import { PrismaClient } from '@prisma/client' import { readdirSync, readFileSync } from 'fs' import { join, resolve } from 'path' import { Pool } from 'pg' import { PrismaPg } from '@prisma/adapter-pg' const connectionString = process.env.DATABASE_URL const pool = new Pool({ connectionString }) const adapter = new PrismaPg(pool) const prisma = new PrismaClient({ adapter }) async function main() { console.log('Seeding initial maps from .canvas files...') const rootDir = resolve(process.cwd()) const files = readdirSync(rootDir).filter(f => f.endsWith('.canvas')) // We'll assign these to the first admin user const adminUser = await prisma.user.findFirst({ where: { role: 'admin' } }) const ownerId = adminUser?.id || '1' for (const file of files) { try { const filePath = join(rootDir, file) const data = JSON.parse(readFileSync(filePath, 'utf-8')) const id = file.replace('.canvas', '') const existing = await prisma.canvas.findUnique({ where: { id } }) if (!existing) { await prisma.canvas.create({ data: { id, name: data.name || id, ownerId, isPublic: true, // Make public so anyone can view/edit nodes: data.nodes || [], edges: data.edges || [] } }) console.log(`✅ Seeded map: ${id}`) } else { console.log(`⏩ Map ${id} already exists, skipping.`) } } catch (e) { console.error(`❌ Failed to read or seed ${file}:`, e) } } // Also seed the xflow-project from db.ts manually if it's not in the files try { const { canvases } = await import('../app/server/utils/db.js') const xflowProject = canvases.get('xflow-project') if (xflowProject) { const existing = await prisma.canvas.findUnique({ where: { id: 'xflow-project' } }) if (!existing) { await prisma.canvas.create({ data: { id: xflowProject.id, name: xflowProject.name, ownerId: xflowProject.ownerId || ownerId, isPublic: true, nodes: xflowProject.nodes as any, edges: xflowProject.edges as any } }) console.log(`✅ Seeded map: xflow-project (from db.ts)`) } } } catch (e) { console.error('Could not seed xflow-project from db.ts', e) } } main() .catch(e => { console.error(e) process.exit(1) }) .finally(async () => { await prisma.$disconnect() })