summaryrefslogblamecommitdiffstats
path: root/server/api/groups.js
blob: 325169d4e7c69857f1fbd337f6bf469cdd984bd1 (plain) (tree)
1
2
3
4
5
6
7
8


                                                         

                                                                
                                                   
                                          
 










                                                                               
                                                                                                                                    











                                                                                                                  
   

  

                                                                               
 







                                                                                 
                                                                                             


                                                  













                                                                                                
                                                        














                                                                     
                                            
            
                           
     
   
  
 





                                                                         
            

                                                          
     



                         
 













                                                                         
 

                                                                               
 




                                                                        
 

                                                                               
 
                              
/* 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', 'ipranges', '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 }, include: ['ipranges'] })
      if (group) await group.update(req.body.data)
    }
    if (group) {
      const promises = []
      // Set group parents
      if (Array.isArray(req.body.parentIds)) promises.push(group.setParents(req.body.parentIds))
      // Update, create or destroy ipranges
      if (Array.isArray(req.body.ipranges)) {
        // Get the ipranges of the group an create a id -> iprange map of them
        const iprangeIdMap = {}
        if (group.ipranges) {
          group.ipranges.forEach(iprange => {
            iprangeIdMap[iprange.id] = iprange
          })
        }
        // Update existing ipranges and create the new ones
        req.body.ipranges.forEach(iprange => {
          if (!iprange.startIp || !iprange.endIp) return
          if (iprange.id) {
            if (iprangeIdMap[iprange.id]) {
              promises.push(iprangeIdMap[iprange.id].update(iprange))
              delete iprangeIdMap[iprange.id]
            }
          } else {
            promises.push(group.createIprange(iprange))
          }
        })
        // Destroy the deleted ipranges
        for (let id in iprangeIdMap) {
          promises.push(iprangeIdMap[id].destroy())
        }
      }
      await Promise.all(promises)
      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