@memberjunction/core-entities 6.2.0-edge.4 → 6.2.0-edge.6
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/.tsbuildinfo +1 -1
- package/dist/custom/ConversationWriteAccess.d.ts +5 -0
- package/dist/custom/ConversationWriteAccess.d.ts.map +1 -1
- package/dist/custom/ConversationWriteAccess.js +6 -6
- package/dist/custom/ConversationWriteAccess.js.map +1 -1
- package/dist/custom/MJConversationDetailEntityExtended.d.ts +70 -4
- package/dist/custom/MJConversationDetailEntityExtended.d.ts.map +1 -1
- package/dist/custom/MJConversationDetailEntityExtended.js +268 -28
- package/dist/custom/MJConversationDetailEntityExtended.js.map +1 -1
- package/dist/custom/MJQueryEntityExtended.d.ts +37 -1
- package/dist/custom/MJQueryEntityExtended.d.ts.map +1 -1
- package/dist/custom/MJQueryEntityExtended.js +92 -5
- package/dist/custom/MJQueryEntityExtended.js.map +1 -1
- package/dist/custom/MJThemeEntityExtended.d.ts +13 -0
- package/dist/custom/MJThemeEntityExtended.d.ts.map +1 -0
- package/dist/custom/MJThemeEntityExtended.js +37 -0
- package/dist/custom/MJThemeEntityExtended.js.map +1 -0
- package/dist/custom/MJUserViewEntityExtended.d.ts +39 -4
- package/dist/custom/MJUserViewEntityExtended.d.ts.map +1 -1
- package/dist/custom/MJUserViewEntityExtended.js +111 -18
- package/dist/custom/MJUserViewEntityExtended.js.map +1 -1
- package/dist/custom/approvals.d.ts +55 -0
- package/dist/custom/approvals.d.ts.map +1 -0
- package/dist/custom/approvals.js +120 -0
- package/dist/custom/approvals.js.map +1 -0
- package/dist/engines/InstanceConfigEngine.d.ts.map +1 -1
- package/dist/engines/InstanceConfigEngine.js +13 -3
- package/dist/engines/InstanceConfigEngine.js.map +1 -1
- package/dist/engines/PermissionEngine.d.ts +5 -4
- package/dist/engines/PermissionEngine.d.ts.map +1 -1
- package/dist/engines/PermissionEngine.js +7 -5
- package/dist/engines/PermissionEngine.js.map +1 -1
- package/dist/engines/QueryEngine.d.ts +81 -6
- package/dist/engines/QueryEngine.d.ts.map +1 -1
- package/dist/engines/QueryEngine.js +283 -4
- package/dist/engines/QueryEngine.js.map +1 -1
- package/dist/engines/UserInfoEngine.d.ts +48 -2
- package/dist/engines/UserInfoEngine.d.ts.map +1 -1
- package/dist/engines/UserInfoEngine.js +65 -8
- package/dist/engines/UserInfoEngine.js.map +1 -1
- package/dist/engines/conversations.d.ts +19 -1
- package/dist/engines/conversations.d.ts.map +1 -1
- package/dist/engines/conversations.js +125 -22
- package/dist/engines/conversations.js.map +1 -1
- package/dist/engines/knowledgeHubMetadata.d.ts +8 -3
- package/dist/engines/knowledgeHubMetadata.d.ts.map +1 -1
- package/dist/engines/knowledgeHubMetadata.js +19 -2
- package/dist/engines/knowledgeHubMetadata.js.map +1 -1
- package/dist/generated/entities/__mj.d.ts +4142 -111
- package/dist/generated/entities/__mj.d.ts.map +1 -1
- package/dist/generated/entities/__mj.js +5895 -262
- package/dist/generated/entities/__mj.js.map +1 -1
- package/dist/generated/remote_operations.d.ts +17 -5
- package/dist/generated/remote_operations.d.ts.map +1 -1
- package/dist/generated/remote_operations.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
|
@@ -4,14 +4,29 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
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
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
|
|
8
|
-
import {
|
|
7
|
+
var QueryEngine_1;
|
|
8
|
+
import { BaseEngine, LocalCacheManager, LogError, LogStatusEx, RegisterForStartup } from "@memberjunction/core";
|
|
9
|
+
import { GroupByUUID, IndexByUUID, UUIDsEqual } from "@memberjunction/global";
|
|
9
10
|
/**
|
|
10
11
|
* Caching of metadata for queries and related data, with auto-refresh on entity changes.
|
|
11
12
|
* Returns `MJQueryEntityExtended` instances which include child-relationship getters
|
|
12
13
|
* (QueryFields, QueryParameters, etc.) and business logic (UserCanRun, CategoryPath, etc.).
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Per entity, the columns whose change can change a query's results. `'all'` means any change.
|
|
17
|
+
* Name and CategoryID are in the cache key rather than in the definition hash: editing them leaves
|
|
18
|
+
* the old slots unreachable, so they are reclaimed too. A parameter's DefaultValue is not here:
|
|
19
|
+
* it is informational, never applied when the query runs (`QueryParameterProcessor`).
|
|
20
|
+
*/
|
|
21
|
+
const RESULT_AFFECTING_COLUMNS = {
|
|
22
|
+
'mj: queries': ['SQL', 'SQLDialectID', 'UsesTemplate', 'ExternalDataSourceID', 'IsMaterialized', 'CacheValidationSQL', 'Name', 'CategoryID'],
|
|
23
|
+
'mj: query sqls': 'all',
|
|
24
|
+
'mj: query parameters': ['QueryID', 'Name', 'Type', 'IsRequired', 'ValidationFilters'],
|
|
25
|
+
'mj: query dependencies': 'all',
|
|
26
|
+
};
|
|
27
|
+
/** Engine properties a query definition is computed from. A change to any of them clears the memo. */
|
|
28
|
+
const DEFINITION_PROPERTIES = new Set(['_queries', '_parameters', '_dependencies', '_querySQLs', '_sqlDialects']);
|
|
29
|
+
let QueryEngine = QueryEngine_1 = class QueryEngine extends BaseEngine {
|
|
15
30
|
constructor() {
|
|
16
31
|
super(...arguments);
|
|
17
32
|
this._queries = [];
|
|
@@ -23,6 +38,15 @@ let QueryEngine = class QueryEngine extends BaseEngine {
|
|
|
23
38
|
this._dependencies = [];
|
|
24
39
|
this._querySQLs = [];
|
|
25
40
|
this._sqlDialects = [];
|
|
41
|
+
// --- Query definition signatures ---
|
|
42
|
+
/** Definition signatures by `queryID|platform`, cleared whenever a definition property changes. */
|
|
43
|
+
this._definitionMemo = new Map();
|
|
44
|
+
/** Lookup indexes for computing signatures, built on first use after the memo was cleared. */
|
|
45
|
+
this._definitionIndexes = null;
|
|
46
|
+
/** Saves seen starting with a result-affecting column dirty; see {@link trackDefinitionEdit}. */
|
|
47
|
+
this._resultAffectingSaves = new WeakSet();
|
|
48
|
+
/** Pending slot invalidations by lowercased query ID; see {@link scheduleSlotInvalidation}. */
|
|
49
|
+
this._pendingSlotInvalidations = new Map();
|
|
26
50
|
}
|
|
27
51
|
/**
|
|
28
52
|
* Returns the global instance of the class. This is a singleton class, so there is only one instance of it in the application.
|
|
@@ -152,8 +176,263 @@ let QueryEngine = class QueryEngine extends BaseEngine {
|
|
|
152
176
|
const lower = name.trim().toLowerCase();
|
|
153
177
|
return this._categories.find(c => c.Name.trim().toLowerCase() === lower);
|
|
154
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* How long, in milliseconds, a query must go without a result-affecting save on this process
|
|
181
|
+
* before its cached results are deleted. One edit saves the query, then its parameters, fields,
|
|
182
|
+
* entities and dependencies, then the query again, over several seconds; waiting for the burst
|
|
183
|
+
* to settle deletes the slots once instead of once per save.
|
|
184
|
+
*/
|
|
185
|
+
get DefinitionEditSettleMs() {
|
|
186
|
+
return 3000;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The signature of what a query's results are computed from on `platform`: a hash of the SQL
|
|
190
|
+
* that runs there (`GetPlatformSQL`), the columns that change how it runs (`UsesTemplate`,
|
|
191
|
+
* `ExternalDataSourceID`, `IsMaterialized`, `SQLDialectID`), its `CacheValidationSQL`, its
|
|
192
|
+
* parameters' names, types, required flags and validation filters, and, recursively, the signatures of the queries it composes (a cycle
|
|
193
|
+
* is hashed as a marker rather than followed). Descriptive columns, parameter default values
|
|
194
|
+
* (informational only), field rows, permissions and cache settings are not part of it.
|
|
195
|
+
*
|
|
196
|
+
* The stamp is the newest `__mj_UpdatedAt` across the same rows. Computed once per query and
|
|
197
|
+
* platform, and again only after this engine's query data changes.
|
|
198
|
+
*
|
|
199
|
+
* @returns The signature, or undefined when the engine does not hold the query
|
|
200
|
+
*/
|
|
201
|
+
GetDefinitionSignature(queryID, platform) {
|
|
202
|
+
if (!queryID)
|
|
203
|
+
return undefined;
|
|
204
|
+
return this.definitionSignature(queryID, platform, new Set())?.Signature;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* The memoized signature, computing it (and any composed query's) on a miss. A signature whose
|
|
208
|
+
* computation met a cycle is not memoized: its value depends on where the walk entered the
|
|
209
|
+
* cycle, and two processes must agree on every query's hash.
|
|
210
|
+
*/
|
|
211
|
+
definitionSignature(queryID, platform, visiting) {
|
|
212
|
+
const key = `${queryID.trim().toLowerCase()}|${platform}`;
|
|
213
|
+
const memo = this._definitionMemo.get(key);
|
|
214
|
+
if (memo)
|
|
215
|
+
return { Signature: memo, Cyclic: false };
|
|
216
|
+
const indexes = this.definitionIndexes();
|
|
217
|
+
const query = indexes.QueriesByID.Get(queryID);
|
|
218
|
+
if (!query)
|
|
219
|
+
return undefined;
|
|
220
|
+
visiting.add(key);
|
|
221
|
+
const parts = this.definitionParts(query, platform, indexes);
|
|
222
|
+
let newest = QueryEngine_1.timestampMs(query.__mj_UpdatedAt);
|
|
223
|
+
for (const row of [...(indexes.ParametersByQuery.Get(query.ID) ?? []), ...(indexes.QuerySQLsByQuery.Get(query.ID) ?? [])]) {
|
|
224
|
+
newest = Math.max(newest, QueryEngine_1.timestampMs(row.__mj_UpdatedAt));
|
|
225
|
+
}
|
|
226
|
+
let cyclic = false;
|
|
227
|
+
for (const dependency of QueryEngine_1.sortedDependencies(indexes.DependenciesByQuery.Get(query.ID))) {
|
|
228
|
+
newest = Math.max(newest, QueryEngine_1.timestampMs(dependency.__mj_UpdatedAt));
|
|
229
|
+
const dependencyID = dependency.DependsOnQueryID.toLowerCase();
|
|
230
|
+
if (visiting.has(`${dependencyID}|${platform}`)) {
|
|
231
|
+
cyclic = true;
|
|
232
|
+
parts.push(`dep:${dependencyID}:cycle`);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const composed = this.definitionSignature(dependency.DependsOnQueryID, platform, visiting);
|
|
236
|
+
cyclic = cyclic || composed?.Cyclic === true;
|
|
237
|
+
parts.push(`dep:${dependencyID}:${composed?.Signature.Hash ?? 'missing'}`);
|
|
238
|
+
newest = Math.max(newest, QueryEngine_1.timestampMs(composed?.Signature.Stamp));
|
|
239
|
+
}
|
|
240
|
+
visiting.delete(key);
|
|
241
|
+
const signature = {
|
|
242
|
+
QueryID: query.ID,
|
|
243
|
+
Hash: QueryEngine_1.hashText(parts.join('\u0001')),
|
|
244
|
+
Stamp: newest > 0 ? new Date(newest).toISOString() : undefined,
|
|
245
|
+
};
|
|
246
|
+
if (!cyclic) {
|
|
247
|
+
this._definitionMemo.set(key, signature);
|
|
248
|
+
}
|
|
249
|
+
return { Signature: signature, Cyclic: cyclic };
|
|
250
|
+
}
|
|
251
|
+
/** The hashed text of one query's own definition, without its composed queries. */
|
|
252
|
+
definitionParts(query, platform, indexes) {
|
|
253
|
+
const parts = [
|
|
254
|
+
`sql:${query.GetPlatformSQL(platform) ?? ''}`,
|
|
255
|
+
`dialect:${(query.SQLDialectID ?? '').toLowerCase()}`,
|
|
256
|
+
`template:${query.UsesTemplate ? 1 : 0}`,
|
|
257
|
+
`external:${(query.ExternalDataSourceID ?? '').toLowerCase()}`,
|
|
258
|
+
`materialized:${query.IsMaterialized ? 1 : 0}`,
|
|
259
|
+
`validation:${query.CacheValidationSQL ?? ''}`,
|
|
260
|
+
];
|
|
261
|
+
const parameters = [...(indexes.ParametersByQuery.Get(query.ID) ?? [])]
|
|
262
|
+
.sort((a, b) => a.Name.toLowerCase().localeCompare(b.Name.toLowerCase()));
|
|
263
|
+
for (const p of parameters) {
|
|
264
|
+
parts.push(`param:${p.Name.toLowerCase()}\u0002${p.Type}\u0002${p.IsRequired ? 1 : 0}\u0002${p.ValidationFilters ?? ''}`);
|
|
265
|
+
}
|
|
266
|
+
return parts;
|
|
267
|
+
}
|
|
268
|
+
/** Dependency rows in a stable order, so the hash does not depend on load order. */
|
|
269
|
+
static sortedDependencies(rows) {
|
|
270
|
+
return [...(rows ?? [])].sort((a, b) => a.DependsOnQueryID.toLowerCase().localeCompare(b.DependsOnQueryID.toLowerCase()));
|
|
271
|
+
}
|
|
272
|
+
/** Builds (once per memo generation) the lookups signature computation reads. */
|
|
273
|
+
definitionIndexes() {
|
|
274
|
+
if (!this._definitionIndexes) {
|
|
275
|
+
this._definitionIndexes = {
|
|
276
|
+
QueriesByID: IndexByUUID(this.Queries),
|
|
277
|
+
ParametersByQuery: GroupByUUID(this.Parameters, p => p.QueryID),
|
|
278
|
+
DependenciesByQuery: GroupByUUID(this.Dependencies, d => d.QueryID),
|
|
279
|
+
DependentsByQuery: GroupByUUID(this.Dependencies, d => d.DependsOnQueryID),
|
|
280
|
+
QuerySQLsByQuery: GroupByUUID(this.QuerySQLs, q => q.QueryID),
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
return this._definitionIndexes;
|
|
284
|
+
}
|
|
285
|
+
/** Forgets every computed signature, so the next request recomputes from current data. */
|
|
286
|
+
clearDefinitionMemo(propertyName) {
|
|
287
|
+
if (DEFINITION_PROPERTIES.has(propertyName)) {
|
|
288
|
+
this._definitionMemo.clear();
|
|
289
|
+
this._definitionIndexes = null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
NotifyDataChange(config, data, changeType = 'refresh', affectedEntity) {
|
|
293
|
+
this.clearDefinitionMemo(config.PropertyName);
|
|
294
|
+
super.NotifyDataChange(config, data, changeType, affectedEntity);
|
|
295
|
+
}
|
|
296
|
+
emitPropertyChange(propertyName) {
|
|
297
|
+
this.clearDefinitionMemo(propertyName);
|
|
298
|
+
super.emitPropertyChange(propertyName);
|
|
299
|
+
}
|
|
300
|
+
/** Milliseconds since the epoch for a row timestamp, or 0 when absent or unreadable. */
|
|
301
|
+
static timestampMs(value) {
|
|
302
|
+
if (value == null)
|
|
303
|
+
return 0;
|
|
304
|
+
const ms = value instanceof Date ? value.getTime() : Date.parse(value);
|
|
305
|
+
return Number.isNaN(ms) ? 0 : ms;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* A 53-bit hash of `text` as hex (cyrb53). Plain JavaScript, so a browser and a server hash the
|
|
309
|
+
* same text to the same value.
|
|
310
|
+
*/
|
|
311
|
+
static hashText(text) {
|
|
312
|
+
let h1 = 0xdeadbeef;
|
|
313
|
+
let h2 = 0x41c6ce57;
|
|
314
|
+
for (let i = 0; i < text.length; i++) {
|
|
315
|
+
const ch = text.charCodeAt(i);
|
|
316
|
+
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
317
|
+
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
318
|
+
}
|
|
319
|
+
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
|
|
320
|
+
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
|
|
321
|
+
return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16);
|
|
322
|
+
}
|
|
323
|
+
// --- Deleting cached results after an edit ---
|
|
324
|
+
/**
|
|
325
|
+
* Notes result-affecting edits made in this process before the base class applies the event.
|
|
326
|
+
* Only local saves and deletes count: every server's engine also hears about the edit, through
|
|
327
|
+
* the shared cache, but only the server that made it deletes the slots, so a fleet does not
|
|
328
|
+
* delete the same slots once per server while the others refill them.
|
|
329
|
+
*/
|
|
330
|
+
async HandleIndividualBaseEntityEvent(event) {
|
|
331
|
+
try {
|
|
332
|
+
this.trackDefinitionEdit(event);
|
|
333
|
+
}
|
|
334
|
+
catch (e) {
|
|
335
|
+
LogError(`QueryEngine: tracking a query edit failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
336
|
+
}
|
|
337
|
+
return super.HandleIndividualBaseEntityEvent(event);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Follows one save or delete of a query definition row. A save is judged when it starts, while
|
|
341
|
+
* the record still knows which columns are dirty, and acted on when it succeeds. A delete
|
|
342
|
+
* always counts. The slots of the affected query and of every query that composes it are then
|
|
343
|
+
* deleted once the edit settles (see {@link DefinitionEditSettleMs}). Deleting them is
|
|
344
|
+
* housekeeping: a read under the new definition already misses them (see
|
|
345
|
+
* {@link GetDefinitionSignature}).
|
|
346
|
+
*/
|
|
347
|
+
trackDefinitionEdit(event) {
|
|
348
|
+
const entity = event.baseEntity;
|
|
349
|
+
const columns = entity ? RESULT_AFFECTING_COLUMNS[entity.EntityInfo.Name.trim().toLowerCase()] : undefined;
|
|
350
|
+
if (!entity || !columns)
|
|
351
|
+
return;
|
|
352
|
+
if (event.type === 'save_started') {
|
|
353
|
+
if (QueryEngine_1.isResultAffectingSave(entity, columns)) {
|
|
354
|
+
this._resultAffectingSaves.add(entity);
|
|
355
|
+
}
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (event.type === 'save' && this._resultAffectingSaves.has(entity)) {
|
|
359
|
+
this._resultAffectingSaves.delete(entity);
|
|
360
|
+
this.invalidateAfterEdit(QueryEngine_1.editedQueryID(entity, undefined));
|
|
361
|
+
}
|
|
362
|
+
else if (event.type === 'delete') {
|
|
363
|
+
const payload = event.payload;
|
|
364
|
+
this.invalidateAfterEdit(QueryEngine_1.editedQueryID(entity, payload?.OldValues));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/** True for a create, or an update with any of `columns` dirty. */
|
|
368
|
+
static isResultAffectingSave(entity, columns) {
|
|
369
|
+
if (!entity.IsSaved || columns === 'all')
|
|
370
|
+
return true;
|
|
371
|
+
return columns.some(name => entity.GetFieldByName(name)?.Dirty === true);
|
|
372
|
+
}
|
|
373
|
+
/** The query a definition row belongs to: the row itself for a query, else its QueryID. */
|
|
374
|
+
static editedQueryID(entity, deletedValues) {
|
|
375
|
+
const isQuery = entity.EntityInfo.Name.trim().toLowerCase() === 'mj: queries';
|
|
376
|
+
const field = isQuery ? 'ID' : 'QueryID';
|
|
377
|
+
const value = deletedValues?.[field] ?? entity.GetFieldByName(field)?.Value;
|
|
378
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
379
|
+
}
|
|
380
|
+
/** Schedules slot deletion for `queryID` and every query that composes it, directly or not. */
|
|
381
|
+
invalidateAfterEdit(queryID) {
|
|
382
|
+
if (!queryID)
|
|
383
|
+
return;
|
|
384
|
+
for (const id of this.queryAndDependents(queryID)) {
|
|
385
|
+
this.scheduleSlotInvalidation(id);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/** `queryID` plus every query that reaches it through composition. Cycles end the walk. */
|
|
389
|
+
queryAndDependents(queryID) {
|
|
390
|
+
const dependents = this.definitionIndexes().DependentsByQuery;
|
|
391
|
+
const seen = new Set();
|
|
392
|
+
const result = [];
|
|
393
|
+
const pending = [queryID];
|
|
394
|
+
while (pending.length > 0) {
|
|
395
|
+
const id = pending.pop();
|
|
396
|
+
const key = id.trim().toLowerCase();
|
|
397
|
+
if (seen.has(key))
|
|
398
|
+
continue;
|
|
399
|
+
seen.add(key);
|
|
400
|
+
result.push(id);
|
|
401
|
+
for (const row of dependents.Get(id) ?? []) {
|
|
402
|
+
pending.push(row.QueryID);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return result;
|
|
406
|
+
}
|
|
407
|
+
/** (Re)starts the settle timer for one query's slot deletion. */
|
|
408
|
+
scheduleSlotInvalidation(queryID) {
|
|
409
|
+
const key = queryID.trim().toLowerCase();
|
|
410
|
+
const existing = this._pendingSlotInvalidations.get(key);
|
|
411
|
+
if (existing)
|
|
412
|
+
clearTimeout(existing);
|
|
413
|
+
const timer = setTimeout(() => {
|
|
414
|
+
this._pendingSlotInvalidations.delete(key);
|
|
415
|
+
void this.invalidateQuerySlots(queryID);
|
|
416
|
+
}, this.DefinitionEditSettleMs);
|
|
417
|
+
// A pending deletion must not keep a short-lived process (a CLI run) alive.
|
|
418
|
+
timer.unref?.();
|
|
419
|
+
this._pendingSlotInvalidations.set(key, timer);
|
|
420
|
+
}
|
|
421
|
+
/** Deletes one query's cached results. Never throws. */
|
|
422
|
+
async invalidateQuerySlots(queryID) {
|
|
423
|
+
try {
|
|
424
|
+
const cache = LocalCacheManager.Instance;
|
|
425
|
+
if (!cache.IsInitialized)
|
|
426
|
+
return;
|
|
427
|
+
const removed = await cache.InvalidateRunQueryResultsForQuery(queryID);
|
|
428
|
+
LogStatusEx({ message: `QueryEngine: deleted ${removed} cached result slot(s) of query ${queryID} after its definition changed`, verboseOnly: true });
|
|
429
|
+
}
|
|
430
|
+
catch (e) {
|
|
431
|
+
LogError(`QueryEngine: deleting cached results of query ${queryID} failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
155
434
|
};
|
|
156
|
-
QueryEngine = __decorate([
|
|
435
|
+
QueryEngine = QueryEngine_1 = __decorate([
|
|
157
436
|
RegisterForStartup()
|
|
158
437
|
], QueryEngine);
|
|
159
438
|
export { QueryEngine };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryEngine.js","sourceRoot":"","sources":["../../src/engines/QueryEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QueryEngine.js","sourceRoot":"","sources":["../../src/engines/QueryEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,6 +85,12 @@ export declare class UserInfoEngine extends BaseEngine<UserInfoEngine> {
|
|
|
85
85
|
* These are queued and flushed after the debounce period of inactivity.
|
|
86
86
|
*/
|
|
87
87
|
private _pendingSettings;
|
|
88
|
+
/**
|
|
89
|
+
* Engine properties already reported as permission-constrained by
|
|
90
|
+
* {@link readIfPermitted}, so the notice is logged once per property per process
|
|
91
|
+
* rather than on every read (notification badges re-read on every emission).
|
|
92
|
+
*/
|
|
93
|
+
private _permissionNoticesLogged;
|
|
88
94
|
/**
|
|
89
95
|
* Timer handle for the debounce flush
|
|
90
96
|
*/
|
|
@@ -140,16 +146,45 @@ export declare class UserInfoEngine extends BaseEngine<UserInfoEngine> {
|
|
|
140
146
|
* synchronously (e.g. form-variant picker → form reload) depend on
|
|
141
147
|
* this freshness guarantee.
|
|
142
148
|
*
|
|
149
|
+
* A user who cannot read `MJ: User Settings` (a permission-constrained session such as an
|
|
150
|
+
* external magic-link user) gets `undefined` — "not set", so callers fall back to their
|
|
151
|
+
* defaults — instead of a thrown `PermissionConstrainedError`. The denial is logged once.
|
|
152
|
+
*
|
|
143
153
|
* @param settingKey - The setting key to find (e.g., "default-view-setting/Contacts")
|
|
144
154
|
* @returns The setting value string, or undefined if not found
|
|
145
155
|
*/
|
|
146
156
|
GetSetting(settingKey: string): string | undefined;
|
|
147
157
|
/**
|
|
148
158
|
* Get a user setting entity by key.
|
|
159
|
+
*
|
|
160
|
+
* Like {@link GetSetting}, a user who cannot read `MJ: User Settings` (e.g. an external
|
|
161
|
+
* magic-link session) gets `undefined` — "not set" — instead of a thrown
|
|
162
|
+
* `PermissionConstrainedError`; the denial is logged once.
|
|
149
163
|
* @param settingKey - The setting key to find
|
|
150
164
|
* @returns The MJUserSettingEntity, or undefined if not found
|
|
151
165
|
*/
|
|
152
166
|
GetSettingEntity(settingKey: string): MJUserSettingEntity | undefined;
|
|
167
|
+
/**
|
|
168
|
+
* Reads a permission-gated engine property for a LOOKUP whose empty answer is safe
|
|
169
|
+
* ("no such setting", "no notifications"). When the current user lacks read permission
|
|
170
|
+
* on the property's entity, returns `[]` and logs the denial once per property instead
|
|
171
|
+
* of letting `PermissionConstrainedError` escape.
|
|
172
|
+
*
|
|
173
|
+
* Engines are permission-constrained by design for restricted sessions (external
|
|
174
|
+
* magic-link users hold only 'Magic Link Baseline' plus a granted role), so these
|
|
175
|
+
* lookups run at every boot for such users and must not throw.
|
|
176
|
+
*
|
|
177
|
+
* Also used by the read-only display collections whose empty answer is equally safe —
|
|
178
|
+
* {@link UserFavorites}, {@link NotificationPreferences} and {@link NotificationTypes}: no
|
|
179
|
+
* caller treats an empty one as a cue to create records, and their consumers (Home,
|
|
180
|
+
* profile, notification settings, Data Explorer) run inside a restricted session too.
|
|
181
|
+
*
|
|
182
|
+
* Deliberately NOT used by the raw collection getters whose emptiness means "brand-new
|
|
183
|
+
* user" (`UserSettings`, `Workspaces`, `UserApplications`, ...): those keep throwing,
|
|
184
|
+
* because such a caller would otherwise auto-create records for a user who simply cannot
|
|
185
|
+
* see them. Those callers must check {@link IsPermissionConstrained} first.
|
|
186
|
+
*/
|
|
187
|
+
private readIfPermitted;
|
|
153
188
|
/**
|
|
154
189
|
* Set a user setting by key. Creates a new setting if it doesn't exist.
|
|
155
190
|
* @param settingKey - The setting key (e.g., "default-view-setting/Contacts")
|
|
@@ -212,6 +247,14 @@ export declare class UserInfoEngine extends BaseEngine<UserInfoEngine> {
|
|
|
212
247
|
* Get unread notifications for the current user
|
|
213
248
|
*/
|
|
214
249
|
get UnreadNotifications(): MJUserNotificationEntity[];
|
|
250
|
+
/**
|
|
251
|
+
* The current user's notifications (same filter and order as {@link UserNotifications}),
|
|
252
|
+
* or `[]` when the user cannot read `MJ: User Notifications` — a permission-constrained
|
|
253
|
+
* session such as an external magic-link user. Never throws `PermissionConstrainedError`;
|
|
254
|
+
* the denial is logged once. Use this for badges, counts and lists that should simply
|
|
255
|
+
* show nothing for such users.
|
|
256
|
+
*/
|
|
257
|
+
get UserNotificationsIfPermitted(): MJUserNotificationEntity[];
|
|
215
258
|
/**
|
|
216
259
|
* Get the count of unread notifications
|
|
217
260
|
*/
|
|
@@ -244,7 +287,8 @@ export declare class UserInfoEngine extends BaseEngine<UserInfoEngine> {
|
|
|
244
287
|
*/
|
|
245
288
|
private applicationDefaultSequence;
|
|
246
289
|
/**
|
|
247
|
-
* Get all favorites for the current user, ordered by creation date (newest first)
|
|
290
|
+
* Get all favorites for the current user, ordered by creation date (newest first).
|
|
291
|
+
* Empty (not a thrown `PermissionConstrainedError`) for a session that cannot read them.
|
|
248
292
|
*/
|
|
249
293
|
get UserFavorites(): MJUserFavoriteEntity[];
|
|
250
294
|
/**
|
|
@@ -470,7 +514,8 @@ export declare class UserInfoEngine extends BaseEngine<UserInfoEngine> {
|
|
|
470
514
|
*/
|
|
471
515
|
private doCreateDefaultApplications;
|
|
472
516
|
/**
|
|
473
|
-
* Get all notification preferences for the current user
|
|
517
|
+
* Get all notification preferences for the current user.
|
|
518
|
+
* Empty (not a thrown `PermissionConstrainedError`) for a session that cannot read them.
|
|
474
519
|
*/
|
|
475
520
|
get NotificationPreferences(): MJUserNotificationPreferenceEntity[];
|
|
476
521
|
GetUserPreferenceForType(userId: string, typeId: string): MJUserNotificationPreferenceEntity | undefined;
|
|
@@ -481,6 +526,7 @@ export declare class UserInfoEngine extends BaseEngine<UserInfoEngine> {
|
|
|
481
526
|
/**
|
|
482
527
|
* Get all notification types.
|
|
483
528
|
* Notification types are global (not user-specific) and define the available notification categories.
|
|
529
|
+
* Empty (not a thrown `PermissionConstrainedError`) for a session that cannot read them.
|
|
484
530
|
*/
|
|
485
531
|
get NotificationTypes(): MJUserNotificationTypeEntity[];
|
|
486
532
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserInfoEngine.d.ts","sourceRoot":"","sources":["../../src/engines/UserInfoEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EAEV,iBAAiB,EAKjB,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAEzH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,QAAQ,KACX,OAAO,CAAC;AAEb;;;;;;;;;GASG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACnC,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,OAAO,EACxB,IAAI,EAAE,QAAQ,KACX,OAAO,CAAC;AAEb,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,kCAAkC,EACnC,MAAM,gCAAgC,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBACa,cAAe,SAAQ,UAAU,CAAC,cAAc,CAAC;IAC5D;;;OAGG;IACH,WAAkB,QAAQ,IAAI,cAAc,CAE3C;IAGD,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAA6B;IAGlD,OAAO,CAAC,kBAAkB,CAAsC;IAEhE,OAAO,CAAC,4BAA4B,CAA4C;IAEhF,OAAO,CAAC,iBAAiB,CAAiC;IAG1D,OAAO,CAAC,wBAAwB,CAAwC;IACxE,OAAO,CAAC,uBAAuB,CAAuC;IAGtE,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,yBAAyB,CAAmD;IAMpF;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAAe;IAE1C;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAAwF;IAEhH;;OAEG;IACH,OAAO,CAAC,sBAAsB,CAA8C;IAE5E;;;OAGG;IACH,OAAO,CAAC,aAAa,CAA8B;IAEnD;;;;;;;OAOG;IACU,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6FhH;;;;;;OAMG;IACH,IAAW,kBAAkB,IAAI,UAAU,CAAC,wBAAwB,EAAE,CAAC,CAEtE;IAED;;;OAGG;IACH,IAAW,cAAc,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAE9D;IAED;;;OAGG;IACH,IAAW,iBAAiB,IAAI,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAEpE;IAMD;;OAEG;IACH,IAAW,iBAAiB,IAAI,wBAAwB,EAAE,CAKzD;IAED;;OAEG;IACH,IAAW,YAAY,IAAI,mBAAmB,EAAE,CAI/C;IAED
|
|
1
|
+
{"version":3,"file":"UserInfoEngine.d.ts","sourceRoot":"","sources":["../../src/engines/UserInfoEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,6 +67,12 @@ let UserInfoEngine = UserInfoEngine_1 = class UserInfoEngine extends BaseEngine
|
|
|
67
67
|
* These are queued and flushed after the debounce period of inactivity.
|
|
68
68
|
*/
|
|
69
69
|
this._pendingSettings = new Map();
|
|
70
|
+
/**
|
|
71
|
+
* Engine properties already reported as permission-constrained by
|
|
72
|
+
* {@link readIfPermitted}, so the notice is logged once per property per process
|
|
73
|
+
* rather than on every read (notification badges re-read on every emission).
|
|
74
|
+
*/
|
|
75
|
+
this._permissionNoticesLogged = new Set();
|
|
70
76
|
/**
|
|
71
77
|
* Timer handle for the debounce flush
|
|
72
78
|
*/
|
|
@@ -235,6 +241,10 @@ let UserInfoEngine = UserInfoEngine_1 = class UserInfoEngine extends BaseEngine
|
|
|
235
241
|
* synchronously (e.g. form-variant picker → form reload) depend on
|
|
236
242
|
* this freshness guarantee.
|
|
237
243
|
*
|
|
244
|
+
* A user who cannot read `MJ: User Settings` (a permission-constrained session such as an
|
|
245
|
+
* external magic-link user) gets `undefined` — "not set", so callers fall back to their
|
|
246
|
+
* defaults — instead of a thrown `PermissionConstrainedError`. The denial is logged once.
|
|
247
|
+
*
|
|
238
248
|
* @param settingKey - The setting key to find (e.g., "default-view-setting/Contacts")
|
|
239
249
|
* @returns The setting value string, or undefined if not found
|
|
240
250
|
*/
|
|
@@ -242,16 +252,50 @@ let UserInfoEngine = UserInfoEngine_1 = class UserInfoEngine extends BaseEngine
|
|
|
242
252
|
const pending = this._pendingSettings.get(settingKey);
|
|
243
253
|
if (pending !== undefined)
|
|
244
254
|
return pending.value;
|
|
245
|
-
const setting = this.UserSettings.find((s) => s.Setting === settingKey);
|
|
255
|
+
const setting = this.readIfPermitted('_userSettings', () => this.UserSettings).find((s) => s.Setting === settingKey);
|
|
246
256
|
return setting?.Value ?? undefined;
|
|
247
257
|
}
|
|
248
258
|
/**
|
|
249
259
|
* Get a user setting entity by key.
|
|
260
|
+
*
|
|
261
|
+
* Like {@link GetSetting}, a user who cannot read `MJ: User Settings` (e.g. an external
|
|
262
|
+
* magic-link session) gets `undefined` — "not set" — instead of a thrown
|
|
263
|
+
* `PermissionConstrainedError`; the denial is logged once.
|
|
250
264
|
* @param settingKey - The setting key to find
|
|
251
265
|
* @returns The MJUserSettingEntity, or undefined if not found
|
|
252
266
|
*/
|
|
253
267
|
GetSettingEntity(settingKey) {
|
|
254
|
-
return this.UserSettings.find((s) => s.Setting === settingKey);
|
|
268
|
+
return this.readIfPermitted('_userSettings', () => this.UserSettings).find((s) => s.Setting === settingKey);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Reads a permission-gated engine property for a LOOKUP whose empty answer is safe
|
|
272
|
+
* ("no such setting", "no notifications"). When the current user lacks read permission
|
|
273
|
+
* on the property's entity, returns `[]` and logs the denial once per property instead
|
|
274
|
+
* of letting `PermissionConstrainedError` escape.
|
|
275
|
+
*
|
|
276
|
+
* Engines are permission-constrained by design for restricted sessions (external
|
|
277
|
+
* magic-link users hold only 'Magic Link Baseline' plus a granted role), so these
|
|
278
|
+
* lookups run at every boot for such users and must not throw.
|
|
279
|
+
*
|
|
280
|
+
* Also used by the read-only display collections whose empty answer is equally safe —
|
|
281
|
+
* {@link UserFavorites}, {@link NotificationPreferences} and {@link NotificationTypes}: no
|
|
282
|
+
* caller treats an empty one as a cue to create records, and their consumers (Home,
|
|
283
|
+
* profile, notification settings, Data Explorer) run inside a restricted session too.
|
|
284
|
+
*
|
|
285
|
+
* Deliberately NOT used by the raw collection getters whose emptiness means "brand-new
|
|
286
|
+
* user" (`UserSettings`, `Workspaces`, `UserApplications`, ...): those keep throwing,
|
|
287
|
+
* because such a caller would otherwise auto-create records for a user who simply cannot
|
|
288
|
+
* see them. Those callers must check {@link IsPermissionConstrained} first.
|
|
289
|
+
*/
|
|
290
|
+
readIfPermitted(propertyName, read) {
|
|
291
|
+
if (!this.IsPropertyPermissionConstrained(propertyName)) {
|
|
292
|
+
return read();
|
|
293
|
+
}
|
|
294
|
+
if (!this._permissionNoticesLogged.has(propertyName)) {
|
|
295
|
+
this._permissionNoticesLogged.add(propertyName);
|
|
296
|
+
LogStatus(`UserInfoEngine: current user cannot read ${propertyName} (permission-constrained session); treating it as empty.`);
|
|
297
|
+
}
|
|
298
|
+
return [];
|
|
255
299
|
}
|
|
256
300
|
/**
|
|
257
301
|
* Set a user setting by key. Creates a new setting if it doesn't exist.
|
|
@@ -473,7 +517,17 @@ let UserInfoEngine = UserInfoEngine_1 = class UserInfoEngine extends BaseEngine
|
|
|
473
517
|
* Get unread notifications for the current user
|
|
474
518
|
*/
|
|
475
519
|
get UnreadNotifications() {
|
|
476
|
-
return this.
|
|
520
|
+
return this.UserNotificationsIfPermitted.filter((n) => n.Unread);
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* The current user's notifications (same filter and order as {@link UserNotifications}),
|
|
524
|
+
* or `[]` when the user cannot read `MJ: User Notifications` — a permission-constrained
|
|
525
|
+
* session such as an external magic-link user. Never throws `PermissionConstrainedError`;
|
|
526
|
+
* the denial is logged once. Use this for badges, counts and lists that should simply
|
|
527
|
+
* show nothing for such users.
|
|
528
|
+
*/
|
|
529
|
+
get UserNotificationsIfPermitted() {
|
|
530
|
+
return this.readIfPermitted('_userNotifications', () => this.UserNotifications);
|
|
477
531
|
}
|
|
478
532
|
/**
|
|
479
533
|
* Get the count of unread notifications
|
|
@@ -534,12 +588,13 @@ let UserInfoEngine = UserInfoEngine_1 = class UserInfoEngine extends BaseEngine
|
|
|
534
588
|
return this.GetApplicationInfo(applicationId)?.DefaultSequence ?? 100;
|
|
535
589
|
}
|
|
536
590
|
/**
|
|
537
|
-
* Get all favorites for the current user, ordered by creation date (newest first)
|
|
591
|
+
* Get all favorites for the current user, ordered by creation date (newest first).
|
|
592
|
+
* Empty (not a thrown `PermissionConstrainedError`) for a session that cannot read them.
|
|
538
593
|
*/
|
|
539
594
|
get UserFavorites() {
|
|
540
595
|
if (!this._loadedForUserId)
|
|
541
596
|
return [];
|
|
542
|
-
return this.GetConfigData('_userFavorites')
|
|
597
|
+
return this.readIfPermitted('_userFavorites', () => this.GetConfigData('_userFavorites'))
|
|
543
598
|
.filter((f) => UUIDsEqual(f.UserID, this._loadedForUserId))
|
|
544
599
|
.sort((a, b) => new Date(b.Get('__mj_CreatedAt')).getTime() - new Date(a.Get('__mj_CreatedAt')).getTime());
|
|
545
600
|
}
|
|
@@ -1155,12 +1210,13 @@ let UserInfoEngine = UserInfoEngine_1 = class UserInfoEngine extends BaseEngine
|
|
|
1155
1210
|
return createdUserApps;
|
|
1156
1211
|
}
|
|
1157
1212
|
/**
|
|
1158
|
-
* Get all notification preferences for the current user
|
|
1213
|
+
* Get all notification preferences for the current user.
|
|
1214
|
+
* Empty (not a thrown `PermissionConstrainedError`) for a session that cannot read them.
|
|
1159
1215
|
*/
|
|
1160
1216
|
get NotificationPreferences() {
|
|
1161
1217
|
if (!this._loadedForUserId)
|
|
1162
1218
|
return [];
|
|
1163
|
-
return this.GetConfigData('_userNotificationPreferences')
|
|
1219
|
+
return this.readIfPermitted('_userNotificationPreferences', () => this.GetConfigData('_userNotificationPreferences'))
|
|
1164
1220
|
.filter((p) => UUIDsEqual(p.UserID, this._loadedForUserId));
|
|
1165
1221
|
}
|
|
1166
1222
|
GetUserPreferenceForType(userId, typeId) {
|
|
@@ -1177,9 +1233,10 @@ let UserInfoEngine = UserInfoEngine_1 = class UserInfoEngine extends BaseEngine
|
|
|
1177
1233
|
/**
|
|
1178
1234
|
* Get all notification types.
|
|
1179
1235
|
* Notification types are global (not user-specific) and define the available notification categories.
|
|
1236
|
+
* Empty (not a thrown `PermissionConstrainedError`) for a session that cannot read them.
|
|
1180
1237
|
*/
|
|
1181
1238
|
get NotificationTypes() {
|
|
1182
|
-
return this.GetConfigData('_notificationTypes');
|
|
1239
|
+
return this.readIfPermitted('_notificationTypes', () => this.GetConfigData('_notificationTypes'));
|
|
1183
1240
|
}
|
|
1184
1241
|
};
|
|
1185
1242
|
UserInfoEngine = UserInfoEngine_1 = __decorate([
|