@hahnpro/hpc-api 6.0.0 → 2024.4.0-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/package.json +8 -24
- package/src/index.d.ts +20 -0
- package/src/index.js +20 -0
- package/{dist → src/lib}/Queue.js +2 -7
- package/src/lib/api-base.js +6 -0
- package/src/lib/api.js +60 -0
- package/src/lib/asset.interface.js +1 -0
- package/{dist → src/lib}/asset.service.js +21 -17
- package/src/lib/assettypes.service.js +24 -0
- package/{dist → src/lib}/content.interface.js +2 -5
- package/src/lib/content.service.js +49 -0
- package/src/lib/data.interface.js +3 -0
- package/{dist → src/lib}/data.service.js +18 -11
- package/src/lib/endpoint.interface.js +1 -0
- package/{dist → src/lib}/endpoint.service.d.ts +2 -2
- package/{dist → src/lib}/endpoint.service.js +2 -6
- package/src/lib/events.interface.js +1 -0
- package/src/lib/events.service.js +9 -0
- package/src/lib/flow-deployment.interface.js +1 -0
- package/src/lib/flow-deployment.service.js +68 -0
- package/src/lib/flow-function.interface.js +1 -0
- package/{dist → src/lib}/flow-function.service.js +3 -6
- package/src/lib/flow-module.interface.js +1 -0
- package/{dist → src/lib}/flow-module.service.js +8 -7
- package/src/lib/flow.interface.js +1 -0
- package/{dist → src/lib}/flow.service.js +15 -20
- package/src/lib/http.service.js +179 -0
- package/src/lib/label.interface.js +1 -0
- package/{dist → src/lib}/label.service.js +2 -6
- package/src/lib/mock/api-base.mock.js +7 -0
- package/src/lib/mock/api.mock.js +199 -0
- package/{dist → src/lib}/mock/asset.mock.service.js +30 -41
- package/{dist → src/lib}/mock/assetTypes.mock.service.js +19 -27
- package/{dist → src/lib}/mock/content.mock.service.js +21 -24
- package/src/lib/mock/data.mock.service.js +93 -0
- package/{dist → src/lib}/mock/endpoint.mock.service.js +2 -6
- package/src/lib/mock/events.mock.service.js +10 -0
- package/src/lib/mock/flow-deployment.mock.service.js +118 -0
- package/{dist → src/lib}/mock/flow-functions.mock.service.js +12 -21
- package/src/lib/mock/flow-modules.mock.service.js +20 -0
- package/src/lib/mock/flow.mock.service.js +81 -0
- package/src/lib/mock/index.js +11 -0
- package/src/lib/mock/label.mock.service.js +13 -0
- package/src/lib/mock/notification.mock.service.js +7 -0
- package/src/lib/mock/secret.mock.service.js +28 -0
- package/src/lib/mock/task.mock.service.js +32 -0
- package/{dist → src/lib}/mock/timeseries.mock.service.js +40 -49
- package/{dist → src/lib}/mock/trash.mock.service.js +8 -15
- package/src/lib/mock/user.mock.service.js +10 -0
- package/{dist → src/lib}/mock/vault.mock.service.js +2 -6
- package/src/lib/notification.interface.js +1 -0
- package/src/lib/notification.service.js +6 -0
- package/{dist → src/lib}/proxy.service.js +1 -5
- package/src/lib/resource.interface.js +1 -0
- package/src/lib/schema.interface.js +1 -0
- package/src/lib/secret.interface.js +1 -0
- package/src/lib/secret.service.js +15 -0
- package/src/lib/storage.interface.js +1 -0
- package/src/lib/task.interface.js +1 -0
- package/src/lib/task.service.js +19 -0
- package/src/lib/timeseries.interface.js +1 -0
- package/src/lib/timeseries.service.js +92 -0
- package/{dist → src/lib}/token-set.js +3 -7
- package/{dist → src/lib}/trash.service.js +2 -6
- package/src/lib/user-settings.interface.js +1 -0
- package/src/lib/user.service.js +26 -0
- package/src/lib/vault.interface.js +1 -0
- package/src/lib/vault.service.js +10 -0
- package/LICENSE +0 -21
- package/dist/api-base.js +0 -10
- package/dist/api.js +0 -62
- package/dist/asset.interface.js +0 -2
- package/dist/assettypes.service.js +0 -28
- package/dist/content.service.js +0 -50
- package/dist/data.interface.js +0 -6
- package/dist/endpoint.interface.js +0 -2
- package/dist/events.interface.js +0 -2
- package/dist/events.service.js +0 -13
- package/dist/flow-deployment.interface.js +0 -2
- package/dist/flow-deployment.service.js +0 -74
- package/dist/flow-function.interface.js +0 -2
- package/dist/flow-module.interface.js +0 -2
- package/dist/flow.interface.js +0 -2
- package/dist/http.service.js +0 -182
- package/dist/index.d.ts +0 -20
- package/dist/index.js +0 -23
- package/dist/label.interface.js +0 -2
- package/dist/mock/api-base.mock.js +0 -11
- package/dist/mock/api.mock.js +0 -128
- package/dist/mock/data.mock.service.js +0 -96
- package/dist/mock/events.mock.service.js +0 -14
- package/dist/mock/flow-deployment.mock.service.js +0 -142
- package/dist/mock/flow-modules.mock.service.js +0 -27
- package/dist/mock/flow.mock.service.js +0 -93
- package/dist/mock/index.js +0 -14
- package/dist/mock/label.mock.service.js +0 -17
- package/dist/mock/notification.mock.service.js +0 -11
- package/dist/mock/secret.mock.service.js +0 -31
- package/dist/mock/task.mock.service.js +0 -37
- package/dist/mock/user.mock.service.js +0 -14
- package/dist/notification.interface.js +0 -2
- package/dist/notification.service.js +0 -10
- package/dist/resource.interface.js +0 -2
- package/dist/schema.interface.js +0 -2
- package/dist/secret.interface.js +0 -2
- package/dist/secret.service.js +0 -19
- package/dist/storage.interface.js +0 -2
- package/dist/task.interface.js +0 -2
- package/dist/task.service.js +0 -22
- package/dist/timeseries.interface.js +0 -2
- package/dist/timeseries.service.js +0 -56
- package/dist/user-settings.interface.js +0 -2
- package/dist/user.service.js +0 -33
- package/dist/vault.interface.js +0 -2
- package/dist/vault.service.js +0 -14
- package/{dist → src/lib}/Queue.d.ts +0 -0
- package/{dist → src/lib}/api-base.d.ts +0 -0
- package/{dist → src/lib}/api.d.ts +6 -6
- package/{dist → src/lib}/asset.interface.d.ts +0 -0
- package/{dist → src/lib}/asset.service.d.ts +0 -0
- package/{dist → src/lib}/assettypes.service.d.ts +0 -0
- package/{dist → src/lib}/content.interface.d.ts +0 -0
- package/{dist → src/lib}/content.service.d.ts +1 -1
- package/{dist → src/lib}/data.interface.d.ts +0 -0
- package/{dist → src/lib}/data.service.d.ts +0 -0
- package/{dist → src/lib}/endpoint.interface.d.ts +0 -0
- package/{dist → src/lib}/events.interface.d.ts +0 -0
- package/{dist → src/lib}/events.service.d.ts +0 -0
- package/{dist → src/lib}/flow-deployment.interface.d.ts +1 -1
- package/{dist → src/lib}/flow-deployment.service.d.ts +0 -0
- package/{dist → src/lib}/flow-function.interface.d.ts +0 -0
- package/{dist → src/lib}/flow-function.service.d.ts +1 -1
- package/{dist → src/lib}/flow-module.interface.d.ts +0 -0
- package/{dist → src/lib}/flow-module.service.d.ts +1 -1
- package/{dist → src/lib}/flow.interface.d.ts +1 -1
- package/{dist → src/lib}/flow.service.d.ts +1 -1
- package/{dist → src/lib}/http.service.d.ts +0 -0
- package/{dist → src/lib}/label.interface.d.ts +0 -0
- package/{dist → src/lib}/label.service.d.ts +0 -0
- package/{dist → src/lib}/mock/api-base.mock.d.ts +0 -0
- package/{dist → src/lib}/mock/api.mock.d.ts +18 -18
- package/{dist → src/lib}/mock/asset.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/assetTypes.mock.service.d.ts +0 -0
- package/{dist → src/lib}/mock/content.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/data.mock.service.d.ts +0 -0
- package/{dist → src/lib}/mock/endpoint.mock.service.d.ts +0 -0
- package/{dist → src/lib}/mock/events.mock.service.d.ts +0 -0
- package/{dist → src/lib}/mock/flow-deployment.mock.service.d.ts +2 -2
- package/{dist → src/lib}/mock/flow-functions.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/flow-modules.mock.service.d.ts +2 -2
- package/{dist → src/lib}/mock/flow.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/index.d.ts +0 -0
- package/{dist → src/lib}/mock/label.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/notification.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/secret.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/task.mock.service.d.ts +0 -0
- package/{dist → src/lib}/mock/timeseries.mock.service.d.ts +0 -0
- package/{dist → src/lib}/mock/trash.mock.service.d.ts +1 -1
- package/{dist → src/lib}/mock/user.mock.service.d.ts +0 -0
- package/{dist → src/lib}/mock/vault.mock.service.d.ts +1 -1
- package/{dist → src/lib}/notification.interface.d.ts +0 -0
- package/{dist → src/lib}/notification.service.d.ts +1 -1
- package/{dist → src/lib}/proxy.service.d.ts +0 -0
- package/{dist → src/lib}/resource.interface.d.ts +0 -0
- package/{dist → src/lib}/schema.interface.d.ts +0 -0
- package/{dist → src/lib}/secret.interface.d.ts +0 -0
- package/{dist → src/lib}/secret.service.d.ts +0 -0
- package/{dist → src/lib}/storage.interface.d.ts +0 -0
- package/{dist → src/lib}/task.interface.d.ts +0 -0
- package/{dist → src/lib}/task.service.d.ts +0 -0
- package/{dist → src/lib}/timeseries.interface.d.ts +0 -0
- package/{dist → src/lib}/timeseries.service.d.ts +0 -0
- package/{dist → src/lib}/token-set.d.ts +0 -0
- package/{dist → src/lib}/trash.service.d.ts +0 -0
- package/{dist → src/lib}/user-settings.interface.d.ts +0 -0
- package/{dist → src/lib}/user.service.d.ts +0 -0
- package/{dist → src/lib}/vault.interface.d.ts +0 -0
- package/{dist → src/lib}/vault.service.d.ts +1 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { stringify } from 'querystring';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import EventSource from 'eventsource';
|
|
4
|
+
import { CompactSign, decodeJwt } from 'jose';
|
|
5
|
+
import { Queue } from './Queue';
|
|
6
|
+
import { TokenSet } from './token-set';
|
|
7
|
+
export class HttpClient {
|
|
8
|
+
constructor(baseURL, authBaseURL, realm, clientId, clientSecret, tokenSubject) {
|
|
9
|
+
this.baseURL = baseURL;
|
|
10
|
+
this.authBaseURL = authBaseURL;
|
|
11
|
+
this.realm = realm;
|
|
12
|
+
this.clientId = clientId;
|
|
13
|
+
this.clientSecret = clientSecret;
|
|
14
|
+
this.tokenSubject = tokenSubject;
|
|
15
|
+
this.discoveredIssuers = new Map();
|
|
16
|
+
this.eventSourcesMap = new Map();
|
|
17
|
+
this.getQueueStats = () => this.requestQueue?.getStats();
|
|
18
|
+
this.delete = (url, config) => this.request('DELETE', url, config);
|
|
19
|
+
this.get = (url, config) => this.request('GET', url, config);
|
|
20
|
+
this.post = (url, data, config) => this.request('POST', url, config, data);
|
|
21
|
+
this.put = (url, data, config) => this.request('PUT', url, config, data);
|
|
22
|
+
this.request = (method, url, config = {}, data) => {
|
|
23
|
+
return this.requestQueue.add(() => new Promise((resolve, reject) => {
|
|
24
|
+
const tokenP = config.token ? Promise.resolve(config.token) : this.getAccessToken();
|
|
25
|
+
tokenP
|
|
26
|
+
.then((token) => {
|
|
27
|
+
const headers = { Authorization: `Bearer ${token}`, ...config.headers };
|
|
28
|
+
return this.axiosInstance.request({ ...config, headers, method, url, data });
|
|
29
|
+
})
|
|
30
|
+
.then((response) => resolve(response.data))
|
|
31
|
+
.catch(reject);
|
|
32
|
+
}));
|
|
33
|
+
};
|
|
34
|
+
this.getAccessToken = async (forceRefresh = false) => {
|
|
35
|
+
let accessToken;
|
|
36
|
+
if (forceRefresh || !this.tokenSet || this.tokenSet.isExpired()) {
|
|
37
|
+
if (this.tokenSet?.provided) {
|
|
38
|
+
throw new Error('provided token is expired and cannot be refreshed, provide a new token.');
|
|
39
|
+
}
|
|
40
|
+
this.tokenSet = await this.requestAccessToken();
|
|
41
|
+
accessToken = this.tokenSet.accessToken;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
accessToken = this.tokenSet.accessToken;
|
|
45
|
+
}
|
|
46
|
+
if (this.tokenSubject) {
|
|
47
|
+
if (forceRefresh || !this.exchangedTokenSet || this.exchangedTokenSet.isExpired()) {
|
|
48
|
+
this.exchangedTokenSet = await this.exchangeAccessToken(accessToken);
|
|
49
|
+
}
|
|
50
|
+
return this.exchangedTokenSet.accessToken;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return accessToken;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
this.axiosInstance = axios.create({ baseURL, timeout: 60000 });
|
|
57
|
+
this.authAxiosInstance = axios.create({ baseURL: authBaseURL || baseURL, timeout: 10000 });
|
|
58
|
+
this.requestQueue = new Queue({ concurrency: 1, timeout: 70000, throwOnTimeout: true });
|
|
59
|
+
}
|
|
60
|
+
async addEventSource(url, listener, errorListener, options = {}) {
|
|
61
|
+
const id = generateUUID();
|
|
62
|
+
const errListener = errorListener
|
|
63
|
+
? errorListener
|
|
64
|
+
: (event) => {
|
|
65
|
+
throw new Error(JSON.stringify(event, null, 2));
|
|
66
|
+
};
|
|
67
|
+
const token = options.token ? options.token : await this.getAccessToken();
|
|
68
|
+
const es = new EventSource(`${this.baseURL}${url}`, {
|
|
69
|
+
headers: { authorization: 'Bearer ' + token },
|
|
70
|
+
});
|
|
71
|
+
es.addEventListener('message', listener);
|
|
72
|
+
es.addEventListener('error', errListener);
|
|
73
|
+
// the listeners have to be saved otherwise they cannot be removed
|
|
74
|
+
this.eventSourcesMap.set(id, { eventSource: es, listener, errListener });
|
|
75
|
+
return id;
|
|
76
|
+
}
|
|
77
|
+
destroyEventSource(id) {
|
|
78
|
+
if (!this.eventSourcesMap.has(id)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const es = this.eventSourcesMap.get(id);
|
|
82
|
+
// close and unbind listeners so that the process quits cleanly
|
|
83
|
+
es.eventSource.close();
|
|
84
|
+
es.eventSource.removeEventListener('message', es.listener);
|
|
85
|
+
es.eventSource.removeEventListener('error', es.errListener);
|
|
86
|
+
this.eventSourcesMap.delete(id);
|
|
87
|
+
}
|
|
88
|
+
destroyAllEventSources() {
|
|
89
|
+
for (const key of this.eventSourcesMap.keys()) {
|
|
90
|
+
this.destroyEventSource(key);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
validateIssuer(issuer) {
|
|
94
|
+
if (!issuer.issuer ||
|
|
95
|
+
!issuer.grant_types_supported?.includes('client_credentials') ||
|
|
96
|
+
!issuer.token_endpoint_auth_methods_supported?.includes('client_secret_jwt')) {
|
|
97
|
+
throw new Error('Issuer does not support client_secret_jwt');
|
|
98
|
+
}
|
|
99
|
+
return issuer;
|
|
100
|
+
}
|
|
101
|
+
async discoverIssuer(uri) {
|
|
102
|
+
if (this.discoveredIssuers.has(uri)) {
|
|
103
|
+
return this.discoveredIssuers.get(uri);
|
|
104
|
+
}
|
|
105
|
+
const wellKnownUri = `${uri}/.well-known/openid-configuration`;
|
|
106
|
+
const issuerResponse = await this.authAxiosInstance.get(wellKnownUri, {
|
|
107
|
+
responseType: 'json',
|
|
108
|
+
headers: { Accept: 'application/json' },
|
|
109
|
+
});
|
|
110
|
+
const validIssuer = this.validateIssuer(issuerResponse.data);
|
|
111
|
+
this.discoveredIssuers.set(uri, validIssuer);
|
|
112
|
+
return validIssuer;
|
|
113
|
+
}
|
|
114
|
+
async requestAccessToken(additionalOpts = {}) {
|
|
115
|
+
const issuer = await this.discoverIssuer(`${this.authBaseURL}/realms/${this.realm}`);
|
|
116
|
+
const timestamp = Date.now() / 1000;
|
|
117
|
+
const audience = [...new Set([issuer.issuer, issuer.token_endpoint].filter(Boolean))];
|
|
118
|
+
const assertionPayload = {
|
|
119
|
+
iat: timestamp,
|
|
120
|
+
exp: timestamp + 60,
|
|
121
|
+
jti: generateUUID(),
|
|
122
|
+
iss: this.clientId,
|
|
123
|
+
sub: this.clientId,
|
|
124
|
+
aud: audience,
|
|
125
|
+
};
|
|
126
|
+
const supportedAlgos = issuer.token_endpoint_auth_signing_alg_values_supported;
|
|
127
|
+
const alg = issuer.token_endpoint_auth_signing_alg ??
|
|
128
|
+
(Array.isArray(supportedAlgos) && supportedAlgos.find((signAlg) => /^HS(?:256|384|512)/.test(signAlg)));
|
|
129
|
+
if (!alg) {
|
|
130
|
+
throw new Error('Issuer has to support HS256, HS384 or HS512');
|
|
131
|
+
}
|
|
132
|
+
const assertion = await new CompactSign(Buffer.from(JSON.stringify(assertionPayload)))
|
|
133
|
+
.setProtectedHeader({ alg })
|
|
134
|
+
.sign(new TextEncoder().encode(this.clientSecret));
|
|
135
|
+
const opts = {
|
|
136
|
+
client_id: this.clientId,
|
|
137
|
+
client_assertion: assertion,
|
|
138
|
+
client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
|
|
139
|
+
grant_type: 'client_credentials',
|
|
140
|
+
...additionalOpts,
|
|
141
|
+
};
|
|
142
|
+
const authResponse = await this.authAxiosInstance.post(issuer.token_endpoint, stringify(opts), {
|
|
143
|
+
headers: { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
144
|
+
});
|
|
145
|
+
if (authResponse?.data?.access_token && authResponse.data.expires_in) {
|
|
146
|
+
return new TokenSet(authResponse.data.access_token, authResponse.data.expires_in);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw new Error('Invalid access token received');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async exchangeAccessToken(accessToken) {
|
|
153
|
+
if (!accessToken || !this.tokenSubject) {
|
|
154
|
+
throw new Error('Could not exchange access token');
|
|
155
|
+
}
|
|
156
|
+
const opts = {
|
|
157
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange',
|
|
158
|
+
subject_token: accessToken,
|
|
159
|
+
audience: this.clientId,
|
|
160
|
+
requested_token_type: 'urn:ietf:params:oauth:token-type:access_token',
|
|
161
|
+
requested_subject: this.tokenSubject,
|
|
162
|
+
};
|
|
163
|
+
return this.requestAccessToken(opts);
|
|
164
|
+
}
|
|
165
|
+
async provideExternalToken(token) {
|
|
166
|
+
const issuer = await this.discoverIssuer(`${this.authBaseURL}/realms/${this.realm}`);
|
|
167
|
+
const { iss: providedIssuer, exp } = decodeJwt(token);
|
|
168
|
+
if (issuer.issuer !== providedIssuer) {
|
|
169
|
+
throw new Error(`Provided token is not issued by currently configured issuer. Provided token issued by ${providedIssuer}, but ${issuer.issuer} is configured.`);
|
|
170
|
+
}
|
|
171
|
+
this.tokenSet = new TokenSet(token, exp - Date.now() / 1000, true);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function generateUUID() {
|
|
175
|
+
if (typeof globalThis.crypto?.randomUUID === 'function') {
|
|
176
|
+
return globalThis.crypto.randomUUID();
|
|
177
|
+
}
|
|
178
|
+
throw new Error('randomUUID() not available in this environment. Please upgrade to Node 20+ or a modern browser.');
|
|
179
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.LabelService = void 0;
|
|
4
|
-
const data_service_1 = require("./data.service");
|
|
5
|
-
class LabelService extends data_service_1.DataService {
|
|
1
|
+
import { DataService } from './data.service';
|
|
2
|
+
export class LabelService extends DataService {
|
|
6
3
|
constructor(httpClient) {
|
|
7
4
|
super(httpClient, '/labels');
|
|
8
5
|
}
|
|
@@ -16,4 +13,3 @@ class LabelService extends data_service_1.DataService {
|
|
|
16
13
|
return this.httpClient.get(`${this.basePath}/count`, options);
|
|
17
14
|
}
|
|
18
15
|
}
|
|
19
|
-
exports.LabelService = LabelService;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { AssetMockService } from './asset.mock.service';
|
|
5
|
+
import { AssetTypesMockService } from './assetTypes.mock.service';
|
|
6
|
+
import { ContentMockService } from './content.mock.service';
|
|
7
|
+
import { EndpointMockService } from './endpoint.mock.service';
|
|
8
|
+
import { EventsMockService } from './events.mock.service';
|
|
9
|
+
import { FlowDeploymentMockService } from './flow-deployment.mock.service';
|
|
10
|
+
import { FlowFunctionsMockService } from './flow-functions.mock.service';
|
|
11
|
+
import { FlowModulesMockService } from './flow-modules.mock.service';
|
|
12
|
+
import { FlowMockService } from './flow.mock.service';
|
|
13
|
+
import { LabelMockService } from './label.mock.service';
|
|
14
|
+
import { NotificationMockService } from './notification.mock.service';
|
|
15
|
+
import { SecretMockService } from './secret.mock.service';
|
|
16
|
+
import { TaskMockService } from './task.mock.service';
|
|
17
|
+
import { TimeseriesMockService } from './timeseries.mock.service';
|
|
18
|
+
import { UserMockService } from './user.mock.service';
|
|
19
|
+
import { VaultMockService } from './vault.mock.service';
|
|
20
|
+
export class MockAPI {
|
|
21
|
+
constructor(initData) {
|
|
22
|
+
this.httpClient = null;
|
|
23
|
+
this.proxy = null;
|
|
24
|
+
const { assets = [], assetRevisions = [], contents = [], endpoints = [], secrets = [], timeSeries = [], tasks = [], events = [], users, flows = [], flowRevisions = [], deployments = [], functions = [], functionRevisions = [], modules = [], diagrams = [], labels = [], vault = [], notifications = [], } = initData;
|
|
25
|
+
// convert init data to normal data that the services usually use
|
|
26
|
+
const assetTypes = assets
|
|
27
|
+
.map((v) => v.type)
|
|
28
|
+
.map((v) => {
|
|
29
|
+
return typeof v === 'string'
|
|
30
|
+
? v
|
|
31
|
+
: {
|
|
32
|
+
...v,
|
|
33
|
+
readPermissions: v.readPermissions || [],
|
|
34
|
+
readWritePermissions: v.readWritePermissions || [],
|
|
35
|
+
typeSchema: v.typeSchema ?? {},
|
|
36
|
+
uiSchema: v.uiSchema ?? {},
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const assets1 = assets.map((v, index) => ({
|
|
40
|
+
...v,
|
|
41
|
+
readPermissions: v.readPermissions ?? [],
|
|
42
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
43
|
+
type: assetTypes[index],
|
|
44
|
+
}));
|
|
45
|
+
const assetRevisions1 = assetRevisions.map((v, index) => ({
|
|
46
|
+
...v,
|
|
47
|
+
readPermissions: v.readPermissions ?? [],
|
|
48
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
49
|
+
type: assetTypes[index],
|
|
50
|
+
}));
|
|
51
|
+
const contents1 = contents.map((v) => ({
|
|
52
|
+
...v,
|
|
53
|
+
readPermissions: v.readPermissions ?? [],
|
|
54
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
55
|
+
size: v.size ?? 0,
|
|
56
|
+
fileId: v.fileId ?? '',
|
|
57
|
+
mimetype: v.mimetype ?? '',
|
|
58
|
+
}));
|
|
59
|
+
const contentData = contents.map((v) => (v.data ? v.data : readFileSync(join(v.filePath, v.filename))));
|
|
60
|
+
const secrets1 = secrets.map((v) => ({
|
|
61
|
+
...v,
|
|
62
|
+
readPermissions: v.readPermissions ?? [],
|
|
63
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
64
|
+
}));
|
|
65
|
+
const timeSeries1 = timeSeries.map((v) => ({
|
|
66
|
+
...v,
|
|
67
|
+
description: v.description ?? '',
|
|
68
|
+
readPermissions: v.readPermissions ?? [],
|
|
69
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
70
|
+
maxBucketTimeRange: v.maxBucketTimeRange ?? 0,
|
|
71
|
+
maxDate: v.maxDate,
|
|
72
|
+
minDate: v.minDate,
|
|
73
|
+
autoDelData: v.autoDelData ?? new Date(),
|
|
74
|
+
autoDelBucket: v.autoDelBucket ?? new Date(),
|
|
75
|
+
}));
|
|
76
|
+
const timeSeriesValues = timeSeries.map((v) => v.values);
|
|
77
|
+
const endpoint1 = endpoints.map((v) => ({
|
|
78
|
+
...v,
|
|
79
|
+
status: v.status,
|
|
80
|
+
config: v.config,
|
|
81
|
+
notificationCheckInterval: v.notificationCheckInterval,
|
|
82
|
+
notificationPauseInterval: v.notificationPauseInterval,
|
|
83
|
+
nbOfNotificationsBetweenPauseInterval: v.nbOfNotificationsBetweenPauseInterval,
|
|
84
|
+
readPermissions: v.readPermissions ?? [],
|
|
85
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
86
|
+
}));
|
|
87
|
+
// TODO: ...
|
|
88
|
+
const tasks1 = tasks.map((v) => ({
|
|
89
|
+
...v,
|
|
90
|
+
id: v.id,
|
|
91
|
+
readPermissions: v.readPermissions ?? [],
|
|
92
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
93
|
+
subTasks: v.subTasks ?? [],
|
|
94
|
+
}));
|
|
95
|
+
const events1 = events.map((v) => ({
|
|
96
|
+
...v,
|
|
97
|
+
readPermissions: v.readPermissions ?? [],
|
|
98
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
99
|
+
cause: v.cause,
|
|
100
|
+
level: v.level,
|
|
101
|
+
}));
|
|
102
|
+
const diagrams1 = diagrams.map((v) => ({
|
|
103
|
+
...v,
|
|
104
|
+
json: v.json ?? '',
|
|
105
|
+
author: 'nobody',
|
|
106
|
+
}));
|
|
107
|
+
const flows1 = flows.map((v) => ({
|
|
108
|
+
...v,
|
|
109
|
+
readPermissions: v.readPermissions ?? [],
|
|
110
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
111
|
+
diagram: diagrams.find((v1) => v1.flow === v.id).id,
|
|
112
|
+
name: `flow-${v.id}`,
|
|
113
|
+
deployments: v.deployments ?? [],
|
|
114
|
+
}));
|
|
115
|
+
const flowRevisions1 = flowRevisions.map((v) => ({
|
|
116
|
+
...v,
|
|
117
|
+
readPermissions: v.readPermissions ?? [],
|
|
118
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
119
|
+
diagram: diagrams.find((v1) => v1.flow === v.originalId).id,
|
|
120
|
+
name: `flow-${v.id}`,
|
|
121
|
+
deployments: v.deployments ?? [],
|
|
122
|
+
}));
|
|
123
|
+
const deployments1 = deployments.map((v) => ({
|
|
124
|
+
...v,
|
|
125
|
+
readPermissions: v.readPermissions ?? [],
|
|
126
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
127
|
+
diagram: v.diagram ?? '',
|
|
128
|
+
artifact: v.artifact ?? null,
|
|
129
|
+
flowModel: v.flowModel ?? { connections: [], elements: [] },
|
|
130
|
+
desiredStatus: 'running',
|
|
131
|
+
actualStatus: 'generating queued',
|
|
132
|
+
target: 'executor',
|
|
133
|
+
name: `deployment-${v.id}`,
|
|
134
|
+
}));
|
|
135
|
+
const functions1 = functions.map((v) => ({
|
|
136
|
+
...v,
|
|
137
|
+
category: 'task',
|
|
138
|
+
readPermissions: v.readPermissions ?? [],
|
|
139
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
140
|
+
author: 'nobody',
|
|
141
|
+
}));
|
|
142
|
+
const functionRevisions1 = functionRevisions.map((v) => ({
|
|
143
|
+
...v,
|
|
144
|
+
category: 'task',
|
|
145
|
+
readPermissions: v.readPermissions ?? [],
|
|
146
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
147
|
+
author: 'nobody',
|
|
148
|
+
}));
|
|
149
|
+
const modules1 = modules.map((v, index) => ({
|
|
150
|
+
...v,
|
|
151
|
+
artifacts: modules[index].artifacts.map((art) => ({
|
|
152
|
+
...art,
|
|
153
|
+
version: '0.0.0',
|
|
154
|
+
id: randomUUID(),
|
|
155
|
+
mimetype: '',
|
|
156
|
+
size: 0,
|
|
157
|
+
createdAt: '' + Date.now(),
|
|
158
|
+
})) ?? [],
|
|
159
|
+
author: 'nobody',
|
|
160
|
+
functions: v.functions ?? [],
|
|
161
|
+
readPermissions: v.readPermissions ?? [],
|
|
162
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
163
|
+
}));
|
|
164
|
+
const labels1 = labels.map((v) => ({
|
|
165
|
+
...v,
|
|
166
|
+
color: v.color ?? '',
|
|
167
|
+
description: v.description ?? '',
|
|
168
|
+
readPermissions: v.readPermissions ?? [],
|
|
169
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
170
|
+
}));
|
|
171
|
+
const vaultSecrets1 = vault.map((v) => ({
|
|
172
|
+
...v,
|
|
173
|
+
readPermissions: v.readPermissions ?? [],
|
|
174
|
+
readWritePermissions: v.readWritePermissions ?? [],
|
|
175
|
+
}));
|
|
176
|
+
const notifications1 = notifications.map((v) => ({
|
|
177
|
+
...v,
|
|
178
|
+
link: v.link ?? '',
|
|
179
|
+
description: v.description ?? '',
|
|
180
|
+
read: v.read ?? false,
|
|
181
|
+
}));
|
|
182
|
+
this.assets = new AssetMockService(this, assets1, assetRevisions1);
|
|
183
|
+
this.assetTypes = new AssetTypesMockService(assetTypes, []);
|
|
184
|
+
this.contents = new ContentMockService(contents1, contentData);
|
|
185
|
+
this.endpoints = new EndpointMockService(endpoint1);
|
|
186
|
+
this.secrets = new SecretMockService(secrets1);
|
|
187
|
+
this.timeSeries = new TimeseriesMockService(timeSeries1, timeSeriesValues);
|
|
188
|
+
this.tasks = new TaskMockService(tasks1);
|
|
189
|
+
this.events = new EventsMockService(events1);
|
|
190
|
+
this.users = new UserMockService(users);
|
|
191
|
+
this.flows = new FlowMockService(flows1, diagrams1, flowRevisions1);
|
|
192
|
+
this.flowDeployments = new FlowDeploymentMockService(deployments1, this);
|
|
193
|
+
this.flowFunctions = new FlowFunctionsMockService(functions1, functionRevisions1);
|
|
194
|
+
this.flowModules = new FlowModulesMockService(modules1);
|
|
195
|
+
this.labels = new LabelMockService(labels1);
|
|
196
|
+
this.vault = new VaultMockService(vaultSecrets1);
|
|
197
|
+
this.notifications = new NotificationMockService(notifications1);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const data_mock_service_1 = require("./data.mock.service");
|
|
8
|
-
const trash_mock_service_1 = require("./trash.mock.service");
|
|
9
|
-
let BaseService = class BaseService extends api_base_mock_1.APIBaseMock {
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { mix } from 'ts-mixer';
|
|
3
|
+
import { APIBaseMock } from './api-base.mock';
|
|
4
|
+
import { DataMockService } from './data.mock.service';
|
|
5
|
+
import { TrashMockService } from './trash.mock.service';
|
|
6
|
+
let BaseService = class BaseService extends APIBaseMock {
|
|
10
7
|
};
|
|
11
|
-
BaseService =
|
|
12
|
-
|
|
8
|
+
BaseService = __decorate([
|
|
9
|
+
mix(DataMockService, TrashMockService)
|
|
13
10
|
], BaseService);
|
|
14
|
-
class AssetMockService extends BaseService {
|
|
11
|
+
export class AssetMockService extends BaseService {
|
|
15
12
|
constructor(api, assets, revisions) {
|
|
16
13
|
super(assets);
|
|
17
14
|
this.api = api;
|
|
@@ -27,12 +24,13 @@ class AssetMockService extends BaseService {
|
|
|
27
24
|
return page;
|
|
28
25
|
}
|
|
29
26
|
addOne(dto) {
|
|
30
|
-
this.revisions.push(
|
|
27
|
+
this.revisions.push({ ...dto, originalId: dto.id });
|
|
31
28
|
return super.addOne(dto);
|
|
32
29
|
}
|
|
33
30
|
deleteOne(assetId, force = false) {
|
|
34
31
|
const asset = this.data.find((v) => v.id === assetId);
|
|
35
|
-
if (!
|
|
32
|
+
if (!asset?.deletedAt && !force) {
|
|
33
|
+
// put asset in paper bin by setting deletedAt prop
|
|
36
34
|
asset.deletedAt = new Date().toISOString();
|
|
37
35
|
return Promise.resolve(asset);
|
|
38
36
|
}
|
|
@@ -48,42 +46,34 @@ class AssetMockService extends BaseService {
|
|
|
48
46
|
const page = this.getAssets(params, false);
|
|
49
47
|
return Promise.resolve(page);
|
|
50
48
|
}
|
|
51
|
-
updateOne(assetId, dto) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
56
|
-
yield _super.deleteOne.call(this, assetId);
|
|
57
|
-
const asset = yield this.addOne(dto);
|
|
58
|
-
return Promise.resolve(asset);
|
|
59
|
-
});
|
|
49
|
+
async updateOne(assetId, dto) {
|
|
50
|
+
await super.deleteOne(assetId);
|
|
51
|
+
const asset = await this.addOne(dto);
|
|
52
|
+
return Promise.resolve(asset);
|
|
60
53
|
}
|
|
61
|
-
addAttachment(id, form) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return Promise.resolve(asset);
|
|
67
|
-
});
|
|
54
|
+
async addAttachment(id, form) {
|
|
55
|
+
const asset = this.data.find((v) => v.id === id);
|
|
56
|
+
const content = await this.api.contents.upload(form);
|
|
57
|
+
asset.attachments.push(content.id);
|
|
58
|
+
return Promise.resolve(asset);
|
|
68
59
|
}
|
|
69
|
-
getAttachments(assetId) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
return { docs, total: docs.length, limit: 0 };
|
|
74
|
-
});
|
|
60
|
+
async getAttachments(assetId) {
|
|
61
|
+
const contents = await this.api.contents.getMany();
|
|
62
|
+
const docs = contents.docs.filter((c) => c.assets?.includes?.(assetId));
|
|
63
|
+
return { docs, total: docs.length, limit: 0 };
|
|
75
64
|
}
|
|
76
65
|
getChildren(assetId, params = {}) {
|
|
77
66
|
return this.getManyFiltered({ parent: assetId }, params);
|
|
78
67
|
}
|
|
79
68
|
getEventLevelOverride(ids, causes) {
|
|
80
69
|
const eventCausesAssets = this.data.filter((v) => v.name.startsWith('hpc-event-causes-'));
|
|
81
|
-
return Promise.resolve(ids.reduce((acc, id) => {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}, {}));
|
|
70
|
+
return Promise.resolve(ids.reduce((acc, id) => ({
|
|
71
|
+
...acc,
|
|
72
|
+
[id]: eventCausesAssets.find((v) => v.name.includes(id))?.data ?? {},
|
|
73
|
+
}), {}));
|
|
85
74
|
}
|
|
86
75
|
updateEventCausesAsset(id, dto) {
|
|
76
|
+
// simplified id and data
|
|
87
77
|
const asset = this.data.find((v) => v.id === id);
|
|
88
78
|
const eventCausesAsset = this.data.find((v) => v.name === 'hpc-event-causes-' + asset.id);
|
|
89
79
|
if (eventCausesAsset) {
|
|
@@ -119,4 +109,3 @@ class AssetMockService extends BaseService {
|
|
|
119
109
|
return Promise.resolve(revisionId);
|
|
120
110
|
}
|
|
121
111
|
}
|
|
122
|
-
exports.AssetMockService = AssetMockService;
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const data_mock_service_1 = require("./data.mock.service");
|
|
9
|
-
const trash_mock_service_1 = require("./trash.mock.service");
|
|
10
|
-
let BaseService = class BaseService extends api_base_mock_1.APIBaseMock {
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { mix } from 'ts-mixer';
|
|
4
|
+
import { APIBaseMock } from './api-base.mock';
|
|
5
|
+
import { DataMockService } from './data.mock.service';
|
|
6
|
+
import { TrashMockService } from './trash.mock.service';
|
|
7
|
+
let BaseService = class BaseService extends APIBaseMock {
|
|
11
8
|
};
|
|
12
|
-
BaseService =
|
|
13
|
-
|
|
9
|
+
BaseService = __decorate([
|
|
10
|
+
mix(DataMockService, TrashMockService)
|
|
14
11
|
], BaseService);
|
|
15
|
-
class AssetTypesMockService extends BaseService {
|
|
12
|
+
export class AssetTypesMockService extends BaseService {
|
|
16
13
|
constructor(assetTypes, revisions) {
|
|
17
14
|
const defaultTyp = {
|
|
18
15
|
name: 'defaultType',
|
|
@@ -21,7 +18,7 @@ class AssetTypesMockService extends BaseService {
|
|
|
21
18
|
typeSchema: { type: 'object' },
|
|
22
19
|
uiSchema: {},
|
|
23
20
|
};
|
|
24
|
-
const types = assetTypes.map((type) => (typeof type === 'string' ?
|
|
21
|
+
const types = assetTypes.map((type) => (typeof type === 'string' ? { id: type, ...defaultTyp } : type));
|
|
25
22
|
super(types);
|
|
26
23
|
this.revisions = revisions;
|
|
27
24
|
}
|
|
@@ -30,13 +27,14 @@ class AssetTypesMockService extends BaseService {
|
|
|
30
27
|
return Promise.resolve(page);
|
|
31
28
|
}
|
|
32
29
|
addOne(dto) {
|
|
33
|
-
const id =
|
|
34
|
-
this.revisions.push(
|
|
30
|
+
const id = randomUUID();
|
|
31
|
+
this.revisions.push({ ...dto, id, originalId: dto.id });
|
|
35
32
|
return super.addOne(dto);
|
|
36
33
|
}
|
|
37
34
|
deleteOne(id, force = false) {
|
|
38
35
|
const assettype = this.data.find((v) => v.id === id);
|
|
39
|
-
if (!
|
|
36
|
+
if (!assettype?.deletedAt && !force) {
|
|
37
|
+
// put asset in paper bin by setting deletedAt prop
|
|
40
38
|
assettype.deletedAt = new Date().toISOString();
|
|
41
39
|
return Promise.resolve(assettype);
|
|
42
40
|
}
|
|
@@ -48,15 +46,10 @@ class AssetTypesMockService extends BaseService {
|
|
|
48
46
|
});
|
|
49
47
|
return super.deleteOne(id);
|
|
50
48
|
}
|
|
51
|
-
updateOne(id, dto) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
56
|
-
yield _super.deleteOne.call(this, id);
|
|
57
|
-
const assetType = yield this.addOne(dto);
|
|
58
|
-
return Promise.resolve(assetType);
|
|
59
|
-
});
|
|
49
|
+
async updateOne(id, dto) {
|
|
50
|
+
await super.deleteOne(id);
|
|
51
|
+
const assetType = await this.addOne(dto);
|
|
52
|
+
return Promise.resolve(assetType);
|
|
60
53
|
}
|
|
61
54
|
getRevisions(id) {
|
|
62
55
|
const revisions = this.revisions.filter((revision) => revision.originalId === id);
|
|
@@ -77,4 +70,3 @@ class AssetTypesMockService extends BaseService {
|
|
|
77
70
|
return Promise.resolve(revisionId);
|
|
78
71
|
}
|
|
79
72
|
}
|
|
80
|
-
exports.AssetTypesMockService = AssetTypesMockService;
|