@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 +105 -9
- package/build/index.d.ts +1 -2
- package/build/index.js +1 -2
- package/build/providers/role_permission_provider.d.ts +2 -2
- package/build/providers/role_permission_provider.js +4 -4
- package/build/src/decorators.js +4 -12
- package/build/src/mixins/has_permissions.d.ts +200 -46
- package/build/src/mixins/has_permissions.js +111 -0
- package/build/src/models/permission.js +7 -2
- package/build/src/models/role.js +7 -2
- package/build/src/services/helper.d.ts +8 -4
- package/build/src/services/helper.js +19 -1
- package/build/src/services/models/model_has_role_permissions.js +8 -8
- package/build/src/services/permissions/permission_has_model_roles.js +1 -1
- package/build/src/services/permissions/permissions_service.js +9 -19
- package/build/src/services/roles/role_has_model_permissions.js +8 -8
- package/build/src/types.d.ts +0 -3
- package/package.json +8 -5
- package/build/src/morph_map.d.ts +0 -11
- package/build/src/morph_map.js +0 -40
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]
|
|
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/
|
|
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/
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
3
|
+
import { MorphMapManager } from '@holoyan/morph-map-js';
|
|
4
4
|
declare module '@adonisjs/core/types' {
|
|
5
5
|
interface ContainerBindings {
|
|
6
|
-
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
|
|
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
|
}
|
package/build/src/decorators.js
CHANGED
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
import
|
|
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
|
-
|
|
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
|
-
|
|
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():
|
|
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<
|
|
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<
|
|
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<
|
|
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]:
|
|
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):
|
|
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<
|
|
240
|
-
$pushRelated(key: string, result: import("@adonisjs/lucid/types/querybuilder").OneOrMany<
|
|
241
|
-
$getRelated(key: string, defaultValue?: any): import("@adonisjs/lucid/types/querybuilder").OneOrMany<
|
|
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<
|
|
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<
|
|
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]:
|
|
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<
|
|
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
|
|
270
|
-
all: <T extends
|
|
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
|
|
292
|
-
$createMultipleFromAdapterResult: <T extends
|
|
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: () =>
|
|
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
|
|
303
|
-
<Model_1 extends
|
|
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
|
|
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
|
|
309
|
-
<Model_1 extends
|
|
310
|
-
<Model_1 extends
|
|
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
|
|
314
|
-
<Model_1 extends
|
|
315
|
-
<Model_1 extends
|
|
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
|
|
318
|
-
|
|
319
|
-
|
|
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
|
|
322
|
-
<T extends
|
|
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
|
|
326
|
-
<T extends
|
|
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
|
|
330
|
-
<T extends
|
|
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
|
|
333
|
-
firstOrFail: <T extends
|
|
334
|
-
findMany: <T extends
|
|
335
|
-
firstOrNew: <T extends
|
|
336
|
-
firstOrCreate: <T extends
|
|
337
|
-
updateOrCreate: <T extends
|
|
338
|
-
fetchOrNewUpMany: <T extends
|
|
339
|
-
fetchOrCreateMany: <T extends
|
|
340
|
-
updateOrCreateMany: <T extends
|
|
341
|
-
query: <Model_1 extends
|
|
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
|
-
|
|
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;
|
package/build/src/models/role.js
CHANGED
|
@@ -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
|
-
|
|
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):
|
|
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:
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
}
|
package/build/src/types.d.ts
CHANGED
|
@@ -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": "
|
|
4
|
-
"version": "1.
|
|
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
|
}
|
package/build/src/morph_map.d.ts
DELETED
|
@@ -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
|
-
}
|
package/build/src/morph_map.js
DELETED
|
@@ -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
|
-
}
|