@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.
- package/README.md +295 -4
- 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
|
@@ -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
|
[//]: # ([](https://github.com/holoyan/adonisjs-permissions/actions/workflows/test.yml))
|
|
4
8
|
[](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.
|
|
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.
|
|
131
|
-
*
|
|
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
|
-
|
|
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 {
|
|
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
|
+
}
|