summaryrefslogtreecommitdiffstats
path: root/server/lib
diff options
context:
space:
mode:
authorUdo Walter2019-04-13 03:02:35 +0200
committerUdo Walter2019-04-13 03:02:35 +0200
commitd36aa69cd10a030aaa374ab54b2ca8d7108afd08 (patch)
tree7479f73f6a50d3e69a3354dba697f7a9764ef8f3 /server/lib
parent[webapp/groups] yet another small redesign (diff)
downloadbas-d36aa69cd10a030aaa374ab54b2ca8d7108afd08.tar.gz
bas-d36aa69cd10a030aaa374ab54b2ca8d7108afd08.tar.xz
bas-d36aa69cd10a030aaa374ab54b2ca8d7108afd08.zip
[server/grouputil] fix bug: not checking for duplicate children
Diffstat (limited to 'server/lib')
-rw-r--r--server/lib/grouputil.js26
1 files changed, 20 insertions, 6 deletions
diff --git a/server/lib/grouputil.js b/server/lib/grouputil.js
index edbe2eb..75da209 100644
--- a/server/lib/grouputil.js
+++ b/server/lib/grouputil.js
@@ -2,19 +2,33 @@
var path = require('path')
var db = require(path.join(__appdir, 'lib', 'sequelize'))
-async function getAllChildren (groups, knownGroupIds = []) {
- groups = groups.filter(subgroup => !knownGroupIds.includes(subgroup.id))
- var groupIds = groups.map(g => g.id)
- knownGroupIds = [...knownGroupIds, ...groupIds]
- var [subgroups, clients] = await Promise.all([
+async function getAllChildren (groups) {
+ return await getAllChildrenByIds(groups.map(x => x.id), {}, {})
+}
+
+async function getAllChildrenByIds (groupIds, knownGroupMap, knownClientMap) {
+ let [subgroups, clients] = await Promise.all([
db.group.findAll({ where: { '$parents.id$': groupIds }, include: ['parents'] }),
db.client.findAll({ where: { '$groups.id$': groupIds }, include: ['groups'] })
])
+
+ subgroups = subgroups.filter(subgroup => !knownGroupMap[subgroup.id])
+ clients = clients.filter(client => !knownClientMap[client.id])
+
if (subgroups.length > 0) {
- var subChildren = await getAllChildren(subgroups, knownGroupIds)
+ let groupIds = subgroups.map(x => x.id)
+ for (let i in groupIds) {
+ knownGroupMap[groupIds[i]] = true
+ }
+ let clientIds = clients.map(x => x.id)
+ for (let i in clientIds) {
+ knownClientMap[clientIds[i]] = true
+ }
+ let subChildren = await getAllChildrenByIds(groupIds, knownGroupMap, knownClientMap)
subgroups = [...subgroups, ...subChildren.subgroups]
clients = [...clients, ...subChildren.clients]
}
+
return { subgroups, clients }
}