andela/team-odd-bn-backend

View on GitHub
src/controllers/UserController.js

Summary

Maintainability
A
2 hrs
Test Coverage
import dotenv from 'dotenv';
import HttpStatus from 'http-status-codes';
import HashPassword from '../helpers/HashPassword';
import Response from '../helpers/Response';
import emailHelper from '../helpers/EmailHelper';
import AuthenticateToken from '../helpers/AuthenticateToken';
import UserService from '../services/UserService';
import UserHelper from '../helpers/UserHelper';
import NotificationService from '../services/NotificationService';

const { hashPassword } = HashPassword;
const { getAUser } = UserService;
dotenv.config();
/**
 * @exports
 * @class UserController
 */
class UserController {
  /**
   * User can be able to sign up
   * @static
   * @param {object} req  request object
   * @param {object} res response object
   * @memberof UserController
   * @returns {object} data
   */
  static async signUp(req, res) {
    try {
      const { firstName, lastName, email } = req.body;
      const newUser = await UserService.signUp(req, firstName, lastName, email);
      const { password, ...data } = newUser.dataValues;
      const token = AuthenticateToken.signToken(data);
      data.token = token;
      emailHelper.verifyEmailHelper(req, newUser.dataValues);
      return Response.successMessage(req, res, 'User created successfully, Please check your email', token, 201);
    } catch (err) {
      return Response.errorMessage(req, res, 'Server Error', 500);
    }
  }

  /**
     * register a new
     * @static
     * @param {Object} req the request object
     * @param {Object} res the tresponse object
     * @returns {Object} response
     */
  static async verifyEmailController(req, res) {
    await UserService.verifyEmail(req);
    return Response.successMessage(req, res, 'You have been verified you can now login', '', 200);
  }

  /**
     * register a new
     * @static
     * @param {Object} req the request object
     * @param {Object} res the tresponse object
     * @returns {Object} response
     */
  static async resendEmailController(req, res) {
    try {
      emailHelper.verifyEmailHelper(req, req.row);
      return Response.successMessage(req, res, 'An email has been sent to you.', '', 200);
    } catch (err) {
      return Response.errorMessage(req, res, err.message, 500);
    }
  }

  /**
  * User can be able to sign in
  * @description POST /api/auth/signin
  * @static
  * @param {object} req request object
  * @param {object} res response object
  * @returns {object} data
  */
  static async signin(req, res) {
    const { result } = req;
    const { password: pwd, ...data } = result.dataValues;
    const token = AuthenticateToken.signToken(data);
    return Response.successMessage(req, res, 'Successfuly login', token, 200);
  }

  /**
     * User can be able to sign up
     * @param {object} accessToken response
     * @param {object} refreshToken response
     * @param {object} profile objet
     * @param {object} done callback
     * @param {string} type signupType
     * @returns {object} object
     */
  static async facebookCallBack(accessToken, refreshToken, profile, done) {
    UserHelper.socialCallBack(accessToken, refreshToken, profile, 'facebook', done);
  }

  /**
   * User can be able to sign up
   * @param {object} accessToken response
   * @param {object} refreshToken response
   * @param {object} profile objet
   * @param {object} done callback
   * @returns {object} object
   */
  static async googleCallBack(accessToken, refreshToken, profile, done) {
    UserHelper.socialCallBack(accessToken, refreshToken, profile, 'google', done);
  }

  /**
   * User can be able to sign up
   * @param {object} req request object
   * @param {object} res response object
   * @returns {object} object
   */
  static OAuthfacebook(req, res) {
    UserHelper.OAuthSocial(req, res, 'Logged in with facebook successfully');
  }

  /**
  * User can be able to sign up
  * @param {object} req request object
  * @param {object} res response object
  * @returns {object} object
  */
  static OAuthgoogle(req, res) {
    UserHelper.OAuthSocial(req, res, 'Logged in with google successfully');
  }

  /**
   * @static
   * @param {Object} req request object
   * @param {Object} res response object
   * @returns {Object} response
   */
  static async forgotPasswordController(req, res) {
    const { email } = req.body;
    const user = await getAUser({ email });
    if (!user) {
      return Response.errorMessage(req, res, 'User with this email does not exist', 400);
    }
    emailHelper.resetPasswordEmailHelper(req, user);
    return Response.successMessage(req, res, 'A reset link has been sent to your email. Please check your email!', user.email, 200);
  }

  /**
   * @static
   * @param {Object} req request object
   * @param {Object} res response object
   * @returns {Object} response
   */
  static async resetPasswordController(req, res) {
    const { password } = req.body;
    const { id } = req.user;
    const user = await getAUser({ id });
    const hashedPassword = hashPassword(password);
    user.password = hashedPassword;
    user.save();
    if (!user) {
      return Response.errorMessage(req, res, 'Oops reset password was not successful', '', 404);
    }
    emailHelper.resetPasswordSuccessfulHelper(user);
    return Response.successMessage(req, res, 'Password reset successfull!', '', 200);
  }

  /**
   * @static
   * @description GET /api/users/all
   * @param {Object} req request object
   * @param {Object} res response object
   * @returns {Object} response
   */
  static async availableUsers(req, res) {
    const allUsers = await UserService.availableUsers();
    if (allUsers.length === 0) {
      return Response.errorMessage(req, res, 'no users are available', 404);
    }
    return Response.successMessage(req, res, 'total Available roles', allUsers, 200);
  }

  /**
   * @static
   * @description GET /api/users/all/id
   * @param {Object} req request object
   * @param {Object} res response object
   * @returns {Object} response
   */
  static async viewSpecificUserInfo(req, res) {
    const { userId } = req.params;
    const result = await UserService.specificUsers(userId);

    if (!result) {
      return Response.errorMessage(req, res, 'User not found', 404);
    }
    return Response.successMessage(req, res, 'Available user Information', result.dataValues, 200);
  }

  /**
* User can update his/her profile
* @description POST /api/v1/user/profile-settings
* @static
* @param {object} req request object
* @param {object} res response object
* @returns {object} profileUpdate
*/
  static async updateProfile(req, res) {
    const data = await UserService.updateProfile(req);
    if (data[0]) {
      Response.successMessage(req, res, 'Your profile updated successfully', data[1], HttpStatus.OK);
    } else {
      Response.errorMessage(req, res, 'Unable to update your profile', HttpStatus.BAD_REQUEST);
    }
  }

  /**
    * User can view his/her profile
    * @description POST /api/v1/user/view-profile
    * @static
    * @param {object} req request object
    * @param {object} res response object
    * @returns {object} view-profile
  */
  static async viewProfile(req, res) {
    const userData = await UserService.viewProfile(req);

    return Response.successMessage(req, res, 'User profile retrieved successfully', userData, HttpStatus.OK);
  }

  /**
    * User can view his/her specific notification
    * @description GET /api/v1/users/notification
    * @static
    * @param {object} req request object
    * @param {object} res response object
    * @returns {object} view notifications
  */
  static async viewNotification(req, res) {
    const notification = await NotificationService.viewNotification(req);
    return Response.successMessage(req, res, 'Available notification', notification, HttpStatus.OK);
  }

  /**
    * User can Logout
    * @description PATCH /api/v1/users/logout
    * @static
    * @param {object} req request object
    * @param {object} res response object
    * @returns {object} Logout
  */
  static async logout(req, res) {
    try {
      await UserService.saveUserToken(req.user.token);
      return Response.successMessage(req, res, 'Logout successfully', undefined, HttpStatus.OK);
    } catch (error) {
      return Response.errorMessage(req, res, 'Signout failed', 500);
    }
  }
}

export default UserController;