Spaces:
Running
Running
| 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(); | |
| }; | |