modarb-be / src /lib /guards /gen-guard.ts
youssefkatry907
Workout module
2703d15
raw
history blame
1.47 kB
import { IJwtLoginPayload } from "@common/interfaces/jwt-payload.interface";
import { JwtPayload, verify } from "jsonwebtoken";
import { HttpError } from "@lib/error-handling/http-error";
import { NextFunction, Request, Response } from "express";
import { config } from "@configs/config";
type OptionalIfUndefined<T> = [T] extends [undefined]
? (args?: T) => void
: (args: T) => void;
export const genGuard =
<T = undefined>(
validationMethod?: (
validationArgs: T,
payload: IJwtLoginPayload,
req: Request,
res: Response
) => boolean | Promise<boolean>
): OptionalIfUndefined<T> =>
(args: T) =>
async (req: Request, res: Response, next: NextFunction) => {
// get token from cookie
const token = req.headers.authorization?.split(" ")[1];
let payload: IJwtLoginPayload;
// validate token
if (!token) {
return next(new HttpError(401, "Unauthorized"));
}
try {
payload = verify(token, config.jwt.secret);
} catch (err) {
return next(new HttpError(401, "Unauthorized"));
}
if (
validationMethod &&
!(await validationMethod(args, payload, req, res))
) {
return next(new HttpError(401, "Unauthorized"));
}
// inject payload in request
(req as unknown as { jwtPayload: JwtPayload }).jwtPayload = payload;
// go on
next();
};