/* global __appdir */ var path = require('path') var db = require(path.join(__appdir, 'lib', 'sequelize')) var groupUtil = require(path.join(__appdir, 'lib', 'grouputil')) var express = require('express') const { decorateApp } = require('@awaitjs/express'); var router = decorateApp(express.Router()) // ############################################################################ // ########################### GET requests ################################# router.getAsync('', async (req, res) => { const groups = await db.group.findAll({ order: [['name', 'ASC']] }) res.send(groups) }) router.getAsync('/:id', async (req, res) => { const all = req.query.all !== undefined && req.query.all !== 'false' if (req.params.id > 0) { const group = await db.group.findOne({ where: { id: req.params.id }, include: ['parents', 'subgroups', 'clients'] }) if (group) { if (all) res.status(200).send({ ...group.get({ plain: true }), ...await groupUtil.getAllChildren([group]) }) else res.status(200).send(group) } else { res.status(404).end() } } else { const [subgroups, clients] = await Promise.all([ db.group.findAll(all ? {} : { where: { '$parents.id$': null }, include: ['parents'] }), db.client.findAll(all ? {} : { where: { '$groups.id$': null }, include: ['groups'] }) ]) res.send({ id: 0, subgroups, clients }) } }) // ############################################################################ // ########################## POST requests ################################# router.postAsync(['', '/:id'], async (req, res) => { if (req.query.delete !== undefined && req.query.delete !== 'false') { const count = await db.group.destroy({ where: { id: req.body.ids } }) res.status(200).send({ count }) } else { let group if (req.params.id === undefined) group = await db.group.create(req.body.data) else { group = await db.group.findOne({ where: { id: req.params.id } }) if (group) await group.update(req.body.data) } if (group) { await group.setParents(req.body.parentIds) res.status(200).send({ id: group.id }) } else { res.status(404).end() } } }) router.postAsync('/:id/subgroups', async (req, res) => { const group = await db.group.findOne({ where: { id: req.params.id } }) if (group) { if (req.query.delete !== undefined && req.query.delete !== 'false') { const count = await group.removeSubgroups(req.body.ids) res.status(200).send({ count }) } else { const count = await group.addSubgroups(req.body.ids) res.status(200).send({ count }) } } else { res.status(404).end() } }) router.postAsync('/:id/clients', async (req, res) => { const group = await db.group.findOne({ where: { id: req.params.id } }) if (group) { if (req.query.delete !== undefined && req.query.delete !== 'false') { const count = await group.removeClients(req.body.ids) res.status(200).send({ count }) } else { const count = await group.addClients(req.body.ids) res.status(200).send({ count }) } } else { res.status(404).end() } }) // ############################################################################ // ########################## DELETE requests ############################### router.delete('/:id', async (req, res) => { const count = await db.group.destroy({ where: { id: req.params.id } }) if (count) res.status(200).end() else res.status(404).end() }) // ############################################################################ // ############################################################################ module.exports.router = router