@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,220 @@
|
|
|
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 { PermissionProviderBase, } from '@memberjunction/core';
|
|
8
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
9
|
+
/**
|
|
10
|
+
* Wraps the `MJ: Collection Permissions` table behind the unified
|
|
11
|
+
* {@link PermissionProviderBase} contract. Collection permissions are user-only
|
|
12
|
+
* and cover Read / Update / Delete / Share.
|
|
13
|
+
*
|
|
14
|
+
* Collection-to-artifact cascade is handled by downstream consumers (the Sharing
|
|
15
|
+
* Center's Resource Access Report combines Collection + Artifact results); this
|
|
16
|
+
* provider only reports direct Collection grants.
|
|
17
|
+
*
|
|
18
|
+
* `resourceType` is `"Collections"`. `resourceId` is the collection ID.
|
|
19
|
+
*/
|
|
20
|
+
let CollectionPermissionProvider = class CollectionPermissionProvider extends PermissionProviderBase {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
this.DomainName = 'Collection Permissions';
|
|
24
|
+
this.Description = 'User-level sharing permissions on artifact collections (Read/Update/Delete/Share)';
|
|
25
|
+
this.SupportedGranteeTypes = ['User'];
|
|
26
|
+
this.SupportedActions = ['Read', 'Update', 'Delete', 'Share'];
|
|
27
|
+
this.SupportsDeny = false;
|
|
28
|
+
}
|
|
29
|
+
GetResourceTypes() {
|
|
30
|
+
return ['Collections'];
|
|
31
|
+
}
|
|
32
|
+
async CheckPermission(user, _resourceType, resourceId, action) {
|
|
33
|
+
if (!resourceId) {
|
|
34
|
+
return {
|
|
35
|
+
Allowed: false,
|
|
36
|
+
DomainName: this.DomainName,
|
|
37
|
+
Reason: 'Collection permissions require a specific collection ID',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const collection = await this.fetchCollection(resourceId);
|
|
41
|
+
if (collection?.OwnerID && UUIDsEqual(collection.OwnerID, user.ID)) {
|
|
42
|
+
return {
|
|
43
|
+
Allowed: true,
|
|
44
|
+
DomainName: this.DomainName,
|
|
45
|
+
Reason: `User is the collection owner`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const row = await this.fetchPermissionForUser(resourceId, user.ID);
|
|
49
|
+
const actions = this.toActions(row);
|
|
50
|
+
const allowed = actions.includes(action);
|
|
51
|
+
return {
|
|
52
|
+
Allowed: allowed,
|
|
53
|
+
DomainName: this.DomainName,
|
|
54
|
+
Reason: allowed
|
|
55
|
+
? `User has ${action} via direct collection permission`
|
|
56
|
+
: `User has no ${action} permission on collection '${resourceId}'`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async GetEffectivePermissions(user, _resourceType, resourceId) {
|
|
60
|
+
const collection = await this.fetchCollection(resourceId);
|
|
61
|
+
// Owner path — synthetic full-access row
|
|
62
|
+
if (collection?.OwnerID && UUIDsEqual(collection.OwnerID, user.ID)) {
|
|
63
|
+
return [this.buildNormalizedPermission({
|
|
64
|
+
resourceType: 'Collections', resourceId, resourceName: collection.Name ?? undefined,
|
|
65
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name,
|
|
66
|
+
actions: ['Read', 'Update', 'Delete', 'Share'],
|
|
67
|
+
})];
|
|
68
|
+
}
|
|
69
|
+
const row = await this.fetchPermissionForUser(resourceId, user.ID);
|
|
70
|
+
if (!row)
|
|
71
|
+
return [];
|
|
72
|
+
const actions = this.toActions(row);
|
|
73
|
+
if (actions.length === 0)
|
|
74
|
+
return [];
|
|
75
|
+
return [this.buildNormalizedPermission({
|
|
76
|
+
resourceType: 'Collections', resourceId, resourceName: collection?.Name ?? undefined,
|
|
77
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name, actions,
|
|
78
|
+
sourceRecordId: row.ID,
|
|
79
|
+
})];
|
|
80
|
+
}
|
|
81
|
+
async GetUserResources(user, resourceType) {
|
|
82
|
+
if (resourceType && resourceType !== 'Collections')
|
|
83
|
+
return [];
|
|
84
|
+
const directRows = await this.fetchRows('MJ: Collection Permissions', `UserID='${user.ID}'`, ['ID', 'CollectionID', 'UserID', 'CanRead', 'CanEdit', 'CanDelete', 'CanShare'], 'GetUserResources.direct');
|
|
85
|
+
const ownedRows = await this.fetchRows('MJ: Collections', `OwnerID='${user.ID}'`, ['ID', 'Name', 'OwnerID'], 'GetUserResources.owned');
|
|
86
|
+
const allCollectionIds = new Set([
|
|
87
|
+
...directRows.map((r) => r.CollectionID),
|
|
88
|
+
...ownedRows.map((c) => c.ID),
|
|
89
|
+
]);
|
|
90
|
+
const nameMap = await this.bulkLookupNames('MJ: Collections', Array.from(allCollectionIds));
|
|
91
|
+
const results = [];
|
|
92
|
+
const ownedIds = new Set(ownedRows.map((c) => c.ID));
|
|
93
|
+
// Owner rows first (take priority — synthetic full permissions)
|
|
94
|
+
for (const c of ownedRows) {
|
|
95
|
+
results.push(this.buildNormalizedPermission({
|
|
96
|
+
resourceType: 'Collections', resourceId: c.ID,
|
|
97
|
+
resourceName: c.Name ?? nameMap.get(c.ID),
|
|
98
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name,
|
|
99
|
+
actions: ['Read', 'Update', 'Delete', 'Share'],
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
for (const row of directRows) {
|
|
103
|
+
if (ownedIds.has(row.CollectionID))
|
|
104
|
+
continue; // owner row supersedes direct grant
|
|
105
|
+
const actions = this.toActions(row);
|
|
106
|
+
if (actions.length === 0)
|
|
107
|
+
continue;
|
|
108
|
+
results.push(this.buildNormalizedPermission({
|
|
109
|
+
resourceType: 'Collections', resourceId: row.CollectionID,
|
|
110
|
+
resourceName: nameMap.get(row.CollectionID),
|
|
111
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name, actions,
|
|
112
|
+
sourceRecordId: row.ID,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
return results;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* CollectionPermission rows where this user is the grantee AND someone else is
|
|
119
|
+
* the grantor. Excludes collections the user owns and rows they created themselves.
|
|
120
|
+
*/
|
|
121
|
+
async GetPermissionsSharedWithUser(grantee) {
|
|
122
|
+
// Which collections does the grantee own? We'll exclude those from the result.
|
|
123
|
+
const ownedRows = await this.fetchRows('MJ: Collections', `OwnerID='${grantee.ID}'`, ['ID', 'Name', 'OwnerID'], 'GetPermissionsSharedWithUser.owned');
|
|
124
|
+
const ownedIds = new Set(ownedRows.map((c) => c.ID));
|
|
125
|
+
const permRows = await this.fetchRows('MJ: Collection Permissions', `UserID='${grantee.ID}' AND (SharedByUserID IS NULL OR SharedByUserID <> '${grantee.ID}')`, ['ID', 'CollectionID', 'UserID', 'User', 'SharedByUserID', 'CanRead', 'CanEdit', 'CanDelete', 'CanShare'], 'GetPermissionsSharedWithUser');
|
|
126
|
+
const rows = permRows.filter((r) => !ownedIds.has(r.CollectionID));
|
|
127
|
+
if (rows.length === 0)
|
|
128
|
+
return [];
|
|
129
|
+
const nameMap = await this.bulkLookupNames('MJ: Collections', Array.from(new Set(rows.map((r) => r.CollectionID))));
|
|
130
|
+
const results = [];
|
|
131
|
+
for (const row of rows) {
|
|
132
|
+
const actions = this.toActions(row);
|
|
133
|
+
if (actions.length === 0)
|
|
134
|
+
continue;
|
|
135
|
+
results.push(this.buildNormalizedPermission({
|
|
136
|
+
resourceType: 'Collections', resourceId: row.CollectionID,
|
|
137
|
+
resourceName: nameMap.get(row.CollectionID),
|
|
138
|
+
granteeType: 'User', granteeId: grantee.ID, granteeName: grantee.Name, actions,
|
|
139
|
+
sourceRecordId: row.ID,
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
return results;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* CollectionPermission rows this user **explicitly** granted (`SharedByUserID = grantor`).
|
|
146
|
+
* Implicit owner-shares (SharedByUserID IS NULL) are excluded because the Sharing
|
|
147
|
+
* Center's revoke flow can only delete rows where the current user is the explicit
|
|
148
|
+
* grantor.
|
|
149
|
+
*/
|
|
150
|
+
async GetPermissionsGrantedByUser(grantor) {
|
|
151
|
+
const rows = await this.fetchRows('MJ: Collection Permissions', `SharedByUserID='${grantor.ID}'`, ['ID', 'CollectionID', 'UserID', 'User', 'SharedByUserID', 'CanRead', 'CanEdit', 'CanDelete', 'CanShare'], 'GetPermissionsGrantedByUser');
|
|
152
|
+
if (rows.length === 0)
|
|
153
|
+
return [];
|
|
154
|
+
const nameMap = await this.bulkLookupNames('MJ: Collections', Array.from(new Set(rows.map((r) => r.CollectionID))));
|
|
155
|
+
const results = [];
|
|
156
|
+
for (const row of rows) {
|
|
157
|
+
const actions = this.toActions(row);
|
|
158
|
+
if (actions.length === 0)
|
|
159
|
+
continue;
|
|
160
|
+
results.push(this.buildNormalizedPermission({
|
|
161
|
+
resourceType: 'Collections', resourceId: row.CollectionID,
|
|
162
|
+
resourceName: nameMap.get(row.CollectionID),
|
|
163
|
+
granteeType: 'User', granteeId: row.UserID, granteeName: row.User ?? undefined,
|
|
164
|
+
actions, sourceRecordId: row.ID,
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
return results;
|
|
168
|
+
}
|
|
169
|
+
async GetResourcePermissions(resourceType, resourceId) {
|
|
170
|
+
if (resourceType !== 'Collections')
|
|
171
|
+
return [];
|
|
172
|
+
const collection = await this.fetchCollection(resourceId);
|
|
173
|
+
const results = [];
|
|
174
|
+
if (collection?.OwnerID) {
|
|
175
|
+
results.push(this.buildNormalizedPermission({
|
|
176
|
+
resourceType: 'Collections', resourceId, resourceName: collection.Name ?? undefined,
|
|
177
|
+
granteeType: 'User', granteeId: collection.OwnerID,
|
|
178
|
+
granteeName: collection.Owner ?? undefined,
|
|
179
|
+
actions: ['Read', 'Update', 'Delete', 'Share'],
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
const rows = await this.fetchRows('MJ: Collection Permissions', `CollectionID='${resourceId}'`, ['ID', 'CollectionID', 'UserID', 'User', 'CanRead', 'CanEdit', 'CanDelete', 'CanShare'], 'GetResourcePermissions');
|
|
183
|
+
for (const row of rows) {
|
|
184
|
+
const actions = this.toActions(row);
|
|
185
|
+
if (actions.length === 0)
|
|
186
|
+
continue;
|
|
187
|
+
if (collection?.OwnerID && UUIDsEqual(collection.OwnerID, row.UserID))
|
|
188
|
+
continue; // already captured as owner
|
|
189
|
+
results.push(this.buildNormalizedPermission({
|
|
190
|
+
resourceType: 'Collections', resourceId, resourceName: collection?.Name ?? undefined,
|
|
191
|
+
granteeType: 'User', granteeId: row.UserID, granteeName: row.User ?? undefined,
|
|
192
|
+
actions, sourceRecordId: row.ID,
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
return results;
|
|
196
|
+
}
|
|
197
|
+
async fetchPermissionForUser(collectionId, userId) {
|
|
198
|
+
const rows = await this.fetchRows('MJ: Collection Permissions', `CollectionID='${collectionId}' AND UserID='${userId}'`, ['ID', 'CollectionID', 'UserID', 'CanRead', 'CanEdit', 'CanDelete', 'CanShare'], 'fetchPermissionForUser');
|
|
199
|
+
return rows[0] ?? null;
|
|
200
|
+
}
|
|
201
|
+
async fetchCollection(collectionId) {
|
|
202
|
+
const rows = await this.fetchRows('MJ: Collections', `ID='${collectionId}'`, ['ID', 'Name', 'OwnerID', 'Owner'], 'fetchCollection');
|
|
203
|
+
return rows[0] ?? null;
|
|
204
|
+
}
|
|
205
|
+
toActions(row) {
|
|
206
|
+
if (!row)
|
|
207
|
+
return [];
|
|
208
|
+
return this.boolsToActions({
|
|
209
|
+
Read: row.CanRead,
|
|
210
|
+
Update: row.CanEdit,
|
|
211
|
+
Delete: row.CanDelete,
|
|
212
|
+
Share: row.CanShare,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
CollectionPermissionProvider = __decorate([
|
|
217
|
+
RegisterClass(PermissionProviderBase, 'MJCollectionPermissionProvider')
|
|
218
|
+
], CollectionPermissionProvider);
|
|
219
|
+
export { CollectionPermissionProvider };
|
|
220
|
+
//# sourceMappingURL=CollectionPermissionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionPermissionProvider.js","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/CollectionPermissionProvider.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAKH,sBAAsB,GAEzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAqBnE;;;;;;;;;;GAUG;AAEI,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,sBAAsB;IAAjE;;QACM,eAAU,GAAG,wBAAwB,CAAC;QACtC,gBAAW,GAAG,mFAAmF,CAAC;QAClG,0BAAqB,GAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,qBAAgB,GAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7E,iBAAY,GAAG,KAAK,CAAC;IA8PlC,CAAC;IA5PY,gBAAgB;QACrB,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe,CACjB,IAAc,EACd,aAAqB,EACrB,UAAyB,EACzB,MAAwB;QAExB,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE,yDAAyD;aACpE,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,UAAU,EAAE,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE,8BAA8B;aACzC,CAAC;QACN,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO;YACH,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,OAAO;gBACX,CAAC,CAAC,YAAY,MAAM,mCAAmC;gBACvD,CAAC,CAAC,eAAe,MAAM,8BAA8B,UAAU,GAAG;SACzE,CAAC;IACN,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,IAAc,EAAE,aAAqB,EAAE,UAAkB;QACnF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAE1D,yCAAyC;QACzC,IAAI,UAAU,EAAE,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC;oBACnC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,IAAI,IAAI,SAAS;oBACnF,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI;oBAC/D,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;iBACjD,CAAC,CAAC,CAAC;QACR,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBACnC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,IAAI,SAAS;gBACpF,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO;gBACxE,cAAc,EAAE,GAAG,CAAC,EAAE;aACzB,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAc,EAAE,YAAqB;QACxD,IAAI,YAAY,IAAI,YAAY,KAAK,aAAa;YAAE,OAAO,EAAE,CAAC;QAE9D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CACnC,4BAA4B,EAC5B,WAAW,IAAI,CAAC,EAAE,GAAG,EACrB,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAC/E,yBAAyB,CAC5B,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAClC,iBAAiB,EACjB,YAAY,IAAI,CAAC,EAAE,GAAG,EACtB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EACzB,wBAAwB,CAC3B,CAAC;QAEF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS;YACrC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;YACxC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE5F,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErD,gEAAgE;QAChE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBACxC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE;gBAC7C,YAAY,EAAE,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI;gBAC/D,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;aACjD,CAAC,CAAC,CAAC;QACR,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;gBAAE,SAAS,CAAC,oCAAoC;YAClF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBACxC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,CAAC,YAAY;gBACzD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC3C,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO;gBACxE,cAAc,EAAE,GAAG,CAAC,EAAE;aACzB,CAAC,CAAC,CAAC;QACR,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACM,KAAK,CAAC,4BAA4B,CAAC,OAAiB;QACzD,+EAA+E;QAC/E,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAClC,iBAAiB,EACjB,YAAY,OAAO,CAAC,EAAE,GAAG,EACzB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EACzB,oCAAoC,CACvC,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CACjC,4BAA4B,EAC5B,WAAW,OAAO,CAAC,EAAE,uDAAuD,OAAO,CAAC,EAAE,IAAI,EAC1F,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EACzG,8BAA8B,CACjC,CAAC;QACF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CACtC,iBAAiB,EACjB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CACvD,CAAC;QAEF,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBACxC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,CAAC,YAAY;gBACzD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC3C,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO;gBAC9E,cAAc,EAAE,GAAG,CAAC,EAAE;aACzB,CAAC,CAAC,CAAC;QACR,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACM,KAAK,CAAC,2BAA2B,CAAC,OAAiB;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAC7B,4BAA4B,EAC5B,mBAAmB,OAAO,CAAC,EAAE,GAAG,EAChC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EACzG,6BAA6B,CAChC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CACtC,iBAAiB,EACjB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CACvD,CAAC;QAEF,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBACxC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,CAAC,YAAY;gBACzD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC3C,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS;gBAC9E,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE;aAClC,CAAC,CAAC,CAAC;QACR,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,YAAoB,EAAE,UAAkB;QACjE,IAAI,YAAY,KAAK,aAAa;YAAE,OAAO,EAAE,CAAC;QAE9C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,IAAI,UAAU,EAAE,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBACxC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,IAAI,IAAI,SAAS;gBACnF,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO;gBAClD,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,SAAS;gBAC1C,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;aACjD,CAAC,CAAC,CAAC;QACR,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAC7B,4BAA4B,EAC5B,iBAAiB,UAAU,GAAG,EAC9B,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EACvF,wBAAwB,CAC3B,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACnC,IAAI,UAAU,EAAE,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC;gBAAE,SAAS,CAAC,4BAA4B;YAC7G,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBACxC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,IAAI,SAAS;gBACpF,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,IAAI,SAAS;gBAC9E,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE;aAClC,CAAC,CAAC,CAAC;QACR,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,YAAoB,EAAE,MAAc;QACrE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAC7B,4BAA4B,EAC5B,iBAAiB,YAAY,iBAAiB,MAAM,GAAG,EACvD,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAC/E,wBAAwB,CAC3B,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,YAAoB;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAC7B,iBAAiB,EACjB,OAAO,YAAY,GAAG,EACtB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAClC,iBAAiB,CACpB,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC3B,CAAC;IAEO,SAAS,CAAC,GAA+C;QAC7D,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,OAAO;YACjB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,MAAM,EAAE,GAAG,CAAC,SAAS;YACrB,KAAK,EAAE,GAAG,CAAC,QAAQ;SACtB,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAnQY,4BAA4B;IADxC,aAAa,CAAC,sBAAsB,EAAE,gCAAgC,CAAC;GAC3D,4BAA4B,CAmQxC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { GranteeType, NormalizedPermission, PermissionAction, PermissionCheckResult, PermissionProviderBase, UserInfo } from '@memberjunction/core';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps {@link DashboardEngine.GetDashboardPermissions} behind the unified
|
|
4
|
+
* {@link PermissionProviderBase} contract. Dashboard permissions are user-only
|
|
5
|
+
* (no role grants), support Owner / direct / category-inherited sources, and
|
|
6
|
+
* cover Read / Update / Delete / Share.
|
|
7
|
+
*
|
|
8
|
+
* `resourceType` is always `"Dashboards"` (the entity name).
|
|
9
|
+
* `resourceId` is the dashboard ID.
|
|
10
|
+
*
|
|
11
|
+
* The backing {@link DashboardEngine} lazy-initializes via its own `@RegisterForStartup`
|
|
12
|
+
* decorator; this provider reads from it on demand so startup ordering between
|
|
13
|
+
* PermissionEngine and DashboardEngine doesn't matter — whichever configures last wins.
|
|
14
|
+
*/
|
|
15
|
+
export declare class DashboardPermissionProvider extends PermissionProviderBase {
|
|
16
|
+
readonly DomainName = "Dashboard Permissions";
|
|
17
|
+
readonly Description = "User-level sharing permissions on MJ dashboards; includes category-level inheritance and owner semantics";
|
|
18
|
+
readonly SupportedGranteeTypes: GranteeType[];
|
|
19
|
+
readonly SupportedActions: PermissionAction[];
|
|
20
|
+
readonly SupportsDeny = false;
|
|
21
|
+
GetResourceTypes(): string[];
|
|
22
|
+
CheckPermission(user: UserInfo, _resourceType: string, resourceId: string | null, action: PermissionAction): Promise<PermissionCheckResult>;
|
|
23
|
+
GetEffectivePermissions(user: UserInfo, _resourceType: string, resourceId: string): Promise<NormalizedPermission[]>;
|
|
24
|
+
GetUserResources(user: UserInfo, resourceType?: string): Promise<NormalizedPermission[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Dashboards shared with `grantee` by someone else. Excludes dashboards the
|
|
27
|
+
* user owns and excludes permission rows the user created themselves.
|
|
28
|
+
*
|
|
29
|
+
* Permission rows whose dashboard no longer exists in the engine cache are
|
|
30
|
+
* skipped — covers the window between a DB cascade delete (cleaning up
|
|
31
|
+
* DashboardPermission rows) and the engine cache being refreshed.
|
|
32
|
+
*/
|
|
33
|
+
GetPermissionsSharedWithUser(grantee: UserInfo): Promise<NormalizedPermission[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Every DashboardPermission row where this user is the effective grantor —
|
|
36
|
+
* either explicitly (`SharedByUserID === grantor.ID`) or implicitly (the user
|
|
37
|
+
* owns the dashboard and `SharedByUserID` is NULL — legacy shape from before
|
|
38
|
+
* the grantor column was captured).
|
|
39
|
+
*/
|
|
40
|
+
GetPermissionsGrantedByUser(grantor: UserInfo): Promise<NormalizedPermission[]>;
|
|
41
|
+
GetResourcePermissions(resourceType: string, resourceId: string): Promise<NormalizedPermission[]>;
|
|
42
|
+
private checkActionOnPermission;
|
|
43
|
+
private resolveActions;
|
|
44
|
+
private permRowActions;
|
|
45
|
+
private buildDashboardPermission;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=DashboardPermissionProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPermissionProvider.d.ts","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/DashboardPermissionProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACX,MAAM,sBAAsB,CAAC;AAK9B;;;;;;;;;;;;GAYG;AACH,qBACa,2BAA4B,SAAQ,sBAAsB;IACnE,QAAQ,CAAC,UAAU,2BAA2B;IAC9C,QAAQ,CAAC,WAAW,8GAC2F;IAC/G,QAAQ,CAAC,qBAAqB,EAAE,WAAW,EAAE,CAAY;IACzD,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,CAAyC;IACtF,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;IAoB3B,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IASnH,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAkB9F;;;;;;;OAOG;IACY,4BAA4B,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA4B/F;;;;;OAKG;IACY,2BAA2B,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA6BxF,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA6BvG,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,wBAAwB;CAUnC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
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 { PermissionProviderBase, } from '@memberjunction/core';
|
|
8
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
9
|
+
import { DashboardEngine } from '../../engines/dashboards.js';
|
|
10
|
+
/**
|
|
11
|
+
* Wraps {@link DashboardEngine.GetDashboardPermissions} behind the unified
|
|
12
|
+
* {@link PermissionProviderBase} contract. Dashboard permissions are user-only
|
|
13
|
+
* (no role grants), support Owner / direct / category-inherited sources, and
|
|
14
|
+
* cover Read / Update / Delete / Share.
|
|
15
|
+
*
|
|
16
|
+
* `resourceType` is always `"Dashboards"` (the entity name).
|
|
17
|
+
* `resourceId` is the dashboard ID.
|
|
18
|
+
*
|
|
19
|
+
* The backing {@link DashboardEngine} lazy-initializes via its own `@RegisterForStartup`
|
|
20
|
+
* decorator; this provider reads from it on demand so startup ordering between
|
|
21
|
+
* PermissionEngine and DashboardEngine doesn't matter — whichever configures last wins.
|
|
22
|
+
*/
|
|
23
|
+
let DashboardPermissionProvider = class DashboardPermissionProvider extends PermissionProviderBase {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
this.DomainName = 'Dashboard Permissions';
|
|
27
|
+
this.Description = 'User-level sharing permissions on MJ dashboards; includes category-level inheritance and owner semantics';
|
|
28
|
+
this.SupportedGranteeTypes = ['User'];
|
|
29
|
+
this.SupportedActions = ['Read', 'Update', 'Delete', 'Share'];
|
|
30
|
+
this.SupportsDeny = false;
|
|
31
|
+
}
|
|
32
|
+
GetResourceTypes() {
|
|
33
|
+
return ['Dashboards'];
|
|
34
|
+
}
|
|
35
|
+
async CheckPermission(user, _resourceType, resourceId, action) {
|
|
36
|
+
if (!resourceId) {
|
|
37
|
+
return {
|
|
38
|
+
Allowed: false,
|
|
39
|
+
DomainName: this.DomainName,
|
|
40
|
+
Reason: 'Dashboard permissions require a specific dashboard ID',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const perms = DashboardEngine.Instance.GetDashboardPermissions(resourceId, user.ID);
|
|
44
|
+
const allowed = this.checkActionOnPermission(perms, action);
|
|
45
|
+
return {
|
|
46
|
+
Allowed: allowed,
|
|
47
|
+
DomainName: this.DomainName,
|
|
48
|
+
Reason: allowed
|
|
49
|
+
? `User has ${action} via ${perms.PermissionSource}`
|
|
50
|
+
: `User has no ${action} permission on dashboard '${resourceId}' (source: ${perms.PermissionSource})`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async GetEffectivePermissions(user, _resourceType, resourceId) {
|
|
54
|
+
const perms = DashboardEngine.Instance.GetDashboardPermissions(resourceId, user.ID);
|
|
55
|
+
const actions = this.resolveActions(perms);
|
|
56
|
+
if (actions.length === 0)
|
|
57
|
+
return [];
|
|
58
|
+
return [this.buildDashboardPermission(resourceId, {
|
|
59
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name, actions,
|
|
60
|
+
})];
|
|
61
|
+
}
|
|
62
|
+
async GetUserResources(user, resourceType) {
|
|
63
|
+
if (resourceType && resourceType !== 'Dashboards')
|
|
64
|
+
return [];
|
|
65
|
+
const engine = DashboardEngine.Instance;
|
|
66
|
+
const results = [];
|
|
67
|
+
for (const dashboard of engine.Dashboards) {
|
|
68
|
+
const perms = engine.GetDashboardPermissions(dashboard.ID, user.ID);
|
|
69
|
+
const actions = this.resolveActions(perms);
|
|
70
|
+
if (actions.length === 0)
|
|
71
|
+
continue;
|
|
72
|
+
results.push(this.buildNormalizedPermission({
|
|
73
|
+
resourceType: 'Dashboards', resourceId: dashboard.ID, resourceName: dashboard.Name,
|
|
74
|
+
granteeType: 'User', granteeId: user.ID, granteeName: user.Name, actions,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Dashboards shared with `grantee` by someone else. Excludes dashboards the
|
|
81
|
+
* user owns and excludes permission rows the user created themselves.
|
|
82
|
+
*
|
|
83
|
+
* Permission rows whose dashboard no longer exists in the engine cache are
|
|
84
|
+
* skipped — covers the window between a DB cascade delete (cleaning up
|
|
85
|
+
* DashboardPermission rows) and the engine cache being refreshed.
|
|
86
|
+
*/
|
|
87
|
+
async GetPermissionsSharedWithUser(grantee) {
|
|
88
|
+
const engine = DashboardEngine.Instance;
|
|
89
|
+
const dashboardsById = new Map(engine.Dashboards.map((d) => [d.ID, d]));
|
|
90
|
+
const ownedDashboardIds = new Set(engine.Dashboards
|
|
91
|
+
.filter((d) => d.UserID && UUIDsEqual(d.UserID, grantee.ID))
|
|
92
|
+
.map((d) => d.ID));
|
|
93
|
+
const results = [];
|
|
94
|
+
for (const perm of engine.DashboardPermissions) {
|
|
95
|
+
if (!UUIDsEqual(perm.UserID, grantee.ID))
|
|
96
|
+
continue;
|
|
97
|
+
const dashboard = dashboardsById.get(perm.DashboardID);
|
|
98
|
+
if (!dashboard)
|
|
99
|
+
continue;
|
|
100
|
+
if (ownedDashboardIds.has(perm.DashboardID))
|
|
101
|
+
continue;
|
|
102
|
+
if (perm.SharedByUserID && UUIDsEqual(perm.SharedByUserID, grantee.ID))
|
|
103
|
+
continue;
|
|
104
|
+
const actions = this.permRowActions(perm);
|
|
105
|
+
if (actions.length === 0)
|
|
106
|
+
continue;
|
|
107
|
+
results.push(this.buildNormalizedPermission({
|
|
108
|
+
resourceType: 'Dashboards', resourceId: perm.DashboardID, resourceName: dashboard.Name,
|
|
109
|
+
granteeType: 'User', granteeId: grantee.ID, granteeName: grantee.Name, actions,
|
|
110
|
+
sourceRecordId: perm.ID,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
return results;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Every DashboardPermission row where this user is the effective grantor —
|
|
117
|
+
* either explicitly (`SharedByUserID === grantor.ID`) or implicitly (the user
|
|
118
|
+
* owns the dashboard and `SharedByUserID` is NULL — legacy shape from before
|
|
119
|
+
* the grantor column was captured).
|
|
120
|
+
*/
|
|
121
|
+
async GetPermissionsGrantedByUser(grantor) {
|
|
122
|
+
const engine = DashboardEngine.Instance;
|
|
123
|
+
const dashboardsById = new Map(engine.Dashboards.map((d) => [d.ID, d]));
|
|
124
|
+
const ownedDashboardIds = new Set(engine.Dashboards
|
|
125
|
+
.filter((d) => d.UserID && UUIDsEqual(d.UserID, grantor.ID))
|
|
126
|
+
.map((d) => d.ID));
|
|
127
|
+
const results = [];
|
|
128
|
+
for (const perm of engine.DashboardPermissions) {
|
|
129
|
+
const dashboard = dashboardsById.get(perm.DashboardID);
|
|
130
|
+
if (!dashboard)
|
|
131
|
+
continue;
|
|
132
|
+
const explicit = perm.SharedByUserID && UUIDsEqual(perm.SharedByUserID, grantor.ID);
|
|
133
|
+
const implicit = !perm.SharedByUserID && ownedDashboardIds.has(perm.DashboardID);
|
|
134
|
+
if (!explicit && !implicit)
|
|
135
|
+
continue;
|
|
136
|
+
if (UUIDsEqual(perm.UserID, grantor.ID))
|
|
137
|
+
continue;
|
|
138
|
+
const actions = this.permRowActions(perm);
|
|
139
|
+
if (actions.length === 0)
|
|
140
|
+
continue;
|
|
141
|
+
results.push(this.buildNormalizedPermission({
|
|
142
|
+
resourceType: 'Dashboards', resourceId: perm.DashboardID, resourceName: dashboard.Name,
|
|
143
|
+
granteeType: 'User', granteeId: perm.UserID, granteeName: perm.User, actions,
|
|
144
|
+
sourceRecordId: perm.ID,
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
return results;
|
|
148
|
+
}
|
|
149
|
+
async GetResourcePermissions(resourceType, resourceId) {
|
|
150
|
+
if (resourceType !== 'Dashboards')
|
|
151
|
+
return [];
|
|
152
|
+
const engine = DashboardEngine.Instance;
|
|
153
|
+
const dashboard = engine.Dashboards.find((d) => UUIDsEqual(d.ID, resourceId));
|
|
154
|
+
if (!dashboard)
|
|
155
|
+
return [];
|
|
156
|
+
const results = [];
|
|
157
|
+
if (dashboard.UserID) {
|
|
158
|
+
results.push(this.buildNormalizedPermission({
|
|
159
|
+
resourceType: 'Dashboards', resourceId: dashboard.ID, resourceName: dashboard.Name,
|
|
160
|
+
granteeType: 'User', granteeId: dashboard.UserID, granteeName: dashboard.User,
|
|
161
|
+
actions: ['Read', 'Update', 'Delete', 'Share'],
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
for (const perm of engine.DashboardPermissions.filter((p) => UUIDsEqual(p.DashboardID, resourceId))) {
|
|
165
|
+
const actions = this.permRowActions(perm);
|
|
166
|
+
if (actions.length === 0)
|
|
167
|
+
continue;
|
|
168
|
+
results.push(this.buildNormalizedPermission({
|
|
169
|
+
resourceType: 'Dashboards', resourceId: dashboard.ID, resourceName: dashboard.Name,
|
|
170
|
+
granteeType: 'User', granteeId: perm.UserID, granteeName: perm.User, actions,
|
|
171
|
+
sourceRecordId: perm.ID,
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
checkActionOnPermission(perms, action) {
|
|
177
|
+
switch (action) {
|
|
178
|
+
case 'Read':
|
|
179
|
+
return perms.CanRead;
|
|
180
|
+
case 'Update':
|
|
181
|
+
return perms.CanEdit;
|
|
182
|
+
case 'Delete':
|
|
183
|
+
return perms.CanDelete;
|
|
184
|
+
case 'Share':
|
|
185
|
+
return perms.CanShare;
|
|
186
|
+
default:
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
resolveActions(perms) {
|
|
191
|
+
return this.boolsToActions({
|
|
192
|
+
Read: perms.CanRead,
|
|
193
|
+
Update: perms.CanEdit,
|
|
194
|
+
Delete: perms.CanDelete,
|
|
195
|
+
Share: perms.CanShare,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
permRowActions(perm) {
|
|
199
|
+
return this.boolsToActions({
|
|
200
|
+
Read: perm.CanRead,
|
|
201
|
+
Update: perm.CanEdit,
|
|
202
|
+
Delete: perm.CanDelete,
|
|
203
|
+
Share: perm.CanShare,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
buildDashboardPermission(dashboardId, args) {
|
|
207
|
+
const dashboard = DashboardEngine.Instance.Dashboards.find((d) => UUIDsEqual(d.ID, dashboardId));
|
|
208
|
+
return this.buildNormalizedPermission({
|
|
209
|
+
resourceType: 'Dashboards', resourceId: dashboardId, resourceName: dashboard?.Name,
|
|
210
|
+
...args,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
DashboardPermissionProvider = __decorate([
|
|
215
|
+
RegisterClass(PermissionProviderBase, 'MJDashboardPermissionProvider')
|
|
216
|
+
], DashboardPermissionProvider);
|
|
217
|
+
export { DashboardPermissionProvider };
|
|
218
|
+
//# sourceMappingURL=DashboardPermissionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPermissionProvider.js","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/DashboardPermissionProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { GranteeType, NormalizedPermission, PermissionAction, PermissionCheckResult, PermissionProviderBase, UserInfo } from '@memberjunction/core';
|
|
2
|
+
/**
|
|
3
|
+
* Wraps the {@link Metadata} + `EntityInfo.GetUserPermisions()` path behind the
|
|
4
|
+
* unified {@link PermissionProviderBase} contract. Entity permissions are role-only,
|
|
5
|
+
* additive (OR across roles), and cover the CRUD action set only.
|
|
6
|
+
*
|
|
7
|
+
* `resourceType` is the entity name (e.g., `"Users"`).
|
|
8
|
+
* `resourceId` is unused — entity permissions are domain-wide per entity, not per-row.
|
|
9
|
+
* Row-level filters are a separate concern handled by the RLS system.
|
|
10
|
+
*/
|
|
11
|
+
export declare class EntityPermissionProvider extends PermissionProviderBase {
|
|
12
|
+
readonly DomainName = "Entity Permissions";
|
|
13
|
+
readonly Description = "CRUD permissions on MJ entities, role-based with optional row-level security filters and explicit Allow/Deny rows";
|
|
14
|
+
readonly SupportedGranteeTypes: GranteeType[];
|
|
15
|
+
readonly SupportedActions: PermissionAction[];
|
|
16
|
+
readonly SupportsDeny = true;
|
|
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 checkActionOnPermission;
|
|
23
|
+
private resolveActions;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=EntityPermissionProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityPermissionProvider.d.ts","sourceRoot":"","sources":["../../../src/custom/PermissionProviders/EntityPermissionProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,WAAW,EAEX,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACX,MAAM,sBAAsB,CAAC;AAG9B;;;;;;;;GAQG;AACH,qBACa,wBAAyB,SAAQ,sBAAsB;IAChE,QAAQ,CAAC,UAAU,wBAAwB;IAC3C,QAAQ,CAAC,WAAW,uHAAuH;IAC3I,QAAQ,CAAC,qBAAqB,EAAE,WAAW,EAAE,CAAY;IACzD,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,CAA0C;IACvF,QAAQ,CAAC,YAAY,QAAQ;IAEpB,gBAAgB,IAAI,MAAM,EAAE;IAK/B,eAAe,CACjB,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,qBAAqB,CAAC;IAsB3B,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAcnH,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAkBxF,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAsBxG,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,cAAc;CAQzB"}
|