@memberjunction/global 2.111.1 → 2.112.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.
Files changed (117) hide show
  1. package/dist/Core.d.ts +29 -0
  2. package/dist/Core.d.ts.map +1 -0
  3. package/dist/Core.js +58 -0
  4. package/dist/Core.js.map +1 -0
  5. package/dist/generic/QueryCache.d.ts +85 -0
  6. package/dist/generic/QueryCache.d.ts.map +1 -0
  7. package/dist/generic/QueryCache.js +198 -0
  8. package/dist/generic/QueryCache.js.map +1 -0
  9. package/dist/generic/QueryCacheConfig.d.ts +72 -0
  10. package/dist/generic/QueryCacheConfig.d.ts.map +1 -0
  11. package/dist/generic/QueryCacheConfig.js +3 -0
  12. package/dist/generic/QueryCacheConfig.js.map +1 -0
  13. package/dist/generic/applicationInfo.d.ts +138 -0
  14. package/dist/generic/applicationInfo.d.ts.map +1 -0
  15. package/dist/generic/applicationInfo.js +177 -0
  16. package/dist/generic/applicationInfo.js.map +1 -0
  17. package/dist/generic/authEvaluator.d.ts +25 -0
  18. package/dist/generic/authEvaluator.d.ts.map +1 -0
  19. package/dist/generic/authEvaluator.js +49 -0
  20. package/dist/generic/authEvaluator.js.map +1 -0
  21. package/dist/generic/authTypes.d.ts +193 -0
  22. package/dist/generic/authTypes.d.ts.map +1 -0
  23. package/dist/generic/authTypes.js +19 -0
  24. package/dist/generic/authTypes.js.map +1 -0
  25. package/dist/generic/baseEngine.d.ts +260 -0
  26. package/dist/generic/baseEngine.d.ts.map +1 -0
  27. package/dist/generic/baseEngine.js +510 -0
  28. package/dist/generic/baseEngine.js.map +1 -0
  29. package/dist/generic/baseEntity.d.ts +691 -0
  30. package/dist/generic/baseEntity.d.ts.map +1 -0
  31. package/dist/generic/baseEntity.js +1688 -0
  32. package/dist/generic/baseEntity.js.map +1 -0
  33. package/dist/generic/baseInfo.d.ts +24 -0
  34. package/dist/generic/baseInfo.d.ts.map +1 -0
  35. package/dist/generic/baseInfo.js +53 -0
  36. package/dist/generic/baseInfo.js.map +1 -0
  37. package/dist/generic/compositeKey.d.ts +206 -0
  38. package/dist/generic/compositeKey.d.ts.map +1 -0
  39. package/dist/generic/compositeKey.js +412 -0
  40. package/dist/generic/compositeKey.js.map +1 -0
  41. package/dist/generic/databaseProviderBase.d.ts +46 -0
  42. package/dist/generic/databaseProviderBase.d.ts.map +1 -0
  43. package/dist/generic/databaseProviderBase.js +14 -0
  44. package/dist/generic/databaseProviderBase.js.map +1 -0
  45. package/dist/generic/entityInfo.d.ts +983 -0
  46. package/dist/generic/entityInfo.d.ts.map +1 -0
  47. package/dist/generic/entityInfo.js +1401 -0
  48. package/dist/generic/entityInfo.js.map +1 -0
  49. package/dist/generic/explorerNavigationItem.d.ts +20 -0
  50. package/dist/generic/explorerNavigationItem.d.ts.map +1 -0
  51. package/dist/generic/explorerNavigationItem.js +29 -0
  52. package/dist/generic/explorerNavigationItem.js.map +1 -0
  53. package/dist/generic/interfaces.d.ts +610 -0
  54. package/dist/generic/interfaces.d.ts.map +1 -0
  55. package/dist/generic/interfaces.js +211 -0
  56. package/dist/generic/interfaces.js.map +1 -0
  57. package/dist/generic/libraryInfo.d.ts +40 -0
  58. package/dist/generic/libraryInfo.d.ts.map +1 -0
  59. package/dist/generic/libraryInfo.js +56 -0
  60. package/dist/generic/libraryInfo.js.map +1 -0
  61. package/dist/generic/logging.d.ts +179 -0
  62. package/dist/generic/logging.d.ts.map +1 -0
  63. package/dist/generic/logging.js +382 -0
  64. package/dist/generic/logging.js.map +1 -0
  65. package/dist/generic/metadata.d.ts +305 -0
  66. package/dist/generic/metadata.d.ts.map +1 -0
  67. package/dist/generic/metadata.js +454 -0
  68. package/dist/generic/metadata.js.map +1 -0
  69. package/dist/generic/metadataUtil.d.ts +8 -0
  70. package/dist/generic/metadataUtil.d.ts.map +1 -0
  71. package/dist/generic/metadataUtil.js +36 -0
  72. package/dist/generic/metadataUtil.js.map +1 -0
  73. package/dist/generic/providerBase.d.ts +546 -0
  74. package/dist/generic/providerBase.d.ts.map +1 -0
  75. package/dist/generic/providerBase.js +999 -0
  76. package/dist/generic/providerBase.js.map +1 -0
  77. package/dist/generic/queryInfo.d.ts +460 -0
  78. package/dist/generic/queryInfo.d.ts.map +1 -0
  79. package/dist/generic/queryInfo.js +633 -0
  80. package/dist/generic/queryInfo.js.map +1 -0
  81. package/dist/generic/querySQLFilters.d.ts +54 -0
  82. package/dist/generic/querySQLFilters.d.ts.map +1 -0
  83. package/dist/generic/querySQLFilters.js +84 -0
  84. package/dist/generic/querySQLFilters.js.map +1 -0
  85. package/dist/generic/runQuery.d.ts +96 -0
  86. package/dist/generic/runQuery.d.ts.map +1 -0
  87. package/dist/generic/runQuery.js +66 -0
  88. package/dist/generic/runQuery.js.map +1 -0
  89. package/dist/generic/runQuerySQLFilterImplementations.d.ts +51 -0
  90. package/dist/generic/runQuerySQLFilterImplementations.d.ts.map +1 -0
  91. package/dist/generic/runQuerySQLFilterImplementations.js +238 -0
  92. package/dist/generic/runQuerySQLFilterImplementations.js.map +1 -0
  93. package/dist/generic/runReport.d.ts +25 -0
  94. package/dist/generic/runReport.d.ts.map +1 -0
  95. package/dist/generic/runReport.js +42 -0
  96. package/dist/generic/runReport.js.map +1 -0
  97. package/dist/generic/securityInfo.d.ts +355 -0
  98. package/dist/generic/securityInfo.d.ts.map +1 -0
  99. package/dist/generic/securityInfo.js +425 -0
  100. package/dist/generic/securityInfo.js.map +1 -0
  101. package/dist/generic/transactionGroup.d.ts +184 -0
  102. package/dist/generic/transactionGroup.d.ts.map +1 -0
  103. package/dist/generic/transactionGroup.js +357 -0
  104. package/dist/generic/transactionGroup.js.map +1 -0
  105. package/dist/generic/util.d.ts +81 -0
  106. package/dist/generic/util.d.ts.map +1 -0
  107. package/dist/generic/util.js +301 -0
  108. package/dist/generic/util.js.map +1 -0
  109. package/dist/views/runView.d.ts +150 -0
  110. package/dist/views/runView.d.ts.map +1 -0
  111. package/dist/views/runView.js +100 -0
  112. package/dist/views/runView.js.map +1 -0
  113. package/dist/views/viewInfo.d.ts +121 -0
  114. package/dist/views/viewInfo.d.ts.map +1 -0
  115. package/dist/views/viewInfo.js +182 -0
  116. package/dist/views/viewInfo.js.map +1 -0
  117. package/package.json +1 -1
@@ -0,0 +1,510 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseEngine = exports.BaseEnginePropertyConfig = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const runView_1 = require("../views/runView");
7
+ const logging_1 = require("./logging");
8
+ const metadata_1 = require("./metadata");
9
+ const interfaces_1 = require("./interfaces");
10
+ const baseInfo_1 = require("./baseInfo");
11
+ const baseEntity_1 = require("./baseEntity");
12
+ const interface_1 = require("../interface");
13
+ const Global_1 = require("../Global");
14
+ const BaseSingleton_1 = require("../BaseSingleton");
15
+ /**
16
+ * Property configuration for the BaseEngine class to automatically load/set properties on the class.
17
+ */
18
+ class BaseEnginePropertyConfig extends baseInfo_1.BaseInfo {
19
+ constructor(init) {
20
+ super();
21
+ /**
22
+ * The type of item to load, either 'entity' or 'dataset', defaults to 'entity'
23
+ */
24
+ this.Type = 'entity';
25
+ /**
26
+ * Optional, only used if Type is 'dataset', specifies how to handle the results of the dataset load. Defaults to 'single_property' if not specified. When set to 'single_property', the entire dataset is set to the property specified by PropertyName.
27
+ * When set to 'individual_properties', each item in the dataset is set to a property on the object with the name of the item's key plus the item's Code name.
28
+ * For example, if the item's key is 'Demo' and the item's Code name is 'FirstItem', the property set on the object would be 'Demo_FirstItem'.
29
+ */
30
+ this.DatasetResultHandling = 'single_property';
31
+ /**
32
+ * Optional, defaults to true. If set to false, AutoRefresh for this item will be disabled. By default, whenever a BaseEntity event is emitted for a save/delete, if the entity name
33
+ * for this config matches the BaseEntity's entity name, the config will be refreshed. If this is set to false, that will not happen. NOTE: This is not a network notification mechanism,
34
+ * it only works within the local tier, so for example within a browser application, that brower's engine sub-classes will be updated when changes are made to entities in that application
35
+ * environment, and the same is true for MJAPI/Server based environments. If you need network based notification, additional infrastructure will be needed to implement that.
36
+ */
37
+ this.AutoRefresh = true;
38
+ // now copy the values from init to this object
39
+ if (init)
40
+ Object.assign(this, init);
41
+ }
42
+ }
43
+ exports.BaseEnginePropertyConfig = BaseEnginePropertyConfig;
44
+ /**
45
+ * Abstract base class for any engine-style class which executes work on behalf of a caller typically using a provider-style architecture with plug-ins. This base class
46
+ * provides a mechanism for loading metadata from the database and caching it for use by the engine. Subclasses must implement the Config abstract method and within that
47
+ * generally it is recommended to call the Load method to load the metadata. Subclasses can also override the AdditionalLoading method to perform additional loading tasks.
48
+ */
49
+ class BaseEngine extends BaseSingleton_1.BaseSingleton {
50
+ /**
51
+ * While the BaseEngine class is a singleton, normally, it is possible to have multiple instances of the class in an application if the class is used in multiple contexts that have different providers.
52
+ */
53
+ constructor() {
54
+ super();
55
+ this._loaded = false;
56
+ this._loadingSubject = new rxjs_1.BehaviorSubject(false);
57
+ this._metadataConfigs = [];
58
+ this._dynamicConfigs = new Map();
59
+ this._dataMap = new Map();
60
+ this._expirationTimers = new Map();
61
+ this._entityEventSubjects = new Map();
62
+ this._entityEventDebounceTime = 5000; // Default debounce time in milliseconds (5 seconds)
63
+ }
64
+ /**
65
+ * Returns the metadata provider to use for the engine. If a provider is set via the Config method, that provider will be used, otherwise the default provider will be used.
66
+ */
67
+ get ProviderToUse() {
68
+ return this._provider || metadata_1.Metadata.Provider;
69
+ }
70
+ /**
71
+ * Returns the RunView provider to use for the engine. This is the same underlying object as the @property ProviderTouse, but cast to IRunViewProvider.
72
+ * If a provider is set via the Config method, that provider will be used, otherwise the default provider will be used.
73
+ */
74
+ get RunViewProviderToUse() {
75
+ return this.ProviderToUse;
76
+ }
77
+ /**
78
+ * Returns a COPY of the metadata configs array for the engine. This is a copy so you can't modify the original configs by modifying this array.
79
+ */
80
+ get Configs() {
81
+ // do a full deep copy of the array to ensure no tampering
82
+ return JSON.parse(JSON.stringify(this._metadataConfigs));
83
+ }
84
+ /**
85
+ * This method should be called by sub-classes to load up their specific metadata requirements. For more complex metadata
86
+ * loading or for post-processing of metadata loading done here, overide the AdditionalLoading method to add your logic.
87
+ * @param configs
88
+ * @param contextUser
89
+ * @returns
90
+ */
91
+ async Load(configs, provider, forceRefresh = false, contextUser) {
92
+ if (this.ProviderToUse.ProviderType === interfaces_1.ProviderType.Database && !contextUser)
93
+ throw new Error('For server-side use of all engine classes, you must provide the contextUser parameter');
94
+ if (this._loadingSubject.value) {
95
+ return new Promise((resolve) => {
96
+ const subscription = this._loadingSubject.subscribe((loading) => {
97
+ if (!loading) {
98
+ subscription.unsubscribe();
99
+ resolve();
100
+ }
101
+ });
102
+ });
103
+ }
104
+ if (!this._loaded || forceRefresh) {
105
+ this._loadingSubject.next(true);
106
+ try {
107
+ this.SetProvider(provider);
108
+ this._contextUser = contextUser;
109
+ await this.LoadConfigs(configs, contextUser);
110
+ await this.AdditionalLoading(contextUser); // Call the additional loading method
111
+ await this.SetupGlobalEventListener();
112
+ this._loaded = true;
113
+ }
114
+ catch (e) {
115
+ (0, logging_1.LogError)(e);
116
+ }
117
+ finally {
118
+ this._loadingSubject.next(false);
119
+ }
120
+ }
121
+ }
122
+ static get ProviderInstances() {
123
+ return BaseEngine._providerInstances;
124
+ }
125
+ /**
126
+ * This method will check for the existence of an instance of this engine class that is tied to a specific provider. If one exists, it will return it, otherwise it will create a new instance
127
+ */
128
+ static GetProviderInstance(provider, subclassConstructor) {
129
+ const existingEntry = BaseEngine.ProviderInstances.find((entry) => entry.provider === provider && entry.subclassConstructor === subclassConstructor);
130
+ if (existingEntry) {
131
+ return existingEntry.instance;
132
+ }
133
+ else {
134
+ // we don't have an existing instance for this provider, so we need to create one
135
+ const newInstance = new subclassConstructor();
136
+ newInstance.SetProvider(provider);
137
+ // BaseEngine.ProviderInstances.set({provider, subclassConstructor}, newInstance);
138
+ //BaseEngine.ProviderInstances.push({ provider, subclassConstructor, instance: newInstance });
139
+ return newInstance;
140
+ }
141
+ }
142
+ /**
143
+ * Internal method to set the provider when an engine is loaded
144
+ * @param provider
145
+ */
146
+ SetProvider(provider) {
147
+ this._provider = provider;
148
+ // BaseEngine.ProviderInstances.set({provider: this.ProviderToUse, subclassConstructor: this.constructor} /*use default provider if one wasn't provided to use*/, <T><any>this);
149
+ this.CheckAddToProviderInstances(this.ProviderToUse);
150
+ }
151
+ CheckAddToProviderInstances(provider) {
152
+ const existingEntry = BaseEngine.ProviderInstances.find((entry) => entry.provider === provider && entry.subclassConstructor === this.constructor);
153
+ if (!existingEntry) {
154
+ BaseEngine.ProviderInstances.push({
155
+ provider: provider,
156
+ subclassConstructor: this.constructor,
157
+ instance: this,
158
+ });
159
+ }
160
+ }
161
+ /**
162
+ * This method is responsible for registering for MJGlobal events and listening for BaseEntity events where those
163
+ * BaseEntity are related to the engine's configuration metadata. The idea is to auto-refresh the releated configs
164
+ * when the BaseEntity is updated.
165
+ */
166
+ async SetupGlobalEventListener() {
167
+ try {
168
+ if (!this._eventListener) {
169
+ this._eventListener = Global_1.MJGlobal.Instance.GetEventListener(false);
170
+ this._eventListener.subscribe(async (event) => {
171
+ await this.HandleIndividualEvent(event);
172
+ });
173
+ }
174
+ }
175
+ catch (e) {
176
+ (0, logging_1.LogError)(e);
177
+ return false;
178
+ }
179
+ }
180
+ /**
181
+ * Subclasses of BaseEngine can override this method to handle individual MJGlobal events. This is typically done to optimize
182
+ * the way refreshes are done when a BaseEntity is updated. If you are interested in only BaseEntity events, override
183
+ * the HandleIndividualBaseEntityEvent method instead as this method primarily serves to filter all the events we get from MJGlobal
184
+ * and only pass on BaseEntity events to HandleIndividualBaseEntityEvent.
185
+ * @param event
186
+ */
187
+ async HandleIndividualEvent(event) {
188
+ // base class algo is simple - we just check to see if the event's entity name matches any of our entity names
189
+ // and if so, we refresh the data by calling
190
+ if (event.event === interface_1.MJEventType.ComponentEvent && event.eventCode === baseEntity_1.BaseEntity.BaseEventCode) {
191
+ // we have an entity event
192
+ const baseEntityEvent = event.args;
193
+ return await this.HandleIndividualBaseEntityEvent(baseEntityEvent);
194
+ }
195
+ }
196
+ /**
197
+ * This method handles the individual base entity event and just checks to see if it is a delete or save event and if so, debounces it.
198
+ * Override this method if you want to have a different handling for the filtering of events that are debounced or if you don't want to debounce
199
+ * at all you can do that in an override of this method.
200
+ * @param event
201
+ */
202
+ async HandleIndividualBaseEntityEvent(event) {
203
+ try {
204
+ if (event.type === 'delete' || event.type === 'save') {
205
+ const eName = event.baseEntity.EntityInfo.Name.toLowerCase().trim();
206
+ const matchingAutoRefreshConfig = this.Configs.some((config) => {
207
+ return config.AutoRefresh && config.EntityName && config.EntityName.trim().toLowerCase() === eName;
208
+ });
209
+ if (matchingAutoRefreshConfig) {
210
+ return this.DebounceIndividualBaseEntityEvent(event);
211
+ }
212
+ }
213
+ return true;
214
+ }
215
+ catch (e) {
216
+ (0, logging_1.LogError)(e);
217
+ return false;
218
+ }
219
+ }
220
+ /**
221
+ * This method handles the debouncing process, by default using the EntityEventDebounceTime property to set the debounce time. Debouncing is
222
+ * done on a per-entity basis, meaning that if the debounce time passes for a specific entity name, the event will be processed. This is done to
223
+ * prevent multiple events from being processed in quick succession for a single entity which would cause a lot of wasted processing.
224
+ *
225
+ * Override this method if you want to change how debouncing time such as having variable debounce times per-entity, etc.
226
+ * @param event
227
+ * @returns
228
+ */
229
+ async DebounceIndividualBaseEntityEvent(event) {
230
+ try {
231
+ const entityName = event.baseEntity.EntityInfo.Name.toLowerCase().trim();
232
+ if (!this._entityEventSubjects.has(entityName)) {
233
+ const subject = new rxjs_1.Subject();
234
+ subject.pipe((0, operators_1.debounceTime)(this.EntityEventDebounceTime)).subscribe(async (e) => {
235
+ await this.ProcessEntityEvent(e);
236
+ });
237
+ this._entityEventSubjects.set(entityName, subject);
238
+ }
239
+ this._entityEventSubjects.get(entityName).next(event);
240
+ return true;
241
+ }
242
+ catch (e) {
243
+ (0, logging_1.LogError)(e);
244
+ return false;
245
+ }
246
+ }
247
+ /**
248
+ * Overridable property to set the debounce time for entity events. Default is 5000 milliseconds (5 seconds).
249
+ */
250
+ get EntityEventDebounceTime() {
251
+ return this._entityEventDebounceTime;
252
+ }
253
+ /**
254
+ * This method does the actual work of processing the entity event. It is not directly called from the event handler because we want to first debounce the events
255
+ * which also introduces a delay which is usually desirable so that our processing is typically outside of the scope of any transaction processing that would have
256
+ * originated the event.
257
+ *
258
+ * This is the best method to override if you want to change the actual processing of an entity event but do NOT want to modify the debouncing behavior.
259
+ */
260
+ async ProcessEntityEvent(event) {
261
+ try {
262
+ const entityName = event.baseEntity.EntityInfo.Name.toLowerCase().trim();
263
+ let refreshCount = 0;
264
+ for (const config of this.Configs) {
265
+ if (config.AutoRefresh && config.Type === 'entity' && config.EntityName?.trim().toLowerCase() === entityName) {
266
+ // LogStatus(`>>> Refreshing metadata for ${config.PropertyName} due to BaseEntity ${event.type} event for: ${event.baseEntity.EntityInfo.Name}, pkey: ${event.baseEntity.PrimaryKey.ToString()}`);
267
+ await this.LoadSingleConfig(config, this._contextUser);
268
+ refreshCount++;
269
+ }
270
+ }
271
+ if (refreshCount > 0) {
272
+ // we need to call AdditionalLoading here - because in many cases engine sub-classes do various kinds of data mashups
273
+ // after we have loaded - for example the TemplateEngine takes the TemplateContents and TemplateParams and stuffs them
274
+ // into arrays in each template to make it easier to get Params/Contents for each Template. Such operations are common
275
+ // and need to be done after the initial load and after any refreshes.
276
+ await this.AdditionalLoading(this._contextUser);
277
+ }
278
+ }
279
+ catch (e) {
280
+ (0, logging_1.LogError)(e);
281
+ }
282
+ }
283
+ /**
284
+ * Utility method to upgrade an object to a BaseEnginePropertyConfig object.
285
+ * @param obj
286
+ * @returns
287
+ */
288
+ UpgradeObjectToConfig(obj) {
289
+ // if obj is not already an instance of BaseEnginePropertyConfig, create one
290
+ if (obj instanceof BaseEnginePropertyConfig)
291
+ return obj;
292
+ else
293
+ return new BaseEnginePropertyConfig(obj);
294
+ }
295
+ /**
296
+ * Loads the specified metadata configurations.
297
+ * @param configs - The metadata configurations to load
298
+ * @param contextUser - The context user information
299
+ */
300
+ async LoadConfigs(configs, contextUser) {
301
+ this._metadataConfigs = configs.map((c) => this.UpgradeObjectToConfig(c));
302
+ // now, break up the configs into two chunks, datasets and views of entities so we can load all the views in a single network call via RunViews()
303
+ const entityConfigs = this._metadataConfigs.filter((c) => c.Type === 'entity');
304
+ const datasetConfigs = this._metadataConfigs.filter((c) => c.Type === 'dataset');
305
+ await Promise.all([
306
+ ...datasetConfigs.map((c) => this.LoadSingleDatasetConfig(c, contextUser)),
307
+ this.LoadMultipleEntityConfigs(entityConfigs, contextUser),
308
+ ]);
309
+ }
310
+ /**
311
+ * Loads a single metadata configuration.
312
+ * @param config - The metadata configuration to load
313
+ * @param contextUser - The context user information
314
+ */
315
+ async LoadSingleConfig(config, contextUser) {
316
+ if (config.Type === 'dataset')
317
+ return await this.LoadSingleDatasetConfig(config, contextUser);
318
+ else
319
+ return await this.LoadSingleEntityConfig(config, contextUser);
320
+ }
321
+ /**
322
+ * Handles the process of loading a single config of type 'entity'.
323
+ * @param config
324
+ * @param contextUser
325
+ */
326
+ async LoadSingleEntityConfig(config, contextUser) {
327
+ const p = this.RunViewProviderToUse;
328
+ const rv = new runView_1.RunView(p);
329
+ const result = await rv.RunView({
330
+ EntityName: config.EntityName,
331
+ ResultType: 'entity_object',
332
+ ExtraFilter: config.Filter,
333
+ OrderBy: config.OrderBy,
334
+ }, contextUser);
335
+ this.HandleSingleViewResult(config, result);
336
+ }
337
+ /**
338
+ * Handles the result of a single view load.
339
+ * @param config
340
+ * @param result
341
+ */
342
+ HandleSingleViewResult(config, result) {
343
+ if (result.Success) {
344
+ if (config.AddToObject !== false) {
345
+ this[config.PropertyName] = result.Results;
346
+ }
347
+ this._dataMap.set(config.PropertyName, { entityName: config.EntityName, data: result.Results });
348
+ if (config.Expiration) {
349
+ this.SetExpirationTimer(config.PropertyName, config.Expiration);
350
+ }
351
+ }
352
+ }
353
+ /**
354
+ * Handles the process of loading multiple entity configs in a single network call via RunViews()
355
+ * @param configs
356
+ * @param contextUser
357
+ */
358
+ async LoadMultipleEntityConfigs(configs, contextUser) {
359
+ if (configs && configs.length > 0) {
360
+ const p = this.RunViewProviderToUse;
361
+ const rv = new runView_1.RunView(p);
362
+ const viewConfigs = configs.map((c) => {
363
+ return {
364
+ EntityName: c.EntityName,
365
+ ResultType: 'entity_object',
366
+ ExtraFilter: c.Filter,
367
+ OrderBy: c.OrderBy,
368
+ };
369
+ });
370
+ const results = await rv.RunViews(viewConfigs, contextUser);
371
+ // now loop through the results and process them
372
+ for (let i = 0; i < configs.length; i++) {
373
+ this.HandleSingleViewResult(configs[i], results[i]);
374
+ }
375
+ }
376
+ }
377
+ /**
378
+ * Handles the process of loading a single config of type 'dataset'.
379
+ * @param config
380
+ * @param contextUser
381
+ */
382
+ async LoadSingleDatasetConfig(config, contextUser) {
383
+ const p = this.ProviderToUse;
384
+ const result = await p.GetAndCacheDatasetByName(config.DatasetName, config.DatasetItemFilters);
385
+ if (result.Success) {
386
+ if (config.AddToObject !== false) {
387
+ if (config.DatasetResultHandling === 'single_property') {
388
+ const singleObject = {};
389
+ for (const item of result.Results) {
390
+ //convert the results to entity objects before
391
+ //adding them to the singleObject
392
+ const entities = [];
393
+ for (const entityData of item.Results) {
394
+ const entity = await p.GetEntityObject(item.EntityName, contextUser);
395
+ entity.SetMany(entityData);
396
+ entities.push(entity);
397
+ }
398
+ singleObject[item.Code] = entities;
399
+ }
400
+ this[config.PropertyName] = singleObject;
401
+ }
402
+ else {
403
+ // explode out the items within the DS into individual properties
404
+ for (const item of result.Results) {
405
+ this[`${config.PropertyName}_${item.Code}`] = item.Results;
406
+ }
407
+ }
408
+ }
409
+ this._dataMap.set(config.PropertyName, { datasetName: config.DatasetName, data: result.Results });
410
+ if (config.Expiration) {
411
+ this.SetExpirationTimer(config.PropertyName, config.Expiration);
412
+ }
413
+ }
414
+ }
415
+ /**
416
+ * Sets an expiration timer for a metadata property.
417
+ * @param propertyName - The name of the property
418
+ * @param expiration - The expiration time in milliseconds
419
+ */
420
+ SetExpirationTimer(propertyName, expiration) {
421
+ if (this._expirationTimers.has(propertyName)) {
422
+ clearTimeout(this._expirationTimers.get(propertyName));
423
+ }
424
+ const timer = setTimeout(() => this.RefreshItem(propertyName), expiration);
425
+ this._expirationTimers.set(propertyName, timer);
426
+ }
427
+ /**
428
+ * Adds a dynamic metadata configuration at runtime.
429
+ * @param config - The metadata configuration to add
430
+ * @param contextUser - The context user information
431
+ */
432
+ async AddDynamicConfig(config, contextUser) {
433
+ const c = this.UpgradeObjectToConfig(config);
434
+ this._dynamicConfigs.set(c.PropertyName, c);
435
+ await this.LoadSingleConfig(c, contextUser || this._contextUser);
436
+ }
437
+ /**
438
+ * Removes a dynamic metadata configuration at runtime.
439
+ * @param propertyName - The name of the property to remove
440
+ */
441
+ RemoveDynamicConfig(propertyName) {
442
+ this._dynamicConfigs.delete(propertyName);
443
+ this._dataMap.delete(propertyName);
444
+ if (this._expirationTimers.has(propertyName)) {
445
+ clearTimeout(this._expirationTimers.get(propertyName));
446
+ this._expirationTimers.delete(propertyName);
447
+ }
448
+ }
449
+ /**
450
+ * Refreshes a specific item.
451
+ * @param propertyName - The name of the property to refresh
452
+ */
453
+ async RefreshItem(propertyName) {
454
+ const config = this._metadataConfigs.find((c) => c.PropertyName === propertyName) || this._dynamicConfigs.get(propertyName);
455
+ if (config) {
456
+ await this.LoadSingleConfig(config, this._contextUser);
457
+ }
458
+ }
459
+ /**
460
+ * Refreshes all items
461
+ */
462
+ async RefreshAllItems() {
463
+ await this.LoadConfigs([...this._metadataConfigs, ...Array.from(this._dynamicConfigs.values())], this._contextUser);
464
+ }
465
+ /**
466
+ * Subclasses can override this method to perform additional loading tasks
467
+ * @param contextUser
468
+ */
469
+ async AdditionalLoading(contextUser) {
470
+ // Subclasses can override this method to perform additional loading tasks
471
+ }
472
+ /**
473
+ * Returns true if the data has been loaded, false otherwise.
474
+ */
475
+ get Loaded() {
476
+ return this._loaded;
477
+ }
478
+ /**
479
+ * Returns the loading subject. You can call await Config() and after Config() comes back as true that means you're loaded. However you can also directly subscribe to this subject to get updates on the loading status.
480
+ */
481
+ get LoadingSubject() {
482
+ return this._loadingSubject;
483
+ }
484
+ /**
485
+ * Returns the context user set for the object, this is set via the Config() method.
486
+ */
487
+ get ContextUser() {
488
+ return this._contextUser;
489
+ }
490
+ /**
491
+ * Helper method for sub-classes to have a single line of code that will make sure the data is loaded before proceeding and will throw an error if not loaded.
492
+ */
493
+ TryThrowIfNotLoaded() {
494
+ if (!this.Loaded)
495
+ throw new Error('Data not loaded, call Config() first.');
496
+ }
497
+ }
498
+ exports.BaseEngine = BaseEngine;
499
+ /**********************************************************************
500
+ * This section is for handling caching of multiple instances when needed
501
+ * We use the primary singleton as the instance to store a cache of instances
502
+ * that are tied to specific providers. This is useful when we have multiple
503
+ * providers in a given app going to different connections.
504
+ *********************************************************************/
505
+ // private static _providerInstances: Map<{provider: IMetadataProvider, subclassConstructor: any}, any> = new Map();
506
+ // private static get ProviderInstances(): Map<{provider: IMetadataProvider, subclassConstructor: any}, any> {
507
+ // return BaseEngine._providerInstances;
508
+ // }
509
+ BaseEngine._providerInstances = [];
510
+ //# sourceMappingURL=baseEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseEngine.js","sourceRoot":"","sources":["../../src/generic/baseEngine.ts"],"names":[],"mappings":"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"}