From d36aa69cd10a030aaa374ab54b2ca8d7108afd08 Mon Sep 17 00:00:00 2001 From: Udo Walter Date: Sat, 13 Apr 2019 01:02:35 +0000 Subject: [server/grouputil] fix bug: not checking for duplicate children --- server/lib/grouputil.js | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'server/lib/grouputil.js') 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 } } -- cgit v1.2.3-55-g7522