Sindbad~EG File Manager

Current Path : /home/infinitibizsol/.trash/controllers.5/
Upload File :
Current File : /home/infinitibizsol/.trash/controllers.5/auth.js

import User from "../model/user";
import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import { failedResponse } from "../utils/responseFormat";

const TokenGenerate = (user) => {
  return jwt.sign({ _id: user._id, role: user.role }, process.env.JWTSECRET, {
    expiresIn: "30d",
  });
};

const login = async (req, res) => {
  try {
    const { primary_email, password } = req.body;
    const user = await User.findOne({ primary_email });
    if (!user) {
      return failedResponse({ res, error: "invalid Email" });
    }

    const passwordMatch = await bcrypt.compare(password, user.password);
    if (!passwordMatch) {
      return failedResponse({ res, error: "invalid Password" });
    }

    // Create a JWT token
    const token = TokenGenerate(user);
    res.setHeader("Authorization", token);
    res.status(200).json({ token: token, user, message: "Login successfully" });
  } catch (error) {
    return failedResponse({
      res,
      error: error.message,
    });
  }
};

const authenticate = async (req, res) => {
  try {
    const user = await User.findOne(
      { _id: req.user._id }
      // { createdOn: 0, modifiedOn: 0, __v: 0 }
    );
    if (!user) {
      return failedResponse({ res, error: "No user found." });
    }

    // Create a JWT token
    const token = TokenGenerate(user);
    res.setHeader("Authorization", token);
    res.status(200).json({ token: token, user, message: "success" });
  } catch (error) {
    return failedResponse({
      res,
      error: error.message,
    });
  }
};
//Abondoned
const protect = async (req, res, next) => {
  try {
    //  1). getting token and check it
    let token;
    if (
      req.headers.authorization &&
      req.headers.authorization.startsWith("Bearer")
    ) {
      token = req.headers.authorization.split(" ")[1];
    }

    if (!token) {
      return failedResponse({ res, error: "Invalid token" });
    }
    //verify method
    // 2). Verification token like user id
    const decoded = await jwt.verify(token, process.env.JWTSECRET);

    // 3). Check if there user stil exit || deleted himself
    const freshUser = await User.findOne({ _id: decoded._id });

    if (!freshUser) {
      return failedResponse({
        res,
        error:
          "The user is not belong to this token! Please login to get access",
      });
    }

    req.user = {
      _id: freshUser._id,
      first_name: freshUser.first_name,
      role: freshUser.role,
    };

    next();
  } catch (error) {
    return failedResponse({ res, error: error.message });
  }
};

const restrictTo = (...roles) => {
  // roles are : admin, agent
  return (req, res, next) => {
    if (!roles.includes(req.user.role)) {
      return failedResponse({ res, error: "You are not allowed!" });
    }
    next();
  };
};

export default { login, authenticate, protect, restrictTo };

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists