@holoyan/adonisjs-permissions 0.7.15 → 0.8.17

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 (29) hide show
  1. package/README.md +19 -0
  2. package/build/src/acl.d.ts +15 -5
  3. package/build/src/acl.js +40 -29
  4. package/build/src/scope.d.ts +1 -1
  5. package/build/src/scope.js +1 -1
  6. package/build/src/services/base_adapter.d.ts +13 -0
  7. package/build/src/services/base_adapter.js +24 -0
  8. package/build/src/services/base_service.d.ts +5 -0
  9. package/build/src/services/base_service.js +10 -0
  10. package/build/src/services/model_has_role_permissions.d.ts +15 -10
  11. package/build/src/services/model_has_role_permissions.js +46 -40
  12. package/build/src/services/model_service.d.ts +3 -2
  13. package/build/src/services/model_service.js +6 -15
  14. package/build/src/services/permissions/empty_permission.d.ts +9 -7
  15. package/build/src/services/permissions/empty_permission.js +12 -13
  16. package/build/src/services/permissions/permission_has_model_roles.d.ts +16 -13
  17. package/build/src/services/permissions/permission_has_model_roles.js +24 -14
  18. package/build/src/services/permissions/permissions_service.d.ts +9 -9
  19. package/build/src/services/permissions/permissions_service.js +13 -20
  20. package/build/src/services/query_helper.d.ts +5 -5
  21. package/build/src/services/query_helper.js +8 -8
  22. package/build/src/services/roles/empty_roles.d.ts +9 -7
  23. package/build/src/services/roles/empty_roles.js +12 -13
  24. package/build/src/services/roles/role_has_model_permissions.d.ts +11 -10
  25. package/build/src/services/roles/role_has_model_permissions.js +19 -16
  26. package/build/src/services/roles/roles_service.d.ts +9 -10
  27. package/build/src/services/roles/roles_service.js +15 -23
  28. package/build/src/types.d.ts +4 -1
  29. package/package.json +1 -1
package/README.md CHANGED
@@ -41,6 +41,7 @@
41
41
  - [Scopes or Multi-tenancy](#scopes-or-multi-tenancy)
42
42
  - [The Scope middleware](#the-scope-middleware)
43
43
  - [Default Scope](#default-scope-tenant)
44
+ - [Transactions](#transactions)
44
45
  - [Cheat sheet](#cheat-sheet)
45
46
  - [Todo](#todo)
46
47
  - [Test](#test)
@@ -964,6 +965,24 @@ Acl.scope('scope_2', forceUpdate) // will override request 1 scope
964
965
 
965
966
  > Default Scope value is equal to 'default'
966
967
 
968
+ ### Transactions
969
+
970
+ In case you want to use `Acl` inside the transaction then you can pass `options` directly to query method.
971
+
972
+ ```typescript
973
+
974
+ import {Acl} from '@holoyan/adonisjs-permissions'
975
+
976
+ const trx = await db.transaction()
977
+
978
+ await Acl.model(user).withQueryOptions({ client: trx }).allow('delete')
979
+
980
+ // you other code
981
+
982
+ await trx.commit()
983
+
984
+ ```
985
+
967
986
 
968
987
  ## Cheat sheet
969
988
 
@@ -1,6 +1,6 @@
1
1
  import { RoleHasModelPermissions } from './services/roles/role_has_model_permissions.js';
2
2
  import { ModelHasRolePermissions } from './services/model_has_role_permissions.js';
3
- import { AclModel, MorphInterface, PermissionInterface, RoleInterface, ScopeInterface } from './types.js';
3
+ import { AclModel, MorphInterface, OptionsInterface, PermissionInterface, RoleInterface, ScopeInterface } from './types.js';
4
4
  import ModelManager from './model_manager.js';
5
5
  import EmptyPermission from './services/permissions/empty_permission.js';
6
6
  import EmptyRoles from './services/roles/empty_roles.js';
@@ -9,16 +9,26 @@ export declare class AclManager {
9
9
  private static map;
10
10
  static setModelManager(manager: ModelManager): void;
11
11
  static setMorphMap(map: MorphInterface): void;
12
- private _scope?;
13
- private allowScopeRewriting;
14
- constructor(allowScopeRewriting?: boolean);
12
+ private allowOptionsRewriting;
13
+ private options;
14
+ constructor(allowOptionsRewriting: boolean, defaultOptions?: OptionsInterface);
15
15
  model(model: AclModel): ModelHasRolePermissions;
16
16
  role(): EmptyRoles;
17
17
  role(role: RoleInterface): RoleHasModelPermissions;
18
18
  permission(): EmptyPermission;
19
19
  permission(permission: PermissionInterface): EmptyPermission;
20
20
  private createNewScope;
21
+ /**
22
+ * changing global options
23
+ * @param options
24
+ * @param forceUpdate
25
+ */
26
+ withOptions(options: OptionsInterface, forceUpdate?: boolean): this;
27
+ /**
28
+ * @param scope
29
+ * @param forceUpdate
30
+ */
21
31
  scope(scope: ScopeInterface, forceUpdate?: boolean): this;
22
- getScope(): ScopeInterface;
32
+ getScope(): any;
23
33
  }
24
34
  export declare const Acl: AclManager;
package/build/src/acl.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import { RoleHasModelPermissions } from './services/roles/role_has_model_permissions.js';
2
2
  import { ModelHasRolePermissions } from './services/model_has_role_permissions.js';
3
- import PermissionsService from './services/permissions/permissions_service.js';
4
- import RolesService from './services/roles/roles_service.js';
5
3
  import PermissionHasModelRoles from './services/permissions/permission_has_model_roles.js';
6
- import ModelService from './services/model_service.js';
4
+ import ModelManager from './model_manager.js';
7
5
  import EmptyPermission from './services/permissions/empty_permission.js';
8
6
  import EmptyRoles from './services/roles/empty_roles.js';
7
+ import { Scope } from './scope.js';
9
8
  export class AclManager {
10
9
  static modelManager;
11
10
  static map;
@@ -15,53 +14,65 @@ export class AclManager {
15
14
  static setMorphMap(map) {
16
15
  this.map = map;
17
16
  }
18
- _scope;
19
- allowScopeRewriting = true;
20
- constructor(allowScopeRewriting) {
21
- if (allowScopeRewriting !== undefined) {
22
- this.allowScopeRewriting = allowScopeRewriting;
17
+ allowOptionsRewriting;
18
+ options = {};
19
+ constructor(allowOptionsRewriting, defaultOptions) {
20
+ this.allowOptionsRewriting = allowOptionsRewriting;
21
+ // default global scope
22
+ this.options['scope'] = this.createNewScope();
23
+ if (defaultOptions) {
24
+ this.options = { ...this.options, ...defaultOptions };
23
25
  }
24
26
  }
25
27
  model(model) {
26
- const scope = this.getScope();
27
- const role = AclManager.modelManager.getModel('role');
28
- const modelPermission = AclManager.modelManager.getModel('modelPermission');
29
- const modelRole = AclManager.modelManager.getModel('modelRole');
30
- return new ModelHasRolePermissions(model, new RolesService(role, modelPermission, modelRole, AclManager.map, scope), new PermissionsService(AclManager.modelManager.getModel('permission'), role, modelPermission, modelRole, AclManager.map, scope), AclManager.map, scope);
28
+ return new ModelHasRolePermissions(AclManager.modelManager, AclManager.map, { ...this.options }, model);
31
29
  }
32
30
  role(role) {
33
- const scope = this.getScope();
34
- const roleClass = AclManager.modelManager.getModel('role');
35
- const modelPermission = AclManager.modelManager.getModel('modelPermission');
36
- const modelRole = AclManager.modelManager.getModel('modelRole');
37
31
  if (role) {
38
- return new RoleHasModelPermissions(role, new PermissionsService(AclManager.modelManager.getModel('permission'), roleClass, modelPermission, modelRole, AclManager.map, scope), new ModelService(modelPermission, modelRole, AclManager.map), AclManager.map, scope);
32
+ return new RoleHasModelPermissions(AclManager.modelManager, AclManager.map, { ...this.options }, role);
39
33
  }
40
- return new EmptyRoles(roleClass, scope);
34
+ return new EmptyRoles(AclManager.modelManager, AclManager.map, { ...this.options });
41
35
  }
42
36
  permission(permission) {
43
- const scope = this.getScope();
44
- const roleClass = AclManager.modelManager.getModel('role');
45
- const modelPermission = AclManager.modelManager.getModel('modelPermission');
46
- const modelRole = AclManager.modelManager.getModel('modelRole');
47
37
  if (permission) {
48
- return new PermissionHasModelRoles(permission, new RolesService(roleClass, modelPermission, modelRole, AclManager.map, scope), new PermissionsService(AclManager.modelManager.getModel('permission'), roleClass, modelPermission, modelRole, AclManager.map, scope), new ModelService(modelPermission, modelRole, AclManager.map), modelPermission, modelRole, AclManager.map, scope);
38
+ return new PermissionHasModelRoles(AclManager.modelManager, AclManager.map, { ...this.options }, permission);
49
39
  }
50
- return new EmptyPermission(AclManager.modelManager.getModel('permission'), scope);
40
+ return new EmptyPermission(AclManager.modelManager, AclManager.map, { ...this.options });
51
41
  }
52
42
  createNewScope() {
53
43
  const ScopeClass = AclManager.modelManager.getModel('scope');
54
- return new ScopeClass();
44
+ return new ScopeClass().get();
55
45
  }
46
+ /**
47
+ * changing global options
48
+ * @param options
49
+ * @param forceUpdate
50
+ */
51
+ withOptions(options, forceUpdate = false) {
52
+ if (!this.allowOptionsRewriting && !forceUpdate) {
53
+ throw new Error('withOptions method call is not available on global Acl object, use AclManager to create new object or use forceUpdate=true');
54
+ }
55
+ this.options = { ...this.options, ...options };
56
+ return this;
57
+ }
58
+ /**
59
+ * @param scope
60
+ * @param forceUpdate
61
+ */
56
62
  scope(scope, forceUpdate = false) {
57
- if (!this.allowScopeRewriting && !forceUpdate) {
63
+ if (!this.allowOptionsRewriting && !forceUpdate) {
58
64
  throw new Error('Scope method call is not available on global Acl object, use AclManager to create new scoped object or use forceUpdate=true');
59
65
  }
60
- this._scope = scope;
66
+ this.withOptions({
67
+ scope,
68
+ }, forceUpdate);
61
69
  return this;
62
70
  }
63
71
  getScope() {
64
- return this._scope || this.createNewScope();
72
+ return this.options['scope'];
65
73
  }
66
74
  }
75
+ const modelManager = new ModelManager();
76
+ modelManager.setModel('scope', Scope);
77
+ AclManager.setModelManager(modelManager);
67
78
  export const Acl = new AclManager(false);
@@ -1,8 +1,8 @@
1
1
  import { ScopeInterface } from './types.js';
2
2
  export declare class Scope implements ScopeInterface {
3
3
  private currentScope;
4
- constructor(scope?: string);
5
4
  static defaultScope: string;
5
+ constructor(scope?: string);
6
6
  set(scope: string): this;
7
7
  get(): string;
8
8
  default(): string;
@@ -1,12 +1,12 @@
1
1
  export class Scope {
2
2
  currentScope;
3
+ static defaultScope = 'default';
3
4
  constructor(scope) {
4
5
  if (!scope) {
5
6
  scope = Scope.defaultScope;
6
7
  }
7
8
  this.currentScope = scope;
8
9
  }
9
- static defaultScope = 'default';
10
10
  set(scope) {
11
11
  this.currentScope = scope;
12
12
  return this;
@@ -0,0 +1,13 @@
1
+ import { ModelAdapterOptions } from '@adonisjs/lucid/types/model';
2
+ import ModelManager from '../model_manager.js';
3
+ import { MorphInterface, OptionsInterface } from '../types.js';
4
+ export default class BaseAdapter {
5
+ protected manager: ModelManager;
6
+ protected map: MorphInterface;
7
+ protected options: OptionsInterface;
8
+ protected get scope(): any;
9
+ constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface);
10
+ on(scope: string): this;
11
+ getScope(): any;
12
+ withQueryOptions(options: ModelAdapterOptions): this;
13
+ }
@@ -0,0 +1,24 @@
1
+ export default class BaseAdapter {
2
+ manager;
3
+ map;
4
+ options;
5
+ get scope() {
6
+ return this.options['scope'];
7
+ }
8
+ constructor(manager, map, options) {
9
+ this.manager = manager;
10
+ this.map = map;
11
+ this.options = options;
12
+ }
13
+ on(scope) {
14
+ this.options['scope'] = scope;
15
+ return this;
16
+ }
17
+ getScope() {
18
+ return this.scope;
19
+ }
20
+ withQueryOptions(options) {
21
+ this.options['queryOptions'] = options;
22
+ return this;
23
+ }
24
+ }
@@ -1,4 +1,9 @@
1
+ import { OptionsInterface } from '../types.js';
1
2
  export default class BaseService {
3
+ protected options: OptionsInterface;
4
+ constructor(options: OptionsInterface);
5
+ protected getQueryOptions(): any;
6
+ protected get scope(): any;
2
7
  protected formatList(models: (string | number | any)[]): {
3
8
  slugs: string[];
4
9
  ids: number[];
@@ -1,5 +1,15 @@
1
1
  import { formatList, formatListStringNumbers, formatStringNumbers } from './helper.js';
2
2
  export default class BaseService {
3
+ options;
4
+ constructor(options) {
5
+ this.options = options;
6
+ }
7
+ getQueryOptions() {
8
+ return this.options['queryOptions'] || undefined;
9
+ }
10
+ get scope() {
11
+ return this.options['scope'];
12
+ }
3
13
  formatList(models) {
4
14
  return formatList(models);
5
15
  }
@@ -1,15 +1,16 @@
1
- import { AclModel, MorphInterface, ScopeInterface } from '../types.js';
2
- import PermissionsService from './permissions/permissions_service.js';
1
+ import { AclModel, MorphInterface, OptionsInterface } from '../types.js';
3
2
  import RolesService from './roles/roles_service.js';
4
- export declare class ModelHasRolePermissions {
3
+ import BaseAdapter from './base_adapter.js';
4
+ import ModelManager from '../model_manager.js';
5
+ import PermissionService from './permissions/permissions_service.js';
6
+ export declare class ModelHasRolePermissions extends BaseAdapter {
7
+ protected manager: ModelManager;
8
+ protected map: MorphInterface;
9
+ protected options: OptionsInterface;
5
10
  private model;
6
- private roleService;
7
- private permissionsService;
8
- private map;
9
- private scope;
10
- constructor(model: AclModel, roleService: RolesService, permissionsService: PermissionsService, map: MorphInterface, scope: ScopeInterface);
11
- on(scope: string): this;
12
- getScope(): string;
11
+ protected roleService: RolesService;
12
+ protected permissionService: PermissionService;
13
+ constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface, model: AclModel);
13
14
  roles(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../types.js").RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
14
15
  hasRole(role: string): Promise<boolean>;
15
16
  hasAllRoles(...roles: string[]): Promise<boolean>;
@@ -24,6 +25,10 @@ export declare class ModelHasRolePermissions {
24
25
  globalPermissions(includeForbiddings?: boolean): Promise<import("../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
25
26
  onResourcePermissions(includeForbiddings?: boolean): Promise<import("../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
26
27
  directPermissions(includeForbiddings?: boolean): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>>;
28
+ /**
29
+ * Get permission through roles
30
+ * @param includeForbiddings
31
+ */
27
32
  rolePermissions(includeForbiddings?: boolean): Promise<import("../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
28
33
  directGlobalPermissions(includeForbiddings?: boolean): Promise<import("../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
29
34
  directResourcePermissions(includeForbiddings?: boolean): Promise<import("../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
@@ -1,23 +1,25 @@
1
+ import RolesService from './roles/roles_service.js';
1
2
  import { destructTarget, formatList } from './helper.js';
2
- export class ModelHasRolePermissions {
3
+ import BaseAdapter from './base_adapter.js';
4
+ import PermissionService from './permissions/permissions_service.js';
5
+ export class ModelHasRolePermissions extends BaseAdapter {
6
+ manager;
7
+ map;
8
+ options;
3
9
  model;
4
10
  roleService;
5
- permissionsService;
6
- map;
7
- scope;
8
- constructor(model, roleService, permissionsService, map, scope) {
9
- this.model = model;
10
- this.roleService = roleService;
11
- this.permissionsService = permissionsService;
11
+ permissionService;
12
+ constructor(manager, map, options, model) {
13
+ super(manager, map, options);
14
+ this.manager = manager;
12
15
  this.map = map;
13
- this.scope = scope;
14
- }
15
- on(scope) {
16
- this.scope.set(scope);
17
- return this;
18
- }
19
- getScope() {
20
- return this.scope.get();
16
+ this.options = options;
17
+ this.model = model;
18
+ const role = manager.getModel('role');
19
+ const modelPermission = manager.getModel('modelPermission');
20
+ const modelRole = manager.getModel('modelRole');
21
+ this.roleService = new RolesService(this.options, role, modelPermission, modelRole, map);
22
+ this.permissionService = new PermissionService(this.options, manager.getModel('permission'), role, modelPermission, modelRole, map);
21
23
  }
22
24
  // roles related section BEGIN
23
25
  roles() {
@@ -54,50 +56,54 @@ export class ModelHasRolePermissions {
54
56
  // roles related section END
55
57
  // permissions related section BEGIN
56
58
  async permissions(includeForbiddings = false) {
57
- return this.permissionsService.all(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
59
+ return this.permissionService.all(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
58
60
  }
59
61
  async globalPermissions(includeForbiddings = false) {
60
- return this.permissionsService.global(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
62
+ return this.permissionService.global(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
61
63
  }
62
64
  async onResourcePermissions(includeForbiddings = false) {
63
- return this.permissionsService.onResource(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
65
+ return this.permissionService.onResource(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
64
66
  }
65
67
  directPermissions(includeForbiddings = false) {
66
- return this.permissionsService.direct(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
68
+ return this.permissionService.direct(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
67
69
  }
70
+ /**
71
+ * Get permission through roles
72
+ * @param includeForbiddings
73
+ */
68
74
  rolePermissions(includeForbiddings = false) {
69
- return this.permissionsService.throughRoles(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
75
+ return this.permissionService.throughRoles(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
70
76
  }
71
77
  async directGlobalPermissions(includeForbiddings = false) {
72
- return this.permissionsService.directGlobal(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
78
+ return this.permissionService.directGlobal(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
73
79
  }
74
80
  async directResourcePermissions(includeForbiddings = false) {
75
- return this.permissionsService.directResource(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
81
+ return this.permissionService.directResource(this.map.getAlias(this.model), this.model.getModelId(), includeForbiddings);
76
82
  }
77
83
  async containsPermission(permission) {
78
- const result = await this.permissionsService.containsAny(this.map.getAlias(this.model), this.model.getModelId(), [permission]);
84
+ const result = await this.permissionService.containsAny(this.map.getAlias(this.model), this.model.getModelId(), [permission]);
79
85
  return result;
80
86
  }
81
87
  async contains(permission) {
82
88
  return this.containsPermission(permission);
83
89
  }
84
90
  async containsAllPermissions(permissions) {
85
- const result = await this.permissionsService.containsAll(this.map.getAlias(this.model), this.model.getModelId(), permissions);
91
+ const result = await this.permissionService.containsAll(this.map.getAlias(this.model), this.model.getModelId(), permissions);
86
92
  return result;
87
93
  }
88
94
  async containsAnyPermission(permissions) {
89
- const result = await this.permissionsService.containsAny(this.map.getAlias(this.model), this.model.getModelId(), permissions);
95
+ const result = await this.permissionService.containsAny(this.map.getAlias(this.model), this.model.getModelId(), permissions);
90
96
  return result;
91
97
  }
92
98
  async containsDirectPermission(permission) {
93
- const result = await this.permissionsService.containsAnyDirect(this.map.getAlias(this.model), this.model.getModelId(), [permission]);
99
+ const result = await this.permissionService.containsAnyDirect(this.map.getAlias(this.model), this.model.getModelId(), [permission]);
94
100
  return result;
95
101
  }
96
102
  containsAllPermissionsDirectly(permissions) {
97
- return this.permissionsService.containsAllDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions);
103
+ return this.permissionService.containsAllDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions);
98
104
  }
99
105
  async containsAnyPermissionDirectly(permissions) {
100
- const result = await this.permissionsService.containsAnyDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions);
106
+ const result = await this.permissionService.containsAnyDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions);
101
107
  return result;
102
108
  }
103
109
  async hasPermission(permission, target) {
@@ -105,22 +111,22 @@ export class ModelHasRolePermissions {
105
111
  }
106
112
  async hasAllPermissions(permissions, target) {
107
113
  const entity = await destructTarget(this.map, target);
108
- return await this.permissionsService.hasAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
114
+ return await this.permissionService.hasAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
109
115
  }
110
116
  async hasAnyPermission(permissions, target) {
111
117
  const entity = await destructTarget(this.map, target);
112
- return await this.permissionsService.hasAny(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
118
+ return await this.permissionService.hasAny(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
113
119
  }
114
120
  async hasAnyDirectPermission(permissions, target) {
115
121
  const entity = await destructTarget(this.map, target);
116
- return await this.permissionsService.hasAnyDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
122
+ return await this.permissionService.hasAnyDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
117
123
  }
118
124
  async hasDirectPermission(permission, target) {
119
125
  return this.hasAnyDirectPermission([permission], target);
120
126
  }
121
127
  async hasAllPermissionsDirect(permissions, target) {
122
128
  const entity = await destructTarget(this.map, target);
123
- return await this.permissionsService.hasAllDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
129
+ return await this.permissionService.hasAllDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
124
130
  }
125
131
  can(permission, target) {
126
132
  return this.hasPermission(permission, target);
@@ -133,11 +139,11 @@ export class ModelHasRolePermissions {
133
139
  }
134
140
  async assignDirectPermission(permission, target) {
135
141
  const entity = await destructTarget(this.map, target);
136
- return this.permissionsService.giveAll(this.map.getAlias(this.model), this.model.getModelId(), [permission], entity.targetClass, entity.targetId, true);
142
+ return this.permissionService.giveAll(this.map.getAlias(this.model), this.model.getModelId(), [permission], entity.targetClass, entity.targetId, true);
137
143
  }
138
144
  async assignDirectAllPermissions(permissions, target) {
139
145
  const entity = await destructTarget(this.map, target);
140
- return this.permissionsService.giveAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId, true);
146
+ return this.permissionService.giveAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId, true);
141
147
  }
142
148
  allow(permission, target) {
143
149
  return this.allowAll([permission], target);
@@ -156,13 +162,13 @@ export class ModelHasRolePermissions {
156
162
  }
157
163
  async revokeAllPermissions(permissions, target) {
158
164
  const entity = await destructTarget(this.map, target);
159
- return this.permissionsService.revokeAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
165
+ return this.permissionService.revokeAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
160
166
  }
161
167
  async flushPermissions() {
162
- return this.permissionsService.flush(this.map.getAlias(this.model), this.model.getModelId());
168
+ return this.permissionService.flush(this.map.getAlias(this.model), this.model.getModelId());
163
169
  }
164
170
  async flush() {
165
- await this.permissionsService.flush(this.map.getAlias(this.model), this.model.getModelId());
171
+ await this.permissionService.flush(this.map.getAlias(this.model), this.model.getModelId());
166
172
  await this.roleService.flush(this.map.getAlias(this.model), this.model.getModelId());
167
173
  return true;
168
174
  }
@@ -171,11 +177,11 @@ export class ModelHasRolePermissions {
171
177
  }
172
178
  async forbidAll(permissions, target) {
173
179
  const entity = await destructTarget(this.map, target);
174
- return this.permissionsService.forbidAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
180
+ return this.permissionService.forbidAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
175
181
  }
176
182
  async unforbidAll(permissions, target) {
177
183
  const entity = await destructTarget(this.map, target);
178
- return this.permissionsService.unforbidAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
184
+ return this.permissionService.unforbidAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
179
185
  }
180
186
  async unforbid(permission, target) {
181
187
  return this.unforbidAll([permission], target);
@@ -1,7 +1,8 @@
1
1
  import BaseService from './base_service.js';
2
2
  import { BaseModel } from '@adonisjs/lucid/orm';
3
- import { ModelIdType, MorphInterface } from '../types.js';
3
+ import { ModelIdType, MorphInterface, OptionsInterface } from '../types.js';
4
4
  export default class ModelService extends BaseService {
5
+ protected options: OptionsInterface;
5
6
  private modelPermissionClassName;
6
7
  private modelRoleClassName;
7
8
  private map;
@@ -9,7 +10,7 @@ export default class ModelService extends BaseService {
9
10
  private readonly modelPermissionTable;
10
11
  private modelRoleQuery;
11
12
  private readonly modelRoleTable;
12
- constructor(modelPermissionClassName: typeof BaseModel, modelRoleClassName: typeof BaseModel, map: MorphInterface);
13
+ constructor(options: OptionsInterface, modelPermissionClassName: typeof BaseModel, modelRoleClassName: typeof BaseModel, map: MorphInterface);
13
14
  all(roleId: number): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../types.js").ModelRoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
14
15
  allFor(modelType: string, roleId: number): Promise<any>;
15
16
  allByPermission(permissionId: ModelIdType): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../types.js").ModelPermissionModel<import("@adonisjs/lucid/types/model").LucidModel>>;
@@ -1,32 +1,23 @@
1
1
  import BaseService from './base_service.js';
2
2
  import { getModelPermissionModelQuery, getModelRoleModelQuery } from './query_helper.js';
3
3
  export default class ModelService extends BaseService {
4
+ options;
4
5
  modelPermissionClassName;
5
6
  modelRoleClassName;
6
7
  map;
7
- // private permissionQuery
8
- // private readonly permissionTable
9
- // private roleQuery
10
- // private readonly roleTable
11
8
  modelPermissionQuery;
12
9
  modelPermissionTable;
13
10
  modelRoleQuery;
14
11
  modelRoleTable;
15
- constructor(
16
- // private roleClassName: typeof BaseModel,
17
- // private permissionClassName: typeof BaseModel,
18
- modelPermissionClassName, modelRoleClassName, map) {
19
- super();
12
+ constructor(options, modelPermissionClassName, modelRoleClassName, map) {
13
+ super(options);
14
+ this.options = options;
20
15
  this.modelPermissionClassName = modelPermissionClassName;
21
16
  this.modelRoleClassName = modelRoleClassName;
22
17
  this.map = map;
23
- // this.permissionQuery = getPermissionModelQuery(this.permissionClassName)
24
- // this.permissionTable = this.permissionClassName.table
25
- // this.roleQuery = getRoleModelQuery(this.roleClassName)
26
- // this.roleTable = this.roleClassName.table
27
- this.modelPermissionQuery = getModelPermissionModelQuery(this.modelPermissionClassName);
18
+ this.modelPermissionQuery = getModelPermissionModelQuery(this.modelPermissionClassName, this.getQueryOptions());
28
19
  this.modelPermissionTable = this.modelPermissionClassName.table;
29
- this.modelRoleQuery = getModelRoleModelQuery(this.modelRoleClassName);
20
+ this.modelRoleQuery = getModelRoleModelQuery(this.modelRoleClassName, this.getQueryOptions());
30
21
  this.modelRoleTable = this.modelRoleClassName.table;
31
22
  }
32
23
  all(roleId) {
@@ -1,12 +1,14 @@
1
1
  import { BaseModel } from '@adonisjs/lucid/orm';
2
- import { PermissionInterface, PermissionModel, ScopeInterface } from '../../types.js';
3
- export default class EmptyPermission {
4
- private permissionClassName;
5
- private scope;
2
+ import { MorphInterface, OptionsInterface, PermissionInterface, PermissionModel } from '../../types.js';
3
+ import BaseAdapter from '../base_adapter.js';
4
+ import ModelManager from '../../model_manager.js';
5
+ export default class EmptyPermission extends BaseAdapter {
6
+ protected manager: ModelManager;
7
+ protected map: MorphInterface;
8
+ protected options: OptionsInterface;
6
9
  private permissionQuery;
7
- constructor(permissionClassName: typeof BaseModel, scope: ScopeInterface);
8
- on(scope: string): this;
9
- getScope(): string;
10
+ permissionClassName: typeof BaseModel;
11
+ constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface);
10
12
  delete(permission: string): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, any>;
11
13
  create(values: Partial<PermissionInterface>): Promise<PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>>;
12
14
  query(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>>;
@@ -1,20 +1,19 @@
1
1
  import { getPermissionModelQuery } from '../query_helper.js';
2
- export default class EmptyPermission {
3
- permissionClassName;
4
- scope;
2
+ import BaseAdapter from '../base_adapter.js';
3
+ export default class EmptyPermission extends BaseAdapter {
4
+ manager;
5
+ map;
6
+ options;
5
7
  permissionQuery;
6
- constructor(permissionClassName, scope) {
7
- this.permissionClassName = permissionClassName;
8
- this.scope = scope;
8
+ permissionClassName;
9
+ constructor(manager, map, options) {
10
+ super(manager, map, options);
11
+ this.manager = manager;
12
+ this.map = map;
13
+ this.options = options;
14
+ this.permissionClassName = manager.getModel('permission');
9
15
  this.permissionQuery = getPermissionModelQuery(this.permissionClassName);
10
16
  }
11
- on(scope) {
12
- this.scope.set(scope);
13
- return this;
14
- }
15
- getScope() {
16
- return this.scope.get();
17
- }
18
17
  delete(permission) {
19
18
  return this.permissionQuery.where('slug', permission).delete();
20
19
  }
@@ -1,24 +1,27 @@
1
- import { AclModel, MorphInterface, PermissionInterface, ScopeInterface } from '../../types.js';
1
+ import { AclModel, MorphInterface, OptionsInterface, PermissionInterface } from '../../types.js';
2
2
  import ModelService from '../model_service.js';
3
- import RolesService from '../roles/roles_service.js';
4
- import PermissionsService from './permissions_service.js';
3
+ import RoleService from '../roles/roles_service.js';
4
+ import PermissionService from './permissions_service.js';
5
5
  import { BaseModel } from '@adonisjs/lucid/orm';
6
- export default class PermissionHasModelRoles {
6
+ import BaseAdapter from '../base_adapter.js';
7
+ import ModelManager from '../../model_manager.js';
8
+ export default class PermissionHasModelRoles extends BaseAdapter {
9
+ protected manager: ModelManager;
10
+ protected map: MorphInterface;
11
+ protected options: OptionsInterface;
7
12
  private permission;
8
- private roleService;
9
- private permissionService;
10
- private modelService;
11
- private modelPermissionClassName;
12
- private roleClassName;
13
- private map;
14
- private scope;
15
13
  private modelPermissionQuery;
14
+ protected modelPermissionClassName: typeof BaseModel;
15
+ protected roleClassName: typeof BaseModel;
16
+ protected roleService: RoleService;
17
+ protected permissionService: PermissionService;
18
+ protected modelService: ModelService;
16
19
  private roleQuery;
17
20
  private readonly roleTable;
18
- constructor(permission: PermissionInterface, roleService: RolesService, permissionService: PermissionsService, modelService: ModelService, modelPermissionClassName: typeof BaseModel, roleClassName: typeof BaseModel, map: MorphInterface, scope: ScopeInterface);
21
+ constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface, permission: PermissionInterface);
19
22
  models(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").ModelPermissionModel<import("@adonisjs/lucid/types/model").LucidModel>>;
20
23
  on(scope: string): this;
21
- getScope(): string;
24
+ getScope(): any;
22
25
  modelsFor(modelType: string): Promise<any>;
23
26
  roles(): Promise<import("../../types.js").RoleModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
24
27
  belongsToRole(role: string | number): Promise<boolean>;
@@ -1,31 +1,41 @@
1
1
  import { destructTarget } from '../helper.js';
2
+ import ModelService from '../model_service.js';
3
+ import PermissionService from './permissions_service.js';
2
4
  import { getModelPermissionModelQuery, getRoleModelQuery } from '../query_helper.js';
3
- export default class PermissionHasModelRoles {
5
+ import BaseAdapter from '../base_adapter.js';
6
+ import RolesService from '../roles/roles_service.js';
7
+ export default class PermissionHasModelRoles extends BaseAdapter {
8
+ manager;
9
+ map;
10
+ options;
4
11
  permission;
12
+ modelPermissionQuery;
13
+ modelPermissionClassName;
14
+ roleClassName;
5
15
  roleService;
6
16
  permissionService;
7
17
  modelService;
8
- modelPermissionClassName;
9
- roleClassName;
10
- map;
11
- scope;
12
- modelPermissionQuery;
13
18
  // private readonly modelPermissionTable
14
19
  roleQuery;
15
20
  roleTable;
16
- constructor(permission, roleService, permissionService, modelService, modelPermissionClassName, roleClassName, map, scope) {
17
- this.permission = permission;
18
- this.roleService = roleService;
19
- this.permissionService = permissionService;
20
- this.modelService = modelService;
21
- this.modelPermissionClassName = modelPermissionClassName;
22
- this.roleClassName = roleClassName;
21
+ constructor(manager, map, options, permission) {
22
+ super(manager, map, options);
23
+ this.manager = manager;
23
24
  this.map = map;
24
- this.scope = scope;
25
+ this.options = options;
26
+ this.permission = permission;
27
+ this.modelPermissionClassName = manager.getModel('modelPermission');
28
+ this.roleClassName = manager.getModel('role');
25
29
  this.modelPermissionQuery = getModelPermissionModelQuery(this.modelPermissionClassName);
26
30
  // this.modelPermissionTable = this.modelPermissionClassName.table
27
31
  this.roleQuery = getRoleModelQuery(this.roleClassName);
28
32
  this.roleTable = this.roleClassName.table;
33
+ const role = manager.getModel('role');
34
+ const modelPermission = manager.getModel('modelPermission');
35
+ const modelRole = manager.getModel('modelRole');
36
+ this.roleService = new RolesService(this.options, role, modelPermission, modelRole, map);
37
+ this.permissionService = new PermissionService(this.options, manager.getModel('permission'), role, modelPermission, modelRole, map);
38
+ this.modelService = new ModelService(this.options, modelPermission, modelRole, map);
29
39
  }
30
40
  models() {
31
41
  return this.modelService.allByPermission(this.permission.getModelId());
@@ -1,20 +1,20 @@
1
1
  import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
2
- import { ModelIdType, ModelPermissionsQuery, MorphInterface, PermissionModel, ScopeInterface } from '../../types.js';
2
+ import { ModelIdType, ModelPermissionsQuery, MorphInterface, OptionsInterface, PermissionModel } from '../../types.js';
3
3
  import BaseService from '../base_service.js';
4
4
  import { BaseModel } from '@adonisjs/lucid/orm';
5
5
  export default class PermissionsService extends BaseService {
6
- private permissionClassName;
7
- private roleClassName;
8
- private modelPermissionClassName;
9
- private modelRoleClassName;
10
- private map;
11
- private scope;
6
+ protected options: OptionsInterface;
7
+ protected permissionClassName: typeof BaseModel;
8
+ protected roleClassName: typeof BaseModel;
9
+ protected modelPermissionClassName: typeof BaseModel;
10
+ protected modelRoleClassName: typeof BaseModel;
11
+ protected map: MorphInterface;
12
12
  private readonly permissionTable;
13
- private modelPermissionQuery;
14
13
  private readonly modelPermissionTable;
15
14
  private readonly modelRoleTable;
16
- constructor(permissionClassName: typeof BaseModel, roleClassName: typeof BaseModel, modelPermissionClassName: typeof BaseModel, modelRoleClassName: typeof BaseModel, map: MorphInterface, scope: ScopeInterface);
15
+ constructor(options: OptionsInterface, permissionClassName: typeof BaseModel, roleClassName: typeof BaseModel, modelPermissionClassName: typeof BaseModel, modelRoleClassName: typeof BaseModel, map: MorphInterface);
17
16
  private get permissionQuery();
17
+ private get modelPermissionQuery();
18
18
  /**
19
19
  * return all permissions, including forbidden
20
20
  */
@@ -1,42 +1,35 @@
1
1
  import BaseService from '../base_service.js';
2
2
  import { getModelPermissionModelQuery, getPermissionModelQuery } from '../query_helper.js';
3
3
  export default class PermissionsService extends BaseService {
4
+ options;
4
5
  permissionClassName;
5
6
  roleClassName;
6
7
  modelPermissionClassName;
7
8
  modelRoleClassName;
8
9
  map;
9
- scope;
10
- // private permissionQuery
11
10
  permissionTable;
12
- // private roleQuery
13
- // private readonly roleTable
14
- modelPermissionQuery;
15
11
  modelPermissionTable;
16
- // private modelRoleQuery
17
12
  modelRoleTable;
18
- constructor(permissionClassName, roleClassName, modelPermissionClassName, modelRoleClassName, map, scope) {
19
- super();
13
+ constructor(options, permissionClassName, roleClassName, modelPermissionClassName, modelRoleClassName, map) {
14
+ super(options);
15
+ this.options = options;
20
16
  this.permissionClassName = permissionClassName;
21
17
  this.roleClassName = roleClassName;
22
18
  this.modelPermissionClassName = modelPermissionClassName;
23
19
  this.modelRoleClassName = modelRoleClassName;
24
20
  this.map = map;
25
- this.scope = scope;
26
- // this.permissionQuery = getPermissionModelQuery(this.permissionClassName)
27
21
  this.permissionTable = this.permissionClassName.table;
28
- // this.roleQuery = getRoleModelQuery(this.roleClassName)
29
- // this.roleTable = this.roleClassName.table
30
- this.modelPermissionQuery = getModelPermissionModelQuery(this.modelPermissionClassName);
31
22
  this.modelPermissionTable = this.modelPermissionClassName.table;
32
- // this.modelRoleQuery = getModelRoleModelQuery(this.modelRoleClassName)
33
23
  this.modelRoleTable = this.modelRoleClassName.table;
34
24
  }
35
25
  get permissionQuery() {
36
- const q = getPermissionModelQuery(this.permissionClassName);
26
+ const q = getPermissionModelQuery(this.permissionClassName, this.getQueryOptions());
37
27
  this.applyScopes(q);
38
28
  return q;
39
29
  }
30
+ get modelPermissionQuery() {
31
+ return getModelPermissionModelQuery(this.modelPermissionClassName, this.getQueryOptions());
32
+ }
40
33
  /**
41
34
  * return all permissions, including forbidden
42
35
  */
@@ -295,7 +288,7 @@ export default class PermissionsService extends BaseService {
295
288
  entityType: entityType || '*',
296
289
  entityId,
297
290
  allowed,
298
- scope: this.scope.get(),
291
+ scope: this.scope,
299
292
  });
300
293
  }
301
294
  else {
@@ -303,7 +296,7 @@ export default class PermissionsService extends BaseService {
303
296
  }
304
297
  }
305
298
  if (createManyData.length) {
306
- const newPermissions = (await this.permissionClassName.createMany(createManyData));
299
+ const newPermissions = (await this.permissionClassName.createMany(createManyData, this.getQueryOptions()));
307
300
  newPermissions.map((i) => permissionIds.push(i.id));
308
301
  }
309
302
  // first check if there are assigned or not
@@ -321,7 +314,7 @@ export default class PermissionsService extends BaseService {
321
314
  modelId: modelId,
322
315
  permissionId: i,
323
316
  }));
324
- return this.modelPermissionClassName.createMany(modelPermissionMany);
317
+ return this.modelPermissionClassName.createMany(modelPermissionMany, this.getQueryOptions());
325
318
  }
326
319
  revokeAll(modelType, modelId, permissions, entityType, entityId) {
327
320
  const q = this.modelPermissionQuery
@@ -513,9 +506,9 @@ export default class PermissionsService extends BaseService {
513
506
  }
514
507
  }
515
508
  applyScopes(q) {
516
- q.where(this.permissionTable + '.scope', this.scope.get());
509
+ q.where(this.permissionTable + '.scope', this.scope);
517
510
  }
518
511
  applyModelPermissionScopes(q, table) {
519
- q.where(table + '.scope', this.scope.get());
512
+ q.where(table + '.scope', this.scope);
520
513
  }
521
514
  }
@@ -1,7 +1,7 @@
1
- import { LucidModel, ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
1
+ import { LucidModel, ModelAdapterOptions, ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
2
2
  import { BaseModel } from '@adonisjs/lucid/orm';
3
3
  import { ModelPermissionModel, ModelRoleModel, PermissionModel, RoleModel } from '../types.js';
4
- export declare function getPermissionModelQuery<T extends LucidModel>(className: typeof BaseModel): ModelQueryBuilderContract<T, PermissionModel<T>>;
5
- export declare function getRoleModelQuery<T extends LucidModel>(className: typeof BaseModel): ModelQueryBuilderContract<T, RoleModel<T>>;
6
- export declare function getModelPermissionModelQuery<T extends LucidModel>(className: typeof BaseModel): ModelQueryBuilderContract<T, ModelPermissionModel<T>>;
7
- export declare function getModelRoleModelQuery<T extends LucidModel>(className: typeof BaseModel): ModelQueryBuilderContract<T, ModelRoleModel<T>>;
4
+ export declare function getPermissionModelQuery<T extends LucidModel>(className: typeof BaseModel, options?: ModelAdapterOptions): ModelQueryBuilderContract<T, PermissionModel<T>>;
5
+ export declare function getRoleModelQuery<T extends LucidModel>(className: typeof BaseModel, options?: ModelAdapterOptions): ModelQueryBuilderContract<T, RoleModel<T>>;
6
+ export declare function getModelPermissionModelQuery<T extends LucidModel>(className: typeof BaseModel, options?: ModelAdapterOptions): ModelQueryBuilderContract<T, ModelPermissionModel<T>>;
7
+ export declare function getModelRoleModelQuery<T extends LucidModel>(className: typeof BaseModel, options?: ModelAdapterOptions): ModelQueryBuilderContract<T, ModelRoleModel<T>>;
@@ -1,12 +1,12 @@
1
- export function getPermissionModelQuery(className) {
2
- return className.query();
1
+ export function getPermissionModelQuery(className, options) {
2
+ return className.query(options);
3
3
  }
4
- export function getRoleModelQuery(className) {
5
- return className.query();
4
+ export function getRoleModelQuery(className, options) {
5
+ return className.query(options);
6
6
  }
7
- export function getModelPermissionModelQuery(className) {
8
- return className.query();
7
+ export function getModelPermissionModelQuery(className, options) {
8
+ return className.query(options);
9
9
  }
10
- export function getModelRoleModelQuery(className) {
11
- return className.query();
10
+ export function getModelRoleModelQuery(className, options) {
11
+ return className.query(options);
12
12
  }
@@ -1,12 +1,14 @@
1
1
  import { BaseModel } from '@adonisjs/lucid/orm';
2
- import { RoleInterface, RoleModel, ScopeInterface } from '../../types.js';
3
- export default class EmptyRoles {
4
- private roleClassName;
5
- private scope;
2
+ import { MorphInterface, OptionsInterface, RoleInterface, RoleModel } from '../../types.js';
3
+ import BaseAdapter from '../base_adapter.js';
4
+ import ModelManager from '../../model_manager.js';
5
+ export default class EmptyRoles extends BaseAdapter {
6
+ protected manager: ModelManager;
7
+ protected map: MorphInterface;
8
+ protected options: OptionsInterface;
6
9
  private roleQuery;
7
- constructor(roleClassName: typeof BaseModel, scope: ScopeInterface);
8
- on(scope: string): this;
9
- getScope(): string;
10
+ protected roleClassName: typeof BaseModel;
11
+ constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface);
10
12
  delete(role: string): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, any>;
11
13
  create(values: Partial<RoleInterface>): Promise<RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
12
14
  query(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
@@ -1,20 +1,19 @@
1
1
  import { getRoleModelQuery } from '../query_helper.js';
2
- export default class EmptyRoles {
3
- roleClassName;
4
- scope;
2
+ import BaseAdapter from '../base_adapter.js';
3
+ export default class EmptyRoles extends BaseAdapter {
4
+ manager;
5
+ map;
6
+ options;
5
7
  roleQuery;
6
- constructor(roleClassName, scope) {
7
- this.roleClassName = roleClassName;
8
- this.scope = scope;
8
+ roleClassName;
9
+ constructor(manager, map, options) {
10
+ super(manager, map, options);
11
+ this.manager = manager;
12
+ this.map = map;
13
+ this.options = options;
14
+ this.roleClassName = manager.getModel('role');
9
15
  this.roleQuery = getRoleModelQuery(this.roleClassName);
10
16
  }
11
- on(scope) {
12
- this.scope.set(scope);
13
- return this;
14
- }
15
- getScope() {
16
- return this.scope.get();
17
- }
18
17
  delete(role) {
19
18
  return this.roleQuery.where('slug', role).delete();
20
19
  }
@@ -1,15 +1,16 @@
1
1
  import ModelService from '../model_service.js';
2
- import PermissionsService from '../permissions/permissions_service.js';
3
- import { AclModel, MorphInterface, RoleInterface, ScopeInterface } from '../../types.js';
4
- export declare class RoleHasModelPermissions {
2
+ import PermissionService from '../permissions/permissions_service.js';
3
+ import { AclModel, MorphInterface, OptionsInterface, RoleInterface } from '../../types.js';
4
+ import BaseAdapter from '../base_adapter.js';
5
+ import ModelManager from '../../model_manager.js';
6
+ export declare class RoleHasModelPermissions extends BaseAdapter {
7
+ protected manager: ModelManager;
8
+ protected map: MorphInterface;
9
+ protected options: OptionsInterface;
5
10
  private role;
6
- private permissionService;
7
- private modelService;
8
- private map;
9
- private scope;
10
- constructor(role: RoleInterface, permissionService: PermissionsService, modelService: ModelService, map: MorphInterface, scope: ScopeInterface);
11
- on(scope: string): this;
12
- getScope(): string;
11
+ protected modelService: ModelService;
12
+ protected permissionService: PermissionService;
13
+ constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface, role: RoleInterface);
13
14
  models(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").ModelRoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
14
15
  modelsFor(modelType: string): Promise<any>;
15
16
  permissions(): Promise<import("../../types.js").PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>[]>;
@@ -1,23 +1,26 @@
1
1
  import { destructTarget } from '../helper.js';
2
- export class RoleHasModelPermissions {
2
+ import ModelService from '../model_service.js';
3
+ import PermissionService from '../permissions/permissions_service.js';
4
+ import BaseAdapter from '../base_adapter.js';
5
+ export class RoleHasModelPermissions extends BaseAdapter {
6
+ manager;
7
+ map;
8
+ options;
3
9
  role;
4
- permissionService;
5
10
  modelService;
6
- map;
7
- scope;
8
- constructor(role, permissionService, modelService, map, scope) {
9
- this.role = role;
10
- this.permissionService = permissionService;
11
- this.modelService = modelService;
11
+ permissionService;
12
+ constructor(manager, map, options, role) {
13
+ super(manager, map, options);
14
+ this.manager = manager;
12
15
  this.map = map;
13
- this.scope = scope;
14
- }
15
- on(scope) {
16
- this.scope.set(scope);
17
- return this;
18
- }
19
- getScope() {
20
- return this.scope.get();
16
+ this.options = options;
17
+ this.role = role;
18
+ const roleClass = manager.getModel('role');
19
+ const modelPermission = manager.getModel('modelPermission');
20
+ const modelRole = manager.getModel('modelRole');
21
+ const permission = manager.getModel('permission');
22
+ this.modelService = new ModelService(this.options, modelPermission, modelRole, map);
23
+ this.permissionService = new PermissionService(this.options, permission, roleClass, modelPermission, modelRole, map);
21
24
  }
22
25
  models() {
23
26
  return this.modelService.all(+this.role.getModelId());
@@ -1,21 +1,20 @@
1
- import { AclModel, ModelIdType, MorphInterface, ScopeInterface } from '../../types.js';
1
+ import { AclModel, ModelIdType, MorphInterface, OptionsInterface } from '../../types.js';
2
2
  import BaseService from '../base_service.js';
3
3
  import { BaseModel } from '@adonisjs/lucid/orm';
4
4
  import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
5
5
  export default class RolesService extends BaseService {
6
- private roleClassName;
7
- private modelPermissionClassName;
8
- private modelRoleClassName;
9
- private map;
10
- private scope;
11
- private roleQuery;
6
+ protected options: OptionsInterface;
7
+ protected roleClassName: typeof BaseModel;
8
+ protected modelPermissionClassName: typeof BaseModel;
9
+ protected modelRoleClassName: typeof BaseModel;
10
+ protected map: MorphInterface;
12
11
  private readonly roleTable;
13
12
  private readonly modelPermissionTable;
14
- private modelRoleQuery;
15
13
  private readonly modelRoleTable;
16
- private currentScope;
17
- constructor(roleClassName: typeof BaseModel, modelPermissionClassName: typeof BaseModel, modelRoleClassName: typeof BaseModel, map: MorphInterface, scope: ScopeInterface);
14
+ constructor(options: OptionsInterface, roleClassName: typeof BaseModel, modelPermissionClassName: typeof BaseModel, modelRoleClassName: typeof BaseModel, map: MorphInterface);
18
15
  private modelRolesQuery;
16
+ private get roleQuery();
17
+ private get modelRoleQuery();
19
18
  all(modelType: string, modelId: ModelIdType): ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
20
19
  has(modelType: string, modelId: ModelIdType, role: string): Promise<boolean>;
21
20
  hasAll(modelType: string, modelId: ModelIdType, roles: string[]): Promise<boolean>;
@@ -5,38 +5,26 @@ getModelRoleModelQuery,
5
5
  // getPermissionModelQuery,
6
6
  getRoleModelQuery, } from '../query_helper.js';
7
7
  export default class RolesService extends BaseService {
8
+ options;
8
9
  roleClassName;
9
10
  modelPermissionClassName;
10
11
  modelRoleClassName;
11
12
  map;
12
- scope;
13
- // private permissionQuery
14
- // private readonly permissionTable
15
- roleQuery;
16
13
  roleTable;
17
14
  // private modelPermissionQuery
18
15
  modelPermissionTable;
19
- modelRoleQuery;
20
16
  modelRoleTable;
21
- currentScope;
22
- constructor(roleClassName,
17
+ constructor(options, roleClassName,
23
18
  // private permissionClassName: typeof BaseModel,
24
- modelPermissionClassName, modelRoleClassName, map, scope) {
25
- super();
19
+ modelPermissionClassName, modelRoleClassName, map) {
20
+ super(options);
21
+ this.options = options;
26
22
  this.roleClassName = roleClassName;
27
23
  this.modelPermissionClassName = modelPermissionClassName;
28
24
  this.modelRoleClassName = modelRoleClassName;
29
25
  this.map = map;
30
- this.scope = scope;
31
- // this.permissionQuery = getPermissionModelQuery(this.permissionClassName)
32
- // this.permissionTable = this.permissionClassName.table
33
- this.currentScope = this.scope.get();
34
- this.roleQuery = getRoleModelQuery(this.roleClassName);
35
26
  this.roleTable = this.roleClassName.table;
36
- this.applyScopes(this.roleQuery, this.currentScope);
37
- // this.modelPermissionQuery = getModelPermissionModelQuery(this.modelPermissionClassName)
38
27
  this.modelPermissionTable = this.modelPermissionClassName.table;
39
- this.modelRoleQuery = getModelRoleModelQuery(this.modelRoleClassName);
40
28
  this.modelRoleTable = this.modelRoleClassName.table;
41
29
  }
42
30
  modelRolesQuery(modelType, modelId) {
@@ -45,6 +33,14 @@ export default class RolesService extends BaseService {
45
33
  .where('mr.model_type', modelType)
46
34
  .where('mr.model_id', modelId);
47
35
  }
36
+ get roleQuery() {
37
+ const q = getRoleModelQuery(this.roleClassName, this.getQueryOptions());
38
+ this.applyScopes(q, this.scope);
39
+ return q;
40
+ }
41
+ get modelRoleQuery() {
42
+ return getModelRoleModelQuery(this.modelRoleClassName, this.getQueryOptions());
43
+ }
48
44
  all(modelType, modelId) {
49
45
  return this.modelRolesQuery(modelType, modelId)
50
46
  .distinct(this.roleTable + '.id')
@@ -63,10 +59,6 @@ export default class RolesService extends BaseService {
63
59
  rolesQuery.whereIn(this.roleTable + '.id', ids);
64
60
  }
65
61
  const r = await rolesQuery.count('* as total');
66
- // const q = await rolesQuery.toQuery()
67
- // const all = await rolesQuery
68
- // console.log(q)
69
- // console.log(all)
70
62
  // @ts-ignore
71
63
  return +r[0].$extras.total === roles.length;
72
64
  }
@@ -111,7 +103,7 @@ export default class RolesService extends BaseService {
111
103
  roleId: id,
112
104
  });
113
105
  }
114
- await this.modelRoleClassName.createMany(data);
106
+ await this.modelRoleClassName.createMany(data, this.getQueryOptions());
115
107
  return true;
116
108
  }
117
109
  async revoke(role, model) {
@@ -131,7 +123,7 @@ export default class RolesService extends BaseService {
131
123
  query.orWhereIn('r.id', ids);
132
124
  }
133
125
  });
134
- this.applyModelRoleScopes(q, 'r', this.currentScope);
126
+ this.applyModelRoleScopes(q, 'r', this.scope);
135
127
  await q.delete();
136
128
  return true;
137
129
  }
@@ -1,4 +1,4 @@
1
- import { LucidModel } from '@adonisjs/lucid/types/model';
1
+ import { LucidModel, ModelAdapterOptions } from '@adonisjs/lucid/types/model';
2
2
  import { DateTime } from 'luxon';
3
3
  import { BaseModel } from '@adonisjs/lucid/orm';
4
4
  import { Scope } from './scope.js';
@@ -78,6 +78,8 @@ export interface MorphInterface {
78
78
  export interface ModelManagerInterface {
79
79
  [key: string]: any;
80
80
  }
81
+ export interface OptionsInterface extends ModelManagerInterface {
82
+ }
81
83
  export interface Permissions {
82
84
  tables: Object;
83
85
  morphMaps: Object;
@@ -94,6 +96,7 @@ export interface ModelManagerBindings {
94
96
  permission: typeof BaseModel;
95
97
  modelRole: typeof BaseModel;
96
98
  modelPermission: typeof BaseModel;
99
+ queryClient: ModelAdapterOptions;
97
100
  }
98
101
  export interface AclMiddlewareOptions {
99
102
  role: string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@holoyan/adonisjs-permissions",
3
3
  "description": "Adonisjs roles and permissions system",
4
- "version": "0.7.15",
4
+ "version": "0.8.17",
5
5
  "engines": {
6
6
  "node": ">=18.16.0"
7
7
  },