@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.
Files changed (46) hide show
  1. package/README.md +160 -59
  2. package/build/index.d.ts +10 -4
  3. package/build/index.js +10 -5
  4. package/build/providers/role_permission_provider.d.ts +3 -0
  5. package/build/providers/role_permission_provider.js +21 -0
  6. package/build/src/acl.d.ts +10 -5
  7. package/build/src/acl.js +17 -9
  8. package/build/src/decorators.js +1 -0
  9. package/build/src/mixins/has_permissions.d.ts +58 -26
  10. package/build/src/mixins/has_permissions.js +123 -18
  11. package/build/src/model_manager.d.ts +7 -0
  12. package/build/src/model_manager.js +15 -0
  13. package/build/src/models/permission.d.ts +4 -4
  14. package/build/src/models/permission.js +2 -7
  15. package/build/src/models/role.d.ts +1 -1
  16. package/build/src/models/role.js +2 -7
  17. package/build/src/morph_map.d.ts +5 -2
  18. package/build/src/morph_map.js +16 -9
  19. package/build/src/services/helper.d.ts +2 -3
  20. package/build/src/services/helper.js +1 -7
  21. package/build/src/services/model_has_role_permissions.d.ts +41 -39
  22. package/build/src/services/model_has_role_permissions.js +92 -111
  23. package/build/src/services/model_service.d.ts +15 -6
  24. package/build/src/services/model_service.js +39 -14
  25. package/build/src/services/permissions/empty_permission.d.ts +8 -0
  26. package/build/src/services/permissions/empty_permission.js +17 -0
  27. package/build/src/services/permissions/permission_has_model_roles.d.ts +12 -8
  28. package/build/src/services/permissions/permission_has_model_roles.js +28 -19
  29. package/build/src/services/permissions/permissions_service.d.ts +42 -30
  30. package/build/src/services/permissions/permissions_service.js +198 -155
  31. package/build/src/services/query_helper.d.ts +7 -0
  32. package/build/src/services/query_helper.js +12 -0
  33. package/build/src/services/roles/empty_roles.d.ts +8 -0
  34. package/build/src/services/roles/empty_roles.js +17 -0
  35. package/build/src/services/roles/role_has_model_permissions.d.ts +32 -33
  36. package/build/src/services/roles/role_has_model_permissions.js +64 -78
  37. package/build/src/services/roles/roles_service.d.ts +20 -9
  38. package/build/src/services/roles/roles_service.js +90 -34
  39. package/build/src/types.d.ts +65 -5
  40. package/build/stubs/configs/permissions.stub +1 -1
  41. package/build/stubs/migrations/create_db.stub +8 -8
  42. package/package.json +3 -1
  43. package/build/src/mixins/has_role_permissions.d.ts +0 -128
  44. package/build/src/mixins/has_role_permissions.js +0 -10
  45. package/build/src/mixins/has_roles.d.ts +0 -1
  46. 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
- constructor(role: Role, permissionService: PermissionsService, modelService: ModelService);
11
- models(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof import("../../models/model_role.js").default, import("../../models/model_role.js").default>;
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<Permission[]>;
18
- globalPermissions(): Promise<Permission[]>;
19
- onResourcePermissions(): Promise<Permission[]>;
20
- containsPermission(permisison: string | Permission): Promise<boolean>;
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 permisisons
22
+ * @param permissions
24
23
  * @returns
25
24
  */
26
- containsAllPermissions(permisisons: (string | Permission)[]): Promise<boolean>;
25
+ containsAllPermissions(permissions: (string | PermissionInterface)[]): Promise<boolean>;
27
26
  /**
28
27
  *
29
- * @param permisisons
28
+ * @param permissions
30
29
  * @returns
31
30
  */
32
- containsAnyPermissions(permisisons: (string | Permission)[]): Promise<boolean>;
33
- hasPermission(permisison: string | Permission, target?: AclModel | Function): Promise<boolean>;
31
+ containsAnyPermissions(permissions: (string | PermissionInterface)[]): Promise<boolean>;
32
+ hasPermission(permission: string | PermissionInterface, target?: AclModel | Function): Promise<boolean>;
34
33
  /**
35
34
  *
36
- * @param permisisons
35
+ * @param permissions
37
36
  * @returns
38
37
  */
39
- hasAllPermissions(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
38
+ hasAllPermissions(permissions: (string | PermissionInterface)[], target?: AclModel | Function): Promise<boolean>;
40
39
  /**
41
40
  *
42
- * @param permisisons
41
+ * @param permissions
43
42
  * @returns
44
43
  */
45
- hasAnyPermissions(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
44
+ hasAnyPermissions(permissions: (string | PermissionInterface)[], target?: AclModel | Function): Promise<boolean>;
46
45
  /**
47
46
  *
48
- * @param permisison
47
+ * @param permission
49
48
  * @returns
50
49
  */
51
- can(permisison: string | Permission): Promise<boolean>;
52
- canAll(permisisons: (string | Permission)[]): Promise<boolean>;
53
- canAny(permisisons: (string | Permission)[]): Promise<boolean>;
54
- forbidden(permisison: string | Permission, target?: AclModel | Function): Promise<boolean>;
55
- assign(permisison: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
56
- give(permisison: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
57
- giveAll(permisisons: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
58
- assingAll(permisisons: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
59
- revokePermission(permisison: string): Promise<import("../../models/model_permission.js").default[]>;
60
- revoke(permisison: string): Promise<import("../../models/model_permission.js").default[]>;
61
- revokeAll(permisisons: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
62
- revokeAllPermissions(permisisons: string[]): Promise<import("../../models/model_permission.js").default[]>;
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(permisison: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
65
- unforbid(permisison: string, target?: AclModel | Function): Promise<any[]>;
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, morphMap } from '../helper.js';
1
+ import { destructTarget } from '../helper.js';
2
2
  export class RoleHasModelPermissions {
3
3
  role;
4
4
  permissionService;
5
5
  modelService;
6
- constructor(role, permissionService, modelService) {
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
- const map = await morphMap();
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
- const map = await morphMap();
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
- const map = await morphMap();
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(permisison) {
37
- const map = await morphMap();
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 permisisons
41
+ * @param permissions
44
42
  * @returns
45
43
  */
46
- async containsAllPermissions(permisisons) {
47
- const map = await morphMap();
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 permisisons
50
+ * @param permissions
54
51
  * @returns
55
52
  */
56
- async containsAnyPermissions(permisisons) {
57
- const map = await morphMap();
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(permisison, target) {
62
- const map = await morphMap();
63
- const entity = await destructTarget(target);
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 permisisons
64
+ * @param permissions
70
65
  * @returns
71
66
  */
72
- async hasAllPermissions(permisisons, target) {
73
- const map = await morphMap();
74
- const entity = await destructTarget(target);
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 permisisons
74
+ * @param permissions
81
75
  * @returns
82
76
  */
83
- async hasAnyPermissions(permisisons, target) {
84
- const map = await morphMap();
85
- const entity = await destructTarget(target);
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 permisison
84
+ * @param permission
92
85
  * @returns
93
86
  */
94
- can(permisison) {
95
- return this.hasPermission(permisison);
87
+ can(permission) {
88
+ return this.hasPermission(permission);
96
89
  }
97
- canAll(permisisons) {
98
- return this.hasAllPermissions(permisisons);
90
+ canAll(permissions) {
91
+ return this.hasAllPermissions(permissions);
99
92
  }
100
- canAny(permisisons) {
101
- return this.hasAnyPermissions(permisisons);
93
+ canAny(permissions) {
94
+ return this.hasAnyPermissions(permissions);
102
95
  }
103
- async forbidden(permisison, target) {
104
- const map = await morphMap();
105
- const entity = await destructTarget(target);
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(permisison, target) {
109
- return this.give(permisison, target);
100
+ assign(permission, target) {
101
+ return this.give(permission, target);
110
102
  }
111
- async give(permisison, target) {
112
- const map = await morphMap();
113
- const entity = await destructTarget(target);
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(permisisons, target) {
117
- const map = await morphMap();
118
- const entity = await destructTarget(target);
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(permisisons, target) {
122
- return this.giveAll(permisisons, target);
111
+ assingAll(permissions, target) {
112
+ return this.giveAll(permissions, target);
123
113
  }
124
- async revokePermission(permisison) {
125
- return this.revoke(permisison);
114
+ async revokePermission(permission) {
115
+ return this.revoke(permission);
126
116
  }
127
- async revoke(permisison) {
128
- return this.revokeAll([permisison]);
117
+ async revoke(permission) {
118
+ return this.revokeAll([permission]);
129
119
  }
130
- async revokeAll(permisisons, target) {
131
- const map = await morphMap();
132
- const entity = await destructTarget(target);
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(permisisons) {
136
- return this.revokeAll(permisisons);
124
+ async revokeAllPermissions(permissions) {
125
+ return this.revokeAll(permissions);
137
126
  }
138
127
  async flush() {
139
- const map = await morphMap();
140
- return this.permissionService.flush(map.getAlias(this.role), this.role.getModelId());
141
- }
142
- async forbid(permisison, target) {
143
- const map = await morphMap();
144
- const entity = await destructTarget(target);
145
- return this.permissionService.forbid(map.getAlias(this.role), this.role.getModelId(), permisison, entity.targetClass, entity.targetId);
146
- }
147
- async unforbid(permisison, target) {
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 Role from '../../models/role.js';
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<typeof Role, Role>;
7
- has(modelType: string, modelId: number, role: string | Role): Promise<boolean>;
8
- hasAll(modelType: string, modelId: number, roles: (string | Role)[]): Promise<boolean>;
9
- hasAny(modelType: string, modelId: number, roles: (string | Role)[]): Promise<boolean>;
10
- assign(role: string | Role, modelType: string, modelId: number): Promise<boolean>;
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<typeof Role, Role>;
15
- flush(modelType: string, modelId: number): Promise<void>;
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 ModelPermission from '../../models/model_permission.js';
5
- import { morphMap } from '../helper.js';
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 Role.query()
9
- .join(ModelRole.table + ' as mr', 'mr.role_id', '=', Role.table + '.id')
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).select(Role.table + '.*');
44
+ return this.modelRolesQuery(modelType, modelId)
45
+ .distinct(this.roleTable + '.id')
46
+ .select(this.roleTable + '.*');
15
47
  }
16
- async has(modelType, modelId, role) {
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(Role.table + '.slug', slugs);
55
+ rolesQuery.whereIn(this.roleTable + '.slug', slugs);
24
56
  }
25
57
  if (ids.length) {
26
- rolesQuery.whereIn(Role.table + '.id', ids);
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(Role.table + '.slug', slugs);
70
+ rolesQuery.whereIn(this.roleTable + '.slug', slugs);
39
71
  }
40
72
  if (ids.length) {
41
- rolesQuery.whereIn(Role.table + '.id', ids);
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 assign(role, modelType, modelId) {
48
- const r = await this.extractRoleModel(role);
49
- if (!r) {
50
- throw new Error('Role not found');
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
- await ModelRole.create({
53
- modelType,
54
- modelId,
55
- roleId: r.id,
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 ModelRole.query()
66
- .leftJoin(Role.table + ' as r', 'r.id', '=', ModelRole.table + '.role_id')
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(role) {
76
- if (typeof role === 'string') {
77
- return await Role.query().where('slug', role).first();
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
- return role;
134
+ const newRoles = await this.roleQuery.whereIn('slug', slugs);
135
+ return [...newRoles, ...oldRoles];
80
136
  }
81
137
  roleModelPermissionQuery(modelType) {
82
- return Role.query()
83
- .leftJoin(ModelPermission.table + ' as mp', 'mp.model_id', '=', Role.table + '.id')
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
- async flush(modelType, modelId) {
87
- ModelRole.query().where('model_type', modelType).where('model_id', modelId).delete();
142
+ flush(modelType, modelId) {
143
+ return this.modelRoleQuery.where('model_type', modelType).where('model_id', modelId).delete();
88
144
  }
89
145
  }
@@ -1,21 +1,81 @@
1
1
  import { LucidModel } from '@adonisjs/lucid/types/model';
2
- export interface Permissions {
3
- tables: Object;
4
- }
2
+ import { DateTime } from 'luxon';
5
3
  export interface AclModelInterface {
6
4
  getModelId(): number;
7
5
  }
8
- export type AclModel = LucidModel & AclModelInterface;
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
- includeForbiddens: boolean;
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 {};
@@ -16,5 +16,5 @@ export const permissionsConfig: Permissions = {
16
16
  morphMaps: {
17
17
  roles: 'roles',
18
18
  permissions: 'permissions',
19
- }
19
+ },
20
20
  }