@mj-biz-apps/common-activity-sync 0.0.1 → 5.37.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 (90) hide show
  1. package/dist/ActivitySyncEngine.d.ts +118 -0
  2. package/dist/ActivitySyncEngine.d.ts.map +1 -0
  3. package/dist/ActivitySyncEngine.js +620 -0
  4. package/dist/ActivitySyncEngine.js.map +1 -0
  5. package/dist/BaseActivitySyncExtension.d.ts +99 -0
  6. package/dist/BaseActivitySyncExtension.d.ts.map +1 -0
  7. package/dist/BaseActivitySyncExtension.js +3 -0
  8. package/dist/BaseActivitySyncExtension.js.map +1 -0
  9. package/dist/BaseActivitySyncProvider.d.ts +40 -0
  10. package/dist/BaseActivitySyncProvider.d.ts.map +1 -0
  11. package/dist/BaseActivitySyncProvider.js +76 -0
  12. package/dist/BaseActivitySyncProvider.js.map +1 -0
  13. package/dist/action-result.d.ts +38 -0
  14. package/dist/action-result.d.ts.map +1 -0
  15. package/dist/action-result.js +43 -0
  16. package/dist/action-result.js.map +1 -0
  17. package/dist/entity-names.d.ts +19 -0
  18. package/dist/entity-names.d.ts.map +1 -0
  19. package/dist/entity-names.js +19 -0
  20. package/dist/entity-names.js.map +1 -0
  21. package/dist/extensions.d.ts +37 -0
  22. package/dist/extensions.d.ts.map +1 -0
  23. package/dist/extensions.js +80 -0
  24. package/dist/extensions.js.map +1 -0
  25. package/dist/identity.d.ts +30 -0
  26. package/dist/identity.d.ts.map +1 -0
  27. package/dist/identity.js +90 -0
  28. package/dist/identity.js.map +1 -0
  29. package/dist/index.d.ts +29 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +29 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/load.d.ts +17 -0
  34. package/dist/load.d.ts.map +1 -0
  35. package/dist/load.js +29 -0
  36. package/dist/load.js.map +1 -0
  37. package/dist/manual-log.d.ts +33 -0
  38. package/dist/manual-log.d.ts.map +1 -0
  39. package/dist/manual-log.js +230 -0
  40. package/dist/manual-log.js.map +1 -0
  41. package/dist/participants.d.ts +47 -0
  42. package/dist/participants.d.ts.map +1 -0
  43. package/dist/participants.js +59 -0
  44. package/dist/participants.js.map +1 -0
  45. package/dist/providers/FixtureActivitySyncProvider.d.ts +21 -0
  46. package/dist/providers/FixtureActivitySyncProvider.d.ts.map +1 -0
  47. package/dist/providers/FixtureActivitySyncProvider.js +58 -0
  48. package/dist/providers/FixtureActivitySyncProvider.js.map +1 -0
  49. package/dist/providers/GraphMessageMapper.d.ts +37 -0
  50. package/dist/providers/GraphMessageMapper.d.ts.map +1 -0
  51. package/dist/providers/GraphMessageMapper.js +91 -0
  52. package/dist/providers/GraphMessageMapper.js.map +1 -0
  53. package/dist/providers/MSGraphActivitySyncProvider.d.ts +22 -0
  54. package/dist/providers/MSGraphActivitySyncProvider.d.ts.map +1 -0
  55. package/dist/providers/MSGraphActivitySyncProvider.js +62 -0
  56. package/dist/providers/MSGraphActivitySyncProvider.js.map +1 -0
  57. package/dist/providers/MSGraphCalendarSyncProvider.d.ts +60 -0
  58. package/dist/providers/MSGraphCalendarSyncProvider.d.ts.map +1 -0
  59. package/dist/providers/MSGraphCalendarSyncProvider.js +145 -0
  60. package/dist/providers/MSGraphCalendarSyncProvider.js.map +1 -0
  61. package/dist/qualification.d.ts +91 -0
  62. package/dist/qualification.d.ts.map +1 -0
  63. package/dist/qualification.js +62 -0
  64. package/dist/qualification.js.map +1 -0
  65. package/dist/run.d.ts +67 -0
  66. package/dist/run.d.ts.map +1 -0
  67. package/dist/run.js +84 -0
  68. package/dist/run.js.map +1 -0
  69. package/dist/sql.d.ts +17 -0
  70. package/dist/sql.d.ts.map +1 -0
  71. package/dist/sql.js +50 -0
  72. package/dist/sql.js.map +1 -0
  73. package/dist/stages.d.ts +55 -0
  74. package/dist/stages.d.ts.map +1 -0
  75. package/dist/stages.js +109 -0
  76. package/dist/stages.js.map +1 -0
  77. package/dist/types.d.ts +130 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +38 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/watermark.d.ts +63 -0
  82. package/dist/watermark.d.ts.map +1 -0
  83. package/dist/watermark.js +103 -0
  84. package/dist/watermark.js.map +1 -0
  85. package/dist/writer.d.ts +132 -0
  86. package/dist/writer.d.ts.map +1 -0
  87. package/dist/writer.js +326 -0
  88. package/dist/writer.js.map +1 -0
  89. package/package.json +26 -4
  90. package/README.md +0 -15
@@ -0,0 +1,620 @@
1
+ /**
2
+ * ActivitySyncEngine — fetch, qualify, resolve, write.
3
+ *
4
+ * No model call inside a transaction. No model call before the deterministic filter.
5
+ * Dry run never advances the watermark (CK_ActivitySyncRun_DryRunNoWatermark).
6
+ * Synced activities are Visibility=Private. Unmatched addresses stay unresolved links.
7
+ */
8
+ import { LogError, RunView, } from '@memberjunction/core';
9
+ import { MJGlobal } from '@memberjunction/global';
10
+ import { BaseActivitySyncExtension } from './BaseActivitySyncExtension.js';
11
+ import { BaseActivitySyncProvider } from './BaseActivitySyncProvider.js';
12
+ import { ACTIVITY_SYNC_ENTITIES } from './entity-names.js';
13
+ import { ExtensionsExtraFilter, RunRegisteredExtensions, } from './extensions.js';
14
+ import { IdentityResolver } from './identity.js';
15
+ import { DefaultDeterministicStages, } from './stages.js';
16
+ import { FixtureActivitySyncProvider } from './providers/FixtureActivitySyncProvider.js';
17
+ import { MSGraphActivitySyncProvider } from './providers/MSGraphActivitySyncProvider.js';
18
+ import { MSGraphCalendarSyncProvider } from './providers/MSGraphCalendarSyncProvider.js';
19
+ import { DefaultPolicyFromProviderType, RunQualificationCascade, } from './qualification.js';
20
+ import { AsDryRunDecision, IsConnectionActive, } from './run.js';
21
+ import { RequireUUID } from './sql.js';
22
+ import { CanAdvanceWatermark, MergeCalendarWatermark, NextWatermark, SurfaceWatermark, } from './watermark.js';
23
+ import { ExclusionsExtraFilter, FromRunView, RulesExtraFilter } from './load.js';
24
+ import { ActivityWriter, StoreBodyFromSettings } from './writer.js';
25
+ /** Hard cap on the fleet query. Unbounded RunView is how a tenant with a burst of mailboxes stalls the hourly job. */
26
+ export const MAX_RUNNABLE_CONNECTIONS = 500;
27
+ /**
28
+ * LastError must name the failure, not whatever happened to be Issues[0].
29
+ * Mapping warnings ("Event X had no usable start time") sort ahead of the actual miss.
30
+ */
31
+ export function healthErrorFromResults(results) {
32
+ const failed = results.filter((r) => !r.Success);
33
+ if (failed.length === 0)
34
+ return null;
35
+ const issues = failed.flatMap((r) => r.Issues).filter((m) => m.trim().length > 0);
36
+ return (issues.join(' | ') || 'Activity sync run failed.').slice(0, 4000);
37
+ }
38
+ /**
39
+ * One Load+Save per extension row after the batch — not N items × M extensions.
40
+ *
41
+ * An error is sticky within the batch on purpose: a later success on a different item must
42
+ * not clear LastError for a Skip that already happened in this run. Only a later run that
43
+ * is clean for that row writes null.
44
+ */
45
+ export function collapseExtensionStamps(stamps) {
46
+ const byId = new Map();
47
+ for (const stamp of stamps) {
48
+ const prev = byId.get(stamp.ID);
49
+ if (stamp.LastError) {
50
+ byId.set(stamp.ID, stamp.LastError);
51
+ }
52
+ else if (prev === undefined) {
53
+ byId.set(stamp.ID, null);
54
+ }
55
+ }
56
+ return [...byId.entries()].map(([ID, LastError]) => ({ ID, LastError }));
57
+ }
58
+ function failedSurfaceResult(issues) {
59
+ return {
60
+ Success: false,
61
+ RunID: null,
62
+ Fetched: 0,
63
+ Included: 0,
64
+ Excluded: 0,
65
+ Duplicates: 0,
66
+ Failed: 1,
67
+ ExtensionErrors: 0,
68
+ WatermarkAdvancedTo: null,
69
+ Issues: [...issues],
70
+ };
71
+ }
72
+ export class ActivitySyncEngine {
73
+ constructor(resolver = new IdentityResolver(), writer = new ActivityWriter(), stages = DefaultDeterministicStages()) {
74
+ this.resolver = resolver;
75
+ this.writer = writer;
76
+ this.stages = stages;
77
+ }
78
+ async Run(connectionID, options, provider, contextUser, source, surface) {
79
+ const stampHealth = surface?.stampHealth ?? true;
80
+ const result = {
81
+ Success: false,
82
+ RunID: null,
83
+ Fetched: 0,
84
+ Included: 0,
85
+ Excluded: 0,
86
+ Duplicates: 0,
87
+ Failed: 0,
88
+ ExtensionErrors: 0,
89
+ WatermarkAdvancedTo: null,
90
+ Issues: [],
91
+ };
92
+ let connection = surface?.connection;
93
+ if (!connection || connection.ID !== connectionID) {
94
+ const loadedConnection = await this.loadConnection(connectionID, contextUser);
95
+ if (loadedConnection.Failed) {
96
+ result.Issues.push(loadedConnection.Issue);
97
+ return result;
98
+ }
99
+ connection = loadedConnection.Rows[0];
100
+ }
101
+ if (!connection) {
102
+ result.Issues.push(`No ActivitySyncConnection '${connectionID}'.`);
103
+ return result;
104
+ }
105
+ const now = new Date();
106
+ if (!IsConnectionActive(connection.Status, connection.StartAt ? new Date(connection.StartAt) : null, connection.EndAt ? new Date(connection.EndAt) : null, now)) {
107
+ result.Issues.push(`Connection ${connectionID} is not in its Active window.`);
108
+ return result;
109
+ }
110
+ let typeRow = null;
111
+ if (surface && Object.prototype.hasOwnProperty.call(surface, 'typeRow')) {
112
+ typeRow = surface.typeRow ?? null;
113
+ }
114
+ else if (connection.ActivitySyncProviderTypeID) {
115
+ const loadedType = await this.loadProviderType(connection.ActivitySyncProviderTypeID, contextUser);
116
+ if (loadedType.Failed) {
117
+ result.Issues.push(loadedType.Issue);
118
+ return result;
119
+ }
120
+ typeRow = loadedType.Rows[0] ?? null;
121
+ }
122
+ // Missing type row: the cascade still needs a default, and that default is
123
+ // Exclude — never `?? 'Include'`.
124
+ const defaultPolicy = DefaultPolicyFromProviderType(typeRow?.DefaultQualificationPolicy);
125
+ const plugin = (surface?.source ?? source) ?? (typeRow ? this.resolvePlugin(typeRow.DriverClass) : null);
126
+ if (!plugin) {
127
+ result.Issues.push(typeRow
128
+ ? `No BaseActivitySyncProvider registered for DriverClass '${typeRow.DriverClass}'.`
129
+ : 'Provider type is missing and no provider was injected.');
130
+ return result;
131
+ }
132
+ const sourceSystem = typeRow?.Code ?? plugin.ProviderTypeCode;
133
+ const since = SurfaceWatermark(plugin.Kind, connection.LastSyncAt, connection.Settings);
134
+ const extensions = await this.loadExtensions(connection.ID, typeRow?.ID ?? null, contextUser);
135
+ if (extensions.Failed) {
136
+ return this.failClosed(connection, options, result, since, provider, contextUser, extensions.Issue, stampHealth);
137
+ }
138
+ const batch = await plugin.Fetch({
139
+ Mailbox: connection.Mailbox ?? '',
140
+ Since: since,
141
+ Limit: options.Limit,
142
+ });
143
+ result.Fetched = batch.Items.length;
144
+ result.Issues.push(...batch.Issues);
145
+ if (batch.Failed) {
146
+ return this.failClosed(connection, options, result, since, provider, contextUser, batch.Issues.join(' | ') || 'Provider fetch failed.', stampHealth);
147
+ }
148
+ const bound = await this.loadBoundSetIds(connectionID, contextUser);
149
+ if (bound.Failed) {
150
+ return this.failClosed(connection, options, result, since, provider, contextUser, bound.Issue, stampHealth);
151
+ }
152
+ const exclusions = await this.loadExclusions(bound.Rows, contextUser);
153
+ if (exclusions.Failed) {
154
+ return this.failClosed(connection, options, result, since, provider, contextUser, exclusions.Issue, stampHealth);
155
+ }
156
+ const rules = await this.loadRules(connectionID, bound.Rows, contextUser);
157
+ if (rules.Failed) {
158
+ return this.failClosed(connection, options, result, since, provider, contextUser, rules.Issue, stampHealth);
159
+ }
160
+ const allParticipants = batch.Items.flatMap((i) => i.Participants);
161
+ const extensionStamps = [];
162
+ const identities = await this.resolver.Resolve(allParticipants, contextUser);
163
+ if (identities.LookupFailed) {
164
+ result.Failed += batch.Items.length;
165
+ result.Issues.push('ContactMethod lookup failed — watermark will not advance.');
166
+ await this.persistRun(connection, options, result, since, null, provider, contextUser, []);
167
+ if (!options.DryRun && stampHealth) {
168
+ await this.stampConnectionHealth(connection.ID, false, 'ContactMethod lookup failed — watermark will not advance.', contextUser, provider);
169
+ }
170
+ return result;
171
+ }
172
+ const details = [];
173
+ for (const item of batch.Items) {
174
+ const ctx = {
175
+ ConnectionID: connection.ID,
176
+ ProviderTypeCode: sourceSystem,
177
+ Exclusions: exclusions.Rows,
178
+ Rules: rules.Rows,
179
+ InternalDomains: [],
180
+ KnownAddresses: identities.Known,
181
+ };
182
+ let verdict;
183
+ try {
184
+ verdict = await RunQualificationCascade(this.stages, item, ctx, defaultPolicy);
185
+ }
186
+ catch (err) {
187
+ result.Failed++;
188
+ result.Issues.push(String(err));
189
+ details.push({
190
+ Item: item,
191
+ Decision: 'Failed',
192
+ Stage: 'Qualification',
193
+ Reason: String(err),
194
+ });
195
+ continue;
196
+ }
197
+ if (verdict.Decision === 'Exclude') {
198
+ result.Excluded++;
199
+ details.push({
200
+ Item: item,
201
+ Decision: options.DryRun ? 'WouldExclude' : 'Excluded',
202
+ Stage: verdict.StageName,
203
+ Reason: verdict.Reason,
204
+ RuleID: verdict.ActivitySyncRuleID,
205
+ ExclusionID: verdict.ActivitySyncExclusionID,
206
+ });
207
+ continue;
208
+ }
209
+ if (verdict.Decision !== 'Include') {
210
+ result.Excluded++;
211
+ details.push({
212
+ Item: item,
213
+ Decision: options.DryRun ? 'WouldExclude' : 'Excluded',
214
+ Stage: verdict.StageName,
215
+ Reason: verdict.Reason,
216
+ });
217
+ continue;
218
+ }
219
+ if (options.DryRun) {
220
+ result.Included++;
221
+ details.push({
222
+ Item: item,
223
+ Decision: 'WouldInclude',
224
+ Stage: verdict.StageName,
225
+ Reason: verdict.Reason,
226
+ RuleID: verdict.ActivitySyncRuleID,
227
+ });
228
+ continue;
229
+ }
230
+ const itemIdentities = await this.resolver.Resolve(item.Participants, contextUser);
231
+ if (itemIdentities.LookupFailed) {
232
+ result.Failed++;
233
+ details.push({
234
+ Item: item,
235
+ Decision: 'Failed',
236
+ Stage: 'Resolve',
237
+ Reason: 'ContactMethod lookup failed',
238
+ });
239
+ continue;
240
+ }
241
+ const sourceValue = plugin.IsLive ? 'Integration' : 'System';
242
+ const written = await this.writer.Write({
243
+ Item: item,
244
+ ConnectionID: connection.ID,
245
+ SourceSystem: sourceSystem,
246
+ Source: sourceValue,
247
+ Resolved: itemIdentities.Resolved,
248
+ Unresolved: itemIdentities.Unresolved,
249
+ StoreBody: StoreBodyFromSettings(connection.Settings),
250
+ }, provider, contextUser, {
251
+ ProviderTypeCode: sourceSystem,
252
+ OnWritten: async (writeCtx) => {
253
+ const ext = await RunRegisteredExtensions(writeCtx, extensions.Rows, (driverClass) => this.resolveExtension(driverClass));
254
+ result.ExtensionErrors += ext.Errors;
255
+ extensionStamps.push(...ext.Stamps);
256
+ if (ext.Aborted) {
257
+ const last = ext.Stamps[ext.Stamps.length - 1];
258
+ throw new Error(last?.LastError ?? 'An ActivitySyncExtension aborted the write.');
259
+ }
260
+ },
261
+ });
262
+ if (!written.Success) {
263
+ result.Failed++;
264
+ details.push({
265
+ Item: item,
266
+ Decision: 'Failed',
267
+ Stage: 'Write',
268
+ Reason: written.Issues.join('; ') || 'write failed',
269
+ });
270
+ continue;
271
+ }
272
+ if (written.AlreadyPresent) {
273
+ result.Duplicates++;
274
+ details.push({
275
+ Item: item,
276
+ Decision: 'Duplicate',
277
+ Stage: 'Write',
278
+ Reason: 'SourceSystem+ExternalID already present',
279
+ ActivityID: written.ActivityID,
280
+ });
281
+ continue;
282
+ }
283
+ result.Included++;
284
+ details.push({
285
+ Item: item,
286
+ Decision: 'Included',
287
+ Stage: verdict.StageName,
288
+ Reason: verdict.Reason,
289
+ RuleID: verdict.ActivitySyncRuleID,
290
+ ActivityID: written.ActivityID,
291
+ });
292
+ }
293
+ if (!options.DryRun) {
294
+ await this.stampExtensions(collapseExtensionStamps(extensionStamps), provider, contextUser);
295
+ }
296
+ const outcome = {
297
+ Settled: result.Included + result.Duplicates,
298
+ Discarded: result.Excluded,
299
+ Failed: result.Failed,
300
+ };
301
+ const candidate = batch.HighWatermark;
302
+ const next = options.DryRun ? since : NextWatermark(since, candidate, outcome);
303
+ if (!options.DryRun && next && CanAdvanceWatermark(outcome) && candidate) {
304
+ const stamped = await this.stampSurfaceWatermark(connectionID, next, plugin.Kind, contextUser, provider);
305
+ if (stamped) {
306
+ result.WatermarkAdvancedTo = next;
307
+ }
308
+ else {
309
+ result.Issues.push('Failed to persist the surface watermark — it will not advance.');
310
+ }
311
+ }
312
+ await this.persistRun(connection, options, result, since, options.DryRun ? null : result.WatermarkAdvancedTo, provider, contextUser, details);
313
+ result.Success = result.Failed === 0;
314
+ if (!options.DryRun && stampHealth) {
315
+ await this.stampConnectionHealth(connectionID, result.Success, healthErrorFromResults([result]), contextUser, provider);
316
+ }
317
+ return result;
318
+ }
319
+ /**
320
+ * Every Active-or-Error connection, once per surface. This is what a scheduled
321
+ * Action calls. Downstream apps do not wrap this — they register an extension.
322
+ *
323
+ * A companion calendar pass is data: ActivitySyncProviderType.CalendarDriverClass.
324
+ * The engine never keys on the deprecated Connection.Provider column. Calendar Graph
325
+ * still refuses live fetch. Health is stamped once from the combined outcome so a
326
+ * refused calendar pass cannot clear a message failure.
327
+ */
328
+ async RunConnections(options, provider, contextUser) {
329
+ const fleet = { Success: true, ConnectionsAttempted: 0, Results: [], Issues: [] };
330
+ const loaded = await this.loadRunnableConnections(contextUser);
331
+ if (loaded.Failed) {
332
+ fleet.Success = false;
333
+ fleet.Issues.push(loaded.Issue);
334
+ return fleet;
335
+ }
336
+ if (loaded.Rows.length === 0) {
337
+ return fleet;
338
+ }
339
+ let rows = loaded.Rows;
340
+ if (rows.length > MAX_RUNNABLE_CONNECTIONS) {
341
+ fleet.Success = false;
342
+ fleet.Issues.push(`Runnable connection load exceeded MaxRows=${MAX_RUNNABLE_CONNECTIONS}; remaining connections were not attempted.`);
343
+ rows = rows.slice(0, MAX_RUNNABLE_CONNECTIONS);
344
+ }
345
+ for (const connection of rows) {
346
+ fleet.ConnectionsAttempted++;
347
+ let typeRow = null;
348
+ if (connection.ActivitySyncProviderTypeID) {
349
+ const loadedType = await this.loadProviderType(connection.ActivitySyncProviderTypeID, contextUser);
350
+ if (loadedType.Failed) {
351
+ const failed = failedSurfaceResult([loadedType.Issue]);
352
+ fleet.Results.push({ ConnectionID: connection.ID, Surface: 'primary', Result: failed });
353
+ fleet.Success = false;
354
+ fleet.Issues.push(...failed.Issues);
355
+ if (!options.DryRun) {
356
+ await this.stampConnectionHealth(connection.ID, false, healthErrorFromResults([failed]), contextUser, provider);
357
+ }
358
+ continue;
359
+ }
360
+ typeRow = loadedType.Rows[0] ?? null;
361
+ }
362
+ const primary = await this.Run(connection.ID, options, provider, contextUser, undefined, {
363
+ stampHealth: false,
364
+ connection,
365
+ typeRow,
366
+ });
367
+ fleet.Results.push({ ConnectionID: connection.ID, Surface: 'primary', Result: primary });
368
+ if (!primary.Success) {
369
+ fleet.Success = false;
370
+ fleet.Issues.push(...primary.Issues);
371
+ }
372
+ const surfaces = [primary];
373
+ const calendarDriver = typeRow?.CalendarDriverClass?.trim();
374
+ if (calendarDriver) {
375
+ const calendarPlugin = this.resolvePlugin(calendarDriver);
376
+ if (!calendarPlugin) {
377
+ const missing = failedSurfaceResult([
378
+ `No BaseActivitySyncProvider registered for CalendarDriverClass '${calendarDriver}'.`,
379
+ ]);
380
+ fleet.Results.push({ ConnectionID: connection.ID, Surface: 'Calendar', Result: missing });
381
+ fleet.Success = false;
382
+ fleet.Issues.push(...missing.Issues);
383
+ surfaces.push(missing);
384
+ }
385
+ else {
386
+ const calendar = await this.Run(connection.ID, options, provider, contextUser, undefined, {
387
+ stampHealth: false,
388
+ connection,
389
+ typeRow,
390
+ source: calendarPlugin,
391
+ });
392
+ fleet.Results.push({ ConnectionID: connection.ID, Surface: 'Calendar', Result: calendar });
393
+ if (!calendar.Success) {
394
+ fleet.Success = false;
395
+ fleet.Issues.push(...calendar.Issues);
396
+ }
397
+ surfaces.push(calendar);
398
+ }
399
+ }
400
+ if (!options.DryRun) {
401
+ const combinedSuccess = surfaces.every((s) => s.Success);
402
+ await this.stampConnectionHealth(connection.ID, combinedSuccess, healthErrorFromResults(surfaces), contextUser, provider);
403
+ }
404
+ }
405
+ return fleet;
406
+ }
407
+ resolvePlugin(driverClass) {
408
+ try {
409
+ const created = MJGlobal.Instance.ClassFactory.TryCreateInstance(BaseActivitySyncProvider, driverClass);
410
+ if (created.Resolved && created.Instance)
411
+ return created.Instance;
412
+ return null;
413
+ }
414
+ catch {
415
+ if (driverClass === 'Generic') {
416
+ return new FixtureActivitySyncProvider();
417
+ }
418
+ return null;
419
+ }
420
+ }
421
+ async failClosed(connection, options, result, since, provider, contextUser, issue, stampHealth) {
422
+ result.Issues.push(issue);
423
+ result.Failed += result.Fetched;
424
+ if (result.Failed < 1)
425
+ result.Failed = 1;
426
+ await this.persistRun(connection, options, result, since, null, provider, contextUser, []);
427
+ if (!options.DryRun && stampHealth) {
428
+ await this.stampConnectionHealth(connection.ID, false, issue, contextUser, provider);
429
+ }
430
+ return result;
431
+ }
432
+ resolveExtension(driverClass) {
433
+ try {
434
+ const created = MJGlobal.Instance.ClassFactory.TryCreateInstance(BaseActivitySyncExtension, driverClass);
435
+ if (created.Resolved && created.Instance)
436
+ return created.Instance;
437
+ return null;
438
+ }
439
+ catch {
440
+ return null;
441
+ }
442
+ }
443
+ async loadExtensions(connectionID, providerTypeID, user) {
444
+ const rv = new RunView();
445
+ const res = await rv.RunView({
446
+ EntityName: ACTIVITY_SYNC_ENTITIES.Extensions,
447
+ ExtraFilter: ExtensionsExtraFilter(connectionID, providerTypeID),
448
+ OrderBy: 'Sequence ASC',
449
+ ResultType: 'simple',
450
+ }, user);
451
+ return FromRunView(res.Success, res.Results, 'ActivitySyncExtension');
452
+ }
453
+ async stampExtensions(stamps, provider, user) {
454
+ const now = new Date();
455
+ for (const stamp of stamps) {
456
+ try {
457
+ const row = await provider.GetEntityObject(ACTIVITY_SYNC_ENTITIES.Extensions, user);
458
+ if (!(await row.Load(stamp.ID)))
459
+ continue;
460
+ row.LastRunAt = now;
461
+ row.LastError = stamp.LastError;
462
+ await row.Save();
463
+ }
464
+ catch (err) {
465
+ LogError(`ActivitySyncEngine.stampExtensions failed for ${stamp.ID}: ${err}`);
466
+ }
467
+ }
468
+ }
469
+ async stampConnectionHealth(connectionID, success, error, user, provider) {
470
+ try {
471
+ const row = await provider.GetEntityObject(ACTIVITY_SYNC_ENTITIES.Connections, user);
472
+ if (!(await row.Load(connectionID)))
473
+ return;
474
+ if (success) {
475
+ row.LastError = null;
476
+ if (row.Status === 'Error')
477
+ row.Status = 'Active';
478
+ }
479
+ else {
480
+ row.Status = 'Error';
481
+ row.LastError = (error ?? 'Activity sync run failed.').slice(0, 4000);
482
+ }
483
+ await row.Save();
484
+ }
485
+ catch (err) {
486
+ LogError(`ActivitySyncEngine.stampConnectionHealth failed: ${err}`);
487
+ }
488
+ }
489
+ async loadConnection(id, user) {
490
+ const rv = new RunView();
491
+ const res = await rv.RunView({
492
+ EntityName: ACTIVITY_SYNC_ENTITIES.Connections,
493
+ ExtraFilter: `ID = '${RequireUUID(id, 'ActivitySyncConnectionID')}'`,
494
+ MaxRows: 1,
495
+ ResultType: 'simple',
496
+ }, user);
497
+ return FromRunView(res.Success, res.Results, 'ActivitySyncConnection');
498
+ }
499
+ async loadRunnableConnections(user) {
500
+ const rv = new RunView();
501
+ const res = await rv.RunView({
502
+ EntityName: ACTIVITY_SYNC_ENTITIES.Connections,
503
+ ExtraFilter: `Status = 'Active' OR Status = 'Error'`,
504
+ MaxRows: MAX_RUNNABLE_CONNECTIONS + 1,
505
+ ResultType: 'simple',
506
+ }, user);
507
+ return FromRunView(res.Success, res.Results, 'ActivitySyncConnection');
508
+ }
509
+ async loadProviderType(id, user) {
510
+ const rv = new RunView();
511
+ const res = await rv.RunView({
512
+ EntityName: ACTIVITY_SYNC_ENTITIES.ProviderTypes,
513
+ ExtraFilter: `ID = '${RequireUUID(id, 'ActivitySyncProviderTypeID')}'`,
514
+ Fields: ['ID', 'Code', 'DriverClass', 'DefaultQualificationPolicy', 'CalendarDriverClass'],
515
+ MaxRows: 1,
516
+ ResultType: 'simple',
517
+ }, user);
518
+ return FromRunView(res.Success, res.Results, 'ActivitySyncProviderType');
519
+ }
520
+ async loadBoundSetIds(connectionID, user) {
521
+ const rv = new RunView();
522
+ const bound = await rv.RunView({
523
+ EntityName: ACTIVITY_SYNC_ENTITIES.ConnectionRuleSets,
524
+ ExtraFilter: `ActivitySyncConnectionID = '${RequireUUID(connectionID, 'ActivitySyncConnectionID')}'`,
525
+ ResultType: 'simple',
526
+ }, user);
527
+ if (!bound.Success) {
528
+ return { Failed: true, Issue: 'ActivitySyncConnectionRuleSet lookup failed.' };
529
+ }
530
+ return {
531
+ Failed: false,
532
+ Rows: (bound.Results ?? []).map((r) => r.ActivitySyncRuleSetID),
533
+ };
534
+ }
535
+ async loadExclusions(setIds, user) {
536
+ const rv = new RunView();
537
+ const res = await rv.RunView({
538
+ EntityName: ACTIVITY_SYNC_ENTITIES.Exclusions,
539
+ ExtraFilter: ExclusionsExtraFilter(setIds),
540
+ ResultType: 'simple',
541
+ }, user);
542
+ return FromRunView(res.Success, res.Results, 'ActivitySyncExclusion');
543
+ }
544
+ async loadRules(connectionID, setIds, user) {
545
+ const rv = new RunView();
546
+ const res = await rv.RunView({
547
+ EntityName: ACTIVITY_SYNC_ENTITIES.Rules,
548
+ ExtraFilter: RulesExtraFilter(setIds, connectionID),
549
+ ResultType: 'simple',
550
+ }, user);
551
+ return FromRunView(res.Success, res.Results, 'ActivitySyncRule');
552
+ }
553
+ async stampSurfaceWatermark(connectionID, at, kind, user, provider) {
554
+ const row = await provider.GetEntityObject(ACTIVITY_SYNC_ENTITIES.Connections, user);
555
+ if (!(await row.Load(connectionID)))
556
+ return false;
557
+ if (kind === 'Calendar') {
558
+ row.Settings = MergeCalendarWatermark(row.Settings, at);
559
+ }
560
+ else {
561
+ row.LastSyncAt = at;
562
+ }
563
+ return row.Save();
564
+ }
565
+ async persistRun(connection, options, result, watermarkBefore, watermarkAfter, provider, user, details) {
566
+ try {
567
+ const run = await provider.GetEntityObject(ACTIVITY_SYNC_ENTITIES.Runs, user);
568
+ run.NewRecord();
569
+ run.ActivitySyncConnectionID = connection.ID;
570
+ run.TriggerType = options.TriggerType;
571
+ run.IsDryRun = options.DryRun;
572
+ run.Fetched = result.Fetched;
573
+ run.Included = result.Included;
574
+ run.Excluded = result.Excluded;
575
+ run.Duplicates = result.Duplicates;
576
+ run.Failed = result.Failed;
577
+ run.ExtensionErrors = result.ExtensionErrors;
578
+ run.WatermarkBefore = watermarkBefore;
579
+ run.WatermarkAfter = options.DryRun ? null : watermarkAfter;
580
+ run.StartedAt = new Date();
581
+ run.EndedAt = new Date();
582
+ run.Status = result.Failed > 0 ? 'Failed' : 'Completed';
583
+ if (!(await run.Save())) {
584
+ result.Issues.push(run.LatestResult?.CompleteMessage ?? 'ActivitySyncRun.Save failed.');
585
+ return;
586
+ }
587
+ result.RunID = run.ID;
588
+ for (const detail of details) {
589
+ const row = await provider.GetEntityObject(ACTIVITY_SYNC_ENTITIES.RunDetails, user);
590
+ row.NewRecord();
591
+ row.ActivitySyncRunID = run.ID;
592
+ row.ExternalID = detail.Item.ExternalID;
593
+ row.ExternalThreadID = detail.Item.ExternalThreadID;
594
+ row.OccurredAt = detail.Item.StartedAt;
595
+ row.Decision = options.DryRun ? AsDryRunDecision(detail.Decision) : detail.Decision;
596
+ row.DecidedByStage = detail.Stage;
597
+ row.Reason = detail.Reason.slice(0, 500);
598
+ row.ActivitySyncRuleID = detail.RuleID ?? null;
599
+ row.ActivitySyncExclusionID = detail.ExclusionID ?? null;
600
+ row.ActivityID = detail.Decision === 'Included' ? (detail.ActivityID ?? null) : null;
601
+ if (!(await row.Save())) {
602
+ result.Issues.push(row.LatestResult?.CompleteMessage ??
603
+ `ActivitySyncRunDetail.Save failed for ${detail.Item.ExternalID}.`);
604
+ }
605
+ }
606
+ }
607
+ catch (err) {
608
+ LogError(`ActivitySyncEngine.persistRun failed: ${err}`);
609
+ result.Issues.push(String(err));
610
+ }
611
+ }
612
+ }
613
+ export function LoadActivitySyncEngine() {
614
+ void ActivitySyncEngine;
615
+ void BaseActivitySyncExtension;
616
+ void FixtureActivitySyncProvider;
617
+ void MSGraphActivitySyncProvider;
618
+ void MSGraphCalendarSyncProvider;
619
+ }
620
+ //# sourceMappingURL=ActivitySyncEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivitySyncEngine.js","sourceRoot":"","sources":["../src/ActivitySyncEngine.ts"],"names":[],"mappings":"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"}