n8n-nodes-antony-cloud-office 0.1.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 +151 -0
- package/dist/credentials/AntonyApi.credentials.d.ts +21 -0
- package/dist/credentials/AntonyApi.credentials.js +99 -0
- package/dist/credentials/AntonyApi.credentials.js.map +1 -0
- package/dist/credentials/NextcloudApi.credentials.d.ts +23 -0
- package/dist/credentials/NextcloudApi.credentials.js +198 -0
- package/dist/credentials/NextcloudApi.credentials.js.map +1 -0
- package/dist/nodes/AntonyGraphql/AntonyGraphql.node.d.ts +5 -0
- package/dist/nodes/AntonyGraphql/AntonyGraphql.node.js +279 -0
- package/dist/nodes/AntonyGraphql/AntonyGraphql.node.js.map +1 -0
- package/dist/nodes/AntonyGraphql/antony.svg +58 -0
- package/dist/nodes/AntonyNextcloudNode/NextcloudNode.node.d.ts +6 -0
- package/dist/nodes/AntonyNextcloudNode/NextcloudNode.node.js +1048 -0
- package/dist/nodes/AntonyNextcloudNode/NextcloudNode.node.js.map +1 -0
- package/dist/nodes/AntonyNextcloudNode/antony.svg +58 -0
- package/dist/nodes/AntonyRest/AntonyRest.node.d.ts +10 -0
- package/dist/nodes/AntonyRest/AntonyRest.node.js +168 -0
- package/dist/nodes/AntonyRest/AntonyRest.node.js.map +1 -0
- package/dist/nodes/AntonyRest/antony.svg +58 -0
- package/dist/nodes/shared/restOperations.d.ts +34 -0
- package/dist/nodes/shared/restOperations.js +365 -0
- package/dist/nodes/shared/restOperations.js.map +1 -0
- package/dist/nodes/shared/transport.d.ts +4 -0
- package/dist/nodes/shared/transport.js +38 -0
- package/dist/nodes/shared/transport.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IExecuteFunctions, ILoadOptionsFunctions, INodeExecutionData, INodePropertyOptions, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class AntonyRest implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
methods: {
|
|
5
|
+
loadOptions: {
|
|
6
|
+
getFlexobjectTypes(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AntonyRest = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const transport_1 = require("../shared/transport");
|
|
6
|
+
const restOperations_1 = require("../shared/restOperations");
|
|
7
|
+
class AntonyRest {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.description = {
|
|
10
|
+
displayName: 'Antony REST',
|
|
11
|
+
name: 'antonyRest',
|
|
12
|
+
icon: 'file:antony.svg',
|
|
13
|
+
group: ['transform'],
|
|
14
|
+
version: 1,
|
|
15
|
+
subtitle: '={{$parameter["resource"] + ": " + $parameter["operation"]}}',
|
|
16
|
+
description: 'Call known Antony REST API operations',
|
|
17
|
+
defaults: {
|
|
18
|
+
name: 'Antony REST',
|
|
19
|
+
},
|
|
20
|
+
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
21
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
22
|
+
credentials: [
|
|
23
|
+
{
|
|
24
|
+
name: 'antonyApi',
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
properties: [
|
|
29
|
+
{
|
|
30
|
+
displayName: 'Resource',
|
|
31
|
+
name: 'resource',
|
|
32
|
+
type: 'options',
|
|
33
|
+
noDataExpression: true,
|
|
34
|
+
options: restOperations_1.resources,
|
|
35
|
+
default: 'contact',
|
|
36
|
+
},
|
|
37
|
+
...(0, restOperations_1.buildOperationProperties)(),
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
this.methods = {
|
|
41
|
+
loadOptions: {
|
|
42
|
+
async getFlexobjectTypes() {
|
|
43
|
+
const response = await (0, transport_1.antonyRequest)(this, {
|
|
44
|
+
method: 'GET',
|
|
45
|
+
url: '/api/v1/flexobject_types',
|
|
46
|
+
json: true,
|
|
47
|
+
});
|
|
48
|
+
return response.map((type) => ({
|
|
49
|
+
name: type.displayName || type.setName || String(type.typeId),
|
|
50
|
+
value: type.typeId,
|
|
51
|
+
description: type.setName,
|
|
52
|
+
}));
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async execute() {
|
|
58
|
+
const items = this.getInputData();
|
|
59
|
+
const returnData = [];
|
|
60
|
+
for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
|
|
61
|
+
try {
|
|
62
|
+
const resource = this.getNodeParameter('resource', itemIndex);
|
|
63
|
+
const operationName = this.getNodeParameter('operation', itemIndex);
|
|
64
|
+
const operation = (0, restOperations_1.getOperation)(resource, operationName);
|
|
65
|
+
const credentials = await this.getCredentials('antonyApi');
|
|
66
|
+
const realm = encodeURIComponent(String(credentials.realm || 'antony'));
|
|
67
|
+
let url = operation.path.replace('/kc/admin/realms/antony', `/kc/admin/realms/${realm}`);
|
|
68
|
+
const qs = {};
|
|
69
|
+
for (const field of operation.fields ?? []) {
|
|
70
|
+
if (field.name === 'bodyJson')
|
|
71
|
+
continue;
|
|
72
|
+
const value = this.getNodeParameter(field.name, itemIndex, field.default ?? '');
|
|
73
|
+
if (value === '' || value === undefined || value === null)
|
|
74
|
+
continue;
|
|
75
|
+
if (field.location === 'path') {
|
|
76
|
+
url = url.replace(`{${field.name}}`, encodeURIComponent(String(value)));
|
|
77
|
+
}
|
|
78
|
+
else if (field.location === 'query') {
|
|
79
|
+
qs[field.name] = value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const requestOptions = {
|
|
83
|
+
method: operation.method,
|
|
84
|
+
url,
|
|
85
|
+
qs,
|
|
86
|
+
json: !operation.binaryDownload,
|
|
87
|
+
};
|
|
88
|
+
if (operation.binaryUpload) {
|
|
89
|
+
const binaryPropertyName = this.getNodeParameter('binaryPropertyName', itemIndex);
|
|
90
|
+
const binaryData = this.helpers.assertBinaryData(itemIndex, binaryPropertyName);
|
|
91
|
+
const buffer = await this.helpers.getBinaryDataBuffer(itemIndex, binaryPropertyName);
|
|
92
|
+
const fileName = this.getNodeParameter('fileName', itemIndex, binaryData.fileName ?? '') || binaryData.fileName || 'file';
|
|
93
|
+
const form = new FormData();
|
|
94
|
+
form.append(operation.binaryUpload.bodyFieldName, new Blob([new Uint8Array(buffer)], {
|
|
95
|
+
type: binaryData.mimeType || operation.binaryUpload.defaultContentType || 'application/octet-stream',
|
|
96
|
+
}), fileName);
|
|
97
|
+
requestOptions.body = form;
|
|
98
|
+
requestOptions.json = false;
|
|
99
|
+
}
|
|
100
|
+
else if (operation.bodyMode && operation.bodyMode !== 'none') {
|
|
101
|
+
requestOptions.body = getBody.call(this, itemIndex);
|
|
102
|
+
}
|
|
103
|
+
if (operation.binaryDownload) {
|
|
104
|
+
requestOptions.encoding = 'arraybuffer';
|
|
105
|
+
}
|
|
106
|
+
const response = await (0, transport_1.antonyRequest)(this, requestOptions);
|
|
107
|
+
if (operation.binaryDownload) {
|
|
108
|
+
const binaryPropertyName = this.getNodeParameter('binaryPropertyName', itemIndex);
|
|
109
|
+
const buffer = Buffer.isBuffer(response) ? response : Buffer.from(response);
|
|
110
|
+
returnData.push({
|
|
111
|
+
json: { success: true },
|
|
112
|
+
binary: {
|
|
113
|
+
[binaryPropertyName]: await this.helpers.prepareBinaryData(buffer),
|
|
114
|
+
},
|
|
115
|
+
pairedItem: { item: itemIndex },
|
|
116
|
+
});
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
const outputItems = (0, transport_1.normalizeToItems)(response);
|
|
120
|
+
for (const json of outputItems) {
|
|
121
|
+
returnData.push({ json, pairedItem: { item: itemIndex } });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (this.continueOnFail()) {
|
|
126
|
+
returnData.push({ json: { error: error.message }, pairedItem: { item: itemIndex } });
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, { itemIndex });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return [returnData];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.AntonyRest = AntonyRest;
|
|
136
|
+
function getBody(itemIndex) {
|
|
137
|
+
const mode = this.getNodeParameter('bodyInputMode', itemIndex, 'json');
|
|
138
|
+
if (mode === 'json') {
|
|
139
|
+
const rawBody = this.getNodeParameter('bodyJson', itemIndex, '{}');
|
|
140
|
+
if (typeof rawBody === 'object') {
|
|
141
|
+
return rawBody;
|
|
142
|
+
}
|
|
143
|
+
const parsed = JSON.parse(rawBody);
|
|
144
|
+
return parsed;
|
|
145
|
+
}
|
|
146
|
+
const bodyParameters = this.getNodeParameter('bodyParameters.parameters', itemIndex, []);
|
|
147
|
+
return bodyParameters.reduce((acc, entry) => {
|
|
148
|
+
if (entry.name) {
|
|
149
|
+
acc[entry.name] = parseValue(entry.value);
|
|
150
|
+
}
|
|
151
|
+
return acc;
|
|
152
|
+
}, {});
|
|
153
|
+
}
|
|
154
|
+
function parseValue(value) {
|
|
155
|
+
if (value === 'true')
|
|
156
|
+
return true;
|
|
157
|
+
if (value === 'false')
|
|
158
|
+
return false;
|
|
159
|
+
if (value === 'null')
|
|
160
|
+
return null;
|
|
161
|
+
if (value !== '' && !Number.isNaN(Number(value)))
|
|
162
|
+
return Number(value);
|
|
163
|
+
if ((value.startsWith('{') && value.endsWith('}')) || (value.startsWith('[') && value.endsWith(']'))) {
|
|
164
|
+
return JSON.parse(value);
|
|
165
|
+
}
|
|
166
|
+
return value;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=AntonyRest.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AntonyRest.node.js","sourceRoot":"","sources":["../../../nodes/AntonyRest/AntonyRest.node.ts"],"names":[],"mappings":"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"}
|