43f33044ea
* feat: getRepository * getRepository return type * export action * add: acl * feat: setResourceAction * feat: action alias * chore: code struct * feat: removeResourceAction * chore: file name * ignorecase * remove ACL * feat: ACL * feat: role toJSON * using emit * chore: test Co-authored-by: chenos <chenlinxh@gmail.com>
63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
import { ACLRole, RoleActionParams } from './acl-role';
|
|
import { ACL, ListenerContext } from './acl';
|
|
|
|
export type ResourceActions = { [key: string]: RoleActionParams };
|
|
|
|
interface AclResourceOptions {
|
|
name: string;
|
|
role: ACLRole;
|
|
actions?: ResourceActions;
|
|
}
|
|
|
|
export class ACLResource {
|
|
actions = new Map<string, RoleActionParams>();
|
|
acl: ACL;
|
|
role: ACLRole;
|
|
name: string;
|
|
|
|
constructor(options: AclResourceOptions) {
|
|
this.acl = options.role.acl;
|
|
|
|
this.role = options.role;
|
|
this.name = options.name;
|
|
|
|
const actionsOption: ResourceActions = options.actions || {};
|
|
for (const actionName of Object.keys(actionsOption)) {
|
|
this.actions.set(actionName, actionsOption[actionName]);
|
|
}
|
|
}
|
|
|
|
getActions() {
|
|
return Array.from(this.actions.keys()).reduce((carry, key) => {
|
|
carry[key] = this.actions.get(key);
|
|
return carry;
|
|
}, {});
|
|
}
|
|
|
|
getAction(name: string) {
|
|
return this.actions.get(this.acl.resolveActionAlias(name));
|
|
}
|
|
|
|
setAction(name: string, params: RoleActionParams) {
|
|
const context: ListenerContext = {
|
|
role: this.role,
|
|
acl: this.role.acl,
|
|
params: params || {},
|
|
};
|
|
|
|
this.acl.emit(`${this.name}:${name}.beforeGrantAction`, context);
|
|
|
|
this.actions.set(name, context.params);
|
|
}
|
|
|
|
setActions(actions: { [key: string]: RoleActionParams }) {
|
|
for (const actionName of Object.keys(actions)) {
|
|
this.setAction(actionName, actions[actionName]);
|
|
}
|
|
}
|
|
|
|
removeAction(name: string) {
|
|
this.actions.delete(name);
|
|
}
|
|
}
|