@holoyan/adonisjs-permissions 1.0.3 → 1.1.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.
Files changed (49) hide show
  1. package/README.md +245 -5
  2. package/build/index.d.ts +1 -1
  3. package/build/index.js +1 -1
  4. package/build/providers/role_permission_provider.js +11 -0
  5. package/build/src/acl.d.ts +18 -7
  6. package/build/src/acl.js +43 -21
  7. package/build/src/decorators.d.ts +3 -1
  8. package/build/src/events/index.d.ts +2 -0
  9. package/build/src/events/index.js +2 -0
  10. package/build/src/events/permissions/permissions.d.ts +80 -0
  11. package/build/src/events/permissions/permissions.js +113 -0
  12. package/build/src/events/roles/roles.d.ts +40 -0
  13. package/build/src/events/roles/roles.js +55 -0
  14. package/build/src/mixins/has_permissions.d.ts +248 -79
  15. package/build/src/mixins/has_permissions.js +199 -23
  16. package/build/src/models/model_permission.d.ts +0 -1
  17. package/build/src/models/model_permission.js +0 -4
  18. package/build/src/models/model_role.d.ts +0 -1
  19. package/build/src/models/model_role.js +0 -4
  20. package/build/src/models/permission.d.ts +3 -4
  21. package/build/src/models/permission.js +2 -8
  22. package/build/src/models/role.d.ts +3 -4
  23. package/build/src/models/role.js +2 -8
  24. package/build/src/services/base_adapter.d.ts +10 -3
  25. package/build/src/services/base_adapter.js +30 -6
  26. package/build/src/services/base_service.d.ts +7 -3
  27. package/build/src/services/base_service.js +8 -4
  28. package/build/src/services/models/model_has_role_permissions.d.ts +185 -0
  29. package/build/src/services/models/model_has_role_permissions.js +346 -0
  30. package/build/src/services/{model_service.d.ts → models/model_service.d.ts} +7 -5
  31. package/build/src/services/{model_service.js → models/model_service.js} +6 -4
  32. package/build/src/services/permissions/empty_permission.d.ts +10 -8
  33. package/build/src/services/permissions/empty_permission.js +26 -10
  34. package/build/src/services/permissions/permission_has_model_roles.d.ts +24 -17
  35. package/build/src/services/permissions/permission_has_model_roles.js +48 -31
  36. package/build/src/services/permissions/permissions_service.d.ts +25 -23
  37. package/build/src/services/permissions/permissions_service.js +12 -11
  38. package/build/src/services/roles/empty_roles.d.ts +11 -8
  39. package/build/src/services/roles/empty_roles.js +27 -8
  40. package/build/src/services/roles/role_has_model_permissions.d.ts +71 -20
  41. package/build/src/services/roles/role_has_model_permissions.js +87 -19
  42. package/build/src/services/roles/roles_service.d.ts +8 -4
  43. package/build/src/services/roles/roles_service.js +15 -16
  44. package/build/src/types.d.ts +18 -7
  45. package/build/stubs/middlewares/acl_middleware.stub +1 -0
  46. package/build/stubs/migrations/create_db.stub +71 -56
  47. package/package.json +3 -2
  48. package/build/src/services/model_has_role_permissions.d.ts +0 -65
  49. package/build/src/services/model_has_role_permissions.js +0 -189
package/README.md CHANGED
@@ -7,6 +7,11 @@ Checkout other AdonisJS packages
7
7
  [//]: # ([![test](https://github.com/holoyan/adonisjs-permissions/actions/workflows/test.yml/badge.svg)](https://github.com/holoyan/adonisjs-permissions/actions/workflows/test.yml))
8
8
  [![license](https://poser.pugx.org/silber/bouncer/license.svg)](https://github.com/holoyan/adonisjs-permissions/blob/master/LICENSE.md)
9
9
 
10
+ ## How can you support me?
11
+
12
+ - It's simple, just star this repository, that is enough to keep me motivated to maintain this package.
13
+
14
+
10
15
  ## Table of Contents
11
16
 
12
17
  <details><summary>Click to expand</summary><p>
@@ -44,6 +49,7 @@ Checkout other AdonisJS packages
44
49
  - [The Scope middleware](#the-scope-middleware)
45
50
  - [Default Scope](#default-scope-tenant)
46
51
  - [Transactions](#transactions)
52
+ - [Events] (#events)
47
53
  - [Cheat sheet](#cheat-sheet)
48
54
  - [Todo](#todo)
49
55
  - [Test](#test)
@@ -132,8 +138,8 @@ export default class Post extends BaseModel implements AclModelInterface {
132
138
 
133
139
  ## Release Notes
134
140
 
135
- Version: >= v1.0.3
136
- * Update: UUID version to ^10.0.0
141
+ Version: >= v1.1.0
142
+ * Added support for [Events](#events)
137
143
 
138
144
  ## Mixins
139
145
 
@@ -987,16 +993,250 @@ await trx.commit()
987
993
  ```
988
994
 
989
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
+ List of events you can listen to:
1015
+
1016
+ ```
1017
+
1018
+ // Permission events
1019
+
1020
+ PermissionCreatedEvent { // only if you use Acl.permission().create() method
1021
+ permission: Permission // created permission instance
1022
+ }
1023
+
1024
+ PermissionDeletedEvent {
1025
+ permission: string // slug of deleted permission
1026
+ }
1027
+
1028
+ PermissionsAttachedToRoleEvent {
1029
+ permissionIds: ModelIdType[],
1030
+ roleId: ModelIdType
1031
+ }
1032
+
1033
+ PermissionsDetachedFromRoleEvent {
1034
+ permissions: string[],
1035
+ roleId: ModelIdType
1036
+ }
1037
+
1038
+ PermissionsAttachedToModelEvent<T extends LucidModel>{
1039
+ permissionIds: ModelIdType[],
1040
+ model: T
1041
+ }
1042
+
1043
+ PermissionsDetachedFromModelEvent<T extends LucidModel>{
1044
+ permissions: string[],
1045
+ model: T
1046
+ }
1047
+
1048
+ PermissionsFlushedEvent<T extends LucidModel> {
1049
+ model: T
1050
+ }
1051
+
1052
+ PermissionsForbadeEvent<T extends LucidModel> {
1053
+ permissionIds: ModelIdType[],
1054
+ model: T
1055
+ }
1056
+
1057
+ PermissionsUnForbadeEvent<T extends LucidModel> {
1058
+ permissionIds: ModelIdType[],
1059
+ model: T
1060
+ }
1061
+
1062
+ PermissionsFlushedFromRoleEvent{
1063
+ roleId: ModelIdType
1064
+ }
1065
+
1066
+ // Role events
1067
+
1068
+ RoleCreatedEvent {
1069
+ role: Role // created role instance
1070
+ }
1071
+
1072
+ RoleDeletedEvent {
1073
+ role: string // slug of deleted role
1074
+ }
1075
+
1076
+ RolesAttachedToModel<T extends LucidModel> {
1077
+ roles: string[], // array of role slugs
1078
+ model: T // lucid model instance
1079
+ }
1080
+
1081
+ RolesDetachedFromModelEvent<T extends LucidModel> {
1082
+ roles: string[], // array of role slugs
1083
+ model: T // lucid model instance
1084
+ }
1085
+
1086
+ RolesFlushedFromModelEvent {
1087
+ model: T // lucid model instance
1088
+ }
1089
+
1090
+ ```
1091
+
1092
+
990
1093
  ## Cheat sheet
991
1094
 
992
- Coming soon
1095
+ Model methods
1096
+ ```typescript
1097
+ // getting model roles
1098
+ await Acl.model(user).roles()
1099
+
1100
+ // Checking the current model's roles
1101
+ await Acl.model(user).hasRole('role_slug')
1102
+ await Acl.model(user).hasAllRoles('role_slug1', 'role_slug2')
1103
+ await Acl.model(user).hasAnyRole('role_slug1', 'role_slug2')
1104
+
1105
+ // assigning roles
1106
+ await Acl.model(user).assignRole('role_slug')
1107
+ await Acl.model(user).assign('role_slug') // alias for assignRole()
1108
+ await Acl.model(user).assignAllRoles('role_slug1', 'role_slug2')
1109
+
1110
+ // revoking roles
1111
+ await Acl.model(user).revokeRole('role_slug')
1112
+ await Acl.model(user).revokeAllRoles('role_slug1', 'role_slug2')
1113
+ await Acl.model(user).flushRoles() // remove all roles
1114
+
1115
+ // syncing roles
1116
+ await Acl.model(user).syncRoles(['role_slug1', 'role_slug2']) // remove all roles and assign new
1117
+ await Acl.model(user).syncRolesWithoutDetaching(['role_slug1', 'role_slug2') // assign new roles without removing old
1118
+
1119
+
1120
+ // getting model permissions
1121
+
1122
+ await Acl.model(user).permissions()
1123
+ await Acl.model(user).globalPermissions() // get list of global permissions
1124
+ await Acl.mode(user).onResourcePermissions() // get list of on resrouce permissions
1125
+ await Acl.model(user).directPermissions() // list of permissions assigned to the user drectly
1126
+ await Acl.model(user).rolePermissions() // Get permissions through roles
1127
+ await Acl.model(user).directGlobalPermissions()
1128
+ await Acl.model(user).directResourcePermissions()
1129
+
1130
+ // checking for permission
1131
+ await Acl.model(user).hasPermission(permission)
1132
+ await Acl.model(user).hasAllPermissions([permission1, permission2])
1133
+ await Acl.model(user).hasAnyPermission([permission1, permission2])
1134
+ await Acl.model(user).hasAnyDirectPermission([permission1, permission2])
1135
+ await Acl.model(user).hasDirectPermission(permission1)
1136
+ await Acl.model(user).hasAllPermissionsDirect([permission1, permission2])
1137
+ await Acl.model(user).can(permission1) // alias for hasPermission()
1138
+ await Acl.model(user).canAll([permission1, permission2])
1139
+ await Acl.model(user).canAny([permission1, permission2])
1140
+
1141
+ // check Contains vs hasPermission section to see the diferrence
1142
+ await Acl.model(user).containsPermission(permission)
1143
+ await Acl.model(user).contains(permission) // alias for containsPermission
1144
+ await Acl.model(user).containsAllPermissions([permission1])
1145
+ await Acl.model(user).containsAnyPermission([permission1])
1146
+ await Acl.model(user).containsDirectPermission([permission1])
1147
+ await Acl.model(user).containsAllPermissionsDirectly([permission1])
1148
+ await Acl.model(user).containsAnyPermissionDirectly([permission1])
1149
+
1150
+ // assigning permissions
1151
+ await Acl.model(user).assignDirectPermission(permission)
1152
+ await Acl.model(user).assignDirectAllPermissions([permission1, permission2])
1153
+ await Acl.model(user).allow(permission1) // alias for assignDirectPermission()
1154
+ await Acl.model(user).allowAll([permission1, permission2])
1155
+
1156
+ // reviking permissions
1157
+ await Acl.model(user).revokePermission(permission1)
1158
+ await Acl.model(user).revoke(permission1) // alias for revokePermission()
1159
+ await Acl.model(user).revokeAllPermissions([permission1, permission2])
1160
+ await Acl.model(user).revokeAll([permission1, permission2]) // alias for revokeAllPermissions()
1161
+ await Acl.model(user).flushPermissions() // revoke/delete all direct assigned permissions
1162
+ await Acl.model(user).flush() // revoke/delete all assigned roles and permissions
1163
+
1164
+ // sync permissions
1165
+ await Acl.model(user).syncPermissions([permission1, permission2]) // all direct assigned permissions will be revoked and only permission1, permission2 will be assigned
1166
+
1167
+ // forbid/unforbiding permissions
1168
+ await Acl.model(user).forbid(permission1)
1169
+ await Acl.model(user).forbidAll([permission1, permission2])
1170
+ await Acl.model(user).unforbid(permission1)
1171
+ await Acl.model(user).unforbidAll([permission1, permission2])
1172
+
1173
+ ```
1174
+
1175
+ Role methods
1176
+
1177
+ ```typescript
1178
+
1179
+ await Acl.role(myAdminRole).models() // get list of models assigned to the role
1180
+ await Acl.role(myAdminRole).modelsFor('ALIAS_FOR_MODEL')
1181
+
1182
+ await Acl.role(myAdminRole).permissions()
1183
+ await Acl.role(myAdminRole).globalPermissions()
1184
+ await Acl.role(myAdminRole).onResourcePermissions()
1185
+
1186
+ // checking for a permissions
1187
+ await Acl.role(myAdminRole).hasPermission(permission)
1188
+ await Acl.role(myAdminRole).hasAllPermissions([permission1, permission2])
1189
+ await Acl.role(myAdminRole).hasAnyPermissions([permission1, permission2])
1190
+ await Acl.role(myAdminRole).can(permission) // alias for hasPermission
1191
+ await Acl.role(myAdminRole).canAll([permission1, permission2])
1192
+ await Acl.role(myAdminRole).canAny([permission1, permission2])
1193
+
1194
+ await Acl.role(myAdminRole).containsPermission(permission)
1195
+ await Acl.role(myAdminRole).containsAllPermissions([permission1, permission2])
1196
+ await Acl.role(myAdminRole).containsAnyPermissions([permission1, permission2])
1197
+ await Acl.role(myAdminRole).forbidden(permission) // check if permission forbidden for a role
1198
+
1199
+ // assigning permission
1200
+ await Acl.role(myAdminRole).give(permission)
1201
+ await Acl.role(myAdminRole).assign(permission) // alias for give()
1202
+ await Acl.role(myAdminRole).allow(permission) // alias for give()
1203
+
1204
+ await Acl.role(myAdminRole).giveAll([permission1])
1205
+ await Acl.role(myAdminRole).assignAll([permission1])
1206
+ await Acl.role(myAdminRole).allowAll([permission1])
1207
+
1208
+ // revoking permission
1209
+ await Acl.role(myAdminRole).revokePermission(permission1)
1210
+ await Acl.role(myAdminRole).revoke(permission1) // alias for revokePermission()
1211
+ await Acl.role(myAdminRole).revokeAllPermissions([permission1])
1212
+ await Acl.role(myAdminRole).revokeAll([permission1]) // alias for revokeAllPermissions()
1213
+ await Acl.role(myAdminRole).flush() // revoke all
1214
+
1215
+ await Acl.role(myAdminRole).sync([permission1, permission2]) // revoke all and assign only permission1, permission2
1216
+
1217
+ // forbid/unforbid
1218
+
1219
+ await Acl.role(myAdminRole).forbid(permission)
1220
+ await Acl.role(myAdminRole).unforbid(permission)
1221
+
1222
+ ```
1223
+
1224
+ Permission methods
1225
+ ```typescript
1226
+ await Acl.permission(myPermission).roles() // list of roles
1227
+ await Acl.permission(myPermission).modelsFor('MODEL_ALIAS')
1228
+ await Acl.permission(myPermission).belongsToRole(role_slug) // check if permission belongs to role
1229
+ await Acl.permission(myPermission).attachToRole(role_slug)
1230
+ await Acl.permission(myPermission).detachFromRole(role_slug)
1231
+
1232
+ ```
993
1233
 
994
1234
 
995
1235
  ## TODO
996
1236
 
997
1237
  - [X] Scopes (Multitenancy)
998
1238
  - [X] UUID support
999
- - [ ] Events
1239
+ - [X] Events
1000
1240
  - [ ] More test coverage
1001
1241
  - [ ] Caching
1002
1242
  - [ ] Integration with AdonisJs Bouncer
@@ -1011,7 +1251,7 @@ Coming soon
1011
1251
 
1012
1252
  | AdonisJS Lucid version | Package version |
1013
1253
  |------------------------|-----------------|
1014
- | v20.x | 0.8.x |
1254
+ | v20.x | 0.9.x |
1015
1255
  | v21.x | 1.x |
1016
1256
 
1017
1257
 
package/build/index.d.ts CHANGED
@@ -8,7 +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 { Acl, AclManager } from './src/acl.js';
11
+ export { AclManager, Acl } from './src/acl.js';
12
12
  export { MorphMap, getClassPath } from './src/decorators.js';
13
13
  export * as morphMapModel from './src/morph_map.js';
14
14
  export { hasPermissions } from './src/mixins/has_permissions.js';
package/build/index.js CHANGED
@@ -16,7 +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 { Acl, AclManager } from './src/acl.js';
19
+ export { AclManager, Acl } from './src/acl.js';
20
20
  export { MorphMap, getClassPath } from './src/decorators.js';
21
21
  export * as morphMapModel from './src/morph_map.js';
22
22
  export { hasPermissions } from './src/mixins/has_permissions.js';
@@ -18,6 +18,15 @@ export default class RolePermissionProvider {
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,7 +35,9 @@ 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
42
  map.set('permissions', Permission);
32
43
  map.set('roles', Role);
@@ -1,23 +1,29 @@
1
1
  import { RoleHasModelPermissions } from './services/roles/role_has_model_permissions.js';
2
- import { ModelHasRolePermissions } from './services/model_has_role_permissions.js';
3
- import { AclModel, MorphInterface, OptionsInterface, PermissionInterface, RoleInterface, ScopeInterface } from './types.js';
2
+ import { ModelHasRolePermissions } from './services/models/model_has_role_permissions.js';
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
- private allowOptionsRewriting;
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): EmptyPermission;
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: ScopeInterface, forceUpdate?: boolean): this;
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
- import { ModelHasRolePermissions } from './services/model_has_role_permissions.js';
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
- allowOptionsRewriting;
18
- options = {};
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, { ...this.options }, model);
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, { ...this.options }, role);
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, { ...this.options });
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, { ...this.options }, permission);
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, { ...this.options });
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.withOptions({
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);
@@ -1,4 +1,6 @@
1
- export declare function MorphMap(param: string): <T extends new (...args: any[]) => {}>(target: T) => void;
1
+ export declare function MorphMap(param: string): <T extends {
2
+ new (...args: any[]): {};
3
+ }>(target: T) => void;
2
4
  export declare function getClassPath<T extends {
3
5
  new (...args: any[]): {};
4
6
  }>(clazz: T): string;
@@ -0,0 +1,2 @@
1
+ export * from './roles/roles.js';
2
+ export * from './permissions/permissions.js';
@@ -0,0 +1,2 @@
1
+ export * from './roles/roles.js';
2
+ export * from './permissions/permissions.js';
@@ -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
+ }