summaryrefslogtreecommitdiffstats
path: root/server/api/groups.js
diff options
context:
space:
mode:
authorUdo Walter2018-11-15 01:56:01 +0100
committerUdo Walter2018-11-15 01:56:01 +0100
commit7a888b445315d74ef66480d0b8902a0ae4825811 (patch)
treed3c1e9828a377be1006bd207f5b0626997ad9c0d /server/api/groups.js
parent[idoit] Clients are now added to the idoit backend (diff)
downloadbas-7a888b445315d74ef66480d0b8902a0ae4825811.tar.gz
bas-7a888b445315d74ef66480d0b8902a0ae4825811.tar.xz
bas-7a888b445315d74ef66480d0b8902a0ae4825811.zip
[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
Diffstat (limited to 'server/api/groups.js')
-rw-r--r--server/api/groups.js33
1 files changed, 12 insertions, 21 deletions
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()