@natlibfi/melinda-rest-api-commons 4.0.19-alpha.3 → 4.0.20-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.
@@ -79,7 +79,6 @@ function handleTempUrns(newRecord, options) {
79
79
  }
80
80
  // Should we check that the non-temp URN has 2nd ind '0' - meaning that the URN handles the actual resource itself?
81
81
  }
82
-
83
82
  function getf856sUrns(newRecord) {
84
83
  const hasURN = f => f.tag === '856' && f.subfields.some(({
85
84
  code,
@@ -1 +1 @@
1
- {"version":3,"file":"fix-handle-tempurns.js","names":["_debug","_interopRequireDefault","require","debug","createDebugLogger","debugData","extend","handleTempUrns","newRecord","options","JSON","stringify","f856sUrnsWithTempSubfields","f856sUrnsWithNoTempSubfields","getf856sUrns","length","existingLegalDepositURN","validateLD","removeFields","fixedFields","map","removeTempSubfield","filter","field","insertFields","hasURN","f","tag","subfields","some","code","value","test","hasTempSubfield","hasNoTempSubfield","f856sUrn","fields","LD_SUBFIELDS","f856sUrnWithLdSubfields","fieldHasLDSubfields","ldSubfields","every","ldsf","sf","isNaN","parseInt","filteredSubfields","ind1","ind2"],"sources":["../../src/helpers/fix-handle-tempurns.js"],"sourcesContent":["\n/**\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//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:handleTempUrns');\nconst debugData = debug.extend('data');\n\n// eslint-disable-next-line max-statements\nexport function handleTempUrns(newRecord, options) {\n\n if (options !== true) {\n debug(`NOT running handleTempUrns fixer, no options`);\n return newRecord;\n }\n\n debug(`Running handleTempUrns fixer`);\n debugData(`Options for handleTempUrns: ${JSON.stringify(options)}`);\n\n const {f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields} = getf856sUrns(newRecord);\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 newRecord;\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 newRecord;\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).filter(field => field);\n debug(`We removed temp subfields: (${JSON.stringify(fixedFields)})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n newRecord.insertFields(fixedFields);\n return newRecord;\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\nfunction getf856sUrns(newRecord) {\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 return {f856sUrn, f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields};\n}\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\nfunction validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n\n const LD_SUBFIELDS = [\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ];\n\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, LD_SUBFIELDS));\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\nfunction 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\nfunction removeTempSubfield(field) {\n\n // Handle non-numeric fields, and fields with a numeric tag of 010 and greater\n // Aleph's FMT as a controlfield might be a problem\n if (!isNaN(field.tag) && parseInt(field.tag, 10) >= 10) {\n\n const filteredSubfields = field.subfields.filter(sf => sf.code !== '9' && !(/^MELINDA<TEMP>$/u).test(sf.value));\n\n // Remove whole field if there are no subfields left\n if (filteredSubfields.length < 1) {\n return false;\n }\n\n return {\n tag: field.tag,\n ind1: field.ind1,\n ind2: field.ind2,\n subfields: filteredSubfields\n };\n }\n // return controlFields as is\n return field;\n}\n\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"fix-handle-tempurns.js","names":["_debug","_interopRequireDefault","require","debug","createDebugLogger","debugData","extend","handleTempUrns","newRecord","options","JSON","stringify","f856sUrnsWithTempSubfields","f856sUrnsWithNoTempSubfields","getf856sUrns","length","existingLegalDepositURN","validateLD","removeFields","fixedFields","map","removeTempSubfield","filter","field","insertFields","hasURN","f","tag","subfields","some","code","value","test","hasTempSubfield","hasNoTempSubfield","f856sUrn","fields","LD_SUBFIELDS","f856sUrnWithLdSubfields","fieldHasLDSubfields","ldSubfields","every","ldsf","sf","isNaN","parseInt","filteredSubfields","ind1","ind2"],"sources":["../../src/helpers/fix-handle-tempurns.js"],"sourcesContent":["\n/**\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//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:handleTempUrns');\nconst debugData = debug.extend('data');\n\n// eslint-disable-next-line max-statements\nexport function handleTempUrns(newRecord, options) {\n\n if (options !== true) {\n debug(`NOT running handleTempUrns fixer, no options`);\n return newRecord;\n }\n\n debug(`Running handleTempUrns fixer`);\n debugData(`Options for handleTempUrns: ${JSON.stringify(options)}`);\n\n const {f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields} = getf856sUrns(newRecord);\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 newRecord;\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 newRecord;\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).filter(field => field);\n debug(`We removed temp subfields: (${JSON.stringify(fixedFields)})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n newRecord.insertFields(fixedFields);\n return newRecord;\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\nfunction getf856sUrns(newRecord) {\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 return {f856sUrn, f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields};\n}\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\nfunction validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n\n const LD_SUBFIELDS = [\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ];\n\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, LD_SUBFIELDS));\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\nfunction 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\nfunction removeTempSubfield(field) {\n\n // Handle non-numeric fields, and fields with a numeric tag of 010 and greater\n // Aleph's FMT as a controlfield might be a problem\n if (!isNaN(field.tag) && parseInt(field.tag, 10) >= 10) {\n\n const filteredSubfields = field.subfields.filter(sf => sf.code !== '9' && !(/^MELINDA<TEMP>$/u).test(sf.value));\n\n // Remove whole field if there are no subfields left\n if (filteredSubfields.length < 1) {\n return false;\n }\n\n return {\n tag: field.tag,\n ind1: field.ind1,\n ind2: field.ind2,\n subfields: filteredSubfields\n };\n }\n // return controlFields as is\n return field;\n}\n\n\n"],"mappings":"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"}
@@ -174,7 +174,6 @@ function stripF884s(newRecord, options) {
174
174
  // eslint-disable-line functional/no-conditional-statements
175
175
  uniq.push(field); // eslint-disable-line functional/immutable-data
176
176
  }
177
-
178
177
  return uniq;
179
178
  }, []);
180
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fix-strip-f884s.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_util","stripF884s","newRecord","options","debug","createDebugLogger","debugData","extend","JSON","stringify","isMelindaf884","f","tag","subfields","some","code","value","f884Melindas","fields","filter","length","results","reduce","allResults","f884","index","conversion","findConversion","source","findSource","convSource","firstDate","lastDate","findDates","hash","findHash","currResult","newResult","updatedResult","editedf884s","editFields","editedFields","map","field","sfGAll","sfKAll","sfG","replace","sfK","subfield","uniq884s","uniqFields","inspect","depth","uniq","MarcRecord","isEqual","push","removeFields","insertFields","sfA","emptySource","emptyHash","test","padStart"],"sources":["../../src/helpers/fix-strip-f884s.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-2023 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 createDebugLogger from 'debug';\n//import {sortFieldsBySubfieldValue, removeSubfield} from './fix-utils';\nimport {inspect} from 'util';\n\nexport function stripF884s(newRecord, options) {\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s');\n const debugData = debug.extend('data');\n\n if (options !== true) {\n debug(`NOT running stripF884s fixer, no options`);\n return newRecord;\n }\n\n debug(`Running stripF884s fixer`);\n debugData(`Options for stripF884s: ${JSON.stringify(options)}`);\n\n // Handle only f884 with $5 MELINDA - let's no remove random f884s\n const isMelindaf884 = f => f.tag === '884' && f.subfields.some(({code, value}) => code === '5' && value === 'MELINDA');\n\n const f884Melindas = newRecord.fields.filter(isMelindaf884);\n debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${JSON.stringify(f884Melindas)}`);\n //debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${inspect(f884Melindas, {depth: 3})}`);\n\n if (f884Melindas.length < 2) {\n debug(`Not enough Melinda's f884s to filter (${f884Melindas.length})`);\n return newRecord;\n }\n\n // Pick data (firstDate, lastDate, hash with latest date) for all conversion : source combinations\n const results = f884Melindas.reduce((allResults, f884, index) => {\n debugData(`All results: ${JSON.stringify(allResults)}`);\n //debugData(`Handling field (${index}): ${inspect(f884, {depth: 3})}`);\n debugData(`Handling field *(${index})*: ${JSON.stringify(f884)}`);\n\n const conversion = findConversion(f884);\n const source = findSource(f884);\n const convSource = `${conversion}:${source}`;\n const {firstDate, lastDate} = findDates(f884);\n const hash = findHash(f884);\n\n // Find currently existing data for conversion : source combination\n const currResult = allResults[convSource];\n debugData(JSON.stringify(currResult));\n\n // If we do not have any current data, add data from field\n if (!currResult) {\n debug(`Add a new convSource ${convSource} to results`);\n const newResult = {\n conversion,\n source,\n firstDate,\n lastDate,\n hash\n };\n debugData(`- New result: ${JSON.stringify(newResult)}`);\n return {\n ...allResults,\n [convSource]: newResult\n };\n }\n // If we have current data, update it from the data from field, if needed\n debug(`Update result for ${convSource}`);\n debugData(`- Current result: ${JSON.stringify(currResult)}`);\n\n const updatedResult = {\n ...currResult,\n firstDate: currResult.firstDate > firstDate && firstDate !== '00000000' ? firstDate : currResult.firstDate,\n lastDate: currResult.lastDate < lastDate ? lastDate : currResult.lastDate,\n hash: currResult.lastDate < lastDate && lastDate !== '00000000' && hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? hash : currResult.hash\n };\n debugData(`- Updated result: ${JSON.stringify(updatedResult)}`);\n return {\n ...allResults,\n [convSource]: updatedResult\n };\n }, {});\n\n debugData(`RESULTS: ${JSON.stringify(results)}`);\n const editedf884s = editFields(f884Melindas, results);\n\n debug(`Edited fields (${editedf884s.length})`);\n //debugData(inspect(editedf884s, {depth: 3}));\n debugData(`${JSON.stringify(editedf884s)}`);\n\n // We update each field based on the results we got from fields\n // Note: we do not add $g:s or $k:s if the field doesn't have them\n function editFields(fields, results) {\n debug(`EDITING FIELDS (${fields.length})`);\n const editedFields = fields.map((field) => {\n const convSource = `${findConversion(field)}:${findSource(field)}`;\n debug(`Looking for: ${convSource}`);\n\n if (convSource && results[convSource]) {\n debugData(`Found: ${JSON.stringify(results[convSource])}`);\n const firstDate = results[convSource].firstDate && results[convSource].firstDate !== '00000000' ? results[convSource].firstDate : '';\n const lastDate = results[convSource].lastDate && results[convSource].lastDate !== '00000000' ? results[convSource].lastDate : '';\n\n const source = results[convSource].source && results[convSource].source !== 'NO_SOURCE' ? results[convSource].source : '';\n const hash = results[convSource].hash && results[convSource].hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? results[convSource].hash : '';\n\n const sfGAll = firstDate === lastDate ? `${firstDate}` : `${firstDate} - ${lastDate}`;\n debugData(`EditedDates: ${sfGAll}`);\n const sfKAll = `${source}:${hash}`;\n\n const sfG = sfGAll.replace(/^ - /u, '').replace(/ - $/u, '');\n const sfK = sfKAll.replace(/^:/u, '').replace(/:$/u, '');\n\n return {\n ...field,\n subfields: field.subfields.map(subfield => {\n\n // we don't get $g or $k if the original field doesn't have them\n if (subfield.code === 'g') {\n return {\n code: subfield.code,\n value: sfG\n };\n }\n\n if (subfield.code === 'k') {\n return {\n code: subfield.code,\n value: sfK\n };\n }\n\n return subfield;\n })\n\n };\n }\n debug(`Not found: ${convSource}`);\n return field;\n });\n return editedFields;\n }\n\n // we'll need to uniq these too\n\n const uniq884s = uniqFields(editedf884s);\n debug(`UniqFields (${uniq884s.length})`);\n debugData(inspect(uniq884s, {depth: 3}));\n\n\n function uniqFields(fields) {\n return fields.reduce((uniq, field) => {\n if (!uniq.some(f => MarcRecord.isEqual(f, field))) { // eslint-disable-line functional/no-conditional-statements\n uniq.push(field); // eslint-disable-line functional/immutable-data\n }\n\n return uniq;\n }, []);\n }\n // Replace original Melinda-f884s with remaining Melinda-f884s\n // NOTE: this sorts MELINDA-f884s after possible other f884s\n newRecord.removeFields(f884Melindas);\n newRecord.insertFields(uniq884s);\n\n return newRecord;\n\n\n // Find conversion:source pairs\n // Find first date\n // Find last date and last hash\n\n\n function findConversion(f884) {\n const [sfA] = f884.subfields.filter((subfield) => subfield.code === 'a').map(subfield => subfield.value);\n const conversion = sfA;\n debugData(`Conversion: \"${conversion}\"`);\n return conversion;\n }\n\n function findSource(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const source = sfK.replace(/:.*$/u, '');\n if (source && source.length !== 64) {\n debugData(`Source: \"${source}\"`);\n return source;\n }\n const emptySource = 'NO_SOURCE';\n debugData(`Source: \"${emptySource}\"`);\n return emptySource;\n }\n\n function findHash(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const hash = sfK.replace(/^.*:/u, '');\n if (hash && hash.length === 64) {\n debugData(`Hash: \"${hash}\"`);\n return hash;\n }\n const emptyHash = '0000000000000000000000000000000000000000000000000000000000000000';\n debugData(`Hash: \"${emptyHash}\"`);\n return emptyHash;\n }\n\n function findDates(f884) {\n const [sfG] = f884.subfields.filter((subfield) => subfield.code === 'g').map(subfield => subfield.value);\n if (sfG && (/ - /u).test(sfG)) {\n const firstDate = sfG.replace(/ - .*$/u, '').padStart(8, '0');\n const lastDate = sfG.replace(/^.* - /u, '').padStart(8, '0');\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n const firstDate = sfG ? sfG.padStart(8, '0') : '00000000';\n const lastDate = sfG ? sfG.padStart(8, '0') : '00000000';\n\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fix-strip-f884s.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_util","stripF884s","newRecord","options","debug","createDebugLogger","debugData","extend","JSON","stringify","isMelindaf884","f","tag","subfields","some","code","value","f884Melindas","fields","filter","length","results","reduce","allResults","f884","index","conversion","findConversion","source","findSource","convSource","firstDate","lastDate","findDates","hash","findHash","currResult","newResult","updatedResult","editedf884s","editFields","editedFields","map","field","sfGAll","sfKAll","sfG","replace","sfK","subfield","uniq884s","uniqFields","inspect","depth","uniq","MarcRecord","isEqual","push","removeFields","insertFields","sfA","emptySource","emptyHash","test","padStart"],"sources":["../../src/helpers/fix-strip-f884s.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-2023 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 createDebugLogger from 'debug';\n//import {sortFieldsBySubfieldValue, removeSubfield} from './fix-utils';\nimport {inspect} from 'util';\n\nexport function stripF884s(newRecord, options) {\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s');\n const debugData = debug.extend('data');\n\n if (options !== true) {\n debug(`NOT running stripF884s fixer, no options`);\n return newRecord;\n }\n\n debug(`Running stripF884s fixer`);\n debugData(`Options for stripF884s: ${JSON.stringify(options)}`);\n\n // Handle only f884 with $5 MELINDA - let's no remove random f884s\n const isMelindaf884 = f => f.tag === '884' && f.subfields.some(({code, value}) => code === '5' && value === 'MELINDA');\n\n const f884Melindas = newRecord.fields.filter(isMelindaf884);\n debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${JSON.stringify(f884Melindas)}`);\n //debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${inspect(f884Melindas, {depth: 3})}`);\n\n if (f884Melindas.length < 2) {\n debug(`Not enough Melinda's f884s to filter (${f884Melindas.length})`);\n return newRecord;\n }\n\n // Pick data (firstDate, lastDate, hash with latest date) for all conversion : source combinations\n const results = f884Melindas.reduce((allResults, f884, index) => {\n debugData(`All results: ${JSON.stringify(allResults)}`);\n //debugData(`Handling field (${index}): ${inspect(f884, {depth: 3})}`);\n debugData(`Handling field *(${index})*: ${JSON.stringify(f884)}`);\n\n const conversion = findConversion(f884);\n const source = findSource(f884);\n const convSource = `${conversion}:${source}`;\n const {firstDate, lastDate} = findDates(f884);\n const hash = findHash(f884);\n\n // Find currently existing data for conversion : source combination\n const currResult = allResults[convSource];\n debugData(JSON.stringify(currResult));\n\n // If we do not have any current data, add data from field\n if (!currResult) {\n debug(`Add a new convSource ${convSource} to results`);\n const newResult = {\n conversion,\n source,\n firstDate,\n lastDate,\n hash\n };\n debugData(`- New result: ${JSON.stringify(newResult)}`);\n return {\n ...allResults,\n [convSource]: newResult\n };\n }\n // If we have current data, update it from the data from field, if needed\n debug(`Update result for ${convSource}`);\n debugData(`- Current result: ${JSON.stringify(currResult)}`);\n\n const updatedResult = {\n ...currResult,\n firstDate: currResult.firstDate > firstDate && firstDate !== '00000000' ? firstDate : currResult.firstDate,\n lastDate: currResult.lastDate < lastDate ? lastDate : currResult.lastDate,\n hash: currResult.lastDate < lastDate && lastDate !== '00000000' && hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? hash : currResult.hash\n };\n debugData(`- Updated result: ${JSON.stringify(updatedResult)}`);\n return {\n ...allResults,\n [convSource]: updatedResult\n };\n }, {});\n\n debugData(`RESULTS: ${JSON.stringify(results)}`);\n const editedf884s = editFields(f884Melindas, results);\n\n debug(`Edited fields (${editedf884s.length})`);\n //debugData(inspect(editedf884s, {depth: 3}));\n debugData(`${JSON.stringify(editedf884s)}`);\n\n // We update each field based on the results we got from fields\n // Note: we do not add $g:s or $k:s if the field doesn't have them\n function editFields(fields, results) {\n debug(`EDITING FIELDS (${fields.length})`);\n const editedFields = fields.map((field) => {\n const convSource = `${findConversion(field)}:${findSource(field)}`;\n debug(`Looking for: ${convSource}`);\n\n if (convSource && results[convSource]) {\n debugData(`Found: ${JSON.stringify(results[convSource])}`);\n const firstDate = results[convSource].firstDate && results[convSource].firstDate !== '00000000' ? results[convSource].firstDate : '';\n const lastDate = results[convSource].lastDate && results[convSource].lastDate !== '00000000' ? results[convSource].lastDate : '';\n\n const source = results[convSource].source && results[convSource].source !== 'NO_SOURCE' ? results[convSource].source : '';\n const hash = results[convSource].hash && results[convSource].hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? results[convSource].hash : '';\n\n const sfGAll = firstDate === lastDate ? `${firstDate}` : `${firstDate} - ${lastDate}`;\n debugData(`EditedDates: ${sfGAll}`);\n const sfKAll = `${source}:${hash}`;\n\n const sfG = sfGAll.replace(/^ - /u, '').replace(/ - $/u, '');\n const sfK = sfKAll.replace(/^:/u, '').replace(/:$/u, '');\n\n return {\n ...field,\n subfields: field.subfields.map(subfield => {\n\n // we don't get $g or $k if the original field doesn't have them\n if (subfield.code === 'g') {\n return {\n code: subfield.code,\n value: sfG\n };\n }\n\n if (subfield.code === 'k') {\n return {\n code: subfield.code,\n value: sfK\n };\n }\n\n return subfield;\n })\n\n };\n }\n debug(`Not found: ${convSource}`);\n return field;\n });\n return editedFields;\n }\n\n // we'll need to uniq these too\n\n const uniq884s = uniqFields(editedf884s);\n debug(`UniqFields (${uniq884s.length})`);\n debugData(inspect(uniq884s, {depth: 3}));\n\n\n function uniqFields(fields) {\n return fields.reduce((uniq, field) => {\n if (!uniq.some(f => MarcRecord.isEqual(f, field))) { // eslint-disable-line functional/no-conditional-statements\n uniq.push(field); // eslint-disable-line functional/immutable-data\n }\n\n return uniq;\n }, []);\n }\n // Replace original Melinda-f884s with remaining Melinda-f884s\n // NOTE: this sorts MELINDA-f884s after possible other f884s\n newRecord.removeFields(f884Melindas);\n newRecord.insertFields(uniq884s);\n\n return newRecord;\n\n\n // Find conversion:source pairs\n // Find first date\n // Find last date and last hash\n\n\n function findConversion(f884) {\n const [sfA] = f884.subfields.filter((subfield) => subfield.code === 'a').map(subfield => subfield.value);\n const conversion = sfA;\n debugData(`Conversion: \"${conversion}\"`);\n return conversion;\n }\n\n function findSource(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const source = sfK.replace(/:.*$/u, '');\n if (source && source.length !== 64) {\n debugData(`Source: \"${source}\"`);\n return source;\n }\n const emptySource = 'NO_SOURCE';\n debugData(`Source: \"${emptySource}\"`);\n return emptySource;\n }\n\n function findHash(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const hash = sfK.replace(/^.*:/u, '');\n if (hash && hash.length === 64) {\n debugData(`Hash: \"${hash}\"`);\n return hash;\n }\n const emptyHash = '0000000000000000000000000000000000000000000000000000000000000000';\n debugData(`Hash: \"${emptyHash}\"`);\n return emptyHash;\n }\n\n function findDates(f884) {\n const [sfG] = f884.subfields.filter((subfield) => subfield.code === 'g').map(subfield => subfield.value);\n if (sfG && (/ - /u).test(sfG)) {\n const firstDate = sfG.replace(/ - .*$/u, '').padStart(8, '0');\n const lastDate = sfG.replace(/^.* - /u, '').padStart(8, '0');\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n const firstDate = sfG ? sfG.padStart(8, '0') : '00000000';\n const lastDate = sfG ? sfG.padStart(8, '0') : '00000000';\n\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n\n}\n"],"mappings":";;;;;;;AA4BA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAEA,IAAAG,KAAA,GAAAH,OAAA;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;;AAIA;;AAGO,SAASI,UAAUA,CAACC,SAAS,EAAEC,OAAO,EAAE;EAC7C,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,yDAAyD,CAAC;EAC1F,MAAMC,SAAS,GAAGF,KAAK,CAACG,MAAM,CAAC,MAAM,CAAC;EAEtC,IAAIJ,OAAO,KAAK,IAAI,EAAE;IACpBC,KAAK,CAAE,0CAAyC,CAAC;IACjD,OAAOF,SAAS;EAClB;EAEAE,KAAK,CAAE,0BAAyB,CAAC;EACjCE,SAAS,CAAE,2BAA0BE,IAAI,CAACC,SAAS,CAACN,OAAO,CAAE,EAAC,CAAC;;EAE/D;EACA,MAAMO,aAAa,GAAGC,CAAC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,IAAID,CAAC,CAACE,SAAS,CAACC,IAAI,CAAC,CAAC;IAACC,IAAI;IAAEC;EAAK,CAAC,KAAKD,IAAI,KAAK,GAAG,IAAIC,KAAK,KAAK,SAAS,CAAC;EAEtH,MAAMC,YAAY,GAAGf,SAAS,CAACgB,MAAM,CAACC,MAAM,CAACT,aAAa,CAAC;EAC3DJ,SAAS,CAAE,oBAAmBW,YAAY,CAACG,MAAO,QAAOZ,IAAI,CAACC,SAAS,CAACQ,YAAY,CAAE,EAAC,CAAC;EACxF;;EAEA,IAAIA,YAAY,CAACG,MAAM,GAAG,CAAC,EAAE;IAC3BhB,KAAK,CAAE,yCAAwCa,YAAY,CAACG,MAAO,GAAE,CAAC;IACtE,OAAOlB,SAAS;EAClB;;EAEA;EACA,MAAMmB,OAAO,GAAGJ,YAAY,CAACK,MAAM,CAAC,CAACC,UAAU,EAAEC,IAAI,EAAEC,KAAK,KAAK;IAC/DnB,SAAS,CAAE,gBAAeE,IAAI,CAACC,SAAS,CAACc,UAAU,CAAE,EAAC,CAAC;IACvD;IACAjB,SAAS,CAAE,oBAAmBmB,KAAM,OAAMjB,IAAI,CAACC,SAAS,CAACe,IAAI,CAAE,EAAC,CAAC;IAEjE,MAAME,UAAU,GAAGC,cAAc,CAACH,IAAI,CAAC;IACvC,MAAMI,MAAM,GAAGC,UAAU,CAACL,IAAI,CAAC;IAC/B,MAAMM,UAAU,GAAI,GAAEJ,UAAW,IAAGE,MAAO,EAAC;IAC5C,MAAM;MAACG,SAAS;MAAEC;IAAQ,CAAC,GAAGC,SAAS,CAACT,IAAI,CAAC;IAC7C,MAAMU,IAAI,GAAGC,QAAQ,CAACX,IAAI,CAAC;;IAE3B;IACA,MAAMY,UAAU,GAAGb,UAAU,CAACO,UAAU,CAAC;IACzCxB,SAAS,CAACE,IAAI,CAACC,SAAS,CAAC2B,UAAU,CAAC,CAAC;;IAErC;IACA,IAAI,CAACA,UAAU,EAAE;MACfhC,KAAK,CAAE,wBAAuB0B,UAAW,aAAY,CAAC;MACtD,MAAMO,SAAS,GAAG;QAChBX,UAAU;QACVE,MAAM;QACNG,SAAS;QACTC,QAAQ;QACRE;MACF,CAAC;MACD5B,SAAS,CAAE,iBAAgBE,IAAI,CAACC,SAAS,CAAC4B,SAAS,CAAE,EAAC,CAAC;MACvD,OAAO;QACL,GAAGd,UAAU;QACb,CAACO,UAAU,GAAGO;MAChB,CAAC;IACH;IACA;IACAjC,KAAK,CAAE,qBAAoB0B,UAAW,EAAC,CAAC;IACxCxB,SAAS,CAAE,qBAAoBE,IAAI,CAACC,SAAS,CAAC2B,UAAU,CAAE,EAAC,CAAC;IAE5D,MAAME,aAAa,GAAG;MACpB,GAAGF,UAAU;MACbL,SAAS,EAAEK,UAAU,CAACL,SAAS,GAAGA,SAAS,IAAIA,SAAS,KAAK,UAAU,GAAGA,SAAS,GAAGK,UAAU,CAACL,SAAS;MAC1GC,QAAQ,EAAEI,UAAU,CAACJ,QAAQ,GAAGA,QAAQ,GAAGA,QAAQ,GAAGI,UAAU,CAACJ,QAAQ;MACzEE,IAAI,EAAEE,UAAU,CAACJ,QAAQ,GAAGA,QAAQ,IAAIA,QAAQ,KAAK,UAAU,IAAIE,IAAI,KAAK,kEAAkE,GAAGA,IAAI,GAAGE,UAAU,CAACF;IACrK,CAAC;IACD5B,SAAS,CAAE,qBAAoBE,IAAI,CAACC,SAAS,CAAC6B,aAAa,CAAE,EAAC,CAAC;IAC/D,OAAO;MACL,GAAGf,UAAU;MACb,CAACO,UAAU,GAAGQ;IAChB,CAAC;EACH,CAAC,EAAE,CAAC,CAAC,CAAC;EAENhC,SAAS,CAAE,YAAWE,IAAI,CAACC,SAAS,CAACY,OAAO,CAAE,EAAC,CAAC;EAChD,MAAMkB,WAAW,GAAGC,UAAU,CAACvB,YAAY,EAAEI,OAAO,CAAC;EAErDjB,KAAK,CAAE,kBAAiBmC,WAAW,CAACnB,MAAO,GAAE,CAAC;EAC9C;EACAd,SAAS,CAAE,GAAEE,IAAI,CAACC,SAAS,CAAC8B,WAAW,CAAE,EAAC,CAAC;;EAE3C;EACA;EACA,SAASC,UAAUA,CAACtB,MAAM,EAAEG,OAAO,EAAE;IACnCjB,KAAK,CAAE,mBAAkBc,MAAM,CAACE,MAAO,GAAE,CAAC;IAC1C,MAAMqB,YAAY,GAAGvB,MAAM,CAACwB,GAAG,CAAEC,KAAK,IAAK;MACzC,MAAMb,UAAU,GAAI,GAAEH,cAAc,CAACgB,KAAK,CAAE,IAAGd,UAAU,CAACc,KAAK,CAAE,EAAC;MAClEvC,KAAK,CAAE,gBAAe0B,UAAW,EAAC,CAAC;MAEnC,IAAIA,UAAU,IAAIT,OAAO,CAACS,UAAU,CAAC,EAAE;QACrCxB,SAAS,CAAE,UAASE,IAAI,CAACC,SAAS,CAACY,OAAO,CAACS,UAAU,CAAC,CAAE,EAAC,CAAC;QAC1D,MAAMC,SAAS,GAAGV,OAAO,CAACS,UAAU,CAAC,CAACC,SAAS,IAAIV,OAAO,CAACS,UAAU,CAAC,CAACC,SAAS,KAAK,UAAU,GAAGV,OAAO,CAACS,UAAU,CAAC,CAACC,SAAS,GAAG,EAAE;QACpI,MAAMC,QAAQ,GAAGX,OAAO,CAACS,UAAU,CAAC,CAACE,QAAQ,IAAIX,OAAO,CAACS,UAAU,CAAC,CAACE,QAAQ,KAAK,UAAU,GAAGX,OAAO,CAACS,UAAU,CAAC,CAACE,QAAQ,GAAG,EAAE;QAEhI,MAAMJ,MAAM,GAAGP,OAAO,CAACS,UAAU,CAAC,CAACF,MAAM,IAAIP,OAAO,CAACS,UAAU,CAAC,CAACF,MAAM,KAAK,WAAW,GAAGP,OAAO,CAACS,UAAU,CAAC,CAACF,MAAM,GAAG,EAAE;QACzH,MAAMM,IAAI,GAAGb,OAAO,CAACS,UAAU,CAAC,CAACI,IAAI,IAAIb,OAAO,CAACS,UAAU,CAAC,CAACI,IAAI,KAAK,kEAAkE,GAAGb,OAAO,CAACS,UAAU,CAAC,CAACI,IAAI,GAAG,EAAE;QAExK,MAAMU,MAAM,GAAGb,SAAS,KAAKC,QAAQ,GAAI,GAAED,SAAU,EAAC,GAAI,GAAEA,SAAU,MAAKC,QAAS,EAAC;QACrF1B,SAAS,CAAE,gBAAesC,MAAO,EAAC,CAAC;QACnC,MAAMC,MAAM,GAAI,GAAEjB,MAAO,IAAGM,IAAK,EAAC;QAElC,MAAMY,GAAG,GAAGF,MAAM,CAACG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,MAAMC,GAAG,GAAGH,MAAM,CAACE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAExD,OAAO;UACL,GAAGJ,KAAK;UACR9B,SAAS,EAAE8B,KAAK,CAAC9B,SAAS,CAAC6B,GAAG,CAACO,QAAQ,IAAI;YAEzC;YACA,IAAIA,QAAQ,CAAClC,IAAI,KAAK,GAAG,EAAE;cACzB,OAAO;gBACLA,IAAI,EAAEkC,QAAQ,CAAClC,IAAI;gBACnBC,KAAK,EAAE8B;cACT,CAAC;YACH;YAEA,IAAIG,QAAQ,CAAClC,IAAI,KAAK,GAAG,EAAE;cACzB,OAAO;gBACLA,IAAI,EAAEkC,QAAQ,CAAClC,IAAI;gBACnBC,KAAK,EAAEgC;cACT,CAAC;YACH;YAEA,OAAOC,QAAQ;UACjB,CAAC;QAEH,CAAC;MACH;MACA7C,KAAK,CAAE,cAAa0B,UAAW,EAAC,CAAC;MACjC,OAAOa,KAAK;IACd,CAAC,CAAC;IACF,OAAOF,YAAY;EACrB;;EAEA;;EAEA,MAAMS,QAAQ,GAAGC,UAAU,CAACZ,WAAW,CAAC;EACxCnC,KAAK,CAAE,eAAc8C,QAAQ,CAAC9B,MAAO,GAAE,CAAC;EACxCd,SAAS,CAAC,IAAA8C,aAAO,EAACF,QAAQ,EAAE;IAACG,KAAK,EAAE;EAAC,CAAC,CAAC,CAAC;EAGxC,SAASF,UAAUA,CAACjC,MAAM,EAAE;IAC1B,OAAOA,MAAM,CAACI,MAAM,CAAC,CAACgC,IAAI,EAAEX,KAAK,KAAK;MACpC,IAAI,CAACW,IAAI,CAACxC,IAAI,CAACH,CAAC,IAAI4C,sBAAU,CAACC,OAAO,CAAC7C,CAAC,EAAEgC,KAAK,CAAC,CAAC,EAAE;QAAE;QACnDW,IAAI,CAACG,IAAI,CAACd,KAAK,CAAC,CAAC,CAAC;MACpB;MAEA,OAAOW,IAAI;IACb,CAAC,EAAE,EAAE,CAAC;EACR;EACA;EACA;EACApD,SAAS,CAACwD,YAAY,CAACzC,YAAY,CAAC;EACpCf,SAAS,CAACyD,YAAY,CAACT,QAAQ,CAAC;EAEhC,OAAOhD,SAAS;;EAGhB;EACA;EACA;;EAGA,SAASyB,cAAcA,CAACH,IAAI,EAAE;IAC5B,MAAM,CAACoC,GAAG,CAAC,GAAGpC,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,MAAMU,UAAU,GAAGkC,GAAG;IACtBtD,SAAS,CAAE,gBAAeoB,UAAW,GAAE,CAAC;IACxC,OAAOA,UAAU;EACnB;EAEA,SAASG,UAAUA,CAACL,IAAI,EAAE;IACxB,MAAM,CAACwB,GAAG,CAAC,GAAGxB,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,MAAMY,MAAM,GAAGoB,GAAG,CAACD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACvC,IAAInB,MAAM,IAAIA,MAAM,CAACR,MAAM,KAAK,EAAE,EAAE;MAClCd,SAAS,CAAE,YAAWsB,MAAO,GAAE,CAAC;MAChC,OAAOA,MAAM;IACf;IACA,MAAMiC,WAAW,GAAG,WAAW;IAC/BvD,SAAS,CAAE,YAAWuD,WAAY,GAAE,CAAC;IACrC,OAAOA,WAAW;EACpB;EAEA,SAAS1B,QAAQA,CAACX,IAAI,EAAE;IACtB,MAAM,CAACwB,GAAG,CAAC,GAAGxB,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,MAAMkB,IAAI,GAAGc,GAAG,CAACD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACrC,IAAIb,IAAI,IAAIA,IAAI,CAACd,MAAM,KAAK,EAAE,EAAE;MAC9Bd,SAAS,CAAE,UAAS4B,IAAK,GAAE,CAAC;MAC5B,OAAOA,IAAI;IACb;IACA,MAAM4B,SAAS,GAAG,kEAAkE;IACpFxD,SAAS,CAAE,UAASwD,SAAU,GAAE,CAAC;IACjC,OAAOA,SAAS;EAClB;EAEA,SAAS7B,SAASA,CAACT,IAAI,EAAE;IACvB,MAAM,CAACsB,GAAG,CAAC,GAAGtB,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,IAAI8B,GAAG,IAAK,MAAM,CAAEiB,IAAI,CAACjB,GAAG,CAAC,EAAE;MAC7B,MAAMf,SAAS,GAAGe,GAAG,CAACC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAACiB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;MAC7D,MAAMhC,QAAQ,GAAGc,GAAG,CAACC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAACiB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;MAC5D1D,SAAS,CAAE,eAAcyB,SAAU,iBAAgBC,QAAS,GAAE,CAAC;MAC/D,OAAO;QAACD,SAAS;QAAEC;MAAQ,CAAC;IAC9B;IACA,MAAMD,SAAS,GAAGe,GAAG,GAAGA,GAAG,CAACkB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU;IACzD,MAAMhC,QAAQ,GAAGc,GAAG,GAAGA,GAAG,CAACkB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU;IAExD1D,SAAS,CAAE,eAAcyB,SAAU,iBAAgBC,QAAS,GAAE,CAAC;IAC/D,OAAO;MAACD,SAAS;MAAEC;IAAQ,CAAC;EAC9B;AAEF"}
@@ -110,7 +110,6 @@ function replacePrefix(record, options) {
110
110
  subfield.value = subfield.value.replace(pattern, replacement); // eslint-disable-line functional/immutable-data
111
111
  });
112
112
  });
113
-
114
113
  return record;
115
114
  }
116
115
  function generateMissingSIDs(record, options) {
@@ -1 +1 @@
1
- {"version":3,"file":"fix.js","names":["_marcRecord","require","_melindaBackendCommons","_debug","_interopRequireDefault","_fixHandleTempurns","_fixStripF884s","_fixConstants","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","logger","createLogger","debug","createDebugLogger","debugData","extend","fixRecord","record","settings","verbose","JSON","stringify","newRecord","MarcRecord","clone","subfieldValues","generateMissingSIDsOptions","generateMissingSIDs","undefined","newRecord1","replacePrefixesOptions","replacePrefixes","newRecord2","replaceAllPrefixes","newRecord3","handleTempUrns","newRecord4","stripF884s","toObject","length","options","replacePrefix","oldPrefix","newPrefix","prefixReplaceCodes","pattern","replacement","getDatafields","field","subfields","filter","code","includes","subfield","value","replace","f035Filters","fSIDFilters","f035s","f035ToSidInfo","fSIDs","sidsToSidInfo","sidsToBeAdded","genNewSids","f035SidInfo","some","fSIDInfo","SID","sidField","insertField","map","sidInfo","tag","ind1","ind2","SIDs","flatMap","sub","wantedSub","regexp","test","findIndex","slice","indexOf"],"sources":["../../src/helpers/fix.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 {MarcRecord} from '@natlibfi/marc-record';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport createDebugLogger from 'debug';\n\nimport {handleTempUrns} from './fix-handle-tempurns';\nimport {stripF884s} from './fix-strip-f884s';\n\nexport * from './fix-constants';\n\nconst logger = createLogger();\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord');\nconst debugData = debug.extend('data');\n\nexport function fixRecord(record, settings = {}) {\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 // We should handle these in some prettier way ...\n\n // Fix 1, generate SIDs\n const generateMissingSIDsOptions = settings.generateMissingSIDs || undefined;\n const newRecord1 = generateMissingSIDs(newRecord, generateMissingSIDsOptions);\n\n // Fix 2, replace identifier prefixes\n const replacePrefixesOptions = settings.replacePrefixes || [];\n const newRecord2 = replaceAllPrefixes(newRecord1, replacePrefixesOptions);\n\n // Fix 3, handle temporary URNs from legal deposit record import\n const newRecord3 = handleTempUrns(newRecord2, settings.handleTempUrns);\n\n // Fix 4, strip extra field 884s\n const newRecord4 = stripF884s(newRecord3, settings.stripF884s);\n\n return newRecord4.toObject();\n\n}\n\n\nfunction replaceAllPrefixes(record, replacePrefixesOptions) {\n if (replacePrefixesOptions.length < 1) {\n debug(`NOT running replacePrefixes, no options`);\n return record;\n }\n\n debug(`Running replacePrefixes fixer`);\n debugData(`replacePrefixesOptions: ${JSON.stringify(replacePrefixesOptions)}`);\n\n replacePrefixesOptions.forEach(options => {\n replacePrefix(record, options);\n });\n return record;\n}\n\n\n// Replace prefix in all specified subfields\nfunction replacePrefix(record, 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 record.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 return record;\n}\n\n\nfunction generateMissingSIDs(record, 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(`NOT running generateMissingsSIDs, no options`);\n return record;\n }\n\n debug(`Running generateMissingSIDs fixer`);\n debugData(`generateMissingSIDs options: ${JSON.stringify(options)}`);\n\n const f035s = f035ToSidInfo(record.get(/^035$/u));\n const fSIDs = sidsToSidInfo(record.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 debugData(`Adding (${sidsToBeAdded.length}) SIDs: ${JSON.stringify(sidsToBeAdded)}`);\n\n // Add new SIDs\n sidsToBeAdded.forEach(sidField => record.insertField(sidField));\n return record;\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"],"mappings":"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"}
1
+ {"version":3,"file":"fix.js","names":["_marcRecord","require","_melindaBackendCommons","_debug","_interopRequireDefault","_fixHandleTempurns","_fixStripF884s","_fixConstants","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","logger","createLogger","debug","createDebugLogger","debugData","extend","fixRecord","record","settings","verbose","JSON","stringify","newRecord","MarcRecord","clone","subfieldValues","generateMissingSIDsOptions","generateMissingSIDs","undefined","newRecord1","replacePrefixesOptions","replacePrefixes","newRecord2","replaceAllPrefixes","newRecord3","handleTempUrns","newRecord4","stripF884s","toObject","length","options","replacePrefix","oldPrefix","newPrefix","prefixReplaceCodes","pattern","replacement","getDatafields","field","subfields","filter","code","includes","subfield","value","replace","f035Filters","fSIDFilters","f035s","f035ToSidInfo","fSIDs","sidsToSidInfo","sidsToBeAdded","genNewSids","f035SidInfo","some","fSIDInfo","SID","sidField","insertField","map","sidInfo","tag","ind1","ind2","SIDs","flatMap","sub","wantedSub","regexp","test","findIndex","slice","indexOf"],"sources":["../../src/helpers/fix.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 {MarcRecord} from '@natlibfi/marc-record';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport createDebugLogger from 'debug';\n\nimport {handleTempUrns} from './fix-handle-tempurns';\nimport {stripF884s} from './fix-strip-f884s';\n\nexport * from './fix-constants';\n\nconst logger = createLogger();\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord');\nconst debugData = debug.extend('data');\n\nexport function fixRecord(record, settings = {}) {\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 // We should handle these in some prettier way ...\n\n // Fix 1, generate SIDs\n const generateMissingSIDsOptions = settings.generateMissingSIDs || undefined;\n const newRecord1 = generateMissingSIDs(newRecord, generateMissingSIDsOptions);\n\n // Fix 2, replace identifier prefixes\n const replacePrefixesOptions = settings.replacePrefixes || [];\n const newRecord2 = replaceAllPrefixes(newRecord1, replacePrefixesOptions);\n\n // Fix 3, handle temporary URNs from legal deposit record import\n const newRecord3 = handleTempUrns(newRecord2, settings.handleTempUrns);\n\n // Fix 4, strip extra field 884s\n const newRecord4 = stripF884s(newRecord3, settings.stripF884s);\n\n return newRecord4.toObject();\n\n}\n\n\nfunction replaceAllPrefixes(record, replacePrefixesOptions) {\n if (replacePrefixesOptions.length < 1) {\n debug(`NOT running replacePrefixes, no options`);\n return record;\n }\n\n debug(`Running replacePrefixes fixer`);\n debugData(`replacePrefixesOptions: ${JSON.stringify(replacePrefixesOptions)}`);\n\n replacePrefixesOptions.forEach(options => {\n replacePrefix(record, options);\n });\n return record;\n}\n\n\n// Replace prefix in all specified subfields\nfunction replacePrefix(record, 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 record.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 return record;\n}\n\n\nfunction generateMissingSIDs(record, 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(`NOT running generateMissingsSIDs, no options`);\n return record;\n }\n\n debug(`Running generateMissingSIDs fixer`);\n debugData(`generateMissingSIDs options: ${JSON.stringify(options)}`);\n\n const f035s = f035ToSidInfo(record.get(/^035$/u));\n const fSIDs = sidsToSidInfo(record.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 debugData(`Adding (${sidsToBeAdded.length}) SIDs: ${JSON.stringify(sidsToBeAdded)}`);\n\n // Add new SIDs\n sidsToBeAdded.forEach(sidField => record.insertField(sidField));\n return record;\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"],"mappings":"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"}
package/dist/mongo.js CHANGED
@@ -43,6 +43,7 @@ var _mongoSanitize = _interopRequireDefault(require("mongo-sanitize"));
43
43
  */
44
44
 
45
45
  //import isDeepStrictEqual from 'util';
46
+
46
47
  /* QueueItem:
47
48
  {
48
49
  "correlationId":"FOO",
@@ -71,6 +72,7 @@ var _mongoSanitize = _interopRequireDefault(require("mongo-sanitize"));
71
72
  "modificationTime":"2020-01-01T00:00:01.000Z",
72
73
  }
73
74
  */
75
+
74
76
  async function _default(MONGO_URI, collection) {
75
77
  const logger = (0, _melindaBackendCommons.createLogger)();
76
78
 
@@ -664,7 +666,6 @@ async function _default(MONGO_URI, collection) {
664
666
  return result.ok;
665
667
  // logger.debug(JSON.stringify(result));
666
668
  }
667
-
668
669
  async function setOperations({
669
670
  correlationId,
670
671
  addOperation,
@@ -697,7 +698,6 @@ async function _default(MONGO_URI, collection) {
697
698
  return result.ok;
698
699
  // logger.debug(JSON.stringify(result));
699
700
  }
700
-
701
701
  async function addBlobSize({
702
702
  correlationId
703
703
  }) {
package/dist/mongo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","records","errorMessage","errorStatus","creationTime","modificationTime","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","payload","message","logError","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","JSON","stringify","limit","skip","rest","find","projection","createProjection","parseInt","toArray","length","silly","showAll","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","_id","showParamToField","Object","keys","filter","param","map","excludeObject","fromEntries","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","clean","sanitize","noContent","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n/**\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-2023 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, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\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 gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await db.collection(collection).find(rest, {projection: createProjection(showParams)})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n logger.silly(`${JSON.stringify(result)}`);\n return result;\n }\n\n // We default to NOT showing operations, operationSettings, recordLoadParams and importJobState when a queueItem is queried\n // These can all be shown with showAll\n // Single fields can be shown by showOperation, showOperationSettings, showRecordLoadParams and showImportJobState\n\n function createProjection(showParams = {}) {\n logger.silly(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n\n if (showAll) {\n return {\n _id: 0\n };\n }\n\n const showParamToField = {\n 'showOperations': 'operations',\n 'showOperationSettings': 'operationSettings',\n 'showRecordLoadParams': 'recordLoadParams',\n 'showImportJobState': 'importJobState'\n };\n\n const result = Object.keys(showParams)\n .filter(param => param !== 'showAll' && showParams[param] !== true && showParams[param] !== 1)\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.silly(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.silly(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n\n return {\n _id: 0,\n ...excludeObject\n };\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","records","errorMessage","errorStatus","creationTime","modificationTime","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","payload","message","logError","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","JSON","stringify","limit","skip","rest","find","projection","createProjection","parseInt","toArray","length","silly","showAll","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","_id","showParamToField","Object","keys","filter","param","map","excludeObject","fromEntries","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","clean","sanitize","noContent","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n/**\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-2023 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, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\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 gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await db.collection(collection).find(rest, {projection: createProjection(showParams)})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n logger.silly(`${JSON.stringify(result)}`);\n return result;\n }\n\n // We default to NOT showing operations, operationSettings, recordLoadParams and importJobState when a queueItem is queried\n // These can all be shown with showAll\n // Single fields can be shown by showOperation, showOperationSettings, showRecordLoadParams and showImportJobState\n\n function createProjection(showParams = {}) {\n logger.silly(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n\n if (showAll) {\n return {\n _id: 0\n };\n }\n\n const showParamToField = {\n 'showOperations': 'operations',\n 'showOperationSettings': 'operationSettings',\n 'showRecordLoadParams': 'recordLoadParams',\n 'showImportJobState': 'importJobState'\n };\n\n const result = Object.keys(showParams)\n .filter(param => param !== 'showAll' && showParams[param] !== true && showParams[param] !== 1)\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.silly(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.silly(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n\n return {\n _id: 0,\n ...excludeObject\n };\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\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": "4.0.19-alpha.3",
17
+ "version": "4.0.20-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=18"
@@ -24,18 +24,16 @@
24
24
  },
25
25
  "scripts": {
26
26
  "prepare": "npm run build",
27
+ "build": "babel src --source-maps --copy-files --delete-dir-on-start --out-dir=dist",
27
28
  "lint": "eslint ./src",
28
29
  "lint:dev": "eslint ./src --fix",
29
- "test": "npm run lint && npm run test:base -- src/**/*.spec.js src/*.spec.js",
30
- "test:dev": "npm run lint:dev && npm run test:base -- src/**/*.spec.js",
30
+ "test": "npm run lint && npm run test:base",
31
31
  "test:base": "cross-env NODE_ENV=test nyc mocha --package ./package.json --exclude src/amqp.health.spec.js --exclude src/amqp.tests.spec.js",
32
+ "test:dev": "npm run lint:dev && cross-env NODE_ENV=test nyc mocha --package ./package.json --exclude src/amqp.health.spec.js --exclude src/amqp.tests.spec.js",
32
33
  "test:local": "cross-env NODE_ENV=test nyc mocha --package ./package.json -- src/amqp.*.spec.js",
33
34
  "test:healthcheck": "cross-env NODE_ENV=test nyc mocha --require @babel/register -- src/amqp.health.spec.js",
34
- "coverage": "npm run cover:unit && npm run cover:report",
35
- "cover:unit": "nyc --silent npm run test",
36
- "cover:report": "nyc report --reporter=lcov --reporter=text",
37
- "dev": "NODE_ENV=development cross-env DEBUG='@natlibfi/*' nodemon",
38
- "build": "babel src --source-maps --copy-files --delete-dir-on-start --out-dir=dist"
35
+ "dev": "nodemon",
36
+ "dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test nodemon"
39
37
  },
40
38
  "dependencies": {
41
39
  "@natlibfi/marc-record": "^8.0.0",
@@ -56,6 +54,7 @@
56
54
  "@babel/core": "^7.23.2",
57
55
  "@babel/plugin-transform-runtime": "^7.23.2",
58
56
  "@babel/preset-env": "^7.23.2",
57
+ "@babel/register": "^7.22.15",
59
58
  "@natlibfi/eslint-config-melinda-backend": "^3.0.2",
60
59
  "@natlibfi/fixugen": "^2.0.2",
61
60
  "@natlibfi/fixura": "^3.0.2",
@@ -97,7 +96,8 @@
97
96
  },
98
97
  "mocha": {
99
98
  "spec": [
100
- "src/*.spec.js"
99
+ "src/*.spec.js",
100
+ "src/**/*.spec.js"
101
101
  ],
102
102
  "require": [
103
103
  "@babel/register"
@@ -107,29 +107,26 @@
107
107
  "bail": true,
108
108
  "exit": true
109
109
  },
110
+ "nodemonConfig": {
111
+ "exec": "npm run test:dev",
112
+ "watch": [
113
+ "src/*",
114
+ "test-fixtures/*"
115
+ ]
116
+ },
110
117
  "nyc": {
111
118
  "exclude": [
112
- "**/*.spec.js"
119
+ "src/*.spec.js",
120
+ "src/**/*.spec.js"
113
121
  ],
114
122
  "reporter": [
115
123
  "text"
116
124
  ],
117
- "require": [
118
- "@babel/register"
119
- ],
120
125
  "sourceMap": false,
121
126
  "instrument": false,
122
127
  "lines": 80,
123
128
  "statements": 80,
124
129
  "functions": 80,
125
130
  "branches": 80
126
- },
127
- "nodemonConfig": {
128
- "exec": "npm run test:dev",
129
- "watch": [
130
- "src/*"
131
- ],
132
- "ext": "js",
133
- "delay": 2.5
134
131
  }
135
132
  }