@holoyan/adonisjs-permissions 0.1.0 → 0.5.2
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 +160 -59
- package/build/index.d.ts +10 -4
- package/build/index.js +10 -5
- package/build/providers/role_permission_provider.d.ts +3 -0
- package/build/providers/role_permission_provider.js +21 -0
- package/build/src/acl.d.ts +10 -5
- package/build/src/acl.js +17 -9
- package/build/src/decorators.js +1 -0
- package/build/src/mixins/has_permissions.d.ts +58 -26
- package/build/src/mixins/has_permissions.js +123 -18
- package/build/src/model_manager.d.ts +7 -0
- package/build/src/model_manager.js +15 -0
- package/build/src/models/permission.d.ts +4 -4
- package/build/src/models/permission.js +2 -7
- package/build/src/models/role.d.ts +1 -1
- package/build/src/models/role.js +2 -7
- package/build/src/morph_map.d.ts +5 -2
- package/build/src/morph_map.js +16 -9
- package/build/src/services/helper.d.ts +2 -3
- package/build/src/services/helper.js +1 -7
- package/build/src/services/model_has_role_permissions.d.ts +41 -39
- package/build/src/services/model_has_role_permissions.js +92 -111
- package/build/src/services/model_service.d.ts +15 -6
- package/build/src/services/model_service.js +39 -14
- package/build/src/services/permissions/empty_permission.d.ts +8 -0
- package/build/src/services/permissions/empty_permission.js +17 -0
- package/build/src/services/permissions/permission_has_model_roles.d.ts +12 -8
- package/build/src/services/permissions/permission_has_model_roles.js +28 -19
- package/build/src/services/permissions/permissions_service.d.ts +42 -30
- package/build/src/services/permissions/permissions_service.js +198 -155
- package/build/src/services/query_helper.d.ts +7 -0
- package/build/src/services/query_helper.js +12 -0
- package/build/src/services/roles/empty_roles.d.ts +8 -0
- package/build/src/services/roles/empty_roles.js +17 -0
- package/build/src/services/roles/role_has_model_permissions.d.ts +32 -33
- package/build/src/services/roles/role_has_model_permissions.js +64 -78
- package/build/src/services/roles/roles_service.d.ts +20 -9
- package/build/src/services/roles/roles_service.js +90 -34
- package/build/src/types.d.ts +65 -5
- package/build/stubs/configs/permissions.stub +1 -1
- package/build/stubs/migrations/create_db.stub +8 -8
- package/package.json +3 -1
- package/build/src/mixins/has_role_permissions.d.ts +0 -128
- package/build/src/mixins/has_role_permissions.js +0 -10
- package/build/src/mixins/has_roles.d.ts +0 -1
- package/build/src/mixins/has_roles.js +0 -47
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getRoleModelQuery } from '../query_helper.js';
|
|
2
|
+
export default class EmptyRoles {
|
|
3
|
+
roleClassName;
|
|
4
|
+
roleQuery;
|
|
5
|
+
constructor(roleClassName) {
|
|
6
|
+
this.roleClassName = roleClassName;
|
|
7
|
+
this.roleQuery = getRoleModelQuery(this.roleClassName);
|
|
8
|
+
}
|
|
9
|
+
delete(role) {
|
|
10
|
+
// get all permissions by slug
|
|
11
|
+
// if there is permission with allowed false then check if it has `links`
|
|
12
|
+
return this.roleQuery.where('slug', role).delete();
|
|
13
|
+
}
|
|
14
|
+
query() {
|
|
15
|
+
return this.roleQuery;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -1,66 +1,65 @@
|
|
|
1
|
-
import Permission from '../../models/permission.js';
|
|
2
|
-
import Role from '../../models/role.js';
|
|
3
1
|
import ModelService from '../model_service.js';
|
|
4
2
|
import PermissionsService from '../permissions/permissions_service.js';
|
|
5
|
-
import { AclModel } from '../../types.js';
|
|
3
|
+
import { AclModel, MorphInterface, PermissionInterface, RoleInterface } from '../../types.js';
|
|
6
4
|
export declare class RoleHasModelPermissions {
|
|
7
5
|
private role;
|
|
8
6
|
private permissionService;
|
|
9
7
|
private modelService;
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
private map;
|
|
9
|
+
constructor(role: RoleInterface, permissionService: PermissionsService, modelService: ModelService, map: MorphInterface);
|
|
10
|
+
models(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").ModelRoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
|
|
12
11
|
modelsFor(modelType: string): Promise<any>;
|
|
13
12
|
/**
|
|
14
13
|
* todo
|
|
15
14
|
* @param model
|
|
16
15
|
*/
|
|
17
|
-
permissions(): Promise<
|
|
18
|
-
globalPermissions(): Promise<
|
|
19
|
-
onResourcePermissions(): Promise<
|
|
20
|
-
containsPermission(
|
|
16
|
+
permissions(): Promise<import("../../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
|
|
17
|
+
globalPermissions(): Promise<import("../../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
|
|
18
|
+
onResourcePermissions(): Promise<import("../../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
|
|
19
|
+
containsPermission(permission: string | PermissionInterface): Promise<boolean>;
|
|
21
20
|
/**
|
|
22
21
|
*
|
|
23
|
-
* @param
|
|
22
|
+
* @param permissions
|
|
24
23
|
* @returns
|
|
25
24
|
*/
|
|
26
|
-
containsAllPermissions(
|
|
25
|
+
containsAllPermissions(permissions: (string | PermissionInterface)[]): Promise<boolean>;
|
|
27
26
|
/**
|
|
28
27
|
*
|
|
29
|
-
* @param
|
|
28
|
+
* @param permissions
|
|
30
29
|
* @returns
|
|
31
30
|
*/
|
|
32
|
-
containsAnyPermissions(
|
|
33
|
-
hasPermission(
|
|
31
|
+
containsAnyPermissions(permissions: (string | PermissionInterface)[]): Promise<boolean>;
|
|
32
|
+
hasPermission(permission: string | PermissionInterface, target?: AclModel | Function): Promise<boolean>;
|
|
34
33
|
/**
|
|
35
34
|
*
|
|
36
|
-
* @param
|
|
35
|
+
* @param permissions
|
|
37
36
|
* @returns
|
|
38
37
|
*/
|
|
39
|
-
hasAllPermissions(
|
|
38
|
+
hasAllPermissions(permissions: (string | PermissionInterface)[], target?: AclModel | Function): Promise<boolean>;
|
|
40
39
|
/**
|
|
41
40
|
*
|
|
42
|
-
* @param
|
|
41
|
+
* @param permissions
|
|
43
42
|
* @returns
|
|
44
43
|
*/
|
|
45
|
-
hasAnyPermissions(
|
|
44
|
+
hasAnyPermissions(permissions: (string | PermissionInterface)[], target?: AclModel | Function): Promise<boolean>;
|
|
46
45
|
/**
|
|
47
46
|
*
|
|
48
|
-
* @param
|
|
47
|
+
* @param permission
|
|
49
48
|
* @returns
|
|
50
49
|
*/
|
|
51
|
-
can(
|
|
52
|
-
canAll(
|
|
53
|
-
canAny(
|
|
54
|
-
forbidden(
|
|
55
|
-
assign(
|
|
56
|
-
give(
|
|
57
|
-
giveAll(
|
|
58
|
-
assingAll(
|
|
59
|
-
revokePermission(
|
|
60
|
-
revoke(
|
|
61
|
-
revokeAll(
|
|
62
|
-
revokeAllPermissions(
|
|
50
|
+
can(permission: string | PermissionInterface): Promise<boolean>;
|
|
51
|
+
canAll(permissions: (string | PermissionInterface)[]): Promise<boolean>;
|
|
52
|
+
canAny(permissions: (string | PermissionInterface)[]): Promise<boolean>;
|
|
53
|
+
forbidden(permission: string | PermissionInterface, target?: AclModel | Function): Promise<boolean>;
|
|
54
|
+
assign(permission: string, target?: AclModel | Function): Promise<import("@adonisjs/lucid/types/model").LucidRow[]>;
|
|
55
|
+
give(permission: string, target?: AclModel | Function): Promise<import("@adonisjs/lucid/types/model").LucidRow[]>;
|
|
56
|
+
giveAll(permissions: string[], target?: AclModel | Function): Promise<import("@adonisjs/lucid/types/model").LucidRow[]>;
|
|
57
|
+
assingAll(permissions: string[], target?: AclModel | Function): Promise<import("@adonisjs/lucid/types/model").LucidRow[]>;
|
|
58
|
+
revokePermission(permission: string): Promise<any[]>;
|
|
59
|
+
revoke(permission: string): Promise<any[]>;
|
|
60
|
+
revokeAll(permissions: string[], target?: AclModel | Function): Promise<any[]>;
|
|
61
|
+
revokeAllPermissions(permissions: string[]): Promise<any[]>;
|
|
63
62
|
flush(): Promise<any[]>;
|
|
64
|
-
forbid(
|
|
65
|
-
unforbid(
|
|
63
|
+
forbid(permission: string, target?: AclModel | Function): Promise<import("@adonisjs/lucid/types/model").LucidRow[]>;
|
|
64
|
+
unforbid(permission: string, target?: AclModel | Function): Promise<any[]>;
|
|
66
65
|
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { destructTarget
|
|
1
|
+
import { destructTarget } from '../helper.js';
|
|
2
2
|
export class RoleHasModelPermissions {
|
|
3
3
|
role;
|
|
4
4
|
permissionService;
|
|
5
5
|
modelService;
|
|
6
|
-
|
|
6
|
+
map;
|
|
7
|
+
constructor(role, permissionService, modelService, map) {
|
|
7
8
|
this.role = role;
|
|
8
9
|
this.permissionService = permissionService;
|
|
9
10
|
this.modelService = modelService;
|
|
11
|
+
this.map = map;
|
|
10
12
|
}
|
|
11
13
|
models() {
|
|
12
14
|
return this.modelService.all(this.role.getModelId());
|
|
@@ -22,131 +24,115 @@ export class RoleHasModelPermissions {
|
|
|
22
24
|
// permissions related BEGIN
|
|
23
25
|
async permissions() {
|
|
24
26
|
// for roles direct and all permissions are same
|
|
25
|
-
|
|
26
|
-
return this.permissionService.direct(map.getAlias(this.role), this.role.getModelId());
|
|
27
|
+
return this.permissionService.direct(this.map.getAlias(this.role), this.role.getModelId());
|
|
27
28
|
}
|
|
28
29
|
async globalPermissions() {
|
|
29
|
-
|
|
30
|
-
return this.permissionService.directGlobal(map.getAlias(this.role), this.role.getModelId());
|
|
30
|
+
return this.permissionService.directGlobal(this.map.getAlias(this.role), this.role.getModelId());
|
|
31
31
|
}
|
|
32
32
|
async onResourcePermissions() {
|
|
33
|
-
|
|
34
|
-
return this.permissionService.directResource(map.getAlias(this.role), this.role.getModelId());
|
|
33
|
+
return this.permissionService.directResource(this.map.getAlias(this.role), this.role.getModelId());
|
|
35
34
|
}
|
|
36
|
-
async containsPermission(
|
|
37
|
-
const
|
|
38
|
-
const result = await this.permissionService.containsAny(map.getAlias(this.role), this.role.getModelId(), [permisison]);
|
|
35
|
+
async containsPermission(permission) {
|
|
36
|
+
const result = await this.permissionService.containsAny(this.map.getAlias(this.role), this.role.getModelId(), [permission]);
|
|
39
37
|
return result;
|
|
40
38
|
}
|
|
41
39
|
/**
|
|
42
40
|
*
|
|
43
|
-
* @param
|
|
41
|
+
* @param permissions
|
|
44
42
|
* @returns
|
|
45
43
|
*/
|
|
46
|
-
async containsAllPermissions(
|
|
47
|
-
const
|
|
48
|
-
const result = await this.permissionService.containsAll(map.getAlias(this.role), this.role.getModelId(), permisisons);
|
|
44
|
+
async containsAllPermissions(permissions) {
|
|
45
|
+
const result = await this.permissionService.containsAll(this.map.getAlias(this.role), this.role.getModelId(), permissions);
|
|
49
46
|
return result;
|
|
50
47
|
}
|
|
51
48
|
/**
|
|
52
49
|
*
|
|
53
|
-
* @param
|
|
50
|
+
* @param permissions
|
|
54
51
|
* @returns
|
|
55
52
|
*/
|
|
56
|
-
async containsAnyPermissions(
|
|
57
|
-
const
|
|
58
|
-
const result = await this.permissionService.containsAny(map.getAlias(this.role), this.role.getModelId(), permisisons);
|
|
53
|
+
async containsAnyPermissions(permissions) {
|
|
54
|
+
const result = await this.permissionService.containsAny(this.map.getAlias(this.role), this.role.getModelId(), permissions);
|
|
59
55
|
return result;
|
|
60
56
|
}
|
|
61
|
-
async hasPermission(
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
const result = await this.permissionService.hasAny(map.getAlias(this.role), this.role.getModelId(), [permisison], entity.targetClass, entity.targetId);
|
|
57
|
+
async hasPermission(permission, target) {
|
|
58
|
+
const entity = await destructTarget(this.map, target);
|
|
59
|
+
const result = await this.permissionService.hasAny(this.map.getAlias(this.role), this.role.getModelId(), [permission], entity.targetClass, entity.targetId);
|
|
65
60
|
return result;
|
|
66
61
|
}
|
|
67
62
|
/**
|
|
68
63
|
*
|
|
69
|
-
* @param
|
|
64
|
+
* @param permissions
|
|
70
65
|
* @returns
|
|
71
66
|
*/
|
|
72
|
-
async hasAllPermissions(
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
const result = await this.permissionService.hasAll(map.getAlias(this.role), this.role.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
67
|
+
async hasAllPermissions(permissions, target) {
|
|
68
|
+
const entity = await destructTarget(this.map, target);
|
|
69
|
+
const result = await this.permissionService.hasAll(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId);
|
|
76
70
|
return result;
|
|
77
71
|
}
|
|
78
72
|
/**
|
|
79
73
|
*
|
|
80
|
-
* @param
|
|
74
|
+
* @param permissions
|
|
81
75
|
* @returns
|
|
82
76
|
*/
|
|
83
|
-
async hasAnyPermissions(
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
const result = await this.permissionService.hasAny(map.getAlias(this.role), this.role.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
77
|
+
async hasAnyPermissions(permissions, target) {
|
|
78
|
+
const entity = await destructTarget(this.map, target);
|
|
79
|
+
const result = await this.permissionService.hasAny(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId);
|
|
87
80
|
return result;
|
|
88
81
|
}
|
|
89
82
|
/**
|
|
90
83
|
*
|
|
91
|
-
* @param
|
|
84
|
+
* @param permission
|
|
92
85
|
* @returns
|
|
93
86
|
*/
|
|
94
|
-
can(
|
|
95
|
-
return this.hasPermission(
|
|
87
|
+
can(permission) {
|
|
88
|
+
return this.hasPermission(permission);
|
|
96
89
|
}
|
|
97
|
-
canAll(
|
|
98
|
-
return this.hasAllPermissions(
|
|
90
|
+
canAll(permissions) {
|
|
91
|
+
return this.hasAllPermissions(permissions);
|
|
99
92
|
}
|
|
100
|
-
canAny(
|
|
101
|
-
return this.hasAnyPermissions(
|
|
93
|
+
canAny(permissions) {
|
|
94
|
+
return this.hasAnyPermissions(permissions);
|
|
102
95
|
}
|
|
103
|
-
async forbidden(
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
return this.permissionService.forbidden(map.getAlias(this.role), this.role.getModelId(), permisison, entity.targetClass, entity.targetId);
|
|
96
|
+
async forbidden(permission, target) {
|
|
97
|
+
const entity = await destructTarget(this.map, target);
|
|
98
|
+
return this.permissionService.forbidden(this.map.getAlias(this.role), this.role.getModelId(), permission, entity.targetClass, entity.targetId);
|
|
107
99
|
}
|
|
108
|
-
assign(
|
|
109
|
-
return this.give(
|
|
100
|
+
assign(permission, target) {
|
|
101
|
+
return this.give(permission, target);
|
|
110
102
|
}
|
|
111
|
-
async give(
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
return this.permissionService.giveAll(map.getAlias(this.role), this.role.getModelId(), [permisison], entity.targetClass, entity.targetId, true);
|
|
103
|
+
async give(permission, target) {
|
|
104
|
+
const entity = await destructTarget(this.map, target);
|
|
105
|
+
return this.permissionService.giveAll(this.map.getAlias(this.role), this.role.getModelId(), [permission], entity.targetClass, entity.targetId, true);
|
|
115
106
|
}
|
|
116
|
-
async giveAll(
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
return this.permissionService.giveAll(map.getAlias(this.role), this.role.getModelId(), permisisons, entity.targetClass, entity.targetId, true);
|
|
107
|
+
async giveAll(permissions, target) {
|
|
108
|
+
const entity = await destructTarget(this.map, target);
|
|
109
|
+
return this.permissionService.giveAll(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId, true);
|
|
120
110
|
}
|
|
121
|
-
assingAll(
|
|
122
|
-
return this.giveAll(
|
|
111
|
+
assingAll(permissions, target) {
|
|
112
|
+
return this.giveAll(permissions, target);
|
|
123
113
|
}
|
|
124
|
-
async revokePermission(
|
|
125
|
-
return this.revoke(
|
|
114
|
+
async revokePermission(permission) {
|
|
115
|
+
return this.revoke(permission);
|
|
126
116
|
}
|
|
127
|
-
async revoke(
|
|
128
|
-
return this.revokeAll([
|
|
117
|
+
async revoke(permission) {
|
|
118
|
+
return this.revokeAll([permission]);
|
|
129
119
|
}
|
|
130
|
-
async revokeAll(
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
return this.permissionService.revokeAll(map.getAlias(this.role), this.role.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
120
|
+
async revokeAll(permissions, target) {
|
|
121
|
+
const entity = await destructTarget(this.map, target);
|
|
122
|
+
return this.permissionService.revokeAll(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId);
|
|
134
123
|
}
|
|
135
|
-
async revokeAllPermissions(
|
|
136
|
-
return this.revokeAll(
|
|
124
|
+
async revokeAllPermissions(permissions) {
|
|
125
|
+
return this.revokeAll(permissions);
|
|
137
126
|
}
|
|
138
127
|
async flush() {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const map = await morphMap();
|
|
149
|
-
const entity = await destructTarget(target);
|
|
150
|
-
return this.permissionService.unforbidAll(map.getAlias(this.role), this.role.getModelId(), [permisison], entity.targetClass, entity.targetId);
|
|
128
|
+
return this.permissionService.flush(this.map.getAlias(this.role), this.role.getModelId());
|
|
129
|
+
}
|
|
130
|
+
async forbid(permission, target) {
|
|
131
|
+
const entity = await destructTarget(this.map, target);
|
|
132
|
+
return this.permissionService.forbid(this.map.getAlias(this.role), this.role.getModelId(), permission, entity.targetClass, entity.targetId);
|
|
133
|
+
}
|
|
134
|
+
async unforbid(permission, target) {
|
|
135
|
+
const entity = await destructTarget(this.map, target);
|
|
136
|
+
return this.permissionService.unforbidAll(this.map.getAlias(this.role), this.role.getModelId(), [permission], entity.targetClass, entity.targetId);
|
|
151
137
|
}
|
|
152
138
|
}
|
|
@@ -1,16 +1,27 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { AclModel } from '../../types.js';
|
|
1
|
+
import { AclModel, MorphInterface, RoleInterface } from '../../types.js';
|
|
3
2
|
import BaseService from '../base_service.js';
|
|
3
|
+
import { BaseModel } from '@adonisjs/lucid/orm';
|
|
4
4
|
export default class RolesService extends BaseService {
|
|
5
|
+
private roleClassName;
|
|
6
|
+
private modelPermissionClassName;
|
|
7
|
+
private modelRoleClassName;
|
|
8
|
+
private map;
|
|
9
|
+
private roleQuery;
|
|
10
|
+
private readonly roleTable;
|
|
11
|
+
private readonly modelPermissionTable;
|
|
12
|
+
private modelRoleQuery;
|
|
13
|
+
private readonly modelRoleTable;
|
|
14
|
+
constructor(roleClassName: typeof BaseModel, modelPermissionClassName: typeof BaseModel, modelRoleClassName: typeof BaseModel, map: MorphInterface);
|
|
5
15
|
private modelRolesQuery;
|
|
6
|
-
all(modelType: string, modelId: number): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<
|
|
7
|
-
has(modelType: string, modelId: number, role: string |
|
|
8
|
-
hasAll(modelType: string, modelId: number, roles: (string |
|
|
9
|
-
hasAny(modelType: string, modelId: number, roles: (string |
|
|
10
|
-
assign(role: string |
|
|
16
|
+
all(modelType: string, modelId: number): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
|
|
17
|
+
has(modelType: string, modelId: number, role: string | RoleInterface): Promise<boolean>;
|
|
18
|
+
hasAll(modelType: string, modelId: number, roles: (string | RoleInterface)[]): Promise<boolean>;
|
|
19
|
+
hasAny(modelType: string, modelId: number, roles: (string | RoleInterface)[]): Promise<boolean>;
|
|
20
|
+
assign(role: string | RoleInterface, modelType: string, modelId: number): Promise<boolean>;
|
|
21
|
+
assignAll(roles: (string | RoleInterface)[], modelType: string, modelId: number): Promise<boolean>;
|
|
11
22
|
revoke(role: string | number, model: AclModel): Promise<boolean>;
|
|
12
23
|
revokeAll(roles: (string | number)[], model: AclModel): Promise<boolean>;
|
|
13
24
|
private extractRoleModel;
|
|
14
|
-
roleModelPermissionQuery(modelType: string): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<
|
|
15
|
-
flush(modelType: string, modelId: number):
|
|
25
|
+
roleModelPermissionQuery(modelType: string): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
|
|
26
|
+
flush(modelType: string, modelId: number): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, any>;
|
|
16
27
|
}
|
|
@@ -1,33 +1,65 @@
|
|
|
1
|
-
import Role from '../../models/role.js';
|
|
2
|
-
import ModelRole from '../../models/model_role.js';
|
|
3
1
|
import BaseService from '../base_service.js';
|
|
4
|
-
import
|
|
5
|
-
|
|
2
|
+
import {
|
|
3
|
+
// getModelPermissionModelQuery,
|
|
4
|
+
getModelRoleModelQuery,
|
|
5
|
+
// getPermissionModelQuery,
|
|
6
|
+
getRoleModelQuery, } from '../query_helper.js';
|
|
6
7
|
export default class RolesService extends BaseService {
|
|
8
|
+
roleClassName;
|
|
9
|
+
modelPermissionClassName;
|
|
10
|
+
modelRoleClassName;
|
|
11
|
+
map;
|
|
12
|
+
// private permissionQuery
|
|
13
|
+
// private readonly permissionTable
|
|
14
|
+
roleQuery;
|
|
15
|
+
roleTable;
|
|
16
|
+
// private modelPermissionQuery
|
|
17
|
+
modelPermissionTable;
|
|
18
|
+
modelRoleQuery;
|
|
19
|
+
modelRoleTable;
|
|
20
|
+
constructor(roleClassName,
|
|
21
|
+
// private permissionClassName: typeof BaseModel,
|
|
22
|
+
modelPermissionClassName, modelRoleClassName, map) {
|
|
23
|
+
super();
|
|
24
|
+
this.roleClassName = roleClassName;
|
|
25
|
+
this.modelPermissionClassName = modelPermissionClassName;
|
|
26
|
+
this.modelRoleClassName = modelRoleClassName;
|
|
27
|
+
this.map = map;
|
|
28
|
+
// this.permissionQuery = getPermissionModelQuery(this.permissionClassName)
|
|
29
|
+
// this.permissionTable = this.permissionClassName.table
|
|
30
|
+
this.roleQuery = getRoleModelQuery(this.roleClassName);
|
|
31
|
+
this.roleTable = this.roleClassName.table;
|
|
32
|
+
// this.modelPermissionQuery = getModelPermissionModelQuery(this.modelPermissionClassName)
|
|
33
|
+
this.modelPermissionTable = this.modelPermissionClassName.table;
|
|
34
|
+
this.modelRoleQuery = getModelRoleModelQuery(this.modelRoleClassName);
|
|
35
|
+
this.modelRoleTable = this.modelRoleClassName.table;
|
|
36
|
+
}
|
|
7
37
|
modelRolesQuery(modelType, modelId) {
|
|
8
|
-
return
|
|
9
|
-
.
|
|
38
|
+
return this.roleQuery
|
|
39
|
+
.leftJoin(this.modelRoleTable + ' as mr', 'mr.role_id', '=', this.roleTable + '.id')
|
|
10
40
|
.where('mr.model_type', modelType)
|
|
11
41
|
.where('mr.model_id', modelId);
|
|
12
42
|
}
|
|
13
43
|
all(modelType, modelId) {
|
|
14
|
-
return this.modelRolesQuery(modelType, modelId)
|
|
44
|
+
return this.modelRolesQuery(modelType, modelId)
|
|
45
|
+
.distinct(this.roleTable + '.id')
|
|
46
|
+
.select(this.roleTable + '.*');
|
|
15
47
|
}
|
|
16
|
-
|
|
48
|
+
has(modelType, modelId, role) {
|
|
17
49
|
return this.hasAll(modelType, modelId, [role]);
|
|
18
50
|
}
|
|
19
51
|
async hasAll(modelType, modelId, roles) {
|
|
20
52
|
const rolesQuery = this.modelRolesQuery(modelType, modelId);
|
|
21
53
|
let { slugs, ids } = this.formatList(roles);
|
|
22
54
|
if (slugs.length) {
|
|
23
|
-
rolesQuery.whereIn(
|
|
55
|
+
rolesQuery.whereIn(this.roleTable + '.slug', slugs);
|
|
24
56
|
}
|
|
25
57
|
if (ids.length) {
|
|
26
|
-
rolesQuery.whereIn(
|
|
58
|
+
rolesQuery.whereIn(this.roleTable + '.id', ids);
|
|
27
59
|
}
|
|
28
60
|
const r = await rolesQuery.count('* as total');
|
|
29
61
|
// @ts-ignore
|
|
30
|
-
return r[0].total === roles.length;
|
|
62
|
+
return +r[0].$extras.total === roles.length;
|
|
31
63
|
}
|
|
32
64
|
async hasAny(modelType, modelId, roles) {
|
|
33
65
|
// if is string then we are going to check against slug
|
|
@@ -35,36 +67,52 @@ export default class RolesService extends BaseService {
|
|
|
35
67
|
const rolesQuery = this.modelRolesQuery(modelType, modelId);
|
|
36
68
|
let { slugs, ids } = this.formatList(roles);
|
|
37
69
|
if (slugs.length) {
|
|
38
|
-
rolesQuery.whereIn(
|
|
70
|
+
rolesQuery.whereIn(this.roleTable + '.slug', slugs);
|
|
39
71
|
}
|
|
40
72
|
if (ids.length) {
|
|
41
|
-
rolesQuery.whereIn(
|
|
73
|
+
rolesQuery.whereIn(this.roleTable + '.id', ids);
|
|
42
74
|
}
|
|
43
75
|
const r = await rolesQuery.count('* as total');
|
|
44
76
|
// @ts-ignore
|
|
45
|
-
return r[0].total > 0;
|
|
77
|
+
return +r[0].$extras.total > 0;
|
|
78
|
+
}
|
|
79
|
+
assign(role, modelType, modelId) {
|
|
80
|
+
return this.assignAll([role], modelType, modelId);
|
|
46
81
|
}
|
|
47
|
-
async
|
|
48
|
-
const
|
|
49
|
-
if (!
|
|
50
|
-
throw new Error('
|
|
82
|
+
async assignAll(roles, modelType, modelId) {
|
|
83
|
+
const rs = await this.extractRoleModel(roles);
|
|
84
|
+
if (!rs.length) {
|
|
85
|
+
throw new Error('One or many roles not found');
|
|
51
86
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
87
|
+
let roleIds = rs.map((role) => role.id);
|
|
88
|
+
const modelRoles = await this.modelRoleQuery
|
|
89
|
+
.whereIn('role_id', roleIds)
|
|
90
|
+
.where('model_type', modelType)
|
|
91
|
+
.where('model_id', modelId)
|
|
92
|
+
.select('id');
|
|
93
|
+
const modelRoleIds = modelRoles.map((modelRole) => modelRole.id);
|
|
94
|
+
roleIds = roleIds.filter((roleId) => {
|
|
95
|
+
return !modelRoleIds.includes(roleId);
|
|
56
96
|
});
|
|
97
|
+
const data = [];
|
|
98
|
+
for (const id of roleIds) {
|
|
99
|
+
data.push({
|
|
100
|
+
modelType,
|
|
101
|
+
modelId,
|
|
102
|
+
roleId: id,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
await this.modelRoleClassName.createMany(data);
|
|
57
106
|
return true;
|
|
58
107
|
}
|
|
59
108
|
async revoke(role, model) {
|
|
60
109
|
return this.revokeAll([role], model);
|
|
61
110
|
}
|
|
62
111
|
async revokeAll(roles, model) {
|
|
63
|
-
const map = await morphMap();
|
|
64
112
|
const { slugs, ids } = this.formatListStringNumbers(roles);
|
|
65
|
-
await
|
|
66
|
-
.leftJoin(
|
|
67
|
-
.where('model_type', map.getAlias(model))
|
|
113
|
+
await this.modelRoleQuery
|
|
114
|
+
.leftJoin(this.roleTable + ' as r', 'r.id', '=', this.modelRoleTable + '.role_id')
|
|
115
|
+
.where('model_type', this.map.getAlias(model))
|
|
68
116
|
.where('model_id', model.getModelId())
|
|
69
117
|
.where((query) => {
|
|
70
118
|
query.whereIn('r.id', ids).orWhereIn('r.slug', slugs);
|
|
@@ -72,18 +120,26 @@ export default class RolesService extends BaseService {
|
|
|
72
120
|
.delete();
|
|
73
121
|
return true;
|
|
74
122
|
}
|
|
75
|
-
async extractRoleModel(
|
|
76
|
-
|
|
77
|
-
|
|
123
|
+
async extractRoleModel(roles) {
|
|
124
|
+
const slugs = [];
|
|
125
|
+
const oldRoles = [];
|
|
126
|
+
for (const role of roles) {
|
|
127
|
+
if (typeof role === 'string') {
|
|
128
|
+
slugs.push(role);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
oldRoles.push(role);
|
|
132
|
+
}
|
|
78
133
|
}
|
|
79
|
-
|
|
134
|
+
const newRoles = await this.roleQuery.whereIn('slug', slugs);
|
|
135
|
+
return [...newRoles, ...oldRoles];
|
|
80
136
|
}
|
|
81
137
|
roleModelPermissionQuery(modelType) {
|
|
82
|
-
return
|
|
83
|
-
.leftJoin(
|
|
138
|
+
return this.roleQuery
|
|
139
|
+
.leftJoin(this.modelPermissionTable + ' as mp', 'mp.model_id', '=', this.roleTable + '.id')
|
|
84
140
|
.where('mp.model_type', modelType);
|
|
85
141
|
}
|
|
86
|
-
|
|
87
|
-
|
|
142
|
+
flush(modelType, modelId) {
|
|
143
|
+
return this.modelRoleQuery.where('model_type', modelType).where('model_id', modelId).delete();
|
|
88
144
|
}
|
|
89
145
|
}
|
package/build/src/types.d.ts
CHANGED
|
@@ -1,21 +1,81 @@
|
|
|
1
1
|
import { LucidModel } from '@adonisjs/lucid/types/model';
|
|
2
|
-
|
|
3
|
-
tables: Object;
|
|
4
|
-
}
|
|
2
|
+
import { DateTime } from 'luxon';
|
|
5
3
|
export interface AclModelInterface {
|
|
6
4
|
getModelId(): number;
|
|
7
5
|
}
|
|
8
|
-
export
|
|
6
|
+
export interface PermissionInterface extends AclModelInterface {
|
|
7
|
+
id: number;
|
|
8
|
+
slug: string;
|
|
9
|
+
title: string | null;
|
|
10
|
+
entityType: string;
|
|
11
|
+
entityId: number | null;
|
|
12
|
+
allowed: boolean;
|
|
13
|
+
scope: number;
|
|
14
|
+
createdAt: DateTime;
|
|
15
|
+
updatedAt: DateTime;
|
|
16
|
+
}
|
|
17
|
+
export interface RoleInterface extends AclModelInterface {
|
|
18
|
+
id: number;
|
|
19
|
+
slug: string;
|
|
20
|
+
title: string | null;
|
|
21
|
+
entityType: string;
|
|
22
|
+
entityId: number | null;
|
|
23
|
+
scope: number;
|
|
24
|
+
allowed: boolean;
|
|
25
|
+
createdAt: DateTime;
|
|
26
|
+
updatedAt: DateTime;
|
|
27
|
+
}
|
|
28
|
+
export interface ModelRoleInterface extends AclModelInterface {
|
|
29
|
+
id: number;
|
|
30
|
+
roleId: number;
|
|
31
|
+
modelType: string;
|
|
32
|
+
modelId: number | null;
|
|
33
|
+
createdAt: DateTime;
|
|
34
|
+
updatedAt: DateTime;
|
|
35
|
+
}
|
|
36
|
+
export interface ModelPermissionInterface extends AclModelInterface {
|
|
37
|
+
id: number;
|
|
38
|
+
permissionId: number;
|
|
39
|
+
modelType: string;
|
|
40
|
+
modelId: number;
|
|
41
|
+
createdAt: DateTime;
|
|
42
|
+
updatedAt: DateTime;
|
|
43
|
+
}
|
|
44
|
+
export type AclModel = InstanceType<LucidModel> & AclModelInterface;
|
|
45
|
+
export type PermissionModel<T extends new (...args: any[]) => any> = InstanceType<T> & PermissionInterface;
|
|
46
|
+
export type RoleModel<T extends new (...args: any[]) => any> = InstanceType<T> & RoleInterface;
|
|
47
|
+
export type ModelPermissionModel<T extends new (...args: any[]) => any> = InstanceType<T> & ModelPermissionInterface;
|
|
48
|
+
export type ModelRoleModel<T extends new (...args: any[]) => any> = InstanceType<T> & ModelRoleInterface;
|
|
9
49
|
export interface AclModelQuery {
|
|
10
50
|
modelType: string;
|
|
11
51
|
modelId: number;
|
|
12
52
|
}
|
|
53
|
+
type Entity = {
|
|
54
|
+
type: string | null;
|
|
55
|
+
id: number | null;
|
|
56
|
+
};
|
|
13
57
|
export interface ModelPermissionsQuery extends AclModelQuery {
|
|
14
58
|
permissionSlugs: string[];
|
|
15
59
|
permissionIds: number[];
|
|
16
60
|
directPermissions: boolean;
|
|
17
|
-
|
|
61
|
+
includeForbiddings: boolean;
|
|
62
|
+
entity: Entity;
|
|
18
63
|
}
|
|
19
64
|
export interface MorphMapInterface {
|
|
20
65
|
[key: string]: any;
|
|
21
66
|
}
|
|
67
|
+
export interface MorphInterface {
|
|
68
|
+
set(alias: string, target: any): void;
|
|
69
|
+
get(alias: string): any;
|
|
70
|
+
has(alias: string): boolean;
|
|
71
|
+
hasTarget(target: any): boolean;
|
|
72
|
+
getAlias(target: any): string;
|
|
73
|
+
}
|
|
74
|
+
export interface ModelManagerInterface {
|
|
75
|
+
[key: string]: LucidModel;
|
|
76
|
+
}
|
|
77
|
+
export interface Permissions {
|
|
78
|
+
tables: Object;
|
|
79
|
+
morphMaps: Object;
|
|
80
|
+
}
|
|
81
|
+
export {};
|