Add API endpoint to fetch menu item tree

This commit is contained in:
garrettmills 2020-02-08 12:36:42 -06:00
parent 617a77b809
commit 85e0af2e9d
3 changed files with 47 additions and 0 deletions

View File

@ -0,0 +1,36 @@
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 root_page = await req.user.get_root_page()
const nodes = await this._build_menu_object(root_page)
return res.api(nodes)
}
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.Name,
children: await this._build_menu_object(child),
})
}
}
return arr
}
}
module.exports = exports = Menu

View File

@ -6,12 +6,21 @@ const AuthUser = require('flitter-auth/model/User')
* properties here as you need. * properties here as you need.
*/ */
class User extends AuthUser { class User extends AuthUser {
static get services() {
return [...super.services, 'models']
}
static get schema() { static get schema() {
return {...super.schema, ...{ return {...super.schema, ...{
// other schema fields here // other schema fields here
}} }}
} }
async get_root_page() {
const Page = this.models.get('api:Page')
return Page.findOne({OrgUserId: this._id, ParentId: '0'})
}
// Other members and methods here // Other members and methods here
} }

View File

@ -39,6 +39,8 @@ const index = {
'/hello_world': ['controller::api:v1:Misc.hello_world'], '/hello_world': ['controller::api:v1:Misc.hello_world'],
'/page/:PageId': ['controller::api:v1:Page.get_page'], '/page/:PageId': ['controller::api:v1:Page.get_page'],
'/page/:PageId/nodes': ['controller::api:v1:Page.get_nodes'], '/page/:PageId/nodes': ['controller::api:v1:Page.get_nodes'],
'/menu/items': ['controller::api:v1:Menu.get_items'],
}, },
post: { post: {