import { PrismaClient, TipoPergunta } from "@prisma/client"; import argon2 from "argon2"; import briefingSeed from "./briefing-seed.json"; const prisma = new PrismaClient(); type SeedPergunta = { ordem: number; rotulo: string; dica?: string; tipo: keyof typeof TipoPergunta; opcoes: string[]; permiteComplemento?: boolean; obrigatoria?: boolean; ajuda: { oQueResponder: string; porQuePerguntamos: string; miniExemplo: string; }; }; type SeedSecao = { ordem: number; titulo: string; descricao?: string; perguntas: SeedPergunta[]; }; async function seedConfiguracoes() { const meta = briefingSeed.meta; await prisma.configuracao.upsert({ where: { chave: "comoPreencher" }, update: { valor: meta.comoPreencher }, create: { chave: "comoPreencher", valor: meta.comoPreencher } }); await prisma.configuracao.upsert({ where: { chave: "avisoSenhas" }, update: { valor: meta.avisoSenhas }, create: { chave: "avisoSenhas", valor: meta.avisoSenhas } }); await prisma.configuracao.upsert({ where: { chave: "confirmacaoCliente" }, update: { valor: meta.confirmacaoCliente }, create: { chave: "confirmacaoCliente", valor: meta.confirmacaoCliente } }); } async function seedBriefing() { for (const secaoSeed of briefingSeed.secoes as SeedSecao[]) { const secao = await prisma.secao.upsert({ where: { ordem: secaoSeed.ordem }, update: { titulo: secaoSeed.titulo, descricao: secaoSeed.descricao ?? null, ativo: true }, create: { ordem: secaoSeed.ordem, titulo: secaoSeed.titulo, descricao: secaoSeed.descricao ?? null, ativo: true } }); for (const perguntaSeed of secaoSeed.perguntas) { const pergunta = await prisma.pergunta.upsert({ where: { secaoId_ordem: { secaoId: secao.id, ordem: perguntaSeed.ordem } }, update: { rotulo: perguntaSeed.rotulo, dica: perguntaSeed.dica ?? null, tipo: perguntaSeed.tipo, opcoes: perguntaSeed.opcoes, obrigatoria: perguntaSeed.obrigatoria ?? false, permiteComplemento: perguntaSeed.permiteComplemento ?? false, ativo: true }, create: { secaoId: secao.id, ordem: perguntaSeed.ordem, rotulo: perguntaSeed.rotulo, dica: perguntaSeed.dica ?? null, tipo: perguntaSeed.tipo, opcoes: perguntaSeed.opcoes, obrigatoria: perguntaSeed.obrigatoria ?? false, permiteComplemento: perguntaSeed.permiteComplemento ?? false, ativo: true } }); await prisma.ajuda.upsert({ where: { perguntaId: pergunta.id }, update: { oQueResponder: perguntaSeed.ajuda.oQueResponder, porQuePerguntamos: perguntaSeed.ajuda.porQuePerguntamos, miniExemplo: perguntaSeed.ajuda.miniExemplo }, create: { perguntaId: pergunta.id, oQueResponder: perguntaSeed.ajuda.oQueResponder, porQuePerguntamos: perguntaSeed.ajuda.porQuePerguntamos, miniExemplo: perguntaSeed.ajuda.miniExemplo } }); } } } async function seedAdmin() { const email = process.env.ADMIN_EMAIL?.trim().toLowerCase(); const password = process.env.ADMIN_INITIAL_PASSWORD; if (!email || !password) { return; } const existingAdmin = await prisma.user.findUnique({ where: { email } }); if (existingAdmin) { return; } await prisma.user.create({ data: { email, senhaHash: await argon2.hash(password), papel: "ADMIN" } }); } async function main() { await seedConfiguracoes(); await seedBriefing(); await seedAdmin(); } main() .catch((error) => { process.stderr.write(`Seed falhou: ${error instanceof Error ? error.message : "erro desconhecido"}\n`); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });