@natlibfi/melinda-rest-api-commons 4.0.4-alpha.2 → 4.0.5-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.
@@ -1 +1 @@
1
- {"version":3,"file":"amqp.health.spec.js","names":["_debug","_interopRequireDefault","require","_index","_util","obj","__esModule","default","debug","createDebugLogger","setTimeoutPromise","promisify","setTimeout","describe","it","amqpUrl","amqpOperator","amqpFactory","awaitTime","closeConnection","close","closeChannel"],"sources":["../src/amqp.health.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 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 {expect} from 'chai';\nimport createDebugLogger from 'debug';\nimport {amqpFactory} from './index';\n\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:amqp:test');\n//const debugData = debug.extend('data');\n\nimport {promisify} from 'util';\nconst setTimeoutPromise = promisify(setTimeout);\n\ndescribe('HealthCheck: amqpOperator should error if channel or connection fails', () => {\n\n it('FIX: test healthCheck - this test does not really test anything, but error can be seen in debug!', async () => {\n debug(`Testing amqp against a local AMQP instance - we'll need some kind of mockup for this`);\n const amqpUrl = 'amqp://127.0.0.1:5672/';\n\n const amqpOperator = await amqpFactory(amqpUrl, true);\n debug(`Connecting to ${amqpUrl}, with healthCheck running`);\n await awaitTime(amqpOperator, false);\n\n debug(`Testing healthCheckLoop for ${amqpOperator}`);\n debug(`Waiting 0.5s and expecting healthCheckLoop to work`);\n await awaitTime(amqpOperator, false);\n debug(`Amqp Operator should have been alive.`);\n\n debug(`Testing healthCheckLoop with closed channel`);\n debug(`Waiting 0.5s and expecting healthCheckLoop to throw error`);\n await awaitTime(amqpOperator, true);\n debug(`Amqp Operator should have been errored.`);\n\n debug(`Closing connection`);\n await amqpOperator.closeConnection();\n\n async function awaitTime(amqpOperator, close) {\n if (close) {\n await amqpOperator.closeChannel();\n await setTimeoutPromise(500);\n return;\n }\n\n await setTimeoutPromise(500);\n return;\n }\n\n });\n});\n\n"],"mappings":";;AA6BA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAMA,IAAAE,KAAA,GAAAF,OAAA;AAA+B,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AApC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAKA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,8CAA8C,CAAC;AAC/E;;AAGA,MAAMC,iBAAiB,GAAG,IAAAC,eAAS,EAACC,UAAU,CAAC;AAE/CC,QAAQ,CAAC,uEAAuE,EAAE,MAAM;EAEtFC,EAAE,CAAC,kGAAkG,EAAE,YAAY;IACjHN,KAAK,CAAE,sFAAqF,CAAC;IAC7F,MAAMO,OAAO,GAAG,wBAAwB;IAExC,MAAMC,YAAY,GAAG,MAAM,IAAAC,kBAAW,EAACF,OAAO,EAAE,IAAI,CAAC;IACrDP,KAAK,CAAE,iBAAgBO,OAAQ,4BAA2B,CAAC;IAC3D,MAAMG,SAAS,CAACF,YAAY,EAAE,KAAK,CAAC;IAEpCR,KAAK,CAAE,+BAA8BQ,YAAa,EAAC,CAAC;IACpDR,KAAK,CAAE,oDAAmD,CAAC;IAC3D,MAAMU,SAAS,CAACF,YAAY,EAAE,KAAK,CAAC;IACpCR,KAAK,CAAE,uCAAsC,CAAC;IAE9CA,KAAK,CAAE,6CAA4C,CAAC;IACpDA,KAAK,CAAE,2DAA0D,CAAC;IAClE,MAAMU,SAAS,CAACF,YAAY,EAAE,IAAI,CAAC;IACnCR,KAAK,CAAE,yCAAwC,CAAC;IAEhDA,KAAK,CAAE,oBAAmB,CAAC;IAC3B,MAAMQ,YAAY,CAACG,eAAe,EAAE;IAEpC,eAAeD,SAASA,CAACF,YAAY,EAAEI,KAAK,EAAE;MAC5C,IAAIA,KAAK,EAAE;QACT,MAAMJ,YAAY,CAACK,YAAY,EAAE;QACjC,MAAMX,iBAAiB,CAAC,GAAG,CAAC;QAC5B;MACF;MAEA,MAAMA,iBAAiB,CAAC,GAAG,CAAC;MAC5B;IACF;EAEF,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"amqp.health.spec.js","names":["_debug","_interopRequireDefault","require","_index","_util","obj","__esModule","default","debug","createDebugLogger","setTimeoutPromise","promisify","setTimeout","describe","it","amqpUrl","amqpOperator","amqpFactory","awaitTime","closeConnection","close","closeChannel"],"sources":["../src/amqp.health.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 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 {expect} from 'chai';\nimport createDebugLogger from 'debug';\nimport {amqpFactory} from './index';\n\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:amqp:test');\n//const debugData = debug.extend('data');\n\nimport {promisify} from 'util';\nconst setTimeoutPromise = promisify(setTimeout);\n\ndescribe('HealthCheck: amqpOperator should error if channel or connection fails', () => {\n\n it('FIX: test healthCheck - this test does not really test anything, but error can be seen in debug!', async () => {\n debug(`Testing amqp against a local AMQP instance - we'll need some kind of mockup for this`);\n const amqpUrl = 'amqp://127.0.0.1:5672/';\n\n const amqpOperator = await amqpFactory(amqpUrl, true);\n debug(`Connecting to ${amqpUrl}, with healthCheck running`);\n await awaitTime(amqpOperator, false);\n\n debug(`Testing healthCheckLoop for ${amqpOperator}`);\n debug(`Waiting 0.5s and expecting healthCheckLoop to work`);\n await awaitTime(amqpOperator, false);\n debug(`Amqp Operator should have been alive.`);\n\n debug(`Testing healthCheckLoop with closed channel`);\n debug(`Waiting 0.5s and expecting healthCheckLoop to throw error`);\n await awaitTime(amqpOperator, true);\n debug(`Amqp Operator should have been errored.`);\n\n debug(`Closing connection`);\n await amqpOperator.closeConnection();\n\n async function awaitTime(amqpOperator, close) {\n if (close) {\n await amqpOperator.closeChannel();\n await setTimeoutPromise(500);\n return;\n }\n\n await setTimeoutPromise(500);\n return;\n }\n\n });\n});\n\n"],"mappings":";;AA6BA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAMA,IAAAE,KAAA,GAAAF,OAAA;AAA+B,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AApC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAKA,MAAMG,KAAK,GAAG,IAAAC,cAAiB,EAAC,8CAA8C,CAAC;AAC/E;;AAGA,MAAMC,iBAAiB,GAAG,IAAAC,eAAS,EAACC,UAAU,CAAC;AAE/CC,QAAQ,CAAC,uEAAuE,EAAE,MAAM;EAEtFC,EAAE,CAAC,kGAAkG,EAAE,YAAY;IACjHN,KAAK,CAAE,sFAAqF,CAAC;IAC7F,MAAMO,OAAO,GAAG,wBAAwB;IAExC,MAAMC,YAAY,GAAG,MAAM,IAAAC,kBAAW,EAACF,OAAO,EAAE,IAAI,CAAC;IACrDP,KAAK,CAAE,iBAAgBO,OAAQ,4BAA2B,CAAC;IAC3D,MAAMG,SAAS,CAACF,YAAY,EAAE,KAAK,CAAC;IAEpCR,KAAK,CAAE,+BAA8BQ,YAAa,EAAC,CAAC;IACpDR,KAAK,CAAE,oDAAmD,CAAC;IAC3D,MAAMU,SAAS,CAACF,YAAY,EAAE,KAAK,CAAC;IACpCR,KAAK,CAAE,uCAAsC,CAAC;IAE9CA,KAAK,CAAE,6CAA4C,CAAC;IACpDA,KAAK,CAAE,2DAA0D,CAAC;IAClE,MAAMU,SAAS,CAACF,YAAY,EAAE,IAAI,CAAC;IACnCR,KAAK,CAAE,yCAAwC,CAAC;IAEhDA,KAAK,CAAE,oBAAmB,CAAC;IAC3B,MAAMQ,YAAY,CAACG,eAAe,CAAC,CAAC;IAEpC,eAAeD,SAASA,CAACF,YAAY,EAAEI,KAAK,EAAE;MAC5C,IAAIA,KAAK,EAAE;QACT,MAAMJ,YAAY,CAACK,YAAY,CAAC,CAAC;QACjC,MAAMX,iBAAiB,CAAC,GAAG,CAAC;QAC5B;MACF;MAEA,MAAMA,iBAAiB,CAAC,GAAG,CAAC;MAC5B;IACF;EAEF,CAAC,CAAC;AACJ,CAAC,CAAC"}
package/dist/amqp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"amqp.js","names":["_amqplib","_interopRequireDefault","require","_marcRecord","_melindaCommons","_melindaBackendCommons","_debug","_constants","_util","_httpStatus","_utils","obj","__esModule","default","_default","AMQP_URL","runHealthCheck","logger","createLogger","debug","createDebugLogger","debugHC","extend","debugData","connection","amqplib","connect","channel","createChannel","healthCheckLoop","healthCheck","checkQueue","consumeChunk","consumeOne","ackMessages","nackMessages","sendToQueue","removeQueue","messagesToRecords","closeChannel","closeConnection","close","wait","setTimeoutPromise","promisify","setTimeout","assertQueue","durable","error","JSON","stringify","handleAmqpErrors","queue","style","toRecord","purge","errorUndefinedQueue","channelInfo","purgeQueue","verbose","messageCount","checkMessageCount","ApiError","httpStatus","INTERNAL_SERVER_ERROR","messages","getData","headers","getHeaderInfo","length","records","message","get","inspect","colors","maxArrayLength","depth","forEach","properties","correlationId","ack","nack","data","Buffer","from","persistent","errorToThrow","tempChannel","deleteQueue","map","content","parse","toString","MarcRecord","messagesToGet","CHUNK_SIZE","pump","count","results","identifiers","identifier","deliveryTag","fields","includes","concat","undefined","newError","status","payload","logError"],"sources":["../src/amqp.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 amqplib from 'amqplib';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport createDebugLogger from 'debug';\nimport {CHUNK_SIZE} from './constants';\nimport {promisify, inspect} from 'util';\nimport httpStatus from 'http-status';\nimport {logError} from './utils';\n\nexport default async function (AMQP_URL, runHealthCheck = false) {\n const logger = createLogger();\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:amqp');\n const debugHC = debug.extend('HC');\n const debugData = debug.extend('data');\n\n debug(`Creating an AMQP operator to ${AMQP_URL}`);\n const connection = await amqplib.connect(AMQP_URL);\n const channel = await connection.createChannel();\n\n const healthCheckLoop = runHealthCheck ? healthCheck() : false;\n\n debug(`Connection: ${connection}`);\n debug(`Channel: ${channel}`);\n debug(`HealthCheckLoop: ${healthCheckLoop ? 'Running health check' : 'Not running health check'}`);\n\n return {checkQueue, consumeChunk, consumeOne, ackMessages, nackMessages, sendToQueue, removeQueue, messagesToRecords, closeChannel, closeConnection};\n\n async function closeChannel() {\n debug(`Closing channel`);\n await channel.close();\n debug(`Channel: ${channel}`);\n }\n\n async function closeConnection() {\n debug(`Closing connection`);\n await connection.close();\n debug(`Connection: ${connection}`);\n }\n\n async function healthCheck(wait = false) {\n const setTimeoutPromise = promisify(setTimeout);\n if (wait) {\n await setTimeoutPromise(wait);\n return healthCheck(false);\n }\n\n try {\n debugHC(`Health checking amqp by asserting a queue`);\n await channel.assertQueue('HEALTHCHECK', {durable: false});\n debugHC(`Waiting 200ms before running healthCheck next`);\n return healthCheck('200');\n } catch (error) {\n debugHC(`HealthCheck error ${JSON.stringify(error)}`);\n handleAmqpErrors(error);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function checkQueue({queue, style = 'basic', toRecord = true, purge = false}) {\n debug(`checkQueue: ${queue}, Style: ${style}, toRecord: ${toRecord}, Purge: ${purge}`);\n\n try {\n\n errorUndefinedQueue(queue);\n const channelInfo = await channel.assertQueue(queue, {durable: true});\n\n if (purge) {\n await purgeQueue(purge);\n logger.verbose(`Queue ${queue} has purged ${channelInfo.messageCount} messages`);\n debug(`Queue ${queue} has purged ${channelInfo.messageCount} messages`);\n return checkQueue({queue, style});\n }\n\n if (style === 'messages') {\n return channelInfo.messageCount;\n }\n\n\n // Note: returns one message (+ record, of toRecord: true)\n // note: if toRecord is false returns just plain message / false\n // note: if toRecord is true returns {headers, records, messages} -object / false\n // should this be more consistent?\n if (style === 'one') {\n if (checkMessageCount(channelInfo)) {\n return consumeOne(queue, toRecord);\n }\n return false;\n }\n\n // Note: returns a chunk of (100) messages (+ records, if toRecord: true)\n // returns {headers, records, messages} object or {headers, messages} object depending on toRecord\n if (style === 'basic') {\n if (checkMessageCount(channelInfo)) {\n return consumeChunk(queue, toRecord);\n }\n return false;\n }\n\n // Defaults:\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `CheckQueue does not recognize style ${style}`);\n } catch (error) {\n handleAmqpErrors(error);\n }\n\n function checkMessageCount(channelInfo) {\n if (channelInfo.messageCount < 1) {\n debug(`checkQueue: ${channelInfo.messageCount} - ${queue} is empty`);\n return false;\n }\n debug(`Queue ${queue} has ${channelInfo.messageCount} messages`);\n return true;\n }\n\n function purgeQueue(purge) {\n debug(`Purging queue: ${queue}, purge: ${purge}`);\n if (purge) {\n return channel.purgeQueue(queue);\n }\n }\n }\n\n async function consumeChunk(queue, toRecord) {\n debug(`Prepared to consumeChunk from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n\n // getData: next chunk (100) messages\n const messages = await getData(queue);\n\n // Note: headers are from the first message of the chunk\n const headers = getHeaderInfo(messages[0]);\n debug(`consumeChunk (${messages ? messages.length : '0'} from queue ${queue}) ${toRecord ? 'to records' : 'just messages'}`);\n\n if (toRecord) {\n const records = await messagesToRecords(messages);\n return {headers, records, messages};\n }\n\n return {headers, messages};\n } catch (error) {\n handleAmqpErrors(error);\n }\n }\n\n async function consumeOne(queue, toRecord) {\n debug(`Prepared to consumeOne from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n\n // Returns false if 0 items in queue\n const message = await channel.get(queue);\n\n debugData(`Message: ${inspect(message, {colors: true, maxArrayLength: 3, depth: 3})}`);\n // Do not spam the logs\n debug(`consumeOne from queue: ${queue} ${toRecord ? 'to records' : 'just the message'}`);\n\n if (message) {\n if (toRecord) {\n const headers = getHeaderInfo(message);\n const records = messagesToRecords([message]);\n return {headers, records, messages: [message]};\n }\n\n return message;\n }\n\n return false;\n } catch (error) {\n handleAmqpErrors(error);\n }\n }\n\n function ackMessages(messages) {\n messages.forEach(message => {\n debug(`Ack message ${message.properties.correlationId}`);\n channel.ack(message);\n });\n }\n\n function nackMessages(messages) {\n messages.forEach(message => {\n debug(`Nack message ${message.properties.correlationId}`);\n channel.nack(message);\n });\n }\n\n async function sendToQueue({queue, correlationId, headers, data}) {\n debug(`sendToQueue`);\n // eslint-disable-next-line no-useless-catch\n try {\n debug(`Queue ${queue}`);\n debug(`CorrelationId ${correlationId}`);\n debugData(`Data ${JSON.stringify(data)}`);\n debug(`Headers ${JSON.stringify(headers)}`);\n\n errorUndefinedQueue(queue);\n\n debug(`Asserting queue: ${queue}`);\n await channel.assertQueue(queue, {durable: true});\n\n debug(`Actually sendToQueue: ${queue}`);\n await channel.sendToQueue(\n queue,\n Buffer.from(JSON.stringify({data})),\n {\n correlationId,\n persistent: true,\n headers\n }\n );\n debug(`Send message for ${correlationId} to queue: ${queue}`);\n\n\n } catch (error) {\n const errorToThrow = error;\n //if (error instanceof ApiError) {\n // throw error;\n //}\n debug(`SendToQueue errored: ${JSON.stringify(error)}`);\n handleAmqpErrors(errorToThrow);\n }\n }\n\n async function removeQueue(queue) {\n // deleteQueue borks the channel if the queue does not exist\n // -> use throwaway tempChannel to avoid killing actual channel in use\n // this might be doable also with assertQueue before deleteQueue\n const tempChannel = await connection.createChannel();\n logger.verbose(`Removing queue ${queue}.`);\n debug(`Removing queue ${queue}.`);\n await tempChannel.deleteQueue(queue);\n\n if (tempChannel) {\n await tempChannel.close();\n return;\n }\n\n return;\n }\n\n // ----------------\n // Helper functions\n // ----------------\n\n function messagesToRecords(messages) {\n debug(`Parsing messages (${messages.length}) to records`);\n\n return messages.map(message => {\n const content = JSON.parse(message.content.toString());\n // Should we have here validationOptions\n return new MarcRecord(content.data);\n });\n }\n\n async function getData(queue) {\n debug(`Getting queue data from ${queue}`);\n try {\n const {messageCount} = await channel.checkQueue(queue);\n debug(`There is ${messageCount} messages in queue ${queue}`);\n const messagesToGet = messageCount >= CHUNK_SIZE ? CHUNK_SIZE : messageCount;\n debug(`Getting ${messagesToGet} messages from queue ${queue}`);\n\n const messages = await pump(messagesToGet);\n\n debug(`Returning ${messages.length} unique messages`);\n\n return messages;\n } catch (error) {\n handleAmqpErrors(error);\n }\n\n async function pump(count, results = [], identifiers = []) {\n if (count === 0) {\n return results;\n }\n\n const message = await channel.get(queue);\n const identifier = {\n correlationId: message.properties.correlationId,\n deliveryTag: message.fields.deliveryTag\n };\n // Filter not unique messages\n if (identifiers.includes(identifier)) {\n return pump(count - 1, results, identifiers);\n }\n\n return pump(count - 1, results.concat(message), identifiers.concat(identifier));\n }\n }\n\n function getHeaderInfo(data) {\n return data.properties.headers;\n }\n\n function errorUndefinedQueue(queue) {\n if (queue === undefined || queue === '' || queue === null) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Undefined queue!`);\n }\n }\n\n function handleAmqpErrors(error) {\n const newError = error;\n debug(`HandleAmqpErrors got an error: ${JSON.stringify(error)}`);\n if (error instanceof ApiError) {\n debug(`We have an ApiError`);\n throw new ApiError(newError.status, newError.payload);\n }\n debug(`We have a non-ApiError`);\n logError(error);\n throw newError;\n }\n}\n\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"amqp.js","names":["_amqplib","_interopRequireDefault","require","_marcRecord","_melindaCommons","_melindaBackendCommons","_debug","_constants","_util","_httpStatus","_utils","obj","__esModule","default","_default","AMQP_URL","runHealthCheck","logger","createLogger","debug","createDebugLogger","debugHC","extend","debugData","connection","amqplib","connect","channel","createChannel","healthCheckLoop","healthCheck","checkQueue","consumeChunk","consumeOne","ackMessages","nackMessages","sendToQueue","removeQueue","messagesToRecords","closeChannel","closeConnection","close","wait","setTimeoutPromise","promisify","setTimeout","assertQueue","durable","error","JSON","stringify","handleAmqpErrors","queue","style","toRecord","purge","errorUndefinedQueue","channelInfo","purgeQueue","verbose","messageCount","checkMessageCount","ApiError","httpStatus","INTERNAL_SERVER_ERROR","messages","getData","headers","getHeaderInfo","length","records","message","get","inspect","colors","maxArrayLength","depth","forEach","properties","correlationId","ack","nack","data","Buffer","from","persistent","errorToThrow","tempChannel","deleteQueue","map","content","parse","toString","MarcRecord","messagesToGet","CHUNK_SIZE","pump","count","results","identifiers","identifier","deliveryTag","fields","includes","concat","undefined","newError","status","payload","logError"],"sources":["../src/amqp.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 amqplib from 'amqplib';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport createDebugLogger from 'debug';\nimport {CHUNK_SIZE} from './constants';\nimport {promisify, inspect} from 'util';\nimport httpStatus from 'http-status';\nimport {logError} from './utils';\n\nexport default async function (AMQP_URL, runHealthCheck = false) {\n const logger = createLogger();\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:amqp');\n const debugHC = debug.extend('HC');\n const debugData = debug.extend('data');\n\n debug(`Creating an AMQP operator to ${AMQP_URL}`);\n const connection = await amqplib.connect(AMQP_URL);\n const channel = await connection.createChannel();\n\n const healthCheckLoop = runHealthCheck ? healthCheck() : false;\n\n debug(`Connection: ${connection}`);\n debug(`Channel: ${channel}`);\n debug(`HealthCheckLoop: ${healthCheckLoop ? 'Running health check' : 'Not running health check'}`);\n\n return {checkQueue, consumeChunk, consumeOne, ackMessages, nackMessages, sendToQueue, removeQueue, messagesToRecords, closeChannel, closeConnection};\n\n async function closeChannel() {\n debug(`Closing channel`);\n await channel.close();\n debug(`Channel: ${channel}`);\n }\n\n async function closeConnection() {\n debug(`Closing connection`);\n await connection.close();\n debug(`Connection: ${connection}`);\n }\n\n async function healthCheck(wait = false) {\n const setTimeoutPromise = promisify(setTimeout);\n if (wait) {\n await setTimeoutPromise(wait);\n return healthCheck(false);\n }\n\n try {\n debugHC(`Health checking amqp by asserting a queue`);\n await channel.assertQueue('HEALTHCHECK', {durable: false});\n debugHC(`Waiting 200ms before running healthCheck next`);\n return healthCheck('200');\n } catch (error) {\n debugHC(`HealthCheck error ${JSON.stringify(error)}`);\n handleAmqpErrors(error);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function checkQueue({queue, style = 'basic', toRecord = true, purge = false}) {\n debug(`checkQueue: ${queue}, Style: ${style}, toRecord: ${toRecord}, Purge: ${purge}`);\n\n try {\n\n errorUndefinedQueue(queue);\n const channelInfo = await channel.assertQueue(queue, {durable: true});\n\n if (purge) {\n await purgeQueue(purge);\n logger.verbose(`Queue ${queue} has purged ${channelInfo.messageCount} messages`);\n debug(`Queue ${queue} has purged ${channelInfo.messageCount} messages`);\n return checkQueue({queue, style});\n }\n\n if (style === 'messages') {\n return channelInfo.messageCount;\n }\n\n\n // Note: returns one message (+ record, of toRecord: true)\n // note: if toRecord is false returns just plain message / false\n // note: if toRecord is true returns {headers, records, messages} -object / false\n // should this be more consistent?\n if (style === 'one') {\n if (checkMessageCount(channelInfo)) {\n return consumeOne(queue, toRecord);\n }\n return false;\n }\n\n // Note: returns a chunk of (100) messages (+ records, if toRecord: true)\n // returns {headers, records, messages} object or {headers, messages} object depending on toRecord\n if (style === 'basic') {\n if (checkMessageCount(channelInfo)) {\n return consumeChunk(queue, toRecord);\n }\n return false;\n }\n\n // Defaults:\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `CheckQueue does not recognize style ${style}`);\n } catch (error) {\n handleAmqpErrors(error);\n }\n\n function checkMessageCount(channelInfo) {\n if (channelInfo.messageCount < 1) {\n debug(`checkQueue: ${channelInfo.messageCount} - ${queue} is empty`);\n return false;\n }\n debug(`Queue ${queue} has ${channelInfo.messageCount} messages`);\n return true;\n }\n\n function purgeQueue(purge) {\n debug(`Purging queue: ${queue}, purge: ${purge}`);\n if (purge) {\n return channel.purgeQueue(queue);\n }\n }\n }\n\n async function consumeChunk(queue, toRecord) {\n debug(`Prepared to consumeChunk from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n\n // getData: next chunk (100) messages\n const messages = await getData(queue);\n\n // Note: headers are from the first message of the chunk\n const headers = getHeaderInfo(messages[0]);\n debug(`consumeChunk (${messages ? messages.length : '0'} from queue ${queue}) ${toRecord ? 'to records' : 'just messages'}`);\n\n if (toRecord) {\n const records = await messagesToRecords(messages);\n return {headers, records, messages};\n }\n\n return {headers, messages};\n } catch (error) {\n handleAmqpErrors(error);\n }\n }\n\n async function consumeOne(queue, toRecord) {\n debug(`Prepared to consumeOne from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n\n // Returns false if 0 items in queue\n const message = await channel.get(queue);\n\n debugData(`Message: ${inspect(message, {colors: true, maxArrayLength: 3, depth: 3})}`);\n // Do not spam the logs\n debug(`consumeOne from queue: ${queue} ${toRecord ? 'to records' : 'just the message'}`);\n\n if (message) {\n if (toRecord) {\n const headers = getHeaderInfo(message);\n const records = messagesToRecords([message]);\n return {headers, records, messages: [message]};\n }\n\n return message;\n }\n\n return false;\n } catch (error) {\n handleAmqpErrors(error);\n }\n }\n\n function ackMessages(messages) {\n messages.forEach(message => {\n debug(`Ack message ${message.properties.correlationId}`);\n channel.ack(message);\n });\n }\n\n function nackMessages(messages) {\n messages.forEach(message => {\n debug(`Nack message ${message.properties.correlationId}`);\n channel.nack(message);\n });\n }\n\n async function sendToQueue({queue, correlationId, headers, data}) {\n debug(`sendToQueue`);\n // eslint-disable-next-line no-useless-catch\n try {\n debug(`Queue ${queue}`);\n debug(`CorrelationId ${correlationId}`);\n debugData(`Data ${JSON.stringify(data)}`);\n debug(`Headers ${JSON.stringify(headers)}`);\n\n errorUndefinedQueue(queue);\n\n debug(`Asserting queue: ${queue}`);\n await channel.assertQueue(queue, {durable: true});\n\n debug(`Actually sendToQueue: ${queue}`);\n await channel.sendToQueue(\n queue,\n Buffer.from(JSON.stringify({data})),\n {\n correlationId,\n persistent: true,\n headers\n }\n );\n debug(`Send message for ${correlationId} to queue: ${queue}`);\n\n\n } catch (error) {\n const errorToThrow = error;\n //if (error instanceof ApiError) {\n // throw error;\n //}\n debug(`SendToQueue errored: ${JSON.stringify(error)}`);\n handleAmqpErrors(errorToThrow);\n }\n }\n\n async function removeQueue(queue) {\n // deleteQueue borks the channel if the queue does not exist\n // -> use throwaway tempChannel to avoid killing actual channel in use\n // this might be doable also with assertQueue before deleteQueue\n const tempChannel = await connection.createChannel();\n logger.verbose(`Removing queue ${queue}.`);\n debug(`Removing queue ${queue}.`);\n await tempChannel.deleteQueue(queue);\n\n if (tempChannel) {\n await tempChannel.close();\n return;\n }\n\n return;\n }\n\n // ----------------\n // Helper functions\n // ----------------\n\n function messagesToRecords(messages) {\n debug(`Parsing messages (${messages.length}) to records`);\n\n return messages.map(message => {\n const content = JSON.parse(message.content.toString());\n // Should we have here validationOptions\n return new MarcRecord(content.data);\n });\n }\n\n async function getData(queue) {\n debug(`Getting queue data from ${queue}`);\n try {\n const {messageCount} = await channel.checkQueue(queue);\n debug(`There is ${messageCount} messages in queue ${queue}`);\n const messagesToGet = messageCount >= CHUNK_SIZE ? CHUNK_SIZE : messageCount;\n debug(`Getting ${messagesToGet} messages from queue ${queue}`);\n\n const messages = await pump(messagesToGet);\n\n debug(`Returning ${messages.length} unique messages`);\n\n return messages;\n } catch (error) {\n handleAmqpErrors(error);\n }\n\n async function pump(count, results = [], identifiers = []) {\n if (count === 0) {\n return results;\n }\n\n const message = await channel.get(queue);\n const identifier = {\n correlationId: message.properties.correlationId,\n deliveryTag: message.fields.deliveryTag\n };\n // Filter not unique messages\n if (identifiers.includes(identifier)) {\n return pump(count - 1, results, identifiers);\n }\n\n return pump(count - 1, results.concat(message), identifiers.concat(identifier));\n }\n }\n\n function getHeaderInfo(data) {\n return data.properties.headers;\n }\n\n function errorUndefinedQueue(queue) {\n if (queue === undefined || queue === '' || queue === null) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Undefined queue!`);\n }\n }\n\n function handleAmqpErrors(error) {\n const newError = error;\n debug(`HandleAmqpErrors got an error: ${JSON.stringify(error)}`);\n if (error instanceof ApiError) {\n debug(`We have an ApiError`);\n throw new ApiError(newError.status, newError.payload);\n }\n debug(`We have a non-ApiError`);\n logError(error);\n throw newError;\n }\n}\n\n\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"amqp.tests.spec.js","names":["_chai","require","_fixura","_debug","_interopRequireDefault","_fixugen","_index","_melindaCommons","_util","obj","__esModule","default","setTimeoutPromise","promisify","setTimeout","debug","createDebugLogger","testData","queue","correlationId","data","amqpUrl","amqpOperator","generateTests","callback","path","__dirname","recurse","useMetadataFile","fixura","failWhenNotFound","reader","READERS","JSON","mocha","before","amqpFactory","beforeEach","checkQueue","toRecord","purge","afterEach","removeQueue","after","closeConnection","getFixture","expectToFail","expectedErrorStatus","ackMessages","nackMessages","checkNextMessage","checkQueueStyle","sentToQueue","expectedMessageCount","expectedErrorMessage","undefined","expectApiError","expectFalseCheckResult","sendMessagesToQueue","ackOrNackMessages","queueRemoval","messageCount","style","expect","to","eql","headers","records","queueCheckNextMessage","nextMessage","expectedNextMessage","error","equal","testErrors","be","instanceOf","ApiError","status","payload","not","constructor","name","consumeOne","result","have","property","length","messages","fields","deliveryTag","redelivered","routingKey","expectedResult","message","promises","map","sendToQueue","Promise","all"],"sources":["../src/amqp.tests.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 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 {expect} from 'chai';\nimport {READERS} from '@natlibfi/fixura';\nimport createDebugLogger from 'debug';\nimport generateTests from '@natlibfi/fixugen';\nimport {amqpFactory} from './index';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {promisify} from 'util';\n\nconst setTimeoutPromise = promisify(setTimeout);\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:amqp:test');\n//const debugData = debug.extend('data');\n\nconst testData = {\n queue: 'TESTQUEUE',\n correlationId: 'aaaaaaaa-0000-aaaa-0000-000000000000',\n data: {'leader': '02518cam a2200745zi 4500', 'fields': [{'tag': '001', 'value': '000019640'}]}\n};\n\ndebug(`Testing amqp against a local AMQP instance - we'll need some kind of mockup for this`);\nconst amqpUrl = 'amqp://127.0.0.1:5672/';\n// eslint-disable-next-line functional/no-let\nlet amqpOperator;\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'amqp'],\n recurse: false,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: true,\n reader: READERS.JSON\n },\n mocha: {\n before: async () => {\n debug(`Connecting to ${amqpUrl}, with healthCheck running`);\n amqpOperator = await amqpFactory(amqpUrl, true);\n },\n beforeEach: async () => {\n await amqpOperator.checkQueue({queue: testData.queue, toRecord: false, purge: true});\n },\n afterEach: async () => {\n await amqpOperator.removeQueue(testData.queue);\n },\n after: async () => {\n await amqpOperator.closeConnection();\n //await testHeathCheck();\n }\n }\n});\n\n// eslint-disable-next-line max-statements\nasync function callback({\n getFixture,\n expectToFail = false,\n expectedErrorStatus = '',\n ackMessages = false,\n nackMessages = false,\n checkNextMessage = false,\n checkQueueStyle = false,\n queue = testData.queue,\n sentToQueue,\n expectedMessageCount,\n removeQueue = false,\n expectedErrorMessage = undefined,\n expectApiError = false,\n expectFalseCheckResult = false\n}) {\n try {\n await sendMessagesToQueue();\n\n await ackOrNackMessages();\n\n await checkQueue();\n\n await queueRemoval();\n\n const messageCount = await amqpOperator.checkQueue({queue, style: 'messages'});\n debug(`MessageCount: ${messageCount}`);\n expect(messageCount).to.eql(expectedMessageCount);\n\n if (checkNextMessage) {\n const {headers, records} = await queueCheckNextMessage();\n const nextMessage = {headers, records};\n const expectedNextMessage = getFixture('expectedMessage.json');\n expect(nextMessage).to.eql(expectedNextMessage);\n return;\n }\n\n } catch (error) {\n if (!expectToFail) {\n throw error;\n }\n expect(expectToFail, 'This is expected to fail').to.equal(true);\n testErrors(error);\n }\n\n function testErrors(error) {\n\n if (expectApiError) {\n expect(error).to.be.instanceOf(ApiError);\n debug(`We expected and got an ApiError`);\n expect(error.status).to.equal(expectedErrorStatus);\n\n if (expectedErrorMessage) {\n expect(error.payload).to.eql(expectedErrorMessage);\n return;\n }\n\n return;\n }\n expect(error).not.to.be.instanceOf(ApiError);\n debug(`We expected and got an non-ApiError`);\n debug(`Error is a ${error.constructor.name}`);\n }\n\n function queueRemoval() {\n if (removeQueue) {\n return amqpOperator.removeQueue(removeQueue);\n }\n\n return;\n }\n\n function queueCheckNextMessage() {\n if (checkNextMessage) {\n return amqpOperator.consumeOne(testData.queue, true);\n }\n\n return false;\n }\n\n // eslint-disable-next-line max-statements\n async function checkQueue() {\n debug(`checkQueueStyle: ${checkQueueStyle}`);\n\n if (checkQueueStyle === 'oneToRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'one', toRecord: true, purge: false});\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(result).to.have.property('headers');\n expect(result).to.have.property('records');\n expect(result).to.have.property('messages');\n expect(result.records.length).to.eql(1);\n expect(result.messages.length).to.eql(1);\n\n return;\n }\n\n if (checkQueueStyle === 'oneNotRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'one', toRecord: false, purge: false});\n const {fields} = result;\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(fields).to.have.property('deliveryTag');\n expect(fields).to.have.property('exchange');\n expect(fields).to.have.property('messageCount');\n expect(fields).to.have.property('redelivered');\n expect(fields).to.have.property('routingKey');\n expect(typeof fields.deliveryTag).to.be.eql('number');\n expect(typeof fields.messageCount).to.be.eql('number');\n expect(typeof fields.redelivered).to.be.eql('boolean');\n expect(typeof fields.routingKey).to.be.eql('string');\n\n return;\n }\n\n if (checkQueueStyle === 'basicToRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'basic', toRecord: true, purge: false});\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(result).to.have.property('headers');\n expect(result).to.have.property('records');\n expect(result).to.have.property('messages');\n expect(result.records.length).to.eql(3);\n expect(result.messages.length).to.eql(3);\n const expectedResult = getFixture('expectedResult.json');\n expect(result.records).to.eql(expectedResult);\n\n return;\n }\n\n if (checkQueueStyle === 'basicNotRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'basic', toRecord: false, purge: false});\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(result).to.have.property('headers');\n expect(result).to.have.property('messages');\n expect(result.messages.length).to.eql(3);\n\n const [{fields}] = result.messages;\n\n expect(fields).to.have.property('deliveryTag');\n expect(fields).to.have.property('exchange');\n expect(fields).to.have.property('messageCount');\n expect(fields).to.have.property('redelivered');\n expect(fields).to.have.property('routingKey');\n\n expect(typeof fields.deliveryTag).to.be.eql('number');\n expect(typeof fields.messageCount).to.be.eql('number');\n expect(typeof fields.redelivered).to.be.eql('boolean');\n expect(typeof fields.routingKey).to.be.eql('string');\n\n return;\n }\n\n if (checkQueueStyle === 'purge') {\n return amqpOperator.checkQueue({queue, style: 'messages', purge: true});\n }\n\n if (checkQueueStyle === 'foobar') {\n return amqpOperator.checkQueue({queue, style: 'foobar', toRecord: false, purge: false});\n }\n\n return false;\n }\n\n async function ackOrNackMessages() {\n if (ackMessages) {\n const message = await amqpOperator.consumeOne(testData.queue, false);\n await amqpOperator.ackMessages([message]);\n\n return setTimeoutPromise(10);\n }\n\n if (nackMessages) {\n const message = await amqpOperator.consumeOne(testData.queue, false);\n await amqpOperator.nackMessages([message]);\n\n return setTimeoutPromise(10);\n }\n\n return;\n }\n\n async function sendMessagesToQueue() {\n if (sentToQueue) {\n const messages = getFixture('input.json');\n // {queue, correlationId, headers, data}\n\n const promises = messages.map(message => amqpOperator.sendToQueue(message));\n await Promise.all(promises);\n\n return setTimeoutPromise(10);\n }\n\n return;\n }\n}\n\n/*\nfunction testHeathCheck() {\n return it('expects healthCheck', async () => {\n\n const amqpOperator2 = await amqpFactory(amqpUrl, true);\n try {\n\n debug(`**********`);\n await testHealthCheckLoopWorking(amqpOperator2);\n\n debug(`**********`);\n await testHealthCheckLoopErroring(amqpOperator2);\n } catch (error) {\n debug(error);\n expect(error).to.eql('');\n } finally {\n amqpOperator2.closeConnection();\n }\n\n async function testHealthCheckLoopWorking(amqpOperator) {\n debug(`Testing healthCheckLoop for ${amqpOperator}`);\n debug(`Waiting 0.5s and expecting healthCheckLoop to work`);\n await setTimeoutPromise('500');\n debug(`Amqp Operator should have been alive.`);\n }\n\n async function testHealthCheckLoopErroring(amqpOperator) {\n debug(`Testing healthCheckLoop with closed channel`);\n amqpOperator.closeChannel();\n debug(`Waiting 0.5s and expecting healthCheckLoop to throw error`);\n await setTimeoutPromise('500');\n debug(`amqpOperator should have errored`);\n }\n });\n}\n*/\n"],"mappings":"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"}
1
+ {"version":3,"file":"amqp.tests.spec.js","names":["_chai","require","_fixura","_debug","_interopRequireDefault","_fixugen","_index","_melindaCommons","_util","obj","__esModule","default","setTimeoutPromise","promisify","setTimeout","debug","createDebugLogger","testData","queue","correlationId","data","amqpUrl","amqpOperator","generateTests","callback","path","__dirname","recurse","useMetadataFile","fixura","failWhenNotFound","reader","READERS","JSON","mocha","before","amqpFactory","beforeEach","checkQueue","toRecord","purge","afterEach","removeQueue","after","closeConnection","getFixture","expectToFail","expectedErrorStatus","ackMessages","nackMessages","checkNextMessage","checkQueueStyle","sentToQueue","expectedMessageCount","expectedErrorMessage","undefined","expectApiError","expectFalseCheckResult","sendMessagesToQueue","ackOrNackMessages","queueRemoval","messageCount","style","expect","to","eql","headers","records","queueCheckNextMessage","nextMessage","expectedNextMessage","error","equal","testErrors","be","instanceOf","ApiError","status","payload","not","constructor","name","consumeOne","result","have","property","length","messages","fields","deliveryTag","redelivered","routingKey","expectedResult","message","promises","map","sendToQueue","Promise","all"],"sources":["../src/amqp.tests.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 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 {expect} from 'chai';\nimport {READERS} from '@natlibfi/fixura';\nimport createDebugLogger from 'debug';\nimport generateTests from '@natlibfi/fixugen';\nimport {amqpFactory} from './index';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {promisify} from 'util';\n\nconst setTimeoutPromise = promisify(setTimeout);\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:amqp:test');\n//const debugData = debug.extend('data');\n\nconst testData = {\n queue: 'TESTQUEUE',\n correlationId: 'aaaaaaaa-0000-aaaa-0000-000000000000',\n data: {'leader': '02518cam a2200745zi 4500', 'fields': [{'tag': '001', 'value': '000019640'}]}\n};\n\ndebug(`Testing amqp against a local AMQP instance - we'll need some kind of mockup for this`);\nconst amqpUrl = 'amqp://127.0.0.1:5672/';\n// eslint-disable-next-line functional/no-let\nlet amqpOperator;\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'amqp'],\n recurse: false,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: true,\n reader: READERS.JSON\n },\n mocha: {\n before: async () => {\n debug(`Connecting to ${amqpUrl}, with healthCheck running`);\n amqpOperator = await amqpFactory(amqpUrl, true);\n },\n beforeEach: async () => {\n await amqpOperator.checkQueue({queue: testData.queue, toRecord: false, purge: true});\n },\n afterEach: async () => {\n await amqpOperator.removeQueue(testData.queue);\n },\n after: async () => {\n await amqpOperator.closeConnection();\n //await testHeathCheck();\n }\n }\n});\n\n// eslint-disable-next-line max-statements\nasync function callback({\n getFixture,\n expectToFail = false,\n expectedErrorStatus = '',\n ackMessages = false,\n nackMessages = false,\n checkNextMessage = false,\n checkQueueStyle = false,\n queue = testData.queue,\n sentToQueue,\n expectedMessageCount,\n removeQueue = false,\n expectedErrorMessage = undefined,\n expectApiError = false,\n expectFalseCheckResult = false\n}) {\n try {\n await sendMessagesToQueue();\n\n await ackOrNackMessages();\n\n await checkQueue();\n\n await queueRemoval();\n\n const messageCount = await amqpOperator.checkQueue({queue, style: 'messages'});\n debug(`MessageCount: ${messageCount}`);\n expect(messageCount).to.eql(expectedMessageCount);\n\n if (checkNextMessage) {\n const {headers, records} = await queueCheckNextMessage();\n const nextMessage = {headers, records};\n const expectedNextMessage = getFixture('expectedMessage.json');\n expect(nextMessage).to.eql(expectedNextMessage);\n return;\n }\n\n } catch (error) {\n if (!expectToFail) {\n throw error;\n }\n expect(expectToFail, 'This is expected to fail').to.equal(true);\n testErrors(error);\n }\n\n function testErrors(error) {\n\n if (expectApiError) {\n expect(error).to.be.instanceOf(ApiError);\n debug(`We expected and got an ApiError`);\n expect(error.status).to.equal(expectedErrorStatus);\n\n if (expectedErrorMessage) {\n expect(error.payload).to.eql(expectedErrorMessage);\n return;\n }\n\n return;\n }\n expect(error).not.to.be.instanceOf(ApiError);\n debug(`We expected and got an non-ApiError`);\n debug(`Error is a ${error.constructor.name}`);\n }\n\n function queueRemoval() {\n if (removeQueue) {\n return amqpOperator.removeQueue(removeQueue);\n }\n\n return;\n }\n\n function queueCheckNextMessage() {\n if (checkNextMessage) {\n return amqpOperator.consumeOne(testData.queue, true);\n }\n\n return false;\n }\n\n // eslint-disable-next-line max-statements\n async function checkQueue() {\n debug(`checkQueueStyle: ${checkQueueStyle}`);\n\n if (checkQueueStyle === 'oneToRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'one', toRecord: true, purge: false});\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(result).to.have.property('headers');\n expect(result).to.have.property('records');\n expect(result).to.have.property('messages');\n expect(result.records.length).to.eql(1);\n expect(result.messages.length).to.eql(1);\n\n return;\n }\n\n if (checkQueueStyle === 'oneNotRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'one', toRecord: false, purge: false});\n const {fields} = result;\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(fields).to.have.property('deliveryTag');\n expect(fields).to.have.property('exchange');\n expect(fields).to.have.property('messageCount');\n expect(fields).to.have.property('redelivered');\n expect(fields).to.have.property('routingKey');\n expect(typeof fields.deliveryTag).to.be.eql('number');\n expect(typeof fields.messageCount).to.be.eql('number');\n expect(typeof fields.redelivered).to.be.eql('boolean');\n expect(typeof fields.routingKey).to.be.eql('string');\n\n return;\n }\n\n if (checkQueueStyle === 'basicToRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'basic', toRecord: true, purge: false});\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(result).to.have.property('headers');\n expect(result).to.have.property('records');\n expect(result).to.have.property('messages');\n expect(result.records.length).to.eql(3);\n expect(result.messages.length).to.eql(3);\n const expectedResult = getFixture('expectedResult.json');\n expect(result.records).to.eql(expectedResult);\n\n return;\n }\n\n if (checkQueueStyle === 'basicNotRecord') {\n const result = await amqpOperator.checkQueue({queue, style: 'basic', toRecord: false, purge: false});\n\n if (expectFalseCheckResult) {\n expect(result).to.eql(false);\n return;\n }\n\n expect(result).to.have.property('headers');\n expect(result).to.have.property('messages');\n expect(result.messages.length).to.eql(3);\n\n const [{fields}] = result.messages;\n\n expect(fields).to.have.property('deliveryTag');\n expect(fields).to.have.property('exchange');\n expect(fields).to.have.property('messageCount');\n expect(fields).to.have.property('redelivered');\n expect(fields).to.have.property('routingKey');\n\n expect(typeof fields.deliveryTag).to.be.eql('number');\n expect(typeof fields.messageCount).to.be.eql('number');\n expect(typeof fields.redelivered).to.be.eql('boolean');\n expect(typeof fields.routingKey).to.be.eql('string');\n\n return;\n }\n\n if (checkQueueStyle === 'purge') {\n return amqpOperator.checkQueue({queue, style: 'messages', purge: true});\n }\n\n if (checkQueueStyle === 'foobar') {\n return amqpOperator.checkQueue({queue, style: 'foobar', toRecord: false, purge: false});\n }\n\n return false;\n }\n\n async function ackOrNackMessages() {\n if (ackMessages) {\n const message = await amqpOperator.consumeOne(testData.queue, false);\n await amqpOperator.ackMessages([message]);\n\n return setTimeoutPromise(10);\n }\n\n if (nackMessages) {\n const message = await amqpOperator.consumeOne(testData.queue, false);\n await amqpOperator.nackMessages([message]);\n\n return setTimeoutPromise(10);\n }\n\n return;\n }\n\n async function sendMessagesToQueue() {\n if (sentToQueue) {\n const messages = getFixture('input.json');\n // {queue, correlationId, headers, data}\n\n const promises = messages.map(message => amqpOperator.sendToQueue(message));\n await Promise.all(promises);\n\n return setTimeoutPromise(10);\n }\n\n return;\n }\n}\n\n/*\nfunction testHeathCheck() {\n return it('expects healthCheck', async () => {\n\n const amqpOperator2 = await amqpFactory(amqpUrl, true);\n try {\n\n debug(`**********`);\n await testHealthCheckLoopWorking(amqpOperator2);\n\n debug(`**********`);\n await testHealthCheckLoopErroring(amqpOperator2);\n } catch (error) {\n debug(error);\n expect(error).to.eql('');\n } finally {\n amqpOperator2.closeConnection();\n }\n\n async function testHealthCheckLoopWorking(amqpOperator) {\n debug(`Testing healthCheckLoop for ${amqpOperator}`);\n debug(`Waiting 0.5s and expecting healthCheckLoop to work`);\n await setTimeoutPromise('500');\n debug(`Amqp Operator should have been alive.`);\n }\n\n async function testHealthCheckLoopErroring(amqpOperator) {\n debug(`Testing healthCheckLoop with closed channel`);\n amqpOperator.closeChannel();\n debug(`Waiting 0.5s and expecting healthCheckLoop to throw error`);\n await setTimeoutPromise('500');\n debug(`amqpOperator should have errored`);\n }\n });\n}\n*/\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"conversion.js","names":["_httpStatus","_interopRequireDefault","require","_marcRecordSerializers","_melindaBackendCommons","_melindaCommons","_constants","_utils","obj","__esModule","default","_default","logger","createLogger","serialize","unserialize","record","format","verbose","CONVERSION_FORMATS","MARCXML","to","ISO2709","JSON","Json","ALEPHSEQ","AlephSequential","ConversionError","httpStatus","UNSUPPORTED_MEDIA_TYPE","err","logError","BAD_REQUEST","data","validationOptions","subfieldValues","silly","debug","stringify","from"],"sources":["../../src/helpers/conversion.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport httpStatus from 'http-status';\nimport {MARCXML, ISO2709, Json, AlephSequential} from '@natlibfi/marc-record-serializers';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport {CONVERSION_FORMATS} from '../constants';\nimport {logError} from '../utils';\n\nexport default function () {\n const logger = createLogger();\n\n return {serialize, unserialize};\n\n // This uses format as a number form contants CONVERSION_FORMATS\n function serialize(record, format) {\n logger.verbose(`Serializing record to ${format}`);\n try {\n if (format === CONVERSION_FORMATS.MARCXML) {\n return MARCXML.to(record);\n }\n\n if (format === CONVERSION_FORMATS.ISO2709) {\n return ISO2709.to(record);\n }\n\n if (format === CONVERSION_FORMATS.JSON) {\n return Json.to(record);\n }\n\n if (format === CONVERSION_FORMATS.ALEPHSEQ) {\n return AlephSequential.to(record);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statements\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while serializing record');\n }\n }\n\n // eslint-disable-next-line max-statements\n function unserialize(data, format, validationOptions = {subfieldValues: false}) {\n logger.verbose(`Unserializing record from ${format}`);\n logger.silly(`Format: ${format}`);\n logger.debug(`Validation options: ${JSON.stringify(validationOptions)}`);\n logger.silly(`Data: ${JSON.stringify(data)}`);\n try {\n if (format === CONVERSION_FORMATS.MARCXML) {\n logger.silly('Unserialize format marcxml');\n return MARCXML.from(data, validationOptions);\n }\n\n if (format === CONVERSION_FORMATS.ISO2709) {\n logger.silly('Unserialize format iso2709');\n return ISO2709.from(data, validationOptions);\n }\n\n if (format === CONVERSION_FORMATS.JSON) {\n logger.silly('Unserialize format json');\n return Json.from(data, validationOptions);\n }\n\n if (format === CONVERSION_FORMATS.ALEPHSEQ) {\n logger.silly('Unserialize format aleph sequential');\n return AlephSequential.from(data, validationOptions);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statements\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while unserializing record');\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversion.js","names":["_httpStatus","_interopRequireDefault","require","_marcRecordSerializers","_melindaBackendCommons","_melindaCommons","_constants","_utils","obj","__esModule","default","_default","logger","createLogger","serialize","unserialize","record","format","verbose","CONVERSION_FORMATS","MARCXML","to","ISO2709","JSON","Json","ALEPHSEQ","AlephSequential","ConversionError","httpStatus","UNSUPPORTED_MEDIA_TYPE","err","logError","BAD_REQUEST","data","validationOptions","subfieldValues","silly","debug","stringify","from"],"sources":["../../src/helpers/conversion.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport httpStatus from 'http-status';\nimport {MARCXML, ISO2709, Json, AlephSequential} from '@natlibfi/marc-record-serializers';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport {CONVERSION_FORMATS} from '../constants';\nimport {logError} from '../utils';\n\nexport default function () {\n const logger = createLogger();\n\n return {serialize, unserialize};\n\n // This uses format as a number form contants CONVERSION_FORMATS\n function serialize(record, format) {\n logger.verbose(`Serializing record to ${format}`);\n try {\n if (format === CONVERSION_FORMATS.MARCXML) {\n return MARCXML.to(record);\n }\n\n if (format === CONVERSION_FORMATS.ISO2709) {\n return ISO2709.to(record);\n }\n\n if (format === CONVERSION_FORMATS.JSON) {\n return Json.to(record);\n }\n\n if (format === CONVERSION_FORMATS.ALEPHSEQ) {\n return AlephSequential.to(record);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statements\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while serializing record');\n }\n }\n\n // eslint-disable-next-line max-statements\n function unserialize(data, format, validationOptions = {subfieldValues: false}) {\n logger.verbose(`Unserializing record from ${format}`);\n logger.silly(`Format: ${format}`);\n logger.debug(`Validation options: ${JSON.stringify(validationOptions)}`);\n logger.silly(`Data: ${JSON.stringify(data)}`);\n try {\n if (format === CONVERSION_FORMATS.MARCXML) {\n logger.silly('Unserialize format marcxml');\n return MARCXML.from(data, validationOptions);\n }\n\n if (format === CONVERSION_FORMATS.ISO2709) {\n logger.silly('Unserialize format iso2709');\n return ISO2709.from(data, validationOptions);\n }\n\n if (format === CONVERSION_FORMATS.JSON) {\n logger.silly('Unserialize format json');\n return Json.from(data, validationOptions);\n }\n\n if (format === CONVERSION_FORMATS.ALEPHSEQ) {\n logger.silly('Unserialize format aleph sequential');\n return AlephSequential.from(data, validationOptions);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statements\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while unserializing record');\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"conversion.spec.js","names":["_chai","require","_fixura","_interopRequireDefault","_marcRecord","_melindaCommons","_conversion","_constants","obj","__esModule","default","describe","getFixture","fixtureFactory","root","__dirname","conversionService","createConversionService","marcRecord","MarcRecord","JSON","parse","components","subfieldValues","marcXml","iso2709","json","alephSeq","it","service","expect","to","be","an","and","respondTo","serialize","throw","data","CONVERSION_FORMATS","MARCXML","equal","ISO2709","ALEPHSEQ","unserialize","record","equalsTo","ConversionError"],"sources":["../../src/helpers/conversion.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {expect} from 'chai';\nimport fixtureFactory from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport createConversionService from './conversion';\nimport {CONVERSION_FORMATS} from '../constants';\n\ndescribe('services/conversion', () => {\n const {getFixture} = fixtureFactory({root: [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'conversion'\n ]});\n const conversionService = createConversionService();\n\n const marcRecord = new MarcRecord(JSON.parse(getFixture({components: ['json1']})), {subfieldValues: false});\n const marcXml = getFixture({components: ['marcxml1']});\n const iso2709 = getFixture({components: ['iso2709_1']});\n const json = getFixture({components: ['json1']});\n const alephSeq = getFixture({components: ['aleph_sequential']});\n\n\n describe('factory', () => {\n it('Should create the expected object', () => {\n const service = createConversionService();\n expect(service).to.be.an('object').and\n .respondTo('serialize')\n .respondTo('unserialize');\n });\n });\n\n describe('#serialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.serialize).to.throw();\n });\n\n it('Should serialize to MARCXML', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.MARCXML);\n expect(data).to.equal(marcXml);\n });\n\n it('Should serialize to ISO2709', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.ISO2709);\n expect(data).to.equal(iso2709);\n });\n\n it('Should serialize to JSON', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.JSON);\n expect(data).to.equal(json);\n });\n\n it('Should serialize to aleph sequential', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.ALEPHSEQ);\n expect(data).to.equal(alephSeq);\n });\n\n });\n\n describe('#unserialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.unserialize).to.throw();\n });\n\n it('Should unserialize from MARCXML', async () => {\n const record = await conversionService.unserialize(marcXml, CONVERSION_FORMATS.MARCXML);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from ISO2709', () => {\n const record = conversionService.unserialize(iso2709, CONVERSION_FORMATS.ISO2709);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from JSON', () => {\n const record = conversionService.unserialize(json, CONVERSION_FORMATS.JSON);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from Aleph sequential', () => {\n const record = conversionService.unserialize(alephSeq, CONVERSION_FORMATS.ALEPHSEQ);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n\n it('Should throw because the record could not be unserialized', () => {\n expect(() => {\n conversionService.unserialize('', CONVERSION_FORMATS.JSON);\n }).to.throw(ConversionError);\n });\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversion.spec.js","names":["_chai","require","_fixura","_interopRequireDefault","_marcRecord","_melindaCommons","_conversion","_constants","obj","__esModule","default","describe","getFixture","fixtureFactory","root","__dirname","conversionService","createConversionService","marcRecord","MarcRecord","JSON","parse","components","subfieldValues","marcXml","iso2709","json","alephSeq","it","service","expect","to","be","an","and","respondTo","serialize","throw","data","CONVERSION_FORMATS","MARCXML","equal","ISO2709","ALEPHSEQ","unserialize","record","equalsTo","ConversionError"],"sources":["../../src/helpers/conversion.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {expect} from 'chai';\nimport fixtureFactory from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport createConversionService from './conversion';\nimport {CONVERSION_FORMATS} from '../constants';\n\ndescribe('services/conversion', () => {\n const {getFixture} = fixtureFactory({root: [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'conversion'\n ]});\n const conversionService = createConversionService();\n\n const marcRecord = new MarcRecord(JSON.parse(getFixture({components: ['json1']})), {subfieldValues: false});\n const marcXml = getFixture({components: ['marcxml1']});\n const iso2709 = getFixture({components: ['iso2709_1']});\n const json = getFixture({components: ['json1']});\n const alephSeq = getFixture({components: ['aleph_sequential']});\n\n\n describe('factory', () => {\n it('Should create the expected object', () => {\n const service = createConversionService();\n expect(service).to.be.an('object').and\n .respondTo('serialize')\n .respondTo('unserialize');\n });\n });\n\n describe('#serialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.serialize).to.throw();\n });\n\n it('Should serialize to MARCXML', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.MARCXML);\n expect(data).to.equal(marcXml);\n });\n\n it('Should serialize to ISO2709', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.ISO2709);\n expect(data).to.equal(iso2709);\n });\n\n it('Should serialize to JSON', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.JSON);\n expect(data).to.equal(json);\n });\n\n it('Should serialize to aleph sequential', () => {\n const data = conversionService.serialize(marcRecord, CONVERSION_FORMATS.ALEPHSEQ);\n expect(data).to.equal(alephSeq);\n });\n\n });\n\n describe('#unserialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.unserialize).to.throw();\n });\n\n it('Should unserialize from MARCXML', async () => {\n const record = await conversionService.unserialize(marcXml, CONVERSION_FORMATS.MARCXML);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from ISO2709', () => {\n const record = conversionService.unserialize(iso2709, CONVERSION_FORMATS.ISO2709);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from JSON', () => {\n const record = conversionService.unserialize(json, CONVERSION_FORMATS.JSON);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from Aleph sequential', () => {\n const record = conversionService.unserialize(alephSeq, CONVERSION_FORMATS.ALEPHSEQ);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n\n it('Should throw because the record could not be unserialized', () => {\n expect(() => {\n conversionService.unserialize('', CONVERSION_FORMATS.JSON);\n }).to.throw(ConversionError);\n });\n });\n});\n"],"mappings":"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"}
@@ -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","obj","__esModule","default","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","obj","__esModule","default","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 +1 @@
1
- {"version":3,"file":"validation.js","names":["_marcRecordValidate","_interopRequireDefault","require","_marcRecordValidatorsMelinda","_melindaBackendCommons","obj","__esModule","default","_default","logger","createLogger","verbose","validate","validateFactory","fieldStructure","tag","valuePattern","unvalidRecord","record","valid","report","fix","validateFixes","subfieldValues","failed","messages","exports"],"sources":["../../src/helpers/validation.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport validateFactory from '@natlibfi/marc-record-validate';\nimport {\n FieldStructure as fieldStructure\n} from '@natlibfi/marc-record-validators-melinda';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\n\nexport default async () => {\n const logger = createLogger();\n\n logger.verbose('Running inbuilt record validations');\n const validate = validateFactory([await fieldStructure([{tag: /^003$/u, valuePattern: /^FI-MELINDA$/u}])]);\n\n return async unvalidRecord => {\n const {record, valid, report} = await validate(unvalidRecord, {fix: false, validateFixes: false}, {subfieldValues: false});\n\n return {\n record,\n failed: valid === false,\n messages: report\n };\n };\n};\n"],"mappings":";;;;;;AA4BA,IAAAA,mBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,4BAAA,GAAAD,OAAA;AAGA,IAAAE,sBAAA,GAAAF,OAAA;AAA+D,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAhC/D;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;AA1BA,IAAAG,QAAA,GAkCe,MAAAA,CAAA,KAAY;EACzB,MAAMC,MAAM,GAAG,IAAAC,mCAAY,GAAE;EAE7BD,MAAM,CAACE,OAAO,CAAC,oCAAoC,CAAC;EACpD,MAAMC,QAAQ,GAAG,IAAAC,2BAAe,EAAC,CAAC,MAAM,IAAAC,2CAAc,EAAC,CAAC;IAACC,GAAG,EAAE,QAAQ;IAAEC,YAAY,EAAE;EAAe,CAAC,CAAC,CAAC,CAAC,CAAC;EAE1G,OAAO,MAAMC,aAAa,IAAI;IAC5B,MAAM;MAACC,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAG,MAAMR,QAAQ,CAACK,aAAa,EAAE;MAACI,GAAG,EAAE,KAAK;MAAEC,aAAa,EAAE;IAAK,CAAC,EAAE;MAACC,cAAc,EAAE;IAAK,CAAC,CAAC;IAE1H,OAAO;MACLL,MAAM;MACNM,MAAM,EAAEL,KAAK,KAAK,KAAK;MACvBM,QAAQ,EAAEL;IACZ,CAAC;EACH,CAAC;AACH,CAAC;AAAAM,OAAA,CAAAnB,OAAA,GAAAC,QAAA"}
1
+ {"version":3,"file":"validation.js","names":["_marcRecordValidate","_interopRequireDefault","require","_marcRecordValidatorsMelinda","_melindaBackendCommons","obj","__esModule","default","_default","logger","createLogger","verbose","validate","validateFactory","fieldStructure","tag","valuePattern","unvalidRecord","record","valid","report","fix","validateFixes","subfieldValues","failed","messages","exports"],"sources":["../../src/helpers/validation.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport validateFactory from '@natlibfi/marc-record-validate';\nimport {\n FieldStructure as fieldStructure\n} from '@natlibfi/marc-record-validators-melinda';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\n\nexport default async () => {\n const logger = createLogger();\n\n logger.verbose('Running inbuilt record validations');\n const validate = validateFactory([await fieldStructure([{tag: /^003$/u, valuePattern: /^FI-MELINDA$/u}])]);\n\n return async unvalidRecord => {\n const {record, valid, report} = await validate(unvalidRecord, {fix: false, validateFixes: false}, {subfieldValues: false});\n\n return {\n record,\n failed: valid === false,\n messages: report\n };\n };\n};\n"],"mappings":";;;;;;AA4BA,IAAAA,mBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,4BAAA,GAAAD,OAAA;AAGA,IAAAE,sBAAA,GAAAF,OAAA;AAA+D,SAAAD,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAhC/D;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;AA1BA,IAAAG,QAAA,GAkCe,MAAAA,CAAA,KAAY;EACzB,MAAMC,MAAM,GAAG,IAAAC,mCAAY,EAAC,CAAC;EAE7BD,MAAM,CAACE,OAAO,CAAC,oCAAoC,CAAC;EACpD,MAAMC,QAAQ,GAAG,IAAAC,2BAAe,EAAC,CAAC,MAAM,IAAAC,2CAAc,EAAC,CAAC;IAACC,GAAG,EAAE,QAAQ;IAAEC,YAAY,EAAE;EAAe,CAAC,CAAC,CAAC,CAAC,CAAC;EAE1G,OAAO,MAAMC,aAAa,IAAI;IAC5B,MAAM;MAACC,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAG,MAAMR,QAAQ,CAACK,aAAa,EAAE;MAACI,GAAG,EAAE,KAAK;MAAEC,aAAa,EAAE;IAAK,CAAC,EAAE;MAACC,cAAc,EAAE;IAAK,CAAC,CAAC;IAE1H,OAAO;MACLL,MAAM;MACNM,MAAM,EAAEL,KAAK,KAAK,KAAK;MACvBM,QAAQ,EAAEL;IACZ,CAAC;EACH,CAAC;AACH,CAAC;AAAAM,OAAA,CAAAnB,OAAA,GAAAC,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.spec.js","names":["_chai","require","_fixura","_interopRequireWildcard","_marcRecord","_validation","_interopRequireDefault","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","describe","FIXTURES_PATH","__dirname","getFixture","fixtureFactory","root","reader","READERS","JSON","it","validator","createValidator","record","MarcRecord","components","result","toObject","expected","expect","to","eql","failed","equal"],"sources":["../../src/helpers/validation.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {expect} from 'chai';\nimport fixtureFactory, {READERS} from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport createValidator from './validation';\n\ndescribe('services/validate', () => {\n const FIXTURES_PATH = [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'validation'\n ];\n const {getFixture} = fixtureFactory({root: FIXTURES_PATH, reader: READERS.JSON});\n\n describe('f003-fi-melinda', () => {\n it('Should have failed: false', async () => {\n const validator = await createValidator();\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f003-fi-melinda.json'\n ]\n }));\n const result = await validator(record.toObject());\n const expected = getFixture({\n components: [\n 'out',\n 'f003-fi-melinda.json'\n ]\n });\n expect(result).to.eql(expected);\n expect(result.failed).to.equal(false);\n });\n });\n\n describe('f003-not-fi-melinda', () => {\n it('Should have failed: true', async () => {\n const validator = await createValidator();\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f003-not-fi-melinda.json'\n ]\n }));\n const result = await validator(record.toObject());\n const expected = getFixture({\n components: [\n 'out',\n 'f003-not-fi-melinda.json'\n ]\n });\n expect(result).to.eql(expected);\n expect(result.failed).to.equal(true);\n });\n });\n});\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.spec.js","names":["_chai","require","_fixura","_interopRequireWildcard","_marcRecord","_validation","_interopRequireDefault","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","describe","FIXTURES_PATH","__dirname","getFixture","fixtureFactory","root","reader","READERS","JSON","it","validator","createValidator","record","MarcRecord","components","result","toObject","expected","expect","to","eql","failed","equal"],"sources":["../../src/helpers/validation.spec.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {expect} from 'chai';\nimport fixtureFactory, {READERS} from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport createValidator from './validation';\n\ndescribe('services/validate', () => {\n const FIXTURES_PATH = [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'validation'\n ];\n const {getFixture} = fixtureFactory({root: FIXTURES_PATH, reader: READERS.JSON});\n\n describe('f003-fi-melinda', () => {\n it('Should have failed: false', async () => {\n const validator = await createValidator();\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f003-fi-melinda.json'\n ]\n }));\n const result = await validator(record.toObject());\n const expected = getFixture({\n components: [\n 'out',\n 'f003-fi-melinda.json'\n ]\n });\n expect(result).to.eql(expected);\n expect(result.failed).to.equal(false);\n });\n });\n\n describe('f003-not-fi-melinda', () => {\n it('Should have failed: true', async () => {\n const validator = await createValidator();\n const record = new MarcRecord(getFixture({\n components: [\n 'in',\n 'f003-not-fi-melinda.json'\n ]\n }));\n const result = await validator(record.toObject());\n const expected = getFixture({\n components: [\n 'out',\n 'f003-not-fi-melinda.json'\n ]\n });\n expect(result).to.eql(expected);\n expect(result.failed).to.equal(true);\n });\n });\n});\n\n"],"mappings":"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"}
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","obj","__esModule","default","_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","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","limit","skip","rest","find","projection","_id","parseInt","toArray","length","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","silly","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","JSON","stringify","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","Object","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","keys","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","filter","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-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {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 const {showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n const {limit = 1000, skip = 0, ...rest} = params;\n const result = await db.collection(collection).find(rest, {projection: {\n _id: 0,\n operations: showOperations,\n operationSettings: showOperationSettings,\n recordLoadParams: showRecordLoadParams,\n importJobState: showImportJobState\n }})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n return result;\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(`OperationSetting 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","obj","__esModule","default","_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","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","limit","skip","rest","find","projection","_id","parseInt","toArray","length","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","silly","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","JSON","stringify","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","Object","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","keys","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","filter","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-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {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 const {showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n const {limit = 1000, skip = 0, ...rest} = params;\n const result = await db.collection(collection).find(rest, {projection: {\n _id: 0,\n operations: showOperations,\n operationSettings: showOperationSettings,\n recordLoadParams: showRecordLoadParams,\n importJobState: showImportJobState\n }})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n return result;\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(`OperationSetting 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 +1 @@
1
- {"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","obj","__esModule","default","_default","MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","getExpandedListOfLogs","protect","remove","removeBySequences","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","errorMessage","payload","message","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","silly","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","force","clean","$ne","deleteMany","deletedCount","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n 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 query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n checkLogItemType(params.logItemType, false, false);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function getExpandedListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n {'$match': {'logItemType': {'$in': ['MERGE_LOG', 'MATCH_LOG']}}},\n {'$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}},\n {'$group':\n {'_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n // We don't currently have cataloger in logs, this will always be null\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}}}\n ];\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return {status: fixedResult.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: fixedResult.length > 0 ? fixedResult : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\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 remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (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 removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (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 checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","obj","__esModule","default","_default","MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","getExpandedListOfLogs","protect","remove","removeBySequences","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","errorMessage","payload","message","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","silly","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","force","clean","$ne","deleteMany","deletedCount","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n 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 query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n checkLogItemType(params.logItemType, false, false);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function getExpandedListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n {'$match': {'logItemType': {'$in': ['MERGE_LOG', 'MATCH_LOG']}}},\n {'$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}},\n {'$group':\n {'_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n // We don't currently have cataloger in logs, this will always be null\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}}}\n ];\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return {status: fixedResult.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: fixedResult.length > 0 ? fixedResult : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\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 remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (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 removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (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 checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -19,7 +19,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
19
19
  *
20
20
  * Shared modules for microservices of Melinda rest api batch import system
21
21
  *
22
- * Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)
22
+ * Copyright (C) 2020-2021, 2023 University Of Helsinki (The National Library Of Finland)
23
23
  *
24
24
  * This file is part of melinda-rest-api-commons
25
25
  *
@@ -107,6 +107,15 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
107
107
  message
108
108
  };
109
109
  }
110
+
111
+ // More detailed SKIPPED statuses
112
+ if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {
113
+ return {
114
+ recordStatus: 'SKIPPED',
115
+ detailedRecordStatus: responseStatus,
116
+ message
117
+ };
118
+ }
110
119
  if (['UNKNOWN'].includes(responseStatus)) {
111
120
  return {
112
121
  recordStatus: 'ERROR',
@@ -174,10 +183,12 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
174
183
  }
175
184
 
176
185
  // Otherwise
186
+ logger.debug(`Unknown responseStatus: ${responseStatus}`);
187
+ const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;
177
188
  return {
178
189
  recordStatus: 'ERROR',
179
190
  detailedRecordStatus: responseStatus,
180
- message
191
+ message: newMessage
181
192
  };
182
193
  }
183
194
  function getMessageFromResponsePayload(responsePayload) {
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_melindaBackendCommons","require","_melindaCommons","_constants","_httpStatus","_interopRequireDefault","obj","__esModule","default","logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","httpStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\n// eslint-disable-next-line max-statements\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n // Otherwise\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts\nexport async function addRecordResponseItems({recordResponseItems, correlationId, mongoOperator}) {\n if (!Array.isArray(recordResponseItems)) {\n throw new Error('RecordResponseItems is not an array!');\n }\n await mongoOperator.pushMessages({correlationId, messages: recordResponseItems, messageField: 'records'});\n return true;\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["_melindaBackendCommons","require","_melindaCommons","_constants","_httpStatus","_interopRequireDefault","obj","__esModule","default","logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","httpStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","newMessage","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021, 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 {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\n// eslint-disable-next-line max-statements\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n // More detailed SKIPPED statuses\n if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {\n return {recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n // Otherwise\n logger.debug(`Unknown responseStatus: ${responseStatus}`);\n const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts\nexport async function addRecordResponseItems({recordResponseItems, correlationId, mongoOperator}) {\n if (!Array.isArray(recordResponseItems)) {\n throw new Error('RecordResponseItems is not an array!');\n }\n await mongoOperator.pushMessages({correlationId, messages: recordResponseItems, messageField: 'records'});\n return true;\n}\n\n"],"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.4-alpha.2",
17
+ "version": "4.0.5-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=18"
@@ -41,22 +41,22 @@
41
41
  "@natlibfi/marc-record": "^7.2.2",
42
42
  "@natlibfi/marc-record-serializers": "^10.0.4",
43
43
  "@natlibfi/marc-record-validate": "^8.0.0",
44
- "@natlibfi/marc-record-validators-melinda": "^10.3.2",
45
- "@natlibfi/melinda-backend-commons": "^2.1.0",
44
+ "@natlibfi/marc-record-validators-melinda": "^10.7.1",
45
+ "@natlibfi/melinda-backend-commons": "^2.2.0",
46
46
  "@natlibfi/melinda-commons": "^13.0.4",
47
47
  "amqplib": ">=0.10.3 <1.0.0",
48
48
  "debug": "^4.3.4",
49
49
  "http-status": "^1.6.2",
50
50
  "moment": "^2.29.4",
51
51
  "mongo-sanitize": "^1.1.0",
52
- "mongodb": "^4.13.0"
52
+ "mongodb": "^4.16.0"
53
53
  },
54
54
  "devDependencies": {
55
- "@babel/cli": "^7.21.0",
56
- "@babel/core": "^7.21.4",
57
- "@babel/eslint-parser": "^7.21.3",
55
+ "@babel/cli": "^7.21.5",
56
+ "@babel/core": "^7.21.8",
57
+ "@babel/eslint-parser": "^7.21.8",
58
58
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
59
- "@babel/preset-env": "^7.21.4",
59
+ "@babel/preset-env": "^7.21.5",
60
60
  "@natlibfi/eslint-config-melinda-backend": "^3.0.0",
61
61
  "@natlibfi/fixugen": "^2.0.0",
62
62
  "@natlibfi/fixura": "^3.0.0",
@@ -65,7 +65,7 @@
65
65
  "babel-plugin-rewire": "^1.2.0",
66
66
  "chai": "^4.3.7",
67
67
  "cross-env": "^7.0.3",
68
- "eslint": "^8.38.0",
68
+ "eslint": "^8.40.0",
69
69
  "mocha": "^10.2.0",
70
70
  "nodemon": "^2.0.22",
71
71
  "nyc": "^15.1.0"