@natlibfi/melinda-rest-api-commons 2.3.1-alpha.6 → 2.3.2-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/dist/constants.js CHANGED
@@ -11,7 +11,7 @@ exports.QUEUE_ITEM_STATE = exports.OPERATIONS = exports.LOG_ITEM_TYPE = exports.
11
11
  *
12
12
  * Shared modules for microservices of Melinda rest api batch import system
13
13
  *
14
- * Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)
14
+ * Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)
15
15
  *
16
16
  * This file is part of melinda-rest-api-commons
17
17
  *
@@ -68,7 +68,9 @@ const OPERATIONS = {
68
68
  UPDATE: 'UPDATE'
69
69
  };
70
70
  exports.OPERATIONS = OPERATIONS;
71
- const CHUNK_SIZE = 100;
71
+ const CHUNK_SIZE = 100; // We could configure here whether a logItemType is for a several records of a single record
72
+ // ie. whether is has bulkSequence or bulkSequenceStart & bulkSequenceEnd
73
+
72
74
  exports.CHUNK_SIZE = CHUNK_SIZE;
73
75
  const LOG_ITEM_TYPE = {
74
76
  MERGE_LOG: 'MERGE_LOG',
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["QUEUE_ITEM_STATE","VALIDATOR","PENDING_QUEUING","PENDING_VALIDATION","QUEUING_IN_PROGRESS","UPLOADING","VALIDATING","WAITING_FOR_RECORDS","IMPORTER","IMPORTING","IN_PROCESS","IN_QUEUE","DONE","ERROR","ABORT","IMPORT_JOB_STATE","EMPTY","QUEUING","PROCESSING","OPERATIONS","CREATE","UPDATE","CHUNK_SIZE","LOG_ITEM_TYPE","MERGE_LOG","MATCH_LOG","SPLITTER_LOG","CONVERSION_FORMATS","MARCXML","ISO2709","JSON","ALEPHSEQ"],"sources":["../src/constants.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n// QueueItemState flows: see README.md\n\nexport const QUEUE_ITEM_STATE = {\n VALIDATOR: {\n PENDING_QUEUING: 'PENDING_QUEUING',\n PENDING_VALIDATION: 'PENDING_VALIDATION',\n QUEUING_IN_PROGRESS: 'QUEUING_IN_PROGRESS',\n UPLOADING: 'UPLOADING',\n VALIDATING: 'VALIDATING',\n WAITING_FOR_RECORDS: 'WAITING_FOR_RECORDS'\n },\n IMPORTER: {\n IMPORTING: 'IMPORTING',\n IN_PROCESS: 'IN_PROCESS',\n IN_QUEUE: 'IN_QUEUE'\n },\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const IMPORT_JOB_STATE = {\n EMPTY: 'EMPTY',\n QUEUING: 'QUEUING',\n IN_QUEUE: 'IN_QUEUE',\n IMPORTING: 'IMPORTING',\n PROCESSING: 'PROCESSING',\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const OPERATIONS = {\n CREATE: 'CREATE',\n UPDATE: 'UPDATE'\n};\n\nexport const CHUNK_SIZE = 100;\n\nexport const LOG_ITEM_TYPE = {\n MERGE_LOG: 'MERGE_LOG',\n MATCH_LOG: 'MATCH_LOG',\n SPLITTER_LOG: 'SPLITTER_LOG'\n};\n\nexport const CONVERSION_FORMATS = {\n MARCXML: 'MARCXML',\n ISO2709: 'ISO2709',\n JSON: 'JSON',\n ALEPHSEQ: 'ALEPHSEQ'\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEO,MAAMA,gBAAgB,GAAG;EAC9BC,SAAS,EAAE;IACTC,eAAe,EAAE,iBADR;IAETC,kBAAkB,EAAE,oBAFX;IAGTC,mBAAmB,EAAE,qBAHZ;IAITC,SAAS,EAAE,WAJF;IAKTC,UAAU,EAAE,YALH;IAMTC,mBAAmB,EAAE;EANZ,CADmB;EAS9BC,QAAQ,EAAE;IACRC,SAAS,EAAE,WADH;IAERC,UAAU,EAAE,YAFJ;IAGRC,QAAQ,EAAE;EAHF,CAToB;EAc9BC,IAAI,EAAE,MAdwB;EAe9BC,KAAK,EAAE,OAfuB;EAgB9BC,KAAK,EAAE;AAhBuB,CAAzB;;AAmBA,MAAMC,gBAAgB,GAAG;EAC9BC,KAAK,EAAE,OADuB;EAE9BC,OAAO,EAAE,SAFqB;EAG9BN,QAAQ,EAAE,UAHoB;EAI9BF,SAAS,EAAE,WAJmB;EAK9BS,UAAU,EAAE,YALkB;EAM9BN,IAAI,EAAE,MANwB;EAO9BC,KAAK,EAAE,OAPuB;EAQ9BC,KAAK,EAAE;AARuB,CAAzB;;AAWA,MAAMK,UAAU,GAAG;EACxBC,MAAM,EAAE,QADgB;EAExBC,MAAM,EAAE;AAFgB,CAAnB;;AAKA,MAAMC,UAAU,GAAG,GAAnB;;AAEA,MAAMC,aAAa,GAAG;EAC3BC,SAAS,EAAE,WADgB;EAE3BC,SAAS,EAAE,WAFgB;EAG3BC,YAAY,EAAE;AAHa,CAAtB;;AAMA,MAAMC,kBAAkB,GAAG;EAChCC,OAAO,EAAE,SADuB;EAEhCC,OAAO,EAAE,SAFuB;EAGhCC,IAAI,EAAE,MAH0B;EAIhCC,QAAQ,EAAE;AAJsB,CAA3B"}
1
+ {"version":3,"file":"constants.js","names":["QUEUE_ITEM_STATE","VALIDATOR","PENDING_QUEUING","PENDING_VALIDATION","QUEUING_IN_PROGRESS","UPLOADING","VALIDATING","WAITING_FOR_RECORDS","IMPORTER","IMPORTING","IN_PROCESS","IN_QUEUE","DONE","ERROR","ABORT","IMPORT_JOB_STATE","EMPTY","QUEUING","PROCESSING","OPERATIONS","CREATE","UPDATE","CHUNK_SIZE","LOG_ITEM_TYPE","MERGE_LOG","MATCH_LOG","SPLITTER_LOG","CONVERSION_FORMATS","MARCXML","ISO2709","JSON","ALEPHSEQ"],"sources":["../src/constants.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n// QueueItemState flows: see README.md\n\nexport const QUEUE_ITEM_STATE = {\n VALIDATOR: {\n PENDING_QUEUING: 'PENDING_QUEUING',\n PENDING_VALIDATION: 'PENDING_VALIDATION',\n QUEUING_IN_PROGRESS: 'QUEUING_IN_PROGRESS',\n UPLOADING: 'UPLOADING',\n VALIDATING: 'VALIDATING',\n WAITING_FOR_RECORDS: 'WAITING_FOR_RECORDS'\n },\n IMPORTER: {\n IMPORTING: 'IMPORTING',\n IN_PROCESS: 'IN_PROCESS',\n IN_QUEUE: 'IN_QUEUE'\n },\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const IMPORT_JOB_STATE = {\n EMPTY: 'EMPTY',\n QUEUING: 'QUEUING',\n IN_QUEUE: 'IN_QUEUE',\n IMPORTING: 'IMPORTING',\n PROCESSING: 'PROCESSING',\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const OPERATIONS = {\n CREATE: 'CREATE',\n UPDATE: 'UPDATE'\n};\n\nexport const CHUNK_SIZE = 100;\n\n// We could configure here whether a logItemType is for a several records of a single record\n// ie. whether is has bulkSequence or bulkSequenceStart & bulkSequenceEnd\nexport const LOG_ITEM_TYPE = {\n MERGE_LOG: 'MERGE_LOG',\n MATCH_LOG: 'MATCH_LOG',\n SPLITTER_LOG: 'SPLITTER_LOG'\n};\n\nexport const CONVERSION_FORMATS = {\n MARCXML: 'MARCXML',\n ISO2709: 'ISO2709',\n JSON: 'JSON',\n ALEPHSEQ: 'ALEPHSEQ'\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEO,MAAMA,gBAAgB,GAAG;EAC9BC,SAAS,EAAE;IACTC,eAAe,EAAE,iBADR;IAETC,kBAAkB,EAAE,oBAFX;IAGTC,mBAAmB,EAAE,qBAHZ;IAITC,SAAS,EAAE,WAJF;IAKTC,UAAU,EAAE,YALH;IAMTC,mBAAmB,EAAE;EANZ,CADmB;EAS9BC,QAAQ,EAAE;IACRC,SAAS,EAAE,WADH;IAERC,UAAU,EAAE,YAFJ;IAGRC,QAAQ,EAAE;EAHF,CAToB;EAc9BC,IAAI,EAAE,MAdwB;EAe9BC,KAAK,EAAE,OAfuB;EAgB9BC,KAAK,EAAE;AAhBuB,CAAzB;;AAmBA,MAAMC,gBAAgB,GAAG;EAC9BC,KAAK,EAAE,OADuB;EAE9BC,OAAO,EAAE,SAFqB;EAG9BN,QAAQ,EAAE,UAHoB;EAI9BF,SAAS,EAAE,WAJmB;EAK9BS,UAAU,EAAE,YALkB;EAM9BN,IAAI,EAAE,MANwB;EAO9BC,KAAK,EAAE,OAPuB;EAQ9BC,KAAK,EAAE;AARuB,CAAzB;;AAWA,MAAMK,UAAU,GAAG;EACxBC,MAAM,EAAE,QADgB;EAExBC,MAAM,EAAE;AAFgB,CAAnB;;AAKA,MAAMC,UAAU,GAAG,GAAnB,C,CAEP;AACA;;;AACO,MAAMC,aAAa,GAAG;EAC3BC,SAAS,EAAE,WADgB;EAE3BC,SAAS,EAAE,WAFgB;EAG3BC,YAAY,EAAE;AAHa,CAAtB;;AAMA,MAAMC,kBAAkB,GAAG;EAChCC,OAAO,EAAE,SADuB;EAEhCC,OAAO,EAAE,SAFuB;EAGhCC,IAAI,EAAE,MAH0B;EAIhCC,QAAQ,EAAE;AAJsB,CAA3B"}
@@ -3,13 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.BIB_FORMAT_SETTINGS = void 0;
6
+ exports.REPLACE_PREFIXES = exports.BIB_PREVALIDATION_FIX_SETTINGS = exports.BIB_POSTVALIDATION_FIX_SETTINGS = exports.BIB_HANDLE_TEMP_URNS_SETTINGS = exports.BIB_FORMAT_SETTINGS = exports.BIB_F035_TO_SID = void 0;
7
7
  exports.formatRecord = formatRecord;
8
8
 
9
9
  var _marcRecord = require("@natlibfi/marc-record");
10
10
 
11
11
  var _melindaBackendCommons = require("@natlibfi/melinda-backend-commons");
12
12
 
13
+ var _debug = _interopRequireDefault(require("debug"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+
13
17
  /**
14
18
  *
15
19
  * @licstart The following is the entire license notice for the JavaScript code in this file.
@@ -37,18 +41,25 @@ var _melindaBackendCommons = require("@natlibfi/melinda-backend-commons");
37
41
  * for the JavaScript code in this file.
38
42
  *
39
43
  */
40
- function formatRecord(record, settings = []) {
44
+ function formatRecord(record, settings = {}) {
41
45
  const logger = (0, _melindaBackendCommons.createLogger)();
42
- logger.verbose('Applying formating');
46
+ const debug = (0, _debug.default)('@natlibfi/melinda-rest-api-commons:format');
47
+ const debugData = debug.extend('data');
48
+ logger.verbose(`We will apply formatting to the record according to settings: ${JSON.stringify(settings)}`);
43
49
 
44
50
  const newRecord = _marcRecord.MarcRecord.clone(record, {
45
51
  subfieldValues: false
46
52
  });
47
53
 
48
- generateMissingSIDs();
49
- settings.forEach(options => {
54
+ debugData(`settings: ${JSON.stringify(settings)}`);
55
+ const generateMissingSIDsOptions = settings.generateMissingSIDs || undefined;
56
+ generateMissingSIDs(generateMissingSIDsOptions);
57
+ const replacePrefixesOptions = settings.replacePrefixes || [];
58
+ debugData(`replacePrefixesOptions: ${JSON.stringify(replacePrefixesOptions)}`);
59
+ replacePrefixesOptions.forEach(options => {
50
60
  replacePrefixes(options);
51
61
  });
62
+ handleTempUrns(settings.handleTempUrns);
52
63
  return newRecord.toObject(); // Replace prefix in all specified subfields
53
64
 
54
65
  function replacePrefixes(options) {
@@ -57,6 +68,7 @@ function formatRecord(record, settings = []) {
57
68
  newPrefix,
58
69
  prefixReplaceCodes
59
70
  } = options;
71
+ debug(`Replacing ${oldPrefix} with ${newPrefix} in subfields ${prefixReplaceCodes}`);
60
72
  const pattern = `(${oldPrefix})`;
61
73
  const replacement = `(${newPrefix})`;
62
74
  newRecord.getDatafields().forEach(field => {
@@ -68,9 +80,16 @@ function formatRecord(record, settings = []) {
68
80
  });
69
81
  }
70
82
 
71
- function generateMissingSIDs() {
72
- const f035Filters = [/^\(FI-BTJ\)/u, /^\(FI-TATI\)/u];
73
- const fSIDFilters = ['FI-BTJ', 'tati'];
83
+ function generateMissingSIDs(options) {
84
+ debugData(`generateMissingSIDs options: ${JSON.stringify(options)}`);
85
+ const f035Filters = options && options.f035Filters ? options.f035Filters : [];
86
+ const fSIDFilters = options && options.fSIDFilters ? options.fSIDFilters : [];
87
+
88
+ if (f035Filters.length !== fSIDFilters.length || f035Filters.length < 1 || fSIDFilters.length < 1) {
89
+ debug(`No sane options for generating missing SIDs`);
90
+ return;
91
+ }
92
+
74
93
  const f035s = f035ToSidInfo(newRecord.get(/^035$/u));
75
94
  const fSIDs = sidsToSidInfo(newRecord.get(/^SID$/u));
76
95
  const sidsToBeAdded = genNewSids(fSIDs.length === 0 ? f035s // test that SIDs are not there yet
@@ -127,11 +146,123 @@ function formatRecord(record, settings = []) {
127
146
  return undefined;
128
147
  }).filter(value => value !== undefined);
129
148
  }
149
+ } // eslint-disable-next-line max-statements
150
+
151
+
152
+ function handleTempUrns(options) {
153
+ debugData(JSON.stringify(options));
154
+
155
+ if (options !== true) {
156
+ return;
157
+ } // If we have an non-temp URN, we can delete tempURNs, otherwise we should delete the temp subfield from URN
158
+
159
+
160
+ const hasURN = f => f.tag === '856' && f.subfields.some(({
161
+ code,
162
+ value
163
+ }) => code === 'u' && /urn.fi/u.test(value));
164
+
165
+ const hasTempSubfield = f => f.subfields.some(({
166
+ code,
167
+ value
168
+ }) => code === '9' && /^MELINDA<TEMP>$/u.test(value));
169
+
170
+ const hasNoTempSubfield = f => !f.subfields.some(({
171
+ code,
172
+ value
173
+ }) => code === '9' && /^MELINDA<TEMP>$/u.test(value));
174
+
175
+ const f856sUrn = newRecord.fields.filter(hasURN);
176
+ const f856sUrnsWithTempSubfields = f856sUrn.filter(hasTempSubfield);
177
+ const f856sUrnsWithNoTempSubfields = f856sUrn.filter(hasNoTempSubfield);
178
+ debugData(`URN f856s: ${JSON.stringify(f856sUrn)}`);
179
+ debugData(`URN f856s with temp subfield: ${JSON.stringify(f856sUrnsWithTempSubfields)}`); // None of the URNs has temp subfields, we don't need to do anything
180
+
181
+ if (f856sUrnsWithTempSubfields.length < 1) {
182
+ debug(`No Urns with temp subfield`);
183
+ return;
184
+ } // Do we have an existing URN with legal deposit subfields, if we have, we can remove the temp URN field(s)
185
+
186
+
187
+ const existingLegalDepositURN = validateLD(f856sUrnsWithNoTempSubfields);
188
+ debug(`existingLegalDepositURN: ${existingLegalDepositURN}`);
189
+
190
+ if (existingLegalDepositURN) {
191
+ debug(`We have an existing LD URN, we can delete temp fields (${f856sUrnsWithTempSubfields.length})`);
192
+ newRecord.removeFields(f856sUrnsWithTempSubfields);
193
+ return;
194
+ } // We do not have an existing legalDepositURN, we should use the tempURN and remove the temp subfields from it
195
+
196
+
197
+ if (!existingLegalDepositURN && f856sUrnsWithTempSubfields.length > 0) {
198
+ //debug(`All Urns (${f856sUrn.length}) have a temp subfield`);
199
+ debugData(`Original temp URNs: (${JSON.stringify(f856sUrnsWithTempSubfields)})`);
200
+ const fixedFields = f856sUrnsWithTempSubfields.map(removeTempSubfield);
201
+ debug(`We removed temp subfields: (${JSON.stringify(fixedFields)})`);
202
+ newRecord.removeFields(f856sUrnsWithTempSubfields);
203
+ newRecord.insertFields(fixedFields);
204
+ return;
205
+ } // Should we check that the non-temp URN has 2nd ind '0' - meaning that the URN handles the actual resource itself?
206
+
207
+ } // ---- LD-functions below are same as in https://github.com/NatLibFi/marc-record-validators-melinda/blob/feature-updates-to-urn/src/urn.js
208
+ // we propably should develop the urn/legaldeposit -validator to use also here
209
+
210
+
211
+ function createLDSubfields() {
212
+ return [{
213
+ code: 'z',
214
+ value: 'Käytettävissä vapaakappalekirjastoissa'
215
+ }, {
216
+ code: '5',
217
+ value: 'FI-Vapaa'
218
+ }];
219
+ }
220
+
221
+ function validateLD(f856sUrn) {
222
+ debug(`Validating the existence of legal deposit subfields`);
223
+ const ldSubfields = createLDSubfields();
224
+ const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));
225
+
226
+ if (f856sUrnWithLdSubfields.length > 0) {
227
+ debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);
228
+ debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);
229
+ return true;
230
+ }
231
+
232
+ return false;
233
+ }
234
+
235
+ function fieldHasLDSubfields(field, ldSubfields) {
236
+ if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {
237
+ return true;
238
+ }
239
+ } // ---
240
+
241
+
242
+ function removeTempSubfield(field) {
243
+ // Sanity check for control fields
244
+ if (field.subfields === undefined) {
245
+ return field;
246
+ } // we probably should check that we don't return field that has no subfields left
247
+
248
+
249
+ return {
250
+ tag: field.tag,
251
+ ind1: field.ind1,
252
+ ind2: field.ind2,
253
+ subfields: field.subfields.filter(sf => sf.code !== '9' && !/^MELINDA<TEMP>$/u.test(sf.value))
254
+ };
130
255
  }
131
- } // If placed in config.js testing needs envs
256
+ } // This could be formatted so that 035-prefix and SID contents would be better connected than by just an array index
257
+
132
258
 
259
+ const BIB_F035_TO_SID = {
260
+ f035Filters: [/^\(FI-BTJ\)/u, /^\(FI-TATI\)/u],
261
+ fSIDFilters: ['FI-BTJ', 'tati']
262
+ }; // There is somewhere other implementations of this same standardPrefixes to alephInternalPrefixes normalization
133
263
 
134
- const BIB_FORMAT_SETTINGS = [{
264
+ exports.BIB_F035_TO_SID = BIB_F035_TO_SID;
265
+ const REPLACE_PREFIXES = [{
135
266
  oldPrefix: 'FI-MELINDA',
136
267
  newPrefix: 'FIN01',
137
268
  prefixReplaceCodes: ['w']
@@ -143,6 +274,32 @@ const BIB_FORMAT_SETTINGS = [{
143
274
  oldPrefix: 'FI-ASTERI-N',
144
275
  newPrefix: 'FIN11',
145
276
  prefixReplaceCodes: ['0']
146
- }];
277
+ }, {
278
+ oldPrefix: 'FI-ASTERI-A',
279
+ newPrefix: 'FIN12',
280
+ prefixReplaceCodes: ['0']
281
+ }, {
282
+ oldPrefix: 'FI-ASTERI-W',
283
+ newPrefix: 'FIN13',
284
+ prefixReplaceCodes: ['0']
285
+ }]; // If placed in config.js testing needs envs
286
+
287
+ exports.REPLACE_PREFIXES = REPLACE_PREFIXES;
288
+ const BIB_FORMAT_SETTINGS = {
289
+ replacePrefixes: REPLACE_PREFIXES,
290
+ generateMissingSIDs: BIB_F035_TO_SID
291
+ };
147
292
  exports.BIB_FORMAT_SETTINGS = BIB_FORMAT_SETTINGS;
293
+ const BIB_PREVALIDATION_FIX_SETTINGS = {
294
+ generateMissingSIDs: BIB_F035_TO_SID
295
+ };
296
+ exports.BIB_PREVALIDATION_FIX_SETTINGS = BIB_PREVALIDATION_FIX_SETTINGS;
297
+ const BIB_POSTVALIDATION_FIX_SETTINGS = {
298
+ replacePrefixes: REPLACE_PREFIXES
299
+ };
300
+ exports.BIB_POSTVALIDATION_FIX_SETTINGS = BIB_POSTVALIDATION_FIX_SETTINGS;
301
+ const BIB_HANDLE_TEMP_URNS_SETTINGS = {
302
+ handleTempUrns: true
303
+ };
304
+ exports.BIB_HANDLE_TEMP_URNS_SETTINGS = BIB_HANDLE_TEMP_URNS_SETTINGS;
148
305
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","names":["formatRecord","record","settings","logger","createLogger","verbose","newRecord","MarcRecord","clone","subfieldValues","generateMissingSIDs","forEach","options","replacePrefixes","toObject","oldPrefix","newPrefix","prefixReplaceCodes","pattern","replacement","getDatafields","field","subfields","filter","code","includes","subfield","value","replace","f035Filters","fSIDFilters","f035s","f035ToSidInfo","get","fSIDs","sidsToSidInfo","sidsToBeAdded","genNewSids","length","f035SidInfo","some","fSIDInfo","SID","sidField","insertField","map","sidInfo","tag","ind1","ind2","SIDs","flatMap","sub","undefined","wantedSub","regexp","test","findIndex","slice","indexOf","BIB_FORMAT_SETTINGS"],"sources":["../../src/helpers/format.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\n\nexport function formatRecord(record, settings = []) {\n const logger = createLogger();\n\n logger.verbose('Applying formating');\n const newRecord = MarcRecord.clone(record, {subfieldValues: false});\n\n generateMissingSIDs();\n\n settings.forEach(options => {\n replacePrefixes(options);\n });\n\n return newRecord.toObject();\n\n // Replace prefix in all specified subfields\n function replacePrefixes(options) {\n const {oldPrefix, newPrefix, prefixReplaceCodes} = options;\n const pattern = `(${oldPrefix})`;\n const replacement = `(${newPrefix})`;\n newRecord.getDatafields()\n .forEach(field => {\n field.subfields\n .filter(({code}) => prefixReplaceCodes.includes(code))\n .forEach(subfield => {\n subfield.value = subfield.value.replace(pattern, replacement); // eslint-disable-line functional/immutable-data\n });\n });\n }\n\n\n function generateMissingSIDs() {\n const f035Filters = [/^\\(FI-BTJ\\)/u, /^\\(FI-TATI\\)/u];\n const fSIDFilters = ['FI-BTJ', 'tati'];\n const f035s = f035ToSidInfo(newRecord.get(/^035$/u));\n const fSIDs = sidsToSidInfo(newRecord.get(/^SID$/u));\n\n const sidsToBeAdded = genNewSids(fSIDs.length === 0\n ? f035s\n // test that SIDs are not there yet\n : f035s.filter(f035SidInfo => fSIDs.some(fSIDInfo => f035SidInfo.SID !== fSIDInfo.SID && f035SidInfo.value !== fSIDInfo.value)));\n\n // Add new SIDs\n return sidsToBeAdded.forEach(sidField => newRecord.insertField(sidField));\n\n function genNewSids(sidsToBeAdded) {\n return sidsToBeAdded.map(sidInfo => ({tag: 'SID', ind1: ' ', ind2: ' ', subfields: [{code: 'c', value: sidInfo.value}, {code: 'b', value: sidInfo.SID}]}));\n }\n\n function sidsToSidInfo(SIDs) {\n return SIDs.flatMap(({subfields}) => {\n const [SID] = subfields.filter(sub => sub.code === 'b' && fSIDFilters.includes(sub.value)).map(sub => sub.value);\n const [value] = subfields.filter(sub => sub.code === 'c' && sub.value !== undefined).map(sub => sub.value);\n\n if (SID && value) {\n return {\n SID,\n value\n };\n }\n\n return undefined;\n }).filter(value => value !== undefined);\n }\n\n function f035ToSidInfo(f035s) {\n return f035s.flatMap(({subfields}) => {\n const [wantedSub] = subfields.filter(sub => sub.code === 'a' && f035Filters.some(regexp => regexp.test(sub.value)));\n\n if (wantedSub) {\n return {\n SID: fSIDFilters[f035Filters.findIndex(regexp => regexp.test(wantedSub.value))],\n value: wantedSub.value.slice(wantedSub.value.indexOf(')') + 1)\n };\n }\n\n return undefined;\n }).filter(value => value !== undefined);\n }\n }\n}\n\n// If placed in config.js testing needs envs\nexport const BIB_FORMAT_SETTINGS = [\n {\n oldPrefix: 'FI-MELINDA',\n newPrefix: 'FIN01',\n prefixReplaceCodes: ['w']\n },\n {\n oldPrefix: 'FI-ASTERI-S',\n newPrefix: 'FIN10',\n prefixReplaceCodes: ['0']\n },\n {\n oldPrefix: 'FI-ASTERI-N',\n newPrefix: 'FIN11',\n prefixReplaceCodes: ['0']\n }\n];\n"],"mappings":"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"}
1
+ {"version":3,"file":"format.js","names":["formatRecord","record","settings","logger","createLogger","debug","createDebugLogger","debugData","extend","verbose","JSON","stringify","newRecord","MarcRecord","clone","subfieldValues","generateMissingSIDsOptions","generateMissingSIDs","undefined","replacePrefixesOptions","replacePrefixes","forEach","options","handleTempUrns","toObject","oldPrefix","newPrefix","prefixReplaceCodes","pattern","replacement","getDatafields","field","subfields","filter","code","includes","subfield","value","replace","f035Filters","fSIDFilters","length","f035s","f035ToSidInfo","get","fSIDs","sidsToSidInfo","sidsToBeAdded","genNewSids","f035SidInfo","some","fSIDInfo","SID","sidField","insertField","map","sidInfo","tag","ind1","ind2","SIDs","flatMap","sub","wantedSub","regexp","test","findIndex","slice","indexOf","hasURN","f","hasTempSubfield","hasNoTempSubfield","f856sUrn","fields","f856sUrnsWithTempSubfields","f856sUrnsWithNoTempSubfields","existingLegalDepositURN","validateLD","removeFields","fixedFields","removeTempSubfield","insertFields","createLDSubfields","ldSubfields","f856sUrnWithLdSubfields","fieldHasLDSubfields","every","ldsf","sf","BIB_F035_TO_SID","REPLACE_PREFIXES","BIB_FORMAT_SETTINGS","BIB_PREVALIDATION_FIX_SETTINGS","BIB_POSTVALIDATION_FIX_SETTINGS","BIB_HANDLE_TEMP_URNS_SETTINGS"],"sources":["../../src/helpers/format.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport createDebugLogger from 'debug';\n\nexport function formatRecord(record, settings = {}) {\n const logger = createLogger();\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:format');\n const debugData = debug.extend('data');\n\n logger.verbose(`We will apply formatting to the record according to settings: ${JSON.stringify(settings)}`);\n const newRecord = MarcRecord.clone(record, {subfieldValues: false});\n debugData(`settings: ${JSON.stringify(settings)}`);\n\n const generateMissingSIDsOptions = settings.generateMissingSIDs || undefined;\n generateMissingSIDs(generateMissingSIDsOptions);\n\n const replacePrefixesOptions = settings.replacePrefixes || [];\n debugData(`replacePrefixesOptions: ${JSON.stringify(replacePrefixesOptions)}`);\n\n replacePrefixesOptions.forEach(options => {\n replacePrefixes(options);\n });\n\n handleTempUrns(settings.handleTempUrns);\n\n return newRecord.toObject();\n\n // Replace prefix in all specified subfields\n function replacePrefixes(options) {\n const {oldPrefix, newPrefix, prefixReplaceCodes} = options;\n debug(`Replacing ${oldPrefix} with ${newPrefix} in subfields ${prefixReplaceCodes}`);\n const pattern = `(${oldPrefix})`;\n const replacement = `(${newPrefix})`;\n newRecord.getDatafields()\n .forEach(field => {\n field.subfields\n .filter(({code}) => prefixReplaceCodes.includes(code))\n .forEach(subfield => {\n subfield.value = subfield.value.replace(pattern, replacement); // eslint-disable-line functional/immutable-data\n });\n });\n }\n\n\n function generateMissingSIDs(options) {\n debugData(`generateMissingSIDs options: ${JSON.stringify(options)}`);\n\n const f035Filters = options && options.f035Filters ? options.f035Filters : [];\n const fSIDFilters = options && options.fSIDFilters ? options.fSIDFilters : [];\n\n if (f035Filters.length !== fSIDFilters.length || f035Filters.length < 1 || fSIDFilters.length < 1) {\n debug(`No sane options for generating missing SIDs`);\n return;\n }\n\n const f035s = f035ToSidInfo(newRecord.get(/^035$/u));\n const fSIDs = sidsToSidInfo(newRecord.get(/^SID$/u));\n\n const sidsToBeAdded = genNewSids(fSIDs.length === 0\n ? f035s\n // test that SIDs are not there yet\n : f035s.filter(f035SidInfo => fSIDs.some(fSIDInfo => f035SidInfo.SID !== fSIDInfo.SID && f035SidInfo.value !== fSIDInfo.value)));\n\n // Add new SIDs\n return sidsToBeAdded.forEach(sidField => newRecord.insertField(sidField));\n\n function genNewSids(sidsToBeAdded) {\n return sidsToBeAdded.map(sidInfo => ({tag: 'SID', ind1: ' ', ind2: ' ', subfields: [{code: 'c', value: sidInfo.value}, {code: 'b', value: sidInfo.SID}]}));\n }\n\n function sidsToSidInfo(SIDs) {\n return SIDs.flatMap(({subfields}) => {\n const [SID] = subfields.filter(sub => sub.code === 'b' && fSIDFilters.includes(sub.value)).map(sub => sub.value);\n const [value] = subfields.filter(sub => sub.code === 'c' && sub.value !== undefined).map(sub => sub.value);\n\n if (SID && value) {\n return {\n SID,\n value\n };\n }\n\n return undefined;\n }).filter(value => value !== undefined);\n }\n\n function f035ToSidInfo(f035s) {\n return f035s.flatMap(({subfields}) => {\n const [wantedSub] = subfields.filter(sub => sub.code === 'a' && f035Filters.some(regexp => regexp.test(sub.value)));\n\n if (wantedSub) {\n return {\n SID: fSIDFilters[f035Filters.findIndex(regexp => regexp.test(wantedSub.value))],\n value: wantedSub.value.slice(wantedSub.value.indexOf(')') + 1)\n };\n }\n\n return undefined;\n }).filter(value => value !== undefined);\n }\n }\n\n\n // eslint-disable-next-line max-statements\n function handleTempUrns(options) {\n debugData(JSON.stringify(options));\n\n if (options !== true) {\n return;\n }\n\n // If we have an non-temp URN, we can delete tempURNs, otherwise we should delete the temp subfield from URN\n\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n const hasTempSubfield = f => f.subfields.some(({code, value}) => code === '9' && (/^MELINDA<TEMP>$/u).test(value));\n const hasNoTempSubfield = f => !f.subfields.some(({code, value}) => code === '9' && (/^MELINDA<TEMP>$/u).test(value));\n\n const f856sUrn = newRecord.fields.filter(hasURN);\n const f856sUrnsWithTempSubfields = f856sUrn.filter(hasTempSubfield);\n const f856sUrnsWithNoTempSubfields = f856sUrn.filter(hasNoTempSubfield);\n\n debugData(`URN f856s: ${JSON.stringify(f856sUrn)}`);\n debugData(`URN f856s with temp subfield: ${JSON.stringify(f856sUrnsWithTempSubfields)}`);\n\n // None of the URNs has temp subfields, we don't need to do anything\n if (f856sUrnsWithTempSubfields.length < 1) {\n debug(`No Urns with temp subfield`);\n return;\n }\n\n // Do we have an existing URN with legal deposit subfields, if we have, we can remove the temp URN field(s)\n const existingLegalDepositURN = validateLD(f856sUrnsWithNoTempSubfields);\n debug(`existingLegalDepositURN: ${existingLegalDepositURN}`);\n\n if (existingLegalDepositURN) {\n debug(`We have an existing LD URN, we can delete temp fields (${f856sUrnsWithTempSubfields.length})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n return;\n }\n\n // We do not have an existing legalDepositURN, we should use the tempURN and remove the temp subfields from it\n if (!existingLegalDepositURN && f856sUrnsWithTempSubfields.length > 0) {\n //debug(`All Urns (${f856sUrn.length}) have a temp subfield`);\n debugData(`Original temp URNs: (${JSON.stringify(f856sUrnsWithTempSubfields)})`);\n const fixedFields = f856sUrnsWithTempSubfields.map(removeTempSubfield);\n debug(`We removed temp subfields: (${JSON.stringify(fixedFields)})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n newRecord.insertFields(fixedFields);\n return;\n }\n\n // Should we check that the non-temp URN has 2nd ind '0' - meaning that the URN handles the actual resource itself?\n }\n\n // ---- LD-functions below are same as in https://github.com/NatLibFi/marc-record-validators-melinda/blob/feature-updates-to-urn/src/urn.js\n // we propably should develop the urn/legaldeposit -validator to use also here\n\n function createLDSubfields() {\n return [\n {\n code: 'z',\n value: 'Käytettävissä vapaakappalekirjastoissa'\n },\n {\n code: '5',\n value: 'FI-Vapaa'\n }\n ];\n }\n\n function validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n const ldSubfields = createLDSubfields();\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, ldSubfields));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n }\n\n function fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n }\n\n // ---\n\n function removeTempSubfield(field) {\n\n // Sanity check for control fields\n if (field.subfields === undefined) {\n return field;\n }\n\n // we probably should check that we don't return field that has no subfields left\n return {\n tag: field.tag,\n ind1: field.ind1,\n ind2: field.ind2,\n subfields: field.subfields.filter(sf => sf.code !== '9' && !(/^MELINDA<TEMP>$/u).test(sf.value))\n };\n }\n\n}\n\n// This could be formatted so that 035-prefix and SID contents would be better connected than by just an array index\nexport const BIB_F035_TO_SID = {\n f035Filters: [/^\\(FI-BTJ\\)/u, /^\\(FI-TATI\\)/u],\n fSIDFilters: ['FI-BTJ', 'tati']\n};\n\n// There is somewhere other implementations of this same standardPrefixes to alephInternalPrefixes normalization\nexport const REPLACE_PREFIXES = [\n {\n oldPrefix: 'FI-MELINDA',\n newPrefix: 'FIN01',\n prefixReplaceCodes: ['w']\n },\n {\n oldPrefix: 'FI-ASTERI-S',\n newPrefix: 'FIN10',\n prefixReplaceCodes: ['0']\n },\n {\n oldPrefix: 'FI-ASTERI-N',\n newPrefix: 'FIN11',\n prefixReplaceCodes: ['0']\n },\n {\n oldPrefix: 'FI-ASTERI-A',\n newPrefix: 'FIN12',\n prefixReplaceCodes: ['0']\n },\n {\n oldPrefix: 'FI-ASTERI-W',\n newPrefix: 'FIN13',\n prefixReplaceCodes: ['0']\n }\n];\n\n// If placed in config.js testing needs envs\nexport const BIB_FORMAT_SETTINGS = {\n replacePrefixes: REPLACE_PREFIXES,\n generateMissingSIDs: BIB_F035_TO_SID\n};\n\nexport const BIB_PREVALIDATION_FIX_SETTINGS = {\n generateMissingSIDs: BIB_F035_TO_SID\n};\n\nexport const BIB_POSTVALIDATION_FIX_SETTINGS = {\n replacePrefixes: REPLACE_PREFIXES\n};\n\nexport const BIB_HANDLE_TEMP_URNS_SETTINGS = {\n handleTempUrns: true\n};\n"],"mappings":"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"}
@@ -39,6 +39,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
39
39
  * for the JavaScript code in this file.
40
40
  *
41
41
  */
42
+ //import {createDebugLogger} from 'debug';
42
43
  describe('services/format', () => {
43
44
  const FIXTURES_PATH = [__dirname, '..', '..', 'test-fixtures', 'format'];
44
45
  const {
@@ -47,6 +48,18 @@ describe('services/format', () => {
47
48
  root: FIXTURES_PATH,
48
49
  reader: _fixura.READERS.JSON
49
50
  });
51
+ describe('Undefined options', () => {
52
+ it(`Should not update link subfield prefixes if options are undefined`, () => {
53
+ const record = new _marcRecord.MarcRecord(getFixture({
54
+ components: ['in', 'fiAsteriN0Fin11.json']
55
+ }));
56
+ const result = (0, _format.formatRecord)(record.toObject(), undefined);
57
+ const expected = getFixture({
58
+ components: ['in', 'fiAsteriN0Fin11.json']
59
+ });
60
+ (0, _chai.expect)(result).to.eql(expected);
61
+ });
62
+ });
50
63
  describe('fiAsteriN0Fin11', () => {
51
64
  it('Should succeed', () => {
52
65
  const record = new _marcRecord.MarcRecord(getFixture({
@@ -88,7 +101,9 @@ describe('services/format', () => {
88
101
  const record = new _marcRecord.MarcRecord(getFixture({
89
102
  components: ['in', 'f035fibtj.json']
90
103
  }));
91
- const result = (0, _format.formatRecord)(record.toObject());
104
+ const result = (0, _format.formatRecord)(record.toObject(), {
105
+ generateMissingSIDs: _format.BIB_F035_TO_SID
106
+ });
92
107
  const expected = getFixture({
93
108
  components: ['out', 'f035fibtj.json']
94
109
  });
@@ -100,7 +115,9 @@ describe('services/format', () => {
100
115
  const record = new _marcRecord.MarcRecord(getFixture({
101
116
  components: ['in', 'f035tati.json']
102
117
  }));
103
- const result = (0, _format.formatRecord)(record.toObject());
118
+ const result = (0, _format.formatRecord)(record.toObject(), {
119
+ generateMissingSIDs: _format.BIB_F035_TO_SID
120
+ });
104
121
  const expected = getFixture({
105
122
  components: ['out', 'f035tati.json']
106
123
  });
@@ -112,9 +129,93 @@ describe('services/format', () => {
112
129
  const record = new _marcRecord.MarcRecord(getFixture({
113
130
  components: ['in', 'f035fibtjAndTati.json']
114
131
  }));
115
- const result = (0, _format.formatRecord)(record.toObject());
132
+ const result = (0, _format.formatRecord)(record.toObject(), {
133
+ generateMissingSIDs: _format.BIB_F035_TO_SID
134
+ });
116
135
  const expected = getFixture({
117
136
  components: ['out', 'f035fibtjAndTati.json']
137
+ }); // eslint-disable-next-line no-console
138
+ //console.log(`result: ${JSON.stringify(result)}`);
139
+ // eslint-disable-next-line no-console
140
+ //console.log(`expect: ${JSON.stringify(expected)}`);
141
+
142
+ (0, _chai.expect)(result).to.eql(expected);
143
+ });
144
+ });
145
+ describe('f035tati', () => {
146
+ it('Should NOT add tati SID with undefined options', () => {
147
+ const record = new _marcRecord.MarcRecord(getFixture({
148
+ components: ['in', 'f035tati.json']
149
+ }));
150
+ const result = (0, _format.formatRecord)(record.toObject(), undefined);
151
+ const expected = getFixture({
152
+ components: ['in', 'f035tati.json']
153
+ });
154
+ (0, _chai.expect)(result).to.eql(expected);
155
+ });
156
+ });
157
+ describe('bib-prevalidation-fix -settings', () => {
158
+ it('Should add missing SIDs, but not handle sf $0s when running with BIB_PREVALIDATION_FIX_SETTINGS', () => {
159
+ const record = new _marcRecord.MarcRecord(getFixture({
160
+ components: ['in', 'f035tatiAndFin11-for-prevalidation.json']
161
+ }));
162
+ const result = (0, _format.formatRecord)(record.toObject(), _format.BIB_PREVALIDATION_FIX_SETTINGS);
163
+ const expected = getFixture({
164
+ components: ['out', 'f035tatiAndFin11-for-prevalidation.json']
165
+ });
166
+ (0, _chai.expect)(result).to.eql(expected);
167
+ });
168
+ });
169
+ describe('bib-postvalidation-fix -settings', () => {
170
+ it('Should handle link subfields, but not add missing SIDs, when running with BIB_POSTVALIDATION_FIX_SETTINGS', () => {
171
+ const record = new _marcRecord.MarcRecord(getFixture({
172
+ components: ['in', 'f035tatiAndFin11-for-postvalidation.json']
173
+ }));
174
+ const result = (0, _format.formatRecord)(record.toObject(), _format.BIB_POSTVALIDATION_FIX_SETTINGS);
175
+ const expected = getFixture({
176
+ components: ['out', 'f035tatiAndFin11-for-postvalidation.json']
177
+ });
178
+ (0, _chai.expect)(result).to.eql(expected);
179
+ });
180
+ });
181
+ describe('handle tempURNs', () => {
182
+ it('It should do nothing if there are not tempURNs', () => {
183
+ const record = new _marcRecord.MarcRecord(getFixture({
184
+ components: ['in', 'tempUrnNoTemp.json']
185
+ }));
186
+ const result = (0, _format.formatRecord)(record.toObject(), _format.BIB_HANDLE_TEMP_URNS_SETTINGS);
187
+ const expected = getFixture({
188
+ components: ['out', 'tempUrnNoTemp.json']
189
+ });
190
+ (0, _chai.expect)(result).to.eql(expected);
191
+ });
192
+ it('It should find a single tempURN and remove the temp subfield', () => {
193
+ const record = new _marcRecord.MarcRecord(getFixture({
194
+ components: ['in', 'tempUrnWithTemp.json']
195
+ }));
196
+ const result = (0, _format.formatRecord)(record.toObject(), _format.BIB_HANDLE_TEMP_URNS_SETTINGS);
197
+ const expected = getFixture({
198
+ components: ['out', 'tempUrnWithTemp.json']
199
+ });
200
+ (0, _chai.expect)(result).to.eql(expected);
201
+ });
202
+ it('It should find a tempURN and an existing legal deposit URN and remove the tempURN', () => {
203
+ const record = new _marcRecord.MarcRecord(getFixture({
204
+ components: ['in', 'tempUrnWithTempAndLD.json']
205
+ }));
206
+ const result = (0, _format.formatRecord)(record.toObject(), _format.BIB_HANDLE_TEMP_URNS_SETTINGS);
207
+ const expected = getFixture({
208
+ components: ['out', 'tempUrnWithTempAndLD.json']
209
+ });
210
+ (0, _chai.expect)(result).to.eql(expected);
211
+ });
212
+ it('It should find a tempURN and an existing non-legal deposit URN and remove the temp subfields from tempURN', () => {
213
+ const record = new _marcRecord.MarcRecord(getFixture({
214
+ components: ['in', 'tempUrnWithTempAndNoLD.json']
215
+ }));
216
+ const result = (0, _format.formatRecord)(record.toObject(), _format.BIB_HANDLE_TEMP_URNS_SETTINGS);
217
+ const expected = getFixture({
218
+ components: ['out', 'tempUrnWithTempAndNoLD.json']
118
219
  });
119
220
  (0, _chai.expect)(result).to.eql(expected);
120
221
  });
@@ -1 +1 @@
1
- {"version":3,"file":"format.spec.js","names":["describe","FIXTURES_PATH","__dirname","getFixture","fixtureFactory","root","reader","READERS","JSON","it","record","MarcRecord","components","result","formatRecord","toObject","BIB_FORMAT_SETTINGS","expected","expect","to","eql"],"sources":["../../src/helpers/format.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {expect} from 'chai';\nimport fixtureFactory, {READERS} from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {formatRecord, BIB_FORMAT_SETTINGS} from './format';\n\ndescribe('services/format', () => {\n const FIXTURES_PATH = [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'format'\n ];\n const {getFixture} = fixtureFactory({root: FIXTURES_PATH, reader: READERS.JSON});\n\n describe('fiAsteriN0Fin11', () => {\n it('Should succeed', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'fiAsteriN0Fin11.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_FORMAT_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'fiAsteriN0Fin11.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('fiAsteriS0Fin10', () => {\n it('Should succeed', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'fiAsteriS0Fin10.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_FORMAT_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'fiAsteriS0Fin10.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('fiMelindaWFin01', () => {\n it('Should succeed', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'fiMelindaWFin01.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_FORMAT_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'fiMelindaWFin01.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('f035fibtj', () => {\n it('Should add FI-BTJ SID', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035fibtj.json'\n ]\n }));\n const result = formatRecord(record.toObject());\n const expected = getFixture({\n components: [\n 'out',\n 'f035fibtj.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('f035tati', () => {\n it('Should add tati SID', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035tati.json'\n ]\n }));\n const result = formatRecord(record.toObject());\n const expected = getFixture({\n components: [\n 'out',\n 'f035tati.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('f035fibtjAndTati', () => {\n it('Should add tati SID and skip FI-BTJ SID', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035fibtjAndTati.json'\n ]\n }));\n const result = formatRecord(record.toObject());\n const expected = getFixture({\n components: [\n 'out',\n 'f035fibtjAndTati.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n});\n"],"mappings":";;AA4BA;;AACA;;AACA;;AACA;;;;;;AA/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAOAA,QAAQ,CAAC,iBAAD,EAAoB,MAAM;EAChC,MAAMC,aAAa,GAAG,CACpBC,SADoB,EAEpB,IAFoB,EAGpB,IAHoB,EAIpB,eAJoB,EAKpB,QALoB,CAAtB;EAOA,MAAM;IAACC;EAAD,IAAe,IAAAC,eAAA,EAAe;IAACC,IAAI,EAAEJ,aAAP;IAAsBK,MAAM,EAAEC,eAAA,CAAQC;EAAtC,CAAf,CAArB;EAEAR,QAAQ,CAAC,iBAAD,EAAoB,MAAM;IAChCS,EAAE,CAAC,gBAAD,EAAmB,MAAM;MACzB,MAAMC,MAAM,GAAG,IAAIC,sBAAJ,CAAeR,UAAU,CAAC;QACvCS,UAAU,EAAE,CACV,IADU,EAEV,sBAFU;MAD2B,CAAD,CAAzB,CAAf;MAMA,MAAMC,MAAM,GAAG,IAAAC,oBAAA,EAAaJ,MAAM,CAACK,QAAP,EAAb,EAAgCC,2BAAhC,CAAf;MACA,MAAMC,QAAQ,GAAGd,UAAU,CAAC;QAC1BS,UAAU,EAAE,CACV,KADU,EAEV,sBAFU;MADc,CAAD,CAA3B;MAOA,IAAAM,YAAA,EAAOL,MAAP,EAAeM,EAAf,CAAkBC,GAAlB,CAAsBH,QAAtB;IACD,CAhBC,CAAF;EAiBD,CAlBO,CAAR;EAoBAjB,QAAQ,CAAC,iBAAD,EAAoB,MAAM;IAChCS,EAAE,CAAC,gBAAD,EAAmB,MAAM;MACzB,MAAMC,MAAM,GAAG,IAAIC,sBAAJ,CAAeR,UAAU,CAAC;QACvCS,UAAU,EAAE,CACV,IADU,EAEV,sBAFU;MAD2B,CAAD,CAAzB,CAAf;MAMA,MAAMC,MAAM,GAAG,IAAAC,oBAAA,EAAaJ,MAAM,CAACK,QAAP,EAAb,EAAgCC,2BAAhC,CAAf;MACA,MAAMC,QAAQ,GAAGd,UAAU,CAAC;QAC1BS,UAAU,EAAE,CACV,KADU,EAEV,sBAFU;MADc,CAAD,CAA3B;MAOA,IAAAM,YAAA,EAAOL,MAAP,EAAeM,EAAf,CAAkBC,GAAlB,CAAsBH,QAAtB;IACD,CAhBC,CAAF;EAiBD,CAlBO,CAAR;EAoBAjB,QAAQ,CAAC,iBAAD,EAAoB,MAAM;IAChCS,EAAE,CAAC,gBAAD,EAAmB,MAAM;MACzB,MAAMC,MAAM,GAAG,IAAIC,sBAAJ,CAAeR,UAAU,CAAC;QACvCS,UAAU,EAAE,CACV,IADU,EAEV,sBAFU;MAD2B,CAAD,CAAzB,CAAf;MAMA,MAAMC,MAAM,GAAG,IAAAC,oBAAA,EAAaJ,MAAM,CAACK,QAAP,EAAb,EAAgCC,2BAAhC,CAAf;MACA,MAAMC,QAAQ,GAAGd,UAAU,CAAC;QAC1BS,UAAU,EAAE,CACV,KADU,EAEV,sBAFU;MADc,CAAD,CAA3B;MAOA,IAAAM,YAAA,EAAOL,MAAP,EAAeM,EAAf,CAAkBC,GAAlB,CAAsBH,QAAtB;IACD,CAhBC,CAAF;EAiBD,CAlBO,CAAR;EAoBAjB,QAAQ,CAAC,WAAD,EAAc,MAAM;IAC1BS,EAAE,CAAC,uBAAD,EAA0B,MAAM;MAChC,MAAMC,MAAM,GAAG,IAAIC,sBAAJ,CAAeR,UAAU,CAAC;QACvCS,UAAU,EAAE,CACV,IADU,EAEV,gBAFU;MAD2B,CAAD,CAAzB,CAAf;MAMA,MAAMC,MAAM,GAAG,IAAAC,oBAAA,EAAaJ,MAAM,CAACK,QAAP,EAAb,CAAf;MACA,MAAME,QAAQ,GAAGd,UAAU,CAAC;QAC1BS,UAAU,EAAE,CACV,KADU,EAEV,gBAFU;MADc,CAAD,CAA3B;MAOA,IAAAM,YAAA,EAAOL,MAAP,EAAeM,EAAf,CAAkBC,GAAlB,CAAsBH,QAAtB;IACD,CAhBC,CAAF;EAiBD,CAlBO,CAAR;EAoBAjB,QAAQ,CAAC,UAAD,EAAa,MAAM;IACzBS,EAAE,CAAC,qBAAD,EAAwB,MAAM;MAC9B,MAAMC,MAAM,GAAG,IAAIC,sBAAJ,CAAeR,UAAU,CAAC;QACvCS,UAAU,EAAE,CACV,IADU,EAEV,eAFU;MAD2B,CAAD,CAAzB,CAAf;MAMA,MAAMC,MAAM,GAAG,IAAAC,oBAAA,EAAaJ,MAAM,CAACK,QAAP,EAAb,CAAf;MACA,MAAME,QAAQ,GAAGd,UAAU,CAAC;QAC1BS,UAAU,EAAE,CACV,KADU,EAEV,eAFU;MADc,CAAD,CAA3B;MAOA,IAAAM,YAAA,EAAOL,MAAP,EAAeM,EAAf,CAAkBC,GAAlB,CAAsBH,QAAtB;IACD,CAhBC,CAAF;EAiBD,CAlBO,CAAR;EAoBAjB,QAAQ,CAAC,kBAAD,EAAqB,MAAM;IACjCS,EAAE,CAAC,yCAAD,EAA4C,MAAM;MAClD,MAAMC,MAAM,GAAG,IAAIC,sBAAJ,CAAeR,UAAU,CAAC;QACvCS,UAAU,EAAE,CACV,IADU,EAEV,uBAFU;MAD2B,CAAD,CAAzB,CAAf;MAMA,MAAMC,MAAM,GAAG,IAAAC,oBAAA,EAAaJ,MAAM,CAACK,QAAP,EAAb,CAAf;MACA,MAAME,QAAQ,GAAGd,UAAU,CAAC;QAC1BS,UAAU,EAAE,CACV,KADU,EAEV,uBAFU;MADc,CAAD,CAA3B;MAOA,IAAAM,YAAA,EAAOL,MAAP,EAAeM,EAAf,CAAkBC,GAAlB,CAAsBH,QAAtB;IACD,CAhBC,CAAF;EAiBD,CAlBO,CAAR;AAmBD,CAjIO,CAAR"}
1
+ {"version":3,"file":"format.spec.js","names":["describe","FIXTURES_PATH","__dirname","getFixture","fixtureFactory","root","reader","READERS","JSON","it","record","MarcRecord","components","result","formatRecord","toObject","undefined","expected","expect","to","eql","BIB_FORMAT_SETTINGS","generateMissingSIDs","BIB_F035_TO_SID","BIB_PREVALIDATION_FIX_SETTINGS","BIB_POSTVALIDATION_FIX_SETTINGS","BIB_HANDLE_TEMP_URNS_SETTINGS"],"sources":["../../src/helpers/format.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {expect} from 'chai';\nimport fixtureFactory, {READERS} from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {formatRecord, BIB_FORMAT_SETTINGS, BIB_F035_TO_SID, BIB_PREVALIDATION_FIX_SETTINGS, BIB_POSTVALIDATION_FIX_SETTINGS, BIB_HANDLE_TEMP_URNS_SETTINGS} from './format';\n//import {createDebugLogger} from 'debug';\n\ndescribe('services/format', () => {\n const FIXTURES_PATH = [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'format'\n ];\n const {getFixture} = fixtureFactory({root: FIXTURES_PATH, reader: READERS.JSON});\n\n describe('Undefined options', () => {\n it(`Should not update link subfield prefixes if options are undefined`, () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'fiAsteriN0Fin11.json'\n ]\n }));\n const result = formatRecord(record.toObject(), undefined);\n const expected = getFixture({\n components: [\n 'in',\n 'fiAsteriN0Fin11.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n\n describe('fiAsteriN0Fin11', () => {\n it('Should succeed', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'fiAsteriN0Fin11.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_FORMAT_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'fiAsteriN0Fin11.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('fiAsteriS0Fin10', () => {\n it('Should succeed', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'fiAsteriS0Fin10.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_FORMAT_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'fiAsteriS0Fin10.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('fiMelindaWFin01', () => {\n it('Should succeed', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'fiMelindaWFin01.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_FORMAT_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'fiMelindaWFin01.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('f035fibtj', () => {\n it('Should add FI-BTJ SID', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035fibtj.json'\n ]\n }));\n const result = formatRecord(record.toObject(), {generateMissingSIDs: BIB_F035_TO_SID});\n const expected = getFixture({\n components: [\n 'out',\n 'f035fibtj.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('f035tati', () => {\n it('Should add tati SID', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035tati.json'\n ]\n }));\n const result = formatRecord(record.toObject(), {generateMissingSIDs: BIB_F035_TO_SID});\n const expected = getFixture({\n components: [\n 'out',\n 'f035tati.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('f035fibtjAndTati', () => {\n it('Should add tati SID and skip FI-BTJ SID', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035fibtjAndTati.json'\n ]\n }));\n const result = formatRecord(record.toObject(), {generateMissingSIDs: BIB_F035_TO_SID});\n const expected = getFixture({\n components: [\n 'out',\n 'f035fibtjAndTati.json'\n ]\n });\n // eslint-disable-next-line no-console\n //console.log(`result: ${JSON.stringify(result)}`);\n // eslint-disable-next-line no-console\n //console.log(`expect: ${JSON.stringify(expected)}`);\n expect(result).to.eql(expected);\n });\n });\n\n describe('f035tati', () => {\n it('Should NOT add tati SID with undefined options', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035tati.json'\n ]\n }));\n const result = formatRecord(record.toObject(), undefined);\n const expected = getFixture({\n components: [\n 'in',\n 'f035tati.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('bib-prevalidation-fix -settings', () => {\n it('Should add missing SIDs, but not handle sf $0s when running with BIB_PREVALIDATION_FIX_SETTINGS', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035tatiAndFin11-for-prevalidation.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_PREVALIDATION_FIX_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'f035tatiAndFin11-for-prevalidation.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n\n describe('bib-postvalidation-fix -settings', () => {\n it('Should handle link subfields, but not add missing SIDs, when running with BIB_POSTVALIDATION_FIX_SETTINGS', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f035tatiAndFin11-for-postvalidation.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_POSTVALIDATION_FIX_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'f035tatiAndFin11-for-postvalidation.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n describe('handle tempURNs', () => {\n it('It should do nothing if there are not tempURNs', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'tempUrnNoTemp.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_HANDLE_TEMP_URNS_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'tempUrnNoTemp.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n\n it('It should find a single tempURN and remove the temp subfield', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'tempUrnWithTemp.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_HANDLE_TEMP_URNS_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'tempUrnWithTemp.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n\n it('It should find a tempURN and an existing legal deposit URN and remove the tempURN', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'tempUrnWithTempAndLD.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_HANDLE_TEMP_URNS_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'tempUrnWithTempAndLD.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n\n it('It should find a tempURN and an existing non-legal deposit URN and remove the temp subfields from tempURN', () => {\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'tempUrnWithTempAndNoLD.json'\n ]\n }));\n const result = formatRecord(record.toObject(), BIB_HANDLE_TEMP_URNS_SETTINGS);\n const expected = getFixture({\n components: [\n 'out',\n 'tempUrnWithTempAndNoLD.json'\n ]\n });\n\n expect(result).to.eql(expected);\n });\n });\n\n});\n"],"mappings":"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"}
package/dist/mongoLog.js CHANGED
@@ -99,6 +99,7 @@ async function _default(MONGO_URI) {
99
99
 
100
100
  async function query(params) {
101
101
  logger.debug(`Query params: ${JSON.stringify(params)}`);
102
+ checkLogItemType(params.logItemType, false, false);
102
103
  const {
103
104
  limit = 5,
104
105
  skip = 0,
@@ -126,7 +127,7 @@ async function _default(MONGO_URI) {
126
127
  }
127
128
 
128
129
  async function getListOfLogs(logItemType = 'MERGE_LOG') {
129
- checkLogItemType(logItemType, false);
130
+ checkLogItemType(logItemType, false, false);
130
131
  const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
131
132
  .distinct('correlationId', {
132
133
  logItemType
@@ -190,18 +191,26 @@ async function _default(MONGO_URI) {
190
191
  }
191
192
  }
192
193
 
193
- function checkLogItemType(logItemType, errorUnknown = false) {
194
- const typeInLogItemTypes = Object.values(_constants.LOG_ITEM_TYPE).indexOf(logItemType) > -1;
194
+ function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {
195
+ if (logItemType) {
196
+ const typeInLogItemTypes = Object.values(_constants.LOG_ITEM_TYPE).indexOf(logItemType) > -1;
195
197
 
196
- if (typeInLogItemTypes) {
197
- return logger.debug(`Valid logItemType: ${logItemType}`);
198
+ if (typeInLogItemTypes) {
199
+ return logger.debug(`Valid logItemType: ${logItemType}`);
200
+ }
201
+
202
+ if (errorUnknown) {
203
+ throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);
204
+ }
205
+
206
+ return logger.debug(`WARN: We have unknown logType: ${logItemType}`);
198
207
  }
199
208
 
200
- if (errorUnknown) {
201
- throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);
209
+ if (errorNotExisting) {
210
+ throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);
202
211
  }
203
212
 
204
- return logger.debug(`WARN: We have unknown logType: ${logItemType}`);
213
+ return logger.debug(`No logItemType: ${logItemType}`);
205
214
  }
206
215
  }
207
216
  //# sourceMappingURL=mongoLog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mongoLog.js","names":["MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","protect","remove","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","payload","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","err","message","force","clean","$ne","deleteMany","deletedCount","errorUnknown","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, protect, remove};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: cleanBlobSequence} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n {\n $set: {\n modificationTime: moment().toDate(),\n protect: {$not: '$protect'}\n }\n }\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n function checkLogItemType(logItemType, errorUnknown = false) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mongoLog.js","names":["MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","protect","remove","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","payload","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","err","message","force","clean","$ne","deleteMany","deletedCount","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, protect, remove};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n checkLogItemType(params.logItemType, false, false);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: cleanBlobSequence} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n {\n $set: {\n modificationTime: moment().toDate(),\n protect: {$not: '$protect'}\n }\n }\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -100,9 +100,9 @@ function createRecordResponseItem({
100
100
 
101
101
 
102
102
  function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {
103
- logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);
104
- const responseStatusName = _httpStatus.default[`${responseStatus}_NAME`];
105
- logger.debug(`Response status name: ${responseStatusName}`);
103
+ logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`); //const responseStatusName = httpStatus[`${responseStatus}_NAME`];
104
+ //logger.debug(`Response status name: ${responseStatusName}`);
105
+
106
106
  const message = getMessageFromResponsePayload(responsePayload);
107
107
  const ids = responsePayload.ids || [];
108
108
  logger.debug(`Response message: ${message}`); // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","responseStatusName","httpStatus","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField"],"sources":["../src/utils.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\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\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 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\n// eslint-disable-next-line max-statements\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'].includes(responseStatus)) {\n return {recordStatus: responseStatus, 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 if (ids.length > 1 || 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 if (ids.length > 1 || 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 // Otherwise\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message};\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 await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","httpStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField"],"sources":["../src/utils.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\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\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 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\n// eslint-disable-next-line max-statements\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'].includes(responseStatus)) {\n return {recordStatus: responseStatus, 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 if (ids.length > 1 || 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 if (ids.length > 1 || 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 // Otherwise\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message};\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 await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n"],"mappings":"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"}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/melinda-rest-api-commons.git"
15
15
  },
16
16
  "license": "AGPL-3.0+",
17
- "version": "2.3.1-alpha.6",
17
+ "version": "2.3.2-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=14"
@@ -33,13 +33,14 @@
33
33
  "build": "babel src --source-maps --copy-files --delete-dir-on-start --out-dir=dist"
34
34
  },
35
35
  "dependencies": {
36
- "@natlibfi/marc-record": "^7.0.0",
36
+ "@natlibfi/marc-record": "^7.2.0-alpha.1",
37
37
  "@natlibfi/marc-record-serializers": "^8.1.0",
38
38
  "@natlibfi/marc-record-validate": "^7.0.1",
39
39
  "@natlibfi/marc-record-validators-melinda": "^9.0.9",
40
40
  "@natlibfi/melinda-backend-commons": "^2.0.5",
41
41
  "@natlibfi/melinda-commons": "^12.0.3",
42
42
  "amqplib": ">=0.8.0 <1.0.0",
43
+ "debug": "^4.3.4",
43
44
  "http-status": "^1.5.2",
44
45
  "moment": "^2.29.3",
45
46
  "mongo-sanitize": "^1.1.0",