@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.
- package/CHANGELOG.md +15 -0
- package/index.cjs +2 -0
- package/index.cjs.map +7 -0
- package/index.js +2 -0
- package/index.js.map +7 -0
- package/libs/connector-runner-mkg/src/lib/actions-handler.d.ts +7 -0
- package/libs/connector-runner-mkg/src/lib/connector-runner-mkg.d.ts +8 -0
- package/libs/connector-runner-mkg/src/lib/extractor.service.d.ts +8 -0
- package/libs/connector-runner-mkg/src/lib/tables/_all.d.ts +4 -0
- package/libs/connector-runner-mkg/src/lib/tables/artg.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/arti.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/base/action.d.ts +21 -0
- package/libs/connector-runner-mkg/src/lib/tables/base/table.d.ts +15 -0
- package/libs/connector-runner-mkg/src/lib/tables/bwrg.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/bwrk.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/clch.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/debi.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/magl.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/magz.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/medw.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/parl.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/plnb.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/prbv.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/prdh.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/prdr.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/prmv.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/rela.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/rgrs.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/rsrc.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/rsrd.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/rsrg.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/stlh.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/stlm.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/stlr.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/tables/vrdg.d.ts +2 -0
- package/libs/connector-runner-mkg/src/lib/types.d.ts +34 -0
- package/libs/connector-runtime-sdk/src/index.d.ts +3 -0
- package/libs/connector-runtime-sdk/src/lib/connector-runtime.d.ts +16 -0
- package/libs/connector-runtime-sdk/src/lib/connector-runtime.interface.d.ts +5 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/files.sdk.interface.d.ts +18 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/http-client.interface.d.ts +38 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/index.d.ts +10 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/logger.sdk.interface.d.ts +7 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/offset-store.sdk.interface.d.ts +12 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/processing.sdk.interface.d.ts +13 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/receiver.sdk.interface.d.ts +14 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/sdk.interface.d.ts +31 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/sender.sdk.interface.d.ts +22 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/telemetry.sdk.interface.d.ts +15 -0
- package/libs/connector-runtime-sdk/src/lib/sdk/templating.sdk.interface.d.ts +12 -0
- package/libs/types/src/index.d.ts +7 -0
- package/libs/types/src/lib/cube-query-config.types.d.ts +20 -0
- package/libs/types/src/lib/file-action.types.d.ts +5 -0
- package/libs/types/src/lib/http-status-codes.enum.d.ts +64 -0
- package/libs/types/src/lib/management-api/action-definition.interface.d.ts +12 -0
- package/libs/types/src/lib/management-api/chart.interface.d.ts +9 -0
- package/libs/types/src/lib/management-api/connector/connector.interface.d.ts +140 -0
- package/libs/types/src/lib/management-api/connector/connectors.interface.d.ts +126 -0
- package/libs/types/src/lib/management-api/connector-orchestrator-config.interface.d.ts +14 -0
- package/libs/types/src/lib/management-api/cube-dataset.interface.d.ts +93 -0
- package/libs/types/src/lib/management-api/dashboard.interface.d.ts +35 -0
- package/libs/types/src/lib/management-api/dataset/collection.interface.d.ts +16 -0
- package/libs/types/src/lib/management-api/dataset/dataset-record.interface.d.ts +5 -0
- package/libs/types/src/lib/management-api/dataset/dataset.interface.d.ts +730 -0
- package/libs/types/src/lib/management-api/dataset/datasets.interface.d.ts +710 -0
- package/libs/types/src/lib/management-api/dataset/dimension.interface.d.ts +205 -0
- package/libs/types/src/lib/management-api/dataset/dimensions.interface.d.ts +186 -0
- package/libs/types/src/lib/management-api/dataset/filter-group.interface.d.ts +8 -0
- package/libs/types/src/lib/management-api/dataset/filter.interface.d.ts +34 -0
- package/libs/types/src/lib/management-api/dataset/filters.interface.d.ts +7 -0
- package/libs/types/src/lib/management-api/dataset/measure.interface.d.ts +65 -0
- package/libs/types/src/lib/management-api/dataset/measures.interface.d.ts +56 -0
- package/libs/types/src/lib/management-api/dataset/meta.interface.d.ts +9 -0
- package/libs/types/src/lib/management-api/dataset/pre-aggregate.interface.d.ts +69 -0
- package/libs/types/src/lib/management-api/dataset/pre-aggregations.interface.d.ts +54 -0
- package/libs/types/src/lib/management-api/dataset/relation.interface.d.ts +40 -0
- package/libs/types/src/lib/management-api/dataset/relations.interface.d.ts +36 -0
- package/libs/types/src/lib/management-api/dataset/segment.interface.d.ts +45 -0
- package/libs/types/src/lib/management-api/dataset/segments.interface.d.ts +43 -0
- package/libs/types/src/lib/management-api/dataset/switch.interface.d.ts +70 -0
- package/libs/types/src/lib/management-api/dataset/when-item.interface.d.ts +41 -0
- package/libs/types/src/lib/management-api/dataset/when-items.interface.d.ts +40 -0
- package/libs/types/src/lib/management-api/event-origin.interface.d.ts +24 -0
- package/libs/types/src/lib/management-api/index.d.ts +39 -0
- package/libs/types/src/lib/management-api/semantic-trigger/custom-cron-trigger-record.interface.d.ts +6 -0
- package/libs/types/src/lib/management-api/semantic-trigger/index.d.ts +6 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-filter.interface.d.ts +20 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-filters.interface.d.ts +18 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger-record.interface.d.ts +6 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-trigger.interface.d.ts +75 -0
- package/libs/types/src/lib/management-api/semantic-trigger/semantic-triggers.interface.d.ts +62 -0
- package/libs/types/src/lib/management-api/template-implementation-overrides.interface.d.ts +1152 -0
- package/libs/types/src/lib/management-api/template-implementation.interface.d.ts +2860 -0
- package/libs/types/src/lib/management-api/template.interface.d.ts +1191 -0
- package/libs/types/src/lib/management-api/tenant.interface.d.ts +8 -0
- package/libs/types/src/lib/management-api/type-enums.d.ts +85 -0
- package/libs/types/src/lib/management-api/web/generic-filter.dto.d.ts +37 -0
- package/libs/types/src/lib/management-api/web/index.d.ts +2 -0
- package/libs/types/src/lib/management-api/web/paginated-response.interface.d.ts +17 -0
- package/libs/types/src/lib/management-api/workflow/action.interface.d.ts +85 -0
- package/libs/types/src/lib/management-api/workflow/index.d.ts +6 -0
- package/libs/types/src/lib/management-api/workflow/offset.interface.d.ts +14 -0
- package/libs/types/src/lib/management-api/workflow/trigger-types.interface.d.ts +14 -0
- package/libs/types/src/lib/management-api/workflow/workflow-definition.interface.d.ts +57 -0
- package/libs/types/src/lib/management-api/workflow/workflow-run.d.ts +70 -0
- package/libs/types/src/lib/management-api/workflow/workflow.drawing.d.ts +102 -0
- package/libs/types/src/lib/message.types.d.ts +59 -0
- package/libs/types/src/lib/response.types.d.ts +27 -0
- package/libs/types/src/lib/types.d.ts +116 -0
- package/package.json +1 -1
- package/.eslintrc.json +0 -30
- package/jest.config.ts +0 -10
- package/project.json +0 -29
- package/src/lib/actions-handler.spec.ts +0 -177
- package/src/lib/actions-handler.ts +0 -143
- package/src/lib/connector-runner-mkg.spec.ts +0 -219
- package/src/lib/connector-runner-mkg.ts +0 -155
- package/src/lib/extractor.service.spec.ts +0 -123
- package/src/lib/extractor.service.ts +0 -125
- package/src/lib/tables/_all.ts +0 -60
- package/src/lib/tables/artg.ts +0 -12
- package/src/lib/tables/arti.ts +0 -99
- package/src/lib/tables/base/action.ts +0 -70
- package/src/lib/tables/base/table.ts +0 -57
- package/src/lib/tables/bwrg.ts +0 -13
- package/src/lib/tables/bwrk.ts +0 -60
- package/src/lib/tables/clch.ts +0 -42
- package/src/lib/tables/debi.ts +0 -62
- package/src/lib/tables/magl.ts +0 -15
- package/src/lib/tables/magz.ts +0 -14
- package/src/lib/tables/medw.ts +0 -97
- package/src/lib/tables/parl.ts +0 -24
- package/src/lib/tables/plnb.ts +0 -46
- package/src/lib/tables/prbv.ts +0 -31
- package/src/lib/tables/prdh.ts +0 -46
- package/src/lib/tables/prdr.ts +0 -25
- package/src/lib/tables/prmv.ts +0 -31
- package/src/lib/tables/rela.ts +0 -40
- package/src/lib/tables/rgrs.ts +0 -68
- package/src/lib/tables/rsrc.ts +0 -23
- package/src/lib/tables/rsrd.ts +0 -98
- package/src/lib/tables/rsrg.ts +0 -6
- package/src/lib/tables/stlh.ts +0 -24
- package/src/lib/tables/stlm.ts +0 -80
- package/src/lib/tables/stlr.ts +0 -60
- package/src/lib/tables/vrdg.ts +0 -27
- package/src/lib/types.ts +0 -45
- package/tsconfig.json +0 -22
- package/tsconfig.lib.json +0 -10
- package/tsconfig.spec.json +0 -14
- /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
|
-
}
|
package/src/lib/tables/_all.ts
DELETED
|
@@ -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
|
-
);
|
package/src/lib/tables/artg.ts
DELETED