@holoyan/adonisjs-permissions 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,6 +12,11 @@ Checkout other AdonisJS packages
12
12
  - It's simple, just star this repository, that is enough to keep me motivated to maintain this package.
13
13
 
14
14
 
15
+ ## Release Notes
16
+
17
+ Version: >= v1.3.0
18
+ * Added [query helpers](#permissionqueryhelpers-mixin) mixin. To make it easier to query users(models) based on their roles and permissions
19
+
15
20
  ## Table of Contents
16
21
 
17
22
  <details><summary>Click to expand</summary><p>
@@ -20,6 +25,8 @@ Checkout other AdonisJS packages
20
25
  - [Installation](#installation)
21
26
  - [Configuration](#configuration)
22
27
  - [Mixins](#mixins)
28
+ - [hasPermissions](#haspermissions-mixin)
29
+ - [permissionQueryHelpers](#permissionqueryhelpers-mixin)
23
30
  - [Support](#support)
24
31
  - [Database support](#database-support)
25
32
  - [UUID support](#uuid-support)
@@ -49,7 +56,7 @@ Checkout other AdonisJS packages
49
56
  - [The Scope middleware](#the-scope-middleware)
50
57
  - [Default Scope](#default-scope-tenant)
51
58
  - [Transactions](#transactions)
52
- - [Events] (#events)
59
+ - [Events](#events)
53
60
  - [Cheat sheet](#cheat-sheet)
54
61
  - [Todo](#todo)
55
62
  - [Test](#test)
@@ -105,7 +112,7 @@ Example.
105
112
  ```typescript
106
113
 
107
114
  import { BaseModel, column } from '@adonisjs/lucid/orm'
108
- import { MorphMap } from '@holoyan/adonisjs-permissions'
115
+ import { MorphMap } from '@holoyan/morph-map-js' // (NOTE upper case `MorphMap`)
109
116
  import { AclModelInterface } from '@holoyan/adonisjs-permissions/types'
110
117
 
111
118
  @MorphMap('users')
@@ -136,19 +143,16 @@ export default class Post extends BaseModel implements AclModelInterface {
136
143
 
137
144
  ```
138
145
 
139
- ## Release Notes
140
-
141
- Version: >= v1.1.0
142
- * Added support for [Events](#events)
143
-
144
146
  ## Mixins
145
147
 
148
+ ### hasPermissions mixin
149
+
146
150
  If you want to be able to call `Acl` methods on a `User` model then consider using `hasPermissions` mixin
147
151
 
148
152
  ```typescript
149
153
 
150
154
  import { BaseModel, column } from '@adonisjs/lucid/orm'
151
- import { MorphMap } from '@holoyan/adonisjs-permissions'
155
+ import { MorphMap } from '@holoyan/morph-map-js' // (NOTE upper case `MorphMap`)
152
156
  import { AclModelInterface } from '@holoyan/adonisjs-permissions/types'
153
157
 
154
158
  // import mixin
@@ -172,6 +176,61 @@ await user.allow('edit') // give edit permission
172
176
 
173
177
  ```
174
178
 
179
+
180
+ ### permissionQueryHelpers mixin
181
+
182
+ Sometimes you might want to get all users who have a specific permission, for that you can use `permissionQueryHelpers` mixin
183
+
184
+ ```typescript
185
+
186
+ import { permissionQueryHelpers } from '@holoyan/adonisjs-permissions'
187
+
188
+
189
+ @MorphMap('users')
190
+ export default class User extends compose(BaseModel, permissionQueryHelpers()) implements AclModelInterface {
191
+ getModelId(): number {
192
+ return this.id
193
+ }
194
+ // other code goes here
195
+
196
+ // name your scopes whatever you want, make sure to call query helper methods inside the scope
197
+ static whereRoles = scope((query, ...roles: string[]) => {
198
+ // all users who have roles
199
+ new User()._whereRoles(query, User, ...roles)
200
+ })
201
+
202
+ static whereDirectPermissions = scope(
203
+ (query, permissions: string[], target?: AclModel | Function) => {
204
+ // all users who have direct assigned permissions
205
+ new User()._whereDirectPermissions(query, User, permissions, target)
206
+ }
207
+ )
208
+
209
+ static whereRolePermissions = scope(
210
+ (query, permissions: string[], target?: AclModel | Function) => {
211
+ // all users who have permissions assigned through the role
212
+ new User()._whereRolePermissions(query, User, permissions, target)
213
+ }
214
+ )
215
+
216
+ static wherePermissions = scope((query, permissions: string[], target?: AclModel | Function) => {
217
+ // all users who have permissions assigned directly or through the role
218
+ new User()._wherePermissions(query, User, permissions, target)
219
+ })
220
+ }
221
+
222
+ ```
223
+
224
+ And to get all users who have `edit` permission, you can do that like this
225
+
226
+ ```typescript
227
+
228
+ const users = await User.query().withScopes((scopes) => {
229
+ scopes.wherePermissions(['edit'])
230
+ })
231
+
232
+ ```
233
+
175
234
  ## Support
176
235
 
177
236
  ### Database Support
@@ -1011,6 +1070,42 @@ await Acl.model(myUser).allow('create')
1011
1070
 
1012
1071
  ```
1013
1072
 
1073
+
1074
+ You can also disable events per query by calling withoutEvents() method
1075
+
1076
+ ```typescript
1077
+
1078
+ emitter.on(RoleCreatedEvent, () => {
1079
+ console.log('Role created') // this will not be called
1080
+ })
1081
+
1082
+ //
1083
+ await Acl.role().withoutEvents().create({ // this one will not trigger RoleCreatedEvent
1084
+ slug: 'admin',
1085
+ })
1086
+
1087
+ await Acl.role().create({ // this will trigger
1088
+ slug: 'admin',
1089
+ })
1090
+
1091
+ ```
1092
+
1093
+ If you want to completely disable events, you can do that by calling `withoutEvents()` method on the `Acl` class
1094
+
1095
+ ```typescript
1096
+
1097
+ Acl.withoutEvents()
1098
+
1099
+ // any method called on the Acl will not trigger any events
1100
+ emitter.on(RoleCreatedEvent, () => {
1101
+ console.log('Role created') // this will not be called
1102
+ })
1103
+
1104
+ await Acl.role().create({ // this will not trigger because globaly withoutEvents() is set
1105
+ slug: 'admin',
1106
+ })
1107
+ ```
1108
+
1014
1109
  List of events you can listen to:
1015
1110
 
1016
1111
  ```
@@ -1237,6 +1332,7 @@ await Acl.permission(myPermission).detachFromRole(role_slug)
1237
1332
  - [X] Scopes (Multitenancy)
1238
1333
  - [X] UUID support
1239
1334
  - [X] Events
1335
+ - [X] Query helpers
1240
1336
  - [ ] More test coverage
1241
1337
  - [ ] Caching
1242
1338
  - [ ] Integration with AdonisJs Bouncer
@@ -1251,7 +1347,7 @@ await Acl.permission(myPermission).detachFromRole(role_slug)
1251
1347
 
1252
1348
  | AdonisJS Lucid version | Package version |
1253
1349
  |------------------------|-----------------|
1254
- | v20.x | 0.9.x |
1350
+ | v20.x | 0.10.x |
1255
1351
  | v21.x | 1.x |
1256
1352
 
1257
1353
 
package/build/index.d.ts CHANGED
@@ -10,6 +10,5 @@ export { configure } from './configure.js';
10
10
  export { stubsRoot } from './stubs/main.js';
11
11
  export { AclManager, Acl } from './src/acl.js';
12
12
  export { MorphMap, getClassPath } from './src/decorators.js';
13
- export * as morphMapModel from './src/morph_map.js';
14
- export { hasPermissions } from './src/mixins/has_permissions.js';
13
+ export { hasPermissions, permissionQueryHelpers } from './src/mixins/has_permissions.js';
15
14
  export { Scope } from './src/scope.js';
package/build/index.js CHANGED
@@ -18,6 +18,5 @@ export { configure } from './configure.js';
18
18
  export { stubsRoot } from './stubs/main.js';
19
19
  export { AclManager, Acl } from './src/acl.js';
20
20
  export { MorphMap, getClassPath } from './src/decorators.js';
21
- export * as morphMapModel from './src/morph_map.js';
22
- export { hasPermissions } from './src/mixins/has_permissions.js';
21
+ export { hasPermissions, permissionQueryHelpers } from './src/mixins/has_permissions.js';
23
22
  export { Scope } from './src/scope.js';
@@ -1,9 +1,9 @@
1
1
  import { ApplicationService } from '@adonisjs/core/types';
2
2
  import ModelManager from '../src/model_manager.js';
3
- import MorphMap from '../src/morph_map.js';
3
+ import { MorphMapManager } from '@holoyan/morph-map-js';
4
4
  declare module '@adonisjs/core/types' {
5
5
  interface ContainerBindings {
6
- morphMap: MorphMap;
6
+ morphMap: MorphMapManager;
7
7
  modelManager: ModelManager;
8
8
  }
9
9
  }
@@ -4,8 +4,8 @@ import ModelPermission from '../src/models/model_permission.js';
4
4
  import ModelRole from '../src/models/model_role.js';
5
5
  import ModelManager from '../src/model_manager.js';
6
6
  import { AclManager } from '../src/acl.js';
7
- import MorphMap from '../src/morph_map.js';
8
7
  import { Scope } from '../src/scope.js';
8
+ import { morphMap } from '@holoyan/morph-map-js';
9
9
  export default class RolePermissionProvider {
10
10
  app;
11
11
  constructor(app) {
@@ -13,7 +13,7 @@ export default class RolePermissionProvider {
13
13
  }
14
14
  register() {
15
15
  this.app.container.singleton('morphMap', async () => {
16
- return new MorphMap();
16
+ return morphMap;
17
17
  });
18
18
  this.app.container.singleton('modelManager', async () => {
19
19
  return new ModelManager();
@@ -39,8 +39,8 @@ export default class RolePermissionProvider {
39
39
  AclManager.setModelManager(modelManager);
40
40
  AclManager.setEmitter(emitter);
41
41
  const map = await this.app.container.make('morphMap');
42
- map.set('permissions', Permission);
43
- map.set('roles', Role);
42
+ // map.set('permissions', Permission)
43
+ // map.set('roles', Role)
44
44
  AclManager.setMorphMap(map);
45
45
  }
46
46
  }
@@ -1,19 +1,11 @@
1
- import app from '@adonisjs/core/services/app';
1
+ import { morphMap, getClassPath as baseGetClassPath } from '@holoyan/morph-map-js';
2
+ // keep for backward compatibility
2
3
  export function MorphMap(param) {
3
4
  return function (target) {
4
- const service = async function () {
5
- var result = await app.container.make('morphMap');
6
- result.set(param, target);
7
- return param;
8
- };
9
- target.prototype.__morphMapName = service();
5
+ morphMap.set(param, target);
10
6
  target.prototype.__morphMapName = param;
11
7
  };
12
8
  }
13
9
  export function getClassPath(clazz) {
14
- const morphMapName = clazz.prototype.__morphMapName;
15
- if (!morphMapName) {
16
- throw new Error('morph map name not specified');
17
- }
18
- return morphMapName;
10
+ return baseGetClassPath(clazz);
19
11
  }
@@ -1,13 +1,18 @@
1
1
  import type { NormalizeConstructor } from '@adonisjs/core/types/helpers';
2
2
  import { BaseModel } from '@adonisjs/lucid/orm';
3
3
  import { AclModel, ModelIdType } from '../types.js';
4
+ import type { ManyToMany, HasMany } from '@adonisjs/lucid/types/relations';
5
+ import Role from '../models/role.js';
6
+ import { LucidModel, LucidRow, ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
7
+ import { ModelRole, Permission } from '../../index.js';
8
+ import ModelPermission from '../models/model_permission.js';
4
9
  export declare function hasPermissions(): <Model extends NormalizeConstructor<typeof BaseModel>>(superclass: Model) => {
5
10
  new (...args: any[]): {
6
11
  getModelId(): ModelIdType;
7
12
  /**
8
13
  * returns list of roles assigned to the model
9
14
  */
10
- roles(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof import("../models/role.js").default, import("../models/role.js").default>;
15
+ roles(): ModelQueryBuilderContract<typeof Role, Role>;
11
16
  /**
12
17
  * Check if model has role
13
18
  * @param role
@@ -142,13 +147,13 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
142
147
  * @param permission
143
148
  * @param target
144
149
  */
145
- assignDirectPermission(permission: string, target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
150
+ assignDirectPermission(permission: string, target?: AclModel | Function): Promise<ModelPermission[]>;
146
151
  /**
147
152
  * Allow permission for model
148
153
  * @param permission
149
154
  * @param target
150
155
  */
151
- allow(permission: string, target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
156
+ allow(permission: string, target?: AclModel | Function): Promise<ModelPermission[]>;
152
157
  /**
153
158
  * Revoke permission from model
154
159
  * @param permission
@@ -185,7 +190,7 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
185
190
  * @param permissions
186
191
  * @param target
187
192
  */
188
- syncPermissions(permissions: string[], target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
193
+ syncPermissions(permissions: string[], target?: AclModel | Function): Promise<ModelPermission[]>;
189
194
  /**
190
195
  * Forbid permission for model
191
196
  * @param permission
@@ -214,7 +219,7 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
214
219
  $extras: import("@adonisjs/lucid/types/model").ModelObject;
215
220
  $original: import("@adonisjs/lucid/types/model").ModelObject;
216
221
  $preloaded: {
217
- [relation: string]: import("@adonisjs/lucid/types/model").LucidRow | import("@adonisjs/lucid/types/model").LucidRow[];
222
+ [relation: string]: LucidRow | LucidRow[];
218
223
  };
219
224
  $columns: undefined;
220
225
  $sideloaded: import("@adonisjs/lucid/types/model").ModelObject;
@@ -231,14 +236,14 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
231
236
  useTransaction(trx: import("@adonisjs/lucid/types/database").TransactionClientContract): /*elided*/ any;
232
237
  useConnection(connection: string): /*elided*/ any;
233
238
  $getQueryFor(action: "insert", client: import("@adonisjs/lucid/types/database").QueryClientContract): ReturnType<import("@adonisjs/lucid/types/database").QueryClientContract["insertQuery"]>;
234
- $getQueryFor(action: "update" | "delete" | "refresh", client: import("@adonisjs/lucid/types/database").QueryClientContract): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel>;
239
+ $getQueryFor(action: "update" | "delete" | "refresh", client: import("@adonisjs/lucid/types/database").QueryClientContract): ModelQueryBuilderContract<LucidModel>;
235
240
  $setAttribute(key: string, value: any): void;
236
241
  $getAttribute(key: string): any;
237
242
  $getAttributeFromCache(key: string, callback: import("@adonisjs/lucid/types/model").CacheNode["getter"]): any;
238
243
  $hasRelated(key: string): boolean;
239
- $setRelated(key: string, result: import("@adonisjs/lucid/types/querybuilder").OneOrMany<import("@adonisjs/lucid/types/model").LucidRow> | null): void;
240
- $pushRelated(key: string, result: import("@adonisjs/lucid/types/querybuilder").OneOrMany<import("@adonisjs/lucid/types/model").LucidRow> | null): void;
241
- $getRelated(key: string, defaultValue?: any): import("@adonisjs/lucid/types/querybuilder").OneOrMany<import("@adonisjs/lucid/types/model").LucidRow> | undefined | null;
244
+ $setRelated(key: string, result: import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | null): void;
245
+ $pushRelated(key: string, result: import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | null): void;
246
+ $getRelated(key: string, defaultValue?: any): import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | undefined | null;
242
247
  $consumeAdapterResult(adapterResult: import("@adonisjs/lucid/types/model").ModelObject, sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject): void;
243
248
  $hydrateOriginals(): void;
244
249
  fill(value: Partial<{}>, allowExtraProperties?: boolean): /*elided*/ any;
@@ -246,28 +251,30 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
246
251
  isDirty(fields?: undefined[] | undefined): boolean;
247
252
  enableForceUpdate(): /*elided*/ any;
248
253
  save(): Promise</*elided*/ any>;
254
+ saveQuietly(): Promise</*elided*/ any>;
249
255
  lockForUpdate<T>(callback: (user: /*elided*/ any) => T | Promise<T>): Promise<T>;
250
256
  delete(): Promise<void>;
257
+ deleteQuietly(): Promise<void>;
251
258
  refresh(): Promise</*elided*/ any>;
252
259
  load: import("@adonisjs/lucid/types/model").LucidRowPreload</*elided*/ any>;
253
260
  loadOnce: import("@adonisjs/lucid/types/model").LucidRowPreloadOnce</*elided*/ any>;
254
261
  preload: import("@adonisjs/lucid/types/model").LucidRowPreload</*elided*/ any>;
255
- loadAggregate: <Self extends /*elided*/ any, Name extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder = Self[Name] extends import("@adonisjs/lucid/types/relations").ModelRelations<import("@adonisjs/lucid/types/model").LucidModel, import("@adonisjs/lucid/types/model").LucidModel> ? Self[Name]["subQuery"] : never>(name: Name, callback: (builder: RelatedBuilder) => void) => import("@adonisjs/lucid/types/model").LazyLoadAggregatesContract<Self>;
256
- loadCount: <Self extends /*elided*/ any, Name_1 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder_1 = Self[Name_1] extends import("@adonisjs/lucid/types/relations").ModelRelations<import("@adonisjs/lucid/types/model").LucidModel, import("@adonisjs/lucid/types/model").LucidModel> ? Self[Name_1]["subQuery"] : never>(name: Name_1, callback?: ((builder: RelatedBuilder_1) => void) | undefined) => import("@adonisjs/lucid/types/model").LazyLoadAggregatesContract<Self>;
262
+ loadAggregate: <Self extends /*elided*/ any, Name extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder = Self[Name] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? Self[Name]["subQuery"] : never>(name: Name, callback: (builder: RelatedBuilder) => void) => import("@adonisjs/lucid/types/model").LazyLoadAggregatesContract<Self>;
263
+ loadCount: <Self extends /*elided*/ any, Name_1 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder_1 = Self[Name_1] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? Self[Name_1]["subQuery"] : never>(name: Name_1, callback?: ((builder: RelatedBuilder_1) => void) | undefined) => import("@adonisjs/lucid/types/model").LazyLoadAggregatesContract<Self>;
257
264
  serializeAttributes(fields?: import("@adonisjs/lucid/types/model").CherryPickFields, raw?: boolean): import("@adonisjs/lucid/types/model").ModelObject;
258
265
  serializeComputed(fields?: import("@adonisjs/lucid/types/model").CherryPickFields): import("@adonisjs/lucid/types/model").ModelObject;
259
266
  serializeRelations(fields: undefined, raw: true): {
260
- [key: string]: import("@adonisjs/lucid/types/model").LucidRow | import("@adonisjs/lucid/types/model").LucidRow[];
267
+ [key: string]: LucidRow | LucidRow[];
261
268
  };
262
269
  serializeRelations(cherryPick: import("@adonisjs/lucid/types/model").CherryPick["relations"] | undefined, raw: false | undefined): import("@adonisjs/lucid/types/model").ModelObject;
263
270
  serializeRelations(cherryPick?: import("@adonisjs/lucid/types/model").CherryPick["relations"], raw?: boolean): import("@adonisjs/lucid/types/model").ModelObject;
264
271
  serialize(cherryPick?: import("@adonisjs/lucid/types/model").CherryPick): import("@adonisjs/lucid/types/model").ModelObject;
265
272
  toObject(): import("@adonisjs/lucid/types/model").ModelObject;
266
273
  toJSON(): import("@adonisjs/lucid/types/model").ModelObject;
267
- related<Name_2 extends undefined>(relation: Name_2): /*elided*/ any[Name_2] extends import("@adonisjs/lucid/types/relations").ModelRelations<import("@adonisjs/lucid/types/model").LucidModel, import("@adonisjs/lucid/types/model").LucidModel> ? /*elided*/ any[Name_2]["client"] : never;
274
+ related<Name_2 extends undefined>(relation: Name_2): /*elided*/ any[Name_2] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? /*elided*/ any[Name_2]["client"] : never;
268
275
  };
269
- find: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
270
- all: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
276
+ find: <T extends LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
277
+ all: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
271
278
  namingStrategy: import("@adonisjs/lucid/types/model").NamingStrategyContract;
272
279
  connection?: string | undefined;
273
280
  readonly booted: boolean;
@@ -288,57 +295,204 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
288
295
  serializedToColumns: import("@adonisjs/lucid/types/model").ModelKeysContract;
289
296
  serializedToAttributes: import("@adonisjs/lucid/types/model").ModelKeysContract;
290
297
  };
291
- $createFromAdapterResult: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, result?: import("@adonisjs/lucid/types/model").ModelObject, sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => null | InstanceType<T>;
292
- $createMultipleFromAdapterResult: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, results: import("@adonisjs/lucid/types/model").ModelObject[], sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => InstanceType<T>[];
298
+ $createFromAdapterResult: <T extends LucidModel>(this: T, result?: import("@adonisjs/lucid/types/model").ModelObject, sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => null | InstanceType<T>;
299
+ $createMultipleFromAdapterResult: <T extends LucidModel>(this: T, results: import("@adonisjs/lucid/types/model").ModelObject[], sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => InstanceType<T>[];
293
300
  $addColumn: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ColumnOptions>) => import("@adonisjs/lucid/types/model").ColumnOptions;
294
301
  $hasColumn: (name: string) => boolean;
295
302
  $getColumn: (name: string) => import("@adonisjs/lucid/types/model").ModelColumnOptions | undefined;
296
303
  $addComputed: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ComputedOptions>) => import("@adonisjs/lucid/types/model").ComputedOptions;
297
304
  $hasComputed: (name: string) => boolean;
298
305
  $getComputed: (name: string) => import("@adonisjs/lucid/types/model").ComputedOptions | undefined;
299
- $addRelation: (name: string, type: import("@adonisjs/lucid/types/relations").ModelRelationTypes["__opaque_type"], relatedModel: () => import("@adonisjs/lucid/types/model").LucidModel, options: import("@adonisjs/lucid/types/model").ModelRelationOptions) => void;
306
+ $addRelation: (name: string, type: import("@adonisjs/lucid/types/relations").ModelRelationTypes["__opaque_type"], relatedModel: () => LucidModel, options: import("@adonisjs/lucid/types/model").ModelRelationOptions) => void;
300
307
  $hasRelation: (name: string) => boolean;
301
308
  $getRelation: {
302
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Name_2 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<InstanceType<Model_1>>>(this: Model_1, name: Name_2): InstanceType<Model_1>[Name_2] extends import("@adonisjs/lucid/types/relations").ModelRelations<import("@adonisjs/lucid/types/model").LucidModel, import("@adonisjs/lucid/types/model").LucidModel> ? InstanceType<Model_1>[Name_2]["client"]["relation"] : import("@adonisjs/lucid/types/relations").RelationshipsContract;
303
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model_1, name: string): import("@adonisjs/lucid/types/relations").RelationshipsContract;
309
+ <Model_1 extends LucidModel, Name_2 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<InstanceType<Model_1>>>(this: Model_1, name: Name_2): InstanceType<Model_1>[Name_2] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? InstanceType<Model_1>[Name_2]["client"]["relation"] : import("@adonisjs/lucid/types/relations").RelationshipsContract;
310
+ <Model_1 extends LucidModel>(this: Model_1, name: string): import("@adonisjs/lucid/types/relations").RelationshipsContract;
304
311
  };
305
- $defineProperty: <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model_1>(this: Model_1, propertyName: Prop, defaultValue: Model_1[Prop], strategy: "inherit" | "define" | ((value: Model_1[Prop]) => Model_1[Prop])) => void;
312
+ $defineProperty: <Model_1 extends LucidModel, Prop extends keyof Model_1>(this: Model_1, propertyName: Prop, defaultValue: Model_1[Prop], strategy: "inherit" | "define" | ((value: Model_1[Prop]) => Model_1[Prop])) => void;
306
313
  boot: () => void;
307
314
  before: {
308
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model_1, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model_1>, Event>): void;
309
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model_1, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model_1>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model_1>], "paginate">): void;
310
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Event_1 extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event_1, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event_1>): void;
315
+ <Model_1 extends LucidModel, Event extends "find" | "fetch">(this: Model_1, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<ModelQueryBuilderContract<Model_1>, Event>): void;
316
+ <Model_1 extends LucidModel>(this: Model_1, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[ModelQueryBuilderContract<Model_1>, ModelQueryBuilderContract<Model_1>], "paginate">): void;
317
+ <Model_1 extends LucidModel, Event_1 extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event_1, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event_1>): void;
311
318
  };
312
319
  after: {
313
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model_1, event: "fetch", handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>[], "fetch">): void;
314
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model_1, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model_1>>, "paginate">): void;
315
- <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Event_2 extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event_2, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event_2>): void;
320
+ <Model_1 extends LucidModel>(this: Model_1, event: "fetch", handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>[], "fetch">): void;
321
+ <Model_1 extends LucidModel>(this: Model_1, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model_1>>, "paginate">): void;
322
+ <Model_1 extends LucidModel, Event_2 extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event_2, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event_2>): void;
316
323
  };
317
- create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
318
- createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
319
- findOrFail: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
324
+ create: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
325
+ createQuietly: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
326
+ createMany: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
327
+ createManyQuietly: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
328
+ findOrFail: <T extends LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
320
329
  findBy: {
321
- <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<null | InstanceType<T>>;
322
- <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<null | InstanceType<T>>;
330
+ <T extends LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<null | InstanceType<T>>;
331
+ <T extends LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<null | InstanceType<T>>;
323
332
  };
324
333
  findByOrFail: {
325
- <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>>;
326
- <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>>;
334
+ <T extends LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>>;
335
+ <T extends LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>>;
327
336
  };
328
337
  findManyBy: {
329
- <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
330
- <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
338
+ <T extends LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
339
+ <T extends LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
331
340
  };
332
- first: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
333
- firstOrFail: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
334
- findMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, value: any[], options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
335
- firstOrNew: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
336
- firstOrCreate: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
337
- updateOrCreate: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, updatePayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
338
- fetchOrNewUpMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
339
- fetchOrCreateMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
340
- updateOrCreateMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
341
- query: <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Result = InstanceType<Model_1>>(this: Model_1, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model_1, Result>;
341
+ first: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
342
+ firstOrFail: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
343
+ findMany: <T extends LucidModel>(this: T, value: any[], options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
344
+ firstOrNew: <T extends LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
345
+ firstOrCreate: <T extends LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
346
+ updateOrCreate: <T extends LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, updatePayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
347
+ fetchOrNewUpMany: <T extends LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
348
+ fetchOrCreateMany: <T extends LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
349
+ updateOrCreateMany: <T extends LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
350
+ query: <Model_1 extends LucidModel, Result = InstanceType<Model_1>>(this: Model_1, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => ModelQueryBuilderContract<Model_1, Result>;
351
+ transaction: import("@adonisjs/lucid/types/database").TransactionFn;
352
+ truncate: (cascade?: boolean) => Promise<void>;
353
+ } & Model;
354
+ export declare function permissionQueryHelpers(): <Model extends NormalizeConstructor<typeof BaseModel>>(superclass: Model) => {
355
+ new (...args: any[]): {
356
+ _roles: ManyToMany<typeof Role>;
357
+ _whereRoles<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, ...roles: string[]): ModelQueryBuilderContract<LucidModel, LucidRow>;
358
+ _permissions: ManyToMany<typeof Permission>;
359
+ _whereDirectPermissions<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, permissions: string[], target?: AclModel | Function): ModelQueryBuilderContract<LucidModel, LucidRow>;
360
+ _model_roles: HasMany<typeof ModelRole>;
361
+ _whereRolePermissions<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, permissions: string[], target?: AclModel | Function): ModelQueryBuilderContract<LucidModel, LucidRow>;
362
+ _wherePermissions<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, permissions: string[], target?: AclModel | Function): void;
363
+ $attributes: import("@adonisjs/lucid/types/model").ModelObject;
364
+ $extras: import("@adonisjs/lucid/types/model").ModelObject;
365
+ $original: import("@adonisjs/lucid/types/model").ModelObject;
366
+ $preloaded: {
367
+ [relation: string]: LucidRow | LucidRow[];
368
+ };
369
+ $columns: undefined;
370
+ $sideloaded: import("@adonisjs/lucid/types/model").ModelObject;
371
+ $primaryKeyValue?: number | string;
372
+ $isPersisted: boolean;
373
+ $isNew: boolean;
374
+ $isLocal: boolean;
375
+ $dirty: import("@adonisjs/lucid/types/model").ModelObject;
376
+ $isDirty: boolean;
377
+ $isDeleted: boolean;
378
+ $options?: import("@adonisjs/lucid/types/model").ModelOptions;
379
+ $trx?: import("@adonisjs/lucid/types/database").TransactionClientContract;
380
+ $setOptionsAndTrx(options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): void;
381
+ useTransaction(trx: import("@adonisjs/lucid/types/database").TransactionClientContract): /*elided*/ any;
382
+ useConnection(connection: string): /*elided*/ any;
383
+ $getQueryFor(action: "insert", client: import("@adonisjs/lucid/types/database").QueryClientContract): ReturnType<import("@adonisjs/lucid/types/database").QueryClientContract["insertQuery"]>;
384
+ $getQueryFor(action: "update" | "delete" | "refresh", client: import("@adonisjs/lucid/types/database").QueryClientContract): ModelQueryBuilderContract<LucidModel>;
385
+ $setAttribute(key: string, value: any): void;
386
+ $getAttribute(key: string): any;
387
+ $getAttributeFromCache(key: string, callback: import("@adonisjs/lucid/types/model").CacheNode["getter"]): any;
388
+ $hasRelated(key: string): boolean;
389
+ $setRelated(key: string, result: import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | null): void;
390
+ $pushRelated(key: string, result: import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | null): void;
391
+ $getRelated(key: string, defaultValue?: any): import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | undefined | null;
392
+ $consumeAdapterResult(adapterResult: import("@adonisjs/lucid/types/model").ModelObject, sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject): void;
393
+ $hydrateOriginals(): void;
394
+ fill(value: Partial<{}>, allowExtraProperties?: boolean): /*elided*/ any;
395
+ merge(value: Partial<{}>, allowExtraProperties?: boolean): /*elided*/ any;
396
+ isDirty(fields?: undefined[] | undefined): boolean;
397
+ enableForceUpdate(): /*elided*/ any;
398
+ save(): Promise</*elided*/ any>;
399
+ saveQuietly(): Promise</*elided*/ any>;
400
+ lockForUpdate<T>(callback: (user: /*elided*/ any) => T | Promise<T>): Promise<T>;
401
+ delete(): Promise<void>;
402
+ deleteQuietly(): Promise<void>;
403
+ refresh(): Promise</*elided*/ any>;
404
+ load: import("@adonisjs/lucid/types/model").LucidRowPreload</*elided*/ any>;
405
+ loadOnce: import("@adonisjs/lucid/types/model").LucidRowPreloadOnce</*elided*/ any>;
406
+ preload: import("@adonisjs/lucid/types/model").LucidRowPreload</*elided*/ any>;
407
+ loadAggregate: <Self extends /*elided*/ any, Name extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder = Self[Name] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? Self[Name]["subQuery"] : never>(name: Name, callback: (builder: RelatedBuilder) => void) => import("@adonisjs/lucid/types/model").LazyLoadAggregatesContract<Self>;
408
+ loadCount: <Self extends /*elided*/ any, Name_1 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder_1 = Self[Name_1] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? Self[Name_1]["subQuery"] : never>(name: Name_1, callback?: ((builder: RelatedBuilder_1) => void) | undefined) => import("@adonisjs/lucid/types/model").LazyLoadAggregatesContract<Self>;
409
+ serializeAttributes(fields?: import("@adonisjs/lucid/types/model").CherryPickFields, raw?: boolean): import("@adonisjs/lucid/types/model").ModelObject;
410
+ serializeComputed(fields?: import("@adonisjs/lucid/types/model").CherryPickFields): import("@adonisjs/lucid/types/model").ModelObject;
411
+ serializeRelations(fields: undefined, raw: true): {
412
+ [key: string]: LucidRow | LucidRow[];
413
+ };
414
+ serializeRelations(cherryPick: import("@adonisjs/lucid/types/model").CherryPick["relations"] | undefined, raw: false | undefined): import("@adonisjs/lucid/types/model").ModelObject;
415
+ serializeRelations(cherryPick?: import("@adonisjs/lucid/types/model").CherryPick["relations"], raw?: boolean): import("@adonisjs/lucid/types/model").ModelObject;
416
+ serialize(cherryPick?: import("@adonisjs/lucid/types/model").CherryPick): import("@adonisjs/lucid/types/model").ModelObject;
417
+ toObject(): import("@adonisjs/lucid/types/model").ModelObject;
418
+ toJSON(): import("@adonisjs/lucid/types/model").ModelObject;
419
+ related<Name_2 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations</*elided*/ any>>(relation: Name_2): /*elided*/ any[Name_2] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? /*elided*/ any[Name_2]["client"] : never;
420
+ };
421
+ find: <T extends LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
422
+ all: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
423
+ namingStrategy: import("@adonisjs/lucid/types/model").NamingStrategyContract;
424
+ connection?: string | undefined;
425
+ readonly booted: boolean;
426
+ $columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
427
+ $relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
428
+ $computedDefinitions: Map<string, import("@adonisjs/lucid/types/model").ComputedOptions>;
429
+ primaryKey: string;
430
+ table: string;
431
+ selfAssignPrimaryKey: boolean;
432
+ $adapter: import("@adonisjs/lucid/types/model").AdapterContract;
433
+ useAdapter: (adapter: import("@adonisjs/lucid/types/model").AdapterContract) => void;
434
+ $hooks: import("@poppinss/hooks").default<any>;
435
+ $keys: {
436
+ attributesToColumns: import("@adonisjs/lucid/types/model").ModelKeysContract;
437
+ attributesToSerialized: import("@adonisjs/lucid/types/model").ModelKeysContract;
438
+ columnsToAttributes: import("@adonisjs/lucid/types/model").ModelKeysContract;
439
+ columnsToSerialized: import("@adonisjs/lucid/types/model").ModelKeysContract;
440
+ serializedToColumns: import("@adonisjs/lucid/types/model").ModelKeysContract;
441
+ serializedToAttributes: import("@adonisjs/lucid/types/model").ModelKeysContract;
442
+ };
443
+ $createFromAdapterResult: <T extends LucidModel>(this: T, result?: import("@adonisjs/lucid/types/model").ModelObject, sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => null | InstanceType<T>;
444
+ $createMultipleFromAdapterResult: <T extends LucidModel>(this: T, results: import("@adonisjs/lucid/types/model").ModelObject[], sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => InstanceType<T>[];
445
+ $addColumn: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ColumnOptions>) => import("@adonisjs/lucid/types/model").ColumnOptions;
446
+ $hasColumn: (name: string) => boolean;
447
+ $getColumn: (name: string) => import("@adonisjs/lucid/types/model").ModelColumnOptions | undefined;
448
+ $addComputed: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ComputedOptions>) => import("@adonisjs/lucid/types/model").ComputedOptions;
449
+ $hasComputed: (name: string) => boolean;
450
+ $getComputed: (name: string) => import("@adonisjs/lucid/types/model").ComputedOptions | undefined;
451
+ $addRelation: (name: string, type: import("@adonisjs/lucid/types/relations").ModelRelationTypes["__opaque_type"], relatedModel: () => LucidModel, options: import("@adonisjs/lucid/types/model").ModelRelationOptions) => void;
452
+ $hasRelation: (name: string) => boolean;
453
+ $getRelation: {
454
+ <Model_1 extends LucidModel, Name_2 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<InstanceType<Model_1>>>(this: Model_1, name: Name_2): InstanceType<Model_1>[Name_2] extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? InstanceType<Model_1>[Name_2]["client"]["relation"] : import("@adonisjs/lucid/types/relations").RelationshipsContract;
455
+ <Model_1 extends LucidModel>(this: Model_1, name: string): import("@adonisjs/lucid/types/relations").RelationshipsContract;
456
+ };
457
+ $defineProperty: <Model_1 extends LucidModel, Prop extends keyof Model_1>(this: Model_1, propertyName: Prop, defaultValue: Model_1[Prop], strategy: "inherit" | "define" | ((value: Model_1[Prop]) => Model_1[Prop])) => void;
458
+ boot: () => void;
459
+ before: {
460
+ <Model_1 extends LucidModel, Event extends "find" | "fetch">(this: Model_1, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<ModelQueryBuilderContract<Model_1>, Event>): void;
461
+ <Model_1 extends LucidModel>(this: Model_1, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[ModelQueryBuilderContract<Model_1>, ModelQueryBuilderContract<Model_1>], "paginate">): void;
462
+ <Model_1 extends LucidModel, Event_1 extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event_1, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event_1>): void;
463
+ };
464
+ after: {
465
+ <Model_1 extends LucidModel>(this: Model_1, event: "fetch", handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>[], "fetch">): void;
466
+ <Model_1 extends LucidModel>(this: Model_1, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model_1>>, "paginate">): void;
467
+ <Model_1 extends LucidModel, Event_2 extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event_2, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event_2>): void;
468
+ };
469
+ create: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
470
+ createQuietly: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
471
+ createMany: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
472
+ createManyQuietly: <T extends LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
473
+ findOrFail: <T extends LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
474
+ findBy: {
475
+ <T extends LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<null | InstanceType<T>>;
476
+ <T extends LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<null | InstanceType<T>>;
477
+ };
478
+ findByOrFail: {
479
+ <T extends LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>>;
480
+ <T extends LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>>;
481
+ };
482
+ findManyBy: {
483
+ <T extends LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
484
+ <T extends LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
485
+ };
486
+ first: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
487
+ firstOrFail: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
488
+ findMany: <T extends LucidModel>(this: T, value: any[], options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
489
+ firstOrNew: <T extends LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
490
+ firstOrCreate: <T extends LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
491
+ updateOrCreate: <T extends LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, updatePayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
492
+ fetchOrNewUpMany: <T extends LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
493
+ fetchOrCreateMany: <T extends LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
494
+ updateOrCreateMany: <T extends LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
495
+ query: <Model_1 extends LucidModel, Result = InstanceType<Model_1>>(this: Model_1, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => ModelQueryBuilderContract<Model_1, Result>;
342
496
  transaction: import("@adonisjs/lucid/types/database").TransactionFn;
343
497
  truncate: (cascade?: boolean) => Promise<void>;
344
498
  } & Model;
@@ -1,4 +1,16 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { manyToMany, hasMany } from '@adonisjs/lucid/orm';
1
8
  import { Acl } from '../acl.js';
9
+ import Role from '../models/role.js';
10
+ import { ModelRole, Permission } from '../../index.js';
11
+ import ModelPermission from '../models/model_permission.js';
12
+ import { morphMap } from '@holoyan/morph-map-js';
13
+ import { applyTargetRestriction, destructTarget } from '../services/helper.js';
2
14
  export function hasPermissions() {
3
15
  return (superclass) => {
4
16
  class HasPermissionsMixin extends superclass {
@@ -295,3 +307,102 @@ export function hasPermissions() {
295
307
  return HasPermissionsMixin;
296
308
  };
297
309
  }
310
+ export function permissionQueryHelpers() {
311
+ return (superclass) => {
312
+ class QueryHelpersMixin extends superclass {
313
+ _whereRoles(query, targetClass, ...roles) {
314
+ return query.whereHas(
315
+ // @ts-ignore
316
+ '_roles', (rolesQuery) => {
317
+ rolesQuery.whereIn('slug', roles).where('model_type', morphMap.getAlias(targetClass));
318
+ });
319
+ }
320
+ _whereDirectPermissions(query, targetClass, permissions, target) {
321
+ return query.whereHas(
322
+ // @ts-ignore
323
+ '_permissions', (permissionsQuery) => {
324
+ const entity = destructTarget(morphMap, target);
325
+ permissionsQuery
326
+ .whereIn('slug', permissions)
327
+ .where('model_type', morphMap.getAlias(targetClass))
328
+ .whereNotExists((subQuery) => {
329
+ subQuery
330
+ .from(Permission.table + ' as p2')
331
+ .leftJoin(ModelPermission.table + ' as mp2', 'mp2.permission_id', '=', 'p2.id')
332
+ .where('p2.allowed', false)
333
+ .whereRaw('p2.slug=' + Permission.table + '.slug')
334
+ .whereRaw('p2.scope=' + Permission.table + '.scope')
335
+ .whereColumn('mp2.model_id', targetClass.table + '.id')
336
+ .where('mp2.model_type', morphMap.getAlias(targetClass))
337
+ .select('p2.slug')
338
+ .groupBy('p2.slug');
339
+ });
340
+ applyTargetRestriction(Permission.table, permissionsQuery, entity.targetClass, entity.targetId);
341
+ });
342
+ }
343
+ _whereRolePermissions(query, targetClass, permissions, target) {
344
+ return query.whereHas(
345
+ // @ts-ignore
346
+ '_model_roles', (rolesQuery) => {
347
+ const entity = destructTarget(morphMap, target);
348
+ rolesQuery
349
+ .where(ModelRole.table + '.model_type', morphMap.getAlias(targetClass))
350
+ .join(ModelPermission.table + ' as mp', 'mp.model_id', '=', ModelRole.table + '.role_id')
351
+ .where('mp.model_type', 'roles')
352
+ .join(Permission.table + ' as p', 'p.id', '=', 'mp.permission_id')
353
+ .whereIn('p.slug', permissions)
354
+ .whereNotExists((subQuery) => {
355
+ subQuery
356
+ .from(Permission.table + ' as p2')
357
+ .leftJoin(ModelPermission.table + ' as mp2', 'mp2.permission_id', '=', 'p2.id')
358
+ .where('p2.allowed', false)
359
+ .whereRaw('p2.slug=' + 'p.slug')
360
+ .whereRaw('p2.scope=' + 'p.scope')
361
+ .whereColumn('mp2.model_id', targetClass.table + '.id')
362
+ .where('mp2.model_type', morphMap.getAlias(targetClass))
363
+ .select('p2.slug')
364
+ .groupBy('p2.slug');
365
+ });
366
+ applyTargetRestriction('p', rolesQuery, entity.targetClass, entity.targetId);
367
+ });
368
+ }
369
+ _wherePermissions(query, targetClass, permissions, target) {
370
+ query
371
+ .where((subQuery) => {
372
+ this._whereDirectPermissions(subQuery, targetClass, permissions, target);
373
+ })
374
+ .orWhere((subQuery) => {
375
+ this._whereRolePermissions(subQuery, targetClass, permissions, target);
376
+ });
377
+ }
378
+ }
379
+ __decorate([
380
+ manyToMany(() => Role, {
381
+ localKey: 'id',
382
+ relatedKey: 'id',
383
+ pivotForeignKey: 'model_id',
384
+ pivotRelatedForeignKey: 'role_id',
385
+ pivotTable: 'model_roles',
386
+ pivotColumns: ['model_type'],
387
+ pivotTimestamps: true,
388
+ })
389
+ ], QueryHelpersMixin.prototype, "_roles", void 0);
390
+ __decorate([
391
+ manyToMany(() => Permission, {
392
+ localKey: 'id',
393
+ relatedKey: 'id',
394
+ pivotForeignKey: 'model_id',
395
+ pivotRelatedForeignKey: 'permission_id',
396
+ pivotTable: 'model_permissions',
397
+ pivotColumns: ['model_type'],
398
+ pivotTimestamps: true,
399
+ })
400
+ ], QueryHelpersMixin.prototype, "_permissions", void 0);
401
+ __decorate([
402
+ hasMany(() => ModelRole, {
403
+ foreignKey: 'modelId',
404
+ })
405
+ ], QueryHelpersMixin.prototype, "_model_roles", void 0);
406
+ return QueryHelpersMixin;
407
+ };
408
+ }
@@ -6,7 +6,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { v4 as uuidv4 } from 'uuid';
8
8
  import { BaseModel, beforeCreate, column } from '@adonisjs/lucid/orm';
9
- export default class Permission extends BaseModel {
9
+ import { MorphMap } from '@holoyan/morph-map-js';
10
+ let Permission = class Permission extends BaseModel {
10
11
  static uuidSupport = false;
11
12
  static assignUuid(permission) {
12
13
  if (this.uuidSupport) {
@@ -16,7 +17,7 @@ export default class Permission extends BaseModel {
16
17
  getModelId() {
17
18
  return this.id;
18
19
  }
19
- }
20
+ };
20
21
  __decorate([
21
22
  column({ isPrimary: true })
22
23
  ], Permission.prototype, "id", void 0);
@@ -47,3 +48,7 @@ __decorate([
47
48
  __decorate([
48
49
  beforeCreate()
49
50
  ], Permission, "assignUuid", null);
51
+ Permission = __decorate([
52
+ MorphMap('permissions')
53
+ ], Permission);
54
+ export default Permission;
@@ -6,7 +6,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { BaseModel, beforeCreate, column } from '@adonisjs/lucid/orm';
8
8
  import { v4 as uuidv4 } from 'uuid';
9
- export default class Role extends BaseModel {
9
+ import { MorphMap } from '@holoyan/morph-map-js';
10
+ let Role = class Role extends BaseModel {
10
11
  static uuidSupport = false;
11
12
  static assignUuid(role) {
12
13
  if (this.uuidSupport) {
@@ -16,7 +17,7 @@ export default class Role extends BaseModel {
16
17
  getModelId() {
17
18
  return this.id;
18
19
  }
19
- }
20
+ };
20
21
  __decorate([
21
22
  column({ isPrimary: true })
22
23
  ], Role.prototype, "id", void 0);
@@ -47,3 +48,7 @@ __decorate([
47
48
  __decorate([
48
49
  beforeCreate()
49
50
  ], Role, "assignUuid", null);
51
+ Role = __decorate([
52
+ MorphMap('roles')
53
+ ], Role);
54
+ export default Role;
@@ -1,4 +1,7 @@
1
- import { AclModel, MorphInterface } from '../types.js';
1
+ import { AclModel, ModelIdType, MorphInterface, PermissionInterface } from '../types.js';
2
+ import type { ManyToManySubQueryBuilderContract, RelationSubQueryBuilderContract } from '@adonisjs/lucid/types/relations';
3
+ import { ModelRole, Permission } from '../../index.js';
4
+ import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
2
5
  export declare function formatList(models: (string | number | any)[]): {
3
6
  slugs: string[];
4
7
  ids: number[];
@@ -11,10 +14,11 @@ export declare function formatStringNumbers(models: string | number | any): {
11
14
  slugs: string[];
12
15
  ids: number[];
13
16
  };
14
- export declare function destructTarget(map: MorphInterface, target?: AclModel | Function): Promise<{
17
+ export declare function destructTarget(map: MorphInterface, target?: AclModel | Function): {
15
18
  targetClass: null;
16
19
  targetId: null;
17
20
  } | {
18
21
  targetClass: string;
19
- targetId: import("../types.js").ModelIdType | null;
20
- }>;
22
+ targetId: ModelIdType | null;
23
+ };
24
+ export declare function applyTargetRestriction(table: string, q: ManyToManySubQueryBuilderContract<typeof Permission> | ModelQueryBuilderContract<typeof Permission, PermissionInterface> | RelationSubQueryBuilderContract<typeof ModelRole>, entityType: string | null, entityId: ModelIdType | null): void;
@@ -47,7 +47,7 @@ export function formatStringNumbers(models) {
47
47
  }
48
48
  return { slugs, ids };
49
49
  }
50
- export async function destructTarget(map, target) {
50
+ export function destructTarget(map, target) {
51
51
  if (!target) {
52
52
  return {
53
53
  targetClass: null,
@@ -62,3 +62,21 @@ export async function destructTarget(map, target) {
62
62
  function isAclModelInterface(obj) {
63
63
  return typeof obj === 'object' && typeof obj.getModelId === 'function';
64
64
  }
65
+ export function applyTargetRestriction(table, q, entityType, entityId) {
66
+ if (entityType) {
67
+ q.where((query) => {
68
+ query.where(table + '.entity_type', entityType).orWhere(table + '.entity_type', '*');
69
+ });
70
+ if (entityId) {
71
+ q.where((query) => {
72
+ query.where(table + '.entity_id', entityId).orWhereNull(table + '.entity_id');
73
+ });
74
+ }
75
+ else {
76
+ q.whereNull(table + '.entity_id');
77
+ }
78
+ }
79
+ else {
80
+ q.where(table + '.entity_type', '*').whereNull(table + '.entity_id');
81
+ }
82
+ }
@@ -186,22 +186,22 @@ export class ModelHasRolePermissions extends BaseAdapter {
186
186
  * @param target
187
187
  */
188
188
  async hasAllPermissions(permissions, target) {
189
- const entity = await destructTarget(this.map, target);
189
+ const entity = destructTarget(this.map, target);
190
190
  return await this.permissionService.hasAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
191
191
  }
192
192
  async hasAnyPermission(permissions, target) {
193
- const entity = await destructTarget(this.map, target);
193
+ const entity = destructTarget(this.map, target);
194
194
  return await this.permissionService.hasAny(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
195
195
  }
196
196
  async hasAnyDirectPermission(permissions, target) {
197
- const entity = await destructTarget(this.map, target);
197
+ const entity = destructTarget(this.map, target);
198
198
  return await this.permissionService.hasAnyDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
199
199
  }
200
200
  async hasDirectPermission(permission, target) {
201
201
  return this.hasAnyDirectPermission([permission], target);
202
202
  }
203
203
  async hasAllPermissionsDirect(permissions, target) {
204
- const entity = await destructTarget(this.map, target);
204
+ const entity = destructTarget(this.map, target);
205
205
  return await this.permissionService.hasAllDirect(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
206
206
  }
207
207
  can(permission, target) {
@@ -227,7 +227,7 @@ export class ModelHasRolePermissions extends BaseAdapter {
227
227
  * @param target
228
228
  */
229
229
  async assignDirectAllPermissions(permissions, target) {
230
- const entity = await destructTarget(this.map, target);
230
+ const entity = destructTarget(this.map, target);
231
231
  const assigned = await this.permissionService.giveAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId, true);
232
232
  this.fire(PermissionsAttachedToModelEvent, assigned.map((item) => item.permissionId), this.model);
233
233
  return assigned;
@@ -282,7 +282,7 @@ export class ModelHasRolePermissions extends BaseAdapter {
282
282
  * @param target
283
283
  */
284
284
  async revokeAllPermissions(permissions, target) {
285
- const entity = await destructTarget(this.map, target);
285
+ const entity = destructTarget(this.map, target);
286
286
  const revoked = this.permissionService.revokeAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
287
287
  this.fire(PermissionsDetachedFromModelEvent, permissions, this.model);
288
288
  return revoked;
@@ -320,7 +320,7 @@ export class ModelHasRolePermissions extends BaseAdapter {
320
320
  * @param target
321
321
  */
322
322
  async forbidAll(permissions, target) {
323
- const entity = await destructTarget(this.map, target);
323
+ const entity = destructTarget(this.map, target);
324
324
  const forbade = await this.permissionService.forbidAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
325
325
  this.fire(PermissionsForbadeEvent, forbade.map((item) => item.permissionId), this.model);
326
326
  }
@@ -329,7 +329,7 @@ export class ModelHasRolePermissions extends BaseAdapter {
329
329
  * @param target
330
330
  */
331
331
  async unforbidAll(permissions, target) {
332
- const entity = await destructTarget(this.map, target);
332
+ const entity = destructTarget(this.map, target);
333
333
  const unforbade = await this.permissionService.unforbidAll(this.map.getAlias(this.model), this.model.getModelId(), permissions, entity.targetClass, entity.targetId);
334
334
  if (unforbade.length) {
335
335
  this.fire(PermissionsUnForbadeEvent, unforbade.map((item) => item.permissionId), this.model);
@@ -84,7 +84,7 @@ export default class PermissionHasModelRoles extends BaseAdapter {
84
84
  }
85
85
  role = String(r.id);
86
86
  }
87
- const entity = await destructTarget(this.map, target);
87
+ const entity = destructTarget(this.map, target);
88
88
  const attached = await this.permissionService.giveAll(this.map.getAlias(this.roleClassName), role, [this.permission.slug], entity.targetClass, entity.targetId, true);
89
89
  if (attached.length > 0) {
90
90
  this.fire(PermissionsAttachedToRoleEvent, attached.map((item) => item.permissionId), role);
@@ -1,4 +1,5 @@
1
1
  import BaseService from '../base_service.js';
2
+ import { applyTargetRestriction } from '../helper.js';
2
3
  export default class PermissionsService extends BaseService {
3
4
  options;
4
5
  scope;
@@ -229,6 +230,7 @@ export default class PermissionsService extends BaseService {
229
230
  directPermissions: this.map.getAlias(this.roleClassName) === modelType,
230
231
  permissionSlugs: slugs,
231
232
  permissionIds: ids,
233
+ includeForbiddings: true,
232
234
  }).distinct(this.permissionTable + '.id');
233
235
  const r = await q.select(this.permissionTable + '.id');
234
236
  // @ts-ignore
@@ -245,6 +247,7 @@ export default class PermissionsService extends BaseService {
245
247
  directPermissions: true,
246
248
  permissionSlugs: slugs,
247
249
  permissionIds: ids,
250
+ includeForbiddings: true,
248
251
  }).distinct(this.permissionTable + '.id');
249
252
  const r = await q.select(this.permissionTable + '.id');
250
253
  return r.length >= permission.length;
@@ -260,6 +263,7 @@ export default class PermissionsService extends BaseService {
260
263
  directPermissions: true,
261
264
  permissionSlugs: slugs,
262
265
  permissionIds: ids,
266
+ includeForbiddings: true,
263
267
  }).distinct(this.permissionTable + '.id');
264
268
  const r = await q.select(this.permissionTable + '.id');
265
269
  // @ts-ignore
@@ -393,16 +397,20 @@ export default class PermissionsService extends BaseService {
393
397
  const q = this.permissionQuery.leftJoin(this.modelPermissionTable + ' as mp', 'mp.permission_id', '=', this.permissionTable + '.id');
394
398
  if (modelId && modelType) {
395
399
  if (directPermissions) {
400
+ // check direct-assigned permissions
396
401
  q.where('mp.model_type', modelType).where('mp.model_id', modelId);
397
402
  }
398
403
  else {
404
+ //
399
405
  q.leftJoin(this.modelRoleTable + ' as mr', (joinQuery) => {
400
406
  joinQuery.onVal('mr.model_type', modelType).onVal('mr.model_id', modelId);
401
407
  });
402
408
  if (conditions.throughRoles) {
409
+ // only through roles
403
410
  q.whereRaw('mr.role_id=mp.model_id').where('mp.model_type', 'roles');
404
411
  }
405
412
  else {
413
+ // check direct-assigned permissions and through roles
406
414
  q.where((subQuery) => {
407
415
  subQuery
408
416
  .where((query) => {
@@ -410,9 +418,6 @@ export default class PermissionsService extends BaseService {
410
418
  })
411
419
  .orWhere((query) => {
412
420
  query.whereRaw('mr.role_id=mp.model_id').where('mp.model_type', 'roles');
413
- // query
414
- // .whereRaw('CAST(mr.role_id AS CHAR)=mp.model_id')
415
- // .where('mp.model_type', 'roles')
416
421
  });
417
422
  });
418
423
  }
@@ -489,22 +494,7 @@ export default class PermissionsService extends BaseService {
489
494
  return q;
490
495
  }
491
496
  applyTargetRestriction(table, q, entityType, entityId) {
492
- if (entityType) {
493
- q.where((query) => {
494
- query.where(table + '.entity_type', entityType).orWhere(table + '.entity_type', '*');
495
- });
496
- if (entityId) {
497
- q.where((query) => {
498
- query.where(table + '.entity_id', entityId).orWhereNull(table + '.entity_id');
499
- });
500
- }
501
- else {
502
- q.whereNull(table + '.entity_id');
503
- }
504
- }
505
- else {
506
- q.where(table + '.entity_type', '*').whereNull(table + '.entity_id');
507
- }
497
+ applyTargetRestriction(table, q, entityType, entityId);
508
498
  }
509
499
  applyScopes(q) {
510
500
  q.where(this.permissionTable + '.scope', this.scope.get());
@@ -71,7 +71,7 @@ export class RoleHasModelPermissions extends BaseAdapter {
71
71
  return result;
72
72
  }
73
73
  async hasPermission(permission, target) {
74
- const entity = await destructTarget(this.map, target);
74
+ const entity = destructTarget(this.map, target);
75
75
  const result = await this.permissionService.hasAny(this.map.getAlias(this.role), this.role.getModelId(), [permission], entity.targetClass, entity.targetId);
76
76
  return result;
77
77
  }
@@ -82,7 +82,7 @@ export class RoleHasModelPermissions extends BaseAdapter {
82
82
  * @returns
83
83
  */
84
84
  async hasAllPermissions(permissions, target) {
85
- const entity = await destructTarget(this.map, target);
85
+ const entity = destructTarget(this.map, target);
86
86
  const result = await this.permissionService.hasAll(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId);
87
87
  return result;
88
88
  }
@@ -93,7 +93,7 @@ export class RoleHasModelPermissions extends BaseAdapter {
93
93
  * @returns
94
94
  */
95
95
  async hasAnyPermissions(permissions, target) {
96
- const entity = await destructTarget(this.map, target);
96
+ const entity = destructTarget(this.map, target);
97
97
  const result = await this.permissionService.hasAny(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId);
98
98
  return result;
99
99
  }
@@ -112,7 +112,7 @@ export class RoleHasModelPermissions extends BaseAdapter {
112
112
  return this.hasAnyPermissions(permissions);
113
113
  }
114
114
  async forbidden(permission, target) {
115
- const entity = await destructTarget(this.map, target);
115
+ const entity = destructTarget(this.map, target);
116
116
  return this.permissionService.forbidden(this.map.getAlias(this.role), this.role.getModelId(), permission, entity.targetClass, entity.targetId);
117
117
  }
118
118
  /**
@@ -144,7 +144,7 @@ export class RoleHasModelPermissions extends BaseAdapter {
144
144
  * @param target
145
145
  */
146
146
  async giveAll(permissions, target) {
147
- const entity = await destructTarget(this.map, target);
147
+ const entity = destructTarget(this.map, target);
148
148
  const attached = await this.permissionService.giveAll(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId, true);
149
149
  if (attached.length > 0) {
150
150
  this.fire(PermissionsAttachedToRoleEvent, attached.map((item) => item.permissionId), this.role.getModelId());
@@ -182,7 +182,7 @@ export class RoleHasModelPermissions extends BaseAdapter {
182
182
  return this.revokeAll([permission]);
183
183
  }
184
184
  async revokeAll(permissions, target) {
185
- const entity = await destructTarget(this.map, target);
185
+ const entity = destructTarget(this.map, target);
186
186
  const revoked = await this.permissionService.revokeAll(this.map.getAlias(this.role), this.role.getModelId(), permissions, entity.targetClass, entity.targetId);
187
187
  if (revoked.length > 0) {
188
188
  this.fire(PermissionsDetachedFromRoleEvent, permissions, this.role.getModelId());
@@ -211,11 +211,11 @@ export class RoleHasModelPermissions extends BaseAdapter {
211
211
  return this.giveAll(permissions, target);
212
212
  }
213
213
  async forbid(permission, target) {
214
- const entity = await destructTarget(this.map, target);
214
+ const entity = destructTarget(this.map, target);
215
215
  return this.permissionService.forbid(this.map.getAlias(this.role), this.role.getModelId(), permission, entity.targetClass, entity.targetId);
216
216
  }
217
217
  async unforbid(permission, target) {
218
- const entity = await destructTarget(this.map, target);
218
+ const entity = destructTarget(this.map, target);
219
219
  return this.permissionService.unforbidAll(this.map.getAlias(this.role), this.role.getModelId(), [permission], entity.targetClass, entity.targetId);
220
220
  }
221
221
  }
@@ -69,9 +69,6 @@ export interface ModelPermissionsQuery extends AclModelQuery {
69
69
  entity: Entity;
70
70
  throughRoles: boolean;
71
71
  }
72
- export interface MorphMapInterface {
73
- [key: string]: any;
74
- }
75
72
  export interface MorphInterface {
76
73
  set(alias: string, target: any): void;
77
74
  get(alias: string): any;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@holoyan/adonisjs-permissions",
3
- "description": "Adonisjs roles and permissions system",
4
- "version": "1.1.0",
3
+ "description": "AdonisJs roles and permissions system",
4
+ "version": "1.3.0",
5
5
  "engines": {
6
6
  "node": ">=18.16.0"
7
7
  },
@@ -72,9 +72,9 @@
72
72
  "peerDependencies": {
73
73
  "@adonisjs/core": "^6.2.0",
74
74
  "@adonisjs/lucid": "^21.0.0",
75
+ "@types/uuid": "^10.0.0",
75
76
  "luxon": "^3.4.4",
76
- "uuid": "^10.0.0",
77
- "@types/uuid": "^10.0.0"
77
+ "uuid": "^10.0.0"
78
78
  },
79
79
  "publishConfig": {
80
80
  "access": "public",
@@ -98,5 +98,8 @@
98
98
  "eslintConfig": {
99
99
  "extends": "@adonisjs/eslint-config/package"
100
100
  },
101
- "prettier": "@adonisjs/prettier-config"
101
+ "prettier": "@adonisjs/prettier-config",
102
+ "dependencies": {
103
+ "@holoyan/morph-map-js": "^0.1.1"
104
+ }
102
105
  }
@@ -1,11 +0,0 @@
1
- import { MorphInterface } from './types.js';
2
- export default class MorphMap implements MorphInterface {
3
- private _map;
4
- private static _instance?;
5
- static create(): MorphMap;
6
- set(alias: string, target: any): void;
7
- get(alias: string): any;
8
- has(alias: string): boolean;
9
- hasTarget(target: any): boolean;
10
- getAlias(target: any): string;
11
- }
@@ -1,40 +0,0 @@
1
- export default class MorphMap {
2
- _map = {};
3
- static _instance;
4
- static create() {
5
- if (this._instance) {
6
- return this._instance;
7
- }
8
- return new MorphMap();
9
- }
10
- set(alias, target) {
11
- this._map[alias] = target;
12
- }
13
- get(alias) {
14
- if (!(alias in this._map)) {
15
- throw new Error('morph map not found for ' + alias);
16
- }
17
- return this._map[alias] || null;
18
- }
19
- has(alias) {
20
- return alias in this._map;
21
- }
22
- hasTarget(target) {
23
- const keys = Object.keys(this._map);
24
- for (const key of keys) {
25
- if (this._map[key] === target) {
26
- return true;
27
- }
28
- }
29
- return false;
30
- }
31
- getAlias(target) {
32
- const keys = Object.keys(this._map);
33
- for (const key of keys) {
34
- if (target instanceof this._map[key] || target === this._map[key]) {
35
- return key;
36
- }
37
- }
38
- throw new Error('Target not found');
39
- }
40
- }