From 7a888b445315d74ef66480d0b8902a0ae4825811 Mon Sep 17 00:00:00 2001 From: Udo Walter Date: Thu, 15 Nov 2018 00:56:01 +0000 Subject: [groups] fix api method to get a group taking way to long with all=true This also fixes timeout crashes that occurred if a group had a lot of subgroups --- server/api/groups.js | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) (limited to 'server/api/groups.js') diff --git a/server/api/groups.js b/server/api/groups.js index 0ea45fb..44516f7 100644 --- a/server/api/groups.js +++ b/server/api/groups.js @@ -2,25 +2,16 @@ var path = require('path') var db = require(path.join(__appdir, 'lib', 'sequelize')) -function includeAllChilds (group, groupIdChain = []) { - const newIdChain = [...groupIdChain, group.id] - return new Promise((resolve, reject) => { - group.getSubgroups({ include: ['subgroups', 'clients'] }).then(subgroups => { - const subgroupPromises = [] - subgroups.forEach(subgroup => { - if (!groupIdChain.includes(subgroup.id)) { - subgroupPromises.push(includeAllChilds(subgroup, newIdChain)) - } - }) - Promise.all(subgroupPromises).then(result => { - result.forEach(resolvedSubgroup => { - resolvedSubgroup.subgroups.forEach(x => { if (!group.subgroups.includes(x)) group.subgroups.push(x) }) - resolvedSubgroup.clients.forEach(x => { if (!group.clients.includes(x)) group.clients.push(x) }) - }) - resolve(group) - }) - }) - }) +async function getAllSubgroups (groups, knownGroupIds = []) { + var subgroups = (await db.group.findAll({ + where: { '$parents.id$': groups.map(x => x.id) }, + include: ['parents', 'subgroups', 'clients'] + })).filter(subgroup => !knownGroupIds.includes(subgroup.id)) + if (subgroups.length > 0) { + var subSubgroups = await getAllSubgroups(subgroups, [...knownGroupIds, ...subgroups.map(g => g.id)]) + return [...subgroups, ...subSubgroups] + } + return [] } // GET Requests @@ -36,9 +27,9 @@ module.exports.get = { getGroup: function (req, res) { const all = req.query.all === 'true' if (req.query.id > 0) { - db.group.findOne({ where: { id: req.query.id }, include: ['parents', 'subgroups', 'clients'] }).then(group => { + db.group.findOne({ where: { id: req.query.id }, include: ['parents', 'subgroups', 'clients'] }).then(async group => { if (group) { - if (all) includeAllChilds(group).then(x => res.send(x)) + if (all) res.send({ ...group.get({ plain: true }), subgroups: await getAllSubgroups(group.subgroups) }) else res.send(group) } else { res.status(404).end() -- cgit v1.2.3-55-g7522