@natlibfi/melinda-rest-api-commons 6.1.0-alpha.0 → 6.2.0-alpha.1
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/.github/workflows/melinda-node-tests-and-publish.yml +4 -2
- package/README.md +211 -14
- package/dist/amqp.d.ts +41 -0
- package/dist/amqp.d.ts.map +1 -0
- package/dist/amqp.js +251 -235
- package/dist/amqp.js.map +1 -7
- package/dist/constants.d.ts +49 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +38 -38
- package/dist/constants.js.map +1 -7
- package/dist/helpers/conversion.d.ts +8 -0
- package/dist/helpers/conversion.d.ts.map +1 -0
- package/dist/helpers/conversion.js +70 -64
- package/dist/helpers/conversion.js.map +1 -7
- package/dist/helpers/fix-constants.d.ts +76 -0
- package/dist/helpers/fix-constants.d.ts.map +1 -0
- package/dist/helpers/fix-constants.js +41 -41
- package/dist/helpers/fix-constants.js.map +1 -7
- package/dist/helpers/fix-handle-tempurns.d.ts +3 -0
- package/dist/helpers/fix-handle-tempurns.d.ts.map +1 -0
- package/dist/helpers/fix-handle-tempurns.js +73 -71
- package/dist/helpers/fix-handle-tempurns.js.map +1 -7
- package/dist/helpers/fix-strip-f884s.d.ts +10 -0
- package/dist/helpers/fix-strip-f884s.d.ts.map +1 -0
- package/dist/helpers/fix-strip-f884s.js +161 -163
- package/dist/helpers/fix-strip-f884s.js.map +1 -7
- package/dist/helpers/fix.d.ts +6 -0
- package/dist/helpers/fix.d.ts.map +1 -0
- package/dist/helpers/fix.js +133 -121
- package/dist/helpers/fix.js.map +1 -7
- package/dist/helpers/validation.d.ts +9 -0
- package/dist/helpers/validation.d.ts.map +1 -0
- package/dist/helpers/validation.js +14 -16
- package/dist/helpers/validation.js.map +1 -7
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -7
- package/dist/mongo.d.ts +165 -0
- package/dist/mongo.d.ts.map +1 -0
- package/dist/mongo.js +595 -547
- package/dist/mongo.js.map +1 -7
- package/dist/mongoError.d.ts +2 -0
- package/dist/mongoError.d.ts.map +1 -0
- package/dist/mongoError.js +19 -0
- package/dist/mongoError.js.map +1 -0
- package/dist/mongoLog.d.ts +50 -0
- package/dist/mongoLog.d.ts.map +1 -0
- package/dist/mongoLog.js +274 -242
- package/dist/mongoLog.js.map +1 -7
- package/dist/utils.d.ts +36 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +112 -110
- package/dist/utils.js.map +1 -7
- package/eslint.config.ts +66 -0
- package/package.json +17 -11
- package/{tests/amqp-error-branches.test.js → test/amqp-error-branches.test.ts} +135 -61
- package/{tests/amqp.healthtest.js → test/amqp.healthtest.ts} +19 -11
- package/{tests/amqp.tests.localtest.js → test/amqp.tests.localtest.ts} +54 -35
- package/{tests/helpers/conversion.test.js → test/helpers/conversion.test.ts} +26 -14
- package/{tests/helpers/fix-edge.test.js → test/helpers/fix-edge.test.ts} +16 -12
- package/{tests/helpers/fix.test.js → test/helpers/fix.test.ts} +14 -8
- package/{tests/helpers/validation.test.js → test/helpers/validation.test.ts} +7 -6
- package/{tests/mongo-add-blob-size.test.js → test/mongo-add-blob-size.test.ts} +14 -15
- package/{tests/mongo-check-and-check-state.test.js → test/mongo-check-and-check-state.test.ts} +6 -8
- package/{tests/mongo-check-and-set-import-job-state.test.js → test/mongo-check-and-set-import-job-state.test.ts} +6 -9
- package/{tests/mongo-check-timeout.test.js → test/mongo-check-timeout.test.ts} +6 -9
- package/{tests/mongo-create-bulk.test.js → test/mongo-create-bulk.test.ts} +6 -7
- package/{tests/mongo-create-prio.test.js → test/mongo-create-prio.test.ts} +6 -6
- package/{tests/mongo-error-branches.test.js → test/mongo-error-branches.test.ts} +166 -65
- package/{tests/mongo-get-one.test.js → test/mongo-get-one.test.ts} +6 -6
- package/{tests/mongo-get-stream.test.js → test/mongo-get-stream.test.ts} +6 -8
- package/{tests/mongo-push-ids.test.js → test/mongo-push-ids.test.ts} +6 -6
- package/{tests/mongo-push-messages.test.js → test/mongo-push-messages.test.ts} +6 -6
- package/{tests/mongo-query-by-id.test.js → test/mongo-query-by-id.test.ts} +6 -9
- package/{tests/mongo-query.test.js → test/mongo-query.test.ts} +6 -7
- package/{tests/mongo-read-content.test.js → test/mongo-read-content.test.ts} +6 -9
- package/{tests/mongo-remove.test.js → test/mongo-remove.test.ts} +6 -8
- package/{tests/mongo-set-blob-size.test.js → test/mongo-set-blob-size.test.ts} +6 -6
- package/{tests/mongo-set-import-job-state.test.js → test/mongo-set-import-job-state.test.ts} +6 -6
- package/{tests/mongo-set-operation.test.js → test/mongo-set-operation.test.ts} +6 -6
- package/{tests/mongo-set-operations.test.js → test/mongo-set-operations.test.ts} +6 -6
- package/{tests/mongo-set-state.test.js → test/mongo-set-state.test.ts} +6 -6
- package/{tests/mongoLog-protect.test.js → test/mongoLog-protect.test.ts} +18 -17
- package/{tests/mongoLog.test.js → test/mongoLog.test.ts} +8 -8
- package/{tests/testUtils.js → test/testUtils.ts} +49 -15
- package/{tests/utils.test.js → test/utils.test.ts} +5 -5
- package/tsconfig.json +62 -0
- package/tsconfig.test.json +17 -0
- package/dist/helpers/fix-utils.js +0 -39
- package/dist/helpers/fix-utils.js.map +0 -7
- package/eslint.config.js +0 -53
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare function logError(err: unknown): void;
|
|
2
|
+
export declare function assertString(value: unknown, name: string): void;
|
|
3
|
+
export declare function assertNumber(value: unknown, name: string): void;
|
|
4
|
+
export declare function assertImportJobStateFilter(value: Record<string, unknown>, name: string): void;
|
|
5
|
+
export declare function createImportJobState(operation: string, state: string, queryImportJobState?: boolean): Record<string, string>;
|
|
6
|
+
export declare function createRecordResponseItem(params: {
|
|
7
|
+
responsePayload?: any;
|
|
8
|
+
responseStatus: number | string;
|
|
9
|
+
recordMetadata?: unknown;
|
|
10
|
+
id?: string;
|
|
11
|
+
}): {
|
|
12
|
+
recordStatus: any;
|
|
13
|
+
detailedRecordStatus: any;
|
|
14
|
+
message: any;
|
|
15
|
+
ids?: undefined;
|
|
16
|
+
databaseId: string;
|
|
17
|
+
recordMetadata: any;
|
|
18
|
+
} | {
|
|
19
|
+
recordStatus: string;
|
|
20
|
+
detailedRecordStatus: any;
|
|
21
|
+
message: any;
|
|
22
|
+
ids: any;
|
|
23
|
+
databaseId: string;
|
|
24
|
+
recordMetadata: any;
|
|
25
|
+
};
|
|
26
|
+
export declare function addRecordResponseItem({ recordResponseItem, correlationId, mongoOperator }: {
|
|
27
|
+
recordResponseItem: unknown;
|
|
28
|
+
correlationId: string;
|
|
29
|
+
mongoOperator: any;
|
|
30
|
+
}): Promise<boolean>;
|
|
31
|
+
export declare function addRecordResponseItems({ recordResponseItems, correlationId, mongoOperator }: {
|
|
32
|
+
recordResponseItems: unknown;
|
|
33
|
+
correlationId: string;
|
|
34
|
+
mongoOperator: any;
|
|
35
|
+
}): Promise<boolean>;
|
|
36
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAUA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,QAapC;AAKD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAIxD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAIxD;AAMD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,QAatF;AAKD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,UAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB1H;AAKD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;;;;;;;;;;;;;;EAiBA;AAkFD,wBAAsB,qBAAqB,CAAC,EAC1C,kBAAkB,EAClB,aAAa,EACb,aAAa,EACd,EAAE;IACD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAMD,wBAAsB,sBAAsB,CAAC,EAC3C,mBAAmB,EACnB,aAAa,EACb,aAAa,EACd,EAAE;IACD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAMnB"}
|
package/dist/utils.js
CHANGED
|
@@ -1,131 +1,133 @@
|
|
|
1
|
-
import httpStatus from
|
|
2
|
-
import { createLogger, Error as ApiError } from
|
|
1
|
+
import httpStatus from 'http-status';
|
|
2
|
+
import { createLogger, Error as ApiError } from '@natlibfi/melinda-commons';
|
|
3
3
|
import { IMPORT_JOB_STATE, OPERATIONS } from "./constants.js";
|
|
4
4
|
const logger = createLogger();
|
|
5
5
|
export function logError(err) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
if (err instanceof ApiError) {
|
|
7
|
+
logger.error(JSON.stringify(err));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (err === 'SIGINT') {
|
|
11
|
+
logger.error(err);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const maybeError = err;
|
|
15
|
+
logger.error(maybeError.stack === undefined ? err : maybeError.stack);
|
|
15
16
|
}
|
|
16
17
|
export function assertString(value, name) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
if (typeof value !== 'string') {
|
|
19
|
+
throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a string`);
|
|
20
|
+
}
|
|
20
21
|
}
|
|
21
22
|
export function assertNumber(value, name) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
if (typeof value !== 'number') {
|
|
24
|
+
throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a number`);
|
|
25
|
+
}
|
|
25
26
|
}
|
|
26
27
|
export function assertImportJobStateFilter(value, name) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
29
|
+
throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be an object`);
|
|
30
|
+
}
|
|
31
|
+
const validKeys = Object.values(OPERATIONS).map(operation => `importJobState.${operation}`);
|
|
32
|
+
for (const [key, state] of Object.entries(value)) {
|
|
33
|
+
if (!validKeys.includes(key)) {
|
|
34
|
+
throw new ApiError(httpStatus.BAD_REQUEST, `${name} key ${key} must be one of ${validKeys.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
if (typeof state !== 'string') {
|
|
37
|
+
throw new ApiError(httpStatus.BAD_REQUEST, `${name}.${key} must be a string`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
39
40
|
}
|
|
40
41
|
export function createImportJobState(operation, state, queryImportJobState = false) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
if (!(state in IMPORT_JOB_STATE)) {
|
|
43
|
+
throw new Error('Invalid IMPORT_JOB_STATE');
|
|
44
|
+
}
|
|
45
|
+
if (!(operation in OPERATIONS)) {
|
|
46
|
+
throw new Error('Invalid operation');
|
|
47
|
+
}
|
|
48
|
+
if (queryImportJobState) {
|
|
49
|
+
const importJobStateWithOperation = `importJobState.${operation}`;
|
|
50
|
+
const importJobStateForQuery = { [importJobStateWithOperation]: state };
|
|
51
|
+
return importJobStateForQuery;
|
|
52
|
+
}
|
|
53
|
+
return { [operation]: state };
|
|
53
54
|
}
|
|
54
|
-
export function createRecordResponseItem(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
export function createRecordResponseItem(params) {
|
|
56
|
+
const { responsePayload, responseStatus, recordMetadata, id } = params;
|
|
57
|
+
if (responsePayload === undefined || responsePayload === null) {
|
|
58
|
+
throw new Error('responsePayload must be an object or a string!');
|
|
59
|
+
}
|
|
60
|
+
const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);
|
|
61
|
+
const recordResponseItem = {
|
|
62
|
+
databaseId: id || '000000000',
|
|
63
|
+
recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,
|
|
64
|
+
...recordResponseStatusAndMessage
|
|
65
|
+
};
|
|
66
|
+
return recordResponseItem;
|
|
65
67
|
}
|
|
66
68
|
function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
69
|
+
logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);
|
|
70
|
+
const message = getMessageFromResponsePayload(responsePayload);
|
|
71
|
+
const ids = responsePayload.ids || [];
|
|
72
|
+
logger.debug(`Response message: ${message}`);
|
|
73
|
+
if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED', 'FIXED'].includes(responseStatus)) {
|
|
74
|
+
return { recordStatus: responseStatus, detailedRecordStatus: responseStatus, message };
|
|
75
|
+
}
|
|
76
|
+
if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {
|
|
77
|
+
return { recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message };
|
|
78
|
+
}
|
|
79
|
+
if (['UNKNOWN'].includes(responseStatus)) {
|
|
80
|
+
return { recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids };
|
|
81
|
+
}
|
|
82
|
+
if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {
|
|
83
|
+
if ((/^Duplicates in database/u).test(message)) {
|
|
84
|
+
return { recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids };
|
|
85
|
+
}
|
|
86
|
+
if ((/^MatchValidation for all/u).test(message)) {
|
|
87
|
+
return { recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids };
|
|
88
|
+
}
|
|
89
|
+
if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {
|
|
90
|
+
return { recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids };
|
|
91
|
+
}
|
|
92
|
+
return { recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message };
|
|
93
|
+
}
|
|
94
|
+
if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {
|
|
95
|
+
if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {
|
|
96
|
+
return { recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids };
|
|
97
|
+
}
|
|
98
|
+
return { recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message };
|
|
99
|
+
}
|
|
100
|
+
if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {
|
|
101
|
+
return { recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message };
|
|
102
|
+
}
|
|
103
|
+
if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {
|
|
104
|
+
return { recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message };
|
|
105
|
+
}
|
|
106
|
+
logger.debug(`Unknown responseStatus: ${responseStatus}`);
|
|
107
|
+
const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;
|
|
108
|
+
return { recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage };
|
|
107
109
|
}
|
|
108
110
|
function getMessageFromResponsePayload(responsePayload) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
111
|
+
if (responsePayload.message) {
|
|
112
|
+
return responsePayload.message;
|
|
113
|
+
}
|
|
114
|
+
if (typeof responsePayload === 'string' || responsePayload instanceof String) {
|
|
115
|
+
return responsePayload;
|
|
116
|
+
}
|
|
117
|
+
return '';
|
|
116
118
|
}
|
|
117
119
|
export async function addRecordResponseItem({ recordResponseItem, correlationId, mongoOperator }) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
if (!recordResponseItem || typeof recordResponseItem !== 'object' || Array.isArray(recordResponseItem)) {
|
|
121
|
+
throw new Error('RecordResponseItem is not an object!');
|
|
122
|
+
}
|
|
123
|
+
await mongoOperator.pushMessages({ correlationId, messages: [recordResponseItem], messageField: 'records' });
|
|
124
|
+
return true;
|
|
123
125
|
}
|
|
124
126
|
export async function addRecordResponseItems({ recordResponseItems, correlationId, mongoOperator }) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
if (!Array.isArray(recordResponseItems)) {
|
|
128
|
+
throw new Error('RecordResponseItems is not an array!');
|
|
129
|
+
}
|
|
130
|
+
await mongoOperator.pushMessages({ correlationId, messages: recordResponseItems, messageField: 'records' });
|
|
131
|
+
return true;
|
|
130
132
|
}
|
|
131
|
-
//# sourceMappingURL=utils.js.map
|
|
133
|
+
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils.js"],
|
|
4
|
-
"sourcesContent": ["import httpStatus from 'http-status';\nimport {createLogger, Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants.js';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\n// Entry-point type guards: correlationIds and scalar params are expected as\n// plain strings/numbers. A non-scalar (e.g. an object) would be spliced into\n// the query as a MongoDB operator, so reject it with 400 before any query.\nexport function assertString(value, name) {\n if (typeof value !== 'string') {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a string`);\n }\n}\n\nexport function assertNumber(value, name) {\n if (typeof value !== 'number') {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a number`);\n }\n}\n\n// getOne may filter on import job state subfields (importJobState.CREATE /\n// .UPDATE / .FIX), which are spliced straight into the Mongo filter, so a\n// $-operator key or an object value would inject operators: restrict the keys\n// to the known operations and the values to plain state strings.\nexport function assertImportJobStateFilter(value, name) {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be an object`);\n }\n const validKeys = Object.values(OPERATIONS).map(operation => `importJobState.${operation}`);\n for (const [key, state] of Object.entries(value)) {\n if (!validKeys.includes(key)) {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} key ${key} must be one of ${validKeys.join(', ')}`);\n }\n if (typeof state !== 'string') {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name}.${key} must be a string`);\n }\n }\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n // symmetric with addRecordResponseItem \u2014 reject a missing payload up\n // front with a clear message instead of a raw TypeError further down.\n // Strings are a valid payload form (see getMessageFromResponsePayload),\n // so only undefined/null are rejected.\n if (responsePayload === undefined || responsePayload === null) {\n throw new Error('responsePayload must be an object or a string!');\n }\n\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED', 'FIXED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n // More detailed SKIPPED statuses\n if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {\n return {recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n // only compare ids[0] when there is at least one id\n if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n // only compare ids[0] when there is at least one id\n if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message};\n }\n\n // Otherwise\n logger.debug(`Unknown responseStatus: ${responseStatus}`);\n const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n // symmetric with addRecordResponseItems \u2014 reject non-object input\n // (including arrays) before it gets pushed into the records field\n if (!recordResponseItem || typeof recordResponseItem !== 'object' || Array.isArray(recordResponseItem)) {\n throw new Error('RecordResponseItem is not an object!');\n }\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts\nexport async function addRecordResponseItems({recordResponseItems, correlationId, mongoOperator}) {\n if (!Array.isArray(recordResponseItems)) {\n throw new Error('RecordResponseItems is not an array!');\n }\n await mongoOperator.pushMessages({correlationId, messages: recordResponseItems, messageField: 'records'});\n return true;\n}\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/eslint.config.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import {defineConfig} from 'eslint/config';
|
|
3
|
+
import tseslint from 'typescript-eslint';
|
|
4
|
+
|
|
5
|
+
// House rules (see melinda-commons-js) for src/ and test/. The
|
|
6
|
+
// typescript-eslint no-unused-vars variant is used because the base rule
|
|
7
|
+
// does not understand TS syntax (interface method params etc.).
|
|
8
|
+
const houseRules = {
|
|
9
|
+
"array-callback-return": [
|
|
10
|
+
"error",
|
|
11
|
+
{
|
|
12
|
+
"checkForEach": false
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"eqeqeq": ["error", "always"],
|
|
16
|
+
"max-depth": ["warn", 4],
|
|
17
|
+
"max-lines": ["warn", 500],
|
|
18
|
+
"max-lines-per-function": ["warn", {"max": 100}],
|
|
19
|
+
"no-console": "warn",
|
|
20
|
+
"no-const-assign": "error",
|
|
21
|
+
"no-else-return": ["error", {allowElseIf: false}],
|
|
22
|
+
"no-plusplus": [
|
|
23
|
+
"error",
|
|
24
|
+
{
|
|
25
|
+
"allowForLoopAfterthoughts": true
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"no-unused-vars": "off",
|
|
29
|
+
"@typescript-eslint/no-unused-vars": [
|
|
30
|
+
"error",
|
|
31
|
+
{
|
|
32
|
+
"argsIgnorePattern": "next"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"no-var": "error",
|
|
36
|
+
"no-warning-comments": "off"
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default defineConfig(
|
|
40
|
+
[
|
|
41
|
+
...tseslint.configs.recommended,
|
|
42
|
+
...tseslint.configs.stylistic,
|
|
43
|
+
{
|
|
44
|
+
files: [
|
|
45
|
+
"src/**/*.ts",
|
|
46
|
+
"test/**/*.ts"
|
|
47
|
+
],
|
|
48
|
+
ignores: ['node_modules/**', "**/.*", "**/dist/"],
|
|
49
|
+
linterOptions: {
|
|
50
|
+
reportUnusedInlineConfigs: "error",
|
|
51
|
+
reportUnusedDisableDirectives: true
|
|
52
|
+
},
|
|
53
|
+
rules: houseRules
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
// Fixture-driven test scaffolding: any-typed fixture values and no-op
|
|
57
|
+
// stubs are intentional in tests (tsc -p tsconfig.test.json still
|
|
58
|
+
// typechecks the directory).
|
|
59
|
+
files: ["test/**/*.ts"],
|
|
60
|
+
rules: {
|
|
61
|
+
"@typescript-eslint/no-explicit-any": "off",
|
|
62
|
+
"@typescript-eslint/no-empty-function": "off"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
);
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"url": "https://github.com/NatLibFi/melinda-rest-api-commons"
|
|
14
14
|
},
|
|
15
15
|
"license": "MIT",
|
|
16
|
-
"version": "6.
|
|
16
|
+
"version": "6.2.0-alpha.1",
|
|
17
17
|
"main": "./dist/index.js",
|
|
18
18
|
"type": "module",
|
|
19
19
|
"engines": {
|
|
@@ -24,14 +24,15 @@
|
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
26
|
"prepare": "npm run build",
|
|
27
|
-
"build": "
|
|
28
|
-
"lint": "eslint ./src",
|
|
29
|
-
"lint:dev": "eslint --fix ./src",
|
|
30
|
-
"
|
|
31
|
-
"test
|
|
32
|
-
"test:
|
|
33
|
-
"test:
|
|
34
|
-
"
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"lint": "eslint ./src ./test",
|
|
29
|
+
"lint:dev": "eslint --fix ./src ./test",
|
|
30
|
+
"typecheck": "tsc -p tsconfig.test.json",
|
|
31
|
+
"test": "npm run lint && npm run typecheck && npm run test:base",
|
|
32
|
+
"test:base": "node --test --test-force-exit --experimental-test-coverage --test-coverage-lines=88 --test-coverage-branches=88 --test-coverage-functions=90 --test-coverage-include=src/** --test-reporter=spec 'test/**/*.test.ts'",
|
|
33
|
+
"test:local": "cross-env NODE_ENV=test node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './test/amqp.*.localtest.ts'",
|
|
34
|
+
"test:healthcheck": "cross-env NODE_ENV=test node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './test/amqp.healthtest.ts'",
|
|
35
|
+
"watch:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test node --watch --test --experimental-test-coverage --test-reporter=spec './test/**/*.test.ts'",
|
|
35
36
|
"dev": "npm run watch:test",
|
|
36
37
|
"dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test npm run watch:test"
|
|
37
38
|
},
|
|
@@ -50,8 +51,13 @@
|
|
|
50
51
|
"@natlibfi/fixugen": "^4.0.0",
|
|
51
52
|
"@natlibfi/fixura": "^5.0.0",
|
|
52
53
|
"@natlibfi/fixura-mongo": "^4.0.2",
|
|
54
|
+
"@types/debug": "^4.1.13",
|
|
55
|
+
"@types/http-status": "^0.2.30",
|
|
56
|
+
"@types/node": "^25.9.9",
|
|
53
57
|
"cross-env": "^10.1.0",
|
|
54
|
-
"
|
|
55
|
-
"
|
|
58
|
+
"eslint": "^10.12.0",
|
|
59
|
+
"jiti": "^2.7.0",
|
|
60
|
+
"typescript": "^6.0.3",
|
|
61
|
+
"typescript-eslint": "^8.72.0"
|
|
56
62
|
}
|
|
57
63
|
}
|