node-enterprise-starter
Version:
<h1 align="center">Node Enterprise Starter</h1>
55 lines (43 loc) • 1.7 kB
text/typescript
import { NextFunction, Request, Response } from "express";
import httpStatus from "http-status";
import { JwtPayload } from "jsonwebtoken";
import AppError from "../errors/AppError";
import catchAsync from "../utils/catchAsync";
import { verifyToken } from "../utils/tokenGenerateFunction";
import config from "../../config";
import { userRole } from "../modules/Auth/auth.utils";
import User from "../modules/Auth/auth.model";
const Auth = (...requiredRoles: (keyof typeof userRole)[]) => {
return catchAsync(async (req: Request, res: Response, next: NextFunction) => {
const token = req.headers.authorization;
// checking if the token is missing
if (!token) {
throw new AppError(httpStatus.UNAUTHORIZED, "You are not authorized!");
}
// Extract the token without "Bearer " prefix
const tokenWithoutBearer = token.split(" ")[1];
if (!tokenWithoutBearer) {
throw new AppError(httpStatus.UNAUTHORIZED, "Invalid token format!");
}
const decoded = verifyToken(
tokenWithoutBearer,
config.jwt_access_secret as string
) as JwtPayload;
const { role, email, iat } = decoded;
// checking if the user exists
const user = await User.findOne({ email: email });
if (!user) {
throw new AppError(httpStatus.NOT_FOUND, "This user is not found !");
}
// checking if the user is banned
if (user?.isBanned) {
throw new AppError(httpStatus.FORBIDDEN, "This user is banned!");
}
if (requiredRoles && !requiredRoles.includes(role)) {
throw new AppError(httpStatus.UNAUTHORIZED, "You are not authorized");
}
req.user = decoded as JwtPayload;
next();
});
};
export default Auth;