valoracionPost.js 2.08 KB
const createError = require('http-errors')
const su = require('superagent')
const {
  isEmpty, isNil, contains, path, head, merge,
} = require('ramda')


const dbhost = process.env.COUCHDB_URL
const dbname = process.env.DB_VALORACIONES

const headers = {
  'Accept': 'application/json',
  'Content-Type': 'application/json',
}

const VALORES = ['SATISFECHO', 'NO SATISFECHO']

const postValoracion = (payload) =>
  su.post(`${dbhost}/${dbname}/`)
    .set(headers)
    .send(JSON.stringify(payload))


const findValoracion = (payload) =>
  su.post(`${dbhost}/${dbname}/_find`)
    .set(headers)
    .send(JSON.stringify(payload))
    .then(path(['body', 'docs']))
    .then(head)

const updateValoracion = (payload) =>{
  const { _id, _rev } = payload
  return su.put(`${dbhost}/${dbname}/${_id}?rev=${_rev}`)
    .set(headers)
    .send(JSON.stringify(payload))
}

module.exports = (req, res, next) => {
  if (isEmpty(req.body)) return next(createError(400))
  if (isNil(req.body.valoracion)) return next(createError(400))
  if (isEmpty(req.body.valoracion)) return next(createError(400))
  if (!contains(req.body.valoracion, VALORES)) return next(createError(400))

  const { id } = req.params
  const { usuario } = req.body

  const params = {
    selector: {
      id: `${id}`,
      usuario: { mail: usuario.mail }
    }
  }

  findValoracion(params)
    .then((result) => {
      if (isNil(result)){
        return merge({ id }, req.body)
      }
      if (result.valoracion === req.body.valoracion){
        return merge(result, { valoracion: null })
      }
      if (isNil(result.valoracion) || result.valoracion !== req.body.valoracion){
        return merge(result, req.body)
      }
    })
    .then(nuevoValor => {
      const valor = nuevoValor.valoracion
      let promise
      if (nuevoValor._id){
        promise = updateValoracion(nuevoValor)
      } else {
        promise = postValoracion(nuevoValor)
      }
      return promise.then(() => valor)
    })
    .then((valoracion) => res.json({ valoracion, success: true, error: false }))
    .catch(error => next(createError(500, error, { expose: true })))
}