Refaktoriere Controller-Methoden zur Benutzer-, Event- und Menü-Datenverwaltung, indem die Logik in separate Service-Klassen ausgelagert wird. Implementiere eine verbesserte Fehlerbehandlung und sichere Rückgaben. Füge eine neue Route zur Passwortänderung im Benutzer-Router hinzu.
This commit is contained in:
101
services/MenuDataService.js
Normal file
101
services/MenuDataService.js
Normal file
@@ -0,0 +1,101 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user