@memberjunction/core-entities 5.28.0 → 5.30.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/dist/custom/MJConversationDetailEntityExtended.d.ts +31 -0
- package/dist/custom/MJConversationDetailEntityExtended.d.ts.map +1 -0
- package/dist/custom/MJConversationDetailEntityExtended.js +106 -0
- package/dist/custom/MJConversationDetailEntityExtended.js.map +1 -0
- package/dist/custom/PermissionProviders/AIAgentPermissionProvider.d.ts +31 -0
- package/dist/custom/PermissionProviders/AIAgentPermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/AIAgentPermissionProvider.js +151 -0
- package/dist/custom/PermissionProviders/AIAgentPermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/AccessControlRuleProvider.d.ts +45 -0
- package/dist/custom/PermissionProviders/AccessControlRuleProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/AccessControlRuleProvider.js +253 -0
- package/dist/custom/PermissionProviders/AccessControlRuleProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/ApplicationRolePermissionProvider.d.ts +28 -0
- package/dist/custom/PermissionProviders/ApplicationRolePermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/ApplicationRolePermissionProvider.js +144 -0
- package/dist/custom/PermissionProviders/ApplicationRolePermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/ArtifactPermissionProvider.d.ts +45 -0
- package/dist/custom/PermissionProviders/ArtifactPermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/ArtifactPermissionProvider.js +169 -0
- package/dist/custom/PermissionProviders/ArtifactPermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/CollectionPermissionProvider.d.ts +40 -0
- package/dist/custom/PermissionProviders/CollectionPermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/CollectionPermissionProvider.js +220 -0
- package/dist/custom/PermissionProviders/CollectionPermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/DashboardPermissionProvider.d.ts +47 -0
- package/dist/custom/PermissionProviders/DashboardPermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/DashboardPermissionProvider.js +218 -0
- package/dist/custom/PermissionProviders/DashboardPermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/EntityPermissionProvider.d.ts +25 -0
- package/dist/custom/PermissionProviders/EntityPermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/EntityPermissionProvider.js +129 -0
- package/dist/custom/PermissionProviders/EntityPermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/QueryPermissionProvider.d.ts +24 -0
- package/dist/custom/PermissionProviders/QueryPermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/QueryPermissionProvider.js +123 -0
- package/dist/custom/PermissionProviders/QueryPermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/ResourcePermissionProvider.d.ts +39 -0
- package/dist/custom/PermissionProviders/ResourcePermissionProvider.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/ResourcePermissionProvider.js +193 -0
- package/dist/custom/PermissionProviders/ResourcePermissionProvider.js.map +1 -0
- package/dist/custom/PermissionProviders/index.d.ts +16 -0
- package/dist/custom/PermissionProviders/index.d.ts.map +1 -0
- package/dist/custom/PermissionProviders/index.js +41 -0
- package/dist/custom/PermissionProviders/index.js.map +1 -0
- package/dist/custom/Permissions/BaseShareEntityExtended.d.ts +105 -0
- package/dist/custom/Permissions/BaseShareEntityExtended.d.ts.map +1 -0
- package/dist/custom/Permissions/BaseShareEntityExtended.js +162 -0
- package/dist/custom/Permissions/BaseShareEntityExtended.js.map +1 -0
- package/dist/custom/Permissions/MJAccessControlRuleEntityExtended.d.ts +22 -0
- package/dist/custom/Permissions/MJAccessControlRuleEntityExtended.d.ts.map +1 -0
- package/dist/custom/Permissions/MJAccessControlRuleEntityExtended.js +75 -0
- package/dist/custom/Permissions/MJAccessControlRuleEntityExtended.js.map +1 -0
- package/dist/custom/Permissions/MJArtifactPermissionEntityExtended.d.ts +22 -0
- package/dist/custom/Permissions/MJArtifactPermissionEntityExtended.d.ts.map +1 -0
- package/dist/custom/Permissions/MJArtifactPermissionEntityExtended.js +114 -0
- package/dist/custom/Permissions/MJArtifactPermissionEntityExtended.js.map +1 -0
- package/dist/custom/Permissions/MJCollectionPermissionEntityExtended.d.ts +25 -0
- package/dist/custom/Permissions/MJCollectionPermissionEntityExtended.d.ts.map +1 -0
- package/dist/custom/Permissions/MJCollectionPermissionEntityExtended.js +101 -0
- package/dist/custom/Permissions/MJCollectionPermissionEntityExtended.js.map +1 -0
- package/dist/custom/Permissions/MJDashboardPermissionEntityExtended.d.ts +32 -0
- package/dist/custom/Permissions/MJDashboardPermissionEntityExtended.d.ts.map +1 -0
- package/dist/custom/Permissions/MJDashboardPermissionEntityExtended.js +95 -0
- package/dist/custom/Permissions/MJDashboardPermissionEntityExtended.js.map +1 -0
- package/dist/custom/Permissions/index.d.ts +13 -0
- package/dist/custom/Permissions/index.d.ts.map +1 -0
- package/dist/custom/Permissions/index.js +22 -0
- package/dist/custom/Permissions/index.js.map +1 -0
- package/dist/custom/Permissions/shareNotification.d.ts +72 -0
- package/dist/custom/Permissions/shareNotification.d.ts.map +1 -0
- package/dist/custom/Permissions/shareNotification.js +98 -0
- package/dist/custom/Permissions/shareNotification.js.map +1 -0
- package/dist/custom/ResourcePermissions/MJResourcePermissionEntityExtended.d.ts +63 -1
- package/dist/custom/ResourcePermissions/MJResourcePermissionEntityExtended.d.ts.map +1 -1
- package/dist/custom/ResourcePermissions/MJResourcePermissionEntityExtended.js +244 -27
- package/dist/custom/ResourcePermissions/MJResourcePermissionEntityExtended.js.map +1 -1
- package/dist/custom/ResourcePermissions/ResourcePermissionEngine.d.ts +7 -0
- package/dist/custom/ResourcePermissions/ResourcePermissionEngine.d.ts.map +1 -1
- package/dist/custom/ResourcePermissions/ResourcePermissionEngine.js +13 -0
- package/dist/custom/ResourcePermissions/ResourcePermissionEngine.js.map +1 -1
- package/dist/engines/GeoDataEngine.d.ts +42 -8
- package/dist/engines/GeoDataEngine.d.ts.map +1 -1
- package/dist/engines/GeoDataEngine.js +191 -36
- package/dist/engines/GeoDataEngine.js.map +1 -1
- package/dist/engines/MCPEngine.d.ts +20 -1
- package/dist/engines/MCPEngine.d.ts.map +1 -1
- package/dist/engines/MCPEngine.js +31 -0
- package/dist/engines/MCPEngine.js.map +1 -1
- package/dist/engines/PermissionEngine.d.ts +142 -0
- package/dist/engines/PermissionEngine.d.ts.map +1 -0
- package/dist/engines/PermissionEngine.js +343 -0
- package/dist/engines/PermissionEngine.js.map +1 -0
- package/dist/engines/UserInfoEngine.d.ts +6 -1
- package/dist/engines/UserInfoEngine.d.ts.map +1 -1
- package/dist/engines/UserInfoEngine.js +21 -5
- package/dist/engines/UserInfoEngine.js.map +1 -1
- package/dist/engines/conversations.d.ts +35 -0
- package/dist/engines/conversations.d.ts.map +1 -1
- package/dist/engines/conversations.js +103 -16
- package/dist/engines/conversations.js.map +1 -1
- package/dist/generated/entity_subclasses.d.ts +1593 -78
- package/dist/generated/entity_subclasses.d.ts.map +1 -1
- package/dist/generated/entity_subclasses.js +2440 -352
- package/dist/generated/entity_subclasses.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,129 @@
|
|
|
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 { Metadata, PermissionProviderBase, } from '@memberjunction/core';
|
|
8
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
9
|
+
/**
|
|
10
|
+
* Wraps the {@link Metadata} + `EntityInfo.GetUserPermisions()` path behind the
|
|
11
|
+
* unified {@link PermissionProviderBase} contract. Entity permissions are role-only,
|
|
12
|
+
* additive (OR across roles), and cover the CRUD action set only.
|
|
13
|
+
*
|
|
14
|
+
* `resourceType` is the entity name (e.g., `"Users"`).
|
|
15
|
+
* `resourceId` is unused — entity permissions are domain-wide per entity, not per-row.
|
|
16
|
+
* Row-level filters are a separate concern handled by the RLS system.
|
|
17
|
+
*/
|
|
18
|
+
let EntityPermissionProvider = class EntityPermissionProvider extends PermissionProviderBase {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.DomainName = 'Entity Permissions';
|
|
22
|
+
this.Description = 'CRUD permissions on MJ entities, role-based with optional row-level security filters and explicit Allow/Deny rows';
|
|
23
|
+
this.SupportedGranteeTypes = ['Role'];
|
|
24
|
+
this.SupportedActions = ['Read', 'Create', 'Update', 'Delete'];
|
|
25
|
+
this.SupportsDeny = true;
|
|
26
|
+
}
|
|
27
|
+
GetResourceTypes() {
|
|
28
|
+
return new Metadata().Entities.map((e) => e.Name).sort((a, b) => a.localeCompare(b));
|
|
29
|
+
}
|
|
30
|
+
async CheckPermission(user, resourceType, _resourceId, action) {
|
|
31
|
+
const md = new Metadata();
|
|
32
|
+
const entity = md.EntityByName(resourceType);
|
|
33
|
+
if (!entity) {
|
|
34
|
+
return {
|
|
35
|
+
Allowed: false,
|
|
36
|
+
DomainName: this.DomainName,
|
|
37
|
+
Reason: `Entity '${resourceType}' not found in metadata`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const perms = entity.GetUserPermisions(user);
|
|
41
|
+
const allowed = this.checkActionOnPermission(perms, action);
|
|
42
|
+
return {
|
|
43
|
+
Allowed: allowed,
|
|
44
|
+
DomainName: this.DomainName,
|
|
45
|
+
Reason: allowed
|
|
46
|
+
? `Role grants ${action} on entity '${resourceType}'`
|
|
47
|
+
: `No role grants ${action} on entity '${resourceType}'`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async GetEffectivePermissions(user, resourceType, _resourceId) {
|
|
51
|
+
const md = new Metadata();
|
|
52
|
+
const entity = md.EntityByName(resourceType);
|
|
53
|
+
if (!entity)
|
|
54
|
+
return [];
|
|
55
|
+
const actions = this.resolveActions(entity.GetUserPermisions(user));
|
|
56
|
+
if (actions.length === 0)
|
|
57
|
+
return [];
|
|
58
|
+
return [this.buildNormalizedPermission({
|
|
59
|
+
resourceType, resourceId: null, resourceName: resourceType,
|
|
60
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name, actions,
|
|
61
|
+
})];
|
|
62
|
+
}
|
|
63
|
+
async GetUserResources(user, resourceType) {
|
|
64
|
+
const md = new Metadata();
|
|
65
|
+
const entities = resourceType
|
|
66
|
+
? md.Entities.filter((e) => e.Name === resourceType)
|
|
67
|
+
: md.Entities;
|
|
68
|
+
const results = [];
|
|
69
|
+
for (const entity of entities) {
|
|
70
|
+
const actions = this.resolveActions(entity.GetUserPermisions(user));
|
|
71
|
+
if (actions.length === 0)
|
|
72
|
+
continue;
|
|
73
|
+
results.push(this.buildNormalizedPermission({
|
|
74
|
+
resourceType: entity.Name, resourceId: null, resourceName: entity.Name,
|
|
75
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name, actions,
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
async GetResourcePermissions(resourceType, _resourceId) {
|
|
81
|
+
const md = new Metadata();
|
|
82
|
+
const entity = md.EntityByName(resourceType);
|
|
83
|
+
if (!entity)
|
|
84
|
+
return [];
|
|
85
|
+
const results = [];
|
|
86
|
+
for (const ep of entity.Permissions) {
|
|
87
|
+
const actions = this.resolveActions(ep);
|
|
88
|
+
if (actions.length === 0)
|
|
89
|
+
continue;
|
|
90
|
+
const role = md.Roles.find((r) => UUIDsEqual(r.ID, ep.RoleID));
|
|
91
|
+
const isDeny = (ep.Type || 'Allow').trim().toLowerCase() === 'deny';
|
|
92
|
+
results.push(this.buildNormalizedPermission({
|
|
93
|
+
resourceType, resourceId: null, resourceName: resourceType,
|
|
94
|
+
granteeType: 'Role', granteeId: ep.RoleID,
|
|
95
|
+
granteeName: role?.Name ?? ep.RoleID, actions,
|
|
96
|
+
effect: isDeny ? 'Deny' : 'Allow',
|
|
97
|
+
sourceRecordId: ep.ID,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
checkActionOnPermission(perms, action) {
|
|
103
|
+
switch (action) {
|
|
104
|
+
case 'Read':
|
|
105
|
+
return perms.CanRead;
|
|
106
|
+
case 'Create':
|
|
107
|
+
return perms.CanCreate;
|
|
108
|
+
case 'Update':
|
|
109
|
+
return perms.CanUpdate;
|
|
110
|
+
case 'Delete':
|
|
111
|
+
return perms.CanDelete;
|
|
112
|
+
default:
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
resolveActions(perms) {
|
|
117
|
+
return this.boolsToActions({
|
|
118
|
+
Read: perms.CanRead,
|
|
119
|
+
Create: perms.CanCreate,
|
|
120
|
+
Update: perms.CanUpdate,
|
|
121
|
+
Delete: perms.CanDelete,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
EntityPermissionProvider = __decorate([
|
|
126
|
+
RegisterClass(PermissionProviderBase, 'MJEntityPermissionProvider')
|
|
127
|
+
], EntityPermissionProvider);
|
|
128
|
+
export { EntityPermissionProvider };
|
|
129
|
+
//# sourceMappingURL=EntityPermissionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityPermissionProvider.js","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/EntityPermissionProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { GranteeType, NormalizedPermission, PermissionAction, PermissionCheckResult, PermissionProviderBase, UserInfo } from '@memberjunction/core';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps `MJ: Query Permissions` behind the unified {@link PermissionProviderBase} contract.
|
|
4
|
+
*
|
|
5
|
+
* Query permissions are role-only and use existence semantics: a row indicates the role
|
|
6
|
+
* is allowed to execute the query; the absence of a row denies it. There are no CRUD flags.
|
|
7
|
+
* This provider exposes `Execute` as the single canonical action.
|
|
8
|
+
*
|
|
9
|
+
* `resourceType` is `"Queries"`. `resourceId` is the query ID.
|
|
10
|
+
*/
|
|
11
|
+
export declare class QueryPermissionProvider extends PermissionProviderBase {
|
|
12
|
+
readonly DomainName = "Query Permissions";
|
|
13
|
+
readonly Description = "Role-based Execute permission on MJ queries. Row existence = permission granted.";
|
|
14
|
+
readonly SupportedGranteeTypes: GranteeType[];
|
|
15
|
+
readonly SupportedActions: PermissionAction[];
|
|
16
|
+
readonly SupportsDeny = false;
|
|
17
|
+
GetResourceTypes(): string[];
|
|
18
|
+
CheckPermission(user: UserInfo, _resourceType: string, resourceId: string | null, action: PermissionAction): Promise<PermissionCheckResult>;
|
|
19
|
+
GetEffectivePermissions(user: UserInfo, _resourceType: string, resourceId: string): Promise<NormalizedPermission[]>;
|
|
20
|
+
GetUserResources(user: UserInfo, resourceType?: string): Promise<NormalizedPermission[]>;
|
|
21
|
+
GetResourcePermissions(resourceType: string, resourceId: string): Promise<NormalizedPermission[]>;
|
|
22
|
+
private fetchPermissionsForQuery;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=QueryPermissionProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryPermissionProvider.d.ts","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/QueryPermissionProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EAEX,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACX,MAAM,sBAAsB,CAAC;AAW9B;;;;;;;;GAQG;AACH,qBACa,uBAAwB,SAAQ,sBAAsB;IAC/D,QAAQ,CAAC,UAAU,uBAAuB;IAC1C,QAAQ,CAAC,WAAW,sFAAsF;IAC1G,QAAQ,CAAC,qBAAqB,EAAE,WAAW,EAAE,CAAY;IACzD,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,CAAe;IAC5D,QAAQ,CAAC,YAAY,SAAS;IAErB,gBAAgB,IAAI,MAAM,EAAE;IAI/B,eAAe,CACjB,IAAI,EAAE,QAAQ,EACd,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,qBAAqB,CAAC;IA4B3B,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgBnH,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA8BxF,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAqBzF,wBAAwB;CAQzC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
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 { Metadata, PermissionProviderBase, } from '@memberjunction/core';
|
|
8
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
9
|
+
/**
|
|
10
|
+
* Wraps `MJ: Query Permissions` behind the unified {@link PermissionProviderBase} contract.
|
|
11
|
+
*
|
|
12
|
+
* Query permissions are role-only and use existence semantics: a row indicates the role
|
|
13
|
+
* is allowed to execute the query; the absence of a row denies it. There are no CRUD flags.
|
|
14
|
+
* This provider exposes `Execute` as the single canonical action.
|
|
15
|
+
*
|
|
16
|
+
* `resourceType` is `"Queries"`. `resourceId` is the query ID.
|
|
17
|
+
*/
|
|
18
|
+
let QueryPermissionProvider = class QueryPermissionProvider extends PermissionProviderBase {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.DomainName = 'Query Permissions';
|
|
22
|
+
this.Description = 'Role-based Execute permission on MJ queries. Row existence = permission granted.';
|
|
23
|
+
this.SupportedGranteeTypes = ['Role'];
|
|
24
|
+
this.SupportedActions = ['Execute'];
|
|
25
|
+
this.SupportsDeny = false;
|
|
26
|
+
}
|
|
27
|
+
GetResourceTypes() {
|
|
28
|
+
return ['Queries'];
|
|
29
|
+
}
|
|
30
|
+
async CheckPermission(user, _resourceType, resourceId, action) {
|
|
31
|
+
if (action !== 'Execute') {
|
|
32
|
+
return {
|
|
33
|
+
Allowed: false,
|
|
34
|
+
DomainName: this.DomainName,
|
|
35
|
+
Reason: `Query Permissions only support Execute (got '${action}')`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (!resourceId) {
|
|
39
|
+
return {
|
|
40
|
+
Allowed: false,
|
|
41
|
+
DomainName: this.DomainName,
|
|
42
|
+
Reason: 'Query permissions require a specific query ID',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const rows = await this.fetchPermissionsForQuery(resourceId);
|
|
46
|
+
const userRoleIds = (user.UserRoles ?? []).map((ur) => ur.RoleID);
|
|
47
|
+
const match = rows.some((row) => userRoleIds.some((rid) => UUIDsEqual(row.RoleID, rid)));
|
|
48
|
+
return {
|
|
49
|
+
Allowed: match,
|
|
50
|
+
DomainName: this.DomainName,
|
|
51
|
+
Reason: match
|
|
52
|
+
? `User has a role that grants Execute on query '${resourceId}'`
|
|
53
|
+
: `No role grants Execute on query '${resourceId}'`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async GetEffectivePermissions(user, _resourceType, resourceId) {
|
|
57
|
+
const rows = await this.fetchPermissionsForQuery(resourceId);
|
|
58
|
+
const userRoleIds = (user.UserRoles ?? []).map((ur) => ur.RoleID);
|
|
59
|
+
const matchingRows = rows.filter((row) => userRoleIds.some((rid) => UUIDsEqual(row.RoleID, rid)));
|
|
60
|
+
if (matchingRows.length === 0)
|
|
61
|
+
return [];
|
|
62
|
+
const nameMap = await this.bulkLookupNames('Queries', [resourceId]);
|
|
63
|
+
const queryName = nameMap.get(resourceId);
|
|
64
|
+
return matchingRows.map((row) => this.buildNormalizedPermission({
|
|
65
|
+
resourceType: 'Queries', resourceId, resourceName: queryName,
|
|
66
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name,
|
|
67
|
+
actions: ['Execute'],
|
|
68
|
+
sourceRecordId: row.ID,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
async GetUserResources(user, resourceType) {
|
|
72
|
+
if (resourceType && resourceType !== 'Queries')
|
|
73
|
+
return [];
|
|
74
|
+
const userRoleIds = (user.UserRoles ?? []).map((ur) => ur.RoleID);
|
|
75
|
+
if (userRoleIds.length === 0)
|
|
76
|
+
return [];
|
|
77
|
+
const rows = await this.fetchRows('MJ: Query Permissions', `RoleID IN (${userRoleIds.map((r) => `'${r}'`).join(',')})`, ['ID', 'QueryID', 'RoleID', 'Query'], 'GetUserResources');
|
|
78
|
+
// Deduplicate: multiple roles may grant the same query.
|
|
79
|
+
const seen = new Set();
|
|
80
|
+
const results = [];
|
|
81
|
+
for (const row of rows) {
|
|
82
|
+
if (seen.has(row.QueryID))
|
|
83
|
+
continue;
|
|
84
|
+
seen.add(row.QueryID);
|
|
85
|
+
results.push(this.buildNormalizedPermission({
|
|
86
|
+
resourceType: 'Queries', resourceId: row.QueryID,
|
|
87
|
+
resourceName: row.Query ?? undefined,
|
|
88
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name,
|
|
89
|
+
actions: ['Execute'],
|
|
90
|
+
sourceRecordId: row.ID,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
return results;
|
|
94
|
+
}
|
|
95
|
+
async GetResourcePermissions(resourceType, resourceId) {
|
|
96
|
+
if (resourceType !== 'Queries')
|
|
97
|
+
return [];
|
|
98
|
+
const rows = await this.fetchPermissionsForQuery(resourceId);
|
|
99
|
+
if (rows.length === 0)
|
|
100
|
+
return [];
|
|
101
|
+
const md = new Metadata();
|
|
102
|
+
const nameMap = await this.bulkLookupNames('Queries', [resourceId]);
|
|
103
|
+
const queryName = nameMap.get(resourceId);
|
|
104
|
+
return rows.map((row) => {
|
|
105
|
+
const role = md.Roles.find((r) => UUIDsEqual(r.ID, row.RoleID));
|
|
106
|
+
return this.buildNormalizedPermission({
|
|
107
|
+
resourceType: 'Queries', resourceId, resourceName: queryName,
|
|
108
|
+
granteeType: 'Role', granteeId: row.RoleID,
|
|
109
|
+
granteeName: role?.Name ?? row.Role ?? undefined,
|
|
110
|
+
actions: ['Execute'],
|
|
111
|
+
sourceRecordId: row.ID,
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async fetchPermissionsForQuery(queryId) {
|
|
116
|
+
return this.fetchRows('MJ: Query Permissions', `QueryID='${queryId}'`, ['ID', 'QueryID', 'RoleID', 'Role'], 'fetchPermissionsForQuery');
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
QueryPermissionProvider = __decorate([
|
|
120
|
+
RegisterClass(PermissionProviderBase, 'MJQueryPermissionProvider')
|
|
121
|
+
], QueryPermissionProvider);
|
|
122
|
+
export { QueryPermissionProvider };
|
|
123
|
+
//# sourceMappingURL=QueryPermissionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryPermissionProvider.js","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/QueryPermissionProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { GranteeType, NormalizedPermission, PermissionAction, PermissionCheckResult, PermissionProviderBase, UserInfo } from '@memberjunction/core';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps {@link ResourcePermissionEngine.GetUserResourcePermissionLevel} behind the
|
|
4
|
+
* unified {@link PermissionProviderBase} contract.
|
|
5
|
+
*
|
|
6
|
+
* Resource permissions support both Users and Roles as grantees and use a hierarchical
|
|
7
|
+
* level model (View < Edit < Owner). The provider translates those levels into canonical
|
|
8
|
+
* action sets: View → [Read], Edit → [Read, Update], Owner → [Read, Update, Delete, Share, Admin].
|
|
9
|
+
*
|
|
10
|
+
* `resourceType` is the human-readable name from the `MJ: Resource Types` entity
|
|
11
|
+
* (e.g., `"User Views"`, `"Reports"`). `resourceId` is the target record ID.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ResourcePermissionProvider extends PermissionProviderBase {
|
|
14
|
+
readonly DomainName = "Resource Permissions";
|
|
15
|
+
readonly Description = "Generic resource sharing with User or Role grantees, hierarchical View/Edit/Owner levels, and status workflow";
|
|
16
|
+
readonly SupportedGranteeTypes: GranteeType[];
|
|
17
|
+
readonly SupportedActions: PermissionAction[];
|
|
18
|
+
readonly SupportsDeny = false;
|
|
19
|
+
GetResourceTypes(): string[];
|
|
20
|
+
CheckPermission(user: UserInfo, resourceType: string, resourceId: string | null, action: PermissionAction): Promise<PermissionCheckResult>;
|
|
21
|
+
GetEffectivePermissions(user: UserInfo, resourceType: string, resourceId: string): Promise<NormalizedPermission[]>;
|
|
22
|
+
GetUserResources(user: UserInfo, resourceType?: string): Promise<NormalizedPermission[]>;
|
|
23
|
+
GetResourcePermissions(resourceType: string, resourceId: string): Promise<NormalizedPermission[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Rows granted directly by this user to *other* users. Uses the
|
|
26
|
+
* `SharedByUserID` column (added in migration
|
|
27
|
+
* `V202604231235__v5.29.x__ResourcePermission_SharedByUserID.sql`) so every
|
|
28
|
+
* resource type that writes through `MJ: Resource Permissions` surfaces
|
|
29
|
+
* correctly in the end-user Sharing Center's "Shared by me" tab.
|
|
30
|
+
*
|
|
31
|
+
* Only Approved, User-grantee rows are returned — pending requests
|
|
32
|
+
* (`Status === 'Requested'`) and Role grants don't belong in a personal
|
|
33
|
+
* sharing view.
|
|
34
|
+
*/
|
|
35
|
+
GetPermissionsGrantedByUser(grantor: UserInfo): Promise<NormalizedPermission[]>;
|
|
36
|
+
private resolveResourceTypeId;
|
|
37
|
+
private actionsForLevel;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ResourcePermissionProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePermissionProvider.d.ts","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/ResourcePermissionProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EAEX,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACX,MAAM,sBAAsB,CAAC;AAK9B;;;;;;;;;;GAUG;AACH,qBACa,0BAA2B,SAAQ,sBAAsB;IAClE,QAAQ,CAAC,UAAU,0BAA0B;IAC7C,QAAQ,CAAC,WAAW,mHACgG;IACpH,QAAQ,CAAC,qBAAqB,EAAE,WAAW,EAAE,CAAoB;IACjE,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,CAAkD;IAC/F,QAAQ,CAAC,YAAY,SAAS;IAErB,gBAAgB,IAAI,MAAM,EAAE;IAQ/B,eAAe,CACjB,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,qBAAqB,CAAC;IA6B3B,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAclH,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA2BxF,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgCvG;;;;;;;;;;OAUG;IACY,2BAA2B,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAwB9F,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,eAAe;CAY1B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
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 { Metadata, PermissionProviderBase, } from '@memberjunction/core';
|
|
8
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
9
|
+
import { ResourcePermissionEngine } from '../ResourcePermissions/ResourcePermissionEngine.js';
|
|
10
|
+
/**
|
|
11
|
+
* Wraps {@link ResourcePermissionEngine.GetUserResourcePermissionLevel} behind the
|
|
12
|
+
* unified {@link PermissionProviderBase} contract.
|
|
13
|
+
*
|
|
14
|
+
* Resource permissions support both Users and Roles as grantees and use a hierarchical
|
|
15
|
+
* level model (View < Edit < Owner). The provider translates those levels into canonical
|
|
16
|
+
* action sets: View → [Read], Edit → [Read, Update], Owner → [Read, Update, Delete, Share, Admin].
|
|
17
|
+
*
|
|
18
|
+
* `resourceType` is the human-readable name from the `MJ: Resource Types` entity
|
|
19
|
+
* (e.g., `"User Views"`, `"Reports"`). `resourceId` is the target record ID.
|
|
20
|
+
*/
|
|
21
|
+
let ResourcePermissionProvider = class ResourcePermissionProvider extends PermissionProviderBase {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
this.DomainName = 'Resource Permissions';
|
|
25
|
+
this.Description = 'Generic resource sharing with User or Role grantees, hierarchical View/Edit/Owner levels, and status workflow';
|
|
26
|
+
this.SupportedGranteeTypes = ['User', 'Role'];
|
|
27
|
+
this.SupportedActions = ['Read', 'Update', 'Delete', 'Share', 'Admin'];
|
|
28
|
+
this.SupportsDeny = false;
|
|
29
|
+
}
|
|
30
|
+
GetResourceTypes() {
|
|
31
|
+
// Live list from the MJ: Resource Types catalog. Sorted for stable UI output.
|
|
32
|
+
return ResourcePermissionEngine.Instance.ResourceTypes
|
|
33
|
+
.map((rt) => rt.Name)
|
|
34
|
+
.filter((name) => !!name)
|
|
35
|
+
.sort((a, b) => a.localeCompare(b));
|
|
36
|
+
}
|
|
37
|
+
async CheckPermission(user, resourceType, resourceId, action) {
|
|
38
|
+
if (!resourceId) {
|
|
39
|
+
return {
|
|
40
|
+
Allowed: false,
|
|
41
|
+
DomainName: this.DomainName,
|
|
42
|
+
Reason: 'Resource permissions require a specific resource ID',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const resourceTypeId = this.resolveResourceTypeId(resourceType);
|
|
46
|
+
if (!resourceTypeId) {
|
|
47
|
+
return {
|
|
48
|
+
Allowed: false,
|
|
49
|
+
DomainName: this.DomainName,
|
|
50
|
+
Reason: `Unknown resource type '${resourceType}'`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const level = ResourcePermissionEngine.Instance.GetUserResourcePermissionLevel(resourceTypeId, resourceId, user);
|
|
54
|
+
const actions = this.actionsForLevel(level);
|
|
55
|
+
const allowed = actions.includes(action);
|
|
56
|
+
return {
|
|
57
|
+
Allowed: allowed,
|
|
58
|
+
DomainName: this.DomainName,
|
|
59
|
+
Reason: level
|
|
60
|
+
? `User has ${level} level permission${allowed ? '' : ` (insufficient for ${action})`}`
|
|
61
|
+
: `No resource permission found for user on '${resourceType}'/'${resourceId}'`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async GetEffectivePermissions(user, resourceType, resourceId) {
|
|
65
|
+
const resourceTypeId = this.resolveResourceTypeId(resourceType);
|
|
66
|
+
if (!resourceTypeId)
|
|
67
|
+
return [];
|
|
68
|
+
const level = ResourcePermissionEngine.Instance.GetUserResourcePermissionLevel(resourceTypeId, resourceId, user);
|
|
69
|
+
const actions = this.actionsForLevel(level);
|
|
70
|
+
if (actions.length === 0)
|
|
71
|
+
return [];
|
|
72
|
+
return [this.buildNormalizedPermission({
|
|
73
|
+
resourceType, resourceId,
|
|
74
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name, actions,
|
|
75
|
+
})];
|
|
76
|
+
}
|
|
77
|
+
async GetUserResources(user, resourceType) {
|
|
78
|
+
const engine = ResourcePermissionEngine.Instance;
|
|
79
|
+
let resourceTypeId;
|
|
80
|
+
if (resourceType) {
|
|
81
|
+
resourceTypeId = this.resolveResourceTypeId(resourceType) ?? undefined;
|
|
82
|
+
if (!resourceTypeId)
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
const userPerms = engine.GetUserAvailableResources(user, resourceTypeId);
|
|
86
|
+
const results = [];
|
|
87
|
+
for (const p of userPerms) {
|
|
88
|
+
const actions = this.actionsForLevel(p.PermissionLevel);
|
|
89
|
+
if (actions.length === 0)
|
|
90
|
+
continue;
|
|
91
|
+
const rt = engine.ResourceTypes.find((r) => UUIDsEqual(r.ID, p.ResourceTypeID));
|
|
92
|
+
results.push(this.buildNormalizedPermission({
|
|
93
|
+
resourceType: rt?.Name ?? p.ResourceTypeID,
|
|
94
|
+
resourceId: p.ResourceRecordID,
|
|
95
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name,
|
|
96
|
+
actions,
|
|
97
|
+
sourceRecordId: p.ID,
|
|
98
|
+
expiresAt: p.EndSharingAt ?? undefined,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
async GetResourcePermissions(resourceType, resourceId) {
|
|
104
|
+
const resourceTypeId = this.resolveResourceTypeId(resourceType);
|
|
105
|
+
if (!resourceTypeId)
|
|
106
|
+
return [];
|
|
107
|
+
const engine = ResourcePermissionEngine.Instance;
|
|
108
|
+
const md = new Metadata();
|
|
109
|
+
const rows = engine.GetResourcePermissions(resourceTypeId, resourceId);
|
|
110
|
+
const results = [];
|
|
111
|
+
for (const p of rows) {
|
|
112
|
+
const actions = this.actionsForLevel(p.PermissionLevel);
|
|
113
|
+
if (actions.length === 0)
|
|
114
|
+
continue;
|
|
115
|
+
const isUser = p.Type === 'User';
|
|
116
|
+
const granteeId = isUser ? p.UserID : p.RoleID;
|
|
117
|
+
let granteeName;
|
|
118
|
+
if (isUser) {
|
|
119
|
+
granteeName = undefined; // UserID → name requires user cache lookup; leave blank, UI can hydrate
|
|
120
|
+
}
|
|
121
|
+
else if (p.RoleID) {
|
|
122
|
+
granteeName = md.Roles.find((r) => UUIDsEqual(r.ID, p.RoleID))?.Name;
|
|
123
|
+
}
|
|
124
|
+
results.push(this.buildNormalizedPermission({
|
|
125
|
+
resourceType, resourceId,
|
|
126
|
+
granteeType: isUser ? 'User' : 'Role',
|
|
127
|
+
granteeId, granteeName, actions,
|
|
128
|
+
sourceRecordId: p.ID,
|
|
129
|
+
expiresAt: p.EndSharingAt ?? undefined,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
return results;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Rows granted directly by this user to *other* users. Uses the
|
|
136
|
+
* `SharedByUserID` column (added in migration
|
|
137
|
+
* `V202604231235__v5.29.x__ResourcePermission_SharedByUserID.sql`) so every
|
|
138
|
+
* resource type that writes through `MJ: Resource Permissions` surfaces
|
|
139
|
+
* correctly in the end-user Sharing Center's "Shared by me" tab.
|
|
140
|
+
*
|
|
141
|
+
* Only Approved, User-grantee rows are returned — pending requests
|
|
142
|
+
* (`Status === 'Requested'`) and Role grants don't belong in a personal
|
|
143
|
+
* sharing view.
|
|
144
|
+
*/
|
|
145
|
+
async GetPermissionsGrantedByUser(grantor) {
|
|
146
|
+
const engine = ResourcePermissionEngine.Instance;
|
|
147
|
+
const results = [];
|
|
148
|
+
for (const p of engine.Permissions ?? []) {
|
|
149
|
+
if (!p.SharedByUserID || !UUIDsEqual(p.SharedByUserID, grantor.ID))
|
|
150
|
+
continue;
|
|
151
|
+
if (p.Type !== 'User' || !p.UserID)
|
|
152
|
+
continue;
|
|
153
|
+
if (p.Status !== 'Approved')
|
|
154
|
+
continue;
|
|
155
|
+
if (UUIDsEqual(p.UserID, grantor.ID))
|
|
156
|
+
continue;
|
|
157
|
+
const actions = this.actionsForLevel(p.PermissionLevel);
|
|
158
|
+
if (actions.length === 0)
|
|
159
|
+
continue;
|
|
160
|
+
const rt = engine.ResourceTypes.find((r) => UUIDsEqual(r.ID, p.ResourceTypeID));
|
|
161
|
+
results.push(this.buildNormalizedPermission({
|
|
162
|
+
resourceType: rt?.Name ?? p.ResourceTypeID,
|
|
163
|
+
resourceId: p.ResourceRecordID,
|
|
164
|
+
granteeType: 'User', granteeId: p.UserID, granteeName: p.User ?? undefined,
|
|
165
|
+
actions,
|
|
166
|
+
sourceRecordId: p.ID,
|
|
167
|
+
expiresAt: p.EndSharingAt ?? undefined,
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
return results;
|
|
171
|
+
}
|
|
172
|
+
resolveResourceTypeId(resourceTypeName) {
|
|
173
|
+
const rt = ResourcePermissionEngine.Instance.ResourceTypes?.find((t) => t.Name.toLowerCase() === resourceTypeName.toLowerCase());
|
|
174
|
+
return rt?.ID ?? null;
|
|
175
|
+
}
|
|
176
|
+
actionsForLevel(level) {
|
|
177
|
+
switch (level) {
|
|
178
|
+
case 'Owner':
|
|
179
|
+
return ['Read', 'Update', 'Delete', 'Share', 'Admin'];
|
|
180
|
+
case 'Edit':
|
|
181
|
+
return ['Read', 'Update'];
|
|
182
|
+
case 'View':
|
|
183
|
+
return ['Read'];
|
|
184
|
+
default:
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
ResourcePermissionProvider = __decorate([
|
|
190
|
+
RegisterClass(PermissionProviderBase, 'MJResourcePermissionProvider')
|
|
191
|
+
], ResourcePermissionProvider);
|
|
192
|
+
export { ResourcePermissionProvider };
|
|
193
|
+
//# sourceMappingURL=ResourcePermissionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePermissionProvider.js","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/ResourcePermissionProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { EntityPermissionProvider } from './EntityPermissionProvider.js';
|
|
2
|
+
export { DashboardPermissionProvider } from './DashboardPermissionProvider.js';
|
|
3
|
+
export { ResourcePermissionProvider } from './ResourcePermissionProvider.js';
|
|
4
|
+
export { ApplicationRolePermissionProvider } from './ApplicationRolePermissionProvider.js';
|
|
5
|
+
export { ArtifactPermissionProvider } from './ArtifactPermissionProvider.js';
|
|
6
|
+
export { CollectionPermissionProvider } from './CollectionPermissionProvider.js';
|
|
7
|
+
export { AIAgentPermissionProvider } from './AIAgentPermissionProvider.js';
|
|
8
|
+
export { QueryPermissionProvider } from './QueryPermissionProvider.js';
|
|
9
|
+
export { AccessControlRuleProvider } from './AccessControlRuleProvider.js';
|
|
10
|
+
/**
|
|
11
|
+
* No-op function that MJCoreEntities's public-api calls to keep modern bundlers
|
|
12
|
+
* (ESBuild, Vite) from eliminating the `@RegisterClass(PermissionProviderBase, …)`
|
|
13
|
+
* side effects — without this, providers silently disappear in production bundles.
|
|
14
|
+
*/
|
|
15
|
+
export declare function LoadPermissionProviders(): void;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAgB9C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { EntityPermissionProvider } from './EntityPermissionProvider.js';
|
|
2
|
+
import { DashboardPermissionProvider } from './DashboardPermissionProvider.js';
|
|
3
|
+
import { ResourcePermissionProvider } from './ResourcePermissionProvider.js';
|
|
4
|
+
import { ApplicationRolePermissionProvider } from './ApplicationRolePermissionProvider.js';
|
|
5
|
+
import { ArtifactPermissionProvider } from './ArtifactPermissionProvider.js';
|
|
6
|
+
import { CollectionPermissionProvider } from './CollectionPermissionProvider.js';
|
|
7
|
+
import { AIAgentPermissionProvider } from './AIAgentPermissionProvider.js';
|
|
8
|
+
import { QueryPermissionProvider } from './QueryPermissionProvider.js';
|
|
9
|
+
import { AccessControlRuleProvider } from './AccessControlRuleProvider.js';
|
|
10
|
+
export { EntityPermissionProvider } from './EntityPermissionProvider.js';
|
|
11
|
+
export { DashboardPermissionProvider } from './DashboardPermissionProvider.js';
|
|
12
|
+
export { ResourcePermissionProvider } from './ResourcePermissionProvider.js';
|
|
13
|
+
export { ApplicationRolePermissionProvider } from './ApplicationRolePermissionProvider.js';
|
|
14
|
+
export { ArtifactPermissionProvider } from './ArtifactPermissionProvider.js';
|
|
15
|
+
export { CollectionPermissionProvider } from './CollectionPermissionProvider.js';
|
|
16
|
+
export { AIAgentPermissionProvider } from './AIAgentPermissionProvider.js';
|
|
17
|
+
export { QueryPermissionProvider } from './QueryPermissionProvider.js';
|
|
18
|
+
export { AccessControlRuleProvider } from './AccessControlRuleProvider.js';
|
|
19
|
+
/**
|
|
20
|
+
* No-op function that MJCoreEntities's public-api calls to keep modern bundlers
|
|
21
|
+
* (ESBuild, Vite) from eliminating the `@RegisterClass(PermissionProviderBase, …)`
|
|
22
|
+
* side effects — without this, providers silently disappear in production bundles.
|
|
23
|
+
*/
|
|
24
|
+
export function LoadPermissionProviders() {
|
|
25
|
+
const markers = [
|
|
26
|
+
EntityPermissionProvider,
|
|
27
|
+
DashboardPermissionProvider,
|
|
28
|
+
ResourcePermissionProvider,
|
|
29
|
+
ApplicationRolePermissionProvider,
|
|
30
|
+
ArtifactPermissionProvider,
|
|
31
|
+
CollectionPermissionProvider,
|
|
32
|
+
AIAgentPermissionProvider,
|
|
33
|
+
QueryPermissionProvider,
|
|
34
|
+
AccessControlRuleProvider,
|
|
35
|
+
];
|
|
36
|
+
if (markers.length < 0) {
|
|
37
|
+
// unreachable — keeps the array reference alive
|
|
38
|
+
console.log(markers);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACnC,MAAM,OAAO,GAAG;QACZ,wBAAwB;QACxB,2BAA2B;QAC3B,0BAA0B;QAC1B,iCAAiC;QACjC,0BAA0B;QAC1B,4BAA4B;QAC5B,yBAAyB;QACzB,uBAAuB;QACvB,yBAAyB;KAC5B,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACL,CAAC"}
|