lgaticaq/hubot-info-rut

View on GitHub
src/script.js

Summary

Maintainability
C
1 day
Test Coverage
// Description:
//   Obtiene el nombre de la persona o empresa del RUT consultado y viceversa
//
// Dependencies:
//   "info-rut": "^5.0.0"
//
// Configuration:
//   HUBOT_URL
//
// Commands:
//   hubot info-rut rut <rut> -> Obtiene nombre a partir de un rut
//   hubot info-rut persona <nombre> -> Obtiene rut a partir de un nombre
//   hubot info-rut empresa <nombre> -> Obtiene rut a partir de un nombre
//
// Author:
//   lgaticaq

'use strict'

const querystring = require('querystring')
const infoRut = require('info-rut')

const isEnterprise = rut => {
  return rut.replace(/[.-]/g, '').length === 9 && Number(rut[0]) > 5
}

module.exports = robot => {
  robot.respond(/info-rut rut (.*)/i, async res => {
    try {
      const rut = res.match[1]
      const fn = isEnterprise(rut)
        ? infoRut.getEnterpriseByRut
        : infoRut.getPersonByRut
      const result = await fn(rut)
      if (!result) return res.reply('rut sin resultados')
      res.send(`${result.name} (${result.rut})`)
    } catch (err) {
      res.reply('ocurrio un error al consultar el rut')
      robot.emit('error', err, res)
    }
  })

  robot.respond(/info-rut (persona|empresa) (.*)/i, async res => {
    try {
      const type = res.match[1]
      const name = res.match[2]
      const url = process.env.HUBOT_URL || 'http://localhost:8080'
      const fn =
        type === 'persona'
          ? infoRut.getPersonByName
          : infoRut.getEnterpriseByName
      const results = await fn(name)
      if (results.length > 5) {
        const query = querystring.stringify({ name, type })
        const more = `\nMás resultados en ${url}/info-rut?${query}`
        res.send(
          results
            .slice(0, 5)
            .map(r => `${r.name} (${r.rut})`)
            .join('\n')
            .concat(more)
        )
      } else if (results.length > 0) {
        res.send(results.map(r => `${r.name} (${r.rut})`).join('\n'))
      } else {
        res.reply(`no hay resultados para ${name}`)
      }
    } catch (err) {
      res.reply('ocurrio un error al consultar el nombre')
      robot.emit('error', err, res)
    }
  })

  robot.router.get('/info-rut', async (req, res) => {
    try {
      const type = req.query.type
      const name = req.query.name
      if (!type && !name) return res.send('faltan los parametros type y name')
      const fn =
        type === 'persona'
          ? infoRut.getPersonByName
          : infoRut.getEnterpriseByName
      const results = await fn(name)
      if (results.length > 0) {
        res.send(results.map(r => `${r.name} (${r.rut})`).join('<br/>'))
      } else {
        res.send(`no hay resultados para ${name}`)
      }
    } catch (err) {
      res.send('Ocurrio un error al consultar el nombre')
      robot.emit('error', err, res)
    }
  })
}