kreativortex/app/[locale]/(app)/dashboard/menu/actions.ts
Jessica Rekcah 4253483f44 jalan
2025-12-02 00:22:34 +07:00

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