shonubijerry/quick-credit

View on GitHub
server/middleware/ValidateUser.js

Summary

Maintainability
A
0 mins
Test Coverage
import errorStrings from '../helpers/errorStrings';
import Validator from '../helpers/Validator';
import rules from '../helpers/rules';
import responseHelper from '../helpers/responseHelper';
import UsersModel from '../model/usersModel';

const usersModel = new UsersModel('users');


/**
 *    @fileOverview Class to validate user login and signup forms submission
 *    @class ValidateUser
 *    @requires ../helpers/errorStrings
 *    @requires ../helpers/Validator
 *    @requires ../helpers/rules
 *    @requires ../helpers/responseHelper
 *    @exports ValidateUser
 */

class ValidateUser {
  /**
   * validate signup input form data
   * @param {Object} request
   * @param {Object} response
   * @callback {Function} next
   * @return {Object} error
   */

  static validateSignupFormData(request, response, next) {
    const signupErrors = ValidateUser.checkNamesAndAddressErrors(request.body);
    const signinErrors = ValidateUser.checkEmailAndPasswordErrors(request.body);

    const errors = signupErrors.concat(signinErrors);

    const error = Validator.findErrors(errors);

    if (error.length > 0) {
      return responseHelper.error(response, 400, error);
    }
    return next();
  }

  /**
   * collect all possible errors from firstname, lastname and address inputs
   * @param {Object} request
   * @return {String} errors
   */

  static checkNamesAndAddressErrors({
    firstName, lastName, password, address,
  }) {
    const errors = [];

    const firstNameError = Validator.validate(
      firstName, rules.empty, rules.validName, errorStrings.validFirstName,
    );
    errors.push(firstNameError);

    const lastnameError = Validator.validate(
      lastName, rules.empty, rules.validName, errorStrings.validLastName,
    );
    errors.push(lastnameError);

    const addressError = Validator.validate(
      address, rules.empty, rules.validAddress, errorStrings.validAddress,
    );
    errors.push(addressError);

    if (!rules.passwordLength.test(password)) {
      const passwordError = errorStrings.passwordLength;
      errors.push(passwordError);
    }

    return errors;
  }

  /**
   * validate email and password
   * @param {Object} request
   * @param {Object} response
   * @callback {Function} next
   * @return {Object} error
   */

  static validateSigninFormData(request, response, next) {
    const signinErrors = ValidateUser.checkEmailAndPasswordErrors(request.body);

    const error = Validator.findErrors(signinErrors);

    if (error.length > 0) {
      return responseHelper.error(response, 400, error);
    }
    return next();
  }

  /**
   * collect all possible errors from email and password inputs
   * @param {Object} request
   * @return {String} errors
   */

  static checkEmailAndPasswordErrors({ email, password }) {
    const errors = [];

    const emailError = Validator.validate(
      email, rules.empty, rules.validEmail, errorStrings.validEmail,
    );
    errors.push(emailError);

    if (!password || !rules.empty.test(password)) {
      const passwordEmptyError = errorStrings.passwordEmpty;
      errors.push(passwordEmptyError);
    }
    return errors;
  }

  /**
   * validate email parameter from request.params.email
   * @param {Object} req request object
   * @param {Object} res response object
   * @callback {Function} next
   * @return {Object} error json object
   */

  static validateParamEmail(request, response, next) {
    const error = [];

    const emailError = Validator.validate(
      request.params.email, rules.empty, rules.validEmail, errorStrings.validVerifyEmail,
    );
    error.push(emailError);

    if (Validator.findErrors(error).length > 0) {
      return responseHelper.error(response, 400, error[0]);
    }
    return next();
  }

  /**
   * validate email parameter from request.params.email
   * @param {Object} req request object
   * @param {Object} res response object
   * @callback {Function} next
   * @return {Object} error json object
   */

  static validateUsersEndpointQuery(request, response, next) {
    const filter = Object.keys(request.query);
    if (filter.length > 0) {
      if (filter.indexOf('status') === -1) {
        return responseHelper.error(response, 404, errorStrings.pageNotFound);
      }
      const val = Object.values(request.query);
      if (val.indexOf('verified') !== -1 || val.indexOf('unverified') !== -1) {
        return next();
      }
      const error = errorStrings.validUserStatus;
      return responseHelper.error(response, 400, error);
    }
    return next();
  }

  /**
  * Check user is verified so as to allow perform actions
  * @param {object} req
  * @param {object} res
  * @returns json object
  */

  static async checkVerified(req, res, next) {
    try {
      const user = await usersModel.findUserById(req.user.id);
      if (user.status !== 'verified') {
        return responseHelper.error(res, 401, errorStrings.notVerified);
      }
    } catch (error) {
      return responseHelper.error(res, 500, errorStrings.serverError);
    }
    return next();
  }
}

export default ValidateUser;