valoracionPost.js 2 KB
const createError = require('http-errors')
const su = require('superagent')
const { isEmpty, isNil, contains, path, head, merge, propOr, tap} = 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(x => valor)
  })
  .then((valoracion) => res.json({ valoracion, success: true, error: false }))
  .catch(error => next(createError(500)))
}