Files

155 lines
3.9 KiB
TypeScript

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();
});