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))) }