n8n-nodes-qlik-cloud 1.1.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,77 +1,77 @@
1
1
  # n8n-nodes-qlik-cloud
2
2
 
3
- This package contains an n8n community node for integrating with **Qlik Cloud** REST APIs.
3
+ This package contains an n8n community node for integrating with **Qlik Cloud** REST APIs. It is a personal project and is not supported or endorsed by Qlik.
4
4
 
5
5
  ## Scope
6
6
 
7
- My goal is to deliver a complete integration with the Qlik Cloud REST APIs, covering all available endpoints. This is still a work in progress because Qlik Cloud continues to add new endpoints and methods. As of 12/29/2025, the integration includes 564 methods across 64 endpoints, and 72 calls were already implemented.
8
-
9
- - /apis/rest/.well-known: 1
10
- - /apis/rest/api-keys: 7
11
- - /apis/rest/apps: 45
12
- - /apis/rest/assistants: 29
13
- - /apis/rest/audits: 7
14
- - /apis/rest/automation-connections: 8
15
- - /apis/rest/automation-connectors: 1
16
- - /apis/rest/automations: 18
17
- - /apis/rest/automl-deployments: 1
18
- - /apis/rest/automl-predictions: 6
19
- - /apis/rest/banners: 2
20
- - /apis/rest/brands: 12
21
- - /apis/rest/collections: 11
22
- - /apis/rest/conditions: 11
23
- - /apis/rest/consumption: 1
24
- - /apis/rest/core/ip-policies: 5
25
- - /apis/rest/csp-origins: 6
26
- - /apis/rest/csrf-token: 1
27
- - /apis/rest/data-alerts: 16
28
- - /apis/rest/data-assets: 5
29
- - /apis/rest/data-connections: 9
30
- - /apis/rest/data-credentials: 5
31
- - /apis/rest/data-files: 12
32
- - /apis/rest/data-qualities: 3
33
- - /apis/rest/data-sets: 6
34
- - /apis/rest/data-sources: 5
35
- - /apis/rest/data-stores: 10
36
- - /apis/rest/di-projects: 19
37
- - /apis/rest/direct-access-agents: 15
38
- - /apis/rest/encryption: 10
39
- - /apis/rest/extensions: 7
40
- - /apis/rest/glossaries: 24
41
- - /apis/rest/groups: 8
42
- - /apis/rest/identity-providers: 8
43
- - /apis/rest/items: 8
44
- - /apis/rest/knowledgebases: 18
45
- - /apis/rest/licenses: 9
46
- - /apis/rest/lineage-graphs: 8
47
- - /apis/rest/login: 2
48
- - /apis/rest/ml: 42
49
- - /apis/rest/notes: 2
50
- - /apis/rest/notifications: 1
51
- - /apis/rest/oauth: 3
52
- - /apis/rest/oauth-clients: 11
53
- - /apis/rest/oauth-tokens: 2
54
- - /apis/rest/pagination-sorting-filtering: 1
55
- - /apis/rest/questions: 2
56
- - /apis/rest/quotas: 2
57
- - /apis/rest/rate-limiting: 1
58
- - /apis/rest/reload-tasks: 5
59
- - /apis/rest/reloads: 4
60
- - /apis/rest/report-templates: 7
61
- - /apis/rest/reports: 3
62
- - /apis/rest/roles: 5
63
- - /apis/rest/sharing-tasks: 13
64
- - /apis/rest/spaces: 17
65
- - /apis/rest/tasks: 10
66
- - /apis/rest/temp-contents: 5
67
- - /apis/rest/tenants: 6
68
- - /apis/rest/themes: 7
69
- - /apis/rest/transports: 7
70
- - /apis/rest/ui-config: 7
71
- - /apis/rest/users: 9
72
- - /apis/rest/web-integrations: 5
73
- - /apis/rest/web-notifications: 6
74
- - /apis/rest/webhooks: 10
7
+ My goal is to deliver a complete integration with the Qlik Cloud REST APIs, covering all available endpoints. This is still a work in progress because Qlik Cloud continues to add new endpoints and methods. As of 12/29/2025, the integration includes 564 methods across 64 endpoints, and 98 calls were already implemented.
8
+
9
+ - [ ] /apis/rest/.well-known: 1
10
+ - [ ] /apis/rest/api-keys: 7
11
+ - [x] /apis/rest/apps: 45
12
+ - [x] /apis/rest/assistants: 29
13
+ - [x] /apis/rest/audits: 7
14
+ - [ ] /apis/rest/automation-connections: 8
15
+ - [ ] /apis/rest/automation-connectors: 1
16
+ - [ ] /apis/rest/automations: 18
17
+ - [ ] /apis/rest/automl-deployments: 1
18
+ - [ ] /apis/rest/automl-predictions: 6
19
+ - [ ] /apis/rest/banners: 2
20
+ - [ ] /apis/rest/brands: 12
21
+ - [ ] /apis/rest/collections: 11
22
+ - [ ] /apis/rest/conditions: 11
23
+ - [ ] /apis/rest/consumption: 1
24
+ - [ ] /apis/rest/core/ip-policies: 5
25
+ - [ ] /apis/rest/csp-origins: 6
26
+ - [ ] /apis/rest/csrf-token: 1
27
+ - [x] /apis/rest/data-alerts: 16
28
+ - [ ] /apis/rest/data-assets: 5
29
+ - [ ] /apis/rest/data-connections: 9
30
+ - [ ] /apis/rest/data-credentials: 5
31
+ - [ ] /apis/rest/data-files: 12
32
+ - [ ] /apis/rest/data-qualities: 3
33
+ - [ ] /apis/rest/data-sets: 6
34
+ - [ ] /apis/rest/data-sources: 5
35
+ - [ ] /apis/rest/data-stores: 10
36
+ - [ ] /apis/rest/di-projects: 19
37
+ - [ ] /apis/rest/direct-access-agents: 15
38
+ - [ ] /apis/rest/encryption: 10
39
+ - [ ] /apis/rest/extensions: 7
40
+ - [ ] /apis/rest/glossaries: 24
41
+ - [ ] /apis/rest/groups: 8
42
+ - [ ] /apis/rest/identity-providers: 8
43
+ - [x] /apis/rest/items: 8
44
+ - [ ] /apis/rest/knowledgebases: 18
45
+ - [ ] /apis/rest/licenses: 9
46
+ - [ ] /apis/rest/lineage-graphs: 8
47
+ - [ ] /apis/rest/login: 2
48
+ - [ ] /apis/rest/ml: 42
49
+ - [ ] /apis/rest/notes: 2
50
+ - [ ] /apis/rest/notifications: 1
51
+ - [ ] /apis/rest/oauth: 3
52
+ - [ ] /apis/rest/oauth-clients: 11
53
+ - [ ] /apis/rest/oauth-tokens: 2
54
+ - [ ] /apis/rest/pagination-sorting-filtering: 1
55
+ - [ ] /apis/rest/questions: 2
56
+ - [ ] /apis/rest/quotas: 2
57
+ - [ ] /apis/rest/rate-limiting: 1
58
+ - [x] /apis/rest/reload-tasks: 5
59
+ - [ ] /apis/rest/reloads: 4
60
+ - [ ] /apis/rest/report-templates: 7
61
+ - [ ] /apis/rest/reports: 3
62
+ - [ ] /apis/rest/roles: 5
63
+ - [ ] /apis/rest/sharing-tasks: 13
64
+ - [ ] /apis/rest/spaces: 17
65
+ - [ ] /apis/rest/tasks: 10
66
+ - [ ] /apis/rest/temp-contents: 5
67
+ - [ ] /apis/rest/tenants: 6
68
+ - [ ] /apis/rest/themes: 7
69
+ - [ ] /apis/rest/transports: 7
70
+ - [ ] /apis/rest/ui-config: 7
71
+ - [ ] /apis/rest/users: 9
72
+ - [ ] /apis/rest/web-integrations: 5
73
+ - [ ] /apis/rest/web-notifications: 6
74
+ - [ ] /apis/rest/webhooks: 10
75
75
 
76
76
 
77
77
  ### Apps Management
@@ -127,6 +127,14 @@ My goal is to deliver a complete integration with the Qlik Cloud REST APIs, cove
127
127
  - **Task Runs** - List runs for a task or for a resource, and fetch the latest run
128
128
  - **Run Logs** - Retrieve logs for a specific task run in JSON or plain text
129
129
 
130
+ ### Data Alerts
131
+ - **Alert Tasks** - List, create, get, update, or delete data alert tasks
132
+ - **Conditions & Recipients** - Retrieve alert conditions and recipient statistics
133
+ - **Executions** - Get or delete individual executions, list executions, and fetch evaluation details
134
+ - **Execution Stats** - Retrieve aggregated execution statistics for a task
135
+ - **Actions** - Trigger alert tasks manually and validate task definitions
136
+ - **Settings** - Get or update tenant-level data alert settings
137
+
130
138
  ## Authentication
131
139
 
132
140
  This node supports **Bearer Token Authentication**:
@@ -8,6 +8,7 @@ const index_2 = require("./resources/assistants/index");
8
8
  const index_3 = require("./resources/audits/index");
9
9
  const index_4 = require("./resources/tasks/index");
10
10
  const index_5 = require("./resources/items/index");
11
+ const index_6 = require("./resources/data-alerts/index");
11
12
  const DEFAULT_PAGE_SIZE = 100;
12
13
  const BINARY_DOWNLOAD_OPTIONS = {
13
14
  json: false,
@@ -67,6 +68,121 @@ async function fetchPaginatedResults(context, endpoint, filters, limit, pageSize
67
68
  function encodeMediaPath(path) {
68
69
  return encodeURIComponent(path).replace(/%2F/g, '/');
69
70
  }
71
+ async function handleDataAlertsResource(operation, context, itemIndex) {
72
+ switch (operation) {
73
+ case 'getAll': {
74
+ const returnAll = context.getNodeParameter('returnAll', itemIndex);
75
+ const limit = returnAll ? undefined : context.getNodeParameter('limit', itemIndex);
76
+ const options = context.getNodeParameter('options', itemIndex);
77
+ const qs = {};
78
+ if (options.appId)
79
+ qs.appID = options.appId;
80
+ if (options.conditionId)
81
+ qs.conditionId = options.conditionId;
82
+ if (options.ownerId)
83
+ qs.ownerId = options.ownerId;
84
+ if (options.ownerName)
85
+ qs.ownerName = options.ownerName;
86
+ if (options.role)
87
+ qs.role = options.role;
88
+ if (options.next)
89
+ qs.next = options.next;
90
+ if (options.prev)
91
+ qs.prev = options.prev;
92
+ if (options.offset !== undefined)
93
+ qs.offset = options.offset;
94
+ const pageSize = limit === undefined ? DEFAULT_PAGE_SIZE : Math.min(DEFAULT_PAGE_SIZE, limit);
95
+ return await fetchPaginatedResults(context, '/api/v1/data-alerts', qs, limit, pageSize);
96
+ }
97
+ case 'create': {
98
+ const body = context.getNodeParameter('body', itemIndex);
99
+ const payload = typeof body === 'string' ? JSON.parse(body) : body;
100
+ return await transport_1.qlikApiRequest.call(context, 'POST', '/api/v1/data-alerts', payload);
101
+ }
102
+ case 'get': {
103
+ const alertId = context.getNodeParameter('alertId', itemIndex);
104
+ return await transport_1.qlikApiRequest.call(context, 'GET', `/api/v1/data-alerts/${alertId}`);
105
+ }
106
+ case 'update': {
107
+ const alertId = context.getNodeParameter('alertId', itemIndex);
108
+ const body = context.getNodeParameter('body', itemIndex);
109
+ const payload = typeof body === 'string' ? JSON.parse(body) : body;
110
+ return await transport_1.qlikApiRequest.call(context, 'PATCH', `/api/v1/data-alerts/${alertId}`, payload);
111
+ }
112
+ case 'delete': {
113
+ const alertId = context.getNodeParameter('alertId', itemIndex);
114
+ await transport_1.qlikApiRequest.call(context, 'DELETE', `/api/v1/data-alerts/${alertId}`);
115
+ return { success: true };
116
+ }
117
+ case 'getCondition': {
118
+ const alertId = context.getNodeParameter('alertId', itemIndex);
119
+ return await transport_1.qlikApiRequest.call(context, 'GET', `/api/v1/data-alerts/${alertId}/condition`);
120
+ }
121
+ case 'getExecution': {
122
+ const alertId = context.getNodeParameter('alertId', itemIndex);
123
+ const executionId = context.getNodeParameter('executionId', itemIndex);
124
+ return await transport_1.qlikApiRequest.call(context, 'GET', `/api/v1/data-alerts/${alertId}/executions/${executionId}`);
125
+ }
126
+ case 'deleteExecution': {
127
+ const alertId = context.getNodeParameter('alertId', itemIndex);
128
+ const executionId = context.getNodeParameter('executionId', itemIndex);
129
+ await transport_1.qlikApiRequest.call(context, 'DELETE', `/api/v1/data-alerts/${alertId}/executions/${executionId}`);
130
+ return { success: true };
131
+ }
132
+ case 'recipientStats': {
133
+ const alertId = context.getNodeParameter('alertId', itemIndex);
134
+ return await transport_1.qlikApiRequest.call(context, 'GET', `/api/v1/data-alerts/${alertId}/recipient-stats`);
135
+ }
136
+ case 'listExecutions': {
137
+ const taskId = context.getNodeParameter('taskId', itemIndex);
138
+ const returnAll = context.getNodeParameter('returnAll', itemIndex);
139
+ const limit = returnAll ? undefined : context.getNodeParameter('limit', itemIndex);
140
+ const options = context.getNodeParameter('options', itemIndex);
141
+ const qs = {};
142
+ if (options.next)
143
+ qs.next = options.next;
144
+ if (options.prev)
145
+ qs.prev = options.prev;
146
+ if (options.offset !== undefined)
147
+ qs.offset = options.offset;
148
+ const pageSize = limit === undefined ? DEFAULT_PAGE_SIZE : Math.min(DEFAULT_PAGE_SIZE, limit);
149
+ return await fetchPaginatedResults(context, `/api/v1/data-alerts/${taskId}/executions`, qs, limit, pageSize);
150
+ }
151
+ case 'getExecutionEvaluation': {
152
+ const taskId = context.getNodeParameter('taskId', itemIndex);
153
+ const executionId = context.getNodeParameter('executionId', itemIndex);
154
+ return await transport_1.qlikApiRequest.call(context, 'GET', `/api/v1/data-alerts/${taskId}/executions/${executionId}/evaluations`);
155
+ }
156
+ case 'getExecutionStats': {
157
+ const taskId = context.getNodeParameter('taskId', itemIndex);
158
+ const options = context.getNodeParameter('options', itemIndex);
159
+ const qs = {};
160
+ if (options.period)
161
+ qs.period = options.period;
162
+ return await transport_1.qlikApiRequest.call(context, 'GET', `/api/v1/data-alerts/${taskId}/executions/stats`, undefined, qs);
163
+ }
164
+ case 'trigger': {
165
+ const body = context.getNodeParameter('body', itemIndex);
166
+ const payload = typeof body === 'string' ? JSON.parse(body) : body;
167
+ return await transport_1.qlikApiRequest.call(context, 'POST', '/api/v1/data-alerts/actions/trigger', payload);
168
+ }
169
+ case 'validate': {
170
+ const body = context.getNodeParameter('body', itemIndex);
171
+ const payload = typeof body === 'string' ? JSON.parse(body) : body;
172
+ return await transport_1.qlikApiRequest.call(context, 'POST', '/api/v1/data-alerts/actions/validate', payload);
173
+ }
174
+ case 'getSettings': {
175
+ return await transport_1.qlikApiRequest.call(context, 'GET', '/api/v1/data-alerts/settings');
176
+ }
177
+ case 'updateSettings': {
178
+ const body = context.getNodeParameter('body', itemIndex);
179
+ const payload = typeof body === 'string' ? JSON.parse(body) : body;
180
+ return await transport_1.qlikApiRequest.call(context, 'PUT', '/api/v1/data-alerts/settings', payload);
181
+ }
182
+ default:
183
+ throw new n8n_workflow_1.NodeOperationError(context.getNode(), `Unknown operation: ${operation}`);
184
+ }
185
+ }
70
186
  async function handleAppsResource(operation, context, itemIndex) {
71
187
  switch (operation) {
72
188
  case 'getAll': {
@@ -761,7 +877,7 @@ class QlikCloud {
761
877
  group: ['transform'],
762
878
  version: 1,
763
879
  subtitle: '={{$parameter["resource"] + ": " + $parameter["operation"]}}',
764
- description: 'Interact with Qlik Cloud APIs (Apps, Analytics Tasks, Items, Audits, Assistants)',
880
+ description: 'Interact with Qlik Cloud APIs (Apps, Analytics Tasks, Items, Audits, Assistants, Data Alerts)',
765
881
  defaults: {
766
882
  name: 'Qlik Cloud',
767
883
  },
@@ -772,6 +888,10 @@ class QlikCloud {
772
888
  name: 'qlikCloudApi',
773
889
  required: true,
774
890
  },
891
+ {
892
+ name: 'qlikCloudOAuth2Api',
893
+ required: true,
894
+ },
775
895
  ],
776
896
  properties: [
777
897
  {
@@ -795,6 +915,11 @@ class QlikCloud {
795
915
  value: 'assistants',
796
916
  description: 'Interact with AI assistants',
797
917
  },
918
+ {
919
+ name: 'Data Alerts',
920
+ value: 'dataAlerts',
921
+ description: 'Manage data alert tasks and settings',
922
+ },
798
923
  {
799
924
  name: 'Audits',
800
925
  value: 'audits',
@@ -811,6 +936,7 @@ class QlikCloud {
811
936
  ...index_1.appDescription,
812
937
  ...index_4.analyticsTaskDescription,
813
938
  ...index_2.assistantDescription,
939
+ ...index_6.dataAlertDescription,
814
940
  ...index_3.auditDescription,
815
941
  ...index_5.itemDescription,
816
942
  ],
@@ -833,6 +959,9 @@ class QlikCloud {
833
959
  else if (resource === 'assistants') {
834
960
  responseData = await handleAssistantsResource(operation, this, i);
835
961
  }
962
+ else if (resource === 'dataAlerts') {
963
+ responseData = await handleDataAlertsResource(operation, this, i);
964
+ }
836
965
  else if (resource === 'audits') {
837
966
  responseData = await handleAuditsResource(operation, this, i);
838
967
  }
@@ -0,0 +1,17 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const dataAlertsGetAllDescription: INodeProperties[];
3
+ export declare const dataAlertsCreateDescription: INodeProperties[];
4
+ export declare const dataAlertsGetDescription: INodeProperties[];
5
+ export declare const dataAlertsUpdateDescription: INodeProperties[];
6
+ export declare const dataAlertsDeleteDescription: INodeProperties[];
7
+ export declare const dataAlertsConditionDescription: INodeProperties[];
8
+ export declare const dataAlertsExecutionDescription: INodeProperties[];
9
+ export declare const dataAlertsRecipientStatsDescription: INodeProperties[];
10
+ export declare const dataAlertsExecutionsListDescription: INodeProperties[];
11
+ export declare const dataAlertsExecutionEvaluationDescription: INodeProperties[];
12
+ export declare const dataAlertsExecutionStatsDescription: INodeProperties[];
13
+ export declare const dataAlertsTriggerDescription: INodeProperties[];
14
+ export declare const dataAlertsValidateDescription: INodeProperties[];
15
+ export declare const dataAlertsSettingsGetDescription: INodeProperties[];
16
+ export declare const dataAlertsSettingsUpdateDescription: INodeProperties[];
17
+ export declare const dataAlertDescription: INodeProperties[];