andela/team-odd-bn-backend

View on GitHub
src/routes/api/authRoute.js

Summary

Maintainability
A
0 mins
Test Coverage
import express from 'express';
import UserController from '../../controllers/UserController';
import isUserExist from '../../middlewares/findUsers';
import Validate from '../../middlewares/Validate';
import validateCredentials from '../../middlewares/validateCredentials';
import Middlewares from '../../middlewares/ForgotPasswordMiddlewares';
import verifyToken from '../../middlewares/verifyToken';
import Conflict from '../../middlewares/Conflict';
import checkInputDataError from '../../middlewares/checkInputDataError';
import isLoggedViaSocialLogin from '../../middlewares/isLoggedViaSocialLogin';

const authRouter = express.Router();

const {
  checkForgotPasswordMiddleware,
  checkResetPasswordMiddleware,
  decodeTokenMiddleware
} = Middlewares;

const {
  forgotPasswordController,
  resetPasswordController,
  verifyEmailController,
  resendEmailController,
} = UserController;

authRouter.post(
  '/signup',
  Validate.signupRules(),
  checkInputDataError,
  isUserExist,
  UserController.signUp
);

/**
 * @swagger
 *
 * /auth/signup:
 *    post:
 *      summary: User can signup
 *      tags: [Users]
 *      requestBody:
 *        required: true
 *        content:
 *          application/json:
 *            schema:
 *              $ref: '#/components/schemas/user'
 *      responses:
 *        "201":
 *          description: A user schema
 *
 * components:
 *    schemas:
 *      user:
 *        type: object
 *        required:
 *          - firstName
 *          - lastName
 *          - email
 *          - password
 *        properties:
 *          firstName:
 *            type: string
 *          lastName:
 *            type: string
 *          email:
 *            type: string
 *            format: email
 *          password:
 *            type: string
 *        example:
 *           firstName: dnffd
 *           lastName: fkbndf
 *           email: fname.lname@andela.com
 *           password: yourpassword
 *
 */

authRouter
  .post(
    '/signin',
    isLoggedViaSocialLogin,
    Validate.signinRules(),
    checkInputDataError,
    validateCredentials,
    UserController.signin
  );
/**
* @swagger
*
* /auth/signin:
*    post:
*      summary: User login
*      tags: [Users]
*      requestBody:
*        required: true
*        content:
*          application/json:
*            schema:
*              $ref: '#/components/schemas/Signin'
*      responses:
*        "200":
*          description: 'A user schema'
*        "400":
*          description: 'Bad request'
*        "500":
*          description: 'Server Error'
* components:
*   schemas:
*     Signin:
*       type: "object"
*       properties:
*         email:
*           type: string
*         password:
*           type: string
*       required:
*         - 'email'
*         - 'password'
*
*/

authRouter.get(
  '/verify-email/:id/:token',
  verifyToken,
  verifyEmailController
);
/**
 * @swagger
 *
 * /verify-email/:id/:token:
 *    get:
 *      summary: verify email
 *      tags: [Email]
 *      requestBody:
 *        required: false
 *      responses:
 *        "200":
 *          description: 'A response message'
*/

authRouter.post(
  '/forgot-password',
  Middlewares.forgotPasswordRules(),
  checkForgotPasswordMiddleware,
  forgotPasswordController
);
/**
 * @swagger
 * /auth/forgot-password:
 *    post:
 *      summary: User receives an email with a reset password link once they hit forgot password
 *      tags: [Users]
 *      requestBody:
 *        required: true
 *        content:
 *          application/json:
 *            schema:
 *              $ref: '#/components/schemas/ForgotPassword'
 *      responses:
 *        "200":
 *          description: 'A user schema'
 *        "400":
 *          description: 'Bad request'
 *        "500":
 *          description: 'Server Error'
 *
 */
authRouter.post(
  '/resend-email',
  Validate.validateResendEmail(),
  checkInputDataError,
  Conflict.isUsersConflict,
  resendEmailController
);

/**
 * @swagger
 *
 * /:id/resend-email:
 *    get:
 *      summary: resend email
 *      tags: [Email]
 *      requestBody:
 *        required: false
 *      responses:
 *        "200":
 *          description: 'A response message'
 * components:
 *   schemas:
 *     ForgotPassword:
 *       type: "object"
 *       properties:
 *         email:
 *           type: string
 *       required:
 *         - 'email'
 *
 */

authRouter.patch(
  '/reset-password/:token',
  decodeTokenMiddleware,
  Middlewares.resetPasswordRules(),
  checkResetPasswordMiddleware,
  resetPasswordController
);
/**
 * @swagger
 *
 * /auth/reset-password/{token}:
 *    patch:
 *      summary: User can reset password from the reset password link
 *      tags: [Users]
 *      parameters:
 *        - in: path
 *          name: token
 *          schema:
 *            type: string
 *            example: Qwerty@123
 *      requestBody:
 *        required: true
 *        content:
 *          application/json:
 *            schema:
 *              $ref: '#/components/schemas/ResetPassword'
 *      responses:
 *        "200":
 *          description: 'A user schema'
 *        "400":
 *          description: 'Bad request'
 *        "500":
 *          description: 'Server Error'
 * components:
 *   schemas:
 *     ResetPassword:
 *       type: "object"
 *       properties:
 *         password:
 *           type: string
 *         confirmPassword:
 *           type: string
 *       required:
 *         - 'email'
 *         - 'confirmPassword'
 *
 */
export default authRouter;