/* global __appdir */ 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) }) }) }) } // GET Requests module.exports.get = { // get a list containing id and name of all groups getList: function (req, res) { db.group.findAll({ attributes: ['id', 'name', 'description'], order: [['name', 'ASC']] }).then(list => { res.send(list) }) }, // get name, description, parents, subgroups and clients of a group (by id) 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 => { if (group) { if (all) includeAllChilds(group).then(x => res.send(x)) else res.send(group) } else { res.status(404).end() } }) } else { Promise.all([db.group.findAll(all ? {} : { where: { '$parents.id$': null }, include: ['parents'] }), db.client.findAll(all ? {} : { where: { '$groups.id$': null }, include: ['groups'] })]).then(result => { res.send({ id: 0, subgroups: result[0], clients: result[1] }) }) } } } // POST Requests module.exports.post = { // create group or update information of a group (returns id) save: function (req, res) { if (req.body.id > 0) { db.group.findOne({ where: { id: req.body.id } }).then(group => { if (group) { var promises = [] if (req.body.info) promises.push(group.update(req.body.info)) if (req.body.parentIds) promises.push(group.setParents(req.body.parentIds)) Promise.all(promises).then(() => { res.send({ id: req.body.id }) }) } else { res.status(404).end() } }) } else { db.group.create(req.body.info).then(group => { if (req.body.parentIds) group.setParents(req.body.parentIds).then(() => { res.send({ id: group.id }) }) }) } }, // delete groups delete: function (req, res) { db.group.destroy({ where: { id: req.body.ids } }).then(count => { res.send({ count }) }) }, // remove subgroups from a group removeSubgroups: function (req, res) { db.group.findOne({ where: { id: req.body.id } }).then(group => { if (group) { group.removeSubgroups(req.body.ids).then(() => { res.end() }) } else { res.status(404).end() } }) }, // remove clients from a group removeClients: function (req, res) { db.group.findOne({ where: { id: req.body.id } }).then(group => { if (group) { group.removeClients(req.body.ids).then(() => { res.end() }) } else { res.status(404).end() } }) }, // add subgroups to a group addSubgroups: function (req, res) { db.group.findOne({ where: { id: req.body.id } }).then(group => { if (group) { group.addSubgroups(req.body.ids).then(() => { res.end() }) } else { res.status(404).end() } }) }, // add clients to a group addClients: function (req, res) { db.group.findOne({ where: { id: req.body.id } }).then(group => { if (group) { group.addClients(req.body.ids).then(() => { res.end() }) } else { res.status(404).end() } }) } }