lib/admin/routes/directives.js

Summary

Maintainability
A
2 hrs
Test Coverage
const parentHref = require('./helpers').parentHref

exports.createPoison = createPartial('poisons')

exports.createRule = createPartial('rules')

exports.allPoisons = function (req, res) {
  res.reply(exports.poisons(req))
}

exports.allRules = function (req, res) {
  res.reply(exports.rules(req))
}

exports.getPoison = function (req, res) {
  res.reply(getDirective(req, 'poisons')(req.toxyPoison))
}

exports.getRule = function (req, res) {
  res.reply(getDirective(req, 'rules')(req.toxyRule))
}

exports.deletePoisons = function (req, res) {
  deleteAll(req, 'poisons')
  res.statusCode = 204
  res.end()
}

exports.deleteRules = function (req, res) {
  deleteAll(req, 'rules')
  res.statusCode = 204
  res.end()
}

exports.deletePoison = function (req, res) {
  const stack = req.toxyRoute || req.toxy
  stack.remove(req.toxyPoison)
  res.statusCode = 204
  res.end()
}

exports.deleteRule = function (req, res) {
  const stack = req.toxyPoison || req.toxyRoute || req.toxy
  stack.removeRule(req.toxyRule)
  res.statusCode = 204
  res.end()
}

exports.poisons = function (req) {
  return exports.getDirectives(req, 'poisons')
}

exports.rules = function (req) {
  return exports.getDirectives(req, 'rules')
}

exports.getDirectives = function (req, type) {
  const stack = getStack(req)

  const pool = type === 'poisons'
    ? stack.getPoisons()
    : stack.getRules()

  return pool.map(getDirective(req, type))
}

function getDirective (req, type, addPhase) {
  return function (directive) {
    const data = {
      name: directive.name,
      enabled: directive.isEnabled()
    }

    var href = !~req.href.indexOf(type)
      ? req.href + '/' + type + '/' + directive.name
      : req.href

    if (type === 'poisons') {
      // Expose poison phase
      data.phase = directive.phase

      // Add phase to href
      href += !~req.href.indexOf(':')
        ? ':' + directive.phase
        : ''

      // Retrieve poisons specific rules
      const rules = directive.getRules()
      data.rules = rules.map(getDirective({ href: href }, 'rules'))
    }

    data.links = {
      self: { href: href },
      parent: { href: parentHref(href) }
    }

    return data
  }
}

function createPartial (type) {
  return function (req, res) {
    const body = createDirective(req, res, type)
    if (body) res.reply(body, 201)
  }
}

function createDirective (req, res, type) {
  const body = req.body
  const toxy = getStack(req)
  const directives = req.toxy[type]

  if (!body || !body.name) {
    res.statusCode = 400
    res.end()
    return
  }

  const name = body.name
  const directive = directives[name]

  if (typeof directive !== 'function') {
    res.statusCode = 404
    res.end()
    return
  }

  const method = getCreateMethod(type, body)
  const directiveConfig = toxy[method](directive(body.options))

  var href = req.href + '/' + type + '/' + name
  if (type === 'poisons') {
    href += ':' + directiveConfig.phase
  }

  const links = {
    self: { href: href },
    parent: { href: parentHref(href) }
  }

  return {
    name: name,
    links: links
  }
}

function getCreateMethod (type, body) {
  if (body.phase === 'outgoing') {
    return 'outgoingPoison'
  }
  return type.slice(0, -1)
}

function deleteAll (req, type) {
  const stack = getStack(req)['_' + type]
  if (stack) stack.stack.splice(0)
}

function getStack (req) {
  return req.toxyRule || req.toxyPoison || req.toxyRoute || req.toxy
}