Files
SeConectai_Web/app/(admin)/admin/actions.ts
T

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