import jwt from "jsonwebtoken"; import { JWTData, JWTToken } from "../type/jwtTypes"; import { JWT_SECRET, JWT_EXPIRATION } from "../env.defaults"; import InternalException from "../exceptions/internalException"; import RolePermissionService from "../service/user/rolePermissionService"; import UserPermissionService from "../service/user/userPermissionService"; import UserService from "../service/user/userService"; import PermissionHelper from "./permissionHelper"; export abstract class JWTHelper { static validate(token: string): Promise { return new Promise((resolve, reject) => { jwt.verify(token, JWT_SECRET, (err, decoded) => { if (err) reject(err.message); else resolve(decoded); }); }); } static create(data: JWTData): Promise { return new Promise((resolve, reject) => { jwt.sign( data, JWT_SECRET, { expiresIn: JWT_EXPIRATION, }, (err, token) => { if (err) reject(err.message); else resolve(token); } ); }); } static decode(token: string): Promise { return new Promise((resolve, reject) => { try { let decoded = jwt.decode(token); resolve(decoded); } catch (err) { reject(err.message); } }); } static async buildToken(id: number): Promise { let { firstname, lastname, mail, username, isOwner } = await UserService.getById(id); let userPermissions = await UserPermissionService.getByUser(id); let userPermissionStrings = userPermissions.map((e) => e.permission); let userRoles = await UserService.getAssignedRolesByUserId(id); let rolePermissions = userRoles.length != 0 ? await RolePermissionService.getByRoles(userRoles.map((e) => e.id)) : []; let rolePermissionStrings = rolePermissions.map((e) => e.permission); let permissionObject = PermissionHelper.convertToObject([...userPermissionStrings, ...rolePermissionStrings]); let jwtData: JWTToken = { userId: id, mail: mail, username: username, firstname: firstname, lastname: lastname, isOwner: isOwner, permissions: permissionObject, }; return await JWTHelper.create(jwtData) .then((result) => { return result; }) .catch((err) => { throw new InternalException("Failed accessToken creation", err); }); } }