import {StringKV} from './types'; export default class Permission { private actObjData : Map>; private objActData : Map>; public constructor() { this.actObjData = new Map>(); this.objActData = new Map>(); } public load(permission : string | Record) : void { let p : StringKV; if (typeof(permission) == 'string') { p = JSON.parse(permission) as StringKV; } else { p = permission as StringKV; } // Generate data: {key:Actions, value: Array of objects} for (const act in p) { this.actObjData.set(act, p[act] as Array); } // Generate data: {key:Objects, value: Array of actions} const tmp : StringKV = {}; for (const act in p) { for (const obj in p[act]) { if (!(obj in tmp)) { tmp[obj] = []; } tmp[obj].push(act); } } for (const obj in tmp) { this.objActData.set(obj, tmp[obj] as Array); } } public getPermissionJsonObject() : StringKV { const obj : StringKV = {}; this.actObjData.forEach((value, key) => (obj[key] = value)); return obj; } /* Parse the permission into JSON string */ public getPermissionString() : string { return JSON.stringify(this.getPermissionJsonObject()); } public getTargetsFromAction(action: string) : Array { const result = this.actObjData.get(action); if (result === undefined) { return new Array(); } else { return result; } } public getActionsObjects() : Map> { return this.actObjData; } public getObjectsActions() : Map> { return this.objActData; } public check(action : string, object : string) : boolean { const objects = this.actObjData.get(action); if (objects == undefined) { return false; } else { return objects.includes(object); } } }