120 lines
3.8 KiB
TypeScript
120 lines
3.8 KiB
TypeScript
'use server'
|
|
|
|
import { prisma } from "@/lib/prisma";
|
|
import { revalidatePath } from "next/cache";
|
|
import { z } from "zod";
|
|
|
|
const MenuSchema = z.object({
|
|
nameId: z.string().min(1, "Nama (ID) wajib diisi"),
|
|
nameEn: z.string().optional(),
|
|
descriptionId: z.string().min(1, "Deskripsi (ID) wajib diisi"),
|
|
descriptionEn: z.string().optional(),
|
|
slug: z.string().min(1, "Slug wajib diisi"),
|
|
parentId: z.string().optional().nullable(),
|
|
isActive: z.boolean().default(true),
|
|
});
|
|
|
|
export async function createMenu(prevState: any, formData: FormData) {
|
|
const validatedFields = MenuSchema.safeParse({
|
|
nameId: formData.get("nameId"),
|
|
nameEn: formData.get("nameEn"),
|
|
descriptionId: formData.get("descriptionId"),
|
|
descriptionEn: formData.get("descriptionEn"),
|
|
slug: formData.get("slug"),
|
|
parentId: formData.get("parentId") === "null" ? null : formData.get("parentId"),
|
|
isActive: formData.get("isActive") === "on",
|
|
});
|
|
|
|
if (!validatedFields.success) {
|
|
return {
|
|
error: validatedFields.error.flatten().fieldErrors,
|
|
};
|
|
}
|
|
|
|
const { nameId, nameEn, descriptionId, descriptionEn, slug, parentId, isActive } = validatedFields.data;
|
|
|
|
try {
|
|
await prisma.menu.create({
|
|
data: {
|
|
name: {
|
|
id: nameId,
|
|
en: nameEn || nameId,
|
|
},
|
|
description: {
|
|
id: descriptionId,
|
|
en: descriptionEn || descriptionId,
|
|
},
|
|
slug,
|
|
parentId,
|
|
isActive,
|
|
updatedBy: "system", // TODO: Get actual user
|
|
},
|
|
});
|
|
|
|
revalidatePath("/dashboard/menu");
|
|
return { success: true, message: "Menu berhasil dibuat" };
|
|
} catch (error) {
|
|
console.error("Failed to create menu:", error);
|
|
return { error: "Gagal membuat menu. Pastikan slug unik." };
|
|
}
|
|
}
|
|
|
|
export async function updateMenu(id: string, prevState: any, formData: FormData) {
|
|
const validatedFields = MenuSchema.safeParse({
|
|
nameId: formData.get("nameId"),
|
|
nameEn: formData.get("nameEn"),
|
|
descriptionId: formData.get("descriptionId"),
|
|
descriptionEn: formData.get("descriptionEn"),
|
|
slug: formData.get("slug"),
|
|
parentId: formData.get("parentId") === "null" ? null : formData.get("parentId"),
|
|
isActive: formData.get("isActive") === "on",
|
|
});
|
|
|
|
if (!validatedFields.success) {
|
|
return {
|
|
error: validatedFields.error.flatten().fieldErrors,
|
|
};
|
|
}
|
|
|
|
const { nameId, nameEn, descriptionId, descriptionEn, slug, parentId, isActive } = validatedFields.data;
|
|
|
|
try {
|
|
await prisma.menu.update({
|
|
where: { id },
|
|
data: {
|
|
name: {
|
|
id: nameId,
|
|
en: nameEn || nameId,
|
|
},
|
|
description: {
|
|
id: descriptionId,
|
|
en: descriptionEn || descriptionId,
|
|
},
|
|
slug,
|
|
parentId,
|
|
isActive,
|
|
updatedBy: "system", // TODO: Get actual user
|
|
},
|
|
});
|
|
|
|
revalidatePath("/dashboard/menu");
|
|
return { success: true, message: "Menu berhasil diperbarui" };
|
|
} catch (error) {
|
|
console.error("Failed to update menu:", error);
|
|
return { error: "Gagal memperbarui menu." };
|
|
}
|
|
}
|
|
|
|
export async function deleteMenu(id: string) {
|
|
try {
|
|
await prisma.menu.delete({
|
|
where: { id },
|
|
});
|
|
revalidatePath("/dashboard/menu");
|
|
return { success: true, message: "Menu berhasil dihapus" };
|
|
} catch (error) {
|
|
console.error("Failed to delete menu:", error);
|
|
return { error: "Gagal menghapus menu" };
|
|
}
|
|
}
|