@holoyan/adonisjs-permissions 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,8 +14,8 @@ Checkout other AdonisJS packages
14
14
 
15
15
  ## Release Notes
16
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
17
+ Version: >= v1.3.2
18
+ * Fixed `permissionQueryHelpers()` mixin leaking internal relations (`_roles`, `_permissions`, `_model_roles`) into the public `related()` API, which caused incorrect IDE type inference on user-defined relations
19
19
 
20
20
  ## Table of Contents
21
21
 
@@ -504,6 +504,21 @@ await Acl.role(role).hasAnyPermission(['update', 'read'])
504
504
 
505
505
  ```
506
506
 
507
+ ### Checking partial permissions
508
+
509
+ Sometimes you might want to check if a user has a specific permission on any instance of a model class, rather than checking for global permissions or permissions on a specific instance. For this purpose, you can use the `canPartially` method:
510
+
511
+ ```typescript
512
+
513
+ const postWithId = await Post.find(id)
514
+ await Acl.model(user).allow('create', postWithId) // allow 'create' on post instance
515
+
516
+ // This is useful when you want to know if a user has permission on at least one instance
517
+ Acl.model(user).can('create') // will return false
518
+ Acl.model(user).can('create', Post) // will return false
519
+ Acl.model(user).canPartially('create', Post) // will return true because user has a 'create' permission on postWithId instance
520
+ ```
521
+
507
522
  ### Middleware
508
523
 
509
524
  You are free to do your check anywhere, for example we can create [named](https://docs.adonisjs.com/guides/middleware#named-middleware-collection) middleware and do checking
@@ -1,10 +1,8 @@
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
4
  import Role from '../models/role.js';
6
5
  import { LucidModel, LucidRow, ModelQueryBuilderContract } from '@adonisjs/lucid/types/model';
7
- import { ModelRole, Permission } from '../../index.js';
8
6
  import ModelPermission from '../models/model_permission.js';
9
7
  export declare function hasPermissions(): <Model extends NormalizeConstructor<typeof BaseModel>>(superclass: Model) => {
10
8
  new (...args: any[]): {
@@ -47,27 +45,27 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
47
45
  * returns list of permissions assigned to the model
48
46
  * @param includeForbiddings
49
47
  */
50
- permissions(includeForbiddings?: boolean): Promise<import("../models/permission.js").default[]>;
48
+ permissions(includeForbiddings?: boolean): Promise<import("../models/permission.ts").default[]>;
51
49
  /**
52
50
  * returns list of global permissions assigned to the model
53
51
  * @param includeForbiddings
54
52
  */
55
- globalPermissions(includeForbiddings?: boolean): Promise<import("../models/permission.js").default[]>;
53
+ globalPermissions(includeForbiddings?: boolean): Promise<import("../models/permission.ts").default[]>;
56
54
  /**
57
55
  * returns list of resource permissions assigned to the model
58
56
  * @param includeForbiddings
59
57
  */
60
- onResourcePermissions(includeForbiddings?: boolean): Promise<import("../models/permission.js").default[]>;
58
+ onResourcePermissions(includeForbiddings?: boolean): Promise<import("../models/permission.ts").default[]>;
61
59
  /**
62
60
  * Returns list of direct permissions assigned to the model
63
61
  * @param includeForbiddings
64
62
  */
65
- directGlobalPermissions(includeForbiddings?: boolean): Promise<import("../models/permission.js").default[]>;
63
+ directGlobalPermissions(includeForbiddings?: boolean): Promise<import("../models/permission.ts").default[]>;
66
64
  /**
67
65
  * Returns list of direct resource permissions assigned to the model
68
66
  * @param includeForbiddings
69
67
  */
70
- directResourcePermissions(includeForbiddings?: boolean): Promise<import("../models/permission.js").default[]>;
68
+ directResourcePermissions(includeForbiddings?: boolean): Promise<import("../models/permission.ts").default[]>;
71
69
  /**
72
70
  * Check if model has "contains" permission
73
71
  * If permission is forbidden, it will return true
@@ -142,6 +140,12 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
142
140
  */
143
141
  canAll(permissions: string[], target?: AclModel | Function): Promise<boolean>;
144
142
  canAny(permissions: string[], target?: AclModel | Function): Promise<boolean>;
143
+ /**
144
+ * Check if a model has permission on any instance of a model class
145
+ * @param permission
146
+ * @param targetClass
147
+ */
148
+ canPartially(permission: string, targetClass: Function): Promise<boolean>;
145
149
  /**
146
150
  * Check if model has any permission
147
151
  * @param permission
@@ -221,7 +225,6 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
221
225
  $preloaded: {
222
226
  [relation: string]: LucidRow | LucidRow[];
223
227
  };
224
- $columns: undefined;
225
228
  $sideloaded: import("@adonisjs/lucid/types/model").ModelObject;
226
229
  $primaryKeyValue?: number | string;
227
230
  $isPersisted: boolean;
@@ -246,8 +249,8 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
246
249
  $getRelated(key: string, defaultValue?: any): import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | undefined | null;
247
250
  $consumeAdapterResult(adapterResult: import("@adonisjs/lucid/types/model").ModelObject, sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject): void;
248
251
  $hydrateOriginals(): void;
249
- fill(value: Partial<{}>, allowExtraProperties?: boolean): /*elided*/ any;
250
- merge(value: Partial<{}>, allowExtraProperties?: boolean): /*elided*/ any;
252
+ fill(value: Partial<import("@adonisjs/lucid/types/model").ModelAttributes</*elided*/ any>>, allowExtraProperties?: boolean): /*elided*/ any;
253
+ merge(value: Partial<import("@adonisjs/lucid/types/model").ModelAttributes</*elided*/ any>>, allowExtraProperties?: boolean): /*elided*/ any;
251
254
  isDirty(fields?: undefined[] | undefined): boolean;
252
255
  enableForceUpdate(): /*elided*/ any;
253
256
  save(): Promise</*elided*/ any>;
@@ -259,8 +262,8 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
259
262
  load: import("@adonisjs/lucid/types/model").LucidRowPreload</*elided*/ any>;
260
263
  loadOnce: import("@adonisjs/lucid/types/model").LucidRowPreloadOnce</*elided*/ any>;
261
264
  preload: import("@adonisjs/lucid/types/model").LucidRowPreload</*elided*/ any>;
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>;
265
+ loadAggregate: <Self extends /*elided*/ any, Name extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder = NonNullable<Self[Name]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? (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>;
266
+ loadCount: <Self extends /*elided*/ any, Name_1 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder_1 = NonNullable<Self[Name_1]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? (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>;
264
267
  serializeAttributes(fields?: import("@adonisjs/lucid/types/model").CherryPickFields, raw?: boolean): import("@adonisjs/lucid/types/model").ModelObject;
265
268
  serializeComputed(fields?: import("@adonisjs/lucid/types/model").CherryPickFields): import("@adonisjs/lucid/types/model").ModelObject;
266
269
  serializeRelations(fields: undefined, raw: true): {
@@ -271,18 +274,27 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
271
274
  serialize(cherryPick?: import("@adonisjs/lucid/types/model").CherryPick): import("@adonisjs/lucid/types/model").ModelObject;
272
275
  toObject(): import("@adonisjs/lucid/types/model").ModelObject;
273
276
  toJSON(): import("@adonisjs/lucid/types/model").ModelObject;
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;
277
+ toAttributes(): Record<string, any>;
278
+ related<Name_2 extends undefined>(relation: Name_2): NonNullable</*elided*/ any[Name_2]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? (import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> & /*elided*/ any[Name_2] & {})["client"] : never;
279
+ };
280
+ connection?: string | undefined;
281
+ after: {
282
+ <Model_1 extends LucidModel>(this: Model_1, event: "fetch", handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>[], "fetch">): void;
283
+ <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;
284
+ <Model_1 extends LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event>): void;
275
285
  };
286
+ query: <Model_1 extends LucidModel, Result = InstanceType<Model_1>>(this: Model_1, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => ModelQueryBuilderContract<Model_1, Result>;
287
+ truncate: (cascade?: boolean) => Promise<void>;
288
+ table: string;
289
+ transaction: import("@adonisjs/lucid/types/database").TransactionFn;
276
290
  find: <T extends LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
277
291
  all: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
278
292
  namingStrategy: import("@adonisjs/lucid/types/model").NamingStrategyContract;
279
- connection?: string | undefined;
280
293
  readonly booted: boolean;
281
294
  $columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
282
295
  $relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
283
296
  $computedDefinitions: Map<string, import("@adonisjs/lucid/types/model").ComputedOptions>;
284
297
  primaryKey: string;
285
- table: string;
286
298
  selfAssignPrimaryKey: boolean;
287
299
  $adapter: import("@adonisjs/lucid/types/model").AdapterContract;
288
300
  useAdapter: (adapter: import("@adonisjs/lucid/types/model").AdapterContract) => void;
@@ -294,31 +306,29 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
294
306
  columnsToSerialized: import("@adonisjs/lucid/types/model").ModelKeysContract;
295
307
  serializedToColumns: import("@adonisjs/lucid/types/model").ModelKeysContract;
296
308
  serializedToAttributes: import("@adonisjs/lucid/types/model").ModelKeysContract;
309
+ columnAliasesToAttributes: import("@adonisjs/lucid/types/model").ModelKeysContract;
297
310
  };
298
311
  $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
312
  $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>[];
300
313
  $addColumn: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ColumnOptions>) => import("@adonisjs/lucid/types/model").ColumnOptions;
301
314
  $hasColumn: (name: string) => boolean;
302
315
  $getColumn: (name: string) => import("@adonisjs/lucid/types/model").ModelColumnOptions | undefined;
316
+ $getColumnAlias: (columnName: string) => string;
317
+ columnsForSelect: () => Record<string, string>;
303
318
  $addComputed: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ComputedOptions>) => import("@adonisjs/lucid/types/model").ComputedOptions;
304
319
  $hasComputed: (name: string) => boolean;
305
320
  $getComputed: (name: string) => import("@adonisjs/lucid/types/model").ComputedOptions | undefined;
306
321
  $addRelation: (name: string, type: import("@adonisjs/lucid/types/relations").ModelRelationTypes["__opaque_type"], relatedModel: () => LucidModel, options: import("@adonisjs/lucid/types/model").ModelRelationOptions) => void;
307
322
  $hasRelation: (name: string) => boolean;
308
323
  $getRelation: {
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;
324
+ <Model_1 extends LucidModel, Name_2 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<InstanceType<Model_1>>>(this: Model_1, name: Name_2): NonNullable<InstanceType<Model_1>[Name_2]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? NonNullable<InstanceType<Model_1>[Name_2]>["client"]["relation"] : import("@adonisjs/lucid/types/relations").RelationshipsContract;
310
325
  <Model_1 extends LucidModel>(this: Model_1, name: string): import("@adonisjs/lucid/types/relations").RelationshipsContract;
311
326
  };
312
327
  $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;
313
328
  boot: () => void;
314
329
  before: {
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;
330
+ <Model_1 extends LucidModel, Event_1 extends "find" | "fetch">(this: Model_1, event: Event_1, handler: import("@adonisjs/lucid/types/model").HooksHandler<ModelQueryBuilderContract<Model_1>, Event_1>): void;
316
331
  <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;
318
- };
319
- after: {
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
332
  <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;
323
333
  };
324
334
  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>>;
@@ -347,17 +357,14 @@ export declare function hasPermissions(): <Model extends NormalizeConstructor<ty
347
357
  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
358
  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
359
  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
360
  } & Model;
354
361
  export declare function permissionQueryHelpers(): <Model extends NormalizeConstructor<typeof BaseModel>>(superclass: Model) => {
355
362
  new (...args: any[]): {
356
- _roles: ManyToMany<typeof Role>;
363
+ _roles: undefined;
357
364
  _whereRoles<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, ...roles: string[]): ModelQueryBuilderContract<LucidModel, LucidRow>;
358
- _permissions: ManyToMany<typeof Permission>;
365
+ _permissions: undefined;
359
366
  _whereDirectPermissions<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, permissions: string[], target?: AclModel | Function): ModelQueryBuilderContract<LucidModel, LucidRow>;
360
- _model_roles: HasMany<typeof ModelRole>;
367
+ _model_roles: undefined;
361
368
  _whereRolePermissions<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, permissions: string[], target?: AclModel | Function): ModelQueryBuilderContract<LucidModel, LucidRow>;
362
369
  _wherePermissions<TargetClass extends Model>(query: ModelQueryBuilderContract<LucidModel, LucidRow>, targetClass: TargetClass, permissions: string[], target?: AclModel | Function): void;
363
370
  $attributes: import("@adonisjs/lucid/types/model").ModelObject;
@@ -366,7 +373,6 @@ export declare function permissionQueryHelpers(): <Model extends NormalizeConstr
366
373
  $preloaded: {
367
374
  [relation: string]: LucidRow | LucidRow[];
368
375
  };
369
- $columns: undefined;
370
376
  $sideloaded: import("@adonisjs/lucid/types/model").ModelObject;
371
377
  $primaryKeyValue?: number | string;
372
378
  $isPersisted: boolean;
@@ -391,9 +397,9 @@ export declare function permissionQueryHelpers(): <Model extends NormalizeConstr
391
397
  $getRelated(key: string, defaultValue?: any): import("@adonisjs/lucid/types/querybuilder").OneOrMany<LucidRow> | undefined | null;
392
398
  $consumeAdapterResult(adapterResult: import("@adonisjs/lucid/types/model").ModelObject, sideloadAttributes?: import("@adonisjs/lucid/types/model").ModelObject): void;
393
399
  $hydrateOriginals(): void;
394
- fill(value: Partial<{}>, allowExtraProperties?: boolean): /*elided*/ any;
395
- merge(value: Partial<{}>, allowExtraProperties?: boolean): /*elided*/ any;
396
- isDirty(fields?: undefined[] | undefined): boolean;
400
+ fill(value: Partial<import("@adonisjs/lucid/types/model").ModelAttributes</*elided*/ any>>, allowExtraProperties?: boolean): /*elided*/ any;
401
+ merge(value: Partial<import("@adonisjs/lucid/types/model").ModelAttributes</*elided*/ any>>, allowExtraProperties?: boolean): /*elided*/ any;
402
+ isDirty(fields?: "_roles" | "_permissions" | "_model_roles" | ("_roles" | "_permissions" | "_model_roles" | undefined)[] | undefined): boolean;
397
403
  enableForceUpdate(): /*elided*/ any;
398
404
  save(): Promise</*elided*/ any>;
399
405
  saveQuietly(): Promise</*elided*/ any>;
@@ -404,8 +410,8 @@ export declare function permissionQueryHelpers(): <Model extends NormalizeConstr
404
410
  load: import("@adonisjs/lucid/types/model").LucidRowPreload</*elided*/ any>;
405
411
  loadOnce: import("@adonisjs/lucid/types/model").LucidRowPreloadOnce</*elided*/ any>;
406
412
  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>;
413
+ loadAggregate: <Self extends /*elided*/ any, Name extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder = NonNullable<Self[Name]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? (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>;
414
+ loadCount: <Self extends /*elided*/ any, Name_1 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<Self>, RelatedBuilder_1 = NonNullable<Self[Name_1]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? (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
415
  serializeAttributes(fields?: import("@adonisjs/lucid/types/model").CherryPickFields, raw?: boolean): import("@adonisjs/lucid/types/model").ModelObject;
410
416
  serializeComputed(fields?: import("@adonisjs/lucid/types/model").CherryPickFields): import("@adonisjs/lucid/types/model").ModelObject;
411
417
  serializeRelations(fields: undefined, raw: true): {
@@ -416,18 +422,27 @@ export declare function permissionQueryHelpers(): <Model extends NormalizeConstr
416
422
  serialize(cherryPick?: import("@adonisjs/lucid/types/model").CherryPick): import("@adonisjs/lucid/types/model").ModelObject;
417
423
  toObject(): import("@adonisjs/lucid/types/model").ModelObject;
418
424
  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;
425
+ toAttributes(): Record<string, any>;
426
+ related<Name_2 extends undefined>(relation: Name_2): NonNullable</*elided*/ any[Name_2]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? (import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> & /*elided*/ any[Name_2] & {})["client"] : never;
427
+ };
428
+ connection?: string | undefined;
429
+ after: {
430
+ <Model_1 extends LucidModel>(this: Model_1, event: "fetch", handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>[], "fetch">): void;
431
+ <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;
432
+ <Model_1 extends LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model_1, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model_1>, Event>): void;
420
433
  };
434
+ query: <Model_1 extends LucidModel, Result = InstanceType<Model_1>>(this: Model_1, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => ModelQueryBuilderContract<Model_1, Result>;
435
+ truncate: (cascade?: boolean) => Promise<void>;
436
+ table: string;
437
+ transaction: import("@adonisjs/lucid/types/database").TransactionFn;
421
438
  find: <T extends LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
422
439
  all: <T extends LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
423
440
  namingStrategy: import("@adonisjs/lucid/types/model").NamingStrategyContract;
424
- connection?: string | undefined;
425
441
  readonly booted: boolean;
426
442
  $columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
427
443
  $relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
428
444
  $computedDefinitions: Map<string, import("@adonisjs/lucid/types/model").ComputedOptions>;
429
445
  primaryKey: string;
430
- table: string;
431
446
  selfAssignPrimaryKey: boolean;
432
447
  $adapter: import("@adonisjs/lucid/types/model").AdapterContract;
433
448
  useAdapter: (adapter: import("@adonisjs/lucid/types/model").AdapterContract) => void;
@@ -439,31 +454,29 @@ export declare function permissionQueryHelpers(): <Model extends NormalizeConstr
439
454
  columnsToSerialized: import("@adonisjs/lucid/types/model").ModelKeysContract;
440
455
  serializedToColumns: import("@adonisjs/lucid/types/model").ModelKeysContract;
441
456
  serializedToAttributes: import("@adonisjs/lucid/types/model").ModelKeysContract;
457
+ columnAliasesToAttributes: import("@adonisjs/lucid/types/model").ModelKeysContract;
442
458
  };
443
459
  $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
460
  $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
461
  $addColumn: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ColumnOptions>) => import("@adonisjs/lucid/types/model").ColumnOptions;
446
462
  $hasColumn: (name: string) => boolean;
447
463
  $getColumn: (name: string) => import("@adonisjs/lucid/types/model").ModelColumnOptions | undefined;
464
+ $getColumnAlias: (columnName: string) => string;
465
+ columnsForSelect: () => Record<string, string>;
448
466
  $addComputed: (name: string, options: Partial<import("@adonisjs/lucid/types/model").ComputedOptions>) => import("@adonisjs/lucid/types/model").ComputedOptions;
449
467
  $hasComputed: (name: string) => boolean;
450
468
  $getComputed: (name: string) => import("@adonisjs/lucid/types/model").ComputedOptions | undefined;
451
469
  $addRelation: (name: string, type: import("@adonisjs/lucid/types/relations").ModelRelationTypes["__opaque_type"], relatedModel: () => LucidModel, options: import("@adonisjs/lucid/types/model").ModelRelationOptions) => void;
452
470
  $hasRelation: (name: string) => boolean;
453
471
  $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;
472
+ <Model_1 extends LucidModel, Name_2 extends import("@adonisjs/lucid/types/relations").ExtractModelRelations<InstanceType<Model_1>>>(this: Model_1, name: Name_2): NonNullable<InstanceType<Model_1>[Name_2]> extends import("@adonisjs/lucid/types/relations").ModelRelations<LucidModel, LucidModel> ? NonNullable<InstanceType<Model_1>[Name_2]>["client"]["relation"] : import("@adonisjs/lucid/types/relations").RelationshipsContract;
455
473
  <Model_1 extends LucidModel>(this: Model_1, name: string): import("@adonisjs/lucid/types/relations").RelationshipsContract;
456
474
  };
457
475
  $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
476
  boot: () => void;
459
477
  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;
478
+ <Model_1 extends LucidModel, Event_1 extends "find" | "fetch">(this: Model_1, event: Event_1, handler: import("@adonisjs/lucid/types/model").HooksHandler<ModelQueryBuilderContract<Model_1>, Event_1>): void;
461
479
  <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
480
  <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
481
  };
469
482
  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>>;
@@ -492,7 +505,4 @@ export declare function permissionQueryHelpers(): <Model extends NormalizeConstr
492
505
  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
506
  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
507
  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>;
496
- transaction: import("@adonisjs/lucid/types/database").TransactionFn;
497
- truncate: (cascade?: boolean) => Promise<void>;
498
508
  } & Model;
@@ -204,6 +204,14 @@ export function hasPermissions() {
204
204
  canAny(permissions, target) {
205
205
  return Acl.model(this).canAny(permissions, target);
206
206
  }
207
+ /**
208
+ * Check if a model has permission on any instance of a model class
209
+ * @param permission
210
+ * @param targetClass
211
+ */
212
+ canPartially(permission, targetClass) {
213
+ return Acl.model(this).canPartially(permission, targetClass);
214
+ }
207
215
  /**
208
216
  * Check if model has any permission
209
217
  * @param permission
@@ -22,3 +22,8 @@ export declare function destructTarget(map: MorphInterface, target?: AclModel |
22
22
  targetId: ModelIdType | null;
23
23
  };
24
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;
25
+ /**
26
+ * Apply target restriction for partial permission checks
27
+ * This function doesn't check entity_id when only entityType is provided
28
+ */
29
+ export declare function applyPartialTargetRestriction(table: string, q: ManyToManySubQueryBuilderContract<typeof Permission> | ModelQueryBuilderContract<typeof Permission, PermissionInterface> | RelationSubQueryBuilderContract<typeof ModelRole>, entityType: string): void;
@@ -80,3 +80,10 @@ export function applyTargetRestriction(table, q, entityType, entityId) {
80
80
  q.where(table + '.entity_type', '*').whereNull(table + '.entity_id');
81
81
  }
82
82
  }
83
+ /**
84
+ * Apply target restriction for partial permission checks
85
+ * This function doesn't check entity_id when only entityType is provided
86
+ */
87
+ export function applyPartialTargetRestriction(table, q, entityType) {
88
+ q.where(table + '.entity_type', entityType).whereNotNull(table + '.entity_id');
89
+ }
@@ -15,7 +15,7 @@ export declare class ModelHasRolePermissions extends BaseAdapter {
15
15
  constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface, scope: Scope, model: AclModel, emitter: Emitter<any>);
16
16
  get roleService(): RolesService;
17
17
  get permissionService(): PermissionService;
18
- roles(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof import("../../models/role.js").default, import("../../models/role.js").default>;
18
+ roles(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof import("../../models/role.ts").default, import("../../models/role.ts").default>;
19
19
  hasRole(role: string): Promise<boolean>;
20
20
  hasAllRoles(...roles: string[]): Promise<boolean>;
21
21
  hasAnyRole(...roles: string[]): Promise<boolean>;
@@ -59,24 +59,24 @@ export declare class ModelHasRolePermissions extends BaseAdapter {
59
59
  * @param roles
60
60
  */
61
61
  syncRolesWithoutDetaching(roles: string[]): Promise<void>;
62
- permissions(includeForbiddings?: boolean): Promise<import("../../models/permission.js").default[]>;
62
+ permissions(includeForbiddings?: boolean): Promise<import("../../models/permission.ts").default[]>;
63
63
  /**
64
64
  * returns list of global permissions assigned to the model
65
65
  * @param includeForbiddings
66
66
  */
67
- globalPermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.js").default[]>;
67
+ globalPermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.ts").default[]>;
68
68
  /**
69
69
  * @param includeForbiddings
70
70
  */
71
- onResourcePermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.js").default[]>;
72
- directPermissions(includeForbiddings?: boolean): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof import("../../models/permission.js").default, import("../../models/permission.js").default>;
71
+ onResourcePermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.ts").default[]>;
72
+ directPermissions(includeForbiddings?: boolean): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof import("../../models/permission.ts").default, import("../../models/permission.ts").default>;
73
73
  /**
74
74
  * Get permission through roles
75
75
  * @param includeForbiddings
76
76
  */
77
- rolePermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.js").default[]>;
78
- directGlobalPermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.js").default[]>;
79
- directResourcePermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.js").default[]>;
77
+ rolePermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.ts").default[]>;
78
+ directGlobalPermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.ts").default[]>;
79
+ directResourcePermissions(includeForbiddings?: boolean): Promise<import("../../models/permission.ts").default[]>;
80
80
  containsPermission(permission: string): Promise<boolean>;
81
81
  contains(permission: string): Promise<boolean>;
82
82
  containsAllPermissions(permissions: string[]): Promise<boolean>;
@@ -102,32 +102,50 @@ export declare class ModelHasRolePermissions extends BaseAdapter {
102
102
  can(permission: string, target?: AclModel | Function): Promise<boolean>;
103
103
  canAll(permissions: string[], target?: AclModel | Function): Promise<boolean>;
104
104
  canAny(permissions: string[], target?: AclModel | Function): Promise<boolean>;
105
+ /**
106
+ * Check if model has permission on any instance of a model class
107
+ * @param permission
108
+ * @param targetClass
109
+ */
110
+ hasPartialPermission(permission: string, targetClass: Function): Promise<boolean>;
111
+ /**
112
+ * Check if model has any of the permissions on any instance of a model class
113
+ * @param permissions
114
+ * @param targetClass
115
+ */
116
+ hasAnyPartialPermission(permissions: string[], targetClass: Function): Promise<boolean>;
117
+ /**
118
+ * Check if a model has permission on any instance of a model class
119
+ * @param permission
120
+ * @param targetClass
121
+ */
122
+ canPartially(permission: string, targetClass: Function): Promise<boolean>;
105
123
  /**
106
124
  * calls assignDirectAllPermissions()
107
125
  * @param permission
108
126
  * @param target
109
127
  */
110
- assignDirectPermission(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
128
+ assignDirectPermission(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
111
129
  /**
112
130
  *
113
131
  * @param permissions
114
132
  * @param target
115
133
  */
116
- assignDirectAllPermissions(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
134
+ assignDirectAllPermissions(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
117
135
  /**
118
136
  * Assign permission to the model
119
137
  * calls assignDirectAllPermissions
120
138
  * @param permission
121
139
  * @param target
122
140
  */
123
- allow(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
141
+ allow(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
124
142
  /**
125
143
  * Assign list of permissions to the model
126
144
  * calls assignDirectAllPermissions
127
145
  * @param permission
128
146
  * @param target
129
147
  */
130
- allowAll(permission: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
148
+ allowAll(permission: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
131
149
  /**
132
150
  * Revoke permission from the model
133
151
  * calls revokeAllPermissions
@@ -159,7 +177,7 @@ export declare class ModelHasRolePermissions extends BaseAdapter {
159
177
  * @param permissions
160
178
  * @param target
161
179
  */
162
- syncPermissions(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
180
+ syncPermissions(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
163
181
  flush(): Promise<boolean>;
164
182
  /**
165
183
  * calls forbidAll
@@ -213,6 +213,31 @@ export class ModelHasRolePermissions extends BaseAdapter {
213
213
  canAny(permissions, target) {
214
214
  return this.hasAnyPermission(permissions, target);
215
215
  }
216
+ /**
217
+ * Check if model has permission on any instance of a model class
218
+ * @param permission
219
+ * @param targetClass
220
+ */
221
+ async hasPartialPermission(permission, targetClass) {
222
+ return this.hasAnyPartialPermission([permission], targetClass);
223
+ }
224
+ /**
225
+ * Check if model has any of the permissions on any instance of a model class
226
+ * @param permissions
227
+ * @param targetClass
228
+ */
229
+ async hasAnyPartialPermission(permissions, targetClass) {
230
+ const entityType = this.map.getAlias(targetClass);
231
+ return await this.permissionService.hasAnyPartial(this.map.getAlias(this.model), this.model.getModelId(), permissions, entityType);
232
+ }
233
+ /**
234
+ * Check if a model has permission on any instance of a model class
235
+ * @param permission
236
+ * @param targetClass
237
+ */
238
+ canPartially(permission, targetClass) {
239
+ return this.hasPartialPermission(permission, targetClass);
240
+ }
216
241
  /**
217
242
  * calls assignDirectAllPermissions()
218
243
  * @param permission
@@ -12,6 +12,6 @@ export default class EmptyPermission extends BaseAdapter {
12
12
  permissionClassName: ModelManagerBindings['permission'];
13
13
  constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface, scope: Scope, emitter: Emitter<any>);
14
14
  get permissionQuery(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, PermissionModel<import("@adonisjs/lucid/types/model").LucidModel>>;
15
- create(values: Partial<PermissionInterface>): Promise<PermissionModel<typeof import("../../models/permission.js").default>>;
15
+ create(values: Partial<PermissionInterface>): Promise<PermissionModel<typeof import("../../models/permission.ts").default>>;
16
16
  delete(permission: string): Promise<boolean>;
17
17
  }
@@ -23,13 +23,13 @@ export default class PermissionHasModelRoles extends BaseAdapter {
23
23
  get modelService(): ModelService;
24
24
  models(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").ModelPermissionModel<import("@adonisjs/lucid/types/model").LucidModel>>;
25
25
  modelsFor(modelType: string): Promise<any>;
26
- roles(): Promise<import("../../models/role.js").default[]>;
26
+ roles(): Promise<import("../../models/role.ts").default[]>;
27
27
  belongsToRole(role: string | number): Promise<boolean>;
28
28
  /**
29
29
  * @param role
30
30
  * @param target
31
31
  */
32
- attachToRole(role: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
32
+ attachToRole(role: string, target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
33
33
  /**
34
34
  * @param role
35
35
  */
@@ -57,6 +57,10 @@ export default class PermissionsService extends BaseService {
57
57
  * has any of permissions
58
58
  */
59
59
  hasAny(modelType: string, modelId: ModelIdType, permission: string[], entityType: string | null, entityId: ModelIdType | null): Promise<boolean>;
60
+ /**
61
+ * has any of permissions on any instance of a model class
62
+ */
63
+ hasAnyPartial(modelType: string, modelId: ModelIdType, permissions: string[], entityType: string): Promise<boolean>;
60
64
  /**
61
65
  * has all permissions
62
66
  */
@@ -80,21 +84,21 @@ export default class PermissionsService extends BaseService {
80
84
  /**
81
85
  * give permission to model
82
86
  */
83
- giveAll(modelType: string, modelId: ModelIdType, slugs: string[], entityType: string | null, entityId: ModelIdType | null, allowed: boolean): Promise<import("../../models/model_permission.js").default[]>;
84
- revokeAll(modelType: string, modelId: ModelIdType, permissions: string[], entityType: string | null, entityId: ModelIdType | null): ModelQueryBuilderContract<typeof import("../../models/model_permission.js").default, any>;
85
- flush(modelType: string, modelId: ModelIdType): ModelQueryBuilderContract<typeof import("../../models/model_permission.js").default, any>;
87
+ giveAll(modelType: string, modelId: ModelIdType, slugs: string[], entityType: string | null, entityId: ModelIdType | null, allowed: boolean): Promise<import("../../models/model_permission.ts").default[]>;
88
+ revokeAll(modelType: string, modelId: ModelIdType, permissions: string[], entityType: string | null, entityId: ModelIdType | null): ModelQueryBuilderContract<typeof import("../../models/model_permission.ts").default, any>;
89
+ flush(modelType: string, modelId: ModelIdType): ModelQueryBuilderContract<typeof import("../../models/model_permission.ts").default, any>;
86
90
  /**
87
91
  * sync permissions, remove everything outside of the list
88
92
  */
89
- sync(modelType: string, modelId: ModelIdType, permissionId: string[]): Promise<import("../../models/model_permission.js").default[]>;
93
+ sync(modelType: string, modelId: ModelIdType, permissionId: string[]): Promise<import("../../models/model_permission.ts").default[]>;
90
94
  /**
91
95
  * forbid permission on model
92
96
  */
93
- forbid(modelType: string, modelId: ModelIdType, permissionSlug: string, entityType: string | null, entityId: ModelIdType | null): Promise<import("../../models/model_permission.js").default[]>;
97
+ forbid(modelType: string, modelId: ModelIdType, permissionSlug: string, entityType: string | null, entityId: ModelIdType | null): Promise<import("../../models/model_permission.ts").default[]>;
94
98
  /**
95
99
  * forbid permission on model
96
100
  */
97
- forbidAll(modelType: string, modelId: ModelIdType, permissionsSlug: string[], entityType: string | null, entityId: ModelIdType | null): Promise<import("../../models/model_permission.js").default[]>;
101
+ forbidAll(modelType: string, modelId: ModelIdType, permissionsSlug: string[], entityType: string | null, entityId: ModelIdType | null): Promise<import("../../models/model_permission.ts").default[]>;
98
102
  /**
99
103
  * to remove forbidden permission on model
100
104
  */
@@ -106,9 +110,10 @@ export default class PermissionsService extends BaseService {
106
110
  * @deprecated
107
111
  * @param conditions
108
112
  */
109
- reverseModelPermissionQuery(conditions: Partial<ModelPermissionsQuery>): ModelQueryBuilderContract<typeof import("../../models/model_permission.js").default, import("../../models/model_permission.js").default>;
113
+ reverseModelPermissionQuery(conditions: Partial<ModelPermissionsQuery>): ModelQueryBuilderContract<typeof import("../../models/model_permission.ts").default, import("../../models/model_permission.ts").default>;
110
114
  findAssignableEntity(permission: string[], entityClass: string | null, entityId: ModelIdType | null, allowed: boolean): ModelQueryBuilderContract<typeof Permission, Permission>;
111
115
  private applyTargetRestriction;
116
+ private applyPartialTargetRestriction;
112
117
  private applyScopes;
113
118
  private applyModelPermissionScopes;
114
119
  }
@@ -1,5 +1,5 @@
1
1
  import BaseService from '../base_service.js';
2
- import { applyTargetRestriction } from '../helper.js';
2
+ import { applyTargetRestriction, applyPartialTargetRestriction } from '../helper.js';
3
3
  export default class PermissionsService extends BaseService {
4
4
  options;
5
5
  scope;
@@ -204,6 +204,27 @@ export default class PermissionsService extends BaseService {
204
204
  const r = await q.distinct(this.permissionTable + '.id').select(this.permissionTable + '.id');
205
205
  return r.length > 0;
206
206
  }
207
+ /**
208
+ * has any of permissions on any instance of a model class
209
+ */
210
+ async hasAnyPartial(modelType, modelId, permissions, entityType) {
211
+ const { slugs, ids } = this.formatList(permissions);
212
+ const q = this.modelPermissionQueryWithForbiddenCheck({
213
+ modelType,
214
+ modelId,
215
+ directPermissions: this.map.getAlias(this.roleClassName) === modelType,
216
+ permissionSlugs: slugs,
217
+ permissionIds: ids,
218
+ entity: {
219
+ type: entityType,
220
+ id: null,
221
+ },
222
+ });
223
+ // We use applyPartialTargetRestriction which doesn't check entity_id when only entityType is provided
224
+ this.applyPartialTargetRestriction(this.permissionTable, q, entityType);
225
+ const r = await q.distinct(this.permissionTable + '.id').select(this.permissionTable + '.id');
226
+ return r.length > 0;
227
+ }
207
228
  /**
208
229
  * has all permissions
209
230
  */
@@ -496,6 +517,9 @@ export default class PermissionsService extends BaseService {
496
517
  applyTargetRestriction(table, q, entityType, entityId) {
497
518
  applyTargetRestriction(table, q, entityType, entityId);
498
519
  }
520
+ applyPartialTargetRestriction(table, q, entityType) {
521
+ applyPartialTargetRestriction(table, q, entityType);
522
+ }
499
523
  applyScopes(q) {
500
524
  q.where(this.permissionTable + '.scope', this.scope.get());
501
525
  }
@@ -13,6 +13,6 @@ export default class EmptyRoles extends BaseAdapter {
13
13
  constructor(manager: ModelManager, map: MorphInterface, options: OptionsInterface, scope: Scope, emitter: Emitter<any>);
14
14
  get roleQuery(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
15
15
  delete(role: string): Promise<any[]>;
16
- create(values: Partial<RoleInterface>): Promise<import("../../models/role.js").default>;
16
+ create(values: Partial<RoleInterface>): Promise<import("../../models/role.ts").default>;
17
17
  query(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").RoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
18
18
  }
@@ -17,9 +17,9 @@ export declare class RoleHasModelPermissions extends BaseAdapter {
17
17
  get permissionService(): PermissionService;
18
18
  models(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<import("@adonisjs/lucid/types/model").LucidModel, import("../../types.js").ModelRoleModel<import("@adonisjs/lucid/types/model").LucidModel>>;
19
19
  modelsFor(modelType: string): Promise<any>;
20
- permissions(): Promise<import("../../models/permission.js").default[]>;
21
- globalPermissions(): Promise<import("../../models/permission.js").default[]>;
22
- onResourcePermissions(): Promise<import("../../models/permission.js").default[]>;
20
+ permissions(): Promise<import("../../models/permission.ts").default[]>;
21
+ globalPermissions(): Promise<import("../../models/permission.ts").default[]>;
22
+ onResourcePermissions(): Promise<import("../../models/permission.ts").default[]>;
23
23
  containsPermission(permission: string): Promise<boolean>;
24
24
  /**
25
25
  *
@@ -62,36 +62,36 @@ export declare class RoleHasModelPermissions extends BaseAdapter {
62
62
  * @param permission
63
63
  * @param target
64
64
  */
65
- assign(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
65
+ assign(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
66
66
  /**
67
67
  * calls giveAll()
68
68
  * @param permission
69
69
  * @param target
70
70
  */
71
- allow(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
71
+ allow(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
72
72
  /**
73
73
  * calls giveAll()
74
74
  * @param permission
75
75
  * @param target
76
76
  */
77
- give(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
77
+ give(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
78
78
  /**
79
79
  * @param permissions
80
80
  * @param target
81
81
  */
82
- giveAll(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
82
+ giveAll(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
83
83
  /**
84
84
  * calls giveAll()
85
85
  * @param permissions
86
86
  * @param target
87
87
  */
88
- assignAll(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
88
+ assignAll(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
89
89
  /**
90
90
  * calls giveAll()
91
91
  * @param permissions
92
92
  * @param target
93
93
  */
94
- allowAll(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
94
+ allowAll(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
95
95
  /**
96
96
  * calls revokeAll()
97
97
  * @param permission
@@ -114,7 +114,7 @@ export declare class RoleHasModelPermissions extends BaseAdapter {
114
114
  * @param permissions - list of permissions
115
115
  * @param target
116
116
  */
117
- sync(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
118
- forbid(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.js").default[]>;
117
+ sync(permissions: string[], target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
118
+ forbid(permission: string, target?: AclModel | Function): Promise<import("../../models/model_permission.ts").default[]>;
119
119
  unforbid(permission: string, target?: AclModel | Function): Promise<any[]>;
120
120
  }
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": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "engines": {
6
6
  "node": ">=18.16.0"
7
7
  },