@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.
- package/dist/Core.d.ts +29 -0
- package/dist/Core.d.ts.map +1 -0
- package/dist/Core.js +58 -0
- package/dist/Core.js.map +1 -0
- package/dist/generic/QueryCache.d.ts +85 -0
- package/dist/generic/QueryCache.d.ts.map +1 -0
- package/dist/generic/QueryCache.js +198 -0
- package/dist/generic/QueryCache.js.map +1 -0
- package/dist/generic/QueryCacheConfig.d.ts +72 -0
- package/dist/generic/QueryCacheConfig.d.ts.map +1 -0
- package/dist/generic/QueryCacheConfig.js +3 -0
- package/dist/generic/QueryCacheConfig.js.map +1 -0
- package/dist/generic/applicationInfo.d.ts +138 -0
- package/dist/generic/applicationInfo.d.ts.map +1 -0
- package/dist/generic/applicationInfo.js +177 -0
- package/dist/generic/applicationInfo.js.map +1 -0
- package/dist/generic/authEvaluator.d.ts +25 -0
- package/dist/generic/authEvaluator.d.ts.map +1 -0
- package/dist/generic/authEvaluator.js +49 -0
- package/dist/generic/authEvaluator.js.map +1 -0
- package/dist/generic/authTypes.d.ts +193 -0
- package/dist/generic/authTypes.d.ts.map +1 -0
- package/dist/generic/authTypes.js +19 -0
- package/dist/generic/authTypes.js.map +1 -0
- package/dist/generic/baseEngine.d.ts +260 -0
- package/dist/generic/baseEngine.d.ts.map +1 -0
- package/dist/generic/baseEngine.js +510 -0
- package/dist/generic/baseEngine.js.map +1 -0
- package/dist/generic/baseEntity.d.ts +691 -0
- package/dist/generic/baseEntity.d.ts.map +1 -0
- package/dist/generic/baseEntity.js +1688 -0
- package/dist/generic/baseEntity.js.map +1 -0
- package/dist/generic/baseInfo.d.ts +24 -0
- package/dist/generic/baseInfo.d.ts.map +1 -0
- package/dist/generic/baseInfo.js +53 -0
- package/dist/generic/baseInfo.js.map +1 -0
- package/dist/generic/compositeKey.d.ts +206 -0
- package/dist/generic/compositeKey.d.ts.map +1 -0
- package/dist/generic/compositeKey.js +412 -0
- package/dist/generic/compositeKey.js.map +1 -0
- package/dist/generic/databaseProviderBase.d.ts +46 -0
- package/dist/generic/databaseProviderBase.d.ts.map +1 -0
- package/dist/generic/databaseProviderBase.js +14 -0
- package/dist/generic/databaseProviderBase.js.map +1 -0
- package/dist/generic/entityInfo.d.ts +983 -0
- package/dist/generic/entityInfo.d.ts.map +1 -0
- package/dist/generic/entityInfo.js +1401 -0
- package/dist/generic/entityInfo.js.map +1 -0
- package/dist/generic/explorerNavigationItem.d.ts +20 -0
- package/dist/generic/explorerNavigationItem.d.ts.map +1 -0
- package/dist/generic/explorerNavigationItem.js +29 -0
- package/dist/generic/explorerNavigationItem.js.map +1 -0
- package/dist/generic/interfaces.d.ts +610 -0
- package/dist/generic/interfaces.d.ts.map +1 -0
- package/dist/generic/interfaces.js +211 -0
- package/dist/generic/interfaces.js.map +1 -0
- package/dist/generic/libraryInfo.d.ts +40 -0
- package/dist/generic/libraryInfo.d.ts.map +1 -0
- package/dist/generic/libraryInfo.js +56 -0
- package/dist/generic/libraryInfo.js.map +1 -0
- package/dist/generic/logging.d.ts +179 -0
- package/dist/generic/logging.d.ts.map +1 -0
- package/dist/generic/logging.js +382 -0
- package/dist/generic/logging.js.map +1 -0
- package/dist/generic/metadata.d.ts +305 -0
- package/dist/generic/metadata.d.ts.map +1 -0
- package/dist/generic/metadata.js +454 -0
- package/dist/generic/metadata.js.map +1 -0
- package/dist/generic/metadataUtil.d.ts +8 -0
- package/dist/generic/metadataUtil.d.ts.map +1 -0
- package/dist/generic/metadataUtil.js +36 -0
- package/dist/generic/metadataUtil.js.map +1 -0
- package/dist/generic/providerBase.d.ts +546 -0
- package/dist/generic/providerBase.d.ts.map +1 -0
- package/dist/generic/providerBase.js +999 -0
- package/dist/generic/providerBase.js.map +1 -0
- package/dist/generic/queryInfo.d.ts +460 -0
- package/dist/generic/queryInfo.d.ts.map +1 -0
- package/dist/generic/queryInfo.js +633 -0
- package/dist/generic/queryInfo.js.map +1 -0
- package/dist/generic/querySQLFilters.d.ts +54 -0
- package/dist/generic/querySQLFilters.d.ts.map +1 -0
- package/dist/generic/querySQLFilters.js +84 -0
- package/dist/generic/querySQLFilters.js.map +1 -0
- package/dist/generic/runQuery.d.ts +96 -0
- package/dist/generic/runQuery.d.ts.map +1 -0
- package/dist/generic/runQuery.js +66 -0
- package/dist/generic/runQuery.js.map +1 -0
- package/dist/generic/runQuerySQLFilterImplementations.d.ts +51 -0
- package/dist/generic/runQuerySQLFilterImplementations.d.ts.map +1 -0
- package/dist/generic/runQuerySQLFilterImplementations.js +238 -0
- package/dist/generic/runQuerySQLFilterImplementations.js.map +1 -0
- package/dist/generic/runReport.d.ts +25 -0
- package/dist/generic/runReport.d.ts.map +1 -0
- package/dist/generic/runReport.js +42 -0
- package/dist/generic/runReport.js.map +1 -0
- package/dist/generic/securityInfo.d.ts +355 -0
- package/dist/generic/securityInfo.d.ts.map +1 -0
- package/dist/generic/securityInfo.js +425 -0
- package/dist/generic/securityInfo.js.map +1 -0
- package/dist/generic/transactionGroup.d.ts +184 -0
- package/dist/generic/transactionGroup.d.ts.map +1 -0
- package/dist/generic/transactionGroup.js +357 -0
- package/dist/generic/transactionGroup.js.map +1 -0
- package/dist/generic/util.d.ts +81 -0
- package/dist/generic/util.d.ts.map +1 -0
- package/dist/generic/util.js +301 -0
- package/dist/generic/util.js.map +1 -0
- package/dist/views/runView.d.ts +150 -0
- package/dist/views/runView.d.ts.map +1 -0
- package/dist/views/runView.js +100 -0
- package/dist/views/runView.js.map +1 -0
- package/dist/views/viewInfo.d.ts +121 -0
- package/dist/views/viewInfo.d.ts.map +1 -0
- package/dist/views/viewInfo.js +182 -0
- package/dist/views/viewInfo.js.map +1 -0
- 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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"}
|