* create-nocobase-app template from [develop] * change create-nocobase-app package.json config * feat: load configuration from directory * feat: configuration repository toObject * feat: create application from configuration dir * feat: application factory with plugins options * export type * feat: read application config & application with plugins options * feat: release command * fix: database release * chore: workflow package.json * feat: nocobase cli package * feat: console command * chore: load application in command * fix: load packages from process.cwd * feat: cli load env file * feat: create-nocobase-app * fix: gitignore create-nocobase-app lib * fix: sqlite path * feat: create plugin * chore: plugin files template * chore: move cli into application * chore: create-nocobase-app * fix: create plugin * chore: app-client && app-server * chore: package.json * feat: create-nocobase-app download template from npm * chore: create-nocobase-app template * fix: config of plugin-users * fix: yarn.lock * fix: database build error * fix: yarn.lock * fix: resourcer config * chore: cross-env * chore: app-client dependents * fix: env * chore: v0.6.0-alpha.1 * chore: verdaccio * chore(versions): 😊 publish v0.6.0 * chore(versions): 😊 publish v0.6.1-alpha.0 * chore(versions): 😊 publish v0.6.2-alpha.0 * chore(versions): 😊 publish v0.6.2-alpha.1 * chore: 0.6.2-alpha.2 * feat: workspaces * chore(versions): 😊 publish v0.6.2-alpha.3 * chore(versions): 😊 publish v0.6.2-alpha.4 * chore: create-nocobase-app * chore: create-nocobase-app lib * fix: update tsconfig.jest.json * chore: .env * chore(versions): 😊 publish v0.6.2-alpha.5 * chore(versions): 😊 publish v0.6.2-alpha.6 * feat: improve code * chore(versions): 😊 publish v0.6.2-alpha.7 * fix: cleanup * chore(versions): 😊 publish v0.6.2-alpha.8 * chore: tsconfig for app server package * fix: move files * fix: move files Co-authored-by: chenos <chenlinxh@gmail.com>
66 lines
1.6 KiB
TypeScript
66 lines
1.6 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(name) || this.actions.get(this.acl.resolveActionAlias(name));
|
|
}
|
|
|
|
setAction(name: string, params: RoleActionParams) {
|
|
const context: ListenerContext = {
|
|
role: this.role,
|
|
acl: this.role.acl,
|
|
params: params || {},
|
|
path: `${this.name}:${name}`,
|
|
resourceName: this.name,
|
|
actionName: name,
|
|
};
|
|
|
|
this.acl.emit('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);
|
|
}
|
|
}
|