reportePost.js 1.93 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_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(x => valor)
  })
  .then((reporte) => res.json({ reporte, success: true, error: false }))
  .catch(error => next(createError(500)))
}