@thegraphitelab/n8n-nodes-servicetitan 0.8.0 → 0.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.
- package/README.md +5 -4
- package/dist/nodes/ServiceTitan/GenericFunctions.d.ts +6 -4
- package/dist/nodes/ServiceTitan/GenericFunctions.js +18 -7
- package/dist/nodes/ServiceTitan/GenericFunctions.js.map +1 -1
- package/dist/nodes/ServiceTitan/ServiceTitanTrigger.node.js +116 -48
- package/dist/nodes/ServiceTitan/ServiceTitanTrigger.node.js.map +1 -1
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -79,12 +79,13 @@ Adding a new resource or trigger event is a localized change — see [`CONTRIBUT
|
|
|
79
79
|
|
|
80
80
|
ServiceTitan returns custom fields as an array of `{typeId, name, value}` objects. That shape is awkward to consume in downstream n8n nodes — every workflow has to write a JS-code step to find a field by name.
|
|
81
81
|
|
|
82
|
-
This package returns **
|
|
82
|
+
This package returns **three shapes** on every entity that has custom fields, so consumers pick what fits:
|
|
83
83
|
|
|
84
|
-
- `customFields` —
|
|
85
|
-
- `
|
|
84
|
+
- `customFields` — raw array of `{typeId, name, value}`, untouched. Use this if your workflow already depends on the ST shape, or you need both name + typeId together.
|
|
85
|
+
- `custom_fields_by_name` — flat map: keys are field names, values are the raw values. Use `{{ $json.custom_fields_by_name["Lockbox Code"] }}` to read directly.
|
|
86
|
+
- `custom_fields_by_type_id` — flat map: keys are stringified typeIds, values are the raw values. Use this when you want to address a field by ID (more stable than name across tenant renames).
|
|
86
87
|
|
|
87
|
-
|
|
88
|
+
All three coexist on every entity. None is destructive of the others.
|
|
88
89
|
|
|
89
90
|
## Roadmap
|
|
90
91
|
|
|
@@ -19,12 +19,14 @@ export declare function serviceTitanApiRequest(this: IExecuteFunctions | IPollFu
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function serviceTitanApiRequestAllItems(this: IExecuteFunctions | IPollFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, path: string, qs?: IDataObject, body?: IDataObject | undefined): Promise<IDataObject[]>;
|
|
21
21
|
/**
|
|
22
|
-
* Returns the same item with
|
|
23
|
-
* keyed by the customField's `name`,
|
|
22
|
+
* Returns the same item with two sibling flat-map objects added:
|
|
23
|
+
* - `custom_fields_by_name` — keyed by the customField's `name`, value = value
|
|
24
|
+
* - `custom_fields_by_type_id` — keyed by the customField's `typeId` (stringified),
|
|
25
|
+
* value = value
|
|
24
26
|
*
|
|
25
27
|
* Idempotent and non-destructive:
|
|
26
|
-
* - Original `customFields[]` array is left untouched
|
|
28
|
+
* - Original `customFields[]` array is left untouched, so all three shapes coexist
|
|
27
29
|
* - Missing or non-array `customFields` returns the input unchanged
|
|
28
|
-
* - Duplicate names: last write wins (ST doesn't normally emit duplicates)
|
|
30
|
+
* - Duplicate names or typeIds: last write wins (ST doesn't normally emit duplicates)
|
|
29
31
|
*/
|
|
30
32
|
export declare function flattenCustomFields(item: IDataObject): IDataObject;
|
|
@@ -55,24 +55,35 @@ async function serviceTitanApiRequestAllItems(method, path, qs = {}, body = unde
|
|
|
55
55
|
return collected;
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
|
-
* Returns the same item with
|
|
59
|
-
* keyed by the customField's `name`,
|
|
58
|
+
* Returns the same item with two sibling flat-map objects added:
|
|
59
|
+
* - `custom_fields_by_name` — keyed by the customField's `name`, value = value
|
|
60
|
+
* - `custom_fields_by_type_id` — keyed by the customField's `typeId` (stringified),
|
|
61
|
+
* value = value
|
|
60
62
|
*
|
|
61
63
|
* Idempotent and non-destructive:
|
|
62
|
-
* - Original `customFields[]` array is left untouched
|
|
64
|
+
* - Original `customFields[]` array is left untouched, so all three shapes coexist
|
|
63
65
|
* - Missing or non-array `customFields` returns the input unchanged
|
|
64
|
-
* - Duplicate names: last write wins (ST doesn't normally emit duplicates)
|
|
66
|
+
* - Duplicate names or typeIds: last write wins (ST doesn't normally emit duplicates)
|
|
65
67
|
*/
|
|
66
68
|
function flattenCustomFields(item) {
|
|
67
69
|
const customFields = item.customFields;
|
|
68
70
|
if (!Array.isArray(customFields))
|
|
69
71
|
return item;
|
|
70
72
|
const byName = {};
|
|
73
|
+
const byTypeId = {};
|
|
71
74
|
for (const raw of customFields) {
|
|
72
|
-
if (!raw
|
|
75
|
+
if (!raw)
|
|
73
76
|
continue;
|
|
74
|
-
|
|
77
|
+
if (typeof raw.name === 'string')
|
|
78
|
+
byName[raw.name] = raw.value;
|
|
79
|
+
if (raw.typeId !== undefined && raw.typeId !== null) {
|
|
80
|
+
byTypeId[String(raw.typeId)] = raw.value;
|
|
81
|
+
}
|
|
75
82
|
}
|
|
76
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
...item,
|
|
85
|
+
custom_fields_by_name: byName,
|
|
86
|
+
custom_fields_by_type_id: byTypeId,
|
|
87
|
+
};
|
|
77
88
|
}
|
|
78
89
|
//# sourceMappingURL=GenericFunctions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/GenericFunctions.ts"],"names":[],"mappings":";;AAiBA,wDA4BC;AAcD,wEAwBC;
|
|
1
|
+
{"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/GenericFunctions.ts"],"names":[],"mappings":";;AAiBA,wDA4BC;AAcD,wEAwBC;AAaD,kDAoBC;AA3GD,+FAA2E;AAG3E;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CAE3C,MAA2B,EAC3B,IAAY,EACZ,KAAkB,EAAE,EACpB,OAAgC,SAAS;IAEzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,WAAW,GAAI,WAAW,CAAC,WAAsB,IAAI,aAAa,CAAC;IACzE,MAAM,OAAO,GAAG,IAAA,wCAAU,EAAC,WAAW,CAAC,CAAC;IAExC,MAAM,OAAO,GAAwB;QACpC,MAAM;QACN,GAAG,EAAE,WAAW,OAAO,GAAG,IAAI,EAAE;QAChC,EAAE;QACF,OAAO,EAAE;YACR,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;SAClC;QACD,IAAI,EAAE,IAAI;KACV,CAAC;IACF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAE5C,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAC5D,IAAI,EACJ,iBAAiB,EACjB,OAAO,CACP,CAAgB,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,8BAA8B,CAEnD,MAA2B,EAC3B,IAAY,EACZ,KAAkB,EAAE,EACpB,OAAgC,SAAS;IAEzC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,OAAO,IAAI,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAClE,CAAC;QAE7B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,MAAM;QAC7B,IAAI,IAAI,CAAC,CAAC;IACX,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,mBAAmB,CAAC,IAAiB;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,KAAK,MAAM,GAAG,IAAI,YAA+B,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACrD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC1C,CAAC;IACF,CAAC;IAED,OAAO;QACN,GAAG,IAAI;QACP,qBAAqB,EAAE,MAAM;QAC7B,wBAAwB,EAAE,QAAQ;KAClC,CAAC;AACH,CAAC"}
|
|
@@ -4,6 +4,45 @@ exports.ServiceTitanTrigger = void 0;
|
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
5
|
const GenericFunctions_1 = require("./GenericFunctions");
|
|
6
6
|
const JOB_STATUSES = ['Scheduled', 'InProgress', 'Hold', 'Completed', 'Canceled'];
|
|
7
|
+
const JOB_PAGE_SIZE = 100;
|
|
8
|
+
const MAX_PAGES_PER_POLL = 10; // 1,000 jobs catch-up per poll; uses ~17% of ST's 60req/s budget for one second
|
|
9
|
+
function emptyJobState(tenantId) {
|
|
10
|
+
return { tenantId, cursorCreatedOn: '', seenIdsAtCursor: [], needsSeeding: true };
|
|
11
|
+
}
|
|
12
|
+
function pickLatestIso(a, b) {
|
|
13
|
+
if (!a)
|
|
14
|
+
return b;
|
|
15
|
+
if (!b)
|
|
16
|
+
return a;
|
|
17
|
+
return a > b ? a : b; // ISO 8601 sorts lexicographically
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fetch a single sample job for "Fetch Test Event". Sorts descending by
|
|
21
|
+
* createdOn so the user sees the most recent job that matches their
|
|
22
|
+
* filters. Does NOT mutate staticData.
|
|
23
|
+
*/
|
|
24
|
+
async function fetchManualSample(tenantId, baseQs, userFloorIso) {
|
|
25
|
+
const qs = {
|
|
26
|
+
...baseQs,
|
|
27
|
+
pageSize: 1,
|
|
28
|
+
sort: '-createdOn',
|
|
29
|
+
};
|
|
30
|
+
if (userFloorIso)
|
|
31
|
+
qs.createdOnOrAfter = userFloorIso;
|
|
32
|
+
let response;
|
|
33
|
+
try {
|
|
34
|
+
response = (await GenericFunctions_1.serviceTitanApiRequest.call(this, 'GET', `/jpm/v2/tenant/${tenantId}/jobs`, qs));
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), error);
|
|
38
|
+
}
|
|
39
|
+
const rows = Array.isArray(response.data) ? response.data : [];
|
|
40
|
+
if (rows.length === 0)
|
|
41
|
+
return null;
|
|
42
|
+
return [
|
|
43
|
+
this.helpers.returnJsonArray([(0, GenericFunctions_1.flattenCustomFields)(rows[0])]),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
7
46
|
class ServiceTitanTrigger {
|
|
8
47
|
description = {
|
|
9
48
|
displayName: 'ServiceTitan Trigger',
|
|
@@ -49,7 +88,7 @@ class ServiceTitanTrigger {
|
|
|
49
88
|
{
|
|
50
89
|
name: 'New Job',
|
|
51
90
|
value: 'newJob',
|
|
52
|
-
description: 'Fires
|
|
91
|
+
description: 'Fires once per newly created ServiceTitan job, ordered by createdOn ascending',
|
|
53
92
|
},
|
|
54
93
|
],
|
|
55
94
|
},
|
|
@@ -74,7 +113,7 @@ class ServiceTitanTrigger {
|
|
|
74
113
|
name: 'createdOnOrAfter',
|
|
75
114
|
type: 'dateTime',
|
|
76
115
|
default: '',
|
|
77
|
-
description: '
|
|
116
|
+
description: 'Floor under the trigger\'s internal cursor. The trigger never polls earlier than this date/time. Useful for a one-time backfill or to skip very old jobs.',
|
|
78
117
|
},
|
|
79
118
|
{
|
|
80
119
|
displayName: 'Customer ID',
|
|
@@ -136,70 +175,99 @@ class ServiceTitanTrigger {
|
|
|
136
175
|
const credentials = await this.getCredentials('serviceTitanApi');
|
|
137
176
|
const tenantId = credentials.tenantId;
|
|
138
177
|
const staticData = this.getWorkflowStaticData('node');
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
if (staticData.tenantId
|
|
178
|
+
// 0.8.0 → 0.8.1 migration: drop legacy root-level fields. The old id
|
|
179
|
+
// watermark was unreliable; we'd rather re-seed than carry it forward.
|
|
180
|
+
if (staticData.tenantId !== undefined || staticData.highestSeenId !== undefined) {
|
|
181
|
+
delete staticData.tenantId;
|
|
142
182
|
delete staticData.highestSeenId;
|
|
143
183
|
}
|
|
144
|
-
|
|
184
|
+
// Tenant-swap detection: wipe the dedup block on credential change.
|
|
185
|
+
if (!staticData.jobs || staticData.jobs.tenantId !== tenantId) {
|
|
186
|
+
staticData.jobs = emptyJobState(tenantId);
|
|
187
|
+
}
|
|
188
|
+
const state = staticData.jobs;
|
|
189
|
+
// Filter UI → API params
|
|
145
190
|
const filters = this.getNodeParameter('filters', 0, {});
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
pageSize:
|
|
191
|
+
const userFloorIso = filters.createdOnOrAfter ?? '';
|
|
192
|
+
const baseQs = {
|
|
193
|
+
pageSize: JOB_PAGE_SIZE,
|
|
149
194
|
active: filters.includeInactive ? 'Any' : 'True',
|
|
195
|
+
sort: '+createdOn',
|
|
150
196
|
};
|
|
151
197
|
if (filters.businessUnitId)
|
|
152
|
-
|
|
153
|
-
if (filters.createdOnOrAfter)
|
|
154
|
-
qs.createdOnOrAfter = filters.createdOnOrAfter;
|
|
198
|
+
baseQs.businessUnitId = filters.businessUnitId;
|
|
155
199
|
if (filters.customerId)
|
|
156
|
-
|
|
200
|
+
baseQs.customerId = filters.customerId;
|
|
157
201
|
if (filters.jobStatus)
|
|
158
|
-
|
|
202
|
+
baseQs.jobStatus = filters.jobStatus;
|
|
159
203
|
if (filters.jobTypeId)
|
|
160
|
-
|
|
204
|
+
baseQs.jobTypeId = filters.jobTypeId;
|
|
161
205
|
if (filters.modifiedBefore)
|
|
162
|
-
|
|
163
|
-
|
|
206
|
+
baseQs.modifiedBefore = filters.modifiedBefore;
|
|
207
|
+
// Manual mode (Fetch Test Event): return one sample. NO state mutation.
|
|
208
|
+
if (this.getMode() === 'manual') {
|
|
209
|
+
return await fetchManualSample.call(this, tenantId, baseQs, userFloorIso);
|
|
210
|
+
}
|
|
211
|
+
// First activation: seed cursor at "now" and emit nothing. Avoids
|
|
212
|
+
// draining historical jobs into n8n on activation.
|
|
213
|
+
if (state.needsSeeding) {
|
|
214
|
+
state.cursorCreatedOn = pickLatestIso(new Date().toISOString(), userFloorIso);
|
|
215
|
+
state.seenIdsAtCursor = [];
|
|
216
|
+
state.needsSeeding = false;
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
// Real poll: paginate forward from the cursor.
|
|
220
|
+
const effectiveCursorIso = pickLatestIso(state.cursorCreatedOn, userFloorIso);
|
|
221
|
+
const collected = [];
|
|
222
|
+
let page = 1;
|
|
223
|
+
let hasMore = true;
|
|
164
224
|
try {
|
|
165
|
-
|
|
225
|
+
while (hasMore && page <= MAX_PAGES_PER_POLL) {
|
|
226
|
+
const qs = { ...baseQs, page };
|
|
227
|
+
if (effectiveCursorIso)
|
|
228
|
+
qs.createdOnOrAfter = effectiveCursorIso;
|
|
229
|
+
const response = (await GenericFunctions_1.serviceTitanApiRequest.call(this, 'GET', `/jpm/v2/tenant/${tenantId}/jobs`, qs));
|
|
230
|
+
const rows = Array.isArray(response.data) ? response.data : [];
|
|
231
|
+
collected.push(...rows);
|
|
232
|
+
hasMore = Boolean(response.hasMore) && rows.length > 0;
|
|
233
|
+
page += 1;
|
|
234
|
+
}
|
|
166
235
|
}
|
|
167
236
|
catch (error) {
|
|
168
237
|
throw new n8n_workflow_1.NodeApiError(this.getNode(), error);
|
|
169
238
|
}
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
.
|
|
184
|
-
// Manual mode ("Fetch Test Event"): return one sample without burning the
|
|
185
|
-
// watermark. If there are no new jobs, fall back to the most recent one
|
|
186
|
-
// so the user can wire downstream nodes against a real row.
|
|
187
|
-
if (this.getMode() === 'manual') {
|
|
188
|
-
const sample = newJobs[0] ?? (rows.length > 0
|
|
189
|
-
? [...rows].sort((a, b) => Number(b.id) - Number(a.id))[0]
|
|
190
|
-
: undefined);
|
|
191
|
-
if (!sample)
|
|
192
|
-
return null;
|
|
193
|
-
return [
|
|
194
|
-
this.helpers.returnJsonArray([
|
|
195
|
-
(0, GenericFunctions_1.flattenCustomFields)(sample),
|
|
196
|
-
]),
|
|
197
|
-
];
|
|
239
|
+
// Dedup against the boundary-id set.
|
|
240
|
+
const seen = new Set(state.seenIdsAtCursor);
|
|
241
|
+
const newJobs = [];
|
|
242
|
+
for (const job of collected) {
|
|
243
|
+
if (!job || job.createdOn === undefined || job.id === undefined)
|
|
244
|
+
continue;
|
|
245
|
+
const idStr = String(job.id);
|
|
246
|
+
// Inclusive-window guard: drop boundary jobs we've already emitted.
|
|
247
|
+
if (job.createdOn === state.cursorCreatedOn && seen.has(idStr))
|
|
248
|
+
continue;
|
|
249
|
+
// Defensive: drop anything strictly older than the cursor (clock skew).
|
|
250
|
+
if (state.cursorCreatedOn && job.createdOn < state.cursorCreatedOn)
|
|
251
|
+
continue;
|
|
252
|
+
newJobs.push(job);
|
|
198
253
|
}
|
|
199
254
|
if (newJobs.length === 0)
|
|
200
255
|
return null;
|
|
201
|
-
//
|
|
202
|
-
|
|
256
|
+
// Compute the new cursor and rebuild the boundary set.
|
|
257
|
+
const newestCreatedOn = newJobs.reduce((max, j) => ((j.createdOn ?? '') > max ? (j.createdOn ?? '') : max), state.cursorCreatedOn);
|
|
258
|
+
const refreshedSeen = [];
|
|
259
|
+
if (newestCreatedOn === state.cursorCreatedOn) {
|
|
260
|
+
// Cursor didn't advance — preserve the existing set
|
|
261
|
+
for (const id of state.seenIdsAtCursor)
|
|
262
|
+
refreshedSeen.push(id);
|
|
263
|
+
}
|
|
264
|
+
for (const j of newJobs) {
|
|
265
|
+
if (j.createdOn === newestCreatedOn)
|
|
266
|
+
refreshedSeen.push(String(j.id));
|
|
267
|
+
}
|
|
268
|
+
// State mutation — only after we've successfully built the emission.
|
|
269
|
+
state.cursorCreatedOn = newestCreatedOn;
|
|
270
|
+
state.seenIdsAtCursor = Array.from(new Set(refreshedSeen));
|
|
203
271
|
const enriched = newJobs.map((j) => (0, GenericFunctions_1.flattenCustomFields)(j));
|
|
204
272
|
return [this.helpers.returnJsonArray(enriched)];
|
|
205
273
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceTitanTrigger.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitanTrigger.node.ts"],"names":[],"mappings":";;;AAAA,+CAWsB;AAEtB,yDAAiF;
|
|
1
|
+
{"version":3,"file":"ServiceTitanTrigger.node.js","sourceRoot":"","sources":["../../../nodes/ServiceTitan/ServiceTitanTrigger.node.ts"],"names":[],"mappings":"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"}
|
package/dist/package.json
CHANGED