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
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",
|
|
};
|
|
}
|
|
}
|