MicroHack-Registrations-RestAPI / src / controllers / auth.controller.ts
auth.controller.ts
Raw
import { Response } from "express";
import { UserD, UserModel } from "../models/user.model";
import { MyRequest } from "../types/Express";
import { ErrorResponse, SuccessResponse } from "../utils/Response";
import authLogs, { authLogger, IAuthLogs } from "../services/auth/auth.logs";
import { generateToken } from "../utils/Jwt";
import { formatString } from "../utils/Strings";
import { HttpCodes } from "../config/Errors";

export const SignIn = async (req: MyRequest<UserD>, res: Response) => {
  const { email, password, stay = false } = req.body;
  try {
    const user = await UserModel.findOne({ email });
    if (user) {
      const isPasswordMatch = await user.comparePasswords(password);

      if (isPasswordMatch) {
        const token = generateToken(res, { _id: user._id.toString() });
        const resp: ICode<IAuthLogs> = authLogs.LOGIN_SUCCESS;
        const msg = formatString(resp.message, user.toObject());
        authLogger.info(msg, { type: resp.type });

        return SuccessResponse(
          res,
          HttpCodes.Accepted.code,
          { ...user.Optimize(), token: token },
          msg
        );
      }
      const msg = formatString(
        authLogs.LOGIN_ERROR_INCORRECT_PASSWORD_FOUND.message,
        { email }
      );
      authLogger.error(msg);
      return ErrorResponse(res, HttpCodes.BadRequest.code, msg);
    }
    const msg = formatString(authLogs.LOGIN_ERROR_EMAIL_NOT_FOUND.message, {
      email,
    });
    authLogger.error(msg);
    return ErrorResponse(res, HttpCodes.BadRequest.code, msg);
  } catch (err) {
    const msg = formatString(authLogs.LOGIN_ERROR_GENERIC.message, {
      error: (err as Error)?.message || "",
      email,
    });
    authLogger.error(msg, err as Error);
    return ErrorResponse(res, HttpCodes.InternalServerError.code, msg, err);
  }
};

export const SignUp = async (req: MyRequest<UserD>, res: Response) => {
  const { email, password, firstName, lastName } = req.body;
  try {
    const userExist = await UserModel.findOne({
      email,
    });
    if (userExist) {
      const msg = formatString(authLogs.REGISTER_ERROR_EMAIL_EXIST.message, {
        email,
      });
      authLogger.error(msg);
      return ErrorResponse(res, HttpCodes.BadRequest.code, msg);
    }
    const user = new UserModel({
      email,
      password,
      firstName,
      lastName,
    });
    const savedUser = await user.save();
    const token = generateToken(res, { _id: savedUser._id.toString() });
    const resp: ICode<IAuthLogs> = authLogs.REGISTER_SUCCESS;
    const msg = formatString(resp.message, savedUser.toObject());
    authLogger.info(msg, { type: resp.type });
    return SuccessResponse(
      res,
      HttpCodes.Created.code,
      { ...savedUser.Optimize(), token: token },
      msg
    );
  } catch (err) {
    const msg = formatString(authLogs.REGISTER_ERROR_GENERIC.message, {
      error: (err as Error)?.message || "",
      email,
    });
    authLogger.error(msg, err as Error);
    return ErrorResponse(res, HttpCodes.InternalServerError.code, msg, err);
  }
};

export const AuthBack = async (req: MyRequest<UserD>, res: Response) => {
  const user = req.user as UserD;
  const resp = authLogs.AUTH_BACK;

  const msg = formatString(resp.message, {
    email: user.email,
    username: user.firstName + " " + user.lastName,
  });
  authLogger.info(msg, { type: resp.type });

  return SuccessResponse(
    res,
    HttpCodes.Accepted.code,
    user.Optimize(),
    msg,
    authLogs.AUTH_BACK.type
  );
};