155 lines
3.9 KiB
TypeScript
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();
|
|
});
|