MIF_E31221222/sigap-website/actions/dashboard/nav-items.ts

212 lines
5.2 KiB
TypeScript

"use server";
import {
NavItems,
navItemsDeleteSchema,
NavItemsInsert,
navItemsInsertSchema,
navItemsUpdateSchema,
} from "@/src/applications/entities/models/nav-items.model";
import { NavItemsRepository } from "@/src/applications/repositories/nav-items.repository";
import { NavItemsRepositoryImpl } from "@/src/infrastructure/repositories/nav-items.repository.impl";
import { revalidatePath } from "next/cache";
import { z } from "zod";
// Initialize repository
const navItemsRepo: NavItemsRepository = new NavItemsRepositoryImpl();
/**
* Get all navigation items
*/
export async function getNavItems() {
return await navItemsRepo.getNavItems();
}
/**
* Create a new navigation item
*/
export async function createNavItem(
formData: FormData | Record<string, NavItems>
) {
try {
const data =
formData instanceof FormData
? Object.fromEntries(formData.entries())
: formData;
// Parse and validate input data
const validatedData = navItemsInsertSchema.parse(data);
// Call repository method (assuming it exists)
const result = await navItemsRepo.createNavItems(validatedData);
// Revalidate cache if successful
if (result.success) {
revalidatePath("/admin/navigation");
}
return result;
} catch (error) {
if (error instanceof z.ZodError) {
return {
success: false,
errors: error.errors.reduce(
(acc, curr) => {
acc[curr.path.join(".")] = curr.message;
return acc;
},
{} as Record<string, string>
),
message: "Validation failed",
};
}
return {
success: false,
error: "Failed to create navigation item",
message:
error instanceof Error ? error.message : "Unknown error occurred",
};
}
}
/**
* Update an existing navigation item
*/
export async function updateNavItem(
id: string,
formData: FormData | Record<string, unknown>
) {
try {
const data =
formData instanceof FormData
? Object.fromEntries(formData.entries())
: formData;
// Parse and validate input data
const validatedData = navItemsUpdateSchema.parse(data);
// Call repository method (assuming it exists)
const result = await navItemsRepo.updateNavItems(id, validatedData);
// Revalidate cache if successful
if (result.success) {
revalidatePath("/admin/navigation");
}
return result;
} catch (error) {
if (error instanceof z.ZodError) {
return {
success: false,
errors: error.errors.reduce(
(acc, curr) => {
acc[curr.path.join(".")] = curr.message;
return acc;
},
{} as Record<string, string>
),
message: "Validation failed",
};
}
return {
success: false,
error: "Failed to update navigation item",
message:
error instanceof Error ? error.message : "Unknown error occurred",
};
}
}
/**
* Delete a navigation item
*/
export async function deleteNavItem(id: string) {
try {
// Parse and validate input
const validatedData = navItemsDeleteSchema.parse({ id });
// Call repository method (assuming it exists)
const result = await navItemsRepo.deleteNavItems(validatedData.id);
// Revalidate cache if successful
if (result.success) {
revalidatePath("/admin/navigation");
}
return result;
} catch (error) {
if (error instanceof z.ZodError) {
return {
success: false,
errors: error.errors.reduce(
(acc, curr) => {
acc[curr.path.join(".")] = curr.message;
return acc;
},
{} as Record<string, string>
),
message: "Validation failed",
};
}
return {
success: false,
error: "Failed to delete navigation item",
message:
error instanceof Error ? error.message : "Unknown error occurred",
};
}
}
// /**
// * Toggle active status of a navigation item
// */
// export async function toggleNavItemActive(id: string) {
// try {
// // Call repository method (assuming it exists)
// const result = await navItemsRepo.toggleActive(id);
// // Revalidate cache if successful
// if (result.success) {
// revalidatePath("/admin/navigation");
// }
// return result;
// } catch (error) {
// return {
// success: false,
// error: "Failed to toggle navigation item status",
// message:
// error instanceof Error ? error.message : "Unknown error occurred",
// };
// }
// }
// /**
// * Update navigation items order
// */
// export async function updateNavItemsOrder(
// items: { id: string; order_seq: number }[]
// ) {
// try {
// // Call repository method (assuming it exists)
// const result = await navItemsRepo.updateOrder(items);
// // Revalidate cache if successful
// if (result.success) {
// revalidatePath("/admin/navigation");
// }
// return result;
// } catch (error) {
// return {
// success: false,
// error: "Failed to update navigation order",
// message:
// error instanceof Error ? error.message : "Unknown error occurred",
// };
// }
// }