@transai/connector-runner-mkg 0.2.0 → 0.4.0

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 (151) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/index.cjs +2 -0
  3. package/index.cjs.map +7 -0
  4. package/index.js +2 -0
  5. package/index.js.map +7 -0
  6. package/libs/connector-runner-mkg/src/lib/actions-handler.d.ts +7 -0
  7. package/libs/connector-runner-mkg/src/lib/connector-runner-mkg.d.ts +8 -0
  8. package/libs/connector-runner-mkg/src/lib/extractor.service.d.ts +8 -0
  9. package/libs/connector-runner-mkg/src/lib/tables/_all.d.ts +4 -0
  10. package/libs/connector-runner-mkg/src/lib/tables/artg.d.ts +2 -0
  11. package/libs/connector-runner-mkg/src/lib/tables/arti.d.ts +2 -0
  12. package/libs/connector-runner-mkg/src/lib/tables/base/action.d.ts +21 -0
  13. package/libs/connector-runner-mkg/src/lib/tables/base/table.d.ts +15 -0
  14. package/libs/connector-runner-mkg/src/lib/tables/bwrg.d.ts +2 -0
  15. package/libs/connector-runner-mkg/src/lib/tables/bwrk.d.ts +2 -0
  16. package/libs/connector-runner-mkg/src/lib/tables/clch.d.ts +2 -0
  17. package/libs/connector-runner-mkg/src/lib/tables/debi.d.ts +2 -0
  18. package/libs/connector-runner-mkg/src/lib/tables/magl.d.ts +2 -0
  19. package/libs/connector-runner-mkg/src/lib/tables/magz.d.ts +2 -0
  20. package/libs/connector-runner-mkg/src/lib/tables/medw.d.ts +2 -0
  21. package/libs/connector-runner-mkg/src/lib/tables/parl.d.ts +2 -0
  22. package/libs/connector-runner-mkg/src/lib/tables/plnb.d.ts +2 -0
  23. package/libs/connector-runner-mkg/src/lib/tables/prbv.d.ts +2 -0
  24. package/libs/connector-runner-mkg/src/lib/tables/prdh.d.ts +2 -0
  25. package/libs/connector-runner-mkg/src/lib/tables/prdr.d.ts +2 -0
  26. package/libs/connector-runner-mkg/src/lib/tables/prmv.d.ts +2 -0
  27. package/libs/connector-runner-mkg/src/lib/tables/rela.d.ts +2 -0
  28. package/libs/connector-runner-mkg/src/lib/tables/rgrs.d.ts +2 -0
  29. package/libs/connector-runner-mkg/src/lib/tables/rsrc.d.ts +2 -0
  30. package/libs/connector-runner-mkg/src/lib/tables/rsrd.d.ts +2 -0
  31. package/libs/connector-runner-mkg/src/lib/tables/rsrg.d.ts +2 -0
  32. package/libs/connector-runner-mkg/src/lib/tables/stlh.d.ts +2 -0
  33. package/libs/connector-runner-mkg/src/lib/tables/stlm.d.ts +2 -0
  34. package/libs/connector-runner-mkg/src/lib/tables/stlr.d.ts +2 -0
  35. package/libs/connector-runner-mkg/src/lib/tables/vrdg.d.ts +2 -0
  36. package/libs/connector-runner-mkg/src/lib/types.d.ts +34 -0
  37. package/libs/connector-runtime-sdk/src/index.d.ts +3 -0
  38. package/libs/connector-runtime-sdk/src/lib/connector-runtime.d.ts +16 -0
  39. package/libs/connector-runtime-sdk/src/lib/connector-runtime.interface.d.ts +5 -0
  40. package/libs/connector-runtime-sdk/src/lib/sdk/files.sdk.interface.d.ts +18 -0
  41. package/libs/connector-runtime-sdk/src/lib/sdk/http-client.interface.d.ts +38 -0
  42. package/libs/connector-runtime-sdk/src/lib/sdk/index.d.ts +10 -0
  43. package/libs/connector-runtime-sdk/src/lib/sdk/logger.sdk.interface.d.ts +7 -0
  44. package/libs/connector-runtime-sdk/src/lib/sdk/offset-store.sdk.interface.d.ts +12 -0
  45. package/libs/connector-runtime-sdk/src/lib/sdk/processing.sdk.interface.d.ts +13 -0
  46. package/libs/connector-runtime-sdk/src/lib/sdk/receiver.sdk.interface.d.ts +14 -0
  47. package/libs/connector-runtime-sdk/src/lib/sdk/sdk.interface.d.ts +31 -0
  48. package/libs/connector-runtime-sdk/src/lib/sdk/sender.sdk.interface.d.ts +22 -0
  49. package/libs/connector-runtime-sdk/src/lib/sdk/telemetry.sdk.interface.d.ts +15 -0
  50. package/libs/connector-runtime-sdk/src/lib/sdk/templating.sdk.interface.d.ts +12 -0
  51. package/libs/types/src/index.d.ts +7 -0
  52. package/libs/types/src/lib/cube-query-config.types.d.ts +20 -0
  53. package/libs/types/src/lib/file-action.types.d.ts +5 -0
  54. package/libs/types/src/lib/http-status-codes.enum.d.ts +64 -0
  55. package/libs/types/src/lib/management-api/action-definition.interface.d.ts +12 -0
  56. package/libs/types/src/lib/management-api/chart.interface.d.ts +9 -0
  57. package/libs/types/src/lib/management-api/connector/connector.interface.d.ts +140 -0
  58. package/libs/types/src/lib/management-api/connector/connectors.interface.d.ts +126 -0
  59. package/libs/types/src/lib/management-api/connector-orchestrator-config.interface.d.ts +14 -0
  60. package/libs/types/src/lib/management-api/cube-dataset.interface.d.ts +93 -0
  61. package/libs/types/src/lib/management-api/dashboard.interface.d.ts +35 -0
  62. package/libs/types/src/lib/management-api/dataset/collection.interface.d.ts +16 -0
  63. package/libs/types/src/lib/management-api/dataset/dataset-record.interface.d.ts +5 -0
  64. package/libs/types/src/lib/management-api/dataset/dataset.interface.d.ts +730 -0
  65. package/libs/types/src/lib/management-api/dataset/datasets.interface.d.ts +710 -0
  66. package/libs/types/src/lib/management-api/dataset/dimension.interface.d.ts +205 -0
  67. package/libs/types/src/lib/management-api/dataset/dimensions.interface.d.ts +186 -0
  68. package/libs/types/src/lib/management-api/dataset/filter-group.interface.d.ts +8 -0
  69. package/libs/types/src/lib/management-api/dataset/filter.interface.d.ts +34 -0
  70. package/libs/types/src/lib/management-api/dataset/filters.interface.d.ts +7 -0
  71. package/libs/types/src/lib/management-api/dataset/measure.interface.d.ts +65 -0
  72. package/libs/types/src/lib/management-api/dataset/measures.interface.d.ts +56 -0
  73. package/libs/types/src/lib/management-api/dataset/meta.interface.d.ts +9 -0
  74. package/libs/types/src/lib/management-api/dataset/pre-aggregate.interface.d.ts +69 -0
  75. package/libs/types/src/lib/management-api/dataset/pre-aggregations.interface.d.ts +54 -0
  76. package/libs/types/src/lib/management-api/dataset/relation.interface.d.ts +40 -0
  77. package/libs/types/src/lib/management-api/dataset/relations.interface.d.ts +36 -0
  78. package/libs/types/src/lib/management-api/dataset/segment.interface.d.ts +45 -0
  79. package/libs/types/src/lib/management-api/dataset/segments.interface.d.ts +43 -0
  80. package/libs/types/src/lib/management-api/dataset/switch.interface.d.ts +70 -0
  81. package/libs/types/src/lib/management-api/dataset/when-item.interface.d.ts +41 -0
  82. package/libs/types/src/lib/management-api/dataset/when-items.interface.d.ts +40 -0
  83. package/libs/types/src/lib/management-api/event-origin.interface.d.ts +24 -0
  84. package/libs/types/src/lib/management-api/index.d.ts +39 -0
  85. package/libs/types/src/lib/management-api/semantic-trigger/custom-cron-trigger-record.interface.d.ts +6 -0
  86. package/libs/types/src/lib/management-api/semantic-trigger/index.d.ts +6 -0
  87. package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-filter.interface.d.ts +20 -0
  88. package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-filters.interface.d.ts +18 -0
  89. package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-record.interface.d.ts +6 -0
  90. package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger.interface.d.ts +75 -0
  91. package/libs/types/src/lib/management-api/semantic-trigger/semantic-triggers.interface.d.ts +62 -0
  92. package/libs/types/src/lib/management-api/template-implementation-overrides.interface.d.ts +1152 -0
  93. package/libs/types/src/lib/management-api/template-implementation.interface.d.ts +2860 -0
  94. package/libs/types/src/lib/management-api/template.interface.d.ts +1191 -0
  95. package/libs/types/src/lib/management-api/tenant.interface.d.ts +8 -0
  96. package/libs/types/src/lib/management-api/type-enums.d.ts +85 -0
  97. package/libs/types/src/lib/management-api/web/generic-filter.dto.d.ts +37 -0
  98. package/libs/types/src/lib/management-api/web/index.d.ts +2 -0
  99. package/libs/types/src/lib/management-api/web/paginated-response.interface.d.ts +17 -0
  100. package/libs/types/src/lib/management-api/workflow/action.interface.d.ts +85 -0
  101. package/libs/types/src/lib/management-api/workflow/index.d.ts +6 -0
  102. package/libs/types/src/lib/management-api/workflow/offset.interface.d.ts +14 -0
  103. package/libs/types/src/lib/management-api/workflow/trigger-types.interface.d.ts +14 -0
  104. package/libs/types/src/lib/management-api/workflow/workflow-definition.interface.d.ts +57 -0
  105. package/libs/types/src/lib/management-api/workflow/workflow-run.d.ts +70 -0
  106. package/libs/types/src/lib/management-api/workflow/workflow.drawing.d.ts +102 -0
  107. package/libs/types/src/lib/message.types.d.ts +59 -0
  108. package/libs/types/src/lib/response.types.d.ts +27 -0
  109. package/libs/types/src/lib/types.d.ts +116 -0
  110. package/package.json +1 -1
  111. package/.eslintrc.json +0 -30
  112. package/jest.config.ts +0 -10
  113. package/project.json +0 -29
  114. package/src/lib/actions-handler.spec.ts +0 -177
  115. package/src/lib/actions-handler.ts +0 -143
  116. package/src/lib/connector-runner-mkg.spec.ts +0 -219
  117. package/src/lib/connector-runner-mkg.ts +0 -155
  118. package/src/lib/extractor.service.spec.ts +0 -123
  119. package/src/lib/extractor.service.ts +0 -125
  120. package/src/lib/tables/_all.ts +0 -60
  121. package/src/lib/tables/artg.ts +0 -12
  122. package/src/lib/tables/arti.ts +0 -99
  123. package/src/lib/tables/base/action.ts +0 -70
  124. package/src/lib/tables/base/table.ts +0 -57
  125. package/src/lib/tables/bwrg.ts +0 -13
  126. package/src/lib/tables/bwrk.ts +0 -60
  127. package/src/lib/tables/clch.ts +0 -42
  128. package/src/lib/tables/debi.ts +0 -62
  129. package/src/lib/tables/magl.ts +0 -15
  130. package/src/lib/tables/magz.ts +0 -14
  131. package/src/lib/tables/medw.ts +0 -97
  132. package/src/lib/tables/parl.ts +0 -24
  133. package/src/lib/tables/plnb.ts +0 -46
  134. package/src/lib/tables/prbv.ts +0 -31
  135. package/src/lib/tables/prdh.ts +0 -46
  136. package/src/lib/tables/prdr.ts +0 -25
  137. package/src/lib/tables/prmv.ts +0 -31
  138. package/src/lib/tables/rela.ts +0 -40
  139. package/src/lib/tables/rgrs.ts +0 -68
  140. package/src/lib/tables/rsrc.ts +0 -23
  141. package/src/lib/tables/rsrd.ts +0 -98
  142. package/src/lib/tables/rsrg.ts +0 -6
  143. package/src/lib/tables/stlh.ts +0 -24
  144. package/src/lib/tables/stlm.ts +0 -80
  145. package/src/lib/tables/stlr.ts +0 -60
  146. package/src/lib/tables/vrdg.ts +0 -27
  147. package/src/lib/types.ts +0 -45
  148. package/tsconfig.json +0 -22
  149. package/tsconfig.lib.json +0 -10
  150. package/tsconfig.spec.json +0 -14
  151. /package/{src/index.ts → libs/connector-runner-mkg/src/index.d.ts} +0 -0
@@ -1,219 +0,0 @@
1
- import {
2
- ConnectorSDKInterface,
3
- HttpClientSDKInterface,
4
- HttpRequestOptionsFormatter,
5
- } from '@transai/connector-runtime-sdk';
6
- import { ConnectorInterface } from '@xip-online-data/types';
7
-
8
- import { ActionsHandler } from './actions-handler';
9
- import { ConnectorRunnerMkg } from './connector-runner-mkg';
10
- import { ExtractorService } from './extractor.service';
11
- import { ConnectorConfig, SESSION_EXPIRATION_SECONDS } from './types';
12
-
13
- jest.mock('./actions-handler');
14
- jest.mock('./extractor.service');
15
-
16
- describe('ConnectorRunnerMkg', () => {
17
- let runner: ConnectorRunnerMkg;
18
-
19
- const testEndpoint = '/test-endpoint';
20
- const sessionId = 'abcdef1234567890';
21
-
22
- let requestFormatter: HttpRequestOptionsFormatter;
23
-
24
- const httpClientMock = {
25
- setRequestOptionsFormatter: jest.fn().mockImplementation((formatter) => {
26
- requestFormatter = formatter;
27
- return httpClientMock;
28
- }),
29
- post: jest.fn().mockImplementation(() => ({
30
- status: 200,
31
- headers: {
32
- 'set-cookie': [`JSESSIONID=${sessionId}; Path=/; HttpOnly`],
33
- },
34
- })),
35
- } as unknown as HttpClientSDKInterface;
36
- const connector = {} as ConnectorInterface;
37
- const sdkMock = {
38
- logger: {
39
- warn: jest.fn(),
40
- verbose: jest.fn(),
41
- error: jest.fn(),
42
- },
43
- config: {
44
- server: 'saas-test.mkg.eu',
45
- username: 'some-username',
46
- password: 'some-password',
47
- apiToken: 'some-api-token',
48
- tables: {
49
- arti: true,
50
- unknown_table: true,
51
- clch: {
52
- fields: [
53
- 'clch_volgnummer',
54
- 'clch_op_dek_uit',
55
- 'clch_vofr_oms_1',
56
- 'unknown',
57
- ],
58
- },
59
- },
60
- },
61
- processing: {
62
- registerInterval: jest.fn(),
63
- },
64
- receiver: {
65
- emitEventType: jest.fn(),
66
- responses: {
67
- created: jest.fn(),
68
- },
69
- registerCallback: jest.fn(),
70
- },
71
- httpClient: jest.fn().mockReturnValue(httpClientMock),
72
- } as unknown as ConnectorSDKInterface<ConnectorConfig>;
73
- const actionsHandlerCallbackChain = jest.fn();
74
-
75
- beforeEach(() => {
76
- (ActionsHandler as jest.Mock).mockImplementation((sdk, httpClient) => {
77
- expect(sdk).toBe(sdkMock);
78
- expect(httpClient).toBe(httpClientMock);
79
-
80
- return {
81
- callbackFunctionChain: actionsHandlerCallbackChain,
82
- } as unknown as ActionsHandler;
83
- });
84
-
85
- runner = new ConnectorRunnerMkg(connector, sdkMock);
86
- });
87
-
88
- afterEach(() => {
89
- jest.clearAllMocks();
90
- });
91
-
92
- it('should be defined', () => {
93
- expect(runner).toBeDefined();
94
- });
95
-
96
- describe('initialization', () => {
97
- beforeEach(() => {
98
- (ExtractorService as jest.Mock).mockImplementation(
99
- (sdk, httpClient, tableId, table) => {
100
- expect(sdk).toBe(sdkMock);
101
- expect(httpClient).toBe(httpClientMock);
102
-
103
- switch (tableId) {
104
- case 'arti':
105
- expect(table).toEqual(
106
- expect.objectContaining({
107
- identifier: 'arti',
108
- }),
109
- );
110
- break;
111
- case 'clch':
112
- expect(table).toEqual(
113
- expect.objectContaining({
114
- identifier: 'clch',
115
- fields: [
116
- 'clch_volgnummer',
117
- 'clch_op_dek_uit',
118
- 'clch_vofr_oms_1',
119
- ],
120
- }),
121
- );
122
- break;
123
- default:
124
- expect(false).toBe(true);
125
- break;
126
- }
127
-
128
- return {} as ExtractorService;
129
- },
130
- );
131
- });
132
-
133
- it('should initialize without errors', async () => {
134
- await expect(runner.init()).resolves.not.toThrow();
135
-
136
- expect(sdkMock.httpClient).toHaveBeenCalledWith({
137
- baseUrl: 'https://saas-test.mkg.eu:443/mkg',
138
- });
139
- expect(sdkMock.processing.registerInterval).toHaveBeenCalledTimes(2);
140
- expect(sdkMock.processing.registerInterval).toHaveBeenNthCalledWith(
141
- 1,
142
- 300,
143
- expect.any(Object),
144
- { immediate: true },
145
- );
146
-
147
- expect(sdkMock.processing.registerInterval).toHaveBeenNthCalledWith(
148
- 2,
149
- 60,
150
- expect.any(Object),
151
- { immediate: true },
152
- );
153
- });
154
- });
155
-
156
- describe('token fetching', () => {
157
- it('should have defined the formatter', () => {
158
- expect(requestFormatter).toBeDefined();
159
- });
160
-
161
- it('should format requests with authentication', async () => {
162
- const formattedOptions = await requestFormatter(
163
- {
164
- data: 'some-data',
165
- },
166
- 'GET',
167
- testEndpoint,
168
- );
169
-
170
- expect(formattedOptions).toEqual(
171
- expect.objectContaining({
172
- headers: expect.objectContaining({
173
- Cookie: `JSESSIONID=${sessionId}`,
174
- 'X-CustomerID': 'some-api-token',
175
- }),
176
- }),
177
- );
178
- });
179
-
180
- it('should format requests with custom header', async () => {
181
- const formattedOptions = await requestFormatter(
182
- {
183
- headers: {
184
- 'Custom-Header': 'custom-value',
185
- },
186
- },
187
- 'GET',
188
- testEndpoint,
189
- );
190
-
191
- expect(formattedOptions).toEqual(
192
- expect.objectContaining({
193
- headers: expect.objectContaining({
194
- 'Custom-Header': 'custom-value',
195
- Cookie: `JSESSIONID=${sessionId}`,
196
- 'X-CustomerID': 'some-api-token',
197
- }),
198
- }),
199
- );
200
- });
201
-
202
- it('should request token only once', async () => {
203
- await requestFormatter({}, 'GET', testEndpoint);
204
- await requestFormatter({}, 'GET', testEndpoint);
205
-
206
- expect(httpClientMock.post).toHaveBeenCalledTimes(1);
207
- });
208
-
209
- it('should renew token after expiration', async () => {
210
- jest.useFakeTimers();
211
-
212
- await requestFormatter({}, 'GET', testEndpoint);
213
- jest.setSystemTime(new Date().getTime() + SESSION_EXPIRATION_SECONDS);
214
- await requestFormatter({}, 'GET', testEndpoint);
215
-
216
- expect(httpClientMock.post).toHaveBeenCalledTimes(2);
217
- });
218
- });
219
- });
@@ -1,155 +0,0 @@
1
- /* eslint-disable camelcase,@typescript-eslint/naming-convention */
2
- import {
3
- ConnectorRuntimeSDK,
4
- ConnectorSDKInterface,
5
- HttpClientSDKInterface,
6
- HttpRequestOptions,
7
- } from '@transai/connector-runtime-sdk';
8
- import { ConnectorInterface } from '@xip-online-data/types';
9
-
10
- import { ActionsHandler } from './actions-handler';
11
- import { ExtractorService } from './extractor.service';
12
- import { MKG_TABLES } from './tables/_all';
13
- import {
14
- ConnectorConfig,
15
- SESSION_COOKIE_NAME,
16
- SESSION_EXPIRATION_SECONDS,
17
- } from './types';
18
-
19
- export class ConnectorRunnerMkg extends ConnectorRuntimeSDK<ConnectorConfig> {
20
- readonly #actionsHandler: ActionsHandler;
21
-
22
- readonly #mkgHttpClient: HttpClientSDKInterface;
23
-
24
- readonly #sessionTokenHttpClient: HttpClientSDKInterface;
25
-
26
- #sessionToken?: {
27
- token: string;
28
- expiresAt: number;
29
- };
30
-
31
- constructor(
32
- connector: ConnectorInterface,
33
- connectorSDK: ConnectorSDKInterface,
34
- ) {
35
- super(connector, connectorSDK);
36
-
37
- const { config } = this.connectorSDK;
38
-
39
- this.#sessionTokenHttpClient = this.connectorSDK.httpClient({
40
- baseUrl: `https://${config.server}:${config.port ?? 443}/${(config.path ?? '/mkg').replace(/^\/+/, '')}`,
41
- });
42
- this.#mkgHttpClient = this.connectorSDK
43
- .httpClient({
44
- baseUrl: `https://${config.server}:${config.port ?? 443}/${(config.path ?? '/mkg').replace(/^\/+/, '')}`,
45
- })
46
- .setRequestOptionsFormatter(this.#requestOptionsFormatter);
47
-
48
- this.#actionsHandler = new ActionsHandler(
49
- this.connectorSDK,
50
- this.#mkgHttpClient,
51
- );
52
-
53
- this.callbackFunction = this.#actionsHandler.callbackFunctionChain;
54
- }
55
-
56
- override init = async (): Promise<void> => {
57
- const { config } = this.connectorSDK;
58
-
59
- Object.entries(config.tables ?? {}).forEach(
60
- ([tableIdentifier, configOrTrue]) => {
61
- // eslint-disable-next-line security/detect-object-injection
62
- const table = MKG_TABLES[tableIdentifier];
63
- if (!table) {
64
- this.connectorSDK.logger.warn(
65
- `[MKG] Unknown table identifier "${tableIdentifier}", skipping configuration.`,
66
- );
67
- return;
68
- }
69
-
70
- if (!table.interval || table.interval <= 0) {
71
- this.connectorSDK.logger.verbose(
72
- `[MKG] Table "${tableIdentifier}" does not have a valid interval configured, skipping registration.`,
73
- );
74
- return;
75
- }
76
-
77
- this.connectorSDK.processing.registerInterval(
78
- table.interval,
79
- new ExtractorService(
80
- this.connectorSDK,
81
- this.#mkgHttpClient,
82
- tableIdentifier,
83
- table.cloneFromTableConfig(configOrTrue),
84
- ),
85
- { immediate: table.immediate },
86
- );
87
- },
88
- );
89
- };
90
-
91
- #requestOptionsFormatter = async <D = string | object>(
92
- options: HttpRequestOptions<D>,
93
- ): Promise<HttpRequestOptions<D>> => {
94
- const { config } = this.connectorSDK;
95
-
96
- return {
97
- ...options,
98
- headers: {
99
- ...(options?.headers ?? {}),
100
- Cookie: `${SESSION_COOKIE_NAME}=${await this.#getSessionCookie(config.username, config.password)}`,
101
- 'X-CustomerID': config.apiToken,
102
- },
103
- };
104
- };
105
-
106
- async #getSessionCookie(
107
- j_username: string,
108
- j_password: string,
109
- ): Promise<string> {
110
- const token = this.#sessionToken;
111
- if (token && token.expiresAt > Date.now()) {
112
- return token.token;
113
- }
114
-
115
- const response = await this.#sessionTokenHttpClient.post(
116
- '/static/auth/j_spring_security_check',
117
- {
118
- j_username,
119
- j_password,
120
- },
121
- {
122
- headers: {
123
- Accept: 'application/json',
124
- 'Content-Type': 'application/x-www-form-urlencoded',
125
- },
126
- },
127
- );
128
-
129
- if (!response) {
130
- throw new Error('Failed to authenticate and retrieve session cookie');
131
- }
132
-
133
- const cookies = (response.headers?.['set-cookie'] ??
134
- response.headers?.['Set-Cookie'] ??
135
- []) as Array<string>;
136
- const sessionCookie = cookies.find((cookie: string) =>
137
- cookie.startsWith(`${SESSION_COOKIE_NAME}=`),
138
- );
139
-
140
- if (!sessionCookie) {
141
- throw new Error('Session cookie not found in authentication response');
142
- }
143
-
144
- const sessionToken = sessionCookie
145
- .split(';')[0]
146
- ?.substring(`${SESSION_COOKIE_NAME}=`.length);
147
-
148
- this.#sessionToken = {
149
- token: sessionToken,
150
- expiresAt: Date.now() + SESSION_EXPIRATION_SECONDS - 1000,
151
- };
152
-
153
- return sessionToken;
154
- }
155
- }
@@ -1,123 +0,0 @@
1
- import {
2
- ConnectorSDKInterface,
3
- HttpClientSDKInterface,
4
- } from '@transai/connector-runtime-sdk';
5
-
6
- import { ExtractorService } from './extractor.service';
7
- import { MkgTable } from './tables/base/table';
8
- import { ConnectorConfig } from './types';
9
-
10
- describe('ExtractorService', () => {
11
- let service: ExtractorService;
12
-
13
- const sdkMock = {
14
- logger: {
15
- info: jest.fn(),
16
- debug: jest.fn(),
17
- error: jest.fn(),
18
- verbose: jest.fn(),
19
- },
20
- offsetStore: {
21
- getOffset: jest.fn().mockResolvedValue({
22
- id: 0,
23
- timestamp: new Date().getTime(),
24
- rawTimestamp: new Date().toISOString(),
25
- isoDate: new Date().toISOString(),
26
- }),
27
- setOffset: jest.fn().mockResolvedValue(undefined),
28
- },
29
- sender: {
30
- documents: jest.fn().mockResolvedValue(undefined),
31
- },
32
- config: {},
33
- } as unknown as ConnectorSDKInterface<ConnectorConfig>;
34
-
35
- const httpClientMock = {} as HttpClientSDKInterface;
36
-
37
- beforeEach(() => {
38
- service = new ExtractorService(
39
- sdkMock,
40
- httpClientMock,
41
- 'test-table',
42
- new MkgTable({
43
- identifier: 'test-table',
44
- fields: ['field1', 'field2'],
45
- }).cloneFromTableConfig({
46
- fields: ['field1', 'field11', 'field2'],
47
- }),
48
- );
49
- });
50
-
51
- afterEach(() => {
52
- jest.clearAllMocks();
53
- });
54
-
55
- it('should initialize and register interval', () => {
56
- expect(service).toBeDefined();
57
- });
58
-
59
- describe('onRun', () => {
60
- it('should run without errors', async () => {
61
- const data = [
62
- {
63
- sys_dat_wijzig: '2025-11-02',
64
- RowKey: '1',
65
- field1: 'value1',
66
- field2: 'value2',
67
- },
68
- {
69
- sys_dat_wijzig: '2025-11-03',
70
- RowKey: '2',
71
- field1: 'value3',
72
- field2: 'value4',
73
- },
74
- ];
75
- httpClientMock.get = jest.fn().mockResolvedValue({
76
- success: true,
77
- data: {
78
- response: {
79
- ResultData: [
80
- {
81
- 'test-table': data,
82
- },
83
- ],
84
- },
85
- },
86
- });
87
-
88
- await expect(service.onRun()).resolves.toBeUndefined();
89
-
90
- expect(sdkMock.sender.documents).toHaveBeenCalledWith(data, {
91
- keyField: 'RowKey',
92
- collection: 'mkg_test-table',
93
- });
94
- expect(sdkMock.offsetStore.setOffset).toHaveBeenCalledWith(
95
- {
96
- id: '2',
97
- timestamp: expect.any(Number),
98
- rawTimestamp: expect.any(String),
99
- },
100
- 'offset_test-table',
101
- );
102
- });
103
-
104
- it('should now send documents on error response', async () => {
105
- httpClientMock.get = jest.fn().mockResolvedValue({
106
- success: false,
107
- error: 'some-error',
108
- });
109
-
110
- await expect(service.onRun()).resolves.toBeUndefined();
111
-
112
- expect(sdkMock.sender.documents).not.toHaveBeenCalled();
113
- expect(sdkMock.offsetStore.setOffset).toHaveBeenCalledWith(
114
- {
115
- id: '0',
116
- timestamp: expect.any(Number),
117
- rawTimestamp: expect.any(String),
118
- },
119
- 'offset_test-table',
120
- );
121
- });
122
- });
123
- });
@@ -1,125 +0,0 @@
1
- import {
2
- ConnectorSDKInterface,
3
- HttpClientSDKInterface,
4
- HttpError,
5
- IntervalHandler,
6
- StoredOffset,
7
- } from '@transai/connector-runtime-sdk';
8
-
9
- import {
10
- ConnectorConfig,
11
- DEFAULT_DATASOURCE,
12
- MkgTableInterface,
13
- } from './types';
14
-
15
- type FetchDataResponse<D> = {
16
- response: {
17
- ResultData: [
18
- {
19
- [key: string]: Array<D>;
20
- },
21
- ];
22
- };
23
- };
24
-
25
- export class ExtractorService implements IntervalHandler {
26
- readonly #sdk: ConnectorSDKInterface<ConnectorConfig>;
27
-
28
- readonly #httpClient: HttpClientSDKInterface;
29
-
30
- readonly #tableIdentifier: string;
31
-
32
- readonly #table: Required<MkgTableInterface>;
33
-
34
- readonly #fieldsList: string;
35
-
36
- constructor(
37
- sdk: ConnectorSDKInterface<ConnectorConfig>,
38
- httpClient: HttpClientSDKInterface,
39
- tableIdentifier: string,
40
- table: Required<MkgTableInterface>,
41
- ) {
42
- this.#sdk = sdk;
43
- this.#httpClient = httpClient;
44
- this.#tableIdentifier = tableIdentifier;
45
- this.#table = table;
46
- this.#fieldsList = table.fields.join(',');
47
- }
48
-
49
- get name(): string {
50
- return `mkg-extractor-${this.#tableIdentifier}`;
51
- }
52
-
53
- async onRun(): Promise<void> {
54
- try {
55
- const now = new Date();
56
- const latestOffset = await this.#sdk.offsetStore.getOffset(
57
- `offset_${this.#tableIdentifier}`,
58
- );
59
-
60
- const data = await this.#fetchData(latestOffset);
61
- if (data.length > 0) {
62
- await this.#sdk.sender.documents(data, {
63
- keyField: this.#table.identifierField,
64
- collection: `${this.#sdk.config.datasourceIdentifier ?? DEFAULT_DATASOURCE}_${this.#tableIdentifier}`,
65
- });
66
- }
67
-
68
- this.#sdk.logger.debug(
69
- `[MKG] Processed ${data.length} records from ${this.#tableIdentifier}`,
70
- );
71
-
72
- this.#sdk.offsetStore.setOffset(
73
- {
74
- id: String(
75
- data[data.length - 1]?.[this.#table.identifierField] ??
76
- latestOffset.id,
77
- ),
78
- timestamp: now.getTime(),
79
- rawTimestamp: now.toISOString(),
80
- },
81
- `offset_${this.#tableIdentifier}`,
82
- );
83
- } catch (error) {
84
- this.#sdk.logger.error(
85
- `[MKG] Failed to retrieve and process data from OPC UA source service`,
86
- { error },
87
- );
88
- }
89
- }
90
-
91
- #fetchData = async (
92
- latestOffset: StoredOffset,
93
- ): Promise<
94
- Array<{
95
- [key: string]: string | number | boolean;
96
- }>
97
- > => {
98
- const parameters = new URLSearchParams();
99
- parameters.set('NumRows', String(this.#table.rows));
100
- parameters.set(
101
- 'Filter',
102
- `${this.#table.dateField}>=${latestOffset.rawTimestamp}`,
103
- );
104
- parameters.set('FieldList', `${this.#table.dateField},${this.#fieldsList}`);
105
-
106
- try {
107
- const response = await this.#httpClient.get<
108
- FetchDataResponse<{
109
- [key: string]: string | number | boolean;
110
- }>
111
- >(
112
- `/web/v3/MKG/Documents/${this.#tableIdentifier}?${parameters.toString()}`,
113
- );
114
-
115
- return (
116
- response.data?.response?.ResultData?.[0]?.[this.#tableIdentifier] ?? []
117
- );
118
- } catch (error: HttpError | unknown) {
119
- const logMessage = `[MKG] Failed to fetch data from table "${this.#tableIdentifier}": (${(error as HttpError)?.status}) ${(error as HttpError)?.error ?? (error as Error)?.message}`;
120
- this.#sdk.logger.error(logMessage);
121
- }
122
-
123
- return [];
124
- };
125
- }
@@ -1,60 +0,0 @@
1
- import { MKG_TABLE_ARTG } from './artg';
2
- import { MKG_TABLE_ARTI } from './arti';
3
- import { MkgTable } from './base/table';
4
- import { MKG_TABLE_BWRG } from './bwrg';
5
- import { MKG_TABLE_BWRK } from './bwrk';
6
- import { MKG_TABLE_CLCH } from './clch';
7
- import { MKG_TABLE_DEBI } from './debi';
8
- import { MKG_TABLE_MAGL } from './magl';
9
- import { MKG_TABLE_MAGZ } from './magz';
10
- import { MKG_TABLE_MEDW } from './medw';
11
- import { MKG_TABLE_PARL } from './parl';
12
- import { MKG_TABLE_PLNB } from './plnb';
13
- import { MKG_TABLE_PRBV } from './prbv';
14
- import { MKG_TABLE_PRDH } from './prdh';
15
- import { MKG_TABLE_PRDR } from './prdr';
16
- import { MKG_TABLE_PRMV } from './prmv';
17
- import { MKG_TABLE_RELA } from './rela';
18
- import { MKG_TABLE_RGRS } from './rgrs';
19
- import { MKG_TABLE_RSRC } from './rsrc';
20
- import { MKG_TABLE_RSRD } from './rsrd';
21
- import { MKG_TABLE_RSRG } from './rsrg';
22
- import { MKG_TABLE_STLH } from './stlh';
23
- import { MKG_TABLE_STLM } from './stlm';
24
- import { MKG_TABLE_STLR } from './stlr';
25
- import { MKG_TABLE_VRDG } from './vrdg';
26
-
27
- const tables = [
28
- MKG_TABLE_RELA,
29
- MKG_TABLE_DEBI,
30
- MKG_TABLE_MEDW,
31
- MKG_TABLE_ARTI,
32
- MKG_TABLE_RSRC,
33
- MKG_TABLE_RSRD,
34
- MKG_TABLE_RSRG,
35
- MKG_TABLE_MAGZ,
36
- MKG_TABLE_MAGL,
37
- MKG_TABLE_STLH,
38
- MKG_TABLE_STLR,
39
- MKG_TABLE_STLM,
40
- MKG_TABLE_PRDH,
41
- MKG_TABLE_BWRK,
42
- MKG_TABLE_BWRG,
43
- MKG_TABLE_CLCH,
44
- MKG_TABLE_VRDG,
45
- MKG_TABLE_RGRS,
46
- MKG_TABLE_PLNB,
47
- MKG_TABLE_ARTG,
48
- MKG_TABLE_PRDR,
49
- MKG_TABLE_PRMV,
50
- MKG_TABLE_PRBV,
51
- MKG_TABLE_PARL,
52
- ];
53
-
54
- export const MKG_TABLES: { [identifier: string]: MkgTable } = tables.reduce(
55
- (acc, table) => {
56
- acc[table.identifier] = table;
57
- return acc;
58
- },
59
- {} as { [identifier: string]: MkgTable },
60
- );
@@ -1,12 +0,0 @@
1
- import { MkgTable } from './base/table';
2
-
3
- export const MKG_TABLE_ARTG = new MkgTable({
4
- identifier: 'artg',
5
- fields: [
6
- 'artg_num',
7
- 'artg_rela',
8
- 'artg_cred',
9
- 'artg_oms',
10
- 'artg_inkoopofferte',
11
- ],
12
- });