summaryrefslogblamecommitdiffstats
path: root/server/api/events.js
blob: 6ec37c4f07000db043ef5fa13db0af36bc298235 (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                                                         
                                                                    


                                                   


                                              







                                                                               
                                                                                                                







                                                           
                                                                                   






                                                                               

                                                            
                                                                              
   
                                                    
                        
                                                                     
                       
                              





                                                                                                                   


                                








                                                                        
                             
                                                                                                                                                                                                                         





                                                                                                            
                               



                                       
                                             
                        
                                                                                                                                                                                                                         





                                                                                                          
                             








                                                                               
/* global __appdir */
var path = require('path')
var db = require(path.join(__appdir, 'lib', 'sequelize'))
var groupHelper = require(path.join(__appdir, 'lib', 'grouphelper'))
var express = require('express')
const { decorateApp } = require('@awaitjs/express')
var router = decorateApp(express.Router())
const zmq = require('zeromq')
const socket = zmq.socket('push')
socket.connect('ipc:///tmp/bas_zeromq_events')

// ############################################################################
// ###########################  GET requests  #################################

/*
  * @return: Returns event of given id.
  */
router.getAsync('/:id', async (req, res) => {
  var event = await db.event.findOne({ where: { id: req.params.id }, include: ['config', 'clients', 'groups'] })
  if (event) res.send(event)
  else res.status(404).end()
})

/*
   * @return: Returns a list of all events in the database.
   */
router.getAsync('', async (req, res) => {
  var events = await db.event.findAll({ include: ['config', 'clients', 'groups'] })
  if (events) res.status(200).send(events)
  else res.status(404).end()
})

// ############################################################################
// ##########################  POST requests  #################################

/*
 * @return: Returns a list of all childs of the given groups
 * Is also used by the PermissionManager Frontend to get it's blacklist childs
 */
router.postAsync('/blacklist', async (req, res) => {
  if (req.body.groups) {
    var blacklist = await groupHelper.getAllChildren(req.body.groups)
    res.send(blacklist)
  } else res.status(404).end()
})

// Create, Update or Delete POST
router.postAsync(['', '/:id'], async (req, res) => {
  if (req.query.delete !== undefined && req.query.delete !== 'false') {
    await db.event.destroy({ where: { id: req.params.id || req.body.ids } }).then(count => { res.send({ count }) })
    req.body.ids.forEach(id => {
      socket.send(id)
    })
  } else {
    var promises = []
    var promisesBlacklist = []
    var eventDb
    if (req.body.config.length !== 1) req.body.config = null
    if (req.body.times.length === 0) req.body.times = null
    if (req.params.id > 0) {
      // Update existing role
      eventDb = await db.event.findOne({ where: { id: req.params.id } })
      if (eventDb !== null) {
        promises.push(eventDb.update({ name: req.body.name, description: req.body.description, times: req.body.times, important: req.body.important, wakeonlan: req.body.wakeonlan, configId: req.body.config || null }))
        promises.push(eventDb.setGroups(req.body.groups, { through: { blacklist: 0 } }))
        promises.push(eventDb.setClients(req.body.clients, { through: { blacklist: 0 } }))
        await Promise.all(promises)
        promisesBlacklist.push(eventDb.addGroups(req.body.blacklistGroups, { through: { blacklist: 1 } }))
        promisesBlacklist.push(eventDb.addClients(req.body.blacklistClients, { through: { blacklist: 1 } }))
        await Promise.all(promisesBlacklist)
        socket.send(eventDb.id)
        res.send({ id: req.params.id })
      } else {
        res.status(404).end()
      }
    } else if (req.params.id === undefined) {
      // Create new role
      eventDb = await db.event.create({ name: req.body.name, description: req.body.description, times: req.body.times, important: req.body.important, wakeonlan: req.body.wakeonlan, configId: req.body.config || null })
      promises.push(eventDb.setGroups(req.body.groups, { through: { blacklist: 0 } }))
      promises.push(eventDb.setClients(req.body.clients, { through: { blacklist: 0 } }))
      await Promise.all(promises)
      promisesBlacklist.push(eventDb.addGroups(req.body.blacklistGroups, { through: { blacklist: 1 } }))
      promisesBlacklist.push(eventDb.addClients(req.body.blacklistClients, { through: { blacklist: 1 } }))
      await Promise.all(promisesBlacklist)
      socket.send(eventDb.id)
      res.send({ id: req.body.id })
    }
  }
})

// ############################################################################
// ############################################################################

module.exports.router = router