MIF_E31221222/sigap-website/prisma/seed.ts

302 lines
7.2 KiB
TypeScript

const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
// Navigation data structure
const navItemDatas = [
{
title: "Dashboard",
url: "/dashboard",
slug: "dashboard",
orderSeq: 1,
icon: "IconHome",
isActive: true,
subItems: [],
},
{
title: "Crime Management",
url: "/crime-management",
slug: "crime-management",
orderSeq: 2,
icon: "IconAlertTriangle",
isActive: true,
subItems: [
{
title: "Crime Overview",
url: "/crime-management/crime-overview",
slug: "crime-overview",
icon: "IconAlertTriangle",
orderSeq: 1,
isActive: true,
},
{
title: "Crime Categories",
url: "/crime-management/crime-categories",
slug: "crime-categories",
icon: "IconSettings",
orderSeq: 2,
isActive: true,
},
{
title: "Cases",
url: "/crime-management/crime-cases",
slug: "crime-cases",
icon: "IconAlertTriangle",
orderSeq: 3,
isActive: true,
subItems: [
{
title: "New Case",
url: "/crime-management/crime-cases/case-new",
slug: "new-case",
icon: "IconAlertTriangle",
orderSeq: 1,
isActive: true,
},
{
title: "Active Cases",
url: "/crime-management/crime-cases/case-active",
slug: "active-cases",
icon: "IconAlertTriangle",
orderSeq: 2,
isActive: true,
},
{
title: "Resolved Cases",
url: "/crime-management/crime-cases/case-closed",
slug: "resolved-cases",
icon: "IconAlertTriangle",
orderSeq: 3,
isActive: true,
},
],
},
],
},
{
title: "Geographic Data",
url: "/geographic-data",
slug: "geographic-data",
orderSeq: 3,
icon: "IconMap",
isActive: true,
subItems: [
{
title: "Locations",
url: "/geographic-data/locations",
slug: "locations",
icon: "IconMap",
orderSeq: 1,
isActive: true,
subItems: [
{
title: "Cities",
url: "/geographic-data/cities",
slug: "cities",
icon: "IconMap",
orderSeq: 1,
isActive: true,
},
{
title: "Districts",
url: "/geographic-data/districts",
slug: "districts",
icon: "IconMap",
orderSeq: 2,
isActive: true,
},
],
},
{
title: "Geographic Info",
url: "/geographic-data/geographic-info",
slug: "geographic-info",
icon: "IconMap",
orderSeq: 3,
isActive: true,
},
],
},
{
title: "Demographics",
url: "/demographics",
slug: "demographics",
orderSeq: 4,
icon: "IconDatabase",
isActive: true,
subItems: [
{
title: "Demographics Data",
url: "/demographics/demographics-data",
slug: "demographics-data",
icon: "IconDatabase",
orderSeq: 1,
isActive: true,
},
],
},
{
title: "User Management",
url: "/user-management",
slug: "user-management",
orderSeq: 5,
icon: "IconUsers",
isActive: true,
subItems: [
{
title: "Users",
url: "/user-management/users",
slug: "users",
icon: "IconUsers",
orderSeq: 1,
isActive: true,
},
],
},
{
title: "Communication",
url: "/communication",
slug: "communication",
orderSeq: 6,
icon: "IconMessageCircle",
isActive: true,
subItems: [
{
title: "Contact Messages",
url: "/communication/contact-messages",
slug: "contact-messages",
icon: "IconMessageCircle",
orderSeq: 1,
isActive: true,
},
],
},
{
title: "Settings",
url: "/settings",
slug: "settings",
orderSeq: 7,
icon: "IconSettings",
isActive: true,
subItems: [
{
title: "Navigation",
url: "/settings/navigation",
slug: "navigation",
icon: "IconMenu2",
orderSeq: 1,
isActive: true,
subItems: [
{
title: "Nav Items",
url: "/settings/navigation/nav-items",
slug: "nav-items",
icon: "IconMenu2",
orderSeq: 1,
isActive: true,
subSubItems: [
{
title: "Nav Sub Items",
url: "/settings/navigation/nav-sub-items",
slug: "nav-sub-items",
icon: "IconMenu2",
orderSeq: 1,
isActive: true,
},
],
},
],
},
],
},
];
// Helper function to convert icon names
const convertIconName = (iconName: string): string => {
return iconName.replace("Icon", "").toLowerCase();
};
// Helper function to create path
const createPath = (currentPath: string, orderSeq: number): string => {
return currentPath ? `${currentPath}.${orderSeq}` : `${orderSeq}`;
};
// Helper function to calculate level from path
const calculateLevel = (path: string): number => {
return path.split(".").length - 1;
};
// Helper function to process navigation items recursively
const processNavigationItems = (
items: any[],
parentPath: string = ""
): any[] => {
const processed: any[] = [];
items.forEach((item) => {
const currentPath = createPath(parentPath, item.orderSeq);
const navigationItem = {
title: item.title,
url: item.url,
slug: item.slug,
icon: convertIconName(item.icon),
path: currentPath,
level: calculateLevel(currentPath),
isActive: item.isActive,
orderSeq: item.orderSeq,
};
processed.push(navigationItem);
// Process subItems if they exist
if (item.subItems && item.subItems.length > 0) {
const subItems = processNavigationItems(item.subItems, currentPath);
processed.push(...subItems);
}
// Process subSubItems if they exist (for backward compatibility)
if (item.subSubItems && item.subSubItems.length > 0) {
const subSubItems = processNavigationItems(item.subSubItems, currentPath);
processed.push(...subSubItems);
}
});
return processed;
};
async function main() {
// First, delete all existing navigation items
await prisma.navSubItem.deleteMany({});
await prisma.navItem.deleteMany({});
await prisma.navigationItem.deleteMany({});
// Process the navigation data
const navigationItems = processNavigationItems(navItemDatas);
// Create all navigation items
for (const item of navigationItems) {
await prisma.navigationItem.create({
data: {
title: item.title,
url: item.url,
slug: item.slug,
icon: item.icon,
path: item.path,
level: item.level,
isActive: item.isActive,
orderSeq: item.orderSeq,
},
});
}
console.log(`Created ${navigationItems.length} navigation items`);
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});