You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.5 KiB
TypeScript

"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";
import {
logActionError,
type DeleteState,
type FormState,
} from "@/lib/server-action";
export type SimpanRakState = FormState<"namaRak">;
export type HapusRakState = DeleteState;
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<SimpanRakState> {
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 };
}
await insertRak(input);
revalidatePath("/master/rak");
return { ok: true };
} catch (error) {
logActionError(
"simpanRak",
{
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<HapusRakState> {
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) {
logActionError("hapusRak", { userId: user.id, id }, error);
return {
ok: false,
error: "Gagal menghapus rak, coba hapus ulang",
};
}
}