@memberjunction/external-change-detection 5.4.1 → 5.6.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.
@@ -1,5 +1,5 @@
1
- import { BaseEngine, BaseEntity, CompositeKey, EntityField, EntityInfo, IMetadataProvider, Metadata, UserInfo } from "@memberjunction/core";
2
- import { MJRecordChangeEntity, MJRecordChangeReplayRunEntity } from "@memberjunction/core-entities";
1
+ import { BaseEngine, BaseEntity, CompositeKey, EntityFieldTSType, EntityInfo, IMetadataProvider, Metadata, UserInfo } from "@memberjunction/core";
2
+ import { MJRecordChangeReplayRunEntity } from "@memberjunction/core-entities";
3
3
  /**
4
4
  * Represents a change to a single field in a record
5
5
  */
@@ -39,6 +39,7 @@ export declare class ChangeDetectionResult {
39
39
  * This is a server only package
40
40
  */
41
41
  export declare class ExternalChangeDetectorEngine extends BaseEngine<ExternalChangeDetectorEngine> {
42
+ private _dialect;
42
43
  Config(forceRefresh?: boolean, contextUser?: UserInfo, provider?: IMetadataProvider): Promise<void>;
43
44
  static get Instance(): ExternalChangeDetectorEngine;
44
45
  private _IneligibleEntities;
@@ -77,62 +78,37 @@ export declare class ExternalChangeDetectorEngine extends BaseEngine<ExternalCha
77
78
  changes: FieldChange[];
78
79
  latestRecord: BaseEntity;
79
80
  }>;
80
- protected DoValuesDiffer(field: EntityField, value1: any, value2: any): {
81
+ protected DoValuesDiffer(tsType: EntityFieldTSType, value1: any, value2: any): {
81
82
  differ: boolean;
82
83
  castValue1: any;
83
84
  castValue2: any;
84
85
  };
85
- protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<any>;
86
- protected GetLatestDatabaseRecord(md: Metadata, change: ChangeDetectionItem): Promise<BaseEntity>;
87
86
  /**
88
- * Get all of the latest database records together in grouped queries for each entity that has records we need instead
89
- * of one at a time like GetLatestDatabaseRecord does. This method will return true/false and will place the LatestRecord
90
- * into each item in the changes array for you.
91
- * @param md
92
- * @param changes
93
- * @returns
87
+ * Casts a value to a boolean, properly handling string representations like 'false' and '0'
88
+ * which are truthy in JavaScript but should be treated as false.
94
89
  */
90
+ protected CastToBoolean(value: unknown): boolean;
91
+ protected GetLatestRecordChangesDataForEntityRecord(change: ChangeDetectionItem): Promise<any>;
95
92
  protected GetLatestDatabaseRecords(md: Metadata, changes: ChangeDetectionItem[]): Promise<boolean>;
93
+ protected GetLatestDatabaseRecord(md: Metadata, change: ChangeDetectionItem): Promise<BaseEntity>;
96
94
  protected getPrimaryKeyString(entity: EntityInfo, tablePrefix: string): string;
97
- protected generateDetectUpdatesQuery(entity: EntityInfo): string;
98
- protected generateDetectCreationsQuery(entity: EntityInfo): string;
99
- protected generateDetectDeletionsQuery(entity: EntityInfo): string;
100
95
  /**
101
96
  * Detects changes across all of the entities specified
97
+ * @param entities Array of entities to process
98
+ * @param entityBatchSize Optional, defines how many entities to process in parallel. Defaults to 10.
102
99
  * @returns
103
100
  */
104
- DetectChangesForEntities(entities: EntityInfo[]): Promise<ChangeDetectionResult>;
105
- /**
106
- * This method will detect changes for all eligible entities as defined by the EligibleEntities property
107
- */
108
- DetectChangesForAllEligibleEntities(): Promise<ChangeDetectionResult>;
101
+ DetectChangesForEntities(entities: EntityInfo[], entityBatchSize?: number): Promise<ChangeDetectionResult>;
102
+ DetectChangesForAllEligibleEntities(entityBatchSize?: number): Promise<ChangeDetectionResult>;
109
103
  /**
110
104
  * This method will replay all of the items in the changes array
111
105
  * @param changes Array of changes to replay.
112
106
  * @param batchSize Optional, defines the # of concurrent changes to replay at once. If you want to replay changes serially, set this to 1
107
+ * @param staleTimeoutHours Optional, defines how many hours a run can be in progress before it is considered stale. Defaults to 24.
113
108
  * @returns {Promise<boolean>} - Returns true if all changes are successfully replayed, otherwise false.
114
109
  */
115
- ReplayChanges(changes: ChangeDetectionItem[], batchSize?: number): Promise<boolean>;
116
- /**
117
- * Method creates a new Record Change Replay Run and returns the object for the run
118
- */
119
- protected StartRun(): Promise<MJRecordChangeReplayRunEntity>;
120
- /**
121
- * Replays a single change item within a given run. This method will:
122
- * 1) Create a new Record Change record for the replay item
123
- * 2) Load a BaseEntity derived class for the entity in question and call either Save() or Delete() and pass in the Replay Only option
124
- * 3) Record the result in the Record Change record, updating status and if appropriate, the error message
125
- * @param change
126
- */
127
- protected ReplaySingleChange(md: Metadata, run: MJRecordChangeReplayRunEntity, change: ChangeDetectionItem): Promise<boolean>;
128
- /**
129
- * This method will attempt to update the RecordChange record and return true if succesful, false otherwise.
130
- */
131
- protected FinishRecordChangeRecord(rc: MJRecordChangeEntity, code: 'error' | 'success', errorMessage: string): Promise<boolean>;
132
- /**
133
- * Creates a new record change record for the start of the replay process.
134
- * @param change
135
- */
136
- protected CreateRecordChangeRecord(md: Metadata, run: MJRecordChangeReplayRunEntity, change: ChangeDetectionItem): Promise<MJRecordChangeEntity>;
110
+ ReplayChanges(changes: ChangeDetectionItem[], batchSize?: number, staleTimeoutHours?: number): Promise<boolean>;
111
+ protected ReplayChange(md: Metadata, change: ChangeDetectionItem): Promise<boolean>;
112
+ protected StartRun(staleTimeoutHours?: number): Promise<MJRecordChangeReplayRunEntity>;
137
113
  }
138
114
  //# sourceMappingURL=ChangeDetector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChangeDetector.d.ts","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
- import { BaseEngine, CompositeKey, ConsoleColor, EntityFieldTSType, EntityInfo, LogError, LogStatus, Metadata, RunView, UpdateCurrentConsoleLine, UpdateCurrentConsoleProgress } from "@memberjunction/core";
1
+ import { BaseEngine, CompositeKey, ConsoleColor, EntityFieldTSType, EntityInfo, LogError, LogStatus, Metadata, RunQuery, RunView, UpdateCurrentConsoleLine, UpdateCurrentConsoleProgress } from "@memberjunction/core";
2
+ import { UUIDsEqual } from "@memberjunction/global";
3
+ import { PostgreSQLDialect, SQLServerDialect } from "@memberjunction/sql-dialect";
2
4
  /**
3
5
  * Represents a change to a single field in a record
4
6
  */
@@ -30,6 +32,9 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
30
32
  }
31
33
  async Config(forceRefresh, contextUser, provider) {
32
34
  const p = (provider || Metadata.Provider);
35
+ // Initialize dialect
36
+ const platform = p.DatabasePlatform || 'sqlserver';
37
+ this._dialect = platform === 'postgresql' ? new PostgreSQLDialect() : new SQLServerDialect();
33
38
  const c = [
34
39
  {
35
40
  EntityName: "MJ: Entities",
@@ -79,21 +84,32 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
79
84
  if (!entity) {
80
85
  throw new Error("entity parameter is required");
81
86
  }
82
- else if (!this.EligibleEntities.find(e => e.ID === entity.ID)) {
87
+ else if (!this.EligibleEntities.find(e => UUIDsEqual(e.ID, entity.ID))) {
83
88
  throw new Error(`Entity ${entity.Name} is not eligible for external change detection. Refer to the documentation on the EligibleEntities and IneligibleEntities properties for more information.`);
84
89
  }
85
90
  const md = new Metadata();
86
- const sqlCreates = this.generateDetectCreationsQuery(entity);
87
- const sqlUpdates = this.generateDetectUpdatesQuery(entity);
88
- const sqlDeletes = this.generateDetectDeletionsQuery(entity);
89
- const provider = Metadata.Provider;
90
- const createResult = await provider.ExecuteSQL(sqlCreates);
91
- const updateResult = await provider.ExecuteSQL(sqlUpdates);
92
- const deleteResult = await provider.ExecuteSQL(sqlDeletes);
91
+ const rq = new RunQuery();
92
+ const commonParams = {
93
+ EntityID: entity.ID,
94
+ SchemaName: entity.SchemaName,
95
+ BaseView: entity.BaseView,
96
+ ColumnList: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)}`).join(', '),
97
+ PrimaryKeyJoin: this.getPrimaryKeyString(entity, 'ot'),
98
+ CreatedAtField: EntityInfo.CreatedAtFieldName,
99
+ UpdatedAtField: EntityInfo.UpdatedAtFieldName
100
+ };
101
+ const [createResult, updateResult, deleteResult] = await rq.RunQueries([
102
+ { QueryName: 'ExternalChangeDetection_DetectCreations', Parameters: commonParams },
103
+ { QueryName: 'ExternalChangeDetection_DetectUpdates', Parameters: commonParams },
104
+ { QueryName: 'ExternalChangeDetection_DetectDeletions', Parameters: {
105
+ ...commonParams,
106
+ PrimaryKeyIsNull: entity.PrimaryKeys.map(pk => `ot.${this._dialect.QuoteIdentifier(pk.Name)} IS NULL`).join(' AND ')
107
+ } }
108
+ ], this.ContextUser);
93
109
  // we have the results for all of the queries, now we need to convert them into ChangeDetectionItems
94
110
  const changes = [];
95
- if (createResult && createResult.length > 0) {
96
- for (const row of createResult) {
111
+ if (createResult && createResult.Success && createResult.Results.length > 0) {
112
+ for (const row of createResult.Results) {
97
113
  const item = new ChangeDetectionItem();
98
114
  item.Entity = entity;
99
115
  item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => {
@@ -108,8 +124,8 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
108
124
  changes.push(item);
109
125
  }
110
126
  }
111
- if (updateResult && updateResult.length > 0) {
112
- for (const row of updateResult) {
127
+ if (updateResult && updateResult.Success && updateResult.Results.length > 0) {
128
+ for (const row of updateResult.Results) {
113
129
  const item = new ChangeDetectionItem();
114
130
  item.Entity = entity;
115
131
  item.PrimaryKey = new CompositeKey(entity.PrimaryKeys.map(pk => {
@@ -127,8 +143,8 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
127
143
  }
128
144
  }
129
145
  }
130
- if (deleteResult && deleteResult.length > 0) {
131
- deleteResult.forEach(row => {
146
+ if (deleteResult && deleteResult.Success && deleteResult.Results.length > 0) {
147
+ deleteResult.Results.forEach(row => {
132
148
  const item = new ChangeDetectionItem();
133
149
  item.Entity = entity;
134
150
  const ck = new CompositeKey();
@@ -192,7 +208,7 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
192
208
  const changes = [];
193
209
  for (const field of record.Fields) {
194
210
  if (!field.IsPrimaryKey) {
195
- const differResult = this.DoValuesDiffer(field, field.Value, json[field.Name]);
211
+ const differResult = this.DoValuesDiffer(field.FieldType, field.Value, json[field.Name]);
196
212
  if (differResult.differ) {
197
213
  changes.push({
198
214
  FieldName: field.Name,
@@ -209,105 +225,102 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
209
225
  return { changes: [], latestRecord: record };
210
226
  }
211
227
  }
212
- else
213
- throw new Error(`Failed to load record: ${change.Entity.Name}: ${change.PrimaryKey}`);
228
+ else {
229
+ // record not found in database, this could happen if it was deleted between detection and replay
230
+ return { changes: [], latestRecord: null };
231
+ }
214
232
  }
215
233
  catch (e) {
216
234
  LogError(e);
217
235
  return { changes: [], latestRecord: null };
218
236
  }
219
237
  }
220
- DoValuesDiffer(field, value1, value2) {
221
- // type specific comparisons
222
- // for each scenario, make sure both value1 and value 2 are of the type we care about, if they're not, create new variables
223
- // of those types and then do type specific comparisons for equality
224
- switch (field.EntityFieldInfo.TSType) {
225
- case EntityFieldTSType.Boolean:
226
- // check to see if value1 and value2 are both boolean, if not, convert them to boolean
227
- const v1 = typeof value1 === 'boolean' ? value1 : value1 === 'true' ? true : false;
228
- const v2 = typeof value2 === 'boolean' ? value2 : value2 === 'true' ? true : false;
229
- return { differ: v1 !== v2, castValue1: v1, castValue2: v2 };
238
+ DoValuesDiffer(tsType, value1, value2) {
239
+ let castValue1 = value1;
240
+ let castValue2 = value2;
241
+ switch (tsType) {
230
242
  case EntityFieldTSType.Date:
231
- // check to see if value1 and value2 are both dates, if not, convert them to dates
232
- const d1 = value1 instanceof Date ? value1 : new Date(value1);
233
- const d2 = value2 instanceof Date ? value2 : new Date(value2);
234
- return { differ: d1.getTime() !== d2.getTime(), castValue1: d1, castValue2: d2 };
243
+ castValue1 = value1 ? new Date(value1) : null;
244
+ castValue2 = value2 ? new Date(value2) : null;
245
+ if (castValue1 && castValue2) {
246
+ // check both to see if they're the same - up to 3 digits of precision
247
+ // because when we get the values back into JavaScript objects, Date objects only have 3 digits of precision
248
+ const d1 = castValue1.getTime();
249
+ const d2 = castValue2.getTime();
250
+ return { differ: d1 !== d2, castValue1, castValue2 };
251
+ }
252
+ else
253
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
235
254
  case EntityFieldTSType.Number:
236
- // check to see if value1 and value2 are both numbers, if not, convert them to numbers
237
- const n1 = value1 ? typeof value1 === 'number' ? value1 : parseFloat(value1) : value1;
238
- const n2 = value2 ? typeof value2 === 'number' ? value2 : parseFloat(value2) : value2;
239
- return { differ: n1 !== n2, castValue1: n1, castValue2: n2 };
240
- case EntityFieldTSType.String:
241
- // check to see if value1 and value2 are both strings, if not, convert them to strings
242
- const s1 = typeof value1 === 'string' || !value1 ? value1 : value1.toString();
243
- const s2 = typeof value2 === 'string' || !value2 ? value2 : value2.toString();
244
- return { differ: s1 !== s2, castValue1: s1, castValue2: s2 };
255
+ castValue1 = value1 ? parseFloat(value1) : 0;
256
+ castValue2 = value2 ? parseFloat(value2) : 0;
257
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
258
+ case EntityFieldTSType.Boolean:
259
+ castValue1 = this.CastToBoolean(value1);
260
+ castValue2 = this.CastToBoolean(value2);
261
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
245
262
  default:
246
- // don't know the type, shouldn't get here, just do a basic TypeScript equality check
247
- // with a single != instead of !== because we don't want to check type just value
248
- return { differ: value1 != value2, castValue1: value1, castValue2: value2 };
263
+ castValue1 = value1 ? value1.toString().trim() : '';
264
+ castValue2 = value2 ? value2.toString().trim() : '';
265
+ return { differ: castValue1 !== castValue2, castValue1, castValue2 };
249
266
  }
250
267
  }
268
+ /**
269
+ * Casts a value to a boolean, properly handling string representations like 'false' and '0'
270
+ * which are truthy in JavaScript but should be treated as false.
271
+ */
272
+ CastToBoolean(value) {
273
+ if (typeof value === 'string') {
274
+ const lower = value.toLowerCase().trim();
275
+ return lower === 'true' || lower === '1';
276
+ }
277
+ return !!value;
278
+ }
251
279
  async GetLatestRecordChangesDataForEntityRecord(change) {
252
- const Provider = this.ProviderToUse;
253
- const sql = `SELECT
254
- TOP 1 FullRecordJSON
255
- FROM
256
- ${Provider.MJCoreSchemaName}.vwRecordChanges
257
- WHERE
258
- RecordID = '${change.PrimaryKey.ToConcatenatedString()}'
259
- AND EntityID = '${change.Entity.ID}'
260
- AND Status <> 'Pending'
261
- ORDER BY
262
- ChangedAt DESC`;
263
- const result = await Provider.ExecuteSQL(sql);
264
- if (result && result.length > 0)
265
- return result[0];
266
- else
280
+ try {
281
+ const rv = new RunView();
282
+ const result = await rv.RunView({
283
+ EntityName: "MJ: Record Changes",
284
+ ExtraFilter: `EntityID = '${change.Entity.ID}' AND RecordID = '${change.PrimaryKey.ToConcatenatedString()}' AND Type IN ('Update', 'Create')`,
285
+ OrderBy: "ChangedAt DESC"
286
+ }, this.ContextUser);
287
+ if (result && result.Success && result.Results.length > 0) {
288
+ return result.Results[0];
289
+ }
290
+ else
291
+ return null;
292
+ }
293
+ catch (e) {
294
+ LogError(e);
267
295
  return null;
268
- }
269
- async GetLatestDatabaseRecord(md, change) {
270
- const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
271
- if (await record.InnerLoad(change.PrimaryKey)) {
272
- return record;
273
296
  }
274
- else
275
- throw new Error(`Failed to load record: ${change.Entity.Name}: ${change.PrimaryKey}`);
276
297
  }
277
- /**
278
- * Get all of the latest database records together in grouped queries for each entity that has records we need instead
279
- * of one at a time like GetLatestDatabaseRecord does. This method will return true/false and will place the LatestRecord
280
- * into each item in the changes array for you.
281
- * @param md
282
- * @param changes
283
- * @returns
284
- */
285
298
  async GetLatestDatabaseRecords(md, changes) {
286
299
  try {
287
- // Step 1 - group by entity and get a complete list of entities from the changes
300
+ const provider = Metadata.Provider;
301
+ // distinct list of entities
288
302
  const entities = [];
289
- const provider = this.ProviderToUse;
290
303
  for (const c of changes) {
291
- let e = entities.find(e => e.entity.ID === c.Entity.ID);
292
- if (!e) {
293
- e = {
294
- entity: c.Entity,
295
- keys: [c.PrimaryKey]
296
- };
297
- entities.push(e);
298
- }
299
- else {
300
- e.keys.push(c.PrimaryKey);
304
+ if (c.Type === 'Update' || c.Type === 'Create') {
305
+ let entry = entities.find(e => UUIDsEqual(e.entity.ID, c.Entity.ID));
306
+ if (!entry) {
307
+ entry = { entity: c.Entity, keys: [] };
308
+ entities.push(entry);
309
+ }
310
+ entry.keys.push(c.PrimaryKey);
301
311
  }
302
312
  }
303
313
  // now we have a distinct list of entities and all of the pkeys for each one, so we can run a single
304
314
  // select statement for each entity
305
315
  for (const e of entities) {
306
- const sql = `SELECT * FROM [${e.entity.SchemaName}].[${e.entity.BaseView}]
316
+ const quotedTable = this._dialect.QuoteSchema(e.entity.SchemaName, e.entity.BaseView);
317
+ const sql = `SELECT * FROM ${quotedTable}
307
318
  WHERE ${e.keys.map(k => `(${k.KeyValuePairs.map(kvp => {
308
319
  const f = e.entity.Fields.find(f => kvp.FieldName.trim().toLowerCase() === f.Name);
309
320
  const quotes = f?.NeedsQuotes ? "'" : "";
310
- return `[${kvp.FieldName}]=${quotes}${kvp.Value}${quotes}`;
321
+ const quotedField = this._dialect.QuoteIdentifier(kvp.FieldName);
322
+ const escapedValue = typeof kvp.Value === 'string' ? kvp.Value.replace(/'/g, "''") : kvp.Value;
323
+ return `${quotedField}=${quotes}${escapedValue}${quotes}`;
311
324
  }).join(' AND ')})`).join(' OR ')} `;
312
325
  const result = await provider.ExecuteSQL(sql);
313
326
  if (result) {
@@ -337,77 +350,34 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
337
350
  return false;
338
351
  }
339
352
  }
340
- getPrimaryKeyString(entity, tablePrefix) {
341
- return entity.PrimaryKeys.map(pk => `'${pk.Name}${CompositeKey.DefaultValueDelimiter}' + CAST(${tablePrefix}.[${pk.Name}] AS NVARCHAR(MAX))`).join(` + '${CompositeKey.DefaultFieldDelimiter}' + `);
342
- }
343
- generateDetectUpdatesQuery(entity) {
344
- const primaryKeyString = this.getPrimaryKeyString(entity, 'ot');
345
- return `
346
- SELECT
347
- ${entity.PrimaryKeys.map(pk => `ot.[${pk.Name}]`).join(', ')}, ot.${EntityInfo.UpdatedAtFieldName} AS UpdatedAt, rc.last_change_time LatestRecordChangeAt
348
- FROM
349
- [${entity.SchemaName}].[${entity.BaseView}] ot
350
- INNER JOIN (
351
- SELECT
352
- RecordID, MAX(ChangedAt) AS last_change_time
353
- FROM
354
- __mj.vwRecordChanges
355
- WHERE
356
- Type IN ('Update', 'Create') AND EntityID = '${entity.ID}'
357
- GROUP BY
358
- RecordID
359
- ) rc ON ${primaryKeyString} = rc.RecordID
360
- WHERE
361
- FORMAT(ot.${EntityInfo.UpdatedAtFieldName}, 'yyyy-MM-dd HH:mm:ss.fff') > COALESCE(FORMAT(rc.last_change_time, 'yyyy-MM-dd HH:mm:ss.fff'), '1900-01-01 00:00:00.000');`;
362
- // use up to 3 digits of precision because when we get the values back into JavaScript objects, Date objects only have 3 digits of precision
363
- }
364
- generateDetectCreationsQuery(entity) {
365
- const primaryKeyString = this.getPrimaryKeyString(entity, 'ot');
366
- return `
367
- SELECT
368
- ${entity.PrimaryKeys.map(pk => `ot.[${pk.Name}]`).join(', ')}, ot.${EntityInfo.CreatedAtFieldName} AS CreatedAt, ot.${EntityInfo.UpdatedAtFieldName} AS UpdatedAt
369
- FROM
370
- [${entity.SchemaName}].[${entity.BaseView}] ot
371
- LEFT JOIN
372
- __mj.vwRecordChanges rc
373
- ON
374
- (${primaryKeyString} = rc.RecordID) AND
375
- rc.Type = 'Create' AND
376
- rc.EntityID = '${entity.ID}'
377
- WHERE
378
- rc.RecordID IS NULL;
379
- `;
353
+ async GetLatestDatabaseRecord(md, change) {
354
+ try {
355
+ const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
356
+ if (await record.InnerLoad(change.PrimaryKey)) {
357
+ return record;
358
+ }
359
+ else
360
+ return null;
361
+ }
362
+ catch (e) {
363
+ LogError(e);
364
+ return null;
365
+ }
380
366
  }
381
- generateDetectDeletionsQuery(entity) {
382
- const primaryKeyString = this.getPrimaryKeyString(entity, 'ot');
383
- return `
384
- SELECT
385
- rc.RecordID, MAX(rc.ChangedAt) ChangedAt
386
- FROM
387
- __mj.vwRecordChanges rc
388
- LEFT JOIN
389
- [${entity.SchemaName}].[${entity.BaseView}] ot
390
- ON
391
- rc.RecordID = ${primaryKeyString}
392
- WHERE
393
- ${entity.PrimaryKeys.map(pk => `ot.[${pk.Name}] IS NULL`).join(' AND ')}
394
- AND
395
- rc.EntityID = '${entity.ID}'
396
- AND
397
- NOT EXISTS
398
- (
399
- SELECT rc2.ID FROM __mj.vwRecordChanges rc2 WHERE
400
- rc2.RecordID = rc.RecordID AND rc2.EntityID=rc.EntityID AND rc2.Type='Delete'
401
- )
402
- GROUP BY
403
- rc.RecordID
404
- `; // last part of above query makes sure we don't include records already deleted in Record Changes
367
+ getPrimaryKeyString(entity, tablePrefix) {
368
+ const concatOp = this._dialect.ConcatOperator();
369
+ const castToText = (expr) => this._dialect.CastToText(expr);
370
+ const quote = (id) => this._dialect.QuoteIdentifier(id);
371
+ const table = quote(tablePrefix);
372
+ return entity.PrimaryKeys.map(pk => `'${pk.Name}${CompositeKey.DefaultValueDelimiter}' ${concatOp} ${castToText(`${table}.${quote(pk.Name)}`)}`).join(` ${concatOp} '${CompositeKey.DefaultFieldDelimiter}' ${concatOp} `);
405
373
  }
406
374
  /**
407
375
  * Detects changes across all of the entities specified
376
+ * @param entities Array of entities to process
377
+ * @param entityBatchSize Optional, defines how many entities to process in parallel. Defaults to 10.
408
378
  * @returns
409
379
  */
410
- async DetectChangesForEntities(entities) {
380
+ async DetectChangesForEntities(entities, entityBatchSize = 10) {
411
381
  try {
412
382
  if (!entities)
413
383
  throw new Error("entities parameter is required");
@@ -416,23 +386,28 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
416
386
  const result = new ChangeDetectionResult();
417
387
  result.Success = true;
418
388
  result.Changes = [];
419
- const promises = [];
420
- // fire them all off in parallel
421
- LogStatus(`Detecting changes for ${entities.length} entities`);
422
- let numFinished = 0;
423
- entities.forEach((e) => {
424
- UpdateCurrentConsoleLine(` Starting change detection changes for ${e.Name}`, ConsoleColor.gray);
425
- const p = this.DetectChangesForEntity(e); // no await
426
- promises.push(p);
427
- p.then(entityResult => {
428
- UpdateCurrentConsoleProgress(` Finished change detection changes for ${e.Name}`, ++numFinished, entities.length, entityResult.Success ? ConsoleColor.cyan : ConsoleColor.crimson);
429
- result.Changes = result.Changes.concat(entityResult.Changes);
430
- result.Success = result.Success && entityResult.Success;
389
+ LogStatus(`Detecting changes for ${entities.length} entities in batches of ${entityBatchSize}`);
390
+ // process entities in batches
391
+ for (let i = 0; i < entities.length; i += entityBatchSize) {
392
+ const batch = entities.slice(i, i + entityBatchSize);
393
+ const batchPromises = batch.map(e => {
394
+ UpdateCurrentConsoleLine(` Starting change detection changes for ${e.Name}`, ConsoleColor.gray);
395
+ return this.DetectChangesForEntity(e);
431
396
  });
432
- });
433
- // now wait for all of the promises to finish
434
- await Promise.all(promises);
435
- UpdateCurrentConsoleProgress(` Finished detecting changes for ${entities.length} entities`, entities.length, entities.length, result.Success ? ConsoleColor.green : ConsoleColor.red);
397
+ const batchResults = await Promise.all(batchPromises);
398
+ for (let j = 0; j < batch.length; j++) {
399
+ const r = batchResults[j];
400
+ const e = batch[j];
401
+ if (r.Success) {
402
+ result.Changes.push(...r.Changes);
403
+ }
404
+ else {
405
+ result.Success = false;
406
+ result.ErrorMessage = (result.ErrorMessage ? result.ErrorMessage + "\n" : "") + `Error detecting changes for ${e.Name}: ` + r.ErrorMessage;
407
+ }
408
+ UpdateCurrentConsoleProgress(` Finished change detection changes for ${e.Name}`, i + j + 1, entities.length, r.Success ? ConsoleColor.cyan : ConsoleColor.crimson);
409
+ }
410
+ }
436
411
  return result;
437
412
  }
438
413
  catch (e) {
@@ -444,237 +419,141 @@ export class ExternalChangeDetectorEngine extends BaseEngine {
444
419
  };
445
420
  }
446
421
  }
447
- /**
448
- * This method will detect changes for all eligible entities as defined by the EligibleEntities property
449
- */
450
- async DetectChangesForAllEligibleEntities() {
451
- return await this.DetectChangesForEntities(this.EligibleEntities);
422
+ async DetectChangesForAllEligibleEntities(entityBatchSize = 10) {
423
+ return await this.DetectChangesForEntities(this.EligibleEntities, entityBatchSize);
452
424
  }
453
425
  /**
454
426
  * This method will replay all of the items in the changes array
455
427
  * @param changes Array of changes to replay.
456
428
  * @param batchSize Optional, defines the # of concurrent changes to replay at once. If you want to replay changes serially, set this to 1
429
+ * @param staleTimeoutHours Optional, defines how many hours a run can be in progress before it is considered stale. Defaults to 24.
457
430
  * @returns {Promise<boolean>} - Returns true if all changes are successfully replayed, otherwise false.
458
431
  */
459
- async ReplayChanges(changes, batchSize = 20) {
432
+ async ReplayChanges(changes, batchSize = 20, staleTimeoutHours = 24) {
460
433
  let run; // delcare outside of try block so we have access to it in the catch block
461
434
  try {
462
435
  if (changes && changes.length > 0) {
463
436
  const md = new Metadata();
464
437
  const results = [];
465
- run = await this.StartRun();
438
+ run = await this.StartRun(staleTimeoutHours);
466
439
  LogStatus(`Replaying ${changes.length} changes`);
467
440
  let numProcessed = 0;
468
441
  for (let i = 0; i < changes.length; i += batchSize) {
469
442
  const batch = changes.slice(i, i + batchSize);
470
- // Process the current batch
471
- const batchPromises = batch.map(async (change) => {
472
- UpdateCurrentConsoleProgress(` Replaying ${change.Entity.Name} ${change.Type} ${change.PrimaryKey.ToConcatenatedString()}`, ++numProcessed, changes.length, ConsoleColor.gray);
473
- const result = await this.ReplaySingleChange(md, run, change);
474
- return { Success: result, change: change };
443
+ const batchPromises = batch.map(async (c) => {
444
+ const result = await this.ReplayChange(md, c);
445
+ numProcessed++;
446
+ UpdateCurrentConsoleProgress(` Replayed ${numProcessed} of ${changes.length} changes`, numProcessed, changes.length);
447
+ return result;
475
448
  });
476
- // Wait for all promises in the current batch to complete
477
449
  const batchResults = await Promise.all(batchPromises);
478
450
  results.push(...batchResults);
479
451
  }
480
- // for (const change of changes) {
481
- // UpdateCurrentConsoleProgress(` Replaying ${change.Entity.Name} ${change.Type} ${change.PrimaryKey.ToConcatenatedString()}`, changes.indexOf(change), changes.length, ConsoleColor.gray);
482
- // const result = await this.ReplaySingleChange(md, run, change);
483
- // results.push({Success: result, change: change});
484
- // }
452
+ // finalize the run record
453
+ run.Status = 'Complete';
485
454
  run.EndedAt = new Date();
486
- run.Status = results.every(r => r.Success) ? 'Complete' : 'Error';
487
- if (await run.Save()) {
488
- return results.every(r => r.Success);
489
- }
490
- else {
491
- throw new Error("Failed to save run");
492
- }
455
+ await run.Save();
456
+ return results.every(r => r === true);
457
+ }
458
+ else {
459
+ return true; // no changes to replay
493
460
  }
494
- else
495
- return true; // no changes to process
496
461
  }
497
462
  catch (e) {
498
463
  LogError(e);
499
464
  if (run) {
500
- // attempt to mark the run as error
501
- try {
502
- run.Status = 'Error';
503
- run.EndedAt = new Date();
504
- await run.Save(); // dont' care about return value here, we've already tried to save it and the return value will be false anyway and message is the original root cause of the first exception
505
- }
506
- catch (innerError) {
507
- LogError('Attempted to mark run as error failed, make sure you update the database for future runs to be allowed.');
508
- LogError(innerError);
509
- return false; // couldn't get it done
510
- }
465
+ run.Status = 'Error';
466
+ run.EndedAt = new Date();
467
+ await run.Save();
511
468
  }
512
469
  return false;
513
470
  }
514
471
  }
515
- /**
516
- * Method creates a new Record Change Replay Run and returns the object for the run
517
- */
518
- async StartRun() {
519
- // first make sure an existing run isn't in progress
520
- const rv = new RunView();
521
- const existingRun = await rv.RunView({
522
- EntityName: "MJ: Record Change Replay Runs",
523
- ExtraFilter: "Status NOT IN('Complete', 'Error')"
524
- }, this.ContextUser);
525
- if (existingRun && existingRun.Success) {
526
- if (existingRun.Results.length > 0)
527
- throw new Error(`Existing Record Change Replay Run ${existingRun.Results[0].ID} is not complete or marked as error, cannot start a new run.`);
528
- else {
529
- const md = new Metadata();
530
- const run = await md.GetEntityObject("MJ: Record Change Replay Runs", this.ContextUser);
531
- run.StartedAt = new Date();
532
- run.UserID = this.ContextUser.ID;
533
- run.Status = 'In Progress';
534
- if (await run.Save()) {
535
- return run;
536
- }
537
- else
538
- throw new Error("Failed to start run");
539
- }
540
- }
541
- else {
542
- // failed to run the view
543
- throw new Error("Failed to check for existing run: " + existingRun.ErrorMessage);
544
- }
545
- }
546
- /**
547
- * Replays a single change item within a given run. This method will:
548
- * 1) Create a new Record Change record for the replay item
549
- * 2) Load a BaseEntity derived class for the entity in question and call either Save() or Delete() and pass in the Replay Only option
550
- * 3) Record the result in the Record Change record, updating status and if appropriate, the error message
551
- * @param change
552
- */
553
- async ReplaySingleChange(md, run, change) {
472
+ async ReplayChange(md, change) {
554
473
  try {
555
- const rc = await this.CreateRecordChangeRecord(md, run, change);
556
- if (rc) {
557
- // step 2 - get the base entity for the change
558
- let entityObject = change.LatestRecord; // for updates and creates we already have this
559
- if (!entityObject) {
560
- // for deletes we don't have this yet - it is not the normal load from DB since it wont be in the database at all
561
- entityObject = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
562
- const latestRCData = await this.GetLatestRecordChangesDataForEntityRecord(change);
563
- if (latestRCData && latestRCData.FullRecordJSON?.length > 0) {
564
- const obj = JSON.parse(latestRCData.FullRecordJSON);
565
- await entityObject.LoadFromData(obj); // loaded up from the latest data in the Record Change table
474
+ switch (change.Type) {
475
+ case 'Create':
476
+ case 'Update':
477
+ // for creates and updates we have the latest record already loaded
478
+ // and we have the list of changes, so we just need to save the record
479
+ if (change.LatestRecord) {
480
+ return await change.LatestRecord.Save();
481
+ }
482
+ else
483
+ return false;
484
+ case 'Delete':
485
+ // for deletes we need to load the record and then delete it
486
+ const record = await md.GetEntityObject(change.Entity.Name, this.ContextUser);
487
+ if (await record.InnerLoad(change.PrimaryKey)) {
488
+ return await record.Delete();
566
489
  }
567
490
  else {
568
- // we have an issue becuase we don't have data in the RecordChange table so we can't replay the DELETE, so mark that in the error for the RecordChange
569
- return this.FinishRecordChangeRecord(rc, 'error', 'No prior record data is available in the Record Changes entity, so it is not possible to replay the Delete');
491
+ // if we can't load it, it's already gone, so we're good
492
+ return true;
570
493
  }
571
- }
572
- // if we get here, entityObject is now all set to go for replay!
573
- if (change.Type === 'Delete') {
574
- const result = await entityObject.Delete({
575
- ReplayOnly: true
576
- });
577
- return this.FinishRecordChangeRecord(rc, result ? 'success' : 'error', entityObject.LatestResult?.CompleteMessage);
578
- }
579
- else {
580
- // for updates and creates we just call Save() with the ReplayOnly option
581
- const result = await entityObject.Save({
582
- ReplayOnly: true,
583
- IgnoreDirtyState: false //not relevant for replay
584
- });
585
- return this.FinishRecordChangeRecord(rc, result ? 'success' : 'error', entityObject.LatestResult?.CompleteMessage);
586
- }
587
494
  }
588
- else {
589
- throw new Error("Failed to create Record Change record");
590
- }
591
- }
592
- catch (e) {
593
- LogError(e);
594
- return false;
595
- }
596
- }
597
- /**
598
- * This method will attempt to update the RecordChange record and return true if succesful, false otherwise.
599
- */
600
- async FinishRecordChangeRecord(rc, code, errorMessage) {
601
- try {
602
- rc.Status = code === 'error' ? 'Error' : 'Complete';
603
- rc.ErrorLog = errorMessage;
604
- if (await rc.Save())
605
- return true;
606
- else
607
- return false;
608
495
  }
609
496
  catch (e) {
610
497
  LogError(e);
611
498
  return false;
612
499
  }
613
500
  }
614
- /**
615
- * Creates a new record change record for the start of the replay process.
616
- * @param change
617
- */
618
- async CreateRecordChangeRecord(md, run, change) {
619
- try {
620
- const rc = await md.GetEntityObject("MJ: Record Changes", this.ContextUser);
621
- rc.EntityID = change.Entity.ID;
622
- if (change.LegacyKey)
623
- rc.RecordID = change.LegacyKeyValue; // need to match legacy key otherwise the other RC records will keep coming back up in detect changes runs in the future
624
- else
625
- rc.RecordID = change.PrimaryKey.ToConcatenatedString();
626
- rc.Source = 'External';
627
- rc.Type = change.Type;
628
- rc.Status = 'Pending';
629
- if (change.ChangedAt)
630
- rc.ChangedAt = change.ChangedAt;
631
- else {
632
- // we don't have a ChangedAt from the database, so we need to use the current date
633
- // however, we want UTC date/time for now as that is what we use in the DB for all of
634
- // these fields.
635
- const d = new Date();
636
- rc.ChangedAt = new Date(d.toISOString());
637
- }
638
- const changesObject = {};
639
- for (const field of change.Changes) {
640
- changesObject[field.FieldName] = {
641
- field: field.FieldName,
642
- oldValue: field.OldValue,
643
- newValue: field.NewValue
644
- };
501
+ async StartRun(staleTimeoutHours = 24) {
502
+ // first make sure an existing run isn't in progress
503
+ const rv = new RunView();
504
+ const existingRun = await rv.RunView({
505
+ EntityName: "MJ: Record Change Replay Runs",
506
+ ExtraFilter: "Status NOT IN('Complete', 'Error')"
507
+ }, this.ContextUser);
508
+ if (existingRun && existingRun.Success) {
509
+ if (existingRun.Results.length > 0) {
510
+ // we have an existing run, check to see if it is "stale"
511
+ const runData = existingRun.Results[0];
512
+ const startedAt = new Date(runData.StartedAt);
513
+ const now = new Date();
514
+ const diff = now.getTime() - startedAt.getTime();
515
+ const hours = diff / (1000 * 60 * 60);
516
+ if (hours > staleTimeoutHours) {
517
+ // this is a stale run, so mark it as error and allow a new run to proceed
518
+ const md = new Metadata();
519
+ const staleRun = await md.GetEntityObject("MJ: Record Change Replay Runs", this.ContextUser);
520
+ await staleRun.InnerLoad(runData.ID);
521
+ staleRun.Status = 'Error';
522
+ staleRun.EndedAt = new Date();
523
+ await staleRun.Save();
524
+ LogStatus(`Marked stale Record Change Replay Run ${runData.ID} as Error (Started: ${startedAt.toISOString()})`);
525
+ }
526
+ else {
527
+ throw new Error(`Existing Record Change Replay Run ${runData.ID} is not complete or marked as error, cannot start a new run. It started at ${startedAt.toISOString()}.`);
528
+ }
645
529
  }
646
- if (change.Type === 'Update')
647
- rc.ChangesJSON = JSON.stringify(changesObject);
648
- else
649
- rc.ChangesJSON = ''; // not null
650
- if (change.Type !== 'Delete') {
651
- const obj = change.LatestRecord?.GetAll();
652
- if (obj)
653
- rc.FullRecordJSON = JSON.stringify(obj);
654
- else
655
- rc.FullRecordJSON = ''; // null not allowed
530
+ // if we get here, either there was no existing run, or we just marked a stale run as error
531
+ const md = new Metadata();
532
+ const run = await md.GetEntityObject("MJ: Record Change Replay Runs", this.ContextUser);
533
+ run.StartedAt = new Date();
534
+ run.UserID = this.ContextUser.ID;
535
+ run.Status = 'In Progress';
536
+ if (await run.Save()) {
537
+ // Mitigate race conditions: double-check that no other process started a run at the exact same time
538
+ const doubleCheck = await rv.RunView({
539
+ EntityName: "MJ: Record Change Replay Runs",
540
+ ExtraFilter: `Status = 'In Progress' AND ID <> '${run.ID}'`
541
+ }, this.ContextUser);
542
+ if (doubleCheck && doubleCheck.Success && doubleCheck.Results.length > 0) {
543
+ // Another run snuck in! Back out to prevent duplicate processing.
544
+ run.Status = 'Error';
545
+ run.EndedAt = new Date();
546
+ await run.Save(); // Mark it as an error rather than deleting it to keep an audit trail
547
+ throw new Error("Another process started a run concurrently. Aborting this run to prevent duplicate work.");
548
+ }
549
+ return run;
656
550
  }
657
551
  else
658
- rc.FullRecordJSON = ''; // null not allowed
659
- const provider = this.ProviderToUse;
660
- if (change.Type === 'Update')
661
- rc.ChangesDescription = provider.CreateUserDescriptionOfChanges(changesObject);
662
- else if (change.Type === 'Create')
663
- rc.ChangesDescription = 'New Record';
664
- else
665
- rc.ChangesDescription = 'Record Deleted';
666
- rc.ReplayRunID = run.ID;
667
- rc.UserID = this.ContextUser.ID;
668
- if (await rc.Save()) {
669
- return rc;
670
- }
671
- else {
672
- throw new Error("Failed to save Record Change record: " + rc.LatestResult?.CompleteMessage);
673
- }
552
+ throw new Error("Failed to start run");
674
553
  }
675
- catch (e) {
676
- LogError(e);
677
- return null;
554
+ else {
555
+ // failed to run the view
556
+ throw new Error("Failed to check for existing run: " + existingRun.ErrorMessage);
678
557
  }
679
558
  }
680
559
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChangeDetector.js","sourceRoot":"","sources":["../src/ChangeDetector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/external-change-detection",
3
3
  "type": "module",
4
- "version": "5.4.1",
4
+ "version": "5.6.0",
5
5
  "description": "Library used by server side applications to determine if changes have been made to entities by external systems/integrations",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -20,10 +20,11 @@
20
20
  "typescript": "^5.9.3"
21
21
  },
22
22
  "dependencies": {
23
- "@memberjunction/core": "5.4.1",
24
- "@memberjunction/core-entities": "5.4.1",
25
- "@memberjunction/global": "5.4.1",
26
- "@memberjunction/sqlserver-dataprovider": "5.4.1"
23
+ "@memberjunction/core": "5.6.0",
24
+ "@memberjunction/core-entities": "5.6.0",
25
+ "@memberjunction/global": "5.6.0",
26
+ "@memberjunction/sql-dialect": "5.6.0",
27
+ "@memberjunction/sqlserver-dataprovider": "5.6.0"
27
28
  },
28
29
  "repository": {
29
30
  "type": "git",