module.exports = Self => { Self.remoteMethod('getLeaves', { description: 'Returns the nodes for a department', accepts: [{ arg: 'parentFk', 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(parentFk = null, search) => { let [res] = await Self.rawSql( `CALL department_getLeaves(?, ?)`, [parentFk, search] ); 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(parentFk); setLeaves(leaves); return leaves || []; }; };