@holoyan/adonisjs-permissions 0.1.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/LICENSE.md +9 -0
- package/README.md +661 -0
- package/build/configure.d.ts +2 -0
- package/build/configure.js +33 -0
- package/build/index.d.ts +8 -0
- package/build/index.js +17 -0
- package/build/providers/role_permission_provider.d.ts +12 -0
- package/build/providers/role_permission_provider.js +12 -0
- package/build/src/acl.d.ts +11 -0
- package/build/src/acl.js +29 -0
- package/build/src/decorators.d.ts +4 -0
- package/build/src/decorators.js +18 -0
- package/build/src/mixins/has_permissions.d.ts +133 -0
- package/build/src/mixins/has_permissions.js +19 -0
- package/build/src/mixins/has_role_permissions.d.ts +128 -0
- package/build/src/mixins/has_role_permissions.js +10 -0
- package/build/src/mixins/has_roles.d.ts +1 -0
- package/build/src/mixins/has_roles.js +47 -0
- package/build/src/models/model_permission.d.ts +12 -0
- package/build/src/models/model_permission.js +35 -0
- package/build/src/models/model_role.d.ts +11 -0
- package/build/src/models/model_role.js +31 -0
- package/build/src/models/permission.d.ts +16 -0
- package/build/src/models/permission.js +48 -0
- package/build/src/models/role.d.ts +16 -0
- package/build/src/models/role.js +48 -0
- package/build/src/morph_map.d.ts +8 -0
- package/build/src/morph_map.js +33 -0
- package/build/src/services/base_service.d.ts +14 -0
- package/build/src/services/base_service.js +12 -0
- package/build/src/services/helper.d.ts +21 -0
- package/build/src/services/helper.js +69 -0
- package/build/src/services/model_has_role_permissions.d.ts +48 -0
- package/build/src/services/model_has_role_permissions.js +172 -0
- package/build/src/services/model_service.d.ts +8 -0
- package/build/src/services/model_service.js +31 -0
- package/build/src/services/permissions/permission_has_model_roles.d.ts +20 -0
- package/build/src/services/permissions/permission_has_model_roles.js +67 -0
- package/build/src/services/permissions/permissions_service.d.ts +92 -0
- package/build/src/services/permissions/permissions_service.js +438 -0
- package/build/src/services/roles/role_has_model_permissions.d.ts +66 -0
- package/build/src/services/roles/role_has_model_permissions.js +152 -0
- package/build/src/services/roles/roles_service.d.ts +16 -0
- package/build/src/services/roles/roles_service.js +89 -0
- package/build/src/types.d.ts +21 -0
- package/build/src/types.js +1 -0
- package/build/stubs/configs/permissions.stub +20 -0
- package/build/stubs/main.d.ts +5 -0
- package/build/stubs/main.js +7 -0
- package/build/stubs/migrations/create_db.stub +97 -0
- package/package.json +95 -0
|
@@ -0,0 +1,48 @@
|
|
|
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 { BaseModel, column } from '@adonisjs/lucid/orm';
|
|
8
|
+
import config from '@adonisjs/core/services/config';
|
|
9
|
+
import { MorphMap } from '../decorators.js';
|
|
10
|
+
let Permission = class Permission extends BaseModel {
|
|
11
|
+
static get table() {
|
|
12
|
+
return config.get('permissions.permissionsConfig.tables.permissions');
|
|
13
|
+
}
|
|
14
|
+
getModelId() {
|
|
15
|
+
return this.id;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
__decorate([
|
|
19
|
+
column({ isPrimary: true })
|
|
20
|
+
], Permission.prototype, "id", void 0);
|
|
21
|
+
__decorate([
|
|
22
|
+
column()
|
|
23
|
+
], Permission.prototype, "slug", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
column()
|
|
26
|
+
], Permission.prototype, "title", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
column()
|
|
29
|
+
], Permission.prototype, "entityType", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
column()
|
|
32
|
+
], Permission.prototype, "entityId", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
column()
|
|
35
|
+
], Permission.prototype, "allowed", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
column()
|
|
38
|
+
], Permission.prototype, "scope", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
column.dateTime({ autoCreate: true })
|
|
41
|
+
], Permission.prototype, "createdAt", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
column.dateTime({ autoCreate: true, autoUpdate: true })
|
|
44
|
+
], Permission.prototype, "updatedAt", void 0);
|
|
45
|
+
Permission = __decorate([
|
|
46
|
+
MorphMap(config.get('permissions.permissionsConfig.morphMaps.permissions'))
|
|
47
|
+
], Permission);
|
|
48
|
+
export default Permission;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
import { BaseModel } from '@adonisjs/lucid/orm';
|
|
3
|
+
import { AclModelInterface } from '../types.js';
|
|
4
|
+
export default class Role extends BaseModel implements AclModelInterface {
|
|
5
|
+
static get table(): string;
|
|
6
|
+
getModelId(): number;
|
|
7
|
+
id: number;
|
|
8
|
+
slug: string;
|
|
9
|
+
title: string;
|
|
10
|
+
entityType: string;
|
|
11
|
+
entityId: number | null;
|
|
12
|
+
scope: number;
|
|
13
|
+
allowed: boolean;
|
|
14
|
+
createdAt: DateTime;
|
|
15
|
+
updatedAt: DateTime;
|
|
16
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
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 { BaseModel, column } from '@adonisjs/lucid/orm';
|
|
8
|
+
import config from '@adonisjs/core/services/config';
|
|
9
|
+
import { MorphMap } from '../decorators.js';
|
|
10
|
+
let Role = class Role extends BaseModel {
|
|
11
|
+
static get table() {
|
|
12
|
+
return config.get('permissions.permissionsConfig.tables.roles');
|
|
13
|
+
}
|
|
14
|
+
getModelId() {
|
|
15
|
+
return this.id;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
__decorate([
|
|
19
|
+
column({ isPrimary: true })
|
|
20
|
+
], Role.prototype, "id", void 0);
|
|
21
|
+
__decorate([
|
|
22
|
+
column()
|
|
23
|
+
], Role.prototype, "slug", void 0);
|
|
24
|
+
__decorate([
|
|
25
|
+
column()
|
|
26
|
+
], Role.prototype, "title", void 0);
|
|
27
|
+
__decorate([
|
|
28
|
+
column()
|
|
29
|
+
], Role.prototype, "entityType", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
column()
|
|
32
|
+
], Role.prototype, "entityId", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
column()
|
|
35
|
+
], Role.prototype, "scope", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
column()
|
|
38
|
+
], Role.prototype, "allowed", void 0);
|
|
39
|
+
__decorate([
|
|
40
|
+
column.dateTime({ autoCreate: true })
|
|
41
|
+
], Role.prototype, "createdAt", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
column.dateTime({ autoCreate: true, autoUpdate: true })
|
|
44
|
+
], Role.prototype, "updatedAt", void 0);
|
|
45
|
+
Role = __decorate([
|
|
46
|
+
MorphMap(config.get('permissions.permissionsConfig.morphMaps.roles'))
|
|
47
|
+
], Role);
|
|
48
|
+
export default Role;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export default class MorphMap {
|
|
2
|
+
map = {};
|
|
3
|
+
set(alias, target) {
|
|
4
|
+
this.map[alias] = target;
|
|
5
|
+
}
|
|
6
|
+
get(alias) {
|
|
7
|
+
if (!(alias in this.map)) {
|
|
8
|
+
throw new Error('morph map not found for ' + alias);
|
|
9
|
+
}
|
|
10
|
+
return this.map[alias] || null;
|
|
11
|
+
}
|
|
12
|
+
has(alias) {
|
|
13
|
+
return alias in this.map;
|
|
14
|
+
}
|
|
15
|
+
hasTarget(target) {
|
|
16
|
+
const keys = Object.keys(this.map);
|
|
17
|
+
for (const key of keys) {
|
|
18
|
+
if (this.map[key] === target) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
getAlias(target) {
|
|
25
|
+
const keys = Object.keys(this.map);
|
|
26
|
+
for (const key of keys) {
|
|
27
|
+
if (target instanceof this.map[key] || target === this.map[key]) {
|
|
28
|
+
return key;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
throw new Error('Target not found');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export default class BaseService {
|
|
2
|
+
protected formatList(models: (string | number | any)[]): {
|
|
3
|
+
slugs: string[];
|
|
4
|
+
ids: number[];
|
|
5
|
+
};
|
|
6
|
+
protected formatListStringNumbers(models: (string | number)[]): {
|
|
7
|
+
slugs: string[];
|
|
8
|
+
ids: number[];
|
|
9
|
+
};
|
|
10
|
+
protected formatStringNumbers(models: string | number | any): {
|
|
11
|
+
slugs: string[];
|
|
12
|
+
ids: number[];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { formatList, formatListStringNumbers, formatStringNumbers } from './helper.js';
|
|
2
|
+
export default class BaseService {
|
|
3
|
+
formatList(models) {
|
|
4
|
+
return formatList(models);
|
|
5
|
+
}
|
|
6
|
+
formatListStringNumbers(models) {
|
|
7
|
+
return formatListStringNumbers(models);
|
|
8
|
+
}
|
|
9
|
+
formatStringNumbers(models) {
|
|
10
|
+
return formatStringNumbers(models);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AclModel } from '../types.js';
|
|
2
|
+
export declare function morphMap(): Promise<import("../morph_map.js").default>;
|
|
3
|
+
export declare function formatList(models: (string | number | any)[]): {
|
|
4
|
+
slugs: string[];
|
|
5
|
+
ids: number[];
|
|
6
|
+
};
|
|
7
|
+
export declare function formatListStringNumbers(models: (string | number)[]): {
|
|
8
|
+
slugs: string[];
|
|
9
|
+
ids: number[];
|
|
10
|
+
};
|
|
11
|
+
export declare function formatStringNumbers(models: string | number | any): {
|
|
12
|
+
slugs: string[];
|
|
13
|
+
ids: number[];
|
|
14
|
+
};
|
|
15
|
+
export declare function destructTarget(target?: AclModel | Function): Promise<{
|
|
16
|
+
targetClass: null;
|
|
17
|
+
targetId: null;
|
|
18
|
+
} | {
|
|
19
|
+
targetClass: string;
|
|
20
|
+
targetId: number | null;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import app from '@adonisjs/core/services/app';
|
|
2
|
+
export async function morphMap() {
|
|
3
|
+
const map = await app.container.make('morphMap');
|
|
4
|
+
return map;
|
|
5
|
+
}
|
|
6
|
+
export function formatList(models) {
|
|
7
|
+
let slugs = [];
|
|
8
|
+
let ids = [];
|
|
9
|
+
for (let model of models) {
|
|
10
|
+
if (typeof model === 'string') {
|
|
11
|
+
slugs.push(model);
|
|
12
|
+
}
|
|
13
|
+
else if (typeof model === 'number') {
|
|
14
|
+
ids.push(model);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
ids.push(model.id);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return { slugs, ids };
|
|
22
|
+
}
|
|
23
|
+
export function formatListStringNumbers(models) {
|
|
24
|
+
let slugs = [];
|
|
25
|
+
let ids = [];
|
|
26
|
+
for (let model of models) {
|
|
27
|
+
if (typeof model === 'string') {
|
|
28
|
+
slugs.push(model);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
ids.push(model);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { slugs, ids };
|
|
36
|
+
}
|
|
37
|
+
export function formatStringNumbers(models) {
|
|
38
|
+
let slugs = [];
|
|
39
|
+
let ids = [];
|
|
40
|
+
for (let model of models) {
|
|
41
|
+
if (typeof model === 'string') {
|
|
42
|
+
slugs.push(model);
|
|
43
|
+
}
|
|
44
|
+
else if (typeof model === 'number') {
|
|
45
|
+
// @ts-ignore
|
|
46
|
+
ids.push(model);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
ids.push(model.id);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { slugs, ids };
|
|
53
|
+
}
|
|
54
|
+
export async function destructTarget(target) {
|
|
55
|
+
if (!target) {
|
|
56
|
+
return {
|
|
57
|
+
targetClass: null,
|
|
58
|
+
targetId: null,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const map = await morphMap();
|
|
62
|
+
return {
|
|
63
|
+
targetClass: map.getAlias(target),
|
|
64
|
+
targetId: isAclModelInterface(target) ? target.getModelId() : null,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function isAclModelInterface(obj) {
|
|
68
|
+
return typeof obj === 'object' && typeof obj.getModelId === 'function';
|
|
69
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import Permission from '../models/permission.js';
|
|
2
|
+
import Role from '../models/role.js';
|
|
3
|
+
import { AclModel } from '../types.js';
|
|
4
|
+
import PermissionsService from './permissions/permissions_service.js';
|
|
5
|
+
import RolesService from './roles/roles_service.js';
|
|
6
|
+
export declare class ModelHasRolePermissions {
|
|
7
|
+
private model;
|
|
8
|
+
private roleService;
|
|
9
|
+
private permissionsService;
|
|
10
|
+
constructor(model: AclModel, roleService: RolesService, permissionsService: PermissionsService);
|
|
11
|
+
roles(): Promise<Role[]>;
|
|
12
|
+
hasRole(role: string | Role): Promise<boolean>;
|
|
13
|
+
hasAllRoles(roles: (string | Role)[]): Promise<boolean>;
|
|
14
|
+
hasAnyRole(roles: (string | Role)[]): Promise<boolean>;
|
|
15
|
+
assignRole(role: string | Role): Promise<boolean>;
|
|
16
|
+
revokeRole(role: string | number | Role): Promise<boolean>;
|
|
17
|
+
revokeAllRoles(roles: (string | number | Role)[]): Promise<boolean>;
|
|
18
|
+
permissions(includeForbiddens?: boolean): Promise<Permission[]>;
|
|
19
|
+
globalPermissions(includeForbiddens?: boolean): Promise<Permission[]>;
|
|
20
|
+
onResourcePermissions(includeForbiddens?: boolean): Promise<Permission[]>;
|
|
21
|
+
directGlobalPermissions(includeForbiddens?: boolean): Promise<Permission[]>;
|
|
22
|
+
directResourcePermissions(includeForbiddens?: boolean): Promise<Permission[]>;
|
|
23
|
+
containsPermission(permisison: string | Permission): Promise<boolean>;
|
|
24
|
+
containsAllPermissions(permisisons: (string | Permission)[]): Promise<boolean>;
|
|
25
|
+
containsAnyPermission(permisisons: (string | Permission)[]): Promise<boolean>;
|
|
26
|
+
containsDirectPermission(permisison: string | Permission): Promise<boolean>;
|
|
27
|
+
containsAllPermissionsDirectly(permisisons: (string | Permission)[]): Promise<boolean>;
|
|
28
|
+
containsAnyPermissionDirectly(permisisons: (string | Permission)[]): Promise<boolean>;
|
|
29
|
+
hasPermission(permisison: string | Permission, target?: AclModel | Function): Promise<boolean>;
|
|
30
|
+
hasAllPermissions(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
|
|
31
|
+
hasAnyPermission(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
|
|
32
|
+
hasAnyDirectPermission(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
|
|
33
|
+
hasDirectPermission(permisison: string | Permission, target?: AclModel | Function): Promise<boolean>;
|
|
34
|
+
hasAllPermissionsDirect(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
|
|
35
|
+
can(permisison: string | Permission, target?: AclModel | Function): Promise<boolean>;
|
|
36
|
+
canAll(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
|
|
37
|
+
canAny(permisisons: (string | Permission)[], target?: AclModel | Function): Promise<boolean>;
|
|
38
|
+
assignDirectPermission(permisison: string, target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
|
|
39
|
+
allow(permisison: string, target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
|
|
40
|
+
revokePermission(permisison: string, target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
|
|
41
|
+
revokeAllPermissions(permisisons: string[], target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
|
|
42
|
+
flushPermissions(): Promise<any[]>;
|
|
43
|
+
flush(): Promise<boolean>;
|
|
44
|
+
forbid(permisison: string, target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
|
|
45
|
+
forbidAll(permisisons: string[], target?: AclModel | Function): Promise<import("../models/model_permission.js").default[]>;
|
|
46
|
+
unforbidAll(permisisons: string[], target?: AclModel | Function): Promise<any[]>;
|
|
47
|
+
unforbid(permisison: string, target?: AclModel | Function): Promise<any[]>;
|
|
48
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { destructTarget, formatList, morphMap } from './helper.js';
|
|
2
|
+
export class ModelHasRolePermissions {
|
|
3
|
+
model;
|
|
4
|
+
roleService;
|
|
5
|
+
permissionsService;
|
|
6
|
+
constructor(model, roleService, permissionsService) {
|
|
7
|
+
this.model = model;
|
|
8
|
+
this.roleService = roleService;
|
|
9
|
+
this.permissionsService = permissionsService;
|
|
10
|
+
}
|
|
11
|
+
// roles related section BEGIN
|
|
12
|
+
async roles() {
|
|
13
|
+
const map = await morphMap();
|
|
14
|
+
return this.roleService.all(map.getAlias(this.model), this.model.getModelId());
|
|
15
|
+
}
|
|
16
|
+
async hasRole(role) {
|
|
17
|
+
const map = await morphMap();
|
|
18
|
+
return this.roleService.has(map.getAlias(this.model), this.model.getModelId(), role);
|
|
19
|
+
}
|
|
20
|
+
async hasAllRoles(roles) {
|
|
21
|
+
const map = await morphMap();
|
|
22
|
+
return this.roleService.hasAll(map.getAlias(this.model), this.model.getModelId(), roles);
|
|
23
|
+
}
|
|
24
|
+
async hasAnyRole(roles) {
|
|
25
|
+
const map = await morphMap();
|
|
26
|
+
return this.roleService.hasAll(map.getAlias(this.model), this.model.getModelId(), roles);
|
|
27
|
+
}
|
|
28
|
+
async assignRole(role) {
|
|
29
|
+
const map = await morphMap();
|
|
30
|
+
return this.roleService.assign(role, map.getAlias(this.model), this.model.getModelId());
|
|
31
|
+
}
|
|
32
|
+
revokeRole(role) {
|
|
33
|
+
return this.revokeAllRoles([role]);
|
|
34
|
+
}
|
|
35
|
+
revokeAllRoles(roles) {
|
|
36
|
+
const { slugs, ids } = formatList(roles);
|
|
37
|
+
return this.roleService.revokeAll([...slugs, ...ids], this.model);
|
|
38
|
+
}
|
|
39
|
+
// roles related section END
|
|
40
|
+
// permissions related section BEGIN
|
|
41
|
+
async permissions(includeForbiddens = false) {
|
|
42
|
+
const map = await morphMap();
|
|
43
|
+
return this.permissionsService.all(map.getAlias(this.model), this.model.getModelId(), includeForbiddens);
|
|
44
|
+
}
|
|
45
|
+
async globalPermissions(includeForbiddens = false) {
|
|
46
|
+
const map = await morphMap();
|
|
47
|
+
return this.permissionsService.global(map.getAlias(this.model), this.model.getModelId(), includeForbiddens);
|
|
48
|
+
}
|
|
49
|
+
async onResourcePermissions(includeForbiddens = false) {
|
|
50
|
+
const map = await morphMap();
|
|
51
|
+
return this.permissionsService.onResource(map.getAlias(this.model), this.model.getModelId(), includeForbiddens);
|
|
52
|
+
}
|
|
53
|
+
async directGlobalPermissions(includeForbiddens = false) {
|
|
54
|
+
const map = await morphMap();
|
|
55
|
+
return this.permissionsService.directGlobal(map.getAlias(this.model), this.model.getModelId(), includeForbiddens);
|
|
56
|
+
}
|
|
57
|
+
async directResourcePermissions(includeForbiddens = false) {
|
|
58
|
+
const map = await morphMap();
|
|
59
|
+
return this.permissionsService.directResource(map.getAlias(this.model), this.model.getModelId(), includeForbiddens);
|
|
60
|
+
}
|
|
61
|
+
async containsPermission(permisison) {
|
|
62
|
+
const map = await morphMap();
|
|
63
|
+
const result = await this.permissionsService.containsAny(map.getAlias(this.model), this.model.getModelId(), [permisison]);
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
async containsAllPermissions(permisisons) {
|
|
67
|
+
const map = await morphMap();
|
|
68
|
+
const result = await this.permissionsService.containsAll(map.getAlias(this.model), this.model.getModelId(), permisisons);
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
async containsAnyPermission(permisisons) {
|
|
72
|
+
const map = await morphMap();
|
|
73
|
+
const result = await this.permissionsService.containsAny(map.getAlias(this.model), this.model.getModelId(), permisisons);
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
async containsDirectPermission(permisison) {
|
|
77
|
+
const map = await morphMap();
|
|
78
|
+
const result = await this.permissionsService.containsAnyDirect(map.getAlias(this.model), this.model.getModelId(), [permisison]);
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
async containsAllPermissionsDirectly(permisisons) {
|
|
82
|
+
const map = await morphMap();
|
|
83
|
+
const result = await this.permissionsService.containsAllDirect(map.getAlias(this.model), this.model.getModelId(), permisisons);
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
async containsAnyPermissionDirectly(permisisons) {
|
|
87
|
+
const map = await morphMap();
|
|
88
|
+
const result = await this.permissionsService.containsAnyDirect(map.getAlias(this.model), this.model.getModelId(), permisisons);
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
async hasPermission(permisison, target) {
|
|
92
|
+
return this.hasAnyPermission([permisison], target);
|
|
93
|
+
}
|
|
94
|
+
async hasAllPermissions(permisisons, target) {
|
|
95
|
+
const map = await morphMap();
|
|
96
|
+
const entity = await destructTarget(target);
|
|
97
|
+
const result = await this.permissionsService.hasAll(map.getAlias(this.model), this.model.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
async hasAnyPermission(permisisons, target) {
|
|
101
|
+
const map = await morphMap();
|
|
102
|
+
const entity = await destructTarget(target);
|
|
103
|
+
const result = await this.permissionsService.hasAny(map.getAlias(this.model), this.model.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
async hasAnyDirectPermission(permisisons, target) {
|
|
107
|
+
const map = await morphMap();
|
|
108
|
+
const entity = await destructTarget(target);
|
|
109
|
+
const result = await this.permissionsService.hasAnyDirect(map.getAlias(this.model), this.model.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
async hasDirectPermission(permisison, target) {
|
|
113
|
+
return this.hasAnyDirectPermission([permisison], target);
|
|
114
|
+
}
|
|
115
|
+
async hasAllPermissionsDirect(permisisons, target) {
|
|
116
|
+
const map = await morphMap();
|
|
117
|
+
const entity = await destructTarget(target);
|
|
118
|
+
const result = await this.permissionsService.hasAllDirect(map.getAlias(this.model), this.model.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
can(permisison, target) {
|
|
122
|
+
return this.hasPermission(permisison, target);
|
|
123
|
+
}
|
|
124
|
+
canAll(permisisons, target) {
|
|
125
|
+
return this.hasAllPermissions(permisisons, target);
|
|
126
|
+
}
|
|
127
|
+
canAny(permisisons, target) {
|
|
128
|
+
return this.hasAnyPermission(permisisons, target);
|
|
129
|
+
}
|
|
130
|
+
async assignDirectPermission(permisison, target) {
|
|
131
|
+
const map = await morphMap();
|
|
132
|
+
const entity = await destructTarget(target);
|
|
133
|
+
return this.permissionsService.giveAll(map.getAlias(this.model), this.model.getModelId(), [permisison], entity.targetClass, entity.targetId, true);
|
|
134
|
+
}
|
|
135
|
+
allow(permisison, target) {
|
|
136
|
+
return this.assignDirectPermission(permisison, target);
|
|
137
|
+
}
|
|
138
|
+
async revokePermission(permisison, target) {
|
|
139
|
+
return this.revokeAllPermissions([permisison], target);
|
|
140
|
+
}
|
|
141
|
+
async revokeAllPermissions(permisisons, target) {
|
|
142
|
+
const map = await morphMap();
|
|
143
|
+
const entity = await destructTarget(target);
|
|
144
|
+
return this.permissionsService.revokeAll(map.getAlias(this.model), this.model.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
145
|
+
}
|
|
146
|
+
async flushPermissions() {
|
|
147
|
+
const map = await morphMap();
|
|
148
|
+
return this.permissionsService.flush(map.getAlias(this.model), this.model.getModelId());
|
|
149
|
+
}
|
|
150
|
+
async flush() {
|
|
151
|
+
const map = await morphMap();
|
|
152
|
+
await this.permissionsService.flush(map.getAlias(this.model), this.model.getModelId());
|
|
153
|
+
await this.roleService.flush(map.getAlias(this.model), this.model.getModelId());
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
async forbid(permisison, target) {
|
|
157
|
+
return this.forbidAll([permisison], target);
|
|
158
|
+
}
|
|
159
|
+
async forbidAll(permisisons, target) {
|
|
160
|
+
const map = await morphMap();
|
|
161
|
+
const entity = await destructTarget(target);
|
|
162
|
+
return this.permissionsService.forbidAll(map.getAlias(this.model), this.model.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
163
|
+
}
|
|
164
|
+
async unforbidAll(permisisons, target) {
|
|
165
|
+
const map = await morphMap();
|
|
166
|
+
const entity = await destructTarget(target);
|
|
167
|
+
return this.permissionsService.unforbidAll(map.getAlias(this.model), this.model.getModelId(), permisisons, entity.targetClass, entity.targetId);
|
|
168
|
+
}
|
|
169
|
+
async unforbid(permisison, target) {
|
|
170
|
+
return this.unforbidAll([permisison], target);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import ModelPermission from '../models/model_permission.js';
|
|
2
|
+
import ModelRole from '../models/model_role.js';
|
|
3
|
+
export default class ModelService {
|
|
4
|
+
all(roleId: number): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof ModelRole, ModelRole>;
|
|
5
|
+
allFor(modelType: string, roleId: number): Promise<any>;
|
|
6
|
+
allByPermission(permissionId: number): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof ModelPermission, ModelPermission>;
|
|
7
|
+
allByPermissionFor(modelType: string, permisisonId: number): Promise<any>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import ModelPermission from '../models/model_permission.js';
|
|
2
|
+
import ModelRole from '../models/model_role.js';
|
|
3
|
+
import { morphMap } from './helper.js';
|
|
4
|
+
export default class ModelService {
|
|
5
|
+
all(roleId) {
|
|
6
|
+
return ModelRole.query().where('role_id', roleId);
|
|
7
|
+
}
|
|
8
|
+
async allFor(modelType, roleId) {
|
|
9
|
+
const map = await morphMap();
|
|
10
|
+
const modelClass = map.get(modelType);
|
|
11
|
+
return modelClass
|
|
12
|
+
.query()
|
|
13
|
+
.join(ModelRole.table + ' as mr', 'mr.model_id', '=', modelClass.table + '.id')
|
|
14
|
+
.where('mr.role_id', roleId)
|
|
15
|
+
.where('mr.model_type', modelType);
|
|
16
|
+
}
|
|
17
|
+
allByPermission(permissionId) {
|
|
18
|
+
return ModelPermission.query()
|
|
19
|
+
.where('permission_id', permissionId)
|
|
20
|
+
.groupBy(['model_type', 'model_id']);
|
|
21
|
+
}
|
|
22
|
+
async allByPermissionFor(modelType, permisisonId) {
|
|
23
|
+
const map = await morphMap();
|
|
24
|
+
const modelClass = map.get(modelType);
|
|
25
|
+
return modelClass
|
|
26
|
+
.query()
|
|
27
|
+
.join(ModelPermission.table + ' as mp', 'mp.model_id', '=', modelClass.table + '.id')
|
|
28
|
+
.where('mp.permission_id', permisisonId)
|
|
29
|
+
.where('mp.model_type', modelType);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import ModelPermission from '../../models/model_permission.js';
|
|
2
|
+
import Permission from '../../models/permission.js';
|
|
3
|
+
import Role from '../../models/role.js';
|
|
4
|
+
import { AclModel } from '../../types.js';
|
|
5
|
+
import ModelService from '../model_service.js';
|
|
6
|
+
import RolesService from '../roles/roles_service.js';
|
|
7
|
+
import PermissionsService from './permissions_service.js';
|
|
8
|
+
export default class PermissionHasModelRoles {
|
|
9
|
+
private permission;
|
|
10
|
+
private roleService;
|
|
11
|
+
private permissionService;
|
|
12
|
+
private modelService;
|
|
13
|
+
constructor(permission: Permission, roleService: RolesService, permissionService: PermissionsService, modelService: ModelService);
|
|
14
|
+
models(): import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<typeof ModelPermission, ModelPermission>;
|
|
15
|
+
modelsFor(modelType: string): Promise<any>;
|
|
16
|
+
roles(): Promise<Role[]>;
|
|
17
|
+
belongsToRole(role: string | number): Promise<boolean>;
|
|
18
|
+
attachToRole(role: string | number, target?: AclModel | Function): Promise<ModelPermission[]>;
|
|
19
|
+
detachFromRole(role: string | number): Promise<any[]>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import ModelPermission from '../../models/model_permission.js';
|
|
2
|
+
import Role from '../../models/role.js';
|
|
3
|
+
import { destructTarget, morphMap } from '../helper.js';
|
|
4
|
+
export default class PermissionHasModelRoles {
|
|
5
|
+
permission;
|
|
6
|
+
roleService;
|
|
7
|
+
permissionService;
|
|
8
|
+
modelService;
|
|
9
|
+
constructor(permission, roleService, permissionService, modelService) {
|
|
10
|
+
this.permission = permission;
|
|
11
|
+
this.roleService = roleService;
|
|
12
|
+
this.permissionService = permissionService;
|
|
13
|
+
this.modelService = modelService;
|
|
14
|
+
}
|
|
15
|
+
models() {
|
|
16
|
+
return this.modelService.allByPermission(this.permission.getModelId());
|
|
17
|
+
}
|
|
18
|
+
modelsFor(modelType) {
|
|
19
|
+
return this.modelService.allByPermissionFor(modelType, this.permission.getModelId());
|
|
20
|
+
}
|
|
21
|
+
async roles() {
|
|
22
|
+
const map = await morphMap();
|
|
23
|
+
return this.roleService
|
|
24
|
+
.roleModelPermissionQuery(map.getAlias(Role))
|
|
25
|
+
.where('mp.permission_id', this.permission.id);
|
|
26
|
+
}
|
|
27
|
+
async belongsToRole(role) {
|
|
28
|
+
const map = await morphMap();
|
|
29
|
+
const q = this.roleService
|
|
30
|
+
.roleModelPermissionQuery(map.getAlias(Role))
|
|
31
|
+
.where('mp.permission_id', this.permission.id);
|
|
32
|
+
if (typeof role === 'string') {
|
|
33
|
+
q.where(Role.table + '.slug', role);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
q.where(Role.table + '.id', role);
|
|
37
|
+
}
|
|
38
|
+
const r = await q.select(Role.table + '.id').limit(1);
|
|
39
|
+
return r.length > 0;
|
|
40
|
+
}
|
|
41
|
+
async attachToRole(role, target) {
|
|
42
|
+
if (typeof role === 'string') {
|
|
43
|
+
const r = await Role.query().where('slug', role).first();
|
|
44
|
+
if (!r) {
|
|
45
|
+
throw new Error('Role not found');
|
|
46
|
+
}
|
|
47
|
+
role = r.id;
|
|
48
|
+
}
|
|
49
|
+
const map = await morphMap();
|
|
50
|
+
const entity = await destructTarget(target);
|
|
51
|
+
return this.permissionService.giveAll(map.getAlias(Role), role, [this.permission.slug], entity.targetClass, entity.targetId, true);
|
|
52
|
+
}
|
|
53
|
+
async detachFromRole(role) {
|
|
54
|
+
if (typeof role === 'string') {
|
|
55
|
+
const r = await Role.query().where('slug', role).first();
|
|
56
|
+
if (!r) {
|
|
57
|
+
throw new Error('Role not found');
|
|
58
|
+
}
|
|
59
|
+
role = r.id;
|
|
60
|
+
}
|
|
61
|
+
const map = await morphMap();
|
|
62
|
+
return ModelPermission.query()
|
|
63
|
+
.where('model_type', map.getAlias(Role))
|
|
64
|
+
.where('model_id', role)
|
|
65
|
+
.delete();
|
|
66
|
+
}
|
|
67
|
+
}
|