@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.
- package/README.md +245 -5
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/build/providers/role_permission_provider.js +11 -0
- package/build/src/acl.d.ts +18 -7
- package/build/src/acl.js +43 -21
- package/build/src/decorators.d.ts +3 -1
- 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 +248 -79
- package/build/src/mixins/has_permissions.js +199 -23
- 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 +2 -8
- package/build/src/models/role.d.ts +3 -4
- package/build/src/models/role.js +2 -8
- 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 +185 -0
- package/build/src/services/models/model_has_role_permissions.js +346 -0
- package/build/src/services/{model_service.d.ts → models/model_service.d.ts} +7 -5
- package/build/src/services/{model_service.js → models/model_service.js} +6 -4
- 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 +24 -17
- package/build/src/services/permissions/permission_has_model_roles.js +48 -31
- 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 +71 -20
- package/build/src/services/roles/role_has_model_permissions.js +87 -19
- 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 +3 -2
- package/build/src/services/model_has_role_permissions.d.ts +0 -65
- 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
|
[//]: # ([](https://github.com/holoyan/adonisjs-permissions/actions/workflows/test.yml))
|
|
8
8
|
[](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
|
|
136
|
-
*
|
|
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
|
-
|
|
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
|
-
- [
|
|
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.
|
|
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 {
|
|
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 {
|
|
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);
|
package/build/src/acl.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
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
|
-
|
|
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);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export declare function MorphMap(param: string): <T extends
|
|
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,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
|
+
}
|