import User from '../models/community/user.js'; import UserRight from '../models/community/user_right.js'; import UserRightType from '../models/type/user_right.js'; const menuStructure = { home: { visible: ["all"], children: {}, path: "/" }, friends: { visible: ["all"], children: { manageFriends : { visible: ["all"], path: "/socialnetwork/friends" } }, showLoggedinFriends: 1 }, socialnetwork: { visible: ["all"], children: { guestbook: { visible: ["all"], path: "/socialnetwork/guestbook" }, usersearch: { visible: ["all"], path: "/socialnetwork/search" }, forum: { visible: ["all"], path: "/socialnetwork/forum", showForums: 1 }, gallery: { visible: ["all"], path: "/socialnetwork/gallery" }, blockedUsers: { visible: ["all"], path: "/socialnetwork/blocked" }, oneTimeInvitation: { visible: ["all"], path: "/socialnetwork/onetimeinvitation" }, diary: { visible: ["all"], path: "/socialnetwork/diary" } } }, chats: { visible: ["over12"], children: { multiChat: { visible: ["over12"], action: "openMultiChat" }, randomChat: { visible: ["over12"], action: "openRanomChat" } } }, falukant: { visible: ["all"], children: { create: { visible: ["nofalukantaccount"], path: "/falukant/create" }, overview: { visible: ["hasfalukantaccount"], path: "/falukant/home" }, towns: { visible: ["hasfalukantaccount"], path: "/falukant/towns" }, directors: { visible: ["hasfalukantaccount"], path: "/falukant/directors" }, factory: { visible: ["hasfalukantaccount"], path: "/falukant/factory" }, family: { visible: ["hasfalukantaccount"], path: "/falukant/family" }, house: { visible: ["hasfalukantaccount"], path: "/falukant/house" }, nobility: { visible: ["hasfalukantaccount"], path: "/falukant/nobility" }, politics: { visible: ["hasfalukantaccount"], path: "/falukant/politics" }, education: { visible: ["hasfalukantaccount"], path: "/falukant/education" }, bank: { visible: ["hasfalukantaccount"], path: "/falukant/bank" }, darknet: { visible: ["hasfalukantaccount"], path: "/falukant/darknet" }, reputation: { visible: ["hasfalukantaccount"], path: "/falukant/reputation" }, moneyhistory: { visible: ["hasfalukantaccount"], path: "/falukant/moneyhistory" } } }, minigames: { visible: ["all"], }, settings: { visible: ["all"], children: { homepage: { visible: ["all"], path: "/settings/homepage" }, account: { visible: ["all"], path: "/settings/account" }, personal: { visible: ["all"], path: "/settings/personal" }, view: { visible: ["all"], path: "/settings/view" }, interrests: { visible: ["all"], path: "/settings/interrests" }, sexuality: { visible: ["over14"], path: "/setting/sexuality" }, notifications: { visible: ["all"], path: "/settings/notifications" } } }, administration: { visible: ["anyadmin"], children: { contactrequests: { visible: ["mainadmin", "contactrequests"], path: "/admin/contacts" }, useradministration: { visible: ["mainadmin", "useradministration"], path: "/admin/users" }, forum: { visible: ["mainadmin", "forum"], path: "/admin/forum" }, userrights: { visible: ["mainadmin", "rights"], path: "/admin/rights" }, interrests: { visible: ["mainadmin", "interrests"], path: "/admin/interrests" }, falukant: { visible: ["mainadmin", "falukant"], children: { logentries: { visible: ["mainadmin", "falukant"], path: "/admin/falukant/logentries" }, edituser: { visible: ["mainadmin", "falukant"], path: "/admin/falukant/edituser" }, database: { visible: ["mainadmin", "falukant"], path: "/admin/falukant/database" }, } } } } }; const filterMenu = (menu, rights) => { const filteredMenu = {}; for (const [key, value] of Object.entries(menu)) { if (value.visible.includes("all") || value.visible.some(v => rights.includes(v) || (value.visible.includes("anyadmin") && rights.length > 0))) { const { visible, ...itemWithoutVisible } = value; filteredMenu[key] = { ...itemWithoutVisible }; if (value.children) { filteredMenu[key].children = filterMenu(value.children, rights); } } } return filteredMenu; }; export const menu = async (req, res) => { try { const { userid } = req.params; const user = await User.findOne({ where: { hashedId: userid } }); if (!user) { return res.status(404).json({ error: 'User not found' }); } const userRights = await UserRight.findAll({ where: { userId: user.id }, include: [{ model: UserRightType, as: 'rightType' }] }); const rights = userRights.map(ur => ur.rightType.title); const filteredMenu = filterMenu(menuStructure, rights); res.status(200).json(filteredMenu); } catch (error) { console.error('Error fetching menu:', error); res.status(500).json({ error: 'An error occurred while fetching the menu' }); } };