renderers/proactive.js

import util from 'util'

import _ from 'lodash'
import Promise from 'bluebird'

module.exports = ({ sendContent, db }) => {
  const getUser = async id => {
    const knex = await db.get()
    const users = await knex('users')
      .where({ id: id })
      .orWhere('userId', id)
      .limit(1)
      .select('*')

    if (!users || users.length <= 0) {
      throw new Error(`User "${id}" not found in the database`)
    }

    return users[0]
  }

  /**
   * Proactively sends a user a message
   * @param  {string|object} user id or a full user object
   * @param  {string} elementOrRenderer The name of the renderer to use OR an element id
   * @param  {object} data Additionnal data that will be passed to the renderer
   * @async
   * @memberof! ContentRenderer
   * @example
   * bp.renderers.sendToUser(event.user.id, '#!text-77734', { typingIndicators: false })
   */
  const sendToUser = async (user, elementOrRenderer, data) => {
    if (!_.isString(elementOrRenderer)) {
      throw new Error('Invalid renderer: ' + elementOrRenderer)
    }

    if (_.isString(user)) {
      user = await getUser(user)
    }

    if (!user || !user.id) {
      throw new Error('Invalid user object: ' + util.inspect(user))
    }

    const text = 'This is not a real event, it has been forged by proactive.'
    const forgedEvent = {
      platform: user.platform,
      user: user,
      type: 'proactive',
      text: text,
      raw: { forged: true, message: text, to: user && user.id }
    }

    return sendContent(forgedEvent, elementOrRenderer, data)
  }

  return { sendToUser }
}