@holoyan/adonisjs-permissions 1.0.5 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -9
- package/build/index.d.ts +1 -2
- package/build/index.js +1 -2
- package/build/providers/role_permission_provider.d.ts +2 -2
- package/build/providers/role_permission_provider.js +15 -4
- package/build/src/acl.d.ts +17 -6
- package/build/src/acl.js +42 -20
- package/build/src/decorators.js +4 -12
- package/build/src/events/index.d.ts +2 -0
- package/build/src/events/index.js +2 -0
- package/build/src/events/permissions/permissions.d.ts +80 -0
- package/build/src/events/permissions/permissions.js +113 -0
- package/build/src/events/roles/roles.d.ts +40 -0
- package/build/src/events/roles/roles.js +55 -0
- package/build/src/mixins/has_permissions.d.ts +19 -15
- package/build/src/models/model_permission.d.ts +0 -1
- package/build/src/models/model_permission.js +0 -4
- package/build/src/models/model_role.d.ts +0 -1
- package/build/src/models/model_role.js +0 -4
- package/build/src/models/permission.d.ts +3 -4
- package/build/src/models/permission.js +9 -10
- package/build/src/models/role.d.ts +3 -4
- package/build/src/models/role.js +9 -10
- package/build/src/services/base_adapter.d.ts +10 -3
- package/build/src/services/base_adapter.js +30 -6
- package/build/src/services/base_service.d.ts +7 -3
- package/build/src/services/base_service.js +8 -4
- package/build/src/services/models/model_has_role_permissions.d.ts +117 -25
- package/build/src/services/models/model_has_role_permissions.js +152 -33
- package/build/src/services/models/model_service.d.ts +3 -1
- package/build/src/services/models/model_service.js +4 -2
- package/build/src/services/permissions/empty_permission.d.ts +10 -8
- package/build/src/services/permissions/empty_permission.js +26 -10
- package/build/src/services/permissions/permission_has_model_roles.d.ts +23 -16
- package/build/src/services/permissions/permission_has_model_roles.js +47 -30
- package/build/src/services/permissions/permissions_service.d.ts +25 -23
- package/build/src/services/permissions/permissions_service.js +12 -11
- package/build/src/services/roles/empty_roles.d.ts +11 -8
- package/build/src/services/roles/empty_roles.js +27 -8
- package/build/src/services/roles/role_has_model_permissions.d.ts +65 -20
- package/build/src/services/roles/role_has_model_permissions.js +77 -18
- package/build/src/services/roles/roles_service.d.ts +8 -4
- package/build/src/services/roles/roles_service.js +15 -16
- package/build/src/types.d.ts +18 -7
- package/build/stubs/middlewares/acl_middleware.stub +1 -0
- package/build/stubs/migrations/create_db.stub +71 -56
- package/package.json +10 -6
- package/build/src/morph_map.d.ts +0 -11
- package/build/src/morph_map.js +0 -40
package/README.md
CHANGED
|
@@ -12,6 +12,11 @@ Checkout other AdonisJS packages
|
|
|
12
12
|
- It's simple, just star this repository, that is enough to keep me motivated to maintain this package.
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
## Release Notes
|
|
16
|
+
|
|
17
|
+
Version: >= v1.2.0
|
|
18
|
+
* Added [Morph Map](https://github.com/holoyan/morph-map-js) as a dependency to handle polymorphic relations - fixed [#20](https://github.com/holoyan/adonisjs-permissions/issues/20)
|
|
19
|
+
|
|
15
20
|
## Table of Contents
|
|
16
21
|
|
|
17
22
|
<details><summary>Click to expand</summary><p>
|
|
@@ -49,6 +54,7 @@ Checkout other AdonisJS packages
|
|
|
49
54
|
- [The Scope middleware](#the-scope-middleware)
|
|
50
55
|
- [Default Scope](#default-scope-tenant)
|
|
51
56
|
- [Transactions](#transactions)
|
|
57
|
+
- [Events](#events)
|
|
52
58
|
- [Cheat sheet](#cheat-sheet)
|
|
53
59
|
- [Todo](#todo)
|
|
54
60
|
- [Test](#test)
|
|
@@ -104,7 +110,7 @@ Example.
|
|
|
104
110
|
```typescript
|
|
105
111
|
|
|
106
112
|
import { BaseModel, column } from '@adonisjs/lucid/orm'
|
|
107
|
-
import { MorphMap } from '@holoyan/
|
|
113
|
+
import { MorphMap } from '@holoyan/morph-map-js' // (NOTE upper case `MorphMap`)
|
|
108
114
|
import { AclModelInterface } from '@holoyan/adonisjs-permissions/types'
|
|
109
115
|
|
|
110
116
|
@MorphMap('users')
|
|
@@ -135,11 +141,6 @@ export default class Post extends BaseModel implements AclModelInterface {
|
|
|
135
141
|
|
|
136
142
|
```
|
|
137
143
|
|
|
138
|
-
## Release Notes
|
|
139
|
-
|
|
140
|
-
Version: >= v1.0.3
|
|
141
|
-
* Added `sync` method
|
|
142
|
-
|
|
143
144
|
## Mixins
|
|
144
145
|
|
|
145
146
|
If you want to be able to call `Acl` methods on a `User` model then consider using `hasPermissions` mixin
|
|
@@ -147,7 +148,7 @@ If you want to be able to call `Acl` methods on a `User` model then consider usi
|
|
|
147
148
|
```typescript
|
|
148
149
|
|
|
149
150
|
import { BaseModel, column } from '@adonisjs/lucid/orm'
|
|
150
|
-
import { MorphMap } from '@holoyan/
|
|
151
|
+
import { MorphMap } from '@holoyan/morph-map-js' // (NOTE upper case `MorphMap`)
|
|
151
152
|
import { AclModelInterface } from '@holoyan/adonisjs-permissions/types'
|
|
152
153
|
|
|
153
154
|
// import mixin
|
|
@@ -992,6 +993,139 @@ await trx.commit()
|
|
|
992
993
|
```
|
|
993
994
|
|
|
994
995
|
|
|
996
|
+
### Events
|
|
997
|
+
|
|
998
|
+
`Acl` has built-in events that you can listen to. All they are class-based. To listen to the events, you can use `emitter`
|
|
999
|
+
|
|
1000
|
+
```typescript
|
|
1001
|
+
import emitter from '@adonisjs/core/services/emitter'
|
|
1002
|
+
import { PermissionsAttachedToModelEvent } from '@holoyan/adonisjs-permissions/events'
|
|
1003
|
+
|
|
1004
|
+
emitter.on(PermissionsAttachedToModelEvent, (event) => {
|
|
1005
|
+
console.log('permission attached to the model')
|
|
1006
|
+
console.log(event.model) // lucid model instance
|
|
1007
|
+
console.log(event.permissionIds) // array of permission ids
|
|
1008
|
+
})
|
|
1009
|
+
|
|
1010
|
+
await Acl.model(myUser).allow('create')
|
|
1011
|
+
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
You can also disable events per query by calling withoutEvents() method
|
|
1016
|
+
|
|
1017
|
+
```typescript
|
|
1018
|
+
|
|
1019
|
+
emitter.on(RoleCreatedEvent, () => {
|
|
1020
|
+
console.log('Role created') // this will not be called
|
|
1021
|
+
})
|
|
1022
|
+
|
|
1023
|
+
//
|
|
1024
|
+
await Acl.role().withoutEvents().create({ // this one will not trigger RoleCreatedEvent
|
|
1025
|
+
slug: 'admin',
|
|
1026
|
+
})
|
|
1027
|
+
|
|
1028
|
+
await Acl.role().create({ // this will trigger
|
|
1029
|
+
slug: 'admin',
|
|
1030
|
+
})
|
|
1031
|
+
|
|
1032
|
+
```
|
|
1033
|
+
|
|
1034
|
+
If you want to completely disable events, you can do that by calling `withoutEvents()` method on the `Acl` class
|
|
1035
|
+
|
|
1036
|
+
```typescript
|
|
1037
|
+
|
|
1038
|
+
Acl.withoutEvents()
|
|
1039
|
+
|
|
1040
|
+
// any method called on the Acl will not trigger any events
|
|
1041
|
+
emitter.on(RoleCreatedEvent, () => {
|
|
1042
|
+
console.log('Role created') // this will not be called
|
|
1043
|
+
})
|
|
1044
|
+
|
|
1045
|
+
await Acl.role().create({ // this will not trigger because globaly withoutEvents() is set
|
|
1046
|
+
slug: 'admin',
|
|
1047
|
+
})
|
|
1048
|
+
```
|
|
1049
|
+
|
|
1050
|
+
List of events you can listen to:
|
|
1051
|
+
|
|
1052
|
+
```
|
|
1053
|
+
|
|
1054
|
+
// Permission events
|
|
1055
|
+
|
|
1056
|
+
PermissionCreatedEvent { // only if you use Acl.permission().create() method
|
|
1057
|
+
permission: Permission // created permission instance
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
PermissionDeletedEvent {
|
|
1061
|
+
permission: string // slug of deleted permission
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
PermissionsAttachedToRoleEvent {
|
|
1065
|
+
permissionIds: ModelIdType[],
|
|
1066
|
+
roleId: ModelIdType
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
PermissionsDetachedFromRoleEvent {
|
|
1070
|
+
permissions: string[],
|
|
1071
|
+
roleId: ModelIdType
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
PermissionsAttachedToModelEvent<T extends LucidModel>{
|
|
1075
|
+
permissionIds: ModelIdType[],
|
|
1076
|
+
model: T
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
PermissionsDetachedFromModelEvent<T extends LucidModel>{
|
|
1080
|
+
permissions: string[],
|
|
1081
|
+
model: T
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
PermissionsFlushedEvent<T extends LucidModel> {
|
|
1085
|
+
model: T
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
PermissionsForbadeEvent<T extends LucidModel> {
|
|
1089
|
+
permissionIds: ModelIdType[],
|
|
1090
|
+
model: T
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
PermissionsUnForbadeEvent<T extends LucidModel> {
|
|
1094
|
+
permissionIds: ModelIdType[],
|
|
1095
|
+
model: T
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
PermissionsFlushedFromRoleEvent{
|
|
1099
|
+
roleId: ModelIdType
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
// Role events
|
|
1103
|
+
|
|
1104
|
+
RoleCreatedEvent {
|
|
1105
|
+
role: Role // created role instance
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
RoleDeletedEvent {
|
|
1109
|
+
role: string // slug of deleted role
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
RolesAttachedToModel<T extends LucidModel> {
|
|
1113
|
+
roles: string[], // array of role slugs
|
|
1114
|
+
model: T // lucid model instance
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
RolesDetachedFromModelEvent<T extends LucidModel> {
|
|
1118
|
+
roles: string[], // array of role slugs
|
|
1119
|
+
model: T // lucid model instance
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
RolesFlushedFromModelEvent {
|
|
1123
|
+
model: T // lucid model instance
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
|
|
995
1129
|
## Cheat sheet
|
|
996
1130
|
|
|
997
1131
|
Model methods
|
|
@@ -1138,7 +1272,7 @@ await Acl.permission(myPermission).detachFromRole(role_slug)
|
|
|
1138
1272
|
|
|
1139
1273
|
- [X] Scopes (Multitenancy)
|
|
1140
1274
|
- [X] UUID support
|
|
1141
|
-
- [
|
|
1275
|
+
- [X] Events
|
|
1142
1276
|
- [ ] More test coverage
|
|
1143
1277
|
- [ ] Caching
|
|
1144
1278
|
- [ ] Integration with AdonisJs Bouncer
|
|
@@ -1153,7 +1287,7 @@ await Acl.permission(myPermission).detachFromRole(role_slug)
|
|
|
1153
1287
|
|
|
1154
1288
|
| AdonisJS Lucid version | Package version |
|
|
1155
1289
|
|------------------------|-----------------|
|
|
1156
|
-
| v20.x | 0.
|
|
1290
|
+
| v20.x | 0.10.x |
|
|
1157
1291
|
| v21.x | 1.x |
|
|
1158
1292
|
|
|
1159
1293
|
|
package/build/index.d.ts
CHANGED
|
@@ -8,8 +8,7 @@ export declare const Permission: typeof permission;
|
|
|
8
8
|
export declare const Role: typeof role;
|
|
9
9
|
export { configure } from './configure.js';
|
|
10
10
|
export { stubsRoot } from './stubs/main.js';
|
|
11
|
-
export {
|
|
11
|
+
export { AclManager, Acl } from './src/acl.js';
|
|
12
12
|
export { MorphMap, getClassPath } from './src/decorators.js';
|
|
13
|
-
export * as morphMapModel from './src/morph_map.js';
|
|
14
13
|
export { hasPermissions } from './src/mixins/has_permissions.js';
|
|
15
14
|
export { Scope } from './src/scope.js';
|
package/build/index.js
CHANGED
|
@@ -16,8 +16,7 @@ export const Permission = permission;
|
|
|
16
16
|
export const Role = role;
|
|
17
17
|
export { configure } from './configure.js';
|
|
18
18
|
export { stubsRoot } from './stubs/main.js';
|
|
19
|
-
export {
|
|
19
|
+
export { AclManager, Acl } from './src/acl.js';
|
|
20
20
|
export { MorphMap, getClassPath } from './src/decorators.js';
|
|
21
|
-
export * as morphMapModel from './src/morph_map.js';
|
|
22
21
|
export { hasPermissions } from './src/mixins/has_permissions.js';
|
|
23
22
|
export { Scope } from './src/scope.js';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ApplicationService } from '@adonisjs/core/types';
|
|
2
2
|
import ModelManager from '../src/model_manager.js';
|
|
3
|
-
import
|
|
3
|
+
import { MorphMapManager } from '@holoyan/morph-map-js';
|
|
4
4
|
declare module '@adonisjs/core/types' {
|
|
5
5
|
interface ContainerBindings {
|
|
6
|
-
morphMap:
|
|
6
|
+
morphMap: MorphMapManager;
|
|
7
7
|
modelManager: ModelManager;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
@@ -4,8 +4,8 @@ import ModelPermission from '../src/models/model_permission.js';
|
|
|
4
4
|
import ModelRole from '../src/models/model_role.js';
|
|
5
5
|
import ModelManager from '../src/model_manager.js';
|
|
6
6
|
import { AclManager } from '../src/acl.js';
|
|
7
|
-
import MorphMap from '../src/morph_map.js';
|
|
8
7
|
import { Scope } from '../src/scope.js';
|
|
8
|
+
import { morphMap } from '@holoyan/morph-map-js';
|
|
9
9
|
export default class RolePermissionProvider {
|
|
10
10
|
app;
|
|
11
11
|
constructor(app) {
|
|
@@ -13,11 +13,20 @@ export default class RolePermissionProvider {
|
|
|
13
13
|
}
|
|
14
14
|
register() {
|
|
15
15
|
this.app.container.singleton('morphMap', async () => {
|
|
16
|
-
return
|
|
16
|
+
return morphMap;
|
|
17
17
|
});
|
|
18
18
|
this.app.container.singleton('modelManager', async () => {
|
|
19
19
|
return new ModelManager();
|
|
20
20
|
});
|
|
21
|
+
const wantsUuid = this.app.config.get('permissions.permissionsConfig.uuidSupport');
|
|
22
|
+
Permission.table = this.app.config.get('permissions.permissionsConfig.tables.permissions');
|
|
23
|
+
Permission.selfAssignPrimaryKey = wantsUuid;
|
|
24
|
+
Permission.uuidSupport = wantsUuid;
|
|
25
|
+
Role.table = this.app.config.get('permissions.permissionsConfig.tables.roles');
|
|
26
|
+
Role.selfAssignPrimaryKey = wantsUuid;
|
|
27
|
+
Role.uuidSupport = wantsUuid;
|
|
28
|
+
ModelRole.table = this.app.config.get('permissions.permissionsConfig.tables.modelRoles');
|
|
29
|
+
ModelPermission.table = this.app.config.get('permissions.permissionsConfig.tables.modelPermissions');
|
|
21
30
|
}
|
|
22
31
|
async boot() {
|
|
23
32
|
const modelManager = await this.app.container.make('modelManager');
|
|
@@ -26,10 +35,12 @@ export default class RolePermissionProvider {
|
|
|
26
35
|
modelManager.setModel('modelPermission', ModelPermission);
|
|
27
36
|
modelManager.setModel('modelRole', ModelRole);
|
|
28
37
|
modelManager.setModel('scope', Scope);
|
|
38
|
+
const emitter = await this.app.container.make('emitter');
|
|
29
39
|
AclManager.setModelManager(modelManager);
|
|
40
|
+
AclManager.setEmitter(emitter);
|
|
30
41
|
const map = await this.app.container.make('morphMap');
|
|
31
|
-
map.set('permissions', Permission)
|
|
32
|
-
map.set('roles', Role)
|
|
42
|
+
// map.set('permissions', Permission)
|
|
43
|
+
// map.set('roles', Role)
|
|
33
44
|
AclManager.setMorphMap(map);
|
|
34
45
|
}
|
|
35
46
|
}
|
package/build/src/acl.d.ts
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import { RoleHasModelPermissions } from './services/roles/role_has_model_permissions.js';
|
|
2
2
|
import { ModelHasRolePermissions } from './services/models/model_has_role_permissions.js';
|
|
3
|
-
import { AclModel, MorphInterface, OptionsInterface, PermissionInterface, RoleInterface
|
|
3
|
+
import { AclModel, MorphInterface, OptionsInterface, PermissionInterface, RoleInterface } from './types.js';
|
|
4
|
+
import PermissionHasModelRoles from './services/permissions/permission_has_model_roles.js';
|
|
4
5
|
import ModelManager from './model_manager.js';
|
|
5
6
|
import EmptyPermission from './services/permissions/empty_permission.js';
|
|
6
7
|
import EmptyRoles from './services/roles/empty_roles.js';
|
|
8
|
+
import { BaseEvent, Emitter } from '@adonisjs/core/events';
|
|
9
|
+
import { Scope } from './scope.js';
|
|
7
10
|
export declare class AclManager {
|
|
8
11
|
private static modelManager;
|
|
9
12
|
private static map;
|
|
13
|
+
private static emitter;
|
|
14
|
+
protected currentScope: Scope;
|
|
15
|
+
private readonly allowOptionsRewriting;
|
|
16
|
+
private options;
|
|
10
17
|
static setModelManager(manager: ModelManager): void;
|
|
18
|
+
static getModelManager(): ModelManager;
|
|
11
19
|
static setMorphMap(map: MorphInterface): void;
|
|
12
|
-
|
|
13
|
-
private options;
|
|
20
|
+
static setEmitter(emitter: Emitter<any>): void;
|
|
14
21
|
constructor(allowOptionsRewriting: boolean, defaultOptions?: OptionsInterface);
|
|
15
22
|
model(model: AclModel): ModelHasRolePermissions;
|
|
16
23
|
role(): EmptyRoles;
|
|
17
24
|
role(role: RoleInterface): RoleHasModelPermissions;
|
|
18
25
|
permission(): EmptyPermission;
|
|
19
|
-
permission(permission: PermissionInterface):
|
|
20
|
-
private createNewScope;
|
|
26
|
+
permission(permission: PermissionInterface): PermissionHasModelRoles;
|
|
21
27
|
/**
|
|
22
28
|
* changing global options
|
|
23
29
|
* @param options
|
|
@@ -28,7 +34,12 @@ export declare class AclManager {
|
|
|
28
34
|
* @param scope
|
|
29
35
|
* @param forceUpdate
|
|
30
36
|
*/
|
|
31
|
-
scope(scope:
|
|
37
|
+
scope(scope: Scope, forceUpdate?: boolean): this;
|
|
32
38
|
getScope(): any;
|
|
39
|
+
withoutEvents(): AclManager;
|
|
40
|
+
withoutEvents<T extends BaseEvent>(events: T[]): AclManager;
|
|
41
|
+
withEvents(): AclManager;
|
|
42
|
+
withEvents<T extends BaseEvent>(events: T[]): AclManager;
|
|
43
|
+
protected optionClone(): OptionsInterface;
|
|
33
44
|
}
|
|
34
45
|
export declare const Acl: AclManager;
|
package/build/src/acl.js
CHANGED
|
@@ -1,47 +1,55 @@
|
|
|
1
1
|
import { RoleHasModelPermissions } from './services/roles/role_has_model_permissions.js';
|
|
2
2
|
import { ModelHasRolePermissions } from './services/models/model_has_role_permissions.js';
|
|
3
3
|
import PermissionHasModelRoles from './services/permissions/permission_has_model_roles.js';
|
|
4
|
-
import ModelManager from './model_manager.js';
|
|
5
4
|
import EmptyPermission from './services/permissions/empty_permission.js';
|
|
6
5
|
import EmptyRoles from './services/roles/empty_roles.js';
|
|
7
6
|
import { Scope } from './scope.js';
|
|
8
7
|
export class AclManager {
|
|
9
8
|
static modelManager;
|
|
10
9
|
static map;
|
|
10
|
+
static emitter;
|
|
11
|
+
currentScope;
|
|
12
|
+
allowOptionsRewriting;
|
|
13
|
+
options = {
|
|
14
|
+
events: {
|
|
15
|
+
fire: true,
|
|
16
|
+
except: [],
|
|
17
|
+
only: [],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
11
20
|
static setModelManager(manager) {
|
|
12
21
|
this.modelManager = manager;
|
|
13
22
|
}
|
|
23
|
+
static getModelManager() {
|
|
24
|
+
return this.modelManager;
|
|
25
|
+
}
|
|
14
26
|
static setMorphMap(map) {
|
|
15
27
|
this.map = map;
|
|
16
28
|
}
|
|
17
|
-
|
|
18
|
-
|
|
29
|
+
static setEmitter(emitter) {
|
|
30
|
+
this.emitter = emitter;
|
|
31
|
+
}
|
|
19
32
|
constructor(allowOptionsRewriting, defaultOptions) {
|
|
20
33
|
this.allowOptionsRewriting = allowOptionsRewriting;
|
|
21
|
-
// default global scope
|
|
22
|
-
this.options['scope'] = this.createNewScope();
|
|
23
34
|
if (defaultOptions) {
|
|
24
35
|
this.options = { ...this.options, ...defaultOptions };
|
|
25
36
|
}
|
|
37
|
+
this.currentScope = new Scope();
|
|
26
38
|
}
|
|
27
39
|
model(model) {
|
|
28
|
-
return new ModelHasRolePermissions(AclManager.modelManager, AclManager.map,
|
|
40
|
+
return new ModelHasRolePermissions(AclManager.modelManager, AclManager.map, this.optionClone(), new Scope().set(this.currentScope.get()), model, AclManager.emitter);
|
|
29
41
|
}
|
|
30
42
|
role(role) {
|
|
31
43
|
if (role) {
|
|
32
|
-
return new RoleHasModelPermissions(AclManager.modelManager, AclManager.map,
|
|
44
|
+
return new RoleHasModelPermissions(AclManager.modelManager, AclManager.map, this.optionClone(), new Scope().set(this.currentScope.get()), role, AclManager.emitter);
|
|
33
45
|
}
|
|
34
|
-
return new EmptyRoles(AclManager.modelManager, AclManager.map,
|
|
46
|
+
return new EmptyRoles(AclManager.modelManager, AclManager.map, this.optionClone(), new Scope().set(this.currentScope.get()), AclManager.emitter);
|
|
35
47
|
}
|
|
36
48
|
permission(permission) {
|
|
37
49
|
if (permission) {
|
|
38
|
-
return new PermissionHasModelRoles(AclManager.modelManager, AclManager.map,
|
|
50
|
+
return new PermissionHasModelRoles(AclManager.modelManager, AclManager.map, this.optionClone(), new Scope().set(this.currentScope.get()), permission, AclManager.emitter);
|
|
39
51
|
}
|
|
40
|
-
return new EmptyPermission(AclManager.modelManager, AclManager.map,
|
|
41
|
-
}
|
|
42
|
-
createNewScope() {
|
|
43
|
-
const ScopeClass = AclManager.modelManager.getModel('scope');
|
|
44
|
-
return new ScopeClass().get();
|
|
52
|
+
return new EmptyPermission(AclManager.modelManager, AclManager.map, this.optionClone(), new Scope().set(this.currentScope.get()), AclManager.emitter);
|
|
45
53
|
}
|
|
46
54
|
/**
|
|
47
55
|
* changing global options
|
|
@@ -63,16 +71,30 @@ export class AclManager {
|
|
|
63
71
|
if (!this.allowOptionsRewriting && !forceUpdate) {
|
|
64
72
|
throw new Error('Scope method call is not available on global Acl object, use AclManager to create new scoped object or use forceUpdate=true');
|
|
65
73
|
}
|
|
66
|
-
this.
|
|
67
|
-
scope: scope.get(),
|
|
68
|
-
}, forceUpdate);
|
|
74
|
+
this.currentScope = scope;
|
|
69
75
|
return this;
|
|
70
76
|
}
|
|
71
77
|
getScope() {
|
|
72
78
|
return this.options['scope'];
|
|
73
79
|
}
|
|
80
|
+
withoutEvents(events) {
|
|
81
|
+
if (events?.length) {
|
|
82
|
+
this.options.events.except = events;
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
this.options.events.fire = false;
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
withEvents(events) {
|
|
89
|
+
if (events?.length) {
|
|
90
|
+
this.options.events.only = events;
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
this.options.events.fire = true;
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
optionClone() {
|
|
97
|
+
return structuredClone(this.options);
|
|
98
|
+
}
|
|
74
99
|
}
|
|
75
|
-
const modelManager = new ModelManager();
|
|
76
|
-
modelManager.setModel('scope', Scope);
|
|
77
|
-
AclManager.setModelManager(modelManager);
|
|
78
100
|
export const Acl = new AclManager(false);
|
package/build/src/decorators.js
CHANGED
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { morphMap, getClassPath as baseGetClassPath } from '@holoyan/morph-map-js';
|
|
2
|
+
// keep for backward compatibility
|
|
2
3
|
export function MorphMap(param) {
|
|
3
4
|
return function (target) {
|
|
4
|
-
|
|
5
|
-
var result = await app.container.make('morphMap');
|
|
6
|
-
result.set(param, target);
|
|
7
|
-
return param;
|
|
8
|
-
};
|
|
9
|
-
target.prototype.__morphMapName = service();
|
|
5
|
+
morphMap.set(param, target);
|
|
10
6
|
target.prototype.__morphMapName = param;
|
|
11
7
|
};
|
|
12
8
|
}
|
|
13
9
|
export function getClassPath(clazz) {
|
|
14
|
-
|
|
15
|
-
if (!morphMapName) {
|
|
16
|
-
throw new Error('morph map name not specified');
|
|
17
|
-
}
|
|
18
|
-
return morphMapName;
|
|
10
|
+
return baseGetClassPath(clazz);
|
|
19
11
|
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { BaseEvent } from '@adonisjs/core/events';
|
|
2
|
+
import Permission from '../../models/permission.js';
|
|
3
|
+
import { ModelIdType } from '../../types.js';
|
|
4
|
+
import { LucidModel } from '@adonisjs/lucid/types/model';
|
|
5
|
+
export declare class PermissionCreatedEvent extends BaseEvent {
|
|
6
|
+
permission: Permission;
|
|
7
|
+
/**
|
|
8
|
+
* Accept event data as constructor parameters
|
|
9
|
+
*/
|
|
10
|
+
constructor(permission: Permission);
|
|
11
|
+
}
|
|
12
|
+
export declare class PermissionDeletedEvent extends BaseEvent {
|
|
13
|
+
permission: string;
|
|
14
|
+
/**
|
|
15
|
+
* Accept event data as constructor parameters
|
|
16
|
+
*/
|
|
17
|
+
constructor(permission: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class PermissionsAttachedToRoleEvent extends BaseEvent {
|
|
20
|
+
permissionIds: ModelIdType[];
|
|
21
|
+
roleId: ModelIdType;
|
|
22
|
+
/**
|
|
23
|
+
* Accept event data as constructor parameters
|
|
24
|
+
*/
|
|
25
|
+
constructor(permissionIds: ModelIdType[], roleId: ModelIdType);
|
|
26
|
+
}
|
|
27
|
+
export declare class PermissionsDetachedFromRoleEvent extends BaseEvent {
|
|
28
|
+
permissions: string[];
|
|
29
|
+
roleId: ModelIdType;
|
|
30
|
+
/**
|
|
31
|
+
* Accept event data as constructor parameters
|
|
32
|
+
*/
|
|
33
|
+
constructor(permissions: string[], roleId: ModelIdType);
|
|
34
|
+
}
|
|
35
|
+
export declare class PermissionsAttachedToModelEvent<T extends LucidModel> extends BaseEvent {
|
|
36
|
+
permissionIds: ModelIdType[];
|
|
37
|
+
model: T;
|
|
38
|
+
/**
|
|
39
|
+
* Accept event data as constructor parameters
|
|
40
|
+
*/
|
|
41
|
+
constructor(permissionIds: ModelIdType[], model: T);
|
|
42
|
+
}
|
|
43
|
+
export declare class PermissionsDetachedFromModelEvent<T extends LucidModel> extends BaseEvent {
|
|
44
|
+
permissions: string[];
|
|
45
|
+
model: T;
|
|
46
|
+
/**
|
|
47
|
+
* Accept event data as constructor parameters
|
|
48
|
+
*/
|
|
49
|
+
constructor(permissions: string[], model: T);
|
|
50
|
+
}
|
|
51
|
+
export declare class PermissionsFlushedEvent<T extends LucidModel> extends BaseEvent {
|
|
52
|
+
model: T;
|
|
53
|
+
/**
|
|
54
|
+
* Accept event data as constructor parameters
|
|
55
|
+
*/
|
|
56
|
+
constructor(model: T);
|
|
57
|
+
}
|
|
58
|
+
export declare class PermissionsForbadeEvent<T extends LucidModel> extends BaseEvent {
|
|
59
|
+
permissionIds: ModelIdType[];
|
|
60
|
+
model: T;
|
|
61
|
+
/**
|
|
62
|
+
* Accept event data as constructor parameters
|
|
63
|
+
*/
|
|
64
|
+
constructor(permissionIds: ModelIdType[], model: T);
|
|
65
|
+
}
|
|
66
|
+
export declare class PermissionsUnForbadeEvent<T extends LucidModel> extends BaseEvent {
|
|
67
|
+
permissionIds: ModelIdType[];
|
|
68
|
+
model: T;
|
|
69
|
+
/**
|
|
70
|
+
* Accept event data as constructor parameters
|
|
71
|
+
*/
|
|
72
|
+
constructor(permissionIds: ModelIdType[], model: T);
|
|
73
|
+
}
|
|
74
|
+
export declare class PermissionsFlushedFromRoleEvent extends BaseEvent {
|
|
75
|
+
roleId: ModelIdType;
|
|
76
|
+
/**
|
|
77
|
+
* Accept event data as constructor parameters
|
|
78
|
+
*/
|
|
79
|
+
constructor(roleId: ModelIdType);
|
|
80
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { BaseEvent } from '@adonisjs/core/events';
|
|
2
|
+
export class PermissionCreatedEvent extends BaseEvent {
|
|
3
|
+
permission;
|
|
4
|
+
/**
|
|
5
|
+
* Accept event data as constructor parameters
|
|
6
|
+
*/
|
|
7
|
+
constructor(permission) {
|
|
8
|
+
super();
|
|
9
|
+
this.permission = permission;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class PermissionDeletedEvent extends BaseEvent {
|
|
13
|
+
permission;
|
|
14
|
+
/**
|
|
15
|
+
* Accept event data as constructor parameters
|
|
16
|
+
*/
|
|
17
|
+
constructor(permission) {
|
|
18
|
+
super();
|
|
19
|
+
this.permission = permission;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class PermissionsAttachedToRoleEvent extends BaseEvent {
|
|
23
|
+
permissionIds;
|
|
24
|
+
roleId;
|
|
25
|
+
/**
|
|
26
|
+
* Accept event data as constructor parameters
|
|
27
|
+
*/
|
|
28
|
+
constructor(permissionIds, roleId) {
|
|
29
|
+
super();
|
|
30
|
+
this.permissionIds = permissionIds;
|
|
31
|
+
this.roleId = roleId;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class PermissionsDetachedFromRoleEvent extends BaseEvent {
|
|
35
|
+
permissions;
|
|
36
|
+
roleId;
|
|
37
|
+
/**
|
|
38
|
+
* Accept event data as constructor parameters
|
|
39
|
+
*/
|
|
40
|
+
constructor(permissions, roleId) {
|
|
41
|
+
super();
|
|
42
|
+
this.permissions = permissions;
|
|
43
|
+
this.roleId = roleId;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class PermissionsAttachedToModelEvent extends BaseEvent {
|
|
47
|
+
permissionIds;
|
|
48
|
+
model;
|
|
49
|
+
/**
|
|
50
|
+
* Accept event data as constructor parameters
|
|
51
|
+
*/
|
|
52
|
+
constructor(permissionIds, model) {
|
|
53
|
+
super();
|
|
54
|
+
this.permissionIds = permissionIds;
|
|
55
|
+
this.model = model;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class PermissionsDetachedFromModelEvent extends BaseEvent {
|
|
59
|
+
permissions;
|
|
60
|
+
model;
|
|
61
|
+
/**
|
|
62
|
+
* Accept event data as constructor parameters
|
|
63
|
+
*/
|
|
64
|
+
constructor(permissions, model) {
|
|
65
|
+
super();
|
|
66
|
+
this.permissions = permissions;
|
|
67
|
+
this.model = model;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export class PermissionsFlushedEvent extends BaseEvent {
|
|
71
|
+
model;
|
|
72
|
+
/**
|
|
73
|
+
* Accept event data as constructor parameters
|
|
74
|
+
*/
|
|
75
|
+
constructor(model) {
|
|
76
|
+
super();
|
|
77
|
+
this.model = model;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export class PermissionsForbadeEvent extends BaseEvent {
|
|
81
|
+
permissionIds;
|
|
82
|
+
model;
|
|
83
|
+
/**
|
|
84
|
+
* Accept event data as constructor parameters
|
|
85
|
+
*/
|
|
86
|
+
constructor(permissionIds, model) {
|
|
87
|
+
super();
|
|
88
|
+
this.permissionIds = permissionIds;
|
|
89
|
+
this.model = model;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export class PermissionsUnForbadeEvent extends BaseEvent {
|
|
93
|
+
permissionIds;
|
|
94
|
+
model;
|
|
95
|
+
/**
|
|
96
|
+
* Accept event data as constructor parameters
|
|
97
|
+
*/
|
|
98
|
+
constructor(permissionIds, model) {
|
|
99
|
+
super();
|
|
100
|
+
this.permissionIds = permissionIds;
|
|
101
|
+
this.model = model;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export class PermissionsFlushedFromRoleEvent extends BaseEvent {
|
|
105
|
+
roleId;
|
|
106
|
+
/**
|
|
107
|
+
* Accept event data as constructor parameters
|
|
108
|
+
*/
|
|
109
|
+
constructor(roleId) {
|
|
110
|
+
super();
|
|
111
|
+
this.roleId = roleId;
|
|
112
|
+
}
|
|
113
|
+
}
|