42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { prisma } from '@/lib/prisma';
|
|
import { getLocale } from 'next-intl/server';
|
|
|
|
export async function GET() {
|
|
try {
|
|
const locale = await getLocale();
|
|
|
|
const menus = await prisma.menu.findMany({
|
|
where: { isActive: true },
|
|
include: {
|
|
parent: true,
|
|
},
|
|
orderBy: { createdAt: 'asc' },
|
|
});
|
|
|
|
const getLocalizedName = (json: any) => {
|
|
if (!json) return '';
|
|
return json[locale] || json['id'] || json['en'] || '';
|
|
};
|
|
|
|
const formattedMenus = menus.map((menu) => {
|
|
const name = getLocalizedName(menu.name);
|
|
const parentName = menu.parent ? getLocalizedName(menu.parent.name) : '';
|
|
return {
|
|
id: menu.id,
|
|
title: parentName ? `${parentName} > ${name}` : name,
|
|
};
|
|
});
|
|
|
|
// Sort by title for better UX
|
|
formattedMenus.sort((a, b) => a.title.localeCompare(b.title));
|
|
|
|
return NextResponse.json({ success: true, data: formattedMenus });
|
|
} catch (error) {
|
|
console.error('Error fetching menus:', error);
|
|
return NextResponse.json(
|
|
{ success: false, message: 'Failed to fetch menus' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
} |