212 lines
5.2 KiB
TypeScript
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",
|
|
// };
|
|
// }
|
|
// }
|