"use server"; import { revalidatePath } from "next/cache"; import { z } from "zod"; import { getCurrentUser } from "@/data/auth"; import { deleteRak, insertRak, updateRak, type RakInput } from "@/data/rak"; export type SimpanRakState = { ok: boolean; error?: string; fieldErrors?: { namaRak?: string[] }; values?: { namaRak?: string }; idRak?: number; }; export type HapusRakState = { ok: boolean; error?: string }; const rakSchema = z.object({ namaRak: z .string() .trim() .min(1, "Nama rak wajib diisi") .max(30, "Maksimal 30 karakter"), }); export async function simpanRak( _prevState: SimpanRakState, formData: FormData, ): Promise { const user = await getCurrentUser(); const values = { namaRak: String(formData.get("namaRak") ?? ""), }; const parsed = rakSchema.safeParse(values); if (!parsed.success) { return { ok: false, fieldErrors: z.flattenError(parsed.error).fieldErrors, values, }; } const input: RakInput = parsed.data; const idRaw = String(formData.get("idRak") ?? ""); const id = idRaw ? Number.parseInt(idRaw, 10) : null; if (id !== null && (!Number.isSafeInteger(id) || id <= 0)) { return { ok: false, error: "ID rak tidak valid", values }; } try { if (id !== null) { const updated = await updateRak(id, input); if (!updated) { return { ok: false, error: "Rak tidak ditemukan", values }; } revalidatePath("/master/rak"); return { ok: true, idRak: id }; } const idBaru = await insertRak(input); revalidatePath("/master/rak"); return { ok: true, idRak: idBaru }; } catch (error) { console.error( "[simpanRak] gagal", { userId: user.id, idRak: id ?? "(baru)", nama: input.namaRak, }, error, ); return { ok: false, error: "Gagal menyimpan rak, coba simpan ulang", values, }; } } export async function hapusRak( _prevState: HapusRakState, formData: FormData, ): Promise { const user = await getCurrentUser(); const id = Number.parseInt(String(formData.get("idRak") ?? ""), 10); if (!Number.isSafeInteger(id) || id <= 0) { return { ok: false, error: "ID rak tidak ada" }; } try { const deleted = await deleteRak(id); if (!deleted) { return { ok: false, error: "Rak tidak ditemukan" }; } revalidatePath("/master/rak"); return { ok: true }; } catch (error) { console.error("[hapusRak] gagal", { userId: user.id, id }, error); return { ok: false, error: "Gagal menghapus rak, coba hapus ulang", }; } }