@thegraphitelab/n8n-nodes-servicetitan 0.1.0 → 0.2.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
CHANGED
|
@@ -12,13 +12,15 @@ More resources (Job, Invoice, Estimate, Technician, Booking, etc.) get added per
|
|
|
12
12
|
|
|
13
13
|
## Credentials
|
|
14
14
|
|
|
15
|
-
Required fields:
|
|
15
|
+
Required UI fields (per-client, set when creating a credential in n8n):
|
|
16
16
|
- **Environment** — `Integration (Sandbox)` or `Production`
|
|
17
17
|
- **Tenant ID** — found in ServiceTitan → Settings → API Application Access
|
|
18
|
-
- **App Key** — `ST-App-Key`. TGL-owned application identifier. Same across all TGL clients (controlled by TGL's ServiceTitan developer portal app).
|
|
19
18
|
- **Client ID** — OAuth client ID, per-client
|
|
20
19
|
- **Client Secret** — OAuth client secret, per-client
|
|
21
20
|
|
|
21
|
+
Required env var (set once per n8n instance, on **both** primary and worker services):
|
|
22
|
+
- **`TGL_SERVICETITAN_APP_KEY`** — the `ST-App-Key`. TGL-owned application identifier, same across all TGL clients. Sourced from the TGL ServiceTitan developer portal app. Read from the env at request time, not stored per-credential.
|
|
23
|
+
|
|
22
24
|
The credential's "Test" button hits `/settings/v2/tenant/{tenantId}/user-roles?page=1&pageSize=1` to verify the full auth chain works.
|
|
23
25
|
|
|
24
26
|
## Auth flow
|
|
@@ -8,6 +8,7 @@ export declare class ServiceTitanApi implements ICredentialType {
|
|
|
8
8
|
properties: INodeProperties[];
|
|
9
9
|
preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject): Promise<{
|
|
10
10
|
accessToken: string;
|
|
11
|
+
appKey: string;
|
|
11
12
|
}>;
|
|
12
13
|
authenticate: IAuthenticateGeneric;
|
|
13
14
|
test: ICredentialTestRequest;
|
|
@@ -42,15 +42,6 @@ class ServiceTitanApi {
|
|
|
42
42
|
required: true,
|
|
43
43
|
description: 'Found in ServiceTitan → Settings → API Application Access. Treated as a string in URL paths.',
|
|
44
44
|
},
|
|
45
|
-
{
|
|
46
|
-
displayName: 'App Key',
|
|
47
|
-
name: 'appKey',
|
|
48
|
-
type: 'string',
|
|
49
|
-
typeOptions: { password: true },
|
|
50
|
-
default: '',
|
|
51
|
-
required: true,
|
|
52
|
-
description: 'The ST-App-Key. TGL-owned application identifier — the same value is used across all TGL clients. Get this from the TGL ServiceTitan developer portal application.',
|
|
53
|
-
},
|
|
54
45
|
{
|
|
55
46
|
displayName: 'Client ID',
|
|
56
47
|
name: 'clientId',
|
|
@@ -68,7 +59,8 @@ class ServiceTitanApi {
|
|
|
68
59
|
required: true,
|
|
69
60
|
description: "Per-client OAuth client secret from ServiceTitan → Settings → API Application Access.",
|
|
70
61
|
},
|
|
71
|
-
//
|
|
62
|
+
// Both fields below are populated by preAuthentication, not user input.
|
|
63
|
+
// appKey is read from the TGL_SERVICETITAN_APP_KEY env var on the n8n service.
|
|
72
64
|
{
|
|
73
65
|
displayName: 'Access Token',
|
|
74
66
|
name: 'accessToken',
|
|
@@ -76,8 +68,22 @@ class ServiceTitanApi {
|
|
|
76
68
|
typeOptions: { password: true },
|
|
77
69
|
default: '',
|
|
78
70
|
},
|
|
71
|
+
{
|
|
72
|
+
displayName: 'App Key',
|
|
73
|
+
name: 'appKey',
|
|
74
|
+
type: 'hidden',
|
|
75
|
+
typeOptions: { password: true },
|
|
76
|
+
default: '',
|
|
77
|
+
},
|
|
79
78
|
];
|
|
80
79
|
async preAuthentication(credentials) {
|
|
80
|
+
// The ST-App-Key is TGL-owned and identical across all clients, so it
|
|
81
|
+
// belongs at the n8n instance level, not on every credential.
|
|
82
|
+
// eslint-disable-next-line @n8n/community-nodes/no-restricted-globals
|
|
83
|
+
const appKey = process.env.TGL_SERVICETITAN_APP_KEY;
|
|
84
|
+
if (!appKey) {
|
|
85
|
+
throw new Error('TGL_SERVICETITAN_APP_KEY environment variable is not set. Configure it on both the n8n primary and worker services in Railway, then redeploy.');
|
|
86
|
+
}
|
|
81
87
|
const environment = credentials.environment ?? 'integration';
|
|
82
88
|
const clientId = credentials.clientId;
|
|
83
89
|
const clientSecret = credentials.clientSecret;
|
|
@@ -94,7 +100,7 @@ class ServiceTitanApi {
|
|
|
94
100
|
},
|
|
95
101
|
body,
|
|
96
102
|
}));
|
|
97
|
-
return { accessToken: response.access_token };
|
|
103
|
+
return { accessToken: response.access_token, appKey };
|
|
98
104
|
}
|
|
99
105
|
authenticate = {
|
|
100
106
|
type: 'generic',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceTitanApi.credentials.js","sourceRoot":"","sources":["../../credentials/ServiceTitanApi.credentials.ts"],"names":[],"mappings":";;;AAoBA,gCAIC;AAfD;;;;GAIG;AACH,SAAS,WAAW,CAAC,WAAmB;IACvC,OAAO,WAAW,KAAK,YAAY;QAClC,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,kCAAkC,CAAC;AACvC,CAAC;AAED,SAAgB,UAAU,CAAC,WAAmB;IAC7C,OAAO,WAAW,KAAK,YAAY;QAClC,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,iCAAiC,CAAC;AACtC,CAAC;AAED,MAAa,eAAe;IAC3B,IAAI,GAAG,iBAAiB,CAAC;IAEzB,WAAW,GAAG,kBAAkB,CAAC;IAEjC,IAAI,GAAG,6CAAsD,CAAC;IAE9D,gBAAgB,GAAG,oCAAoC,CAAC;IAExD,UAAU,GAAsB;QAC/B;YACC,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE;gBACR,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE;gBACvD,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;aAC3C;YACD,OAAO,EAAE,aAAa;YACtB,WAAW,EACV,yJAAyJ;SAC1J;QACD;YACC,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,IAAI;YACd,WAAW,EACV,8FAA8F;SAC/F;QACD;YACC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"ServiceTitanApi.credentials.js","sourceRoot":"","sources":["../../credentials/ServiceTitanApi.credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/package.json
CHANGED