module.exports = Self => { Self.remoteMethodCtx('getLeaves', { description: 'Returns the nodes for a department', accepts: [{ arg: 'parentId', type: 'Number', description: 'Get the children of the specified father', }, { arg: 'search', type: 'String', description: 'Filter nodes whose name starts with', }], returns: { type: ['object'], root: true }, http: { path: `/getLeaves`, verb: 'GET' } }); Self.getLeaves = async(ctx, parentId = null, search) => { let [res] = await Self.rawSql( `CALL department_getLeaves(?, ?)`, [parentId, search], {userId: ctx.req.accessToken.userId} ); let map = new Map(); for (let node of res) { if (!map.has(node.parentFk)) map.set(node.parentFk, []); map.get(node.parentFk).push(node); } function setLeaves(nodes) { if (!nodes) return; for (let node of nodes) { node.childs = map.get(node.id); setLeaves(node.childs); } } let leaves = map.get(parentId); setLeaves(leaves); return leaves || []; }; };