102 lines
2.5 KiB
JavaScript
102 lines
2.5 KiB
JavaScript
const { MenuItem } = require('../models');
|
|
|
|
class MenuDataService {
|
|
/**
|
|
* Alle Menü-Daten abrufen
|
|
*/
|
|
async getMenuData() {
|
|
try {
|
|
const menuItems = await MenuItem.findAll({
|
|
order: [['order_id', 'ASC']],
|
|
include: [{
|
|
model: MenuItem,
|
|
as: 'submenu',
|
|
required: false,
|
|
order: [['order_id', 'ASC']]
|
|
}]
|
|
});
|
|
|
|
const menuData = this.buildMenuStructure(menuItems);
|
|
return menuData;
|
|
} catch (error) {
|
|
console.error('Error fetching menu data:', error);
|
|
throw new Error('MENU_DATA_FETCH_ERROR');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menü-Daten speichern
|
|
*/
|
|
async saveMenuData(menuData) {
|
|
try {
|
|
if (!Array.isArray(menuData)) {
|
|
throw new Error('VALIDATION_ERROR: Menü-Daten müssen ein Array sein');
|
|
}
|
|
|
|
// Menü-Daten anpassen
|
|
const adjustedMenuData = menuData.map(item => {
|
|
item.parent_id = item.parent_id < 0 ? null : item.parent_id;
|
|
return item;
|
|
}).sort((a, b) => (a.parent_id === null ? -1 : 1) - (b.parent_id === null ? -1 : 1));
|
|
|
|
// Alle bestehenden Menü-Items löschen
|
|
await MenuItem.destroy({ where: {} });
|
|
|
|
// Neue Menü-Items erstellen
|
|
for (const item of adjustedMenuData) {
|
|
await MenuItem.create(item);
|
|
}
|
|
|
|
return { message: 'Menü-Daten erfolgreich gespeichert' };
|
|
} catch (error) {
|
|
console.error('Error saving menu data:', error);
|
|
throw new Error('MENU_DATA_SAVE_ERROR');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menü-Struktur aufbauen
|
|
*/
|
|
buildMenuStructure(menuItems) {
|
|
const menu = [];
|
|
const itemMap = {};
|
|
|
|
// Alle Items in Map speichern
|
|
menuItems.forEach(item => {
|
|
itemMap[item.id] = {
|
|
id: item.id,
|
|
name: item.name,
|
|
link: item.link,
|
|
component: item.component,
|
|
showInMenu: item.show_in_menu,
|
|
requiresAuth: item.requires_auth,
|
|
order_id: item.order_id,
|
|
pageTitle: item.page_title,
|
|
image: item.image,
|
|
submenu: []
|
|
};
|
|
});
|
|
|
|
// Hierarchie aufbauen
|
|
menuItems.forEach(item => {
|
|
if (item.parent_id) {
|
|
if (itemMap[item.parent_id]) {
|
|
itemMap[item.parent_id].submenu.push(itemMap[item.id]);
|
|
}
|
|
} else {
|
|
menu.push(itemMap[item.id]);
|
|
}
|
|
});
|
|
|
|
// Sortierung anwenden
|
|
menu.sort((a, b) => a.order_id - b.order_id);
|
|
menu.forEach(item => {
|
|
item.submenu.sort((a, b) => a.order_id - b.order_id);
|
|
});
|
|
|
|
return menu;
|
|
}
|
|
}
|
|
|
|
module.exports = new MenuDataService();
|