@memberjunction/integration-connectors 5.35.0 → 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.
- package/dist/AptifyConnector.d.ts +88 -0
- package/dist/AptifyConnector.d.ts.map +1 -0
- package/dist/AptifyConnector.js +737 -0
- package/dist/AptifyConnector.js.map +1 -0
- package/dist/BettyConnector.d.ts +288 -0
- package/dist/BettyConnector.d.ts.map +1 -0
- package/dist/BettyConnector.js +909 -0
- package/dist/BettyConnector.js.map +1 -0
- package/dist/BlackbaudConnector.d.ts +64 -0
- package/dist/BlackbaudConnector.d.ts.map +1 -0
- package/dist/BlackbaudConnector.js +916 -0
- package/dist/BlackbaudConnector.js.map +1 -0
- package/dist/ConstantContactConnector.d.ts +126 -0
- package/dist/ConstantContactConnector.d.ts.map +1 -0
- package/dist/ConstantContactConnector.js +636 -0
- package/dist/ConstantContactConnector.js.map +1 -0
- package/dist/GrowthZoneConnector.d.ts +185 -0
- package/dist/GrowthZoneConnector.d.ts.map +1 -0
- package/dist/GrowthZoneConnector.js +745 -0
- package/dist/GrowthZoneConnector.js.map +1 -0
- package/dist/HubSpotConnector.d.ts +2 -2
- package/dist/HubSpotConnector.d.ts.map +1 -1
- package/dist/HubSpotConnector.js +3 -3
- package/dist/HubSpotConnector.js.map +1 -1
- package/dist/IMISConnector.d.ts +155 -0
- package/dist/IMISConnector.d.ts.map +1 -0
- package/dist/IMISConnector.js +686 -0
- package/dist/IMISConnector.js.map +1 -0
- package/dist/MJToMJConnector.d.ts +279 -0
- package/dist/MJToMJConnector.d.ts.map +1 -0
- package/dist/MJToMJConnector.js +893 -0
- package/dist/MJToMJConnector.js.map +1 -0
- package/dist/MagnetMailConnector.d.ts +163 -0
- package/dist/MagnetMailConnector.d.ts.map +1 -0
- package/dist/MagnetMailConnector.js +816 -0
- package/dist/MagnetMailConnector.js.map +1 -0
- package/dist/MailchimpConnector.d.ts +188 -0
- package/dist/MailchimpConnector.d.ts.map +1 -0
- package/dist/MailchimpConnector.js +753 -0
- package/dist/MailchimpConnector.js.map +1 -0
- package/dist/NetForumConnector.d.ts +51 -0
- package/dist/NetForumConnector.d.ts.map +1 -0
- package/dist/NetForumConnector.js +419 -0
- package/dist/NetForumConnector.js.map +1 -0
- package/dist/NetSuiteConnector.d.ts +70 -0
- package/dist/NetSuiteConnector.d.ts.map +1 -0
- package/dist/NetSuiteConnector.js +605 -0
- package/dist/NetSuiteConnector.js.map +1 -0
- package/dist/NimbleAMSConnector.d.ts +49 -0
- package/dist/NimbleAMSConnector.d.ts.map +1 -0
- package/dist/NimbleAMSConnector.js +408 -0
- package/dist/NimbleAMSConnector.js.map +1 -0
- package/dist/PropFuelConnector.d.ts +68 -0
- package/dist/PropFuelConnector.d.ts.map +1 -0
- package/dist/PropFuelConnector.js +514 -0
- package/dist/PropFuelConnector.js.map +1 -0
- package/dist/RasaConnector.d.ts +26 -0
- package/dist/RasaConnector.d.ts.map +1 -1
- package/dist/RasaConnector.js +233 -1
- package/dist/RasaConnector.js.map +1 -1
- package/dist/Reach360Connector.d.ts +165 -0
- package/dist/Reach360Connector.d.ts.map +1 -0
- package/dist/Reach360Connector.js +710 -0
- package/dist/Reach360Connector.js.map +1 -0
- package/dist/SharePointConnector.d.ts +181 -0
- package/dist/SharePointConnector.d.ts.map +1 -0
- package/dist/SharePointConnector.js +796 -0
- package/dist/SharePointConnector.js.map +1 -0
- package/dist/WicketConnector.d.ts +1 -0
- package/dist/WicketConnector.d.ts.map +1 -1
- package/dist/WicketConnector.js +6 -0
- package/dist/WicketConnector.js.map +1 -1
- package/dist/WildApricotConnector.d.ts +188 -0
- package/dist/WildApricotConnector.d.ts.map +1 -0
- package/dist/WildApricotConnector.js +1092 -0
- package/dist/WildApricotConnector.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* PropFuelConnector — REST integration connector for PropFuel (now part of re:Members),
|
|
9
|
+
* a personalized member-engagement platform for associations (email + SMS conversational
|
|
10
|
+
* "Ask, Capture, Act" campaigns).
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ STATUS: READ-ONLY SCAFFOLD.
|
|
13
|
+
*
|
|
14
|
+
* PropFuel does not publish a public developer portal. The connector below is built
|
|
15
|
+
* against the *expected* shape of a tenant-scoped REST API (per-customer BaseURL +
|
|
16
|
+
* bearer-token API key) and the documented domain objects (member profiles, campaigns,
|
|
17
|
+
* conversations / engagements, captures / responses, segments, tags). Endpoint paths,
|
|
18
|
+
* pagination strategy, and field names should be confirmed against PropFuel's actual
|
|
19
|
+
* API specification before relying on this connector for production sync.
|
|
20
|
+
*
|
|
21
|
+
* To productionize:
|
|
22
|
+
* 1. Obtain PropFuel API documentation (Swagger / OpenAPI / Postman collection).
|
|
23
|
+
* 2. Verify the BaseURL pattern, auth header (Bearer vs X-API-Key), and pagination type.
|
|
24
|
+
* 3. Replace the `PROPFUEL_OBJECT_PATHS` placeholder paths with real endpoints.
|
|
25
|
+
* 4. Audit the field metadata in `metadata/integrations/.propfuel.json` against the spec.
|
|
26
|
+
* 5. Add Create/Update/Delete support and flip `SupportsCreate/Update/Delete` to true.
|
|
27
|
+
*/
|
|
28
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
29
|
+
import { Metadata } from '@memberjunction/core';
|
|
30
|
+
import { BaseIntegrationConnector, BaseRESTIntegrationConnector, } from '@memberjunction/integration-engine';
|
|
31
|
+
// ─── Constants ──────────────────────────────────────────────────────────
|
|
32
|
+
const DEFAULT_PAGE_SIZE = 100;
|
|
33
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
34
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
35
|
+
const DEFAULT_MIN_REQUEST_INTERVAL_MS = 250;
|
|
36
|
+
/**
|
|
37
|
+
* Placeholder API paths. Update these once PropFuel publishes formal API docs. Each
|
|
38
|
+
* value should be the URL path segment (no leading slash) appended to the BaseURL —
|
|
39
|
+
* for example, `/v1/contacts` with BaseURL `https://api.propfuel.com` resolves to
|
|
40
|
+
* `https://api.propfuel.com/v1/contacts`.
|
|
41
|
+
*/
|
|
42
|
+
const PROPFUEL_OBJECT_PATHS = {
|
|
43
|
+
Contacts: '/contacts',
|
|
44
|
+
Campaigns: '/campaigns',
|
|
45
|
+
Conversations: '/conversations',
|
|
46
|
+
Captures: '/captures',
|
|
47
|
+
Segments: '/segments',
|
|
48
|
+
Tags: '/tags',
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Static catalog of the PropFuel objects this connector knows how to discover.
|
|
52
|
+
* Field metadata is intentionally minimal — DiscoverFields infers the rest from a
|
|
53
|
+
* sample API response. This list mirrors the integration metadata in
|
|
54
|
+
* `metadata/integrations/.propfuel.json`.
|
|
55
|
+
*/
|
|
56
|
+
const PROPFUEL_OBJECTS = [
|
|
57
|
+
{
|
|
58
|
+
Name: 'Contacts', DisplayName: 'Contacts',
|
|
59
|
+
Description: 'Member / subscriber profile records — the primary identity for engagement.',
|
|
60
|
+
SupportsWrite: false,
|
|
61
|
+
Fields: [
|
|
62
|
+
{ Name: 'id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Contact ID' },
|
|
63
|
+
{ Name: 'email', DisplayName: 'Email', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'Primary email address' },
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
Name: 'Campaigns', DisplayName: 'Campaigns',
|
|
68
|
+
Description: 'Engagement campaigns built from PropFuel blueprints (Ask / Capture / Act flows).',
|
|
69
|
+
SupportsWrite: false,
|
|
70
|
+
Fields: [
|
|
71
|
+
{ Name: 'id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Campaign ID' },
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
Name: 'Conversations', DisplayName: 'Conversations',
|
|
76
|
+
Description: 'Two-way member interactions across email and SMS.',
|
|
77
|
+
SupportsWrite: false,
|
|
78
|
+
Fields: [
|
|
79
|
+
{ Name: 'id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Conversation ID' },
|
|
80
|
+
{ Name: 'contact_id', DisplayName: 'Contact ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'FK → Contacts' },
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
Name: 'Captures', DisplayName: 'Captures',
|
|
85
|
+
Description: 'Member responses to Ask prompts — the data PropFuel collects from a campaign.',
|
|
86
|
+
SupportsWrite: false,
|
|
87
|
+
Fields: [
|
|
88
|
+
{ Name: 'id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Capture ID' },
|
|
89
|
+
{ Name: 'contact_id', DisplayName: 'Contact ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'FK → Contacts' },
|
|
90
|
+
{ Name: 'campaign_id', DisplayName: 'Campaign ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'FK → Campaigns' },
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
Name: 'Segments', DisplayName: 'Segments',
|
|
95
|
+
Description: 'Audience segments used to target campaigns.',
|
|
96
|
+
SupportsWrite: false,
|
|
97
|
+
Fields: [
|
|
98
|
+
{ Name: 'id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Segment ID' },
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
Name: 'Tags', DisplayName: 'Tags',
|
|
103
|
+
Description: 'Tags applied to Contacts for segmentation and targeting.',
|
|
104
|
+
SupportsWrite: false,
|
|
105
|
+
Fields: [
|
|
106
|
+
{ Name: 'id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Tag ID' },
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
const WATERMARK_CANDIDATE_FIELDS = ['updated_at', 'modified_at', 'last_updated', 'updatedAt'];
|
|
111
|
+
// ─── Connector ──────────────────────────────────────────────────────────
|
|
112
|
+
let PropFuelConnector = class PropFuelConnector extends BaseRESTIntegrationConnector {
|
|
113
|
+
constructor() {
|
|
114
|
+
super(...arguments);
|
|
115
|
+
this.authState = null;
|
|
116
|
+
this.lastRequestTime = 0;
|
|
117
|
+
}
|
|
118
|
+
// ── Capability flags ────────────────────────────────────────────
|
|
119
|
+
// Read-only initial cut. Flip to true once PropFuel write endpoints are confirmed
|
|
120
|
+
// and the corresponding CreateRecord / UpdateRecord / DeleteRecord overrides are added.
|
|
121
|
+
get IntegrationName() { return 'PropFuel'; }
|
|
122
|
+
get SupportsCreate() { return false; }
|
|
123
|
+
get SupportsUpdate() { return false; }
|
|
124
|
+
get SupportsDelete() { return false; }
|
|
125
|
+
get SupportsSearch() { return false; }
|
|
126
|
+
get SupportsListing() { return true; }
|
|
127
|
+
GetIntegrationObjects() {
|
|
128
|
+
return PROPFUEL_OBJECTS;
|
|
129
|
+
}
|
|
130
|
+
GetActionGeneratorConfig() {
|
|
131
|
+
const config = super.GetActionGeneratorConfig();
|
|
132
|
+
if (!config)
|
|
133
|
+
return null;
|
|
134
|
+
config.IconClass = 'fa-solid fa-comments';
|
|
135
|
+
config.CategoryDescription = 'PropFuel member-engagement platform — read-only access to contacts, campaigns, conversations, and captures.';
|
|
136
|
+
config.ParentCategoryName = 'Engagement';
|
|
137
|
+
config.IncludeSearch = false;
|
|
138
|
+
config.IncludeList = true;
|
|
139
|
+
return config;
|
|
140
|
+
}
|
|
141
|
+
// ── Auth + transport (abstract methods from BaseRESTIntegrationConnector) ──
|
|
142
|
+
async Authenticate(companyIntegration, contextUser) {
|
|
143
|
+
return this.GetAuth(companyIntegration, contextUser);
|
|
144
|
+
}
|
|
145
|
+
BuildHeaders(auth) {
|
|
146
|
+
return {
|
|
147
|
+
'Authorization': `Bearer ${auth.Token}`,
|
|
148
|
+
'Accept': 'application/json',
|
|
149
|
+
'User-Agent': 'MemberJunction-Integration/1.0',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async MakeHTTPRequest(auth, url, method, headers, body) {
|
|
153
|
+
const pfAuth = auth;
|
|
154
|
+
const config = pfAuth.Config;
|
|
155
|
+
const maxRetries = config.MaxRetries ?? DEFAULT_MAX_RETRIES;
|
|
156
|
+
const timeoutMs = config.RequestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
157
|
+
const minInterval = config.MinRequestIntervalMs ?? DEFAULT_MIN_REQUEST_INTERVAL_MS;
|
|
158
|
+
const effectiveHeaders = { ...headers };
|
|
159
|
+
if (body !== undefined && method !== 'GET' && method !== 'DELETE' && !effectiveHeaders['Content-Type']) {
|
|
160
|
+
effectiveHeaders['Content-Type'] = 'application/json';
|
|
161
|
+
}
|
|
162
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
163
|
+
await this.Throttle(minInterval);
|
|
164
|
+
const response = await this.ExecuteFetch(url, method, effectiveHeaders, body, timeoutMs);
|
|
165
|
+
this.lastRequestTime = Date.now();
|
|
166
|
+
if (this.ShouldRetry(response.status) && attempt < maxRetries) {
|
|
167
|
+
await this.Sleep(this.ComputeRetryDelay(response, attempt));
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
return this.BuildRESTResponse(response);
|
|
171
|
+
}
|
|
172
|
+
throw new Error(`PropFuel API request failed after ${maxRetries} attempt(s): ${url}`);
|
|
173
|
+
}
|
|
174
|
+
NormalizeResponse(rawBody, responseDataKey) {
|
|
175
|
+
if (rawBody == null)
|
|
176
|
+
return [];
|
|
177
|
+
if (Array.isArray(rawBody))
|
|
178
|
+
return rawBody;
|
|
179
|
+
const body = rawBody;
|
|
180
|
+
if (responseDataKey && Array.isArray(body[responseDataKey])) {
|
|
181
|
+
return body[responseDataKey];
|
|
182
|
+
}
|
|
183
|
+
// Common envelope conventions — pick whichever the live API actually uses.
|
|
184
|
+
for (const key of ['data', 'items', 'results', 'records']) {
|
|
185
|
+
if (Array.isArray(body[key]))
|
|
186
|
+
return body[key];
|
|
187
|
+
}
|
|
188
|
+
if (Object.keys(body).length > 0)
|
|
189
|
+
return [body];
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
ExtractPaginationInfo(rawBody, paginationType, currentPage, currentOffset, pageSize) {
|
|
193
|
+
if (paginationType === 'None')
|
|
194
|
+
return { HasMore: false };
|
|
195
|
+
const records = this.NormalizeResponse(rawBody, null);
|
|
196
|
+
const effectivePageSize = pageSize > 0 ? pageSize : DEFAULT_PAGE_SIZE;
|
|
197
|
+
const hasMore = records.length >= effectivePageSize;
|
|
198
|
+
switch (paginationType) {
|
|
199
|
+
case 'Offset':
|
|
200
|
+
return { HasMore: hasMore, NextOffset: currentOffset + records.length };
|
|
201
|
+
case 'PageNumber':
|
|
202
|
+
return { HasMore: hasMore, NextPage: currentPage + 1 };
|
|
203
|
+
case 'Cursor': {
|
|
204
|
+
const body = rawBody;
|
|
205
|
+
const cursor = body?.['next_cursor'] ?? body?.['cursor'] ?? body?.['nextCursor'];
|
|
206
|
+
return {
|
|
207
|
+
HasMore: !!cursor,
|
|
208
|
+
NextCursor: typeof cursor === 'string' ? cursor : undefined,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
default:
|
|
212
|
+
return { HasMore: hasMore };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
GetBaseURL(_companyIntegration, auth) {
|
|
216
|
+
return auth.BaseURL;
|
|
217
|
+
}
|
|
218
|
+
// ── Discovery + connection test ─────────────────────────────────
|
|
219
|
+
async TestConnection(companyIntegration, contextUser) {
|
|
220
|
+
try {
|
|
221
|
+
const auth = await this.GetAuth(companyIntegration, contextUser, true);
|
|
222
|
+
const path = PROPFUEL_OBJECT_PATHS['Contacts'];
|
|
223
|
+
const url = `${auth.BaseURL}${path}?limit=1`;
|
|
224
|
+
const response = await this.MakeHTTPRequest(auth, url, 'GET', this.BuildHeaders(auth));
|
|
225
|
+
if (response.Status >= 200 && response.Status < 300) {
|
|
226
|
+
return { Success: true, Message: `Connected to PropFuel at ${auth.BaseURL}` };
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
Success: false,
|
|
230
|
+
Message: `PropFuel responded HTTP ${response.Status}. The endpoint shape may differ from the placeholder used here — verify against PropFuel's API documentation.`,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
235
|
+
return { Success: false, Message: `PropFuel connection failed: ${message}` };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
async DiscoverObjects(companyIntegration, contextUser) {
|
|
239
|
+
const staticObjects = await super.DiscoverObjects(companyIntegration, contextUser);
|
|
240
|
+
if (staticObjects.length > 0)
|
|
241
|
+
return staticObjects;
|
|
242
|
+
return PROPFUEL_OBJECTS.map(o => ({
|
|
243
|
+
Name: o.Name,
|
|
244
|
+
Label: o.DisplayName,
|
|
245
|
+
Description: o.Description,
|
|
246
|
+
SupportsIncrementalSync: true,
|
|
247
|
+
SupportsWrite: o.SupportsWrite,
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Discovery strategy: fetch one sample record and infer the field set from its JSON
|
|
252
|
+
* shape, overlaying any static PK / FK metadata. Falls back to the static field list
|
|
253
|
+
* if the live call fails (offline / sandbox with no data / endpoint mismatch).
|
|
254
|
+
*/
|
|
255
|
+
async DiscoverFields(companyIntegration, objectName, contextUser) {
|
|
256
|
+
try {
|
|
257
|
+
const auth = await this.GetAuth(companyIntegration, contextUser);
|
|
258
|
+
const path = PROPFUEL_OBJECT_PATHS[objectName];
|
|
259
|
+
if (path) {
|
|
260
|
+
const url = `${auth.BaseURL}${path}?limit=1`;
|
|
261
|
+
const response = await this.MakeHTTPRequest(auth, url, 'GET', this.BuildHeaders(auth));
|
|
262
|
+
if (response.Status === 200) {
|
|
263
|
+
const records = this.NormalizeResponse(response.Body, null);
|
|
264
|
+
if (records.length > 0)
|
|
265
|
+
return this.InferFieldsFromSample(records[0], objectName);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// Live discovery failed — fall through to the static fallback below.
|
|
271
|
+
}
|
|
272
|
+
const staticFields = await super.DiscoverFields(companyIntegration, objectName, contextUser);
|
|
273
|
+
if (staticFields.length > 0)
|
|
274
|
+
return staticFields;
|
|
275
|
+
const obj = PROPFUEL_OBJECTS.find(o => o.Name.toLowerCase() === objectName.toLowerCase());
|
|
276
|
+
if (!obj)
|
|
277
|
+
return [];
|
|
278
|
+
return obj.Fields.map(f => ({
|
|
279
|
+
Name: f.Name,
|
|
280
|
+
Label: f.DisplayName,
|
|
281
|
+
Description: f.Description,
|
|
282
|
+
DataType: f.Type,
|
|
283
|
+
IsRequired: f.IsRequired,
|
|
284
|
+
IsUniqueKey: f.IsPrimaryKey,
|
|
285
|
+
IsReadOnly: f.IsReadOnly,
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
InferFieldsFromSample(sample, objectName) {
|
|
289
|
+
const staticObj = PROPFUEL_OBJECTS.find(o => o.Name.toLowerCase() === objectName.toLowerCase());
|
|
290
|
+
const staticMap = new Map((staticObj?.Fields ?? []).map(f => [f.Name.toLowerCase(), f]));
|
|
291
|
+
return Object.entries(sample).map(([key, value]) => {
|
|
292
|
+
const overlay = staticMap.get(key.toLowerCase());
|
|
293
|
+
return {
|
|
294
|
+
Name: key,
|
|
295
|
+
Label: overlay?.DisplayName ?? key,
|
|
296
|
+
Description: overlay?.Description ?? '',
|
|
297
|
+
DataType: overlay?.Type ?? this.InferType(value),
|
|
298
|
+
IsRequired: overlay?.IsRequired ?? false,
|
|
299
|
+
IsUniqueKey: overlay?.IsPrimaryKey ?? false,
|
|
300
|
+
IsReadOnly: overlay?.IsReadOnly ?? true,
|
|
301
|
+
IsForeignKey: overlay?.Description?.startsWith('FK') ?? false,
|
|
302
|
+
};
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
InferType(value) {
|
|
306
|
+
if (value === null || value === undefined)
|
|
307
|
+
return 'string';
|
|
308
|
+
if (typeof value === 'number')
|
|
309
|
+
return Number.isInteger(value) ? 'integer' : 'decimal';
|
|
310
|
+
if (typeof value === 'boolean')
|
|
311
|
+
return 'boolean';
|
|
312
|
+
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}/.test(value))
|
|
313
|
+
return 'datetime';
|
|
314
|
+
return 'string';
|
|
315
|
+
}
|
|
316
|
+
// ── Fetch + watermark ───────────────────────────────────────────
|
|
317
|
+
async FetchChanges(ctx) {
|
|
318
|
+
const auth = await this.GetAuth(ctx.CompanyIntegration, ctx.ContextUser);
|
|
319
|
+
const path = PROPFUEL_OBJECT_PATHS[ctx.ObjectName];
|
|
320
|
+
if (!path) {
|
|
321
|
+
throw new Error(`PropFuel: no API path configured for object "${ctx.ObjectName}". Update PROPFUEL_OBJECT_PATHS in PropFuelConnector.ts.`);
|
|
322
|
+
}
|
|
323
|
+
const offset = ctx.CurrentOffset ?? 0;
|
|
324
|
+
const url = this.BuildFetchURL(auth.BaseURL, path, offset, ctx.WatermarkValue);
|
|
325
|
+
const response = await this.MakeHTTPRequest(auth, url, 'GET', this.BuildHeaders(auth));
|
|
326
|
+
if (response.Status < 200 || response.Status >= 300) {
|
|
327
|
+
throw new Error(`PropFuel FetchChanges failed for ${ctx.ObjectName}: HTTP ${response.Status}`);
|
|
328
|
+
}
|
|
329
|
+
const records = this.NormalizeResponse(response.Body, null);
|
|
330
|
+
const externalRecords = records.map(r => ({
|
|
331
|
+
ExternalID: this.ExtractIdFromRecord(r),
|
|
332
|
+
ObjectType: ctx.ObjectName,
|
|
333
|
+
Fields: r,
|
|
334
|
+
}));
|
|
335
|
+
return {
|
|
336
|
+
Records: externalRecords,
|
|
337
|
+
HasMore: records.length >= DEFAULT_PAGE_SIZE,
|
|
338
|
+
NextOffset: offset + records.length,
|
|
339
|
+
NewWatermarkValue: this.ComputeNewWatermark(externalRecords, ctx.WatermarkValue),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
BuildFetchURL(baseURL, path, offset, watermark) {
|
|
343
|
+
const params = new URLSearchParams();
|
|
344
|
+
params.set('limit', String(DEFAULT_PAGE_SIZE));
|
|
345
|
+
params.set('offset', String(offset));
|
|
346
|
+
if (watermark)
|
|
347
|
+
params.set('updated_since', watermark);
|
|
348
|
+
return `${baseURL}${path}?${params.toString()}`;
|
|
349
|
+
}
|
|
350
|
+
ComputeNewWatermark(records, current) {
|
|
351
|
+
let latest;
|
|
352
|
+
for (const record of records) {
|
|
353
|
+
for (const key of WATERMARK_CANDIDATE_FIELDS) {
|
|
354
|
+
const value = record.Fields[key];
|
|
355
|
+
if (typeof value === 'string' && (!latest || value > latest))
|
|
356
|
+
latest = value;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (!latest)
|
|
360
|
+
return current ?? undefined;
|
|
361
|
+
if (current && latest <= current)
|
|
362
|
+
return current;
|
|
363
|
+
return latest;
|
|
364
|
+
}
|
|
365
|
+
// ── Default config + field mappings ─────────────────────────────
|
|
366
|
+
GetDefaultConfiguration() {
|
|
367
|
+
return { DefaultSchemaName: 'PropFuel', DefaultObjects: [] };
|
|
368
|
+
}
|
|
369
|
+
GetDefaultFieldMappings(objectName, _entityName) {
|
|
370
|
+
const obj = PROPFUEL_OBJECTS.find(o => o.Name.toLowerCase() === objectName.toLowerCase());
|
|
371
|
+
if (!obj)
|
|
372
|
+
return [];
|
|
373
|
+
return obj.Fields.map(f => ({
|
|
374
|
+
SourceFieldName: f.Name,
|
|
375
|
+
DestinationFieldName: f.Name === 'id' ? 'ExternalID' : f.Name,
|
|
376
|
+
IsKeyField: f.IsPrimaryKey,
|
|
377
|
+
}));
|
|
378
|
+
}
|
|
379
|
+
// ─────────────────────────────────────────────────────────────────
|
|
380
|
+
// Private helpers
|
|
381
|
+
// ─────────────────────────────────────────────────────────────────
|
|
382
|
+
async GetAuth(source, contextUser, forceRefresh = false) {
|
|
383
|
+
if (!forceRefresh && this.authState)
|
|
384
|
+
return this.authState;
|
|
385
|
+
const config = this.IsConfig(source)
|
|
386
|
+
? source
|
|
387
|
+
: await this.ParseConfig(source, contextUser);
|
|
388
|
+
const baseURL = this.StripTrailingSlash(config.BaseURL);
|
|
389
|
+
this.authState = {
|
|
390
|
+
Token: config.ApiKey,
|
|
391
|
+
Config: { ...config, BaseURL: baseURL },
|
|
392
|
+
BaseURL: baseURL,
|
|
393
|
+
};
|
|
394
|
+
return this.authState;
|
|
395
|
+
}
|
|
396
|
+
IsConfig(source) {
|
|
397
|
+
return source.BaseURL !== undefined
|
|
398
|
+
&& source.ApiKey !== undefined;
|
|
399
|
+
}
|
|
400
|
+
async ParseConfig(companyIntegration, contextUser) {
|
|
401
|
+
if (companyIntegration.CredentialID) {
|
|
402
|
+
const fromCred = await this.ParseConfigFromCredential(companyIntegration.CredentialID, contextUser);
|
|
403
|
+
if (fromCred)
|
|
404
|
+
return fromCred;
|
|
405
|
+
}
|
|
406
|
+
if (companyIntegration.Configuration) {
|
|
407
|
+
const parsed = JSON.parse(companyIntegration.Configuration);
|
|
408
|
+
return this.ExtractConfig(parsed);
|
|
409
|
+
}
|
|
410
|
+
throw new Error('PropFuel connector requires either CredentialID or Configuration JSON');
|
|
411
|
+
}
|
|
412
|
+
async ParseConfigFromCredential(credentialID, contextUser, provider) {
|
|
413
|
+
const md = provider ?? new Metadata();
|
|
414
|
+
const credential = await md.GetEntityObject('MJ: Credentials', contextUser);
|
|
415
|
+
const loaded = await credential.Load(credentialID);
|
|
416
|
+
if (!loaded || !credential.Values)
|
|
417
|
+
return null;
|
|
418
|
+
const values = JSON.parse(credential.Values);
|
|
419
|
+
return this.ExtractConfig(values);
|
|
420
|
+
}
|
|
421
|
+
ExtractConfig(values) {
|
|
422
|
+
const get = (...keys) => {
|
|
423
|
+
for (const key of keys) {
|
|
424
|
+
const hit = Object.entries(values).find(([k]) => k.toLowerCase() === key.toLowerCase());
|
|
425
|
+
if (hit)
|
|
426
|
+
return String(hit[1] ?? '');
|
|
427
|
+
}
|
|
428
|
+
return undefined;
|
|
429
|
+
};
|
|
430
|
+
// Accepts vendor-specific PascalCase names AND the field names from the
|
|
431
|
+
// standard 'API Key with Endpoint' credential schema (endpoint, apiKey)
|
|
432
|
+
// so the metadata can reference the standard schema rather than a
|
|
433
|
+
// PropFuel-specific one.
|
|
434
|
+
const baseURL = get('BaseURL', 'BaseUrl', 'base_url', 'endpoint');
|
|
435
|
+
const apiKey = get('ApiKey', 'apiKey', 'api_key');
|
|
436
|
+
if (!baseURL)
|
|
437
|
+
throw new Error('PropFuel configuration missing required field: BaseURL');
|
|
438
|
+
if (!apiKey)
|
|
439
|
+
throw new Error('PropFuel configuration missing required field: ApiKey');
|
|
440
|
+
return { BaseURL: this.StripTrailingSlash(baseURL), ApiKey: apiKey };
|
|
441
|
+
}
|
|
442
|
+
// ── HTTP helpers ────────────────────────────────────────────────
|
|
443
|
+
async ExecuteFetch(url, method, headers, body, timeoutMs) {
|
|
444
|
+
const controller = new AbortController();
|
|
445
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
446
|
+
try {
|
|
447
|
+
const requestInit = { method, headers, signal: controller.signal };
|
|
448
|
+
if (body !== undefined && method !== 'GET' && method !== 'DELETE') {
|
|
449
|
+
requestInit.body = JSON.stringify(body);
|
|
450
|
+
}
|
|
451
|
+
return await fetch(url, requestInit);
|
|
452
|
+
}
|
|
453
|
+
finally {
|
|
454
|
+
clearTimeout(timer);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
async BuildRESTResponse(response) {
|
|
458
|
+
const headers = {};
|
|
459
|
+
response.headers.forEach((v, k) => { headers[k.toLowerCase()] = v; });
|
|
460
|
+
const contentType = headers['content-type'] ?? '';
|
|
461
|
+
const body = contentType.includes('application/json')
|
|
462
|
+
? await this.ParseJsonSafely(response)
|
|
463
|
+
: await response.text();
|
|
464
|
+
return { Status: response.status, Body: body, Headers: headers };
|
|
465
|
+
}
|
|
466
|
+
async ParseJsonSafely(response) {
|
|
467
|
+
try {
|
|
468
|
+
return await response.json();
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
ShouldRetry(status) {
|
|
475
|
+
return status === 429 || status === 502 || status === 503 || status === 504;
|
|
476
|
+
}
|
|
477
|
+
ComputeRetryDelay(response, attempt) {
|
|
478
|
+
const retryAfter = response.headers.get('retry-after');
|
|
479
|
+
if (retryAfter) {
|
|
480
|
+
const seconds = Number.parseInt(retryAfter, 10);
|
|
481
|
+
if (!Number.isNaN(seconds) && seconds > 0)
|
|
482
|
+
return seconds * 1000;
|
|
483
|
+
}
|
|
484
|
+
return Math.min(Math.pow(2, attempt) * 1000, 15_000);
|
|
485
|
+
}
|
|
486
|
+
async Throttle(minIntervalMs) {
|
|
487
|
+
const elapsed = Date.now() - this.lastRequestTime;
|
|
488
|
+
if (elapsed < minIntervalMs)
|
|
489
|
+
await this.Sleep(minIntervalMs - elapsed);
|
|
490
|
+
}
|
|
491
|
+
Sleep(ms) {
|
|
492
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
493
|
+
}
|
|
494
|
+
// ── Misc helpers ────────────────────────────────────────────────
|
|
495
|
+
ExtractIdFromRecord(body) {
|
|
496
|
+
const candidates = ['id', 'ID', 'Id', 'contact_id', 'campaign_id', 'conversation_id', 'capture_id'];
|
|
497
|
+
for (const key of candidates) {
|
|
498
|
+
const value = body[key];
|
|
499
|
+
if (value !== undefined && value !== null)
|
|
500
|
+
return String(value);
|
|
501
|
+
}
|
|
502
|
+
return '';
|
|
503
|
+
}
|
|
504
|
+
StripTrailingSlash(url) {
|
|
505
|
+
return url.endsWith('/') ? url.slice(0, -1) : url;
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
PropFuelConnector = __decorate([
|
|
509
|
+
RegisterClass(BaseIntegrationConnector, 'PropFuelConnector')
|
|
510
|
+
], PropFuelConnector);
|
|
511
|
+
export { PropFuelConnector };
|
|
512
|
+
/** Tree-shaking prevention — import and call from module entry point. */
|
|
513
|
+
export function LoadPropFuelConnector() { }
|
|
514
|
+
//# sourceMappingURL=PropFuelConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropFuelConnector.js","sourceRoot":"","sources":["../src/PropFuelConnector.ts"],"names":[],"mappings":"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"}
|
package/dist/RasaConnector.d.ts
CHANGED
|
@@ -80,6 +80,32 @@ export declare class RasaConnector extends BaseRESTIntegrationConnector {
|
|
|
80
80
|
* API returns one item per person with a topics[] array; we emit one row per (person, topic).
|
|
81
81
|
*/
|
|
82
82
|
private FlattenInsightsTopics;
|
|
83
|
+
/**
|
|
84
|
+
* Flattens the /persons/{id}/attributes response into one row per (person, attribute).
|
|
85
|
+
* Rasa.io does NOT expose a schema discovery endpoint for attributes — custom attributes
|
|
86
|
+
* are free-form key-value pairs, so we emit each non-null key as a separate row.
|
|
87
|
+
*/
|
|
88
|
+
private FlattenPersonAttributes;
|
|
89
|
+
/**
|
|
90
|
+
* Flattens /analytics/activities date-histogram responses. Each result is a bucket
|
|
91
|
+
* containing { bucket_start, <metric>: value, ... }. We emit one row per
|
|
92
|
+
* (bucket_start, metric_name).
|
|
93
|
+
*/
|
|
94
|
+
private FlattenActivitiesAnalytics;
|
|
95
|
+
/** Stringifies a custom attribute value for nvarchar storage. */
|
|
96
|
+
private StringifyAttributeValue;
|
|
97
|
+
/**
|
|
98
|
+
* Fetches a batch from a Rasa analytics endpoint. These endpoints require POST
|
|
99
|
+
* with a JSON body and are NOT paginated — the whole response is returned in
|
|
100
|
+
* one call. We build a body that respects the caller's watermark (if any) and
|
|
101
|
+
* delegate to the base pipeline for flattening/pagination-state resolution.
|
|
102
|
+
*/
|
|
103
|
+
private FetchAnalyticsBatch;
|
|
104
|
+
/**
|
|
105
|
+
* Builds the POST body for an analytics endpoint. Watermark is translated into
|
|
106
|
+
* an explicit `date_range.start_date` so that subsequent runs only pull new data.
|
|
107
|
+
*/
|
|
108
|
+
private BuildAnalyticsBody;
|
|
83
109
|
/**
|
|
84
110
|
* Parses connection config from CompanyIntegration credentials.
|
|
85
111
|
* Tries CredentialID first (MJ: Credentials entity), then Configuration JSON.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RasaConnector.d.ts","sourceRoot":"","sources":["../src/RasaConnector.ts"],"names":[],"mappings":"AACA,OAAO,EAAoC,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,0BAA0B,EAAsB,MAAM,+BAA+B,CAAC;AACpG,OAAO,EAEH,4BAA4B,EAC5B,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC7B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAI/E,0EAA0E;AAC1E,MAAM,WAAW,oBAAoB;IACjC,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"RasaConnector.d.ts","sourceRoot":"","sources":["../src/RasaConnector.ts"],"names":[],"mappings":"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"}
|