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


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

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

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

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

const updateReporte = (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.reporte)) return next(createError(400))
  if (isEmpty(req.body.reporte)) return next(createError(400))
  if (req.body.reporte !== CONFIDENCIAL) return next(createError(400))

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

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