import jwt from "jsonwebtoken"; import { Handler,encrypt,decrypt,Strings,AppError } from "@onebro/oba-common"; import * as ob from "@onebro/oba-common"; export const generateTkn = (payload:any,secret:string,opts?:any) => jwt.sign(payload,secret,opts); export const verifyTkn = (header:string,secret:string) => { if(!header) throw new AppError({message:"Not Authorized - No Header",status:401}); const parts = header.split(" "), valid = parts[0] = "Bearer" && parts[1], token = valid?parts[1]:null; if(!token) throw new AppError({message:"Not Authorized - No Tkn",status:401}); return jwt.verify(token,secret);}; export const validateAPIAuthTkn = (secret:string) => { const handler:Handler = async (req,res,next) => { try{ req.authtkn = verifyTkn(req.headers.authorization,secret); if(!req.authtkn) return next(new AppError({message:"unauthorized",status:401})); return next();} catch(e){return next(e);}}; return handler;}; export const validateAppUser = (cookieName:string,key:string) => { const handler:Handler = async (req,res,next) => { const cookie = req.cookies[cookieName] as string; if(cookie) req.appuser = decrypt(key,cookie); return next();}; return handler;}; export const refreshAppUser = (cookieName:string,key:string) => { const handler:Handler = async (req,res,next) => { if(res.locals.actionResult){ const usernameEnc = encrypt(key,res.locals.actionResult.username||req.appuser); res.cookie(cookieName,usernameEnc,{maxAge:900000,httpOnly:true});} return next();}; return handler;}; export const mapUserRole = (K:Strings,k?:string) => !k?"G":Object.keys(K).find(s => K[s] == k); export const validateUserRole = (roles?:string[]) => { const R = roles || ["USER","GUEST"]; const handler:Handler = async (req,res,next) => { if(!R.includes(req.authtkn.role)) return next(new AppError({message:"unauthorized",status:401})); return next();}; return handler;}; export type OBNotificationData = {method:string;type:string;user:string;data:any}; export const notifyUser = async (o:OBNotificationData,doSend?:boolean|number) => doSend?ob.ok(o):null;