n8n-nodes-antony-cloud-office 0.1.4 → 0.1.6
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/credentials/AntonyApi.credentials.js +2 -21
- package/dist/credentials/AntonyApi.credentials.js.map +1 -1
- package/dist/credentials/NextcloudApi.credentials.js +5 -5
- package/dist/credentials/NextcloudApi.credentials.js.map +1 -1
- package/dist/nodes/AntonyGraphql/AntonyGraphql.node.js +2 -21
- package/dist/nodes/AntonyGraphql/AntonyGraphql.node.js.map +1 -1
- package/dist/nodes/AntonyNextcloudNode/NextcloudNode.node.d.ts +5 -0
- package/dist/nodes/AntonyNextcloudNode/NextcloudNode.node.js +205 -21
- package/dist/nodes/AntonyNextcloudNode/NextcloudNode.node.js.map +1 -1
- package/dist/nodes/AntonyTrigger/AntonyTrigger.node.d.ts +5 -0
- package/dist/nodes/AntonyTrigger/AntonyTrigger.node.js +237 -0
- package/dist/nodes/AntonyTrigger/AntonyTrigger.node.js.map +1 -0
- package/dist/nodes/AntonyTrigger/antony.svg +58 -0
- package/dist/nodes/shared/subscriptionManager.d.ts +43 -0
- package/dist/nodes/shared/subscriptionManager.js +240 -0
- package/dist/nodes/shared/subscriptionManager.js.map +1 -0
- package/dist/nodes/shared/transport.d.ts +23 -2
- package/dist/nodes/shared/transport.js +68 -0
- package/dist/nodes/shared/transport.js.map +1 -1
- package/package.json +4 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AntonyApi = void 0;
|
|
4
|
+
const transport_1 = require("../nodes/shared/transport");
|
|
4
5
|
class AntonyApi {
|
|
5
6
|
constructor() {
|
|
6
7
|
this.name = 'antonyApi';
|
|
@@ -70,28 +71,8 @@ class AntonyApi {
|
|
|
70
71
|
};
|
|
71
72
|
}
|
|
72
73
|
async preAuthentication(credentials) {
|
|
73
|
-
const baseUrl = String(credentials.baseUrl).replace(/\/$/, '');
|
|
74
|
-
const realm = encodeURIComponent(String(credentials.realm));
|
|
75
|
-
const tokenUrl = `${baseUrl}/kc/realms/${realm}/protocol/openid-connect/token`;
|
|
76
|
-
const response = (await this.helpers.httpRequest({
|
|
77
|
-
method: 'POST',
|
|
78
|
-
url: tokenUrl,
|
|
79
|
-
headers: {
|
|
80
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
81
|
-
},
|
|
82
|
-
body: new URLSearchParams({
|
|
83
|
-
grant_type: 'password',
|
|
84
|
-
client_id: String(credentials.clientId),
|
|
85
|
-
username: String(credentials.username),
|
|
86
|
-
password: String(credentials.password),
|
|
87
|
-
}).toString(),
|
|
88
|
-
json: true,
|
|
89
|
-
}));
|
|
90
|
-
if (!response.access_token) {
|
|
91
|
-
throw new Error('Keycloak did not return an access_token.');
|
|
92
|
-
}
|
|
93
74
|
return {
|
|
94
|
-
accessToken:
|
|
75
|
+
accessToken: await (0, transport_1.fetchAntonyAccessToken)(this, credentials),
|
|
95
76
|
};
|
|
96
77
|
}
|
|
97
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AntonyApi.credentials.js","sourceRoot":"","sources":["../../credentials/AntonyApi.credentials.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AntonyApi.credentials.js","sourceRoot":"","sources":["../../credentials/AntonyApi.credentials.ts"],"names":[],"mappings":";;;AAOA,yDAAmE;AAEnE,MAAa,SAAS;IAAtB;QACC,SAAI,GAAG,WAAW,CAAC;QAEnB,gBAAW,GAAG,YAAY,CAAC;QAE3B,qBAAgB,GAAG,4BAA4B,CAAC;QAEhD,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,2BAA2B;gBACxC,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,wCAAwC;aACrD;YACD;gBACC,WAAW,EAAE,gBAAgB;gBAC7B,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,oBAAoB;gBACjC,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU;gBACnB,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,WAAW,EAAE,cAAc;gBAC3B,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;gBAChC,OAAO,EAAE,EAAE;aACX;SACD,CAAC;QAWF,iBAAY,GAAG;YACd,IAAI,EAAE,SAAkB;YACxB,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,iBAAiB;gBACtB,MAAM,EAAE,KAAK;aACb;SACD,CAAC;IACH,CAAC;IAzBA,KAAK,CAAC,iBAAiB,CAEtB,WAA2C;QAE3C,OAAO;YACN,WAAW,EAAE,MAAM,IAAA,kCAAsB,EAAC,IAAI,EAAE,WAAW,CAAC;SAC5D,CAAC;IACH,CAAC;CAkBD;AAhFD,8BAgFC"}
|
|
@@ -14,13 +14,13 @@ class NextcloudApi {
|
|
|
14
14
|
this.documentationUrl = 'https://docs.nextcloud.com/server/latest/developer_manual/client_apis/';
|
|
15
15
|
this.properties = [
|
|
16
16
|
{
|
|
17
|
-
displayName: '
|
|
17
|
+
displayName: 'Nextcloud URL',
|
|
18
18
|
name: 'baseUrl',
|
|
19
19
|
type: 'string',
|
|
20
20
|
default: '',
|
|
21
|
-
placeholder: 'https://<
|
|
21
|
+
placeholder: 'https://<NEXTCLOUD_URL> oder https://<HOST>/nc',
|
|
22
22
|
required: true,
|
|
23
|
-
description: '
|
|
23
|
+
description: 'Die exakte, direkt erreichbare Nextcloud-URL (inkl. eines eventuell nötigen Pfads wie "/nc", falls Nextcloud in eurer Umgebung hinter einem Reverse-Proxy-Pfad läuft). Dieser Wert wird unverändert für alle Nextcloud-Aufrufe verwendet – es wird nicht mehr automatisch zwischen mit/ohne "/nc" geraten.',
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
displayName: 'Authentication Method',
|
|
@@ -118,7 +118,7 @@ class NextcloudApi {
|
|
|
118
118
|
};
|
|
119
119
|
this.test = {
|
|
120
120
|
request: {
|
|
121
|
-
baseURL: '={{$credentials.baseUrl.trim().replace(/\\/+$/, "")
|
|
121
|
+
baseURL: '={{$credentials.baseUrl.trim().replace(/\\/+$/, "")}}',
|
|
122
122
|
url: '/ocs/v2.php/cloud/user?format=json',
|
|
123
123
|
method: 'GET',
|
|
124
124
|
headers: {
|
|
@@ -138,7 +138,7 @@ class NextcloudApi {
|
|
|
138
138
|
type: 'responseCode',
|
|
139
139
|
properties: {
|
|
140
140
|
value: 404,
|
|
141
|
-
message: 'Nextcloud HTTP 404:
|
|
141
|
+
message: 'Nextcloud HTTP 404: Die "Nextcloud URL" zeigt nicht auf eine erreichbare Nextcloud-Installation. Bitte den exakten Pfad prüfen (z.B. muss ein "/nc"-Suffix mit angegeben werden, falls die Umgebung das erfordert).',
|
|
142
142
|
},
|
|
143
143
|
},
|
|
144
144
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NextcloudApi.credentials.js","sourceRoot":"","sources":["../../credentials/NextcloudApi.credentials.ts"],"names":[],"mappings":";;;AAQA,SAAS,qBAAqB,CAAC,OAAe;IAC7C,OAAO,OAAO;SACZ,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAa,YAAY;IAAzB;QACC,SAAI,GAAG,cAAc,CAAC;QAEtB,gBAAW,GAAG,eAAe,CAAC;QAE9B,qBAAgB,GAAG,wEAAwE,CAAC;QAE5F,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"NextcloudApi.credentials.js","sourceRoot":"","sources":["../../credentials/NextcloudApi.credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -116,7 +116,7 @@ class AntonyGraphql {
|
|
|
116
116
|
continue;
|
|
117
117
|
}
|
|
118
118
|
query = this.getNodeParameter('query', itemIndex);
|
|
119
|
-
variables = parseVariables(this.getNodeParameter('variables', itemIndex, {}));
|
|
119
|
+
variables = (0, transport_1.parseVariables)(this.getNodeParameter('variables', itemIndex, {}));
|
|
120
120
|
const normalizeResult = this.getNodeParameter('normalizeResult', itemIndex, true);
|
|
121
121
|
const includeDebugData = this.getNodeParameter('includeDebugData', itemIndex, false);
|
|
122
122
|
const { response, request } = await executeGraphql(this, query, variables);
|
|
@@ -219,25 +219,6 @@ function getHttpResponseBody(error) {
|
|
|
219
219
|
const response = asDataObject(errorObject?.response);
|
|
220
220
|
return response?.data ?? response?.body ?? errorObject?.error;
|
|
221
221
|
}
|
|
222
|
-
function parseVariables(value) {
|
|
223
|
-
if (value === undefined || value === null || value === '') {
|
|
224
|
-
return {};
|
|
225
|
-
}
|
|
226
|
-
if (typeof value === 'string') {
|
|
227
|
-
const parsed = JSON.parse(value);
|
|
228
|
-
if (isPlainObject(parsed)) {
|
|
229
|
-
return parsed;
|
|
230
|
-
}
|
|
231
|
-
throw new Error('Variables JSON must be an object, for example {}');
|
|
232
|
-
}
|
|
233
|
-
if (isPlainObject(value)) {
|
|
234
|
-
return value;
|
|
235
|
-
}
|
|
236
|
-
throw new Error('Variables JSON must be an object, for example {}');
|
|
237
|
-
}
|
|
238
|
-
function isPlainObject(value) {
|
|
239
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
240
|
-
}
|
|
241
222
|
async function buildGraphqlRequestDebug(context, query, variables) {
|
|
242
223
|
const credentials = await context.getCredentials('antonyApi');
|
|
243
224
|
const baseUrl = String(credentials.baseUrl).replace(/\/$/, '');
|
|
@@ -252,7 +233,7 @@ async function buildGraphqlRequestDebug(context, query, variables) {
|
|
|
252
233
|
};
|
|
253
234
|
}
|
|
254
235
|
function asDataObject(value) {
|
|
255
|
-
if (isPlainObject(value)) {
|
|
236
|
+
if ((0, transport_1.isPlainObject)(value)) {
|
|
256
237
|
return value;
|
|
257
238
|
}
|
|
258
239
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AntonyGraphql.node.js","sourceRoot":"","sources":["../../../nodes/AntonyGraphql/AntonyGraphql.node.ts"],"names":[],"mappings":";;;AAQA,+CAAuE;AACvE,
|
|
1
|
+
{"version":3,"file":"AntonyGraphql.node.js","sourceRoot":"","sources":["../../../nodes/AntonyGraphql/AntonyGraphql.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription, ICredentialTestFunctions, ICredentialsDecrypted, INodeCredentialTestResult } from 'n8n-workflow';
|
|
2
2
|
export declare class NextcloudNode implements INodeType {
|
|
3
3
|
description: INodeTypeDescription;
|
|
4
|
+
methods: {
|
|
5
|
+
credentialTest: {
|
|
6
|
+
testNextcloudCredentials: (this: ICredentialTestFunctions, credential: ICredentialsDecrypted) => Promise<INodeCredentialTestResult>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
4
9
|
testNextcloudCredentials(this: ICredentialTestFunctions, credential: ICredentialsDecrypted): Promise<INodeCredentialTestResult>;
|
|
5
10
|
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
6
11
|
}
|
|
@@ -38,9 +38,6 @@ function getEnvironmentBaseUrl(baseUrl) {
|
|
|
38
38
|
.replace(/\/+$/, '')
|
|
39
39
|
.replace(/\/(?:nc|kc)$/i, '');
|
|
40
40
|
}
|
|
41
|
-
function getNextcloudBaseUrl(baseUrl) {
|
|
42
|
-
return `${getEnvironmentBaseUrl(baseUrl)}/nc`;
|
|
43
|
-
}
|
|
44
41
|
function getKeycloakBaseUrl(baseUrl) {
|
|
45
42
|
return `${getEnvironmentBaseUrl(baseUrl)}/kc`;
|
|
46
43
|
}
|
|
@@ -49,8 +46,31 @@ function isOcsUrl(url) {
|
|
|
49
46
|
}
|
|
50
47
|
function getHttpStatusCode(error) {
|
|
51
48
|
const response = error?.response;
|
|
52
|
-
const
|
|
53
|
-
|
|
49
|
+
const raw = error?.statusCode ?? error?.httpCode ?? response?.statusCode ?? response?.status;
|
|
50
|
+
const statusCode = typeof raw === 'string' ? Number(raw) : raw;
|
|
51
|
+
return typeof statusCode === 'number' && !Number.isNaN(statusCode) ? statusCode : undefined;
|
|
52
|
+
}
|
|
53
|
+
function getAntonyApiErrorMessage(error) {
|
|
54
|
+
// n8n's httpRequestWithAuthentication wraps HTTP failures into NodeApiError before we see them.
|
|
55
|
+
// NodeApiError stores the parsed response body under `.context.data`, not `.response.data`.
|
|
56
|
+
const raw = error?.context?.data ?? error?.response?.data ?? error?.response?.body;
|
|
57
|
+
let body;
|
|
58
|
+
if (typeof raw === 'string') {
|
|
59
|
+
try {
|
|
60
|
+
body = JSON.parse(raw);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
body = undefined;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (raw && typeof raw === 'object') {
|
|
67
|
+
body = raw;
|
|
68
|
+
}
|
|
69
|
+
const ocs = body?.ocs;
|
|
70
|
+
const data = ocs?.data;
|
|
71
|
+
const meta = ocs?.meta;
|
|
72
|
+
const message = data?.error ?? meta?.message;
|
|
73
|
+
return typeof message === 'string' ? message : undefined;
|
|
54
74
|
}
|
|
55
75
|
const xmlParser = new fast_xml_parser_1.XMLParser({
|
|
56
76
|
ignoreAttributes: false,
|
|
@@ -424,6 +444,14 @@ class NextcloudNode {
|
|
|
424
444
|
default: 0,
|
|
425
445
|
displayOptions: { show: { resource: ['share'], operation: ['get', 'delete'] } },
|
|
426
446
|
},
|
|
447
|
+
{
|
|
448
|
+
displayName: 'Zielordner beim Empfänger Aufräumen',
|
|
449
|
+
name: 'cleanupTargetFolder',
|
|
450
|
+
type: 'boolean',
|
|
451
|
+
default: false,
|
|
452
|
+
description: 'Whether to remove the (now possibly empty) parent target folder at the recipient after deleting the share. Only applies to internal user shares whose target path has a parent folder (e.g. set via antonyapi). Requires the antonyapi plugin with admin rights.',
|
|
453
|
+
displayOptions: { show: { resource: ['share'], operation: ['delete'] } },
|
|
454
|
+
},
|
|
427
455
|
// ── Share: create ──────────────────────────────────────────────
|
|
428
456
|
{
|
|
429
457
|
displayName: 'Path',
|
|
@@ -472,6 +500,17 @@ class NextcloudNode {
|
|
|
472
500
|
show: { resource: ['share'], operation: ['create'], shareType: [0, 1, 3, 4] },
|
|
473
501
|
},
|
|
474
502
|
},
|
|
503
|
+
{
|
|
504
|
+
displayName: 'Zielpfad (Zielordner beim Empfänger)',
|
|
505
|
+
name: 'targetFolder',
|
|
506
|
+
type: 'string',
|
|
507
|
+
default: '',
|
|
508
|
+
placeholder: 'Projekte/Meier/Fotos',
|
|
509
|
+
description: 'Optional: verschiebt/benennt den freigegebenen Ordner beim Empfänger in diesen Pfad um (relativ zu dessen Nextcloud-Stammverzeichnis). Erfordert das Nextcloud-Plugin "antonyapi".',
|
|
510
|
+
displayOptions: {
|
|
511
|
+
show: { resource: ['share'], operation: ['create'], shareType: [0] },
|
|
512
|
+
},
|
|
513
|
+
},
|
|
475
514
|
{
|
|
476
515
|
displayName: 'Additional Options',
|
|
477
516
|
name: 'shareOptions',
|
|
@@ -569,6 +608,14 @@ class NextcloudNode {
|
|
|
569
608
|
type: 'string',
|
|
570
609
|
default: '',
|
|
571
610
|
},
|
|
611
|
+
{
|
|
612
|
+
displayName: 'Zielpfad (Zielordner beim Empfänger)',
|
|
613
|
+
name: 'targetFolder',
|
|
614
|
+
type: 'string',
|
|
615
|
+
default: '',
|
|
616
|
+
placeholder: 'Projekte/Meier/Fotos',
|
|
617
|
+
description: 'Optional: verschiebt/benennt den freigegebenen Ordner beim Empfänger in diesen Pfad um (relativ zu dessen Nextcloud-Stammverzeichnis). Nur für interne User-Shares. Erfordert das Nextcloud-Plugin "antonyapi".',
|
|
618
|
+
},
|
|
572
619
|
],
|
|
573
620
|
},
|
|
574
621
|
// ── Version: file path ─────────────────────────────────────────
|
|
@@ -605,11 +652,16 @@ class NextcloudNode {
|
|
|
605
652
|
},
|
|
606
653
|
],
|
|
607
654
|
};
|
|
655
|
+
this.methods = {
|
|
656
|
+
credentialTest: {
|
|
657
|
+
testNextcloudCredentials: this.testNextcloudCredentials,
|
|
658
|
+
},
|
|
659
|
+
};
|
|
608
660
|
}
|
|
609
661
|
async testNextcloudCredentials(credential) {
|
|
610
662
|
const d = (credential.data ?? {});
|
|
663
|
+
const nextcloudUrl = String(d.baseUrl ?? '').trim().replace(/\/+$/, '');
|
|
611
664
|
const base = getEnvironmentBaseUrl(String(d.baseUrl ?? ''));
|
|
612
|
-
const nextcloudUrl = getNextcloudBaseUrl(String(d.baseUrl ?? ''));
|
|
613
665
|
const authMethod = String(d.authMethod ?? 'appPassword');
|
|
614
666
|
let authHeader;
|
|
615
667
|
if (authMethod === 'appPassword') {
|
|
@@ -655,7 +707,7 @@ class NextcloudNode {
|
|
|
655
707
|
}
|
|
656
708
|
authHeader = `Bearer ${String(bearerToken)}`;
|
|
657
709
|
}
|
|
658
|
-
// Schritt 2: Nextcloud testen
|
|
710
|
+
// Schritt 2: Nextcloud testen – die eingegebene Nextcloud URL wird 1:1 verwendet
|
|
659
711
|
const testUrl = `${nextcloudUrl}/ocs/v2.php/cloud/user?format=json`;
|
|
660
712
|
let ncStatus;
|
|
661
713
|
try {
|
|
@@ -671,6 +723,12 @@ class NextcloudNode {
|
|
|
671
723
|
catch (e) {
|
|
672
724
|
return { status: 'Error', message: `Schritt 2/2 – Nextcloud nicht erreichbar (${testUrl}): ${e.message}` };
|
|
673
725
|
}
|
|
726
|
+
if (ncStatus === 404) {
|
|
727
|
+
return {
|
|
728
|
+
status: 'Error',
|
|
729
|
+
message: `Schritt 2/2 – Nextcloud HTTP 404 bei ${testUrl}. Bitte die "Nextcloud URL" in den Credentials prüfen (ggf. fehlt oder fehlt fälschlich ein "/nc"-Suffix).`,
|
|
730
|
+
};
|
|
731
|
+
}
|
|
674
732
|
if (ncStatus === 401) {
|
|
675
733
|
const hint = authMethod === 'oidc'
|
|
676
734
|
? 'Bearer-Token von Keycloak erhalten, aber Nextcloud lehnt ihn ab.\nPrüfe: user_oidc-App installiert + Keycloak als Provider eingetragen?'
|
|
@@ -689,8 +747,8 @@ class NextcloudNode {
|
|
|
689
747
|
const items = this.getInputData();
|
|
690
748
|
const returnData = [];
|
|
691
749
|
const credentials = await this.getCredentials('nextcloudApi');
|
|
692
|
-
const baseUrl = getNextcloudBaseUrl(String(credentials.baseUrl));
|
|
693
750
|
const username = String(credentials.username);
|
|
751
|
+
const baseUrl = String(credentials.baseUrl).trim().replace(/\/+$/, '');
|
|
694
752
|
const req = async (options) => {
|
|
695
753
|
const headers = isOcsUrl(options.url)
|
|
696
754
|
? { 'OCS-APIRequest': 'true', Accept: 'application/json', ...(options.headers ?? {}) }
|
|
@@ -708,6 +766,9 @@ class NextcloudNode {
|
|
|
708
766
|
if (getHttpStatusCode(error) === 404 && url.includes('/remote.php/dav/')) {
|
|
709
767
|
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Nextcloud HTTP 404 bei ${url}. Der Pfad wurde nicht gefunden oder die WebDAV-User-ID stimmt nicht zur Anmeldung.`);
|
|
710
768
|
}
|
|
769
|
+
if (getHttpStatusCode(error) === 404 && !url.includes('/apps/antonyapi/')) {
|
|
770
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Nextcloud HTTP 404 bei ${url}. Bitte die "Nextcloud URL" in den Credentials prüfen (ggf. fehlt oder fehlt fälschlich ein "/nc"-Suffix).`);
|
|
771
|
+
}
|
|
711
772
|
if (getHttpStatusCode(error) === 401) {
|
|
712
773
|
const authMethod = String(credentials.authMethod ?? 'appPassword');
|
|
713
774
|
const hint = authMethod === 'oidc'
|
|
@@ -804,6 +865,66 @@ class NextcloudNode {
|
|
|
804
865
|
}
|
|
805
866
|
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Konnte keine interne Nextcloud-ID für "${trimmed}" ermitteln. Bitte die GUID des ${typeLabel}s direkt eingeben.`, { itemIndex });
|
|
806
867
|
};
|
|
868
|
+
let antonyApiStatus;
|
|
869
|
+
const ensureAntonyApiInstalled = async (itemIndex) => {
|
|
870
|
+
if (antonyApiStatus === undefined) {
|
|
871
|
+
try {
|
|
872
|
+
await req({
|
|
873
|
+
method: 'GET',
|
|
874
|
+
url: '/ocs/v2.php/apps/antonyapi/version?format=json',
|
|
875
|
+
json: true,
|
|
876
|
+
});
|
|
877
|
+
antonyApiStatus = 'installed';
|
|
878
|
+
}
|
|
879
|
+
catch (error) {
|
|
880
|
+
const statusCode = getHttpStatusCode(error);
|
|
881
|
+
antonyApiStatus = statusCode === 401 || statusCode === 403 ? 'no-permission' : 'not-installed';
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
if (antonyApiStatus === 'not-installed') {
|
|
885
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Nextcloud antonyapi nicht installiert. Nur eingeschränkte Funktionen beim Teilen verfügbar.', { itemIndex });
|
|
886
|
+
}
|
|
887
|
+
if (antonyApiStatus === 'no-permission') {
|
|
888
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Nextcloud antonyapi ist installiert, aber der verwendete Nextcloud-Account hat keine Admin-Rechte, die für den Zielpfad-Endpunkt erforderlich sind.', { itemIndex });
|
|
889
|
+
}
|
|
890
|
+
};
|
|
891
|
+
const callAntonyApi = async (method, body, itemIndex, action) => {
|
|
892
|
+
await ensureAntonyApiInstalled(itemIndex);
|
|
893
|
+
let response;
|
|
894
|
+
try {
|
|
895
|
+
response = (await req({
|
|
896
|
+
method,
|
|
897
|
+
url: '/ocs/v2.php/apps/antonyapi/?format=json',
|
|
898
|
+
body: new URLSearchParams(body).toString(),
|
|
899
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
900
|
+
json: true,
|
|
901
|
+
}));
|
|
902
|
+
}
|
|
903
|
+
catch (error) {
|
|
904
|
+
const statusCode = getHttpStatusCode(error);
|
|
905
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
906
|
+
antonyApiStatus = 'no-permission';
|
|
907
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Nextcloud antonyapi ist installiert, aber der verwendete Nextcloud-Account hat keine Admin-Rechte, die für "${action}" erforderlich sind.`, { itemIndex });
|
|
908
|
+
}
|
|
909
|
+
const antonyMessage = getAntonyApiErrorMessage(error);
|
|
910
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), antonyMessage
|
|
911
|
+
? `antonyapi: "${action}" fehlgeschlagen (${antonyMessage}).`
|
|
912
|
+
: `antonyapi: "${action}" fehlgeschlagen: ${error.message}`, { itemIndex });
|
|
913
|
+
}
|
|
914
|
+
const ocs = response.ocs ?? {};
|
|
915
|
+
const meta = ocs.meta ?? {};
|
|
916
|
+
const data = ocs.data ?? {};
|
|
917
|
+
const responseStatusCode = Number(meta.statuscode ?? 200);
|
|
918
|
+
if (responseStatusCode >= 400) {
|
|
919
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `antonyapi: "${action}" fehlgeschlagen (${data.error ?? meta.message ?? responseStatusCode}).`, { itemIndex });
|
|
920
|
+
}
|
|
921
|
+
return data;
|
|
922
|
+
};
|
|
923
|
+
// Nextcloud's IShareManager::getShareById() erwartet eine volle ID im Format "<provider>:<id>".
|
|
924
|
+
// Interne User-Shares (Share Type 0) laufen immer über den DefaultShareProvider, dessen
|
|
925
|
+
// Identifier fest "ocinternal" ist – ohne dieses Prefix schlägt der Lookup mit "Share not found" fehl.
|
|
926
|
+
const setShareTargetFolder = (shareId, targetFolder, itemIndex) => callAntonyApi('PUT', { fullShareId: `ocinternal:${shareId}`, projectFolder: targetFolder }, itemIndex, 'Zielpfad setzen');
|
|
927
|
+
const cleanupShareTargetFolder = (user, projectFolder, itemIndex) => callAntonyApi('DELETE', { user, projectFolder }, itemIndex, 'Zielordner aufräumen');
|
|
807
928
|
for (let i = 0; i < items.length; i++) {
|
|
808
929
|
try {
|
|
809
930
|
const resource = this.getNodeParameter('resource', i);
|
|
@@ -952,7 +1073,15 @@ class NextcloudNode {
|
|
|
952
1073
|
json: true,
|
|
953
1074
|
}));
|
|
954
1075
|
const data = extractOcsData(response);
|
|
955
|
-
|
|
1076
|
+
const shareResult = (Array.isArray(data) ? data[0] : data);
|
|
1077
|
+
if (shareType === 0) {
|
|
1078
|
+
const targetFolder = this.getNodeParameter('targetFolder', i, '').trim();
|
|
1079
|
+
if (targetFolder) {
|
|
1080
|
+
const antonyResult = await setShareTargetFolder(shareResult.id, targetFolder, i);
|
|
1081
|
+
shareResult.targetFolder = antonyResult.newPath ?? targetFolder;
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
returnData.push({ json: shareResult, pairedItem: i });
|
|
956
1085
|
}
|
|
957
1086
|
else if (operation === 'get') {
|
|
958
1087
|
const shareId = this.getNodeParameter('shareId', i);
|
|
@@ -967,26 +1096,81 @@ class NextcloudNode {
|
|
|
967
1096
|
else if (operation === 'update') {
|
|
968
1097
|
const shareId = this.getNodeParameter('shareId', i);
|
|
969
1098
|
const updateFields = this.getNodeParameter('updateFields', i);
|
|
970
|
-
const
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
1099
|
+
const { targetFolder, ...shareUpdateFields } = updateFields;
|
|
1100
|
+
const filteredUpdateFields = Object.fromEntries(Object.entries(shareUpdateFields).filter(([, v]) => v !== undefined && v !== null && v !== ''));
|
|
1101
|
+
let shareResult;
|
|
1102
|
+
if (Object.keys(filteredUpdateFields).length > 0) {
|
|
1103
|
+
const response = (await req({
|
|
1104
|
+
method: 'PUT',
|
|
1105
|
+
url: `/ocs/v2.php/apps/files_sharing/api/v1/shares/${shareId}?format=json`,
|
|
1106
|
+
body: new URLSearchParams(Object.fromEntries(Object.entries(filteredUpdateFields).map(([k, v]) => [k, String(v)]))).toString(),
|
|
1107
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
1108
|
+
json: true,
|
|
1109
|
+
}));
|
|
1110
|
+
const data = extractOcsData(response);
|
|
1111
|
+
shareResult = (Array.isArray(data) ? data[0] : data);
|
|
1112
|
+
}
|
|
1113
|
+
else {
|
|
1114
|
+
// Nextclouds Share-Update-Endpunkt lehnt Aufrufe ohne echte Updateparameter ab (400);
|
|
1115
|
+
// wenn nur der Zielpfad (antonyapi) gesetzt wird, überspringen wir ihn und lesen den
|
|
1116
|
+
// aktuellen Share-Stand stattdessen per GET.
|
|
1117
|
+
const response = (await req({
|
|
1118
|
+
method: 'GET',
|
|
1119
|
+
url: `/ocs/v2.php/apps/files_sharing/api/v1/shares/${shareId}?format=json`,
|
|
1120
|
+
json: true,
|
|
1121
|
+
}));
|
|
1122
|
+
const data = extractOcsData(response);
|
|
1123
|
+
shareResult = (Array.isArray(data) ? data[0] : data);
|
|
1124
|
+
}
|
|
1125
|
+
const trimmedTargetFolder = String(targetFolder ?? '').trim();
|
|
1126
|
+
if (trimmedTargetFolder) {
|
|
1127
|
+
const antonyResult = await setShareTargetFolder(shareId, trimmedTargetFolder, i);
|
|
1128
|
+
shareResult.targetFolder = antonyResult.newPath ?? trimmedTargetFolder;
|
|
1129
|
+
}
|
|
1130
|
+
returnData.push({ json: shareResult, pairedItem: i });
|
|
981
1131
|
}
|
|
982
1132
|
else if (operation === 'delete') {
|
|
983
1133
|
const shareId = this.getNodeParameter('shareId', i);
|
|
1134
|
+
const cleanupTargetFolder = this.getNodeParameter('cleanupTargetFolder', i);
|
|
1135
|
+
let cleanupUser;
|
|
1136
|
+
let cleanupProjectFolder;
|
|
1137
|
+
if (cleanupTargetFolder) {
|
|
1138
|
+
const shareResponse = (await req({
|
|
1139
|
+
method: 'GET',
|
|
1140
|
+
url: `/ocs/v2.php/apps/files_sharing/api/v1/shares/${shareId}?format=json`,
|
|
1141
|
+
json: true,
|
|
1142
|
+
}));
|
|
1143
|
+
const shareData = extractOcsData(shareResponse);
|
|
1144
|
+
const share = (Array.isArray(shareData) ? shareData[0] : shareData);
|
|
1145
|
+
const segments = String(share.file_target ?? '').split('/').filter(Boolean);
|
|
1146
|
+
segments.pop();
|
|
1147
|
+
if (Number(share.share_type) === 0 && share.share_with && segments.length > 0) {
|
|
1148
|
+
cleanupUser = String(share.share_with);
|
|
1149
|
+
cleanupProjectFolder = segments.join('/');
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
984
1152
|
await req({
|
|
985
1153
|
method: 'DELETE',
|
|
986
1154
|
url: `/ocs/v2.php/apps/files_sharing/api/v1/shares/${shareId}?format=json`,
|
|
987
1155
|
json: true,
|
|
988
1156
|
});
|
|
989
|
-
|
|
1157
|
+
const resultJson = { success: true, shareId };
|
|
1158
|
+
if (cleanupTargetFolder) {
|
|
1159
|
+
if (cleanupUser && cleanupProjectFolder) {
|
|
1160
|
+
const cleanupResult = await cleanupShareTargetFolder(cleanupUser, cleanupProjectFolder, i);
|
|
1161
|
+
resultJson.targetFolderCleanup = {
|
|
1162
|
+
removed: cleanupResult.Removed ?? false,
|
|
1163
|
+
projectFolder: cleanupProjectFolder,
|
|
1164
|
+
};
|
|
1165
|
+
}
|
|
1166
|
+
else {
|
|
1167
|
+
resultJson.targetFolderCleanup = {
|
|
1168
|
+
removed: false,
|
|
1169
|
+
reason: 'Kein interner User-Share mit Unterordner-Zielpfad, nichts aufzuräumen',
|
|
1170
|
+
};
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
returnData.push({ json: resultJson, pairedItem: i });
|
|
990
1174
|
}
|
|
991
1175
|
// ──────────────────────────────────────────── VERSION ──
|
|
992
1176
|
}
|