Source: validation/validate.js

/**
 * @file Manages function, that used to validate API function input params
 * @author Ivan Violentov <ivan.violentov@jibrel.network>
 */

import Promise from 'bluebird'
import Joi from 'joi-browser'

import schemas from './schemas'

/**
 * @async
 * @function validate
 *
 * @description Validates input parameters by schema
 *
 * @param {object} payload - Payload object
 * @param {object} payload.props - API function properties
 * @param {string} payload.interfaceName - Interface name
 * @param {string} payload.method - API function name
 * @param {array} payload.args - API function arguments
 *
 * @returns Promise that will be resolved with received payload comprising validated properties
 */
export default function validate(payload) {
  const { props, interfaceName, method, args } = payload

  const schema = getSchema(interfaceName, method)

  return new Promise((resolve, reject) => {
    return Joi.validate(props, schema, (err, result) => {
      if (err) {
        return reject(err)
      }

      return resolve({ interfaceName, method, args, props: result })
    })
  }).catch((err) => {
    throw (new Error(err))
  })
}

function getSchema(interfaceName, method) {
  const interfaceSchemas = schemas[interfaceName]

  if (!interfaceSchemas) {
    Promise.reject(new Error(`Validation schemas for ${interfaceName} not found`))
  }

  const methodSchema = interfaceSchemas[method]

  if (!methodSchema) {
    Promise.reject(new Error(`Validation schema for ${interfaceName}.${method} not found`))
  }

  return methodSchema
}