const Controller = require('libflitter/controller/Controller') /* * Menu Controller * ------------------------------------------------------------- * Put some description here! */ class Menu extends Controller { static get services() { return [...super.services, 'models'] } async get_items(req, res) { const Page = this.models.get('api:Page') // Build the "My Tree" option const root_page = await req.user.get_root_page() const nodes = await this._build_menu_object(root_page) const menu = [] menu.push({ id: 0, name: 'My Info Tree', children: nodes, noDelete: true, virtual: true, type: 'branch', }) // Get view only shared trees const view_only_trees = await Page.find({ shared_users_view: req.user._id }) const view_only_nodes = [] for ( const tree of view_only_trees ) { if ( !(await tree.is_accessible_by(req.user)) ) continue view_only_nodes.push({ id: tree.UUID, name: tree.Name, children: await this._build_secure_menu_object(tree, req.user), level: await tree.access_level_for(req.user), type: 'page', }) } // Get update, view shared trees const update_trees = await Page.find({ shared_users_update: req.user._id }) const update_nodes = [] for ( const tree of update_trees ) { if ( !(await tree.is_accessible_by(req.user)) ) continue update_nodes.push({ id: tree.UUID, name: tree.Name, children: await this._build_secure_menu_object(tree, req.user), level: await tree.access_level_for(req.user), type: 'page', }) } // Get update, view, manage shared trees const manage_trees = await Page.find({ shared_users_manage: req.user._id }) const manage_nodes = [] for ( const tree of manage_trees ) { if ( !(await tree.is_accessible_by(req.user)) ) continue manage_nodes.push({ id: tree.UUID, name: tree.Name, children: await this._build_secure_menu_object(tree, req.user), level: await tree.access_level_for(req.user), type: 'page', }) } menu.push({ id: 0, name: 'Trees Shared With Me', children: [...view_only_nodes, ...update_nodes, ...manage_nodes], noDelete: true, noChildren: true, virtual: true, type: 'branch', }) return res.api(menu) } async _build_menu_object(parent_node, arr= []) { const children = await this.models.get('api:Page').find({UUID: {$in: parent_node.ChildPageIds}}) if ( children ) { for ( const child of children ) { arr.push({ id: child.UUID, name: child.is_shared() ? child.Name + ' ⁽ˢʰᵃʳᵉᵈ⁾' : child.Name, shared: child.is_shared(), children: [...(await child.get_menu_items()), ...(await this._build_menu_object(child))], type: 'page', }) } } return arr } async _build_secure_menu_object(parent_node, user, arr = []) { const children = await parent_node.childPages if ( children ) { for ( const child of children ) { if ( !(await child.is_accessible_by(user)) ) continue arr.push({ id: child.UUID, name: child.Name, children: await this._build_secure_menu_object(child, user), level: await child.access_level_for(user), type: 'page', }) } } return arr } } module.exports = exports = Menu