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();