137 lines
3.8 KiB
TypeScript
137 lines
3.8 KiB
TypeScript
"use server";
|
|
|
|
import { revalidatePath } from "next/cache";
|
|
import { redirect } from "next/navigation";
|
|
import { z } from "zod";
|
|
import type { StatusBriefing } from "@prisma/client";
|
|
import { db } from "@/lib/db";
|
|
import {
|
|
requireAdmin,
|
|
revelarCpfCliente,
|
|
atualizarStatusBriefing
|
|
} from "@/lib/admin-service";
|
|
import { reabrirBriefing } from "@/lib/briefing-service";
|
|
|
|
export type AdminActionState = {
|
|
ok: boolean;
|
|
message?: string;
|
|
value?: string;
|
|
};
|
|
|
|
export async function revelarCpfAction(
|
|
clienteId: string,
|
|
_state: AdminActionState
|
|
): Promise<AdminActionState> {
|
|
const cpf = await revelarCpfCliente(clienteId);
|
|
return { ok: true, value: cpf };
|
|
}
|
|
|
|
export async function mudarStatusAction(formData: FormData) {
|
|
await requireAdmin();
|
|
const briefingId = String(formData.get("briefingId") ?? "");
|
|
const status = String(formData.get("status") ?? "") as StatusBriefing;
|
|
|
|
if (!["ENVIADO", "EM_ANALISE", "CONCLUIDO"].includes(status)) {
|
|
return;
|
|
}
|
|
|
|
await atualizarStatusBriefing(briefingId, status);
|
|
revalidatePath(`/admin/briefings/${briefingId}`);
|
|
}
|
|
|
|
export async function reabrirBriefingAction(formData: FormData) {
|
|
await requireAdmin();
|
|
const briefingId = String(formData.get("briefingId") ?? "");
|
|
await reabrirBriefing(briefingId);
|
|
revalidatePath(`/admin/briefings/${briefingId}`);
|
|
}
|
|
|
|
export async function adicionarNotaInternaAction(formData: FormData) {
|
|
const admin = await requireAdmin();
|
|
const briefingId = String(formData.get("briefingId") ?? "");
|
|
const texto = String(formData.get("texto") ?? "").trim();
|
|
|
|
if (!texto) {
|
|
return;
|
|
}
|
|
|
|
await db.notaInterna.create({
|
|
data: {
|
|
briefingId,
|
|
adminId: admin.id,
|
|
texto
|
|
}
|
|
});
|
|
|
|
revalidatePath(`/admin/briefings/${briefingId}`);
|
|
}
|
|
|
|
const perguntaSchema = z.object({
|
|
perguntaId: z.string().min(1),
|
|
rotulo: z.string().trim().min(1),
|
|
dica: z.string().trim().optional(),
|
|
ordem: z.coerce.number().int().positive(),
|
|
ativo: z.boolean(),
|
|
obrigatoria: z.boolean(),
|
|
oQueResponder: z.string().trim().min(1),
|
|
porQuePerguntamos: z.string().trim().min(1),
|
|
miniExemplo: z.string().trim().min(1)
|
|
});
|
|
|
|
export async function salvarPerguntaAction(formData: FormData) {
|
|
await requireAdmin();
|
|
const parsed = perguntaSchema.safeParse({
|
|
perguntaId: formData.get("perguntaId"),
|
|
rotulo: formData.get("rotulo"),
|
|
dica: formData.get("dica") || undefined,
|
|
ordem: formData.get("ordem"),
|
|
ativo: formData.get("ativo") === "on",
|
|
obrigatoria: formData.get("obrigatoria") === "on",
|
|
oQueResponder: formData.get("oQueResponder"),
|
|
porQuePerguntamos: formData.get("porQuePerguntamos"),
|
|
miniExemplo: formData.get("miniExemplo")
|
|
});
|
|
|
|
if (!parsed.success) {
|
|
return;
|
|
}
|
|
|
|
await db.pergunta.update({
|
|
where: { id: parsed.data.perguntaId },
|
|
data: {
|
|
rotulo: parsed.data.rotulo,
|
|
dica: parsed.data.dica ?? null,
|
|
ordem: parsed.data.ordem,
|
|
ativo: parsed.data.ativo,
|
|
obrigatoria: parsed.data.obrigatoria,
|
|
ajuda: {
|
|
upsert: {
|
|
update: {
|
|
oQueResponder: parsed.data.oQueResponder,
|
|
porQuePerguntamos: parsed.data.porQuePerguntamos,
|
|
miniExemplo: parsed.data.miniExemplo
|
|
},
|
|
create: {
|
|
oQueResponder: parsed.data.oQueResponder,
|
|
porQuePerguntamos: parsed.data.porQuePerguntamos,
|
|
miniExemplo: parsed.data.miniExemplo
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
revalidatePath("/admin/perguntas");
|
|
}
|
|
|
|
export async function irParaClientes(formData: FormData) {
|
|
const busca = String(formData.get("busca") ?? "").trim();
|
|
const tipo = String(formData.get("tipo") ?? "").trim();
|
|
const params = new URLSearchParams();
|
|
|
|
if (busca) params.set("busca", busca);
|
|
if (tipo) params.set("tipo", tipo);
|
|
|
|
redirect(`/admin/clientes${params.size ? `?${params.toString()}` : ""}`);
|
|
}
|