n8n-nodes-dvelop 1.0.3

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 ADDED
@@ -0,0 +1,791 @@
1
+ # @dvelop/n8n-nodes-dvelop
2
+
3
+ This is an n8n community node. It lets you use _app/service name_ in your n8n workflows.
4
+ This is a community node and not affiliated with n8n GmbH. Use at your own risk.
5
+
6
+ This project provides a gateway for hyperautomation by enabling seamless integration between the d.velop platform (https://www.d-velop.de) and external applications using n8n. The d.velop actions Node allows users to execute d.velop actions directly within n8n workflows, making it possible to automate document management, user operations, and custom process integrations. This enables powerful, flexible, and scalable automation across the entire d.velop ecosystem.
7
+
8
+ [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/sustainable-use-license/) workflow automation platform.
9
+
10
+ [Installation](#installation)
11
+ [Operations](#operations)
12
+ [Credentials](#credentials)
13
+ [Documentation](#documentation)
14
+ [Compatibility](#compatibility)
15
+ [Resources](#resources)
16
+
17
+ ## 1. Installation
18
+
19
+ Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
20
+
21
+ ## 2. Operations
22
+
23
+ - Download documents automatically
24
+ - Import documents automatically to the DMS
25
+ - Retrieve the metadata from documents
26
+ - Retrieve user information
27
+
28
+ ## 3. Credentials
29
+
30
+ For every Action Node you want to execute, you need to have your credentials set up. Without them, the API would not have the required information to execute calls.
31
+
32
+ <img width="1312" height="746" alt="image" src="https://github.com/user-attachments/assets/fe0a35f7-6bc2-4837-a995-02426ab822e5" />
33
+
34
+ **3.1 Base URL**
35
+
36
+ - This is just the Base URL of your instance, marked in blue (don't copy the last /)
37
+
38
+ <img width="600" height="41" alt="image" src="https://github.com/user-attachments/assets/2e89a2b6-0387-4ab9-8891-3c4090b817f0" />
39
+
40
+ **3.2 Authentication Method**
41
+
42
+ - The Bearer Token is nothing else except the API key you can find in the d.velop instance configuration, under Login -> API key
43
+ - There you have to create an API key. Keep in mind that the key only shows once, therefore you should save the key somewhere safe. Also keep this key for yourself and do **NOT** hand it out.
44
+
45
+ **3.3 Allowed HTTP Request**
46
+
47
+ - For the node to work you need to allow the HTTP requests.
48
+
49
+ ## 4. Documentation
50
+
51
+ To use this node in a workflow you need to open the **Nodes Panel** and search for _d.velop Actions_
52
+
53
+ ---
54
+
55
+ **4.1 Pick an Action Mode**
56
+
57
+ - Here you can choose between 4 stable actions or your volatile actions.
58
+
59
+ <img width="564" height="356" alt="image" src="https://github.com/user-attachments/assets/1ec54de7-e1f5-4294-9212-d784db8ac2dd" />
60
+
61
+ ---
62
+
63
+ **4.2 Stable Actions**
64
+
65
+ Stable actions are predefined, and they will always be the same.
66
+
67
+ They are the standard features such as:
68
+
69
+ - Download a document
70
+ - Get document info
71
+ - Get user info
72
+ - Import document
73
+
74
+ ---
75
+
76
+ **4.3 Volatile Actions**
77
+
78
+ - Volatile actions aren't predefined and differ from d.velop user to user. They are actions that are not hard-coded and aren't a standard.
79
+ - These actions can also be created in the Process Studio script tab, and can be used in this node.
80
+
81
+ As an example:
82
+
83
+ <img width="431" height="272" alt="image" src="https://github.com/user-attachments/assets/1cdbbc41-5fc8-4e31-9fef-df1055f0b2ab" />
84
+
85
+ - Those are standard volatile Salesforce actions, and the Hello_World action is a script from the Process Studio.
86
+ - These actions are dynamic and the payload that they carry isn't displayed.
87
+
88
+ ---
89
+
90
+ ## 5. Stable Actions in Detail
91
+
92
+ This is going to showcase how the stable Actions work in detail.
93
+
94
+ ---
95
+
96
+ **5.1 Download Document**
97
+
98
+ - To set up the download node manually, you just need to fill in the mandatory fields and you are ready to download the file.
99
+
100
+ <img width="461" height="486" alt="image" src="https://github.com/user-attachments/assets/befacd4b-82ea-49f7-a901-d0096416a674" />
101
+
102
+ - To find out what the _Repository_ string and the _Document_ID_ are, you need to open the document and copy the marked section.
103
+
104
+ <img width="1226" height="708" alt="Download_Document" src="https://github.com/user-attachments/assets/ea17fb6d-8fae-4bc9-937d-825eb2a40349" />
105
+
106
+ - The output will be displayed on the right side of the node.
107
+
108
+ <img width="660" height="353" alt="image" src="https://github.com/user-attachments/assets/22da756b-d62f-4be9-b69d-5524355a9068" />
109
+
110
+ **5.1.2 Workflow**
111
+
112
+ <img width="2346" height="766" alt="image" src="https://github.com/user-attachments/assets/c2d338be-17e8-4770-8382-1ba075ea4538" />
113
+
114
+ **_Webhook_**
115
+
116
+ A webhook listens for responses from the Discord bot that has been set up. If the user requests a document, he can fulfill three parameters, two of which are mandatory.
117
+
118
+ - Document ID:
119
+ - Repository
120
+ - Email (optional).
121
+
122
+ **_AI-Agent_**
123
+
124
+ - The Agent connected to the Ollama Chat Model is trained to convert these inputs into a string and filter out the important information.
125
+ - The agent received the following prompt:
126
+
127
+ ```bash
128
+ You are a strict extraction engine.
129
+
130
+ Your only task is to extract two or three values from the user message:
131
+
132
+ - repositoryId
133
+ - documentId
134
+ - Email
135
+ Rules:
136
+
137
+ - Output ONLY valid JSON.
138
+ - No explanations.
139
+ - No markdown.
140
+ - No extra text.
141
+ - Always output both keys.
142
+ - If a value is missing, use null.
143
+ - Never invent values.
144
+ - Extract exact values only from the input.
145
+
146
+ Output format:
147
+
148
+ {
149
+ "repositoryId": "...",
150
+ "documentId": "...",
151
+ "email": "..."
152
+ }
153
+ ```
154
+
155
+ **_Code in Java Script_**
156
+ This is a compact code node for custom JavaScript. The node's content is as follows:
157
+
158
+ ```bash
159
+ const parsed = JSON.parse($json.output);
160
+
161
+ return [
162
+ {
163
+ json: parsed
164
+ }
165
+ ];
166
+ ```
167
+
168
+ This small code block is responsible for parsing the string into individual objects. Therefore, they can be used subsequently.
169
+
170
+ **_d.velop Actions - Download Document_**
171
+
172
+ - This action facilitates the download of the document using the _repository_ and _document ID_.
173
+ - Please note that neither of these is set manually, they are both set using a simple JavaScript expression.
174
+
175
+ <img width="507" height="239" alt="image" src="https://github.com/user-attachments/assets/494a7f5e-4ef2-43d5-ab9f-9527a5c95cea" />
176
+
177
+ **_IF-Statment_**
178
+
179
+ - The IF statement is used to determine whether an email is given.
180
+
181
+ <img width="884" height="312" alt="image" src="https://github.com/user-attachments/assets/616035c5-97bb-4bc6-b677-45d71f43d450" />
182
+
183
+ ***Send a Message - Email = True***
184
+
185
+ - The truePath system will send an email when an email exists, containing the data from the d.velop action.
186
+
187
+ <img width="754" height="1102" alt="image" src="https://github.com/user-attachments/assets/c4106c48-57ff-430e-b817-4f7eca3077fb" />
188
+
189
+ - If the email is successful, the user will receive a Discord verification message confirming the request.
190
+
191
+ **_Send a Message - Email = False_**
192
+
193
+ - This simply delegates the email aspect, ensuring that the message is transmitted directly to the intended Discord user.
194
+
195
+ ---
196
+
197
+ **5.2. Get Document Info**
198
+
199
+ This action shows all the Information the Document has attached to it, for example:
200
+
201
+ - Document ID
202
+ - Document Location (URL)
203
+ - Self Link
204
+ - Delete Link
205
+ - Main content Link
206
+ - PDF Content Link
207
+ - Update Link
208
+ - Update with Content Link
209
+ - Versions Link
210
+ - LAs Modified Date
211
+ - Last Alteration Date
212
+ - Editor ID
213
+ - Editor Name
214
+ - Owner ID
215
+ - Owner Name
216
+ - Document CAption
217
+ - File Name
218
+ - File Type
219
+ - Fike MINE Type
220
+ - Document Number
221
+ - Creation Date
222
+ - File Size
223
+ - Document State
224
+ - Variant Number
225
+ - Last Access Date
226
+ - Document Categoty ID
227
+ - Documnet Category Name
228
+ - Retenition Date
229
+ - Custom Properties
230
+ - Source Categories
231
+
232
+ **5.2.1 Setting up the Action**
233
+
234
+ - To setup the Node manually, you just need to fill in the mandatory fields and you are ready to get the Document Info.
235
+
236
+ <img width="577" height="501" alt="image" src="https://github.com/user-attachments/assets/54410412-5425-4aeb-addf-82db00a9c6ce" />
237
+
238
+ - To find out what the _Repository_ string is, you need to open the Document you want to get the Information from, via. the n8n node and copy the red Marked Link section.
239
+
240
+ - To identify the _Document ID_ you can, open te Details and Look for Document_Nr. This is also circled with a rectangle
241
+
242
+ <img width="1226" height="708" alt="Download_Document" src="https://github.com/user-attachments/assets/ea17fb6d-8fae-4bc9-937d-825eb2a40349" />
243
+
244
+ - The output will be Display in the Rightside of the Node:
245
+
246
+ <img width="1401" height="878" alt="image" src="https://github.com/user-attachments/assets/360cf720-a709-47a9-a1ab-2b681ced2c20" />
247
+
248
+ - This is a lot of JSON, so the whole Output wont be shown.
249
+
250
+ **5.2.2 Workflow**
251
+
252
+ <img width="3247" height="979" alt="image" src="https://github.com/user-attachments/assets/3a46e88f-11be-48e9-91a9-d9028e5e28b4" />
253
+
254
+ **_Webhook_**
255
+
256
+ A webhook listens for responses from the Discord bot that has been set up. If the user requests a document, he can fulfill three parameters, two of which are mandatory.
257
+
258
+ - Document ID:
259
+ - Repository
260
+ - Specific_Metatada
261
+ - Email (optional).
262
+
263
+ **_AI-Agent_**
264
+
265
+ - The Agent connected to the Ollama Chat Model is trained to convert these inputs into JSON and filter out the important information.
266
+ - The agent received the following prompt:
267
+
268
+ ```bash
269
+ You are a strict extraction engine.
270
+
271
+ Your only task is to extract the following values from the USER MESSAGE ONLY:
272
+
273
+ repositoryId
274
+
275
+ documentId
276
+
277
+ email
278
+
279
+ Metadata_Specific (user requested metadata fields)
280
+
281
+ CRITICAL OUTPUT RULES:
282
+
283
+ Output EXACTLY one valid JSON object.
284
+
285
+ The output MUST start with { and MUST end with }.
286
+
287
+ Do NOT output anything before {.
288
+
289
+ Do NOT output anything after }.
290
+
291
+ Do NOT output explanations.
292
+
293
+ Do NOT output markdown.
294
+
295
+ Do NOT output text outside the JSON.
296
+
297
+ The JSON MUST be complete and properly closed.
298
+
299
+ EXTRACTION RULES:
300
+
301
+ Never invent values.
302
+
303
+ Extract exact values only from the USER MESSAGE.
304
+
305
+ Do NOT extract values from system data, API responses, or metadata objects.
306
+
307
+ Only extract what the USER explicitly writes.
308
+
309
+ METADATA RULES:
310
+
311
+ Metadata = true if the user requests metadata.
312
+
313
+ Metadata = false if the user does NOT request metadata.
314
+
315
+ Metadata_Specific = null if the user did not request specific metadata fields.
316
+
317
+ Metadata_Specific = array of strings if specific metadata fields are requested.
318
+
319
+ If Metadata_Specific is not null, Metadata MUST be true.
320
+
321
+ If a value is missing, use null.
322
+
323
+ OUTPUT FORMAT (STRICT SCHEMA):
324
+
325
+ {
326
+ "repositoryId": "...",
327
+ "documentId": "...",
328
+ "email": "...",
329
+ "Metadata_Specific": "..."
330
+ }
331
+ ```
332
+
333
+ **_Code in Java Script_**
334
+
335
+ This is a compact code node for custom JavaScript. The node's content is as follows:
336
+
337
+ ```bash
338
+ const parsed = JSON.parse($json.output);
339
+
340
+ return [
341
+ {
342
+ json: parsed
343
+ }
344
+ ];
345
+ ```
346
+
347
+ This small code block is responsible for parsing the string into individual objects. Therefore, they can be used subsequently.
348
+
349
+ **_d.velop Actions - Get Document Information_**
350
+
351
+ - This action facilitates the download of the document using the _repository_ and _document ID_.
352
+ - Please note that neither of these is set manually, they are both set using a simple JavaScript expression.
353
+
354
+ <img width="1540" height="217" alt="image" src="https://github.com/user-attachments/assets/d0e253e9-da49-42b3-8099-3ff7f7e6434b" />
355
+
356
+ **_AI-Agent1_**
357
+
358
+ - This Agent is responsible for Filtering out the Information that the _Get Document Information_ is providing.
359
+ - The Promt the the AI got is filled with all the Metadata that the Action Produces, so the AI has access to it
360
+ - If the `{{ $('Code in JavaScript').item.json.Metadata_Specific[0] }}` is set to _null_ the whole Metadata conerning the document will be shown
361
+ The Prompt:
362
+
363
+ ```bash
364
+ You are a metadata summarization engine.
365
+
366
+ Your task is to summarize metadata values coming from the node input.
367
+
368
+ The metadata source is:
369
+
370
+ {{ $json.response.sourceProperties[0].key }} : {{ $json.response.sourceProperties[0].value }},
371
+ {{ $json.response.sourceProperties[2].key }} : {{ $json.response.sourceProperties[2].displayValue }},
372
+ {{ $json.response.sourceProperties[3].key }} : {{ $json.response.sourceProperties[3].value }},
373
+ {{ $json.response.sourceProperties[4].key }} : {{ $json.response.sourceProperties[4].value }},
374
+ {{ $json.response.sourceProperties[5].key }} : {{ $json.response.sourceProperties[5].value }},
375
+ {{ $json.response.sourceProperties[6].key }} : {{ $json.response.sourceProperties[6].value }},
376
+ {{ $json.response.sourceProperties[7].key }} : {{ $json.response.sourceProperties[7].value }},
377
+ {{ $json.response.sourceProperties[8].key }} : {{ $json.response.sourceProperties[8].value }},
378
+ {{ $json.response.sourceProperties[9].key }} : {{ $json.response.sourceProperties[9].value }},
379
+ {{ $json.response.sourceProperties[10].key }} : {{ $json.response.sourceProperties[10].value }},
380
+ {{ $json.response.sourceProperties[11].key }} : {{ $json.response.sourceProperties[11].value }},
381
+ {{ $json.response.sourceProperties[12].key }} : {{ $json.response.sourceProperties[12].value }},
382
+ {{ $json.response.sourceProperties[13].key }} : {{ $json.response.sourceProperties[13].value }},
383
+ {{ $json.response.sourceProperties[14].key }} : {{ $json.response.sourceProperties[14].value }},
384
+ {{ $json.response.sourceProperties[15].key }} : {{ $json.response.sourceProperties[15].value }},
385
+ {{ $json.response.sourceProperties[16].key }} : {{ $json.response.sourceProperties[16].value }},
386
+ {{ $json.response.sourceProperties[17].key }} : {{ $json.response.sourceProperties[17].value }},
387
+ {{ $json.response.sourceProperties[18].key }} : {{ $json.response.sourceProperties[18].value }},
388
+ {{ $json.response.sourceProperties[19].key }} : {{ $json.response.sourceProperties[19].displayValue }},
389
+ {{ $json.response.sourceProperties[20].key }} : {{ $json.response.sourceProperties[20].value }},
390
+ {{ $json.response.sourceProperties[21].key }} : {{ $json.response.sourceProperties[21].value }},
391
+ {{ $json.response.sourceProperties[22].key }} : {{ $json.response.sourceProperties[22].value }},
392
+ {{ $json.response.sourceProperties[23].key }} : {{ $json.response.sourceProperties[23].value }};
393
+
394
+ User requested specific metadata:
395
+
396
+ {{ $('Code in JavaScript').item.json.Metadata_Specific }}
397
+
398
+ Rules:
399
+ If Metdata is = null : {{ $('Code in JavaScript').item.json.Metadata_Specific[0] }}
400
+ Print out Everything
401
+
402
+
403
+ If Metadata_Specific is set: {{ $('Code in JavaScript').item.json.Metadata_Specific[0] }}
404
+
405
+ Only summarize the requested metadata fields.
406
+
407
+ Ignore all other metadata.
408
+
409
+ If Metadata_Specific is null:
410
+
411
+ Summarize ALL metadata fields.
412
+
413
+ Only use the metadata provided above.
414
+
415
+ Do NOT invent metadata.
416
+
417
+ Do NOT explain anything.
418
+
419
+
420
+
421
+ Output only the summary.
422
+ ```
423
+
424
+ **_IF-Statment_**
425
+
426
+ - The IF statement is used to determine whether an email is given.
427
+
428
+ <img width="884" height="312" alt="image" src="https://github.com/user-attachments/assets/616035c5-97bb-4bc6-b677-45d71f43d450" />
429
+
430
+ ***Send a Message - Email = True***
431
+
432
+ - The truePath system will send an email when an email exists, containing the data from Agents Output.
433
+
434
+ <img width="768" height="705" alt="image" src="https://github.com/user-attachments/assets/38c78569-f2ab-406d-aaab-fa943bef0641" />
435
+
436
+ - If the email is successful, the user will receive a Discord verification message confirming the request.
437
+
438
+ <img width="1472" height="199" alt="image" src="https://github.com/user-attachments/assets/e884ae8e-6656-447b-b8d5-fd912bac9f9b" />
439
+
440
+ **_Send a Message - Email = False_**
441
+
442
+ - This simply delegates the email aspect, ensuring that the message is transmitted directly to the intended Discord user.
443
+
444
+ **5.3. Get User Info**
445
+
446
+ This action displays all the information associated with the user. Please find below a list of all the functions that this action returns:
447
+
448
+ - getUserId – Returns the unique internal user ID
449
+ - getExternalId – Returns the external user ID (if available)
450
+ - getUserName – Returns the user's login username
451
+ - getDisplayName – Returns the user's full display name
452
+ - getGivenName – Returns the user's first name
453
+ - getFamilyName – Returns the user's last name
454
+ - getFormattedName – Returns the user's formatted full name
455
+ - getPrimaryEmail – Returns the user's primary email address
456
+ - getEmails – Returns all email addresses of the user
457
+ - getProfileUrl – Returns the user's profile URL
458
+ - getUserTitle – Returns the user's job title or position
459
+ - getPhotos – Returns the user's profile photo information
460
+ - getPhoneNumbers – Returns the user's phone numbers
461
+ - getGroups – Returns all groups the user belongs to
462
+ - getGroupIds – Returns the IDs of the user's groups
463
+ - getGroupDisplayNames – Returns the names of the user's groups
464
+
465
+ **5.3.1 Setting up the Action**
466
+
467
+ - To set this Action up you just need the User_ID.
468
+
469
+ <img width="580" height="421" alt="image" src="https://github.com/user-attachments/assets/21f70d38-d286-4653-b31a-b240af5f15fc" />
470
+
471
+ - To Acquire the User_ID of a DMS User, you need to go in to the Configuration -> Administration -> User account and group management
472
+ - From there you just need to click the User you want the ID From, and Copy the red marked section from the URL
473
+
474
+ <img width="1047" height="781" alt="Screenshot 2026-02-19 110016" src="https://github.com/user-attachments/assets/ddb2a6bb-e8cd-48ec-ac35-dce8445d0b8a" />
475
+
476
+ The output will be Displayed on the Output Tab:
477
+
478
+ <img width="1365" height="1142" alt="image" src="https://github.com/user-attachments/assets/6311374e-0825-42fd-bb55-cb9887a3128f" />
479
+
480
+ **5.3.2 Workflow**
481
+
482
+ - This Workflow is a bit bigger and also Includes 2 Other Actions and a d.velop custom API Call. The _Get User Info_ Action cant be utilized to demonstrate a good Usecase alone.
483
+ Senariao:
484
+
485
+ If a User of the DMS Wants to download a specific Document, the Owner of that Document gets a E-Mail. To Approve or denie the Download request.
486
+
487
+ <img width="2956" height="557" alt="image" src="https://github.com/user-attachments/assets/befc8b7b-da82-4a9d-935e-d3e1d165fd4a" />
488
+
489
+ **_Webhook_**
490
+
491
+ A webhook listens for responses from the Discord bot that has been set up. If the user requests a document, he can fulfill 2 parameters, both of them are mandatory:
492
+
493
+ - Document ID
494
+ - Repository
495
+
496
+ **_AI-Agent_**
497
+
498
+ - The Agent connected to the Ollama Chat Model is trained to convert these inputs into a string and filter out the important information.
499
+ - The agent received the following prompt:
500
+
501
+ ```bash
502
+ You are a strict extraction engine.
503
+
504
+ Your only task is to extract two or three values from the user message:
505
+
506
+ - repositoryId
507
+ - documentId
508
+ Rules:
509
+
510
+ - Output ONLY valid JSON.
511
+ - No explanations.
512
+ - No markdown.
513
+ - No extra text.
514
+ - Always output both keys.
515
+ - If a value is missing, use null.
516
+ - Never invent values.
517
+ - Extract exact values only from the input.
518
+
519
+ Output format:
520
+
521
+ {
522
+ "repositoryId": "...",
523
+ "documentId": "...",
524
+ }
525
+ ```
526
+
527
+ **_Code in Java Script_**
528
+ This is a compact code node for custom JavaScript. The node's content is as follows:
529
+
530
+ ```bash
531
+ const parsed = JSON.parse($json.output);
532
+
533
+ return [
534
+ {
535
+ json: parsed
536
+ }
537
+ ];
538
+ ```
539
+
540
+ This small code block is responsible for parsing the string into individual objects. Therefore, they can be used subsequently.
541
+
542
+ **_d.velop Actions - Get Document Info_**
543
+
544
+ - Here the repository and the Document ID's are enterd with a Statment
545
+ - This node is Important because here you can get the DisplayValue from the Document Owner. This will be Utalised in the netxt node
546
+
547
+ <img width="764" height="512" alt="image" src="https://github.com/user-attachments/assets/71184366-cf57-419a-baf5-fbf6512bedfd" />
548
+
549
+ **_HTTP-Request_**
550
+
551
+ - THis node is Basicly just a Custom api Call to the identityprivider API
552
+ - The Variable is the Name of the Document Owner
553
+
554
+ ```bash
555
+ https://connect-for-n8n-test.d-velop.cloud/identityprovider/scim/users?filter=DisplayName eq "{{ $json.response.sourceProperties[2].displayValue }}"
556
+ ```
557
+
558
+ <img width="582" height="798" alt="image" src="https://github.com/user-attachments/assets/89d28697-57cb-4672-ba8d-975a056bb07a" />
559
+
560
+ - If you run this call, you can get the ID, of the Document Owner
561
+
562
+ **_d.velop Actions - Get User Info_**
563
+
564
+ - In this Node the User_ID is being user to get the E-Mail from the Document Owner
565
+
566
+ <img width="506" height="437" alt="image" src="https://github.com/user-attachments/assets/0aa9cc64-2108-4bc3-a314-88c36e42a3e2" />
567
+
568
+ **_G-Mail Send a Message_**
569
+
570
+ - With the E-Mail we got from the _Get User Info_ Action, we now can send a Approve request to the Document Owner
571
+ - Tis E-Mail also Displays who is Requesting this Document
572
+
573
+ <img width="495" height="698" alt="image" src="https://github.com/user-attachments/assets/7d2a6769-4a80-4b18-8544-f64527e4dc48" />
574
+
575
+ **_IF True - Approved_**
576
+
577
+ - If the Document Owner Approved the download the Workflow procceds to Download the Document using the _Download Document_ Action.
578
+
579
+ <img width="500" height="560" alt="image" src="https://github.com/user-attachments/assets/33d896c6-4f6e-47eb-86f6-133d3e5c3d05" />
580
+
581
+ - And the Discord Bot replies to the User who sent the request with the File attatched to the Message.
582
+
583
+ <img width="492" height="1034" alt="image" src="https://github.com/user-attachments/assets/5f09b25d-80b0-418f-9fd7-6f7b6e761129" />
584
+
585
+ **_IF False - Denied_**
586
+
587
+ - If the Download Request was denied by the Owner, the bot sends a message that you request was denied.
588
+
589
+ <img width="496" height="691" alt="image" src="https://github.com/user-attachments/assets/d8e9a75d-aae9-41fd-89a5-5297dc30d144" />
590
+
591
+ ---
592
+
593
+ **5.4. Import Document**
594
+
595
+ This Action Allows you to Upload files directly to your DMS, using d.velop Inbound.
596
+ The Action does not return Any Values, it just Uploads Files, so they can be Indexed.
597
+
598
+ **5.4.1 Setting up the Wokflow**
599
+
600
+ - To work with this Action, you need a Minimal Workflow:
601
+
602
+ <img width="1423" height="536" alt="image" src="https://github.com/user-attachments/assets/1d0ccf5e-7a87-4e46-aa5f-de8c63943809" />
603
+
604
+ - In order to Upload a file with the d.velop Action, you need a File in your Workflow.
605
+ - As an small example the _"Read/Write Files from Disk"_ Node is Used to get a file in to the Workflow.
606
+
607
+ **5.4.2 Setting up the Node**
608
+
609
+ - This node in Paticular has an Input from The node before
610
+
611
+ <img width="1162" height="753" alt="image" src="https://github.com/user-attachments/assets/3adb6883-d02f-4c18-9089-064a53aaa0ef" />
612
+
613
+ **File Name**
614
+
615
+ - The File name can either be set manually every Time, or you write a simple Java Script Expression:
616
+
617
+ ```bash
618
+ {{ $json.fileName }}
619
+ ```
620
+
621
+ **File Source**
622
+
623
+ - When configuring the node, set the File Source to From N8n Binary. This means the file will be taken from the binary data of a previous node in your workflow.
624
+ - Alternatively, you can use From Base64/String as the File Source. This option allows you to upload a file using its Base64-encoded content instead of binary data.
625
+
626
+ **Input Binary Property**
627
+
628
+ - The Input Binary Property defines the name of the binary field that contains the file. In most cases, this property is called: binary.
629
+
630
+ **Import Profile**
631
+
632
+ - In order to get the Import Profile you need to navigate to _configuration_ -> _Document Managment_ -> _Import_ -> _Importoption_ -> _Importprofile_
633
+
634
+ <img width="1076" height="599" alt="image" src="https://github.com/user-attachments/assets/8bac4b1c-b63d-418c-b9a4-66be1800e3e8" />
635
+
636
+ - In this setting you can Copy the red Marked _Import Profile_
637
+
638
+ **5.4.3 DMS Inbound**
639
+
640
+ - STILL UNDER CONSTRUCTION
641
+ - API IS BITCHING
642
+
643
+ ## 6. Volatile Action in Detail
644
+
645
+ - The following is an instructional guide to setting up volatile actions and loading the payload correctly.
646
+
647
+ **6.1. Choose from your Actions**
648
+
649
+ <img width="730" height="653" alt="image" src="https://github.com/user-attachments/assets/dff6ac75-d274-4e18-ac10-081af5e83ae0" />
650
+
651
+ - If you chose your action you need to fill the Payload
652
+
653
+ **6.2. Payload of an Action**
654
+
655
+ - To ascertain the payload of an action, it is necessary to utilize an _API client_, such as _Bruno_. -> https://www.usebruno.com
656
+ - To retrieve all volatile actions, run this API call with the _base URL_ and the _API key (token)_.
657
+ <img width="556" height="240" alt="image" src="https://github.com/user-attachments/assets/cb0dbcce-4425-4fcc-906d-b3a643f2d430" />
658
+
659
+ - If you execute this API call, you will receive a list of all the volatile actions.
660
+ - In terms of testing, we will examine the Salesforce_getRecord action.
661
+
662
+ ```bash
663
+ {
664
+ "id": "salesforce_get-record",
665
+ "display_name": "Salesforce - Get Record",
666
+ "tags": null,
667
+ "description": "This operation gets a record.",
668
+ "endpoint": "/actions/api/execute/salesforce_get-record",
669
+ "execution_mode": "Synchron",
670
+ "input_properties": [
671
+ {
672
+ "id": "objectApiName",
673
+ "type": "String",
674
+ "title": "Object API Name",
675
+ "description": "",
676
+ "required": true,
677
+ "visibility": "Standard",
678
+ "initial_value": "",
679
+ "object_properties": null,
680
+ "fixed_value_set": null,
681
+ "data_query_url": "",
682
+ "data_query_parameter": null
683
+ },
684
+ {
685
+ "id": "recordId",
686
+ "type": "String",
687
+ "title": "Record ID",
688
+ "description": "",
689
+ "required": true,
690
+ "visibility": "Standard",
691
+ "initial_value": "",
692
+ "object_properties": null,
693
+ "fixed_value_set": null,
694
+ "data_query_url": "",
695
+ "data_query_parameter": null
696
+ },
697
+ {
698
+ "id": "orgUrl",
699
+ "type": "String",
700
+ "title": "Salesforce Org URL",
701
+ "description": "",
702
+ "required": true,
703
+ "visibility": "Advanced",
704
+ "initial_value": "",
705
+ "object_properties": null,
706
+ "fixed_value_set": null,
707
+ "data_query_url": "/salesforce/process/actions/values/orgs",
708
+ "data_query_parameter": null
709
+ }
710
+ ],
711
+ "output_properties": [
712
+ {
713
+ "id": "record",
714
+ "type": "Object",
715
+ "title": "Record",
716
+ "description": "",
717
+ "object_properties": null
718
+ }
719
+ ],
720
+ "volatile": true
721
+ ```
722
+
723
+ - The payload consists of the _input_properties_. So in this instance the payload is:
724
+
725
+ ```bash
726
+ {
727
+ "objectApiName": "Account",
728
+ "recordId": "001XXXXXXXXXXXXXXX",
729
+ "orgUrl": "https://your-org.salesforce.com"
730
+ }
731
+ ```
732
+
733
+ **6.3 Assamble the Node**
734
+
735
+ - The last step is to Paste the Payload in the Node of your desire, fill the properties wirh values and Execute the Node!
736
+
737
+ <img width="939" height="577" alt="image" src="https://github.com/user-attachments/assets/3811a0fe-15e3-4093-93a5-c5f5d2ffd0cb" />
738
+
739
+ ## 7. Error codes
740
+
741
+ - This section describes the most common error code that may occur when using the d.velop Actions Node
742
+
743
+ **7.1 Authentication Errors**
744
+
745
+ | Error Code | Message | Cause | Solution |
746
+ | ---------- | ------------ | ------------------------------- | --------------------------------- |
747
+ | 401 | Unauthorized | Invalid or missing Bearer Token | Verify API key in credentials |
748
+ | 403 | Forbidden | Insufficient permissions | Check user permissions in d.velop |
749
+ | 400 | Bad Request | Invalid Base URL or headers | Verify Base URL and credentials |
750
+
751
+ Example response:
752
+
753
+ ```bash
754
+ {
755
+ "error": "Unauthorized"
756
+ }
757
+ ```
758
+
759
+ **7.2 Document Errors**
760
+
761
+ | Error Code | Message | Cause | Solution |
762
+ | ---------- | -------------------- | ----------------------- | ------------------------ |
763
+ | 404 | Document not found | Invalid document ID | Verify document ID |
764
+ | 404 | Repository not found | Invalid repository ID | Verify repository string |
765
+ | 400 | Invalid parameters | Missing required fields | Check node configuration |
766
+
767
+ **7.3 Import Errors**
768
+
769
+ | Error Code | Message | Cause | Solution |
770
+ | ---------- | ---------------------- | --------------------- | ---------------------------- |
771
+ | 400 | Invalid import profile | Wrong import profile | Verify import profile |
772
+ | 400 | Missing binary data | Binary property empty | Verify input binary property |
773
+ | 413 | Payload too large | File too large | Reduce file size |
774
+
775
+ **7.4 Volatile Action Errors**
776
+
777
+ | Error Code | Message | Cause | Solution |
778
+ | ---------- | --------------------- | ---------------------- | ------------------------ |
779
+ | 400 | Invalid payload | Missing payload fields | Verify payload structure |
780
+ | 404 | Action not found | Invalid action ID | Verify action exists |
781
+ | 500 | Internal server error | Server-side issue | Check d.velop system |
782
+
783
+ ## Compatibility
784
+
785
+ Tested with n8n@2.12.1.
786
+
787
+ ## Resources
788
+
789
+ * [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
790
+ * [d.velop Homepage](https://www.d-velop.de)
791
+ * [d.velop Support](support@d-velop.de)