@learningsuite/n8n-nodes-learningsuite 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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +555 -0
  3. package/README.md +427 -0
  4. package/dist/credentials/LearningSuiteApi.credentials.d.ts +10 -0
  5. package/dist/credentials/LearningSuiteApi.credentials.js +49 -0
  6. package/dist/credentials/learningsuite.svg +1 -0
  7. package/dist/nodes/LearningSuite/LearningSuite.node.d.ts +65 -0
  8. package/dist/nodes/LearningSuite/LearningSuite.node.js +221 -0
  9. package/dist/nodes/LearningSuite/LearningSuiteTrigger.node.d.ts +66 -0
  10. package/dist/nodes/LearningSuite/LearningSuiteTrigger.node.js +433 -0
  11. package/dist/nodes/LearningSuite/descriptions/ai.properties.d.ts +2 -0
  12. package/dist/nodes/LearningSuite/descriptions/ai.properties.js +141 -0
  13. package/dist/nodes/LearningSuite/descriptions/apiCall.properties.d.ts +2 -0
  14. package/dist/nodes/LearningSuite/descriptions/apiCall.properties.js +87 -0
  15. package/dist/nodes/LearningSuite/descriptions/bundle.properties.d.ts +2 -0
  16. package/dist/nodes/LearningSuite/descriptions/bundle.properties.js +32 -0
  17. package/dist/nodes/LearningSuite/descriptions/community.properties.d.ts +2 -0
  18. package/dist/nodes/LearningSuite/descriptions/community.properties.js +229 -0
  19. package/dist/nodes/LearningSuite/descriptions/course.properties.d.ts +2 -0
  20. package/dist/nodes/LearningSuite/descriptions/course.properties.js +248 -0
  21. package/dist/nodes/LearningSuite/descriptions/customFields.properties.d.ts +2 -0
  22. package/dist/nodes/LearningSuite/descriptions/customFields.properties.js +452 -0
  23. package/dist/nodes/LearningSuite/descriptions/group.properties.d.ts +2 -0
  24. package/dist/nodes/LearningSuite/descriptions/group.properties.js +165 -0
  25. package/dist/nodes/LearningSuite/descriptions/hub.properties.d.ts +2 -0
  26. package/dist/nodes/LearningSuite/descriptions/hub.properties.js +167 -0
  27. package/dist/nodes/LearningSuite/descriptions/member.properties.d.ts +2 -0
  28. package/dist/nodes/LearningSuite/descriptions/member.properties.js +625 -0
  29. package/dist/nodes/LearningSuite/descriptions/module.properties.d.ts +2 -0
  30. package/dist/nodes/LearningSuite/descriptions/module.properties.js +84 -0
  31. package/dist/nodes/LearningSuite/descriptions/popup.properties.d.ts +2 -0
  32. package/dist/nodes/LearningSuite/descriptions/popup.properties.js +73 -0
  33. package/dist/nodes/LearningSuite/descriptions/resource.selector.d.ts +2 -0
  34. package/dist/nodes/LearningSuite/descriptions/resource.selector.js +87 -0
  35. package/dist/nodes/LearningSuite/descriptions/role.properties.d.ts +2 -0
  36. package/dist/nodes/LearningSuite/descriptions/role.properties.js +14 -0
  37. package/dist/nodes/LearningSuite/descriptions/teamMember.properties.d.ts +2 -0
  38. package/dist/nodes/LearningSuite/descriptions/teamMember.properties.js +74 -0
  39. package/dist/nodes/LearningSuite/descriptions/trigger.instant.properties.d.ts +2 -0
  40. package/dist/nodes/LearningSuite/descriptions/trigger.instant.properties.js +542 -0
  41. package/dist/nodes/LearningSuite/descriptions/user.properties.d.ts +2 -0
  42. package/dist/nodes/LearningSuite/descriptions/user.properties.js +135 -0
  43. package/dist/nodes/LearningSuite/descriptions/webhook.properties.d.ts +2 -0
  44. package/dist/nodes/LearningSuite/descriptions/webhook.properties.js +672 -0
  45. package/dist/nodes/LearningSuite/descriptions/webhook.sampleData.properties.d.ts +2 -0
  46. package/dist/nodes/LearningSuite/descriptions/webhook.sampleData.properties.js +401 -0
  47. package/dist/nodes/LearningSuite/exec.types.d.ts +5 -0
  48. package/dist/nodes/LearningSuite/exec.types.js +2 -0
  49. package/dist/nodes/LearningSuite/execute/ai.handlers.d.ts +4 -0
  50. package/dist/nodes/LearningSuite/execute/ai.handlers.js +23 -0
  51. package/dist/nodes/LearningSuite/execute/apiCall.handlers.d.ts +4 -0
  52. package/dist/nodes/LearningSuite/execute/apiCall.handlers.js +46 -0
  53. package/dist/nodes/LearningSuite/execute/bundle.handlers.d.ts +5 -0
  54. package/dist/nodes/LearningSuite/execute/bundle.handlers.js +12 -0
  55. package/dist/nodes/LearningSuite/execute/community.handlers.d.ts +11 -0
  56. package/dist/nodes/LearningSuite/execute/community.handlers.js +94 -0
  57. package/dist/nodes/LearningSuite/execute/course.handlers.d.ts +10 -0
  58. package/dist/nodes/LearningSuite/execute/course.handlers.js +87 -0
  59. package/dist/nodes/LearningSuite/execute/customFields.handlers.d.ts +16 -0
  60. package/dist/nodes/LearningSuite/execute/customFields.handlers.js +342 -0
  61. package/dist/nodes/LearningSuite/execute/group.handlers.d.ts +15 -0
  62. package/dist/nodes/LearningSuite/execute/group.handlers.js +99 -0
  63. package/dist/nodes/LearningSuite/execute/hub.handlers.d.ts +9 -0
  64. package/dist/nodes/LearningSuite/execute/hub.handlers.js +65 -0
  65. package/dist/nodes/LearningSuite/execute/member.handlers.d.ts +23 -0
  66. package/dist/nodes/LearningSuite/execute/member.handlers.js +244 -0
  67. package/dist/nodes/LearningSuite/execute/module.handlers.d.ts +6 -0
  68. package/dist/nodes/LearningSuite/execute/module.handlers.js +36 -0
  69. package/dist/nodes/LearningSuite/execute/popup.handlers.d.ts +7 -0
  70. package/dist/nodes/LearningSuite/execute/popup.handlers.js +24 -0
  71. package/dist/nodes/LearningSuite/execute/registry.d.ts +2 -0
  72. package/dist/nodes/LearningSuite/execute/registry.js +35 -0
  73. package/dist/nodes/LearningSuite/execute/role.handlers.d.ts +4 -0
  74. package/dist/nodes/LearningSuite/execute/role.handlers.js +6 -0
  75. package/dist/nodes/LearningSuite/execute/teamMember.handlers.d.ts +6 -0
  76. package/dist/nodes/LearningSuite/execute/teamMember.handlers.js +21 -0
  77. package/dist/nodes/LearningSuite/execute/user.handlers.d.ts +4 -0
  78. package/dist/nodes/LearningSuite/execute/user.handlers.js +32 -0
  79. package/dist/nodes/LearningSuite/execute/webhook.handlers.d.ts +9 -0
  80. package/dist/nodes/LearningSuite/execute/webhook.handlers.js +306 -0
  81. package/dist/nodes/LearningSuite/icons/learningsuite-icon-dark.svg +1 -0
  82. package/dist/nodes/LearningSuite/icons/learningsuite-icon-light.svg +1 -0
  83. package/dist/nodes/LearningSuite/index.d.ts +1 -0
  84. package/dist/nodes/LearningSuite/index.js +17 -0
  85. package/dist/nodes/LearningSuite/methods/loadOptions/apiCall.loadOptions.d.ts +1 -0
  86. package/dist/nodes/LearningSuite/methods/loadOptions/apiCall.loadOptions.js +2 -0
  87. package/dist/nodes/LearningSuite/methods/loadOptions/bundle.loadOptions.d.ts +2 -0
  88. package/dist/nodes/LearningSuite/methods/loadOptions/bundle.loadOptions.js +7 -0
  89. package/dist/nodes/LearningSuite/methods/loadOptions/common.d.ts +7 -0
  90. package/dist/nodes/LearningSuite/methods/loadOptions/common.js +22 -0
  91. package/dist/nodes/LearningSuite/methods/loadOptions/community.loadOptions.d.ts +5 -0
  92. package/dist/nodes/LearningSuite/methods/loadOptions/community.loadOptions.js +80 -0
  93. package/dist/nodes/LearningSuite/methods/loadOptions/course.loadOptions.d.ts +5 -0
  94. package/dist/nodes/LearningSuite/methods/loadOptions/course.loadOptions.js +58 -0
  95. package/dist/nodes/LearningSuite/methods/loadOptions/customFields.loadOptions.d.ts +12 -0
  96. package/dist/nodes/LearningSuite/methods/loadOptions/customFields.loadOptions.js +55 -0
  97. package/dist/nodes/LearningSuite/methods/loadOptions/group.loadOptions.d.ts +2 -0
  98. package/dist/nodes/LearningSuite/methods/loadOptions/group.loadOptions.js +7 -0
  99. package/dist/nodes/LearningSuite/methods/loadOptions/hub.loadOptions.d.ts +3 -0
  100. package/dist/nodes/LearningSuite/methods/loadOptions/hub.loadOptions.js +11 -0
  101. package/dist/nodes/LearningSuite/methods/loadOptions/member.loadOptions.d.ts +9 -0
  102. package/dist/nodes/LearningSuite/methods/loadOptions/member.loadOptions.js +27 -0
  103. package/dist/nodes/LearningSuite/methods/loadOptions/module.loadOptions.d.ts +5 -0
  104. package/dist/nodes/LearningSuite/methods/loadOptions/module.loadOptions.js +29 -0
  105. package/dist/nodes/LearningSuite/methods/loadOptions/popup.loadOptions.d.ts +2 -0
  106. package/dist/nodes/LearningSuite/methods/loadOptions/popup.loadOptions.js +7 -0
  107. package/dist/nodes/LearningSuite/methods/loadOptions/role.loadOptions.d.ts +2 -0
  108. package/dist/nodes/LearningSuite/methods/loadOptions/role.loadOptions.js +7 -0
  109. package/dist/nodes/LearningSuite/methods/loadOptions/teamMember.loadOptions.d.ts +9 -0
  110. package/dist/nodes/LearningSuite/methods/loadOptions/teamMember.loadOptions.js +35 -0
  111. package/dist/nodes/LearningSuite/methods/loadOptions/webhook.loadOptions.d.ts +6 -0
  112. package/dist/nodes/LearningSuite/methods/loadOptions/webhook.loadOptions.js +18 -0
  113. package/dist/nodes/LearningSuite/methods/resourceMappers/customFields.resourceMapper.d.ts +2 -0
  114. package/dist/nodes/LearningSuite/methods/resourceMappers/customFields.resourceMapper.js +35 -0
  115. package/dist/nodes/LearningSuite/methods/resourceMappers/hub.resourceMapper.d.ts +2 -0
  116. package/dist/nodes/LearningSuite/methods/resourceMappers/hub.resourceMapper.js +34 -0
  117. package/dist/nodes/LearningSuite/shared/customFields.helpers.d.ts +4 -0
  118. package/dist/nodes/LearningSuite/shared/customFields.helpers.js +56 -0
  119. package/dist/nodes/LearningSuite/shared/customFields.shared.d.ts +42 -0
  120. package/dist/nodes/LearningSuite/shared/customFields.shared.js +101 -0
  121. package/dist/nodes/LearningSuite/shared/customFields.upload.d.ts +13 -0
  122. package/dist/nodes/LearningSuite/shared/customFields.upload.js +198 -0
  123. package/dist/nodes/LearningSuite/shared/errors.d.ts +1 -0
  124. package/dist/nodes/LearningSuite/shared/errors.js +16 -0
  125. package/dist/nodes/LearningSuite/shared/getScopedParam.d.ts +2 -0
  126. package/dist/nodes/LearningSuite/shared/getScopedParam.js +39 -0
  127. package/dist/nodes/LearningSuite/shared/index.d.ts +4 -0
  128. package/dist/nodes/LearningSuite/shared/index.js +20 -0
  129. package/dist/nodes/LearningSuite/shared/parsing.d.ts +1 -0
  130. package/dist/nodes/LearningSuite/shared/parsing.js +15 -0
  131. package/dist/nodes/LearningSuite/shared/request.d.ts +13 -0
  132. package/dist/nodes/LearningSuite/shared/request.js +53 -0
  133. package/dist/nodes/LearningSuitePollingTrigger/LearningSuitePollingTrigger.node.d.ts +11 -0
  134. package/dist/nodes/LearningSuitePollingTrigger/LearningSuitePollingTrigger.node.js +278 -0
  135. package/dist/nodes/LearningSuitePollingTrigger/descriptions/trigger.polling.properties.d.ts +2 -0
  136. package/dist/nodes/LearningSuitePollingTrigger/descriptions/trigger.polling.properties.js +193 -0
  137. package/package.json +65 -0
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.courseHandlers = void 0;
4
+ const shared_1 = require("../shared");
5
+ const getPublished = async (ctx) => shared_1.lsRequest.call(ctx, 'GET', '/courses/published');
6
+ const getModules = async (ctx, i) => {
7
+ const courseId = ctx.getNodeParameter('courseId', i);
8
+ return await shared_1.lsRequest.call(ctx, 'GET', `/courses/${courseId}/modules`);
9
+ };
10
+ const getModulesForMember = async (ctx, i) => {
11
+ const courseId = ctx.getNodeParameter('courseId', i);
12
+ const memberId = ctx.getNodeParameter('memberId', i);
13
+ return await shared_1.lsRequest.call(ctx, 'GET', `/courses/${courseId}/modules/${memberId}`);
14
+ };
15
+ const getMembers = async (ctx, i) => {
16
+ const courseId = ctx.getNodeParameter('courseId', i);
17
+ const limit = ctx.getNodeParameter('limit', i, 100);
18
+ const offset = ctx.getNodeParameter('offset', i, 0);
19
+ const includeProgress = ctx.getNodeParameter('includeProgress', i, false);
20
+ const qs = {
21
+ limit,
22
+ offset,
23
+ includeProgress,
24
+ };
25
+ return await shared_1.lsRequest.call(ctx, 'GET', `/courses/${courseId}/members`, { qs });
26
+ };
27
+ const getAccessRequests = async (ctx, i) => {
28
+ const courseId = ctx.getNodeParameter('courseId', i);
29
+ const limit = ctx.getNodeParameter('limit', i, 15);
30
+ const offset = ctx.getNodeParameter('offset', i, 0);
31
+ const qs = {
32
+ limit,
33
+ offset,
34
+ };
35
+ return await shared_1.lsRequest.call(ctx, 'GET', `/courses/${courseId}/access-requests`, { qs });
36
+ };
37
+ const getSubmissions = async (ctx, i) => {
38
+ const courseId = ctx.getNodeParameter('courseId', i);
39
+ const limit = ctx.getNodeParameter('limit', i, 15);
40
+ const offset = ctx.getNodeParameter('offset', i, 0);
41
+ const qs = {
42
+ limit,
43
+ offset,
44
+ };
45
+ return await shared_1.lsRequest.call(ctx, 'GET', `/courses/${courseId}/submissions`, { qs });
46
+ };
47
+ const createLesson = async (ctx, i) => {
48
+ var _a;
49
+ const courseId = ctx.getNodeParameter('courseId', i);
50
+ const sectionId = ctx.getNodeParameter('sectionId', i);
51
+ const lessonName = ctx.getNodeParameter('lessonName', i);
52
+ const add = ctx.getNodeParameter('additionalOptions', i, {});
53
+ const sortPosRaw = add.lessonSortPosition;
54
+ const sortPos = sortPosRaw === 'first' || sortPosRaw === 'last' ? sortPosRaw : 'last';
55
+ if (add.lessonDescription) {
56
+ ctx.logger.warn('[LearningSuite] Deprecated field "lessonDescription" was provided but is no longer sent to the API.');
57
+ (_a = ctx.sendMessageToUI) === null || _a === void 0 ? void 0 : _a.call(ctx, 'The field "Lesson Description" is deprecated and will be ignored.');
58
+ }
59
+ const body = {
60
+ name: lessonName,
61
+ htmlContent: add.htmlContent,
62
+ videoUrl: add.videoUrl,
63
+ thumbnailUrl: add.thumbnailUrl,
64
+ immediatelyPublishCourse: add.immediatelyPublishCourse,
65
+ lessonSortPosition: sortPos,
66
+ };
67
+ if (add.timestampInSecondsToGenerateThumbnail !== undefined && add.videoUrl) {
68
+ const ts = Number(add.timestampInSecondsToGenerateThumbnail);
69
+ if (!Number.isNaN(ts)) {
70
+ body.timestampInSecondsToGenerateThumbnail = ts;
71
+ }
72
+ }
73
+ Object.keys(body).forEach((k) => {
74
+ if (body[k] === '' || body[k] == null)
75
+ delete body[k];
76
+ });
77
+ return shared_1.lsRequest.call(ctx, 'POST', `/courses/${courseId}/create-lesson/${sectionId}`, { body });
78
+ };
79
+ exports.courseHandlers = {
80
+ getPublished,
81
+ getModules,
82
+ getModulesForMember,
83
+ getMembers,
84
+ getAccessRequests,
85
+ getSubmissions,
86
+ createLesson,
87
+ };
@@ -0,0 +1,16 @@
1
+ import type { ExecuteHandler } from '../exec.types';
2
+ export declare const customFieldsHandlers: {
3
+ getCards: ExecuteHandler;
4
+ getCardsExpanded: ExecuteHandler;
5
+ getDefinitions: ExecuteHandler;
6
+ getCategories: ExecuteHandler;
7
+ getStore: ExecuteHandler;
8
+ getStoreValues: ExecuteHandler;
9
+ getFieldValues: ExecuteHandler;
10
+ setFieldValue: ExecuteHandler;
11
+ setMultipleFieldValues: ExecuteHandler;
12
+ getProfiles: ExecuteHandler;
13
+ getProfilesExpanded: ExecuteHandler;
14
+ getProfileByCard: ExecuteHandler;
15
+ updateProfileField: ExecuteHandler;
16
+ };
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.customFieldsHandlers = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const shared_1 = require("../shared");
6
+ const FILE_FIELD_TYPES = new Set(['files', 'images', 'videos', 'audios']);
7
+ function normalizeSingleFieldValueOrFail(ctx, input, fieldKey, lsType) {
8
+ if (input === undefined || input === null) {
9
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `No value provided for custom field "${fieldKey}".`);
10
+ }
11
+ let value = input;
12
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
13
+ const record = value;
14
+ const values = Object.values(record);
15
+ if (values.length === 1) {
16
+ value = values[0];
17
+ }
18
+ }
19
+ if (lsType === 'select') {
20
+ if (typeof value === 'string') {
21
+ const trimmed = value.trim();
22
+ if (trimmed.startsWith('[')) {
23
+ try {
24
+ const parsed = JSON.parse(trimmed);
25
+ if (Array.isArray(parsed)) {
26
+ return parsed;
27
+ }
28
+ }
29
+ catch {
30
+ // Fall back to treating the incoming value as a single option below.
31
+ }
32
+ }
33
+ }
34
+ return Array.isArray(value) ? value : [value];
35
+ }
36
+ if (['files', 'images', 'videos', 'audios'].includes(lsType)) {
37
+ if (typeof value === 'string') {
38
+ const trimmed = value.trim();
39
+ if (trimmed.startsWith('[') || trimmed.startsWith('{')) {
40
+ try {
41
+ value = JSON.parse(trimmed);
42
+ }
43
+ catch {
44
+ // Keep the original string when it is not valid JSON.
45
+ }
46
+ }
47
+ }
48
+ if (Array.isArray(value)) {
49
+ return value.map((item) => {
50
+ if (typeof item === 'object' && item !== null && 'data' in item) {
51
+ const bin = item;
52
+ const fileData = { data: bin.data };
53
+ if ('fileName' in bin && bin.fileName)
54
+ fileData.name = bin.fileName;
55
+ if ('mimeType' in bin && bin.mimeType)
56
+ fileData.mimeType = bin.mimeType;
57
+ if ('fileSize' in bin && typeof bin.fileSize === 'number')
58
+ fileData.fileSize = bin.fileSize;
59
+ return fileData;
60
+ }
61
+ return item;
62
+ });
63
+ }
64
+ if (typeof value === 'object' && value !== null && 'data' in value) {
65
+ const bin = value;
66
+ const fileData = { data: bin.data };
67
+ if ('fileName' in bin && bin.fileName)
68
+ fileData.name = bin.fileName;
69
+ if ('mimeType' in bin && bin.mimeType)
70
+ fileData.mimeType = bin.mimeType;
71
+ if ('fileSize' in bin && typeof bin.fileSize === 'number')
72
+ fileData.fileSize = bin.fileSize;
73
+ return [fileData];
74
+ }
75
+ return Array.isArray(value) ? value : [value];
76
+ }
77
+ if (lsType === 'date' || lsType === 'dateTime' || lsType === 'time') {
78
+ if (typeof value === 'string') {
79
+ return value;
80
+ }
81
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `Invalid value for date/time custom field "${fieldKey}". Expected a string, got ${typeof value}.`);
82
+ }
83
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
84
+ return value;
85
+ }
86
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `Invalid value for custom field "${fieldKey}" (${lsType}).`);
87
+ }
88
+ function normalizeCustomFieldValue(response) {
89
+ if (!Array.isArray(response)) {
90
+ return { value: response !== null && response !== void 0 ? response : null };
91
+ }
92
+ if (response.length === 0)
93
+ return { value: null };
94
+ if (response.length === 1)
95
+ return { value: response[0] };
96
+ return { value: response };
97
+ }
98
+ function readTypedFieldValue(ctx, i, fieldType) {
99
+ switch (fieldType) {
100
+ case 'string':
101
+ return ctx.getNodeParameter('fieldValueString', i);
102
+ case 'number':
103
+ return ctx.getNodeParameter('fieldValueNumber', i);
104
+ case 'boolean':
105
+ return ctx.getNodeParameter('fieldValueBoolean', i);
106
+ case 'dateTime':
107
+ return ctx.getNodeParameter('fieldValueDateTime', i);
108
+ case 'option': {
109
+ const singleOption = ctx.getNodeParameter('fieldValueOption', i);
110
+ return [singleOption];
111
+ }
112
+ case 'multiOptions':
113
+ return ctx.getNodeParameter('fieldValueMultiOptions', i);
114
+ case 'files':
115
+ case 'images':
116
+ case 'videos':
117
+ case 'audios':
118
+ return ctx.getNodeParameter('fieldValueBinary', i, 'data');
119
+ default:
120
+ return ctx.getNodeParameter('fieldValueFallback', i, '');
121
+ }
122
+ }
123
+ const getCards = async (ctx, i) => {
124
+ const limit = ctx.getNodeParameter('limit', i, 15);
125
+ const offset = ctx.getNodeParameter('offset', i, 0);
126
+ return await shared_1.lsRequest.call(ctx, 'GET', '/custom-fields/cards', { qs: { limit, offset } });
127
+ };
128
+ const getCardsExpanded = async (ctx, i) => {
129
+ const limit = ctx.getNodeParameter('limit', i, 15);
130
+ const offset = ctx.getNodeParameter('offset', i, 0);
131
+ return await shared_1.lsRequest.call(ctx, 'GET', '/custom-fields/cards/expanded', { qs: { limit, offset } });
132
+ };
133
+ const getDefinitions = async (ctx, i) => {
134
+ const limit = ctx.getNodeParameter('limit', i, 15);
135
+ const offset = ctx.getNodeParameter('offset', i, 0);
136
+ const customFieldCardId = ctx.getNodeParameter('customFieldCardId', i, undefined);
137
+ const qs = { limit, offset };
138
+ if (customFieldCardId)
139
+ qs.customFieldCardId = customFieldCardId;
140
+ return await shared_1.lsRequest.call(ctx, 'GET', '/custom-fields/definitions', { qs });
141
+ };
142
+ const getCategories = async (ctx, i) => {
143
+ const limit = ctx.getNodeParameter('limit', i, 15);
144
+ const offset = ctx.getNodeParameter('offset', i, 0);
145
+ const customFieldCardId = ctx.getNodeParameter('customFieldCardId', i, undefined);
146
+ const qs = { limit, offset };
147
+ if (customFieldCardId)
148
+ qs.customFieldCardId = customFieldCardId;
149
+ return await shared_1.lsRequest.call(ctx, 'GET', '/custom-fields/categories', { qs });
150
+ };
151
+ const getStore = async (ctx, i) => {
152
+ const userId = ctx.getNodeParameter('userId', i);
153
+ return await shared_1.lsRequest.call(ctx, 'GET', `/custom-fields/store/${userId}`);
154
+ };
155
+ const getStoreValues = async (ctx, i) => {
156
+ const userId = ctx.getNodeParameter('userId', i);
157
+ const profileIndex = ctx.getNodeParameter('profileIndex', i, null);
158
+ const qs = {};
159
+ if (profileIndex !== null && Number.isFinite(profileIndex)) {
160
+ qs.profileIndex = profileIndex;
161
+ }
162
+ return await shared_1.lsRequest.call(ctx, 'GET', `/custom-fields/store/${userId}/values`, { qs });
163
+ };
164
+ const getFieldValues = async (ctx, i) => {
165
+ const userId = ctx.getNodeParameter('userId', i);
166
+ const fieldKey = ctx.getNodeParameter('fieldKey', i);
167
+ const response = await shared_1.lsRequest.call(ctx, 'GET', `/custom-fields/store/${userId}/fields/${fieldKey}`);
168
+ return normalizeCustomFieldValue(response);
169
+ };
170
+ const setFieldValue = async (ctx, i) => {
171
+ const userId = ctx.getNodeParameter('userId', i);
172
+ const fieldKey = ctx.getNodeParameter('fieldKey', i);
173
+ const fieldType = ctx.getNodeParameter('fieldType', i, '');
174
+ let fieldValue;
175
+ if (FILE_FIELD_TYPES.has(fieldType)) {
176
+ const binaryPropertyNames = readTypedFieldValue(ctx, i, fieldType);
177
+ const fileNameOverride = ctx.getNodeParameter('fieldValueFileName', i, '').trim() || undefined;
178
+ fieldValue = await (0, shared_1.uploadFilesFromBinaryProperties)(ctx, i, userId, binaryPropertyNames, fieldType, fileNameOverride);
179
+ }
180
+ else {
181
+ fieldValue = readTypedFieldValue(ctx, i, fieldType);
182
+ }
183
+ if (fieldValue === undefined || fieldValue === null || fieldValue === '') {
184
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `No value provided for custom field "${fieldKey}".`);
185
+ }
186
+ const profileId = ctx.getNodeParameter('profileId', i, '');
187
+ const profileIndex = ctx.getNodeParameter('profileIndex', i, null);
188
+ const validProfileIndex = profileIndex !== null && Number.isFinite(profileIndex) ? profileIndex : undefined;
189
+ const body = { fieldValue };
190
+ if (profileId) {
191
+ body.profileId = profileId;
192
+ }
193
+ else if (validProfileIndex !== undefined) {
194
+ body.profileIndex = validProfileIndex;
195
+ }
196
+ const response = await shared_1.lsRequest.call(ctx, 'PUT', `/custom-fields/store/${userId}/fields/${fieldKey}`, { body });
197
+ return normalizeCustomFieldValue(response);
198
+ };
199
+ function buildFieldTypeMap(cards) {
200
+ var _a;
201
+ const typeMap = new Map();
202
+ for (const card of cards) {
203
+ if (!Array.isArray(card === null || card === void 0 ? void 0 : card.definitions))
204
+ continue;
205
+ for (const def of card.definitions) {
206
+ if ((def === null || def === void 0 ? void 0 : def.key) && ((_a = def === null || def === void 0 ? void 0 : def.typeDefinition) === null || _a === void 0 ? void 0 : _a.type)) {
207
+ typeMap.set(def.key, def.typeDefinition.type);
208
+ }
209
+ }
210
+ }
211
+ return typeMap;
212
+ }
213
+ const setMultipleFieldValues = async (ctx, i) => {
214
+ const userId = ctx.getNodeParameter('userId', i);
215
+ const profileId = ctx.getNodeParameter('profileId', i, '');
216
+ const profileIndex = ctx.getNodeParameter('profileIndex', i, null);
217
+ const validProfileIndex = profileIndex !== null && Number.isFinite(profileIndex) ? profileIndex : undefined;
218
+ const mapperData = ctx.getNodeParameter('fieldValues', i);
219
+ const fieldMappings = (mapperData === null || mapperData === void 0 ? void 0 : mapperData.value) || {};
220
+ const cardsResponse = await shared_1.lsRequest.call(ctx, 'GET', '/custom-fields/cards/expanded');
221
+ if (!Array.isArray(cardsResponse)) {
222
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'Failed to load custom field definitions.');
223
+ }
224
+ const cards = cardsResponse;
225
+ const fieldTypeMap = buildFieldTypeMap(cards);
226
+ const entries = Object.entries(fieldMappings).filter(([, value]) => value !== undefined);
227
+ const payload = [];
228
+ for (const [fieldKey, value] of entries) {
229
+ const lsType = fieldTypeMap.get(fieldKey);
230
+ if (!lsType) {
231
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `Unknown custom field "${fieldKey}".`);
232
+ }
233
+ let fieldValue;
234
+ if (FILE_FIELD_TYPES.has(lsType)) {
235
+ const binaryPropertyNames = typeof value === 'string' ? value : 'data';
236
+ fieldValue = await (0, shared_1.uploadFilesFromBinaryProperties)(ctx, i, userId, binaryPropertyNames, lsType);
237
+ }
238
+ else {
239
+ fieldValue = normalizeSingleFieldValueOrFail(ctx, value, fieldKey, lsType);
240
+ }
241
+ const entry = { fieldKey, fieldValue: fieldValue };
242
+ if (profileId) {
243
+ entry.profileId = profileId;
244
+ }
245
+ else if (validProfileIndex !== undefined) {
246
+ entry.profileIndex = validProfileIndex;
247
+ }
248
+ payload.push(entry);
249
+ }
250
+ if (!payload.length) {
251
+ return [];
252
+ }
253
+ return await shared_1.lsRequest.call(ctx, 'PUT', `/custom-fields/store/${userId}/fields`, {
254
+ body: payload,
255
+ });
256
+ };
257
+ const getProfiles = async (ctx, i) => {
258
+ const userId = ctx.getNodeParameter('userId', i);
259
+ const customFieldCardId = ctx.getNodeParameter('customFieldCardId', i, undefined);
260
+ const qs = {};
261
+ if (customFieldCardId)
262
+ qs.customFieldCardId = customFieldCardId;
263
+ return await shared_1.lsRequest.call(ctx, 'GET', `/custom-fields/store/${userId}/profiles`, { qs });
264
+ };
265
+ const getProfilesExpanded = async (ctx, i) => {
266
+ const userId = ctx.getNodeParameter('userId', i);
267
+ const customFieldCardId = ctx.getNodeParameter('customFieldCardId', i, undefined);
268
+ const qs = {};
269
+ if (customFieldCardId)
270
+ qs.customFieldCardId = customFieldCardId;
271
+ return await shared_1.lsRequest.call(ctx, 'GET', `/custom-fields/store/${userId}/profiles/expanded`, { qs });
272
+ };
273
+ const getProfileByCard = async (ctx, i) => {
274
+ const userId = ctx.getNodeParameter('userId', i);
275
+ const cardId = ctx.getNodeParameter('customFieldCardId', i);
276
+ const profileId = ctx.getNodeParameter('profileId', i, '');
277
+ const profileIndex = ctx.getNodeParameter('profileIndex', i, null);
278
+ const profileName = ctx.getNodeParameter('profileName', i, '');
279
+ const qs = {};
280
+ if (profileId) {
281
+ qs.profileId = profileId;
282
+ }
283
+ else if (profileIndex !== null && Number.isFinite(profileIndex)) {
284
+ qs.profileIndex = profileIndex;
285
+ }
286
+ else if (profileName) {
287
+ qs.profileName = profileName;
288
+ }
289
+ return await shared_1.lsRequest.call(ctx, 'GET', `/custom-fields/store/${userId}/profiles/by-card/${cardId}`, { qs });
290
+ };
291
+ const updateProfileField = async (ctx, i) => {
292
+ const userId = ctx.getNodeParameter('userId', i);
293
+ const cardId = ctx.getNodeParameter('customFieldCardId', i);
294
+ const fieldKey = ctx.getNodeParameter('fieldKey', i);
295
+ const fieldType = ctx.getNodeParameter('fieldType', i, '');
296
+ let fieldValue;
297
+ if (FILE_FIELD_TYPES.has(fieldType)) {
298
+ const binaryPropertyNames = readTypedFieldValue(ctx, i, fieldType);
299
+ const fileNameOverride = ctx.getNodeParameter('fieldValueFileName', i, '').trim() || undefined;
300
+ fieldValue = await (0, shared_1.uploadFilesFromBinaryProperties)(ctx, i, userId, binaryPropertyNames, fieldType, fileNameOverride);
301
+ }
302
+ else {
303
+ fieldValue = readTypedFieldValue(ctx, i, fieldType);
304
+ }
305
+ if (fieldValue === undefined || fieldValue === null || fieldValue === '') {
306
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), `No value provided for custom field "${fieldKey}".`);
307
+ }
308
+ const body = { fieldKey, fieldValue };
309
+ const profileId = ctx.getNodeParameter('profileId', i, '');
310
+ const profileIndex = ctx.getNodeParameter('profileIndex', i, null);
311
+ if (profileId) {
312
+ body.profileId = profileId;
313
+ }
314
+ else if (profileIndex !== null && Number.isFinite(profileIndex)) {
315
+ body.profileIndex = profileIndex;
316
+ }
317
+ if (body.profileId === undefined && body.profileIndex === undefined) {
318
+ const profileName = ctx.getNodeParameter('profileName', i, '');
319
+ if (profileName) {
320
+ body.profileName = profileName;
321
+ }
322
+ }
323
+ const response = await shared_1.lsRequest.call(ctx, 'PUT', `/custom-fields/store/${userId}/profiles/by-card/${cardId}`, {
324
+ body,
325
+ });
326
+ return normalizeCustomFieldValue(response);
327
+ };
328
+ exports.customFieldsHandlers = {
329
+ getCards,
330
+ getCardsExpanded,
331
+ getDefinitions,
332
+ getCategories,
333
+ getStore,
334
+ getStoreValues,
335
+ getFieldValues,
336
+ setFieldValue,
337
+ setMultipleFieldValues,
338
+ getProfiles,
339
+ getProfilesExpanded,
340
+ getProfileByCard,
341
+ updateProfileField,
342
+ };
@@ -0,0 +1,15 @@
1
+ import type { ExecuteHandler } from '../exec.types';
2
+ export declare const groupHandlers: {
3
+ getAll: ExecuteHandler;
4
+ create: ExecuteHandler;
5
+ delete: ExecuteHandler;
6
+ findByName: ExecuteHandler;
7
+ findOrCreate: ExecuteHandler;
8
+ addMembers: ExecuteHandler;
9
+ removeMembers: ExecuteHandler;
10
+ getCourses: ExecuteHandler;
11
+ addCourses: ExecuteHandler;
12
+ removeCourses: ExecuteHandler;
13
+ addBundles: ExecuteHandler;
14
+ addMembersSummary: ExecuteHandler;
15
+ };
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.groupHandlers = void 0;
4
+ const shared_1 = require("../shared");
5
+ const getAll = async (ctx, i) => {
6
+ const additionalOptions = ctx.getNodeParameter('additionalOptions', i, {});
7
+ const qs = {};
8
+ if (additionalOptions.includeUsers)
9
+ qs.includeUsers = additionalOptions.includeUsers;
10
+ return await shared_1.lsRequest.call(ctx, 'GET', '/groups', { qs });
11
+ };
12
+ const create = async (ctx, i) => {
13
+ const groupName = ctx.getNodeParameter('groupName', i);
14
+ return await shared_1.lsRequest.call(ctx, 'POST', '/groups', { body: { name: groupName } });
15
+ };
16
+ const deleteGroup = async (ctx, i) => {
17
+ const groupId = ctx.getNodeParameter('groupId', i);
18
+ return await shared_1.lsRequest.call(ctx, 'DELETE', `/group/${groupId}`);
19
+ };
20
+ const findByName = async (ctx, i) => {
21
+ const groupName = ctx.getNodeParameter('groupName', i);
22
+ const additionalOptions = ctx.getNodeParameter('additionalOptions', i, {});
23
+ const qs = { name: groupName };
24
+ if (additionalOptions.includeUsers)
25
+ qs.includeUsers = additionalOptions.includeUsers;
26
+ return await shared_1.lsRequest.call(ctx, 'GET', '/groups/find-by-name', { qs });
27
+ };
28
+ const findOrCreate = async (ctx, i) => {
29
+ const groupName = ctx.getNodeParameter('groupName', i);
30
+ const additionalOptions = ctx.getNodeParameter('additionalOptions', i, {});
31
+ const qs = { name: groupName };
32
+ if (additionalOptions.includeUsers)
33
+ qs.includeUsers = additionalOptions.includeUsers;
34
+ try {
35
+ const found = await shared_1.lsRequest.call(ctx, 'GET', '/groups/find-by-name', { qs });
36
+ if (Array.isArray(found) && found.length > 0)
37
+ return found[0];
38
+ return await shared_1.lsRequest.call(ctx, 'POST', '/groups', { body: { name: groupName } });
39
+ }
40
+ catch {
41
+ return await shared_1.lsRequest.call(ctx, 'POST', '/groups', { body: { name: groupName } });
42
+ }
43
+ };
44
+ const addMembers = async (ctx, i) => {
45
+ const userIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('userIds', i));
46
+ const groupIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('groupIds', i));
47
+ const additionalOptions = ctx.getNodeParameter('additionalOptions', i, {});
48
+ return await shared_1.lsRequest.call(ctx, 'PUT', '/add-members-to-groups', {
49
+ body: { userIds, groupIds, ...additionalOptions },
50
+ });
51
+ };
52
+ const removeMembers = async (ctx, i) => {
53
+ const userIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('userIds', i));
54
+ const groupIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('groupIds', i));
55
+ return await shared_1.lsRequest.call(ctx, 'DELETE', '/remove-members-from-groups', { body: { userIds, groupIds } });
56
+ };
57
+ const getCourses = async (ctx, i) => {
58
+ const groupId = ctx.getNodeParameter('groupId', i);
59
+ return await shared_1.lsRequest.call(ctx, 'GET', `/group/${groupId}/courses`);
60
+ };
61
+ const addCourses = async (ctx, i) => {
62
+ const groupId = ctx.getNodeParameter('groupId', i);
63
+ const courseIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('courseIds', i));
64
+ const additionalOptions = ctx.getNodeParameter('additionalOptions', i, {});
65
+ return await shared_1.lsRequest.call(ctx, 'PUT', `/group/${groupId}/courses`, { body: { courseIds, ...additionalOptions } });
66
+ };
67
+ const removeCourses = async (ctx, i) => {
68
+ const groupId = ctx.getNodeParameter('groupId', i);
69
+ const courseIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('courseIds', i));
70
+ return await shared_1.lsRequest.call(ctx, 'DELETE', `/group/${groupId}/courses`, { body: { courseIds } });
71
+ };
72
+ const addBundles = async (ctx, i) => {
73
+ const groupId = ctx.getNodeParameter('groupId', i);
74
+ const bundleIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('bundleIds', i));
75
+ const additionalOptions = ctx.getNodeParameter('additionalOptions', i, {});
76
+ return await shared_1.lsRequest.call(ctx, 'PUT', `/group/${groupId}/bundles`, { body: { bundleIds, ...additionalOptions } });
77
+ };
78
+ const addMembersSummary = async (ctx, i) => {
79
+ const userIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('userIds', i));
80
+ const groupIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('groupIds', i));
81
+ const additionalOptions = ctx.getNodeParameter('additionalOptions', i, {});
82
+ return await shared_1.lsRequest.call(ctx, 'PUT', '/add-members-to-groups-summary', {
83
+ body: { userIds, groupIds, ...additionalOptions },
84
+ });
85
+ };
86
+ exports.groupHandlers = {
87
+ getAll,
88
+ create,
89
+ delete: deleteGroup,
90
+ findByName,
91
+ findOrCreate,
92
+ addMembers,
93
+ removeMembers,
94
+ getCourses,
95
+ addCourses,
96
+ removeCourses,
97
+ addBundles,
98
+ addMembersSummary,
99
+ };
@@ -0,0 +1,9 @@
1
+ import type { ExecuteHandler } from '../exec.types';
2
+ export declare const hubHandlers: {
3
+ getAll: ExecuteHandler;
4
+ getTemplates: ExecuteHandler;
5
+ create: ExecuteHandler;
6
+ addAccess: ExecuteHandler;
7
+ removeAccess: ExecuteHandler;
8
+ getTemplateVariables: ExecuteHandler;
9
+ };
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hubHandlers = void 0;
4
+ const shared_1 = require("../shared");
5
+ const getAll = async (ctx) => shared_1.lsRequest.call(ctx, 'GET', '/hubs');
6
+ const getTemplates = async (ctx) => shared_1.lsRequest.call(ctx, 'GET', '/hub-templates');
7
+ const create = async (ctx, i) => {
8
+ const templateId = ctx.getNodeParameter('templateId', i);
9
+ const name = ctx.getNodeParameter('name', i);
10
+ const description = ctx.getNodeParameter('description', i, '');
11
+ const publish = ctx.getNodeParameter('publish', i, true);
12
+ const sortIndex = Number(ctx.getNodeParameter('sortIndex', i, 50));
13
+ const templateVariables = ctx.getNodeParameter('templateVariables.value', i, {});
14
+ const body = {
15
+ name,
16
+ publish,
17
+ sortIndex,
18
+ templateId,
19
+ description,
20
+ templateVariables,
21
+ };
22
+ return shared_1.lsRequest.call(ctx, 'POST', '/hub', { body });
23
+ };
24
+ const addAccess = async (ctx, i) => {
25
+ const hubId = ctx.getNodeParameter('hubId', i);
26
+ const body = {};
27
+ const memberIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('memberIds', i));
28
+ const groupIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('groupIds', i));
29
+ const bundleIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('bundleIds', i));
30
+ if (memberIds.length)
31
+ body.memberIds = memberIds;
32
+ if (groupIds.length)
33
+ body.groupIds = groupIds;
34
+ if (bundleIds.length)
35
+ body.bundleIds = bundleIds;
36
+ return await shared_1.lsRequest.call(ctx, 'PUT', `/hub/${hubId}/access`, { body });
37
+ };
38
+ const removeAccess = async (ctx, i) => {
39
+ const hubId = ctx.getNodeParameter('hubId', i);
40
+ const body = {};
41
+ const memberIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('memberIds', i));
42
+ const groupIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('groupIds', i));
43
+ const bundleIds = (0, shared_1.toIdArray)(ctx.getNodeParameter('bundleIds', i));
44
+ if (memberIds.length)
45
+ body.memberIds = memberIds;
46
+ if (groupIds.length)
47
+ body.groupIds = groupIds;
48
+ if (bundleIds.length)
49
+ body.bundleIds = bundleIds;
50
+ return await shared_1.lsRequest.call(ctx, 'DELETE', `/hub/${hubId}/access`, { body });
51
+ };
52
+ const getTemplateVariables = async (ctx, i) => {
53
+ const templateId = ctx.getNodeParameter('templateId', i);
54
+ const raw = await shared_1.lsRequest.call(ctx, 'GET', `/hub-template/${templateId}/variables`);
55
+ const arr = Array.isArray(raw) ? raw : [raw];
56
+ return arr.map((v) => ({ variable: String(v) }));
57
+ };
58
+ exports.hubHandlers = {
59
+ getAll,
60
+ getTemplates,
61
+ create,
62
+ addAccess,
63
+ removeAccess,
64
+ getTemplateVariables,
65
+ };
@@ -0,0 +1,23 @@
1
+ import type { ExecuteHandler } from '../exec.types';
2
+ export declare const memberHandlers: {
3
+ getByEmail: ExecuteHandler;
4
+ getById: ExecuteHandler;
5
+ getAll: ExecuteHandler;
6
+ create: ExecuteHandler;
7
+ update: ExecuteHandler;
8
+ delete: ExecuteHandler;
9
+ activateDeactivate: ExecuteHandler;
10
+ addToCourses: ExecuteHandler;
11
+ removeFromCourses: ExecuteHandler;
12
+ getCourses: ExecuteHandler;
13
+ getCourseInfo: ExecuteHandler;
14
+ getCourseProgress: ExecuteHandler;
15
+ getModuleProgress: ExecuteHandler;
16
+ getLessonProgress: ExecuteHandler;
17
+ setCourseProgress: ExecuteHandler;
18
+ resetCourseProgress: ExecuteHandler;
19
+ addToBundles: ExecuteHandler;
20
+ removeFromBundles: ExecuteHandler;
21
+ getBundles: ExecuteHandler;
22
+ findOrCreate: ExecuteHandler;
23
+ };