n8n-nodes-digisac 1.0.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/LICENSE.md +21 -0
- package/README.md +196 -0
- package/dist/credentials/DigisacApi.credentials.d.ts +13 -0
- package/dist/credentials/DigisacApi.credentials.js +55 -0
- package/dist/credentials/DigisacApi.credentials.js.map +1 -0
- package/dist/credentials/digisac.dark.svg +5 -0
- package/dist/credentials/digisac.svg +5 -0
- package/dist/nodes/Digisac/Digisac.node.d.ts +5 -0
- package/dist/nodes/Digisac/Digisac.node.js +68 -0
- package/dist/nodes/Digisac/Digisac.node.js.map +1 -0
- package/dist/nodes/Digisac/actions/index.d.ts +4 -0
- package/dist/nodes/Digisac/actions/index.js +232 -0
- package/dist/nodes/Digisac/actions/index.js.map +1 -0
- package/dist/nodes/Digisac/digisac.dark.svg +5 -0
- package/dist/nodes/Digisac/digisac.svg +5 -0
- package/dist/nodes/Digisac/generated/endpoints.d.ts +21 -0
- package/dist/nodes/Digisac/generated/endpoints.js +6028 -0
- package/dist/nodes/Digisac/generated/endpoints.js.map +1 -0
- package/dist/nodes/Digisac/helpers/format.d.ts +9 -0
- package/dist/nodes/Digisac/helpers/format.js +90 -0
- package/dist/nodes/Digisac/helpers/format.js.map +1 -0
- package/dist/nodes/Digisac/methods/loadOptions.d.ts +1 -0
- package/dist/nodes/Digisac/methods/loadOptions.js +5 -0
- package/dist/nodes/Digisac/methods/loadOptions.js.map +1 -0
- package/dist/nodes/Digisac/transport/index.d.ts +8 -0
- package/dist/nodes/Digisac/transport/index.js +44 -0
- package/dist/nodes/Digisac/transport/index.js.map +1 -0
- package/package.json +66 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pedro Henrique Santos Guimaraes
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# n8n-nodes-digisac
|
|
2
|
+
|
|
3
|
+
[](https://github.com/PedroHSGuimaraes/n8n-nodes-digisac/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
n8n community node for the **Digisac API**. It exposes every request published in the public Postman documentation as one AI-ready n8n node.
|
|
6
|
+
|
|
7
|
+
The package follows the same structure used by `n8n-nodes-clinicorp`: one action node, one credential, TypeScript source, no runtime dependencies, CI, and npm publishing through GitHub Actions with provenance.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- **Complete Postman coverage**: the build step reads the public Digisac Postman collection and generates a catalog with all documented API calls.
|
|
12
|
+
- **One intuitive node**: choose **Resource -> Operation**, then fill path parameters, optional query JSON, and request body JSON.
|
|
13
|
+
- **Bearer credentials**: store Base URL and Access Token once in the credential.
|
|
14
|
+
- **AI Agent ready**: `usableAsTool: true`, operation descriptions include method, path, source folder, required path parameters, query placeholders, and body guidance.
|
|
15
|
+
- **Safe defaults for LLMs**: required path IDs are explicit fields; query placeholders are skipped unless filled; additional query/body data must be JSON.
|
|
16
|
+
- **Publish ready**: GitHub Actions workflow publishes to npm with `npm publish --provenance --access public`.
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
In n8n, go to **Settings -> Community Nodes -> Install** and enter:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
n8n-nodes-digisac
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For AI Agent tool usage with self-hosted n8n, enable community nodes as tools:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Credentials
|
|
33
|
+
|
|
34
|
+
Create a **Digisac API** credential:
|
|
35
|
+
|
|
36
|
+
| Field | Description |
|
|
37
|
+
| --- | --- |
|
|
38
|
+
| Base URL | Base URL shown in Digisac under **Account -> Information**. Example: `https://your-company.digisac.app`. |
|
|
39
|
+
| Access Token | Bearer token generated in **Account -> API -> Personal access tokens**. |
|
|
40
|
+
| PDF/Base URL | Optional base for endpoints documented as `URLbase`, such as ticket PDF exports. Leave empty to reuse Base URL. |
|
|
41
|
+
|
|
42
|
+
The credential test calls:
|
|
43
|
+
|
|
44
|
+
```http
|
|
45
|
+
GET /api/v1/me
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Node Usage
|
|
49
|
+
|
|
50
|
+
1. Add the **Digisac** node.
|
|
51
|
+
2. Select a **Resource**. Resources are generated from the Postman folders, for example Contacts, Tickets, Messages, Campaigns, Services, Departments, Users, Tags, Webhooks and Reports.
|
|
52
|
+
3. Select an **Operation**. Each operation maps to one documented API request.
|
|
53
|
+
4. Fill required path parameters such as `contactId`, `ticketId`, `serviceId`, `userId`, or `messageId`.
|
|
54
|
+
5. Add optional **Additional Query Parameters JSON** for filters, pagination, and complex Digisac `query` objects.
|
|
55
|
+
6. Add **Request Body JSON** for POST, PUT, and PATCH operations.
|
|
56
|
+
|
|
57
|
+
Example body for sending a message:
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"text": "Hello",
|
|
62
|
+
"type": "chat",
|
|
63
|
+
"contactId": "CONTACT_ID",
|
|
64
|
+
"userId": "USER_ID",
|
|
65
|
+
"origin": "bot"
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Example query JSON for a contact-specific ticket lookup:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"where[contactId]": "CONTACT_ID",
|
|
74
|
+
"perPage": 40
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
For complex Digisac ORM-style filters, pass the `query` key as an object:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"query": {
|
|
83
|
+
"where": {
|
|
84
|
+
"contactId": "CONTACT_ID"
|
|
85
|
+
},
|
|
86
|
+
"perPage": 50
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## AI Agent Tool Guidance
|
|
92
|
+
|
|
93
|
+
The node can be connected to n8n's **AI Agent** as a tool. Use one Digisac tool per allowed operation when possible. This limits the model's action surface and improves parameter quality.
|
|
94
|
+
|
|
95
|
+
Recommended system guidance for an agent:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
Use Digisac tools only when the user asks to read or change Digisac data.
|
|
99
|
+
Never invent IDs. If a contactId, ticketId, departmentId, serviceId, userId, messageId, tagId, campaignId, or templateId is missing, first call a list/search operation to find it.
|
|
100
|
+
For POST/PUT/PATCH operations, build a minimal JSON body using only fields needed for the requested action.
|
|
101
|
+
For date filters, use ISO-8601 strings when the endpoint expects timestamps.
|
|
102
|
+
For exports, set Response Format to Text if the response is not JSON.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
When using `$fromAI()`, make descriptions specific:
|
|
106
|
+
|
|
107
|
+
```javascript
|
|
108
|
+
{{ $fromAI('contactId', 'Existing Digisac contact ID. Must come from a previous contacts lookup, never guessed.', 'string') }}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Generated Endpoint Catalog
|
|
112
|
+
|
|
113
|
+
The endpoint catalog is generated by:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npm run generate:endpoints
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Source collection:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
https://documenter.getpostman.com/view/53282970/2sBXihpXmF
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The generated file is:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
nodes/Digisac/generated/endpoints.ts
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Do not edit it manually. Change `scripts/generate-endpoints.mjs` and rebuild instead.
|
|
132
|
+
|
|
133
|
+
## Development
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
npm install
|
|
137
|
+
npm run generate:endpoints
|
|
138
|
+
npm run lint
|
|
139
|
+
npm run build
|
|
140
|
+
npm run dev
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Structure:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
n8n-nodes-digisac/
|
|
147
|
+
├── credentials/
|
|
148
|
+
│ └── DigisacApi.credentials.ts
|
|
149
|
+
├── nodes/
|
|
150
|
+
│ └── Digisac/
|
|
151
|
+
│ ├── Digisac.node.ts
|
|
152
|
+
│ ├── actions/
|
|
153
|
+
│ ├── generated/
|
|
154
|
+
│ ├── helpers/
|
|
155
|
+
│ └── transport/
|
|
156
|
+
├── scripts/
|
|
157
|
+
│ └── generate-endpoints.mjs
|
|
158
|
+
└── .github/workflows/
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Publishing
|
|
162
|
+
|
|
163
|
+
This repository publishes with GitHub Actions, matching the Clinicorp node pattern.
|
|
164
|
+
|
|
165
|
+
Required GitHub secret:
|
|
166
|
+
|
|
167
|
+
```text
|
|
168
|
+
NPM_TOKEN
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Publish by pushing a version tag:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
npm version patch
|
|
175
|
+
git push origin main --tags
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
The workflow runs:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
npm ci --ignore-scripts
|
|
182
|
+
npm run build
|
|
183
|
+
npm publish --provenance --access public
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## References
|
|
187
|
+
|
|
188
|
+
- [Digisac Postman documentation](https://documenter.getpostman.com/view/53282970/2sBXihpXmF)
|
|
189
|
+
- [n8n building community nodes](https://docs.n8n.io/integrations/community-nodes/building-community-nodes/)
|
|
190
|
+
- [n8n programmatic node tutorial](https://docs.n8n.io/connect/create-nodes/build-your-node/tutorial-build-a-programmatic-style-node/)
|
|
191
|
+
- [n8n AI tool parameters with `$fromAI()`](https://docs.n8n.io/build/integrate-ai/ai-examples/use-ai-for-parameters/)
|
|
192
|
+
- [n8n verification guidelines](https://docs.n8n.io/connect/create-nodes/build-your-node/reference/verification-guidelines/)
|
|
193
|
+
|
|
194
|
+
## License
|
|
195
|
+
|
|
196
|
+
[MIT](LICENSE.md)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class DigisacApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
icon: {
|
|
6
|
+
readonly light: "file:digisac.svg";
|
|
7
|
+
readonly dark: "file:digisac.dark.svg";
|
|
8
|
+
};
|
|
9
|
+
documentationUrl: string;
|
|
10
|
+
properties: INodeProperties[];
|
|
11
|
+
authenticate: IAuthenticateGeneric;
|
|
12
|
+
test: ICredentialTestRequest;
|
|
13
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DigisacApi = void 0;
|
|
4
|
+
class DigisacApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'digisacApi';
|
|
7
|
+
this.displayName = 'Digisac API';
|
|
8
|
+
this.icon = { light: 'file:digisac.svg', dark: 'file:digisac.dark.svg' };
|
|
9
|
+
this.documentationUrl = 'https://documenter.getpostman.com/view/53282970/2sBXihpXmF';
|
|
10
|
+
this.properties = [
|
|
11
|
+
{
|
|
12
|
+
displayName: 'Base URL',
|
|
13
|
+
name: 'baseUrl',
|
|
14
|
+
type: 'string',
|
|
15
|
+
default: '',
|
|
16
|
+
required: true,
|
|
17
|
+
placeholder: 'https://your-company.digisac.app',
|
|
18
|
+
description: 'The Digisac API base URL shown in Digisac under Account > Information. Do not include a trailing slash. The node appends paths such as /api/v1/contacts automatically.',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
displayName: 'Access Token',
|
|
22
|
+
name: 'accessToken',
|
|
23
|
+
type: 'string',
|
|
24
|
+
typeOptions: { password: true },
|
|
25
|
+
default: '',
|
|
26
|
+
required: true,
|
|
27
|
+
description: 'Bearer token generated in Digisac under Account > API > Personal access tokens. It uses the same permissions as the user who created it.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
displayName: 'PDF/Base URL',
|
|
31
|
+
name: 'pdfBaseUrl',
|
|
32
|
+
type: 'string',
|
|
33
|
+
default: '',
|
|
34
|
+
placeholder: 'https://your-company.digisac.app',
|
|
35
|
+
description: 'Optional base URL for endpoints documented with the URLbase variable, such as ticket PDF export. Leave empty to reuse Base URL.',
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
this.authenticate = {
|
|
39
|
+
type: 'generic',
|
|
40
|
+
properties: {
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: '=Bearer {{$credentials.accessToken}}',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
this.test = {
|
|
47
|
+
request: {
|
|
48
|
+
baseURL: '={{$credentials.baseUrl.replace(/\\/$/, "")}}',
|
|
49
|
+
url: '/api/v1/me',
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.DigisacApi = DigisacApi;
|
|
55
|
+
//# sourceMappingURL=DigisacApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DigisacApi.credentials.js","sourceRoot":"","sources":["../../credentials/DigisacApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,UAAU;IAAvB;QACC,SAAI,GAAG,YAAY,CAAC;QAEpB,gBAAW,GAAG,aAAa,CAAC;QAE5B,SAAI,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,uBAAuB,EAAW,CAAC;QAE7E,qBAAgB,GAAG,4DAA4D,CAAC;QAEhF,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,kCAAkC;gBAC/C,WAAW,EACV,wKAAwK;aACzK;YACD;gBACC,WAAW,EAAE,cAAc;gBAC3B,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EACV,0IAA0I;aAC3I;YACD;gBACC,WAAW,EAAE,cAAc;gBAC3B,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,kCAAkC;gBAC/C,WAAW,EACV,iIAAiI;aAClI;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,sCAAsC;iBACrD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,+CAA+C;gBACxD,GAAG,EAAE,YAAY;aACjB;SACD,CAAC;IACH,CAAC;CAAA;AAxDD,gCAwDC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Digisac API">
|
|
2
|
+
<rect width="64" height="64" rx="12" fill="#E8FFFB"/>
|
|
3
|
+
<path d="M18 18h20c8.8 0 16 7.2 16 16s-7.2 16-16 16H18V18zm10 10v12h10a6 6 0 0 0 0-12H28z" fill="#04716D"/>
|
|
4
|
+
<circle cx="38" cy="34" r="3" fill="#E8FFFB"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Digisac API">
|
|
2
|
+
<rect width="64" height="64" rx="12" fill="#0B8F8A"/>
|
|
3
|
+
<path d="M18 18h20c8.8 0 16 7.2 16 16s-7.2 16-16 16H18V18zm10 10v12h10a6 6 0 0 0 0-12H28z" fill="#FFFFFF"/>
|
|
4
|
+
<circle cx="38" cy="34" r="3" fill="#0B8F8A"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Digisac = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const actions_1 = require("./actions");
|
|
6
|
+
class Digisac {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.description = {
|
|
9
|
+
displayName: 'Digisac',
|
|
10
|
+
name: 'digisac',
|
|
11
|
+
icon: { light: 'file:digisac.svg', dark: 'file:digisac.dark.svg' },
|
|
12
|
+
group: ['transform'],
|
|
13
|
+
version: 1,
|
|
14
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
15
|
+
description: 'Use every documented Digisac API request from the public Postman documentation. Choose a resource folder and operation, fill required path parameters, add query JSON/body JSON when needed, and the node sends the authenticated Bearer request to the Base URL stored in the credential. Built for AI Agents: operation descriptions include method, path, source folder, required path variables, query placeholders and body guidance so the LLM can choose the correct endpoint and avoid inventing IDs.',
|
|
16
|
+
defaults: {
|
|
17
|
+
name: 'Digisac',
|
|
18
|
+
},
|
|
19
|
+
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
20
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
21
|
+
usableAsTool: true,
|
|
22
|
+
credentials: [
|
|
23
|
+
{
|
|
24
|
+
name: 'digisacApi',
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
properties: [
|
|
29
|
+
{
|
|
30
|
+
displayName: 'Resource',
|
|
31
|
+
name: 'resource',
|
|
32
|
+
type: 'options',
|
|
33
|
+
noDataExpression: true,
|
|
34
|
+
options: actions_1.resourceOptions,
|
|
35
|
+
default: actions_1.resourceOptions[0]?.value ?? '',
|
|
36
|
+
description: 'Digisac API area, grouped from the Postman documentation. Pick the folder that matches the task: contacts, tickets, messages, campaigns, services, dashboards, webhooks, and more.',
|
|
37
|
+
},
|
|
38
|
+
...actions_1.resourceProperties,
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async execute() {
|
|
43
|
+
const items = this.getInputData();
|
|
44
|
+
const returnData = [];
|
|
45
|
+
for (let i = 0; i < items.length; i++) {
|
|
46
|
+
try {
|
|
47
|
+
const operation = this.getNodeParameter('operation', i);
|
|
48
|
+
const responseData = await actions_1.executeEndpoint.call(this, operation, i);
|
|
49
|
+
const asArray = Array.isArray(responseData) ? responseData : [responseData];
|
|
50
|
+
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(asArray), { itemData: { item: i } });
|
|
51
|
+
returnData.push(...executionData);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (this.continueOnFail()) {
|
|
55
|
+
returnData.push({
|
|
56
|
+
json: { error: error.message },
|
|
57
|
+
pairedItem: { item: i },
|
|
58
|
+
});
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, { itemIndex: i });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return [returnData];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.Digisac = Digisac;
|
|
68
|
+
//# sourceMappingURL=Digisac.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Digisac.node.js","sourceRoot":"","sources":["../../../nodes/Digisac/Digisac.node.ts"],"names":[],"mappings":";;;AAOA,+CAAuE;AAEvE,uCAAiF;AAEjF,MAAa,OAAO;IAApB;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,uBAAuB,EAAE;YAClE,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,8DAA8D;YACxE,WAAW,EACV,+eAA+e;YAChf,QAAQ,EAAE;gBACT,IAAI,EAAE,SAAS;aACf;YACD,MAAM,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YACnC,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE;gBACZ;oBACC,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,IAAI;iBACd;aACD;YACD,UAAU,EAAE;gBACX;oBACC,WAAW,EAAE,UAAU;oBACvB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;oBACf,gBAAgB,EAAE,IAAI;oBACtB,OAAO,EAAE,yBAAe;oBACxB,OAAO,EAAE,yBAAe,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;oBACxC,WAAW,EACV,oLAAoL;iBACrL;gBACD,GAAG,4BAAkB;aACrB;SACD,CAAC;IA+BH,CAAC;IA7BA,KAAK,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAW,CAAC;gBAClE,MAAM,YAAY,GAAG,MAAM,yBAAe,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAE5E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAC5D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAwB,CAAC,EACtD,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACzB,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE;wBACzC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;qBACvB,CAAC,CAAC;oBACH,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAc,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC;CACD;AAlED,0BAkEC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IExecuteFunctions, INodeProperties, INodePropertyOptions } from 'n8n-workflow';
|
|
2
|
+
export declare const resourceOptions: INodePropertyOptions[];
|
|
3
|
+
export declare const resourceProperties: INodeProperties[];
|
|
4
|
+
export declare function executeEndpoint(this: IExecuteFunctions, operation: string, i: number): Promise<any>;
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resourceProperties = exports.resourceOptions = void 0;
|
|
4
|
+
exports.executeEndpoint = executeEndpoint;
|
|
5
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
6
|
+
const endpoints_1 = require("../generated/endpoints");
|
|
7
|
+
const format_1 = require("../helpers/format");
|
|
8
|
+
const transport_1 = require("../transport");
|
|
9
|
+
const endpointsById = new Map(endpoints_1.DIGISAC_ENDPOINTS.map((endpoint) => [endpoint.id, endpoint]));
|
|
10
|
+
const resourceIds = [...new Set(endpoints_1.DIGISAC_ENDPOINTS.map((endpoint) => endpoint.resource))];
|
|
11
|
+
function endpointsForResource(resource) {
|
|
12
|
+
return endpoints_1.DIGISAC_ENDPOINTS.filter((endpoint) => endpoint.resource === resource);
|
|
13
|
+
}
|
|
14
|
+
exports.resourceOptions = resourceIds
|
|
15
|
+
.map((resource) => {
|
|
16
|
+
const first = endpointsForResource(resource)[0];
|
|
17
|
+
return {
|
|
18
|
+
name: first.resourceName,
|
|
19
|
+
value: resource,
|
|
20
|
+
description: `${first.resourceDescription} Includes ${endpointsForResource(resource).length} documented API call(s).`,
|
|
21
|
+
};
|
|
22
|
+
})
|
|
23
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
24
|
+
function operationDescription(endpoint) {
|
|
25
|
+
const parts = [
|
|
26
|
+
`${endpoint.method} ${endpoint.pathTemplate || endpoint.rawUrl}.`,
|
|
27
|
+
`Source: ${endpoint.sourcePath}.`,
|
|
28
|
+
];
|
|
29
|
+
if (endpoint.pathParams.length) {
|
|
30
|
+
parts.push(`Required path parameters: ${endpoint.pathParams.join(', ')}.`);
|
|
31
|
+
}
|
|
32
|
+
if (endpoint.queryParams.length) {
|
|
33
|
+
parts.push(`Documented query placeholders: ${endpoint.queryParams.join(', ')}.`);
|
|
34
|
+
}
|
|
35
|
+
if (endpoint.queryTemplate) {
|
|
36
|
+
parts.push(`Documented query template: ${(0, format_1.compactDescription)(endpoint.queryTemplate, 260)}.`);
|
|
37
|
+
}
|
|
38
|
+
if (endpoint.hasBody) {
|
|
39
|
+
parts.push('Send JSON in Request Body JSON. Use IDs returned by list/get operations; do not invent IDs.');
|
|
40
|
+
}
|
|
41
|
+
if (endpoint.absoluteUrlVariable) {
|
|
42
|
+
parts.push('This operation calls the absolute webhook URL supplied in the operation field.');
|
|
43
|
+
}
|
|
44
|
+
return parts.join(' ');
|
|
45
|
+
}
|
|
46
|
+
function operationProperties() {
|
|
47
|
+
return resourceIds.map((resource) => {
|
|
48
|
+
const endpoints = endpointsForResource(resource);
|
|
49
|
+
return {
|
|
50
|
+
displayName: 'Operation',
|
|
51
|
+
name: 'operation',
|
|
52
|
+
type: 'options',
|
|
53
|
+
noDataExpression: true,
|
|
54
|
+
displayOptions: { show: { resource: [resource] } },
|
|
55
|
+
options: endpoints.map((endpoint) => ({
|
|
56
|
+
name: endpoint.operationName,
|
|
57
|
+
value: endpoint.id,
|
|
58
|
+
action: `${endpoint.method} ${endpoint.operationName}`.slice(0, 128),
|
|
59
|
+
description: operationDescription(endpoint),
|
|
60
|
+
})),
|
|
61
|
+
default: endpoints[0]?.id ?? '',
|
|
62
|
+
description: 'The exact Digisac API call from the selected Postman folder. Descriptions include method, path, required path variables and query/body guidance for AI Agents.',
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function pathParameterProperties() {
|
|
67
|
+
return endpoints_1.DIGISAC_ENDPOINTS.flatMap((endpoint) => endpoint.pathParams.map((parameter) => ({
|
|
68
|
+
displayName: (0, format_1.toTitle)(parameter),
|
|
69
|
+
name: (0, format_1.fieldName)('path', endpoint.id, parameter),
|
|
70
|
+
type: 'string',
|
|
71
|
+
required: true,
|
|
72
|
+
default: '',
|
|
73
|
+
displayOptions: { show: { operation: [endpoint.id] } },
|
|
74
|
+
description: `Required path parameter "{{${parameter}}}" for ${endpoint.method} ${endpoint.pathTemplate}. Use the exact ID/value returned by Digisac; do not invent this value.`,
|
|
75
|
+
})));
|
|
76
|
+
}
|
|
77
|
+
function queryPlaceholderProperties() {
|
|
78
|
+
return endpoints_1.DIGISAC_ENDPOINTS.flatMap((endpoint) => endpoint.queryParams.map((parameter) => ({
|
|
79
|
+
displayName: `Query: ${(0, format_1.toTitle)(parameter)}`,
|
|
80
|
+
name: (0, format_1.fieldName)('query', endpoint.id, parameter),
|
|
81
|
+
type: 'string',
|
|
82
|
+
default: '',
|
|
83
|
+
displayOptions: { show: { operation: [endpoint.id] } },
|
|
84
|
+
description: `Optional value for documented query placeholder "{{${parameter}}}" in ${endpoint.method} ${endpoint.pathTemplate}. Leave empty and use Additional Query Parameters JSON for complex query objects.`,
|
|
85
|
+
})));
|
|
86
|
+
}
|
|
87
|
+
function absoluteUrlProperties() {
|
|
88
|
+
return endpoints_1.DIGISAC_ENDPOINTS.filter((endpoint) => endpoint.absoluteUrlVariable).map((endpoint) => ({
|
|
89
|
+
displayName: 'Absolute URL',
|
|
90
|
+
name: (0, format_1.fieldName)('absoluteUrl', endpoint.id, endpoint.absoluteUrlVariable),
|
|
91
|
+
type: 'string',
|
|
92
|
+
required: true,
|
|
93
|
+
default: '',
|
|
94
|
+
displayOptions: { show: { operation: [endpoint.id] } },
|
|
95
|
+
description: 'Full URL to call for this documented operation. Used by the Postman collection for webhook test calls that are outside the normal Digisac Base URL.',
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
const bodyOperationIds = endpoints_1.DIGISAC_ENDPOINTS.filter((endpoint) => endpoint.hasBody).map((endpoint) => endpoint.id);
|
|
99
|
+
exports.resourceProperties = [
|
|
100
|
+
...operationProperties(),
|
|
101
|
+
...absoluteUrlProperties(),
|
|
102
|
+
...pathParameterProperties(),
|
|
103
|
+
...queryPlaceholderProperties(),
|
|
104
|
+
{
|
|
105
|
+
displayName: 'Additional Query Parameters JSON',
|
|
106
|
+
name: 'additionalQueryParameters',
|
|
107
|
+
type: 'json',
|
|
108
|
+
default: '{}',
|
|
109
|
+
description: 'Optional JSON object merged into the query string. Use this for filters such as {"perPage": 40}, nested Digisac query objects as {"query": {"where": {"contactId": "..."}}}, or any documented query not represented by a dedicated field.',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
displayName: 'Request Body JSON',
|
|
113
|
+
name: 'bodyJson',
|
|
114
|
+
type: 'json',
|
|
115
|
+
default: '{}',
|
|
116
|
+
displayOptions: { show: { operation: bodyOperationIds } },
|
|
117
|
+
description: 'JSON body sent to Digisac for this POST, PUT or PATCH operation. Use field names exactly as Digisac expects. IDs should come from list/get operations, not from guesses.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
displayName: 'Options',
|
|
121
|
+
name: 'options',
|
|
122
|
+
type: 'collection',
|
|
123
|
+
placeholder: 'Add Option',
|
|
124
|
+
default: {},
|
|
125
|
+
options: [
|
|
126
|
+
{
|
|
127
|
+
displayName: 'Include Static Query Parameters From Docs',
|
|
128
|
+
name: 'includeDocumentedQuery',
|
|
129
|
+
type: 'boolean',
|
|
130
|
+
default: true,
|
|
131
|
+
description: 'Whether to include static query parameters already present in the Postman URL, such as perPage=40',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
displayName: 'Response Format',
|
|
135
|
+
name: 'responseFormat',
|
|
136
|
+
type: 'options',
|
|
137
|
+
options: [
|
|
138
|
+
{
|
|
139
|
+
name: 'JSON',
|
|
140
|
+
value: 'json',
|
|
141
|
+
description: 'Parse response as JSON. Best for normal Digisac API operations.',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'Text',
|
|
145
|
+
value: 'text',
|
|
146
|
+
description: 'Return response as text. Useful for CSV/TXT/PDF export endpoints.',
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
default: 'json',
|
|
150
|
+
description: 'How to read the response. Use Text for export endpoints if the response is not JSON.',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
displayName: 'Skip Unresolved Documented Query Placeholders',
|
|
154
|
+
name: 'skipUnresolvedQueryPlaceholders',
|
|
155
|
+
type: 'boolean',
|
|
156
|
+
default: true,
|
|
157
|
+
description: 'Whether to omit documented query parameters that still contain placeholders like {{serviceId}}. Keep enabled unless you intentionally want to send raw placeholders.',
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
function endpointOrThrow(node, operation) {
|
|
163
|
+
const endpoint = endpointsById.get(operation);
|
|
164
|
+
if (!endpoint) {
|
|
165
|
+
throw new n8n_workflow_1.NodeOperationError(node.getNode(), `The Digisac operation "${operation}" is not supported`);
|
|
166
|
+
}
|
|
167
|
+
return endpoint;
|
|
168
|
+
}
|
|
169
|
+
function collectValues(node, i, endpoint, prefix, parameters) {
|
|
170
|
+
const values = {};
|
|
171
|
+
for (const parameter of parameters) {
|
|
172
|
+
const name = (0, format_1.fieldName)(prefix, endpoint.id, parameter);
|
|
173
|
+
const value = node.getNodeParameter(name, i, '');
|
|
174
|
+
if (value !== '') {
|
|
175
|
+
values[parameter] = value;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return values;
|
|
179
|
+
}
|
|
180
|
+
function buildEndpointPath(node, i, endpoint) {
|
|
181
|
+
const values = collectValues(node, i, endpoint, 'path', endpoint.pathParams);
|
|
182
|
+
const path = (0, format_1.replaceTemplateVariables)(endpoint.pathTemplate, values);
|
|
183
|
+
if (path.includes('{{')) {
|
|
184
|
+
throw new n8n_workflow_1.NodeOperationError(node.getNode(), `Missing required path parameter for ${endpoint.method} ${endpoint.pathTemplate}`, { itemIndex: i });
|
|
185
|
+
}
|
|
186
|
+
return path;
|
|
187
|
+
}
|
|
188
|
+
function buildQuery(node, i, endpoint) {
|
|
189
|
+
const options = node.getNodeParameter('options', i, {});
|
|
190
|
+
const includeDocumentedQuery = options.includeDocumentedQuery !== false;
|
|
191
|
+
const skipUnresolved = options.skipUnresolvedQueryPlaceholders !== false;
|
|
192
|
+
const queryValues = collectValues(node, i, endpoint, 'query', endpoint.queryParams);
|
|
193
|
+
const documentedQuery = includeDocumentedQuery
|
|
194
|
+
? (0, format_1.queryStringToObject)((0, format_1.replaceTemplateVariables)(endpoint.queryTemplate, queryValues), Boolean(skipUnresolved))
|
|
195
|
+
: {};
|
|
196
|
+
const additional = (0, format_1.parseJsonParameter)(node.getNodeParameter('additionalQueryParameters', i, '{}'), 'Additional Query Parameters JSON', node.getNode());
|
|
197
|
+
return { ...documentedQuery, ...additional };
|
|
198
|
+
}
|
|
199
|
+
function buildBody(node, i, endpoint) {
|
|
200
|
+
if (!endpoint.hasBody) {
|
|
201
|
+
return {};
|
|
202
|
+
}
|
|
203
|
+
return (0, format_1.parseJsonParameter)(node.getNodeParameter('bodyJson', i, '{}'), 'Request Body JSON', node.getNode(), true);
|
|
204
|
+
}
|
|
205
|
+
function getAbsoluteUrl(node, i, endpoint) {
|
|
206
|
+
if (!endpoint.absoluteUrlVariable) {
|
|
207
|
+
return '';
|
|
208
|
+
}
|
|
209
|
+
return node.getNodeParameter((0, format_1.fieldName)('absoluteUrl', endpoint.id, endpoint.absoluteUrlVariable), i, '');
|
|
210
|
+
}
|
|
211
|
+
function normalizeResponse(response, responseFormat) {
|
|
212
|
+
if (responseFormat === 'text') {
|
|
213
|
+
return { data: typeof response === 'string' ? response : JSON.stringify(response) };
|
|
214
|
+
}
|
|
215
|
+
return response;
|
|
216
|
+
}
|
|
217
|
+
async function executeEndpoint(operation, i) {
|
|
218
|
+
const endpoint = endpointOrThrow(this, operation);
|
|
219
|
+
const options = this.getNodeParameter('options', i, {});
|
|
220
|
+
const responseFormat = options.responseFormat ?? 'json';
|
|
221
|
+
const endpointPath = buildEndpointPath(this, i, endpoint);
|
|
222
|
+
const qs = buildQuery(this, i, endpoint);
|
|
223
|
+
const body = buildBody(this, i, endpoint);
|
|
224
|
+
const absoluteUrl = getAbsoluteUrl(this, i, endpoint);
|
|
225
|
+
const response = await transport_1.digisacApiRequest.call(this, endpoint.method, endpointPath, body, qs, {
|
|
226
|
+
baseVariable: endpoint.baseVariable,
|
|
227
|
+
absoluteUrl,
|
|
228
|
+
responseFormat,
|
|
229
|
+
});
|
|
230
|
+
return normalizeResponse(response, responseFormat);
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../nodes/Digisac/actions/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Digisac">
|
|
2
|
+
<rect width="64" height="64" rx="12" fill="#E8FFFB"/>
|
|
3
|
+
<path d="M18 18h20c8.8 0 16 7.2 16 16s-7.2 16-16 16H18V18zm10 10v12h10a6 6 0 0 0 0-12H28z" fill="#04716D"/>
|
|
4
|
+
<circle cx="38" cy="34" r="3" fill="#E8FFFB"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Digisac">
|
|
2
|
+
<rect width="64" height="64" rx="12" fill="#0B8F8A"/>
|
|
3
|
+
<path d="M18 18h20c8.8 0 16 7.2 16 16s-7.2 16-16 16H18V18zm10 10v12h10a6 6 0 0 0 0-12H28z" fill="#FFFFFF"/>
|
|
4
|
+
<circle cx="38" cy="34" r="3" fill="#0B8F8A"/>
|
|
5
|
+
</svg>
|