@memberjunction/integration-engine 5.8.0 → 5.9.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.
@@ -0,0 +1,482 @@
1
+ import { RunView } from '@memberjunction/core';
2
+ import { UUIDsEqual } from '@memberjunction/global';
3
+ import { IntegrationEngineBase } from '@memberjunction/integration-engine-base';
4
+ import { BaseIntegrationConnector, } from './BaseIntegrationConnector.js';
5
+ /** Maximum number of pages to fetch before stopping (safety limit to prevent infinite loops) */
6
+ const MAX_PAGINATION_PAGES = 200;
7
+ // ─── BaseRESTIntegrationConnector ────────────────────────────────────
8
+ /**
9
+ * Abstract base class for REST API integration connectors.
10
+ *
11
+ * Implements the generic REST sync pattern: reads IntegrationObject/Field
12
+ * metadata from the MJ database, handles pagination, template variable
13
+ * resolution (per-parent iteration), and converts raw API responses to
14
+ * ExternalRecord format.
15
+ *
16
+ * Concrete connectors (YourMembership, Salesforce, HubSpot, etc.) extend
17
+ * this class and implement only auth, HTTP transport, and response normalization.
18
+ */
19
+ export class BaseRESTIntegrationConnector extends BaseIntegrationConnector {
20
+ // ── BaseIntegrationConnector implementations ─────────────────────
21
+ /**
22
+ * Discovers available objects from the IntegrationEngineBase cache.
23
+ */
24
+ async DiscoverObjects(companyIntegration, _contextUser) {
25
+ const objects = IntegrationEngineBase.Instance.GetActiveIntegrationObjects(companyIntegration.IntegrationID);
26
+ return objects.map(obj => ({
27
+ Name: obj.Name,
28
+ Label: obj.DisplayName ?? obj.Name,
29
+ Description: obj.Description ?? undefined,
30
+ SupportsIncrementalSync: obj.SupportsIncrementalSync,
31
+ SupportsWrite: obj.SupportsWrite,
32
+ }));
33
+ }
34
+ /**
35
+ * Discovers fields for a specific object from the IntegrationEngineBase cache.
36
+ */
37
+ async DiscoverFields(companyIntegration, objectName, _contextUser) {
38
+ const obj = this.GetCachedObject(companyIntegration.IntegrationID, objectName);
39
+ const fields = this.GetCachedFields(obj.ID);
40
+ return fields.map(f => this.FieldEntityToSchema(f));
41
+ }
42
+ /**
43
+ * Builds SourceSchemaInfo from IntegrationEngineBase cached metadata.
44
+ * Provides richer metadata than the base class implementation, including
45
+ * FK relationships derived from RelatedIntegrationObjectID.
46
+ */
47
+ async IntrospectSchema(companyIntegration, _contextUser) {
48
+ const integrationID = companyIntegration.IntegrationID;
49
+ const objects = IntegrationEngineBase.Instance.GetActiveIntegrationObjects(integrationID);
50
+ const result = { Objects: [] };
51
+ for (const obj of objects) {
52
+ const fields = this.GetCachedFields(obj.ID);
53
+ const sourceObject = this.BuildSourceObjectInfo(obj, fields, objects);
54
+ result.Objects.push(sourceObject);
55
+ }
56
+ return result;
57
+ }
58
+ /**
59
+ * Fetches records from the external REST API using metadata-driven configuration.
60
+ * Handles both flat endpoints and template-variable (per-parent) endpoints.
61
+ */
62
+ async FetchChanges(ctx) {
63
+ const obj = this.GetCachedObject(ctx.CompanyIntegration.IntegrationID, ctx.ObjectName);
64
+ const fields = this.GetCachedFields(obj.ID);
65
+ const auth = await this.Authenticate(ctx.CompanyIntegration);
66
+ const baseURL = this.GetBaseURL(ctx.CompanyIntegration);
67
+ const templateVars = this.DetectTemplateVars(obj.APIPath);
68
+ if (templateVars.length > 0) {
69
+ return this.FetchWithTemplateVars(auth, baseURL, obj, fields, templateVars, ctx);
70
+ }
71
+ return this.FetchFlat(auth, baseURL, obj, fields, ctx);
72
+ }
73
+ // ── Flat fetch (no template variables) ───────────────────────────
74
+ /**
75
+ * Fetches records from a flat endpoint (no template variable substitution).
76
+ */
77
+ async FetchFlat(auth, baseURL, obj, fields, ctx) {
78
+ const fullPath = this.BuildFullURL(baseURL, obj.APIPath);
79
+ const result = await this.FetchWithPagination(auth, fullPath, obj, ctx.BatchSize);
80
+ const pkFieldName = this.FindPrimaryKeyFieldName(fields);
81
+ return {
82
+ Records: result.Records.map(r => this.ToExternalRecord(r, ctx.ObjectName, pkFieldName)),
83
+ HasMore: result.HasMore,
84
+ };
85
+ }
86
+ // ── Per-parent fetch (template variables) ────────────────────────
87
+ /**
88
+ * Fetches records from a template-variable endpoint by iterating over parent records.
89
+ * Identifies the parent object from FK field metadata, loads parent IDs from the
90
+ * local database, then fetches child records per parent.
91
+ */
92
+ async FetchWithTemplateVars(auth, baseURL, obj, fields, templateVars, ctx) {
93
+ const parentInfo = this.ResolveParentInfo(fields, templateVars, ctx.CompanyIntegration.IntegrationID);
94
+ if (!parentInfo) {
95
+ console.warn(`[BaseRESTIntegrationConnector] Skipping "${obj.Name}": template variables ` +
96
+ `[${templateVars.join(', ')}] could not be resolved to a parent object.`);
97
+ return { Records: [], HasMore: false };
98
+ }
99
+ const parentIDs = await this.LoadParentIDs(parentInfo.parentObjectID, ctx.ContextUser);
100
+ const pkFieldName = this.FindPrimaryKeyFieldName(fields);
101
+ const allRecords = [];
102
+ for (const parentID of parentIDs) {
103
+ const resolvedPath = this.SubstituteTemplateVars(obj.APIPath, parentInfo.templateVar, parentID);
104
+ const fullURL = this.BuildFullURL(baseURL, resolvedPath);
105
+ const result = await this.FetchWithPagination(auth, fullURL, obj, ctx.BatchSize - allRecords.length);
106
+ const tagged = result.Records.map(r => {
107
+ r[parentInfo.fkFieldName] = parentID;
108
+ return this.ToExternalRecord(r, ctx.ObjectName, pkFieldName);
109
+ });
110
+ allRecords.push(...tagged);
111
+ if (allRecords.length >= ctx.BatchSize)
112
+ break;
113
+ }
114
+ return { Records: allRecords, HasMore: false };
115
+ }
116
+ /**
117
+ * Resolves which template variable maps to which FK field + parent object.
118
+ *
119
+ * Resolution strategy (in order):
120
+ * 1. Explicit: FK field with RelatedIntegrationObjectID that matches a template var name
121
+ * 2. PK fallback: finds a sibling integration object whose primary key field name
122
+ * matches the template var, allowing resolution without explicit FK metadata
123
+ *
124
+ * Returns null if no match is found by either strategy.
125
+ */
126
+ ResolveParentInfo(fields, templateVars, integrationID) {
127
+ // Strategy 1: Explicit FK field with RelatedIntegrationObjectID
128
+ for (const field of fields) {
129
+ if (!field.RelatedIntegrationObjectID)
130
+ continue;
131
+ for (const tVar of templateVars) {
132
+ if (field.Name.toLowerCase().includes(tVar.toLowerCase())) {
133
+ return {
134
+ templateVar: tVar,
135
+ fkFieldName: field.Name,
136
+ parentObjectID: field.RelatedIntegrationObjectID,
137
+ };
138
+ }
139
+ }
140
+ }
141
+ // Strategy 2: Match template var against PK fields of sibling objects
142
+ return this.ResolveParentByPKMatch(templateVars, integrationID);
143
+ }
144
+ /**
145
+ * Fallback resolution: finds a sibling integration object whose primary key
146
+ * field name matches one of the template variables (case-insensitive).
147
+ * E.g., {ProfileID} matches Members object which has PK field "ProfileID".
148
+ */
149
+ ResolveParentByPKMatch(templateVars, integrationID) {
150
+ const siblingObjects = IntegrationEngineBase.Instance.GetActiveIntegrationObjects(integrationID);
151
+ for (const tVar of templateVars) {
152
+ const tVarLower = tVar.toLowerCase();
153
+ for (const sibling of siblingObjects) {
154
+ const siblingFields = IntegrationEngineBase.Instance.GetIntegrationObjectFields(sibling.ID);
155
+ const pkField = siblingFields.find(f => f.IsPrimaryKey);
156
+ if (!pkField)
157
+ continue;
158
+ if (pkField.Name.toLowerCase() === tVarLower) {
159
+ return {
160
+ templateVar: tVar,
161
+ fkFieldName: tVar, // Use the template var name as the FK field name
162
+ parentObjectID: sibling.ID,
163
+ };
164
+ }
165
+ }
166
+ }
167
+ return null;
168
+ }
169
+ /**
170
+ * Loads parent record IDs from the local MJ database.
171
+ * Uses IntegrationEngineBase cache for object/field metadata lookups,
172
+ * then queries the MJ entity via RunView for actual synced record IDs.
173
+ */
174
+ async LoadParentIDs(parentObjectID, contextUser) {
175
+ // Use engine cache for metadata lookups
176
+ const parentObj = IntegrationEngineBase.Instance.GetIntegrationObjectByID(parentObjectID);
177
+ if (!parentObj) {
178
+ throw new Error(`Parent IntegrationObject not found: ${parentObjectID}`);
179
+ }
180
+ const parentFields = this.GetCachedFields(parentObj.ID);
181
+ const pkField = parentFields.find(f => f.IsPrimaryKey);
182
+ const pkFieldName = pkField ? pkField.Name : 'ID';
183
+ // Query the parent object's corresponding MJ entity for synced records
184
+ const rv = new RunView();
185
+ const entityMapResult = await rv.RunView({
186
+ EntityName: 'MJ: Company Integration Entity Maps',
187
+ ExtraFilter: `ExternalObjectName='${parentObj.Name}' AND SyncEnabled=1`,
188
+ Fields: ['EntityID', 'Entity'],
189
+ MaxRows: 1,
190
+ ResultType: 'simple',
191
+ }, contextUser);
192
+ if (!entityMapResult.Success || entityMapResult.Results.length === 0) {
193
+ return [];
194
+ }
195
+ const entityName = entityMapResult.Results[0].Entity;
196
+ const idResult = await rv.RunView({
197
+ EntityName: entityName,
198
+ Fields: [pkFieldName],
199
+ ResultType: 'simple',
200
+ }, contextUser);
201
+ if (!idResult.Success)
202
+ return [];
203
+ return idResult.Results.map(r => String(r[pkFieldName]));
204
+ }
205
+ // ── Pagination loop ──────────────────────────────────────────────
206
+ /**
207
+ * Fetches records from a single URL with pagination support.
208
+ * Loops through pages until no more data or maxRecords is reached.
209
+ */
210
+ async FetchWithPagination(auth, basePath, obj, maxRecords) {
211
+ if (!obj.SupportsPagination || obj.PaginationType === 'None') {
212
+ return this.FetchSinglePage(auth, basePath, obj);
213
+ }
214
+ return this.FetchPaginatedLoop(auth, basePath, obj, maxRecords);
215
+ }
216
+ /**
217
+ * Fetches a single non-paginated page.
218
+ */
219
+ async FetchSinglePage(auth, url, obj) {
220
+ const requestURL = this.AppendDefaultQueryParams(url, obj);
221
+ const headers = this.BuildHeaders(auth);
222
+ const response = await this.MakeHTTPRequest(auth, requestURL, 'GET', headers);
223
+ this.ValidateHTTPResponse(response, requestURL);
224
+ const records = this.NormalizeResponse(response.Body, obj.ResponseDataKey);
225
+ return { Records: records, HasMore: false };
226
+ }
227
+ /**
228
+ * Iterates through paginated responses until exhausted or maxRecords is reached.
229
+ */
230
+ async FetchPaginatedLoop(auth, basePath, obj, maxRecords) {
231
+ const allRecords = [];
232
+ let page = 1;
233
+ let offset = 0;
234
+ let cursor;
235
+ let hasMore = true;
236
+ let pageCount = 0;
237
+ let previousFirstRecordKey;
238
+ while (hasMore && allRecords.length < maxRecords && pageCount < MAX_PAGINATION_PAGES) {
239
+ pageCount++;
240
+ const url = this.BuildPaginatedURL(basePath, obj, page, offset, cursor);
241
+ const requestURL = this.AppendDefaultQueryParams(url, obj);
242
+ const headers = this.BuildHeaders(auth);
243
+ const response = await this.MakeHTTPRequest(auth, requestURL, 'GET', headers);
244
+ this.ValidateHTTPResponse(response, requestURL);
245
+ const records = this.NormalizeResponse(response.Body, obj.ResponseDataKey);
246
+ if (records.length === 0) {
247
+ hasMore = false;
248
+ break;
249
+ }
250
+ // Detect duplicate pages: if the first record matches the previous page's first record,
251
+ // the API's pagination is broken (returning the same data repeatedly)
252
+ const currentFirstRecordKey = JSON.stringify(records[0]);
253
+ if (previousFirstRecordKey !== undefined && currentFirstRecordKey === previousFirstRecordKey) {
254
+ console.warn(`[BaseRESTIntegrationConnector] Duplicate page detected for "${obj.Name}" ` +
255
+ `on page ${pageCount}. API pagination appears broken. Stopping.`);
256
+ hasMore = false;
257
+ break;
258
+ }
259
+ previousFirstRecordKey = currentFirstRecordKey;
260
+ allRecords.push(...records);
261
+ const paginationState = this.ExtractPaginationInfo(response.Body, obj.PaginationType, page, offset, obj.DefaultPageSize);
262
+ hasMore = paginationState.HasMore;
263
+ page = paginationState.NextPage ?? page + 1;
264
+ offset = paginationState.NextOffset ?? offset + records.length;
265
+ cursor = paginationState.NextCursor;
266
+ }
267
+ if (pageCount >= MAX_PAGINATION_PAGES) {
268
+ console.warn(`[BaseRESTIntegrationConnector] Pagination safety limit (${MAX_PAGINATION_PAGES} pages) ` +
269
+ `reached for "${obj.Name}". ${allRecords.length} records fetched so far.`);
270
+ hasMore = false; // prevent the engine's outer loop from restarting pagination
271
+ }
272
+ return { Records: allRecords, HasMore: hasMore };
273
+ }
274
+ // ── URL building helpers ─────────────────────────────────────────
275
+ /**
276
+ * Combines baseURL and apiPath into a full URL.
277
+ */
278
+ BuildFullURL(baseURL, apiPath) {
279
+ const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;
280
+ const path = apiPath.startsWith('/') ? apiPath : `/${apiPath}`;
281
+ return `${base}${path}`;
282
+ }
283
+ /**
284
+ * Appends pagination parameters to a URL based on the object's PaginationType.
285
+ * Override in subclasses to use vendor-specific parameter names.
286
+ */
287
+ BuildPaginatedURL(basePath, obj, page, offset, cursor) {
288
+ const separator = basePath.includes('?') ? '&' : '?';
289
+ switch (obj.PaginationType) {
290
+ case 'PageNumber':
291
+ return `${basePath}${separator}page=${page}&pageSize=${obj.DefaultPageSize}`;
292
+ case 'Offset':
293
+ return `${basePath}${separator}offset=${offset}&limit=${obj.DefaultPageSize}`;
294
+ case 'Cursor':
295
+ return cursor
296
+ ? `${basePath}${separator}cursor=${encodeURIComponent(cursor)}&limit=${obj.DefaultPageSize}`
297
+ : `${basePath}${separator}limit=${obj.DefaultPageSize}`;
298
+ default:
299
+ return basePath;
300
+ }
301
+ }
302
+ /**
303
+ * Appends default query parameters from the IntegrationObject metadata.
304
+ * DefaultQueryParams is stored as a JSON object like {"key": "value"}.
305
+ * Automatically skips params whose key (case-insensitive) already appears
306
+ * in the URL to avoid duplicates with pagination params.
307
+ */
308
+ AppendDefaultQueryParams(url, obj) {
309
+ if (!obj.DefaultQueryParams)
310
+ return url;
311
+ try {
312
+ const params = JSON.parse(obj.DefaultQueryParams);
313
+ const entries = Object.entries(params);
314
+ if (entries.length === 0)
315
+ return url;
316
+ // Extract existing param keys from the URL (case-insensitive) to avoid duplicates
317
+ const existingKeys = this.ExtractURLParamKeys(url);
318
+ // Filter out any default params whose key already exists in the URL
319
+ const filtered = entries.filter(([k]) => !existingKeys.has(k.toLowerCase()));
320
+ if (filtered.length === 0)
321
+ return url;
322
+ const separator = url.includes('?') ? '&' : '?';
323
+ const queryString = filtered
324
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
325
+ .join('&');
326
+ return `${url}${separator}${queryString}`;
327
+ }
328
+ catch {
329
+ console.warn(`[BaseRESTIntegrationConnector] Invalid DefaultQueryParams JSON for object "${obj.Name}"`);
330
+ return url;
331
+ }
332
+ }
333
+ /**
334
+ * Extracts query parameter keys from a URL, returned as a Set of lowercase strings.
335
+ * Used to detect duplicates between pagination params and DefaultQueryParams.
336
+ */
337
+ ExtractURLParamKeys(url) {
338
+ const keys = new Set();
339
+ const qIndex = url.indexOf('?');
340
+ if (qIndex < 0)
341
+ return keys;
342
+ const queryString = url.substring(qIndex + 1);
343
+ for (const pair of queryString.split('&')) {
344
+ const eqIndex = pair.indexOf('=');
345
+ const key = eqIndex >= 0 ? pair.substring(0, eqIndex) : pair;
346
+ keys.add(decodeURIComponent(key).toLowerCase());
347
+ }
348
+ return keys;
349
+ }
350
+ // ── Template variable helpers ────────────────────────────────────
351
+ /**
352
+ * Detects template variables in an API path. Template variables use
353
+ * the format {VariableName} (e.g., "/profiles/{ProfileID}/events").
354
+ */
355
+ DetectTemplateVars(apiPath) {
356
+ const matches = apiPath.match(/\{(\w+)\}/g);
357
+ return matches ? matches.map(m => m.slice(1, -1)) : [];
358
+ }
359
+ /**
360
+ * Substitutes a single template variable in a path.
361
+ */
362
+ SubstituteTemplateVars(apiPath, varName, value) {
363
+ return apiPath.replace(`{${varName}}`, encodeURIComponent(value));
364
+ }
365
+ // ── Cached metadata accessors ───────────────────────────────────
366
+ /**
367
+ * Gets an IntegrationObject from the engine's cache by integration ID and object name.
368
+ * Throws if not found.
369
+ */
370
+ GetCachedObject(integrationID, objectName) {
371
+ const obj = IntegrationEngineBase.Instance.GetIntegrationObject(integrationID, objectName);
372
+ if (!obj) {
373
+ throw new Error(`IntegrationObject not found: "${objectName}" for integration ${integrationID}`);
374
+ }
375
+ return obj;
376
+ }
377
+ /**
378
+ * Gets IntegrationObjectField records from the engine's cache for a given object ID.
379
+ * Returns only active fields sorted by Sequence.
380
+ */
381
+ GetCachedFields(objectID) {
382
+ return IntegrationEngineBase.Instance.GetIntegrationObjectFields(objectID)
383
+ .filter(f => f.Status === 'Active')
384
+ .sort((a, b) => a.Sequence - b.Sequence);
385
+ }
386
+ // ── Conversion helpers ───────────────────────────────────────────
387
+ /**
388
+ * Converts a raw API record object to the ExternalRecord format.
389
+ */
390
+ ToExternalRecord(raw, objectType, pkFieldName) {
391
+ const externalID = raw[pkFieldName] != null ? String(raw[pkFieldName]) : '';
392
+ return {
393
+ ExternalID: externalID,
394
+ ObjectType: objectType,
395
+ Fields: raw,
396
+ };
397
+ }
398
+ /**
399
+ * Finds the primary key field name from a set of IntegrationObjectField records.
400
+ * Falls back to "ID" if no PK field is explicitly marked.
401
+ */
402
+ FindPrimaryKeyFieldName(fields) {
403
+ const pkField = fields.find(f => f.IsPrimaryKey);
404
+ return pkField ? pkField.Name : 'ID';
405
+ }
406
+ /**
407
+ * Converts an IntegrationObjectFieldEntity to the ExternalFieldSchema format.
408
+ */
409
+ FieldEntityToSchema(f) {
410
+ return {
411
+ Name: f.Name,
412
+ Label: f.DisplayName ?? f.Name,
413
+ Description: f.Description ?? undefined,
414
+ DataType: f.Type,
415
+ IsRequired: f.IsRequired,
416
+ IsUniqueKey: f.IsUniqueKey,
417
+ IsReadOnly: f.IsReadOnly,
418
+ IsForeignKey: f.RelatedIntegrationObjectID != null,
419
+ ForeignKeyTarget: f.RelatedIntegrationObject ?? null,
420
+ };
421
+ }
422
+ /**
423
+ * Builds a SourceObjectInfo from an IntegrationObject and its fields.
424
+ * Resolves FK relationships using the RelatedIntegrationObjectID.
425
+ */
426
+ BuildSourceObjectInfo(obj, fields, allObjects) {
427
+ const relationships = this.BuildRelationships(fields, allObjects);
428
+ return {
429
+ ExternalName: obj.Name,
430
+ ExternalLabel: obj.DisplayName ?? obj.Name,
431
+ Description: obj.Description ?? undefined,
432
+ Fields: fields.map(f => ({
433
+ Name: f.Name,
434
+ Label: f.DisplayName ?? f.Name,
435
+ Description: f.Description ?? undefined,
436
+ SourceType: f.Type,
437
+ IsRequired: f.IsRequired,
438
+ MaxLength: f.Length,
439
+ Precision: f.Precision,
440
+ Scale: f.Scale,
441
+ DefaultValue: f.DefaultValue,
442
+ IsPrimaryKey: f.IsPrimaryKey,
443
+ IsForeignKey: f.RelatedIntegrationObjectID != null,
444
+ ForeignKeyTarget: f.RelatedIntegrationObject ?? null,
445
+ })),
446
+ PrimaryKeyFields: fields.filter(f => f.IsPrimaryKey).map(f => f.Name),
447
+ Relationships: relationships,
448
+ };
449
+ }
450
+ /**
451
+ * Builds SourceRelationshipInfo entries from FK fields.
452
+ */
453
+ BuildRelationships(fields, allObjects) {
454
+ const relationships = [];
455
+ for (const field of fields) {
456
+ if (!field.RelatedIntegrationObjectID)
457
+ continue;
458
+ const targetObj = allObjects.find(o => UUIDsEqual(o.ID, field.RelatedIntegrationObjectID));
459
+ if (!targetObj)
460
+ continue;
461
+ relationships.push({
462
+ FieldName: field.Name,
463
+ TargetObject: targetObj.Name,
464
+ TargetField: field.RelatedIntegrationObjectFieldName ?? 'ID',
465
+ });
466
+ }
467
+ return relationships;
468
+ }
469
+ // ── Validation ───────────────────────────────────────────────────
470
+ /**
471
+ * Validates an HTTP response and throws a descriptive error on non-2xx status.
472
+ */
473
+ ValidateHTTPResponse(response, url) {
474
+ if (response.Status < 200 || response.Status >= 300) {
475
+ const bodyPreview = typeof response.Body === 'string'
476
+ ? response.Body.slice(0, 500)
477
+ : JSON.stringify(response.Body).slice(0, 500);
478
+ throw new Error(`HTTP ${response.Status} from ${url}: ${bodyPreview}`);
479
+ }
480
+ }
481
+ }
482
+ //# sourceMappingURL=BaseRESTIntegrationConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseRESTIntegrationConnector.js","sourceRoot":"","sources":["../src/BaseRESTIntegrationConnector.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,24 @@
1
1
  import type { MJIntegrationEntity } from '@memberjunction/core-entities';
2
- import type { IIntegrationSourceType } from './entity-types.js';
3
2
  import { BaseIntegrationConnector } from './BaseIntegrationConnector.js';
4
3
  /**
5
4
  * Factory for resolving integration connectors using MJGlobal.ClassFactory.
6
5
  * Connectors register themselves via `@RegisterClass(BaseIntegrationConnector, 'DriverClassName')`.
6
+ *
7
+ * Resolution uses the `ClassName` field on the Integration entity directly —
8
+ * IntegrationSourceType is a general category (SaaS API, Database, File Feed)
9
+ * and is NOT used for connector lookup.
7
10
  */
8
11
  export declare class ConnectorFactory {
9
12
  /**
10
13
  * Resolves and instantiates the appropriate connector for an integration.
11
- * Looks up the DriverClass from the integration's source type and uses
12
- * MJGlobal.ClassFactory to create the connector instance.
14
+ * Uses `integration.ClassName` to look up the registered connector class
15
+ * in MJGlobal.ClassFactory.
13
16
  *
14
17
  * @param integration - The integration entity defining which external system to connect to
15
- * @param sourceTypes - Array of available integration source type entities
16
18
  * @returns An instance of the appropriate BaseIntegrationConnector subclass
17
- * @throws Error if no source type matches or no connector is registered for the driver class
19
+ * @throws Error if ClassName is missing or no connector is registered for it
18
20
  */
19
- static Resolve(integration: MJIntegrationEntity, sourceTypes: IIntegrationSourceType[]): BaseIntegrationConnector;
20
- /**
21
- * Finds the DriverClass name from the source types that matches the integration's ClassName.
22
- */
23
- private static FindDriverClass;
21
+ static Resolve(integration: MJIntegrationEntity): BaseIntegrationConnector;
24
22
  /**
25
23
  * Creates a connector instance via MJGlobal.ClassFactory.
26
24
  * First verifies a registration exists to avoid falling back to the abstract base class.
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectorFactory.d.ts","sourceRoot":"","sources":["../src/ConnectorFactory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE;;;GAGG;AACH,qBAAa,gBAAgB;IACzB;;;;;;;;;OASG;WACW,OAAO,CACjB,WAAW,EAAE,mBAAmB,EAChC,WAAW,EAAE,sBAAsB,EAAE,GACtC,wBAAwB;IAK3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAqB9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAoBzC"}
1
+ {"version":3,"file":"ConnectorFactory.d.ts","sourceRoot":"","sources":["../src/ConnectorFactory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IACzB;;;;;;;;OAQG;WACW,OAAO,CACjB,WAAW,EAAE,mBAAmB,GACjC,wBAAwB;IAW3B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAoBzC"}
@@ -3,35 +3,27 @@ import { BaseIntegrationConnector } from './BaseIntegrationConnector.js';
3
3
  /**
4
4
  * Factory for resolving integration connectors using MJGlobal.ClassFactory.
5
5
  * Connectors register themselves via `@RegisterClass(BaseIntegrationConnector, 'DriverClassName')`.
6
+ *
7
+ * Resolution uses the `ClassName` field on the Integration entity directly —
8
+ * IntegrationSourceType is a general category (SaaS API, Database, File Feed)
9
+ * and is NOT used for connector lookup.
6
10
  */
7
11
  export class ConnectorFactory {
8
12
  /**
9
13
  * Resolves and instantiates the appropriate connector for an integration.
10
- * Looks up the DriverClass from the integration's source type and uses
11
- * MJGlobal.ClassFactory to create the connector instance.
14
+ * Uses `integration.ClassName` to look up the registered connector class
15
+ * in MJGlobal.ClassFactory.
12
16
  *
13
17
  * @param integration - The integration entity defining which external system to connect to
14
- * @param sourceTypes - Array of available integration source type entities
15
18
  * @returns An instance of the appropriate BaseIntegrationConnector subclass
16
- * @throws Error if no source type matches or no connector is registered for the driver class
19
+ * @throws Error if ClassName is missing or no connector is registered for it
17
20
  */
18
- static Resolve(integration, sourceTypes) {
19
- const driverClass = ConnectorFactory.FindDriverClass(integration, sourceTypes);
20
- return ConnectorFactory.CreateConnectorInstance(driverClass);
21
- }
22
- /**
23
- * Finds the DriverClass name from the source types that matches the integration's ClassName.
24
- */
25
- static FindDriverClass(integration, sourceTypes) {
21
+ static Resolve(integration) {
26
22
  const className = integration.ClassName;
27
23
  if (!className) {
28
24
  throw new Error(`Integration "${integration.Name}" does not have a ClassName configured.`);
29
25
  }
30
- const sourceType = sourceTypes.find(st => st.DriverClass === className);
31
- if (!sourceType) {
32
- throw new Error(`No IntegrationSourceType found with DriverClass "${className}" for integration "${integration.Name}".`);
33
- }
34
- return sourceType.DriverClass;
26
+ return ConnectorFactory.CreateConnectorInstance(className);
35
27
  }
36
28
  /**
37
29
  * Creates a connector instance via MJGlobal.ClassFactory.
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectorFactory.js","sourceRoot":"","sources":["../src/ConnectorFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACzB;;;;;;;;;OASG;IACI,MAAM,CAAC,OAAO,CACjB,WAAgC,EAChC,WAAqC;QAErC,MAAM,WAAW,GAAG,gBAAgB,CAAC,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC/E,OAAO,gBAAgB,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,eAAe,CAC1B,WAAgC,EAChC,WAAqC;QAErC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACX,gBAAgB,WAAW,CAAC,IAAI,yCAAyC,CAC5E,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACX,oDAAoD,SAAS,sBAAsB,WAAW,CAAC,IAAI,IAAI,CAC1G,CAAC;QACN,CAAC;QAED,OAAO,UAAU,CAAC,WAAW,CAAC;IAClC,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,uBAAuB,CAAC,WAAmB;QACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAC/D,wBAAwB,EACxB,WAAW,CACd,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACX,6CAA6C,WAAW,KAAK;gBAC7D,8EAA8E,WAAW,KAAK,CACjG,CAAC;QACN,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAC1D,wBAAwB,EACxB,WAAW,CACd,CAAC;QAEF,OAAO,QAAS,CAAC;IACrB,CAAC;CACJ"}
1
+ {"version":3,"file":"ConnectorFactory.js","sourceRoot":"","sources":["../src/ConnectorFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IACzB;;;;;;;;OAQG;IACI,MAAM,CAAC,OAAO,CACjB,WAAgC;QAEhC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACX,gBAAgB,WAAW,CAAC,IAAI,yCAAyC,CAC5E,CAAC;QACN,CAAC;QAED,OAAO,gBAAgB,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,uBAAuB,CAAC,WAAmB;QACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,eAAe,CAC/D,wBAAwB,EACxB,WAAW,CACd,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACX,6CAA6C,WAAW,KAAK;gBAC7D,8EAA8E,WAAW,KAAK,CACjG,CAAC;QACN,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAC1D,wBAAwB,EACxB,WAAW,CACd,CAAC;QAEF,OAAO,QAAS,CAAC;IACrB,CAAC;CACJ"}