summaryrefslogtreecommitdiffstats
path: root/server/api/events.js
blob: 6ec37c4f07000db043ef5fa13db0af36bc298235 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* 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