@holoyan/adonisjs-permissions 0.8.21 → 0.9.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 +295 -4
  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
@@ -1,8 +1,17 @@
1
1
  # Role permissions system for AdonisJS V6+
2
2
 
3
+ Checkout other AdonisJS packages
4
+
5
+ - [AdonisJs activity log](https://github.com/holoyan/adonisjs-activitylog)
6
+
3
7
  [//]: # ([![test](https://github.com/holoyan/adonisjs-permissions/actions/workflows/test.yml/badge.svg)](https://github.com/holoyan/adonisjs-permissions/actions/workflows/test.yml))
4
8
  [![license](https://poser.pugx.org/silber/bouncer/license.svg)](https://github.com/holoyan/adonisjs-permissions/blob/master/LICENSE.md)
5
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
+
6
15
  ## Table of Contents
7
16
 
8
17
  <details><summary>Click to expand</summary><p>
@@ -40,9 +49,11 @@
40
49
  - [The Scope middleware](#the-scope-middleware)
41
50
  - [Default Scope](#default-scope-tenant)
42
51
  - [Transactions](#transactions)
52
+ - [Events] (#events)
43
53
  - [Cheat sheet](#cheat-sheet)
44
54
  - [Todo](#todo)
45
55
  - [Test](#test)
56
+ - [Version Map](#version-map)
46
57
  - [License](#license)
47
58
  </p></details>
48
59
 
@@ -72,7 +83,7 @@ To be able to use the full power of Acl, you should have a clear understanding o
72
83
 
73
84
  ## Installation
74
85
 
75
- npm i @holoyan/adonisjs-permissions@0.8.21
86
+ npm i @holoyan/adonisjs-permissions@0.9.0
76
87
 
77
88
 
78
89
  Next publish config files
@@ -127,8 +138,8 @@ export default class Post extends BaseModel implements AclModelInterface {
127
138
 
128
139
  ## Release Notes
129
140
 
130
- Version: >= 'v0.8.21'
131
- * Update: UUID version to ^10.0.0
141
+ Version: >= 'v0.9.x'
142
+ * Added [Events](#events) support
132
143
 
133
144
  ## Mixins
134
145
 
@@ -982,9 +993,279 @@ await trx.commit()
982
993
  ```
983
994
 
984
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
+
985
1129
  ## Cheat sheet
986
1130
 
987
- Coming soon
1131
+ Model methods
1132
+ ```typescript
1133
+ // getting model roles
1134
+ await Acl.model(user).roles()
1135
+
1136
+ // Checking the current model's roles
1137
+ await Acl.model(user).hasRole('role_slug')
1138
+ await Acl.model(user).hasAllRoles('role_slug1', 'role_slug2')
1139
+ await Acl.model(user).hasAnyRole('role_slug1', 'role_slug2')
1140
+
1141
+ // assigning roles
1142
+ await Acl.model(user).assignRole('role_slug')
1143
+ await Acl.model(user).assign('role_slug') // alias for assignRole()
1144
+ await Acl.model(user).assignAllRoles('role_slug1', 'role_slug2')
1145
+
1146
+ // revoking roles
1147
+ await Acl.model(user).revokeRole('role_slug')
1148
+ await Acl.model(user).revokeAllRoles('role_slug1', 'role_slug2')
1149
+ await Acl.model(user).flushRoles() // remove all roles
1150
+
1151
+ // syncing roles
1152
+ await Acl.model(user).syncRoles(['role_slug1', 'role_slug2']) // remove all roles and assign new
1153
+ await Acl.model(user).syncRolesWithoutDetaching(['role_slug1', 'role_slug2') // assign new roles without removing old
1154
+
1155
+
1156
+ // getting model permissions
1157
+
1158
+ await Acl.model(user).permissions()
1159
+ await Acl.model(user).globalPermissions() // get list of global permissions
1160
+ await Acl.mode(user).onResourcePermissions() // get list of on resrouce permissions
1161
+ await Acl.model(user).directPermissions() // list of permissions assigned to the user drectly
1162
+ await Acl.model(user).rolePermissions() // Get permissions through roles
1163
+ await Acl.model(user).directGlobalPermissions()
1164
+ await Acl.model(user).directResourcePermissions()
1165
+
1166
+ // checking for permission
1167
+ await Acl.model(user).hasPermission(permission)
1168
+ await Acl.model(user).hasAllPermissions([permission1, permission2])
1169
+ await Acl.model(user).hasAnyPermission([permission1, permission2])
1170
+ await Acl.model(user).hasAnyDirectPermission([permission1, permission2])
1171
+ await Acl.model(user).hasDirectPermission(permission1)
1172
+ await Acl.model(user).hasAllPermissionsDirect([permission1, permission2])
1173
+ await Acl.model(user).can(permission1) // alias for hasPermission()
1174
+ await Acl.model(user).canAll([permission1, permission2])
1175
+ await Acl.model(user).canAny([permission1, permission2])
1176
+
1177
+ // check Contains vs hasPermission section to see the diferrence
1178
+ await Acl.model(user).containsPermission(permission)
1179
+ await Acl.model(user).contains(permission) // alias for containsPermission
1180
+ await Acl.model(user).containsAllPermissions([permission1])
1181
+ await Acl.model(user).containsAnyPermission([permission1])
1182
+ await Acl.model(user).containsDirectPermission([permission1])
1183
+ await Acl.model(user).containsAllPermissionsDirectly([permission1])
1184
+ await Acl.model(user).containsAnyPermissionDirectly([permission1])
1185
+
1186
+ // assigning permissions
1187
+ await Acl.model(user).assignDirectPermission(permission)
1188
+ await Acl.model(user).assignDirectAllPermissions([permission1, permission2])
1189
+ await Acl.model(user).allow(permission1) // alias for assignDirectPermission()
1190
+ await Acl.model(user).allowAll([permission1, permission2])
1191
+
1192
+ // reviking permissions
1193
+ await Acl.model(user).revokePermission(permission1)
1194
+ await Acl.model(user).revoke(permission1) // alias for revokePermission()
1195
+ await Acl.model(user).revokeAllPermissions([permission1, permission2])
1196
+ await Acl.model(user).revokeAll([permission1, permission2]) // alias for revokeAllPermissions()
1197
+ await Acl.model(user).flushPermissions() // revoke/delete all direct assigned permissions
1198
+ await Acl.model(user).flush() // revoke/delete all assigned roles and permissions
1199
+
1200
+ // sync permissions
1201
+ await Acl.model(user).syncPermissions([permission1, permission2]) // all direct assigned permissions will be revoked and only permission1, permission2 will be assigned
1202
+
1203
+ // forbid/unforbiding permissions
1204
+ await Acl.model(user).forbid(permission1)
1205
+ await Acl.model(user).forbidAll([permission1, permission2])
1206
+ await Acl.model(user).unforbid(permission1)
1207
+ await Acl.model(user).unforbidAll([permission1, permission2])
1208
+
1209
+ ```
1210
+
1211
+ Role methods
1212
+
1213
+ ```typescript
1214
+
1215
+ await Acl.role(myAdminRole).models() // get list of models assigned to the role
1216
+ await Acl.role(myAdminRole).modelsFor('ALIAS_FOR_MODEL')
1217
+
1218
+ await Acl.role(myAdminRole).permissions()
1219
+ await Acl.role(myAdminRole).globalPermissions()
1220
+ await Acl.role(myAdminRole).onResourcePermissions()
1221
+
1222
+ // checking for a permissions
1223
+ await Acl.role(myAdminRole).hasPermission(permission)
1224
+ await Acl.role(myAdminRole).hasAllPermissions([permission1, permission2])
1225
+ await Acl.role(myAdminRole).hasAnyPermissions([permission1, permission2])
1226
+ await Acl.role(myAdminRole).can(permission) // alias for hasPermission
1227
+ await Acl.role(myAdminRole).canAll([permission1, permission2])
1228
+ await Acl.role(myAdminRole).canAny([permission1, permission2])
1229
+
1230
+ await Acl.role(myAdminRole).containsPermission(permission)
1231
+ await Acl.role(myAdminRole).containsAllPermissions([permission1, permission2])
1232
+ await Acl.role(myAdminRole).containsAnyPermissions([permission1, permission2])
1233
+ await Acl.role(myAdminRole).forbidden(permission) // check if permission forbidden for a role
1234
+
1235
+ // assigning permission
1236
+ await Acl.role(myAdminRole).give(permission)
1237
+ await Acl.role(myAdminRole).assign(permission) // alias for give()
1238
+ await Acl.role(myAdminRole).allow(permission) // alias for give()
1239
+
1240
+ await Acl.role(myAdminRole).giveAll([permission1])
1241
+ await Acl.role(myAdminRole).assignAll([permission1])
1242
+ await Acl.role(myAdminRole).allowAll([permission1])
1243
+
1244
+ // revoking permission
1245
+ await Acl.role(myAdminRole).revokePermission(permission1)
1246
+ await Acl.role(myAdminRole).revoke(permission1) // alias for revokePermission()
1247
+ await Acl.role(myAdminRole).revokeAllPermissions([permission1])
1248
+ await Acl.role(myAdminRole).revokeAll([permission1]) // alias for revokeAllPermissions()
1249
+ await Acl.role(myAdminRole).flush() // revoke all
1250
+
1251
+ await Acl.role(myAdminRole).sync([permission1, permission2]) // revoke all and assign only permission1, permission2
1252
+
1253
+ // forbid/unforbid
1254
+
1255
+ await Acl.role(myAdminRole).forbid(permission)
1256
+ await Acl.role(myAdminRole).unforbid(permission)
1257
+
1258
+ ```
1259
+
1260
+ Permission methods
1261
+ ```typescript
1262
+ await Acl.permission(myPermission).roles() // list of roles
1263
+ await Acl.permission(myPermission).modelsFor('MODEL_ALIAS')
1264
+ await Acl.permission(myPermission).belongsToRole(role_slug) // check if permission belongs to role
1265
+ await Acl.permission(myPermission).attachToRole(role_slug)
1266
+ await Acl.permission(myPermission).detachFromRole(role_slug)
1267
+
1268
+ ```
988
1269
 
989
1270
 
990
1271
  ## TODO
@@ -1001,6 +1282,16 @@ Coming soon
1001
1282
  npm run test
1002
1283
 
1003
1284
 
1285
+ ## Version Map
1286
+
1287
+
1288
+ | AdonisJS Lucid version | Package version |
1289
+ |------------------------|-----------------|
1290
+ | v20.x | 0.9.x |
1291
+ | v21.x | 1.x |
1292
+
1293
+
1294
+
1004
1295
  ## License
1005
1296
 
1006
1297
 
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
+ }