All files / lib/client/strategies jwt.js

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93                                                                                                                                                                                         
/**
 * @name sessionId
 * @memberof strategies
 * @private
 */
import { reject, resolve } from 'bluebird'
import { merge } from 'ramda'
import transactions from '../../resources/transactions'
 
/**
 * Creates an object with
 * the `account_id`, `merchant_id` and `jwt`from
 * the supplied `options` param
 *
 * @param {any} options
 * @returns {Object} an object containing
 *                   a body property with
 *                   the desired `jwt`
 * @private
 */
function execute ({
  account_id: accountId,
  merchant_id: merchantId,
  company_id: companyId,
  environment,
  impersonationKey,
  jwt,
  options,
  skipAuthentication,
  visitorID,
}) {
  const dataHeader = {
    Authorization: `Bearer ${jwt}`,
    'X-Live': environment === 'live' ? 1 : 0,
  }
 
 
  if (visitorID) {
    dataHeader.visitorID = visitorID
  }
 
  const headers = dataHeader
  const body = {
    account_id: accountId,
    merchant_id: merchantId,
  }
 
  if (companyId) {
    body.company_id = companyId
  }
 
  if (impersonationKey) {
    body.impersonation_key = impersonationKey
  }
 
  const opts = merge(options, {
    body,
    headers,
  })
 
  return transactions.calculateInstallmentsAmount(
    opts, { amount: 1, interest_rate: 100 }
  )
    .catch(error => (skipAuthentication ? resolve(opts) : reject(error)))
    .catch({ name: 'ApiError' }, () => reject(new Error('You must supply a valid jwt token and a valid account_id')))
    .then(() => ({
      authentication: {
        account_id: accountId,
        jwt,
        merchant_id: merchantId,
        company_id: companyId,
      },
      options: opts,
    }))
}
 
/**
 * Returns the supplied parameter with
 * the `execute` function added to it.
 *
 * @param {any} options
 * @returns {Object} The `options` parameter
 *                   with `execute` add to it
 * @private
 */
function build (options) {
  return merge(options, { execute: execute.bind(null, options) })
}
 
export default {
  build,
}