@natlibfi/melinda-rest-api-commons 4.1.7 → 4.1.8-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","debug","createDebugLogger","setTimeoutPromise","promisify","setTimeout","describe","it","amqpUrl","amqpOperator","amqpFactory","awaitTime","closeConnection","close","closeChannel"],"sources":["../src/amqp.health.spec.js"],"sourcesContent":["//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":";;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAMA,IAAAE,KAAA,GAAAF,OAAA;AARA;;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","ignoreList":[]}
1
+ {"version":3,"file":"amqp.health.spec.js","names":["_debug","_interopRequireDefault","require","_index","_util","debug","createDebugLogger","setTimeoutPromise","promisify","setTimeout","describe","it","amqpUrl","amqpOperator","amqpFactory","awaitTime","closeConnection","close","closeChannel"],"sources":["../src/amqp.health.spec.js"],"sourcesContent":["//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":";;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAMA,IAAAE,KAAA,GAAAF,OAAA;AARA;;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,CAAC,sFAAsF,CAAC;IAC7F,MAAMO,OAAO,GAAG,wBAAwB;IAExC,MAAMC,YAAY,GAAG,MAAM,IAAAC,kBAAW,EAACF,OAAO,EAAE,IAAI,CAAC;IACrDP,KAAK,CAAC,iBAAiBO,OAAO,4BAA4B,CAAC;IAC3D,MAAMG,SAAS,CAACF,YAAY,EAAE,KAAK,CAAC;IAEpCR,KAAK,CAAC,+BAA+BQ,YAAY,EAAE,CAAC;IACpDR,KAAK,CAAC,oDAAoD,CAAC;IAC3D,MAAMU,SAAS,CAACF,YAAY,EAAE,KAAK,CAAC;IACpCR,KAAK,CAAC,uCAAuC,CAAC;IAE9CA,KAAK,CAAC,6CAA6C,CAAC;IACpDA,KAAK,CAAC,2DAA2D,CAAC;IAClE,MAAMU,SAAS,CAACF,YAAY,EAAE,IAAI,CAAC;IACnCR,KAAK,CAAC,yCAAyC,CAAC;IAEhDA,KAAK,CAAC,oBAAoB,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","ignoreList":[]}
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","_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","subfieldValues","messagesToGet","CHUNK_SIZE","pump","count","results","identifiers","identifier","deliveryTag","fields","includes","concat","undefined","newError","status","payload","logError"],"sources":["../src/amqp.js"],"sourcesContent":["import 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 // Use subfieldValues: false validationOption here\n return new MarcRecord(content.data, {subfieldValues: false});\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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","ignoreList":[]}
1
+ {"version":3,"file":"amqp.js","names":["_amqplib","_interopRequireDefault","require","_marcRecord","_melindaCommons","_melindaBackendCommons","_debug","_constants","_util","_httpStatus","_utils","_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","subfieldValues","messagesToGet","CHUNK_SIZE","pump","count","results","identifiers","identifier","deliveryTag","fields","includes","concat","undefined","newError","status","payload","logError"],"sources":["../src/amqp.js"],"sourcesContent":["import 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 // Use subfieldValues: false validationOption here\n return new MarcRecord(content.data, {subfieldValues: false});\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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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"amqp.tests.spec.js","names":["_chai","require","_fixura","_debug","_interopRequireDefault","_fixugen","_index","_melindaCommons","_util","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":["import {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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","ignoreList":[]}
1
+ {"version":3,"file":"amqp.tests.spec.js","names":["_chai","require","_fixura","_debug","_interopRequireDefault","_fixugen","_index","_melindaCommons","_util","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":["import {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":";;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,QAAA,GAAAD,sBAAA,CAAAH,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AACA,IAAAM,eAAA,GAAAN,OAAA;AACA,IAAAO,KAAA,GAAAP,OAAA;AAEA,MAAMQ,iBAAiB,GAAG,IAAAC,eAAS,EAACC,UAAU,CAAC;AAC/C,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,8CAA8C,CAAC;AAC/E;;AAEA,MAAMC,QAAQ,GAAG;EACfC,KAAK,EAAE,WAAW;EAClBC,aAAa,EAAE,sCAAsC;EACrDC,IAAI,EAAE;IAAC,QAAQ,EAAE,0BAA0B;IAAE,QAAQ,EAAE,CAAC;MAAC,KAAK,EAAE,KAAK;MAAE,OAAO,EAAE;IAAW,CAAC;EAAC;AAC/F,CAAC;AAEDL,KAAK,CAAC,sFAAsF,CAAC;AAC7F,MAAMM,OAAO,GAAG,wBAAwB;AACxC;AACA,IAAIC,YAAY;AAEhB,IAAAC,gBAAa,EAAC;EACZC,QAAQ;EACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,CAAC;EAChDC,OAAO,EAAE,KAAK;EACdC,eAAe,EAAE,IAAI;EACrBC,MAAM,EAAE;IACNC,gBAAgB,EAAE,IAAI;IACtBC,MAAM,EAAEC,eAAO,CAACC;EAClB,CAAC;EACDC,KAAK,EAAE;IACLC,MAAM,EAAE,MAAAA,CAAA,KAAY;MAClBpB,KAAK,CAAC,iBAAiBM,OAAO,4BAA4B,CAAC;MAC3DC,YAAY,GAAG,MAAM,IAAAc,kBAAW,EAACf,OAAO,EAAE,IAAI,CAAC;IACjD,CAAC;IACDgB,UAAU,EAAE,MAAAA,CAAA,KAAY;MACtB,MAAMf,YAAY,CAACgB,UAAU,CAAC;QAACpB,KAAK,EAAED,QAAQ,CAACC,KAAK;QAAEqB,QAAQ,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAI,CAAC,CAAC;IACtF,CAAC;IACDC,SAAS,EAAE,MAAAA,CAAA,KAAY;MACrB,MAAMnB,YAAY,CAACoB,WAAW,CAACzB,QAAQ,CAACC,KAAK,CAAC;IAChD,CAAC;IACDyB,KAAK,EAAE,MAAAA,CAAA,KAAY;MACjB,MAAMrB,YAAY,CAACsB,eAAe,CAAC,CAAC;MACpC;IACF;EACF;AACF,CAAC,CAAC;;AAEF;AACA,eAAepB,QAAQA,CAAC;EACtBqB,UAAU;EACVC,YAAY,GAAG,KAAK;EACpBC,mBAAmB,GAAG,EAAE;EACxBC,WAAW,GAAG,KAAK;EACnBC,YAAY,GAAG,KAAK;EACpBC,gBAAgB,GAAG,KAAK;EACxBC,eAAe,GAAG,KAAK;EACvBjC,KAAK,GAAGD,QAAQ,CAACC,KAAK;EACtBkC,WAAW;EACXC,oBAAoB;EACpBX,WAAW,GAAG,KAAK;EACnBY,oBAAoB,GAAGC,SAAS;EAChCC,cAAc,GAAG,KAAK;EACtBC,sBAAsB,GAAG;AAC3B,CAAC,EAAE;EACD,IAAI;IACF,MAAMC,mBAAmB,CAAC,CAAC;IAE3B,MAAMC,iBAAiB,CAAC,CAAC;IAEzB,MAAMrB,UAAU,CAAC,CAAC;IAElB,MAAMsB,YAAY,CAAC,CAAC;IAEpB,MAAMC,YAAY,GAAG,MAAMvC,YAAY,CAACgB,UAAU,CAAC;MAACpB,KAAK;MAAE4C,KAAK,EAAE;IAAU,CAAC,CAAC;IAC9E/C,KAAK,CAAC,iBAAiB8C,YAAY,EAAE,CAAC;IACtC,IAAAE,YAAM,EAACF,YAAY,CAAC,CAACG,EAAE,CAACC,GAAG,CAACZ,oBAAoB,CAAC;IAEjD,IAAIH,gBAAgB,EAAE;MACpB,MAAM;QAACgB,OAAO;QAAEC;MAAO,CAAC,GAAG,MAAMC,qBAAqB,CAAC,CAAC;MACxD,MAAMC,WAAW,GAAG;QAACH,OAAO;QAAEC;MAAO,CAAC;MACtC,MAAMG,mBAAmB,GAAGzB,UAAU,CAAC,sBAAsB,CAAC;MAC9D,IAAAkB,YAAM,EAACM,WAAW,CAAC,CAACL,EAAE,CAACC,GAAG,CAACK,mBAAmB,CAAC;MAC/C;IACF;EAEF,CAAC,CAAC,OAAOC,KAAK,EAAE;IACd,IAAI,CAACzB,YAAY,EAAE;MACjB,MAAMyB,KAAK;IACb;IACA,IAAAR,YAAM,EAACjB,YAAY,EAAE,0BAA0B,CAAC,CAACkB,EAAE,CAACQ,KAAK,CAAC,IAAI,CAAC;IAC/DC,UAAU,CAACF,KAAK,CAAC;EACnB;EAEA,SAASE,UAAUA,CAACF,KAAK,EAAE;IAEzB,IAAIf,cAAc,EAAE;MAClB,IAAAO,YAAM,EAACQ,KAAK,CAAC,CAACP,EAAE,CAACU,EAAE,CAACC,UAAU,CAACC,qBAAQ,CAAC;MACxC7D,KAAK,CAAC,iCAAiC,CAAC;MACxC,IAAAgD,YAAM,EAACQ,KAAK,CAACM,MAAM,CAAC,CAACb,EAAE,CAACQ,KAAK,CAACzB,mBAAmB,CAAC;MAElD,IAAIO,oBAAoB,EAAE;QACxB,IAAAS,YAAM,EAACQ,KAAK,CAACO,OAAO,CAAC,CAACd,EAAE,CAACC,GAAG,CAACX,oBAAoB,CAAC;QAClD;MACF;MAEA;IACF;IACA,IAAAS,YAAM,EAACQ,KAAK,CAAC,CAACQ,GAAG,CAACf,EAAE,CAACU,EAAE,CAACC,UAAU,CAACC,qBAAQ,CAAC;IAC5C7D,KAAK,CAAC,qCAAqC,CAAC;IAC5CA,KAAK,CAAC,cAAcwD,KAAK,CAACS,WAAW,CAACC,IAAI,EAAE,CAAC;EAC/C;EAEA,SAASrB,YAAYA,CAAA,EAAG;IACtB,IAAIlB,WAAW,EAAE;MACf,OAAOpB,YAAY,CAACoB,WAAW,CAACA,WAAW,CAAC;IAC9C;IAEA;EACF;EAEA,SAAS0B,qBAAqBA,CAAA,EAAG;IAC/B,IAAIlB,gBAAgB,EAAE;MACpB,OAAO5B,YAAY,CAAC4D,UAAU,CAACjE,QAAQ,CAACC,KAAK,EAAE,IAAI,CAAC;IACtD;IAEA,OAAO,KAAK;EACd;;EAEA;EACA,eAAeoB,UAAUA,CAAA,EAAG;IAC1BvB,KAAK,CAAC,oBAAoBoC,eAAe,EAAE,CAAC;IAE5C,IAAIA,eAAe,KAAK,aAAa,EAAE;MACrC,MAAMgC,MAAM,GAAG,MAAM7D,YAAY,CAACgB,UAAU,CAAC;QAACpB,KAAK;QAAE4C,KAAK,EAAE,KAAK;QAAEvB,QAAQ,EAAE,IAAI;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAEjG,IAAIiB,sBAAsB,EAAE;QAC1B,IAAAM,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACC,GAAG,CAAC,KAAK,CAAC;QAC5B;MACF;MAEA,IAAAF,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,SAAS,CAAC;MAC1C,IAAAtB,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,SAAS,CAAC;MAC1C,IAAAtB,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,UAAU,CAAC;MAC3C,IAAAtB,YAAM,EAACoB,MAAM,CAAChB,OAAO,CAACmB,MAAM,CAAC,CAACtB,EAAE,CAACC,GAAG,CAAC,CAAC,CAAC;MACvC,IAAAF,YAAM,EAACoB,MAAM,CAACI,QAAQ,CAACD,MAAM,CAAC,CAACtB,EAAE,CAACC,GAAG,CAAC,CAAC,CAAC;MAExC;IACF;IAEA,IAAId,eAAe,KAAK,cAAc,EAAE;MACtC,MAAMgC,MAAM,GAAG,MAAM7D,YAAY,CAACgB,UAAU,CAAC;QAACpB,KAAK;QAAE4C,KAAK,EAAE,KAAK;QAAEvB,QAAQ,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAClG,MAAM;QAACgD;MAAM,CAAC,GAAGL,MAAM;MAEvB,IAAI1B,sBAAsB,EAAE;QAC1B,IAAAM,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACC,GAAG,CAAC,KAAK,CAAC;QAC5B;MACF;MAEA,IAAAF,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,aAAa,CAAC;MAC9C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,UAAU,CAAC;MAC3C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,cAAc,CAAC;MAC/C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,aAAa,CAAC;MAC9C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,YAAY,CAAC;MAC7C,IAAAtB,YAAM,EAAC,OAAOyB,MAAM,CAACC,WAAW,CAAC,CAACzB,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,QAAQ,CAAC;MACrD,IAAAF,YAAM,EAAC,OAAOyB,MAAM,CAAC3B,YAAY,CAAC,CAACG,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,QAAQ,CAAC;MACtD,IAAAF,YAAM,EAAC,OAAOyB,MAAM,CAACE,WAAW,CAAC,CAAC1B,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,SAAS,CAAC;MACtD,IAAAF,YAAM,EAAC,OAAOyB,MAAM,CAACG,UAAU,CAAC,CAAC3B,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,QAAQ,CAAC;MAEpD;IACF;IAEA,IAAId,eAAe,KAAK,eAAe,EAAE;MACvC,MAAMgC,MAAM,GAAG,MAAM7D,YAAY,CAACgB,UAAU,CAAC;QAACpB,KAAK;QAAE4C,KAAK,EAAE,OAAO;QAAEvB,QAAQ,EAAE,IAAI;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAEnG,IAAIiB,sBAAsB,EAAE;QAC1B,IAAAM,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACC,GAAG,CAAC,KAAK,CAAC;QAC5B;MACF;MAEA,IAAAF,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,SAAS,CAAC;MAC1C,IAAAtB,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,SAAS,CAAC;MAC1C,IAAAtB,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,UAAU,CAAC;MAC3C,IAAAtB,YAAM,EAACoB,MAAM,CAAChB,OAAO,CAACmB,MAAM,CAAC,CAACtB,EAAE,CAACC,GAAG,CAAC,CAAC,CAAC;MACvC,IAAAF,YAAM,EAACoB,MAAM,CAACI,QAAQ,CAACD,MAAM,CAAC,CAACtB,EAAE,CAACC,GAAG,CAAC,CAAC,CAAC;MACxC,MAAM2B,cAAc,GAAG/C,UAAU,CAAC,qBAAqB,CAAC;MACxD,IAAAkB,YAAM,EAACoB,MAAM,CAAChB,OAAO,CAAC,CAACH,EAAE,CAACC,GAAG,CAAC2B,cAAc,CAAC;MAE7C;IACF;IAEA,IAAIzC,eAAe,KAAK,gBAAgB,EAAE;MACxC,MAAMgC,MAAM,GAAG,MAAM7D,YAAY,CAACgB,UAAU,CAAC;QAACpB,KAAK;QAAE4C,KAAK,EAAE,OAAO;QAAEvB,QAAQ,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;MAEpG,IAAIiB,sBAAsB,EAAE;QAC1B,IAAAM,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACC,GAAG,CAAC,KAAK,CAAC;QAC5B;MACF;MAEA,IAAAF,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,SAAS,CAAC;MAC1C,IAAAtB,YAAM,EAACoB,MAAM,CAAC,CAACnB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,UAAU,CAAC;MAC3C,IAAAtB,YAAM,EAACoB,MAAM,CAACI,QAAQ,CAACD,MAAM,CAAC,CAACtB,EAAE,CAACC,GAAG,CAAC,CAAC,CAAC;MAExC,MAAM,CAAC;QAACuB;MAAM,CAAC,CAAC,GAAGL,MAAM,CAACI,QAAQ;MAElC,IAAAxB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,aAAa,CAAC;MAC9C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,UAAU,CAAC;MAC3C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,cAAc,CAAC;MAC/C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,aAAa,CAAC;MAC9C,IAAAtB,YAAM,EAACyB,MAAM,CAAC,CAACxB,EAAE,CAACoB,IAAI,CAACC,QAAQ,CAAC,YAAY,CAAC;MAE7C,IAAAtB,YAAM,EAAC,OAAOyB,MAAM,CAACC,WAAW,CAAC,CAACzB,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,QAAQ,CAAC;MACrD,IAAAF,YAAM,EAAC,OAAOyB,MAAM,CAAC3B,YAAY,CAAC,CAACG,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,QAAQ,CAAC;MACtD,IAAAF,YAAM,EAAC,OAAOyB,MAAM,CAACE,WAAW,CAAC,CAAC1B,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,SAAS,CAAC;MACtD,IAAAF,YAAM,EAAC,OAAOyB,MAAM,CAACG,UAAU,CAAC,CAAC3B,EAAE,CAACU,EAAE,CAACT,GAAG,CAAC,QAAQ,CAAC;MAEpD;IACF;IAEA,IAAId,eAAe,KAAK,OAAO,EAAE;MAC/B,OAAO7B,YAAY,CAACgB,UAAU,CAAC;QAACpB,KAAK;QAAE4C,KAAK,EAAE,UAAU;QAAEtB,KAAK,EAAE;MAAI,CAAC,CAAC;IACzE;IAEA,IAAIW,eAAe,KAAK,QAAQ,EAAE;MAChC,OAAO7B,YAAY,CAACgB,UAAU,CAAC;QAACpB,KAAK;QAAE4C,KAAK,EAAE,QAAQ;QAAEvB,QAAQ,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC;IACzF;IAEA,OAAO,KAAK;EACd;EAEA,eAAemB,iBAAiBA,CAAA,EAAG;IACjC,IAAIX,WAAW,EAAE;MACf,MAAM6C,OAAO,GAAG,MAAMvE,YAAY,CAAC4D,UAAU,CAACjE,QAAQ,CAACC,KAAK,EAAE,KAAK,CAAC;MACpE,MAAMI,YAAY,CAAC0B,WAAW,CAAC,CAAC6C,OAAO,CAAC,CAAC;MAEzC,OAAOjF,iBAAiB,CAAC,EAAE,CAAC;IAC9B;IAEA,IAAIqC,YAAY,EAAE;MAChB,MAAM4C,OAAO,GAAG,MAAMvE,YAAY,CAAC4D,UAAU,CAACjE,QAAQ,CAACC,KAAK,EAAE,KAAK,CAAC;MACpE,MAAMI,YAAY,CAAC2B,YAAY,CAAC,CAAC4C,OAAO,CAAC,CAAC;MAE1C,OAAOjF,iBAAiB,CAAC,EAAE,CAAC;IAC9B;IAEA;EACF;EAEA,eAAe8C,mBAAmBA,CAAA,EAAG;IACnC,IAAIN,WAAW,EAAE;MACf,MAAMmC,QAAQ,GAAG1C,UAAU,CAAC,YAAY,CAAC;MACzC;;MAEA,MAAMiD,QAAQ,GAAGP,QAAQ,CAACQ,GAAG,CAACF,OAAO,IAAIvE,YAAY,CAAC0E,WAAW,CAACH,OAAO,CAAC,CAAC;MAC3E,MAAMI,OAAO,CAACC,GAAG,CAACJ,QAAQ,CAAC;MAE3B,OAAOlF,iBAAiB,CAAC,EAAE,CAAC;IAC9B;IAEA;EACF;AACF;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"conversion.js","names":["_httpStatus","_interopRequireDefault","require","_marcRecordSerializers","_melindaBackendCommons","_melindaCommons","_constants","_utils","_default","logger","createLogger","serialize","unserialize","record","format","verbose","CONVERSION_FORMATS","MARCXML","to","ISO2709","JSON","Json","ALEPHSEQ","AlephSequential","ConversionError","httpStatus","UNSUPPORTED_MEDIA_TYPE","err","logError","message","payload","debug","BAD_REQUEST","data","validationOptions","subfieldValues","silly","stringify","from"],"sources":["../../src/helpers/conversion.js"],"sourcesContent":["\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 const message = err.message || err.payload?.message || err.payload;\n logger.debug(`${message}`);\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. ${message}`);\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 const message = err.message || err.payload?.message || err.payload;\n logger.debug(`${message}`);\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. ${message}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"conversion.js","names":["_httpStatus","_interopRequireDefault","require","_marcRecordSerializers","_melindaBackendCommons","_melindaCommons","_constants","_utils","_default","logger","createLogger","serialize","unserialize","record","format","verbose","CONVERSION_FORMATS","MARCXML","to","ISO2709","JSON","Json","ALEPHSEQ","AlephSequential","ConversionError","httpStatus","UNSUPPORTED_MEDIA_TYPE","err","logError","message","payload","debug","BAD_REQUEST","data","validationOptions","subfieldValues","silly","stringify","from"],"sources":["../../src/helpers/conversion.js"],"sourcesContent":["\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 const message = err.message || err.payload?.message || err.payload;\n logger.debug(`${message}`);\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. ${message}`);\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 const message = err.message || err.payload?.message || err.payload;\n logger.debug(`${message}`);\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. ${message}`);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"fix-handle-tempurns.js","names":["_debug","_interopRequireDefault","require","debug","createDebugLogger","debugData","extend","handleTempUrns","newRecord","options","JSON","stringify","f856sUrnsWithTempSubfields","f856sUrnsWithNoTempSubfields","getf856sUrns","length","existingLegalDepositURN","validateLD","removeFields","fixedFields","map","removeTempSubfield","filter","field","insertFields","hasURN","f","tag","subfields","some","code","value","test","hasTempSubfield","hasNoTempSubfield","f856sUrn","fields","LD_SUBFIELDS","f856sUrnWithLdSubfields","fieldHasLDSubfields","ldSubfields","every","ldsf","sf","isNaN","parseInt","filteredSubfields","ind1","ind2"],"sources":["../../src/helpers/fix-handle-tempurns.js"],"sourcesContent":["\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:handleTempUrns');\nconst debugData = debug.extend('data');\n\n// eslint-disable-next-line max-statements\nexport function handleTempUrns(newRecord, options) {\n\n if (options !== true) {\n debug(`NOT running handleTempUrns fixer, no options`);\n return newRecord;\n }\n\n debug(`Running handleTempUrns fixer`);\n debugData(`Options for handleTempUrns: ${JSON.stringify(options)}`);\n\n const {f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields} = getf856sUrns(newRecord);\n\n // None of the URNs has temp subfields, we don't need to do anything\n if (f856sUrnsWithTempSubfields.length < 1) {\n debug(`No Urns with temp subfield`);\n return newRecord;\n }\n\n // Do we have an existing URN with legal deposit subfields, if we have, we can remove the temp URN field(s)\n const existingLegalDepositURN = validateLD(f856sUrnsWithNoTempSubfields);\n debug(`existingLegalDepositURN: ${existingLegalDepositURN}`);\n\n if (existingLegalDepositURN) {\n debug(`We have an existing LD URN, we can delete temp fields (${f856sUrnsWithTempSubfields.length})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n return newRecord;\n }\n\n // We do not have an existing legalDepositURN, we should use the tempURN and remove the temp subfields from it\n if (!existingLegalDepositURN && f856sUrnsWithTempSubfields.length > 0) {\n //debug(`All Urns (${f856sUrn.length}) have a temp subfield`);\n debugData(`Original temp URNs: (${JSON.stringify(f856sUrnsWithTempSubfields)})`);\n const fixedFields = f856sUrnsWithTempSubfields.map(removeTempSubfield).filter(field => field);\n debug(`We removed temp subfields: (${JSON.stringify(fixedFields)})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n newRecord.insertFields(fixedFields);\n return newRecord;\n }\n // Should we check that the non-temp URN has 2nd ind '0' - meaning that the URN handles the actual resource itself?\n}\n\nfunction getf856sUrns(newRecord) {\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n const hasTempSubfield = f => f.subfields.some(({code, value}) => code === '9' && (/^MELINDA<TEMP>$/u).test(value));\n const hasNoTempSubfield = f => !f.subfields.some(({code, value}) => code === '9' && (/^MELINDA<TEMP>$/u).test(value));\n\n const f856sUrn = newRecord.fields.filter(hasURN);\n const f856sUrnsWithTempSubfields = f856sUrn.filter(hasTempSubfield);\n const f856sUrnsWithNoTempSubfields = f856sUrn.filter(hasNoTempSubfield);\n\n debugData(`URN f856s: ${JSON.stringify(f856sUrn)}`);\n debugData(`URN f856s with temp subfield: ${JSON.stringify(f856sUrnsWithTempSubfields)}`);\n return {f856sUrn, f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields};\n}\n\n\n// ---- LD-functions below are same as in https://github.com/NatLibFi/marc-record-validators-melinda/blob/feature-updates-to-urn/src/urn.js\n// we propably should develop the urn/legaldeposit -validator to use also here\n\nfunction validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n\n const LD_SUBFIELDS = [\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ];\n\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, LD_SUBFIELDS));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n}\n\nfunction fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n}\n\nfunction removeTempSubfield(field) {\n\n // Handle non-numeric fields, and fields with a numeric tag of 010 and greater\n // Aleph's FMT as a controlfield might be a problem\n if (!isNaN(field.tag) && parseInt(field.tag, 10) >= 10) {\n\n const filteredSubfields = field.subfields.filter(sf => sf.code !== '9' && !(/^MELINDA<TEMP>$/u).test(sf.value));\n\n // Remove whole field if there are no subfields left\n if (filteredSubfields.length < 1) {\n return false;\n }\n\n return {\n tag: field.tag,\n ind1: field.ind1,\n ind2: field.ind2,\n subfields: filteredSubfields\n };\n }\n // return controlFields as is\n return field;\n}\n\n\n"],"mappings":";;;;;;;AAGA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AADA;;AAGA,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,6DAA6D,CAAC;AAC9F,MAAMC,SAAS,GAAGF,KAAK,CAACG,MAAM,CAAC,MAAM,CAAC;;AAEtC;AACO,SAASC,cAAcA,CAACC,SAAS,EAAEC,OAAO,EAAE;EAEjD,IAAIA,OAAO,KAAK,IAAI,EAAE;IACpBN,KAAK,CAAE,8CAA6C,CAAC;IACrD,OAAOK,SAAS;EAClB;EAEAL,KAAK,CAAE,8BAA6B,CAAC;EACrCE,SAAS,CAAE,+BAA8BK,IAAI,CAACC,SAAS,CAACF,OAAO,CAAE,EAAC,CAAC;EAEnE,MAAM;IAACG,0BAA0B;IAAEC;EAA4B,CAAC,GAAGC,YAAY,CAACN,SAAS,CAAC;;EAE1F;EACA,IAAII,0BAA0B,CAACG,MAAM,GAAG,CAAC,EAAE;IACzCZ,KAAK,CAAE,4BAA2B,CAAC;IACnC,OAAOK,SAAS;EAClB;;EAEA;EACA,MAAMQ,uBAAuB,GAAGC,UAAU,CAACJ,4BAA4B,CAAC;EACxEV,KAAK,CAAE,4BAA2Ba,uBAAwB,EAAC,CAAC;EAE5D,IAAIA,uBAAuB,EAAE;IAC3Bb,KAAK,CAAE,0DAAyDS,0BAA0B,CAACG,MAAO,GAAE,CAAC;IACrGP,SAAS,CAACU,YAAY,CAACN,0BAA0B,CAAC;IAClD,OAAOJ,SAAS;EAClB;;EAEA;EACA,IAAI,CAACQ,uBAAuB,IAAIJ,0BAA0B,CAACG,MAAM,GAAG,CAAC,EAAE;IACrE;IACAV,SAAS,CAAE,wBAAuBK,IAAI,CAACC,SAAS,CAACC,0BAA0B,CAAE,GAAE,CAAC;IAChF,MAAMO,WAAW,GAAGP,0BAA0B,CAACQ,GAAG,CAACC,kBAAkB,CAAC,CAACC,MAAM,CAACC,KAAK,IAAIA,KAAK,CAAC;IAC7FpB,KAAK,CAAE,+BAA8BO,IAAI,CAACC,SAAS,CAACQ,WAAW,CAAE,GAAE,CAAC;IACpEX,SAAS,CAACU,YAAY,CAACN,0BAA0B,CAAC;IAClDJ,SAAS,CAACgB,YAAY,CAACL,WAAW,CAAC;IACnC,OAAOX,SAAS;EAClB;EACA;AACF;AAEA,SAASM,YAAYA,CAACN,SAAS,EAAE;EAC/B,MAAMiB,MAAM,GAAGC,CAAC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,IAAID,CAAC,CAACE,SAAS,CAACC,IAAI,CAAC,CAAC;IAACC,IAAI;IAAEC;EAAK,CAAC,KAAKD,IAAI,KAAK,GAAG,IAAK,SAAS,CAAEE,IAAI,CAACD,KAAK,CAAC,CAAC;EAEnH,MAAME,eAAe,GAAGP,CAAC,IAAIA,CAAC,CAACE,SAAS,CAACC,IAAI,CAAC,CAAC;IAACC,IAAI;IAAEC;EAAK,CAAC,KAAKD,IAAI,KAAK,GAAG,IAAK,kBAAkB,CAAEE,IAAI,CAACD,KAAK,CAAC,CAAC;EAClH,MAAMG,iBAAiB,GAAGR,CAAC,IAAI,CAACA,CAAC,CAACE,SAAS,CAACC,IAAI,CAAC,CAAC;IAACC,IAAI;IAAEC;EAAK,CAAC,KAAKD,IAAI,KAAK,GAAG,IAAK,kBAAkB,CAAEE,IAAI,CAACD,KAAK,CAAC,CAAC;EAErH,MAAMI,QAAQ,GAAG3B,SAAS,CAAC4B,MAAM,CAACd,MAAM,CAACG,MAAM,CAAC;EAChD,MAAMb,0BAA0B,GAAGuB,QAAQ,CAACb,MAAM,CAACW,eAAe,CAAC;EACnE,MAAMpB,4BAA4B,GAAGsB,QAAQ,CAACb,MAAM,CAACY,iBAAiB,CAAC;EAEvE7B,SAAS,CAAE,cAAaK,IAAI,CAACC,SAAS,CAACwB,QAAQ,CAAE,EAAC,CAAC;EACnD9B,SAAS,CAAE,iCAAgCK,IAAI,CAACC,SAAS,CAACC,0BAA0B,CAAE,EAAC,CAAC;EACxF,OAAO;IAACuB,QAAQ;IAAEvB,0BAA0B;IAAEC;EAA4B,CAAC;AAC7E;;AAGA;AACA;;AAEA,SAASI,UAAUA,CAACkB,QAAQ,EAAE;EAC5BhC,KAAK,CAAE,qDAAoD,CAAC;EAE5D,MAAMkC,YAAY,GAAG,CACnB;IAACP,IAAI,EAAE,GAAG;IAAEC,KAAK,EAAE;EAAwC,CAAC,EAC5D;IAACD,IAAI,EAAE,GAAG;IAAEC,KAAK,EAAE;EAAU,CAAC,CAC/B;EAED,MAAMO,uBAAuB,GAAGH,QAAQ,CAACb,MAAM,CAACC,KAAK,IAAIgB,mBAAmB,CAAChB,KAAK,EAAEc,YAAY,CAAC,CAAC;EAClG,IAAIC,uBAAuB,CAACvB,MAAM,GAAG,CAAC,EAAE;IACtCZ,KAAK,CAAE,cAAamC,uBAAuB,CAACvB,MAAO,wDAAuD,CAAC;IAC3GV,SAAS,CAAE,4BAA2BK,IAAI,CAACC,SAAS,CAAC2B,uBAAuB,CAAE,EAAC,CAAC;IAChF,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd;AAEA,SAASC,mBAAmBA,CAAChB,KAAK,EAAEiB,WAAW,EAAE;EAC/C,IAAIA,WAAW,CAACC,KAAK,CAACC,IAAI,IAAInB,KAAK,CAACK,SAAS,CAACC,IAAI,CAACc,EAAE,IAAIA,EAAE,CAACb,IAAI,KAAKY,IAAI,CAACZ,IAAI,IAAIa,EAAE,CAACZ,KAAK,KAAKW,IAAI,CAACX,KAAK,CAAC,CAAC,EAAE;IAC3G,OAAO,IAAI;EACb;AACF;AAEA,SAASV,kBAAkBA,CAACE,KAAK,EAAE;EAEjC;EACA;EACA,IAAI,CAACqB,KAAK,CAACrB,KAAK,CAACI,GAAG,CAAC,IAAIkB,QAAQ,CAACtB,KAAK,CAACI,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;IAEtD,MAAMmB,iBAAiB,GAAGvB,KAAK,CAACK,SAAS,CAACN,MAAM,CAACqB,EAAE,IAAIA,EAAE,CAACb,IAAI,KAAK,GAAG,IAAI,CAAE,kBAAkB,CAAEE,IAAI,CAACW,EAAE,CAACZ,KAAK,CAAC,CAAC;;IAE/G;IACA,IAAIe,iBAAiB,CAAC/B,MAAM,GAAG,CAAC,EAAE;MAChC,OAAO,KAAK;IACd;IAEA,OAAO;MACLY,GAAG,EAAEJ,KAAK,CAACI,GAAG;MACdoB,IAAI,EAAExB,KAAK,CAACwB,IAAI;MAChBC,IAAI,EAAEzB,KAAK,CAACyB,IAAI;MAChBpB,SAAS,EAAEkB;IACb,CAAC;EACH;EACA;EACA,OAAOvB,KAAK;AACd","ignoreList":[]}
1
+ {"version":3,"file":"fix-handle-tempurns.js","names":["_debug","_interopRequireDefault","require","debug","createDebugLogger","debugData","extend","handleTempUrns","newRecord","options","JSON","stringify","f856sUrnsWithTempSubfields","f856sUrnsWithNoTempSubfields","getf856sUrns","length","existingLegalDepositURN","validateLD","removeFields","fixedFields","map","removeTempSubfield","filter","field","insertFields","hasURN","f","tag","subfields","some","code","value","test","hasTempSubfield","hasNoTempSubfield","f856sUrn","fields","LD_SUBFIELDS","f856sUrnWithLdSubfields","fieldHasLDSubfields","ldSubfields","every","ldsf","sf","isNaN","parseInt","filteredSubfields","ind1","ind2"],"sources":["../../src/helpers/fix-handle-tempurns.js"],"sourcesContent":["\n\n//import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:handleTempUrns');\nconst debugData = debug.extend('data');\n\n// eslint-disable-next-line max-statements\nexport function handleTempUrns(newRecord, options) {\n\n if (options !== true) {\n debug(`NOT running handleTempUrns fixer, no options`);\n return newRecord;\n }\n\n debug(`Running handleTempUrns fixer`);\n debugData(`Options for handleTempUrns: ${JSON.stringify(options)}`);\n\n const {f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields} = getf856sUrns(newRecord);\n\n // None of the URNs has temp subfields, we don't need to do anything\n if (f856sUrnsWithTempSubfields.length < 1) {\n debug(`No Urns with temp subfield`);\n return newRecord;\n }\n\n // Do we have an existing URN with legal deposit subfields, if we have, we can remove the temp URN field(s)\n const existingLegalDepositURN = validateLD(f856sUrnsWithNoTempSubfields);\n debug(`existingLegalDepositURN: ${existingLegalDepositURN}`);\n\n if (existingLegalDepositURN) {\n debug(`We have an existing LD URN, we can delete temp fields (${f856sUrnsWithTempSubfields.length})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n return newRecord;\n }\n\n // We do not have an existing legalDepositURN, we should use the tempURN and remove the temp subfields from it\n if (!existingLegalDepositURN && f856sUrnsWithTempSubfields.length > 0) {\n //debug(`All Urns (${f856sUrn.length}) have a temp subfield`);\n debugData(`Original temp URNs: (${JSON.stringify(f856sUrnsWithTempSubfields)})`);\n const fixedFields = f856sUrnsWithTempSubfields.map(removeTempSubfield).filter(field => field);\n debug(`We removed temp subfields: (${JSON.stringify(fixedFields)})`);\n newRecord.removeFields(f856sUrnsWithTempSubfields);\n newRecord.insertFields(fixedFields);\n return newRecord;\n }\n // Should we check that the non-temp URN has 2nd ind '0' - meaning that the URN handles the actual resource itself?\n}\n\nfunction getf856sUrns(newRecord) {\n const hasURN = f => f.tag === '856' && f.subfields.some(({code, value}) => code === 'u' && (/urn.fi/u).test(value));\n\n const hasTempSubfield = f => f.subfields.some(({code, value}) => code === '9' && (/^MELINDA<TEMP>$/u).test(value));\n const hasNoTempSubfield = f => !f.subfields.some(({code, value}) => code === '9' && (/^MELINDA<TEMP>$/u).test(value));\n\n const f856sUrn = newRecord.fields.filter(hasURN);\n const f856sUrnsWithTempSubfields = f856sUrn.filter(hasTempSubfield);\n const f856sUrnsWithNoTempSubfields = f856sUrn.filter(hasNoTempSubfield);\n\n debugData(`URN f856s: ${JSON.stringify(f856sUrn)}`);\n debugData(`URN f856s with temp subfield: ${JSON.stringify(f856sUrnsWithTempSubfields)}`);\n return {f856sUrn, f856sUrnsWithTempSubfields, f856sUrnsWithNoTempSubfields};\n}\n\n\n// ---- LD-functions below are same as in https://github.com/NatLibFi/marc-record-validators-melinda/blob/feature-updates-to-urn/src/urn.js\n// we propably should develop the urn/legaldeposit -validator to use also here\n\nfunction validateLD(f856sUrn) {\n debug(`Validating the existence of legal deposit subfields`);\n\n const LD_SUBFIELDS = [\n {code: 'z', value: 'Käytettävissä vapaakappalekirjastoissa'},\n {code: '5', value: 'FI-Vapaa'}\n ];\n\n const f856sUrnWithLdSubfields = f856sUrn.filter(field => fieldHasLDSubfields(field, LD_SUBFIELDS));\n if (f856sUrnWithLdSubfields.length > 0) {\n debug(`Record has ${f856sUrnWithLdSubfields.length} URN fields with all necessary legal deposit subfields`);\n debugData(`f856sUrnWithLdSubfields: ${JSON.stringify(f856sUrnWithLdSubfields)}`);\n return true;\n }\n return false;\n}\n\nfunction fieldHasLDSubfields(field, ldSubfields) {\n if (ldSubfields.every(ldsf => field.subfields.some(sf => sf.code === ldsf.code && sf.value === ldsf.value))) {\n return true;\n }\n}\n\nfunction removeTempSubfield(field) {\n\n // Handle non-numeric fields, and fields with a numeric tag of 010 and greater\n // Aleph's FMT as a controlfield might be a problem\n if (!isNaN(field.tag) && parseInt(field.tag, 10) >= 10) {\n\n const filteredSubfields = field.subfields.filter(sf => sf.code !== '9' && !(/^MELINDA<TEMP>$/u).test(sf.value));\n\n // Remove whole field if there are no subfields left\n if (filteredSubfields.length < 1) {\n return false;\n }\n\n return {\n tag: field.tag,\n ind1: field.ind1,\n ind2: field.ind2,\n subfields: filteredSubfields\n };\n }\n // return controlFields as is\n return field;\n}\n\n\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"fix-strip-f884s.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_util","stripF884s","newRecord","options","debug","createDebugLogger","debugData","extend","JSON","stringify","isMelindaf884","f","tag","subfields","some","code","value","f884Melindas","fields","filter","length","results","reduce","allResults","f884","index","conversion","findConversion","source","findSource","convSource","firstDate","lastDate","findDates","hash","findHash","currResult","newResult","updatedResult","editedf884s","editFields","editedFields","map","field","sfGAll","sfKAll","sfG","replace","sfK","subfield","uniq884s","uniqFields","inspect","depth","uniq","MarcRecord","isEqual","push","removeFields","insertFields","sfA","emptySource","emptyHash","test","padStart"],"sources":["../../src/helpers/fix-strip-f884s.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n//import {sortFieldsBySubfieldValue, removeSubfield} from './fix-utils';\nimport {inspect} from 'util';\n\nexport function stripF884s(newRecord, options) {\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s');\n const debugData = debug.extend('data');\n\n if (options !== true) {\n debug(`NOT running stripF884s fixer, no options`);\n return newRecord;\n }\n\n debug(`Running stripF884s fixer`);\n debugData(`Options for stripF884s: ${JSON.stringify(options)}`);\n\n // Handle only f884 with $5 MELINDA - let's no remove random f884s\n const isMelindaf884 = f => f.tag === '884' && f.subfields.some(({code, value}) => code === '5' && value === 'MELINDA');\n\n const f884Melindas = newRecord.fields.filter(isMelindaf884);\n debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${JSON.stringify(f884Melindas)}`);\n //debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${inspect(f884Melindas, {depth: 3})}`);\n\n if (f884Melindas.length < 2) {\n debug(`Not enough Melinda's f884s to filter (${f884Melindas.length})`);\n return newRecord;\n }\n\n // Pick data (firstDate, lastDate, hash with latest date) for all conversion : source combinations\n const results = f884Melindas.reduce((allResults, f884, index) => {\n debugData(`All results: ${JSON.stringify(allResults)}`);\n //debugData(`Handling field (${index}): ${inspect(f884, {depth: 3})}`);\n debugData(`Handling field *(${index})*: ${JSON.stringify(f884)}`);\n\n const conversion = findConversion(f884);\n const source = findSource(f884);\n const convSource = `${conversion}:${source}`;\n const {firstDate, lastDate} = findDates(f884);\n const hash = findHash(f884);\n\n // Find currently existing data for conversion : source combination\n const currResult = allResults[convSource];\n debugData(JSON.stringify(currResult));\n\n // If we do not have any current data, add data from field\n if (!currResult) {\n debug(`Add a new convSource ${convSource} to results`);\n const newResult = {\n conversion,\n source,\n firstDate,\n lastDate,\n hash\n };\n debugData(`- New result: ${JSON.stringify(newResult)}`);\n return {\n ...allResults,\n [convSource]: newResult\n };\n }\n // If we have current data, update it from the data from field, if needed\n debug(`Update result for ${convSource}`);\n debugData(`- Current result: ${JSON.stringify(currResult)}`);\n\n const updatedResult = {\n ...currResult,\n firstDate: currResult.firstDate > firstDate && firstDate !== '00000000' ? firstDate : currResult.firstDate,\n lastDate: currResult.lastDate < lastDate ? lastDate : currResult.lastDate,\n hash: currResult.lastDate < lastDate && lastDate !== '00000000' && hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? hash : currResult.hash\n };\n debugData(`- Updated result: ${JSON.stringify(updatedResult)}`);\n return {\n ...allResults,\n [convSource]: updatedResult\n };\n }, {});\n\n debugData(`RESULTS: ${JSON.stringify(results)}`);\n const editedf884s = editFields(f884Melindas, results);\n\n debug(`Edited fields (${editedf884s.length})`);\n //debugData(inspect(editedf884s, {depth: 3}));\n debugData(`${JSON.stringify(editedf884s)}`);\n\n // We update each field based on the results we got from fields\n // Note: we do not add $g:s or $k:s if the field doesn't have them\n function editFields(fields, results) {\n debug(`EDITING FIELDS (${fields.length})`);\n const editedFields = fields.map((field) => {\n const convSource = `${findConversion(field)}:${findSource(field)}`;\n debug(`Looking for: ${convSource}`);\n\n if (convSource && results[convSource]) {\n debugData(`Found: ${JSON.stringify(results[convSource])}`);\n const firstDate = results[convSource].firstDate && results[convSource].firstDate !== '00000000' ? results[convSource].firstDate : '';\n const lastDate = results[convSource].lastDate && results[convSource].lastDate !== '00000000' ? results[convSource].lastDate : '';\n\n const source = results[convSource].source && results[convSource].source !== 'NO_SOURCE' ? results[convSource].source : '';\n const hash = results[convSource].hash && results[convSource].hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? results[convSource].hash : '';\n\n const sfGAll = firstDate === lastDate ? `${firstDate}` : `${firstDate} - ${lastDate}`;\n debugData(`EditedDates: ${sfGAll}`);\n const sfKAll = `${source}:${hash}`;\n\n const sfG = sfGAll.replace(/^ - /u, '').replace(/ - $/u, '');\n const sfK = sfKAll.replace(/^:/u, '').replace(/:$/u, '');\n\n return {\n ...field,\n subfields: field.subfields.map(subfield => {\n\n // we don't get $g or $k if the original field doesn't have them\n if (subfield.code === 'g') {\n return {\n code: subfield.code,\n value: sfG\n };\n }\n\n if (subfield.code === 'k') {\n return {\n code: subfield.code,\n value: sfK\n };\n }\n\n return subfield;\n })\n\n };\n }\n debug(`Not found: ${convSource}`);\n return field;\n });\n return editedFields;\n }\n\n // we'll need to uniq these too\n\n const uniq884s = uniqFields(editedf884s);\n debug(`UniqFields (${uniq884s.length})`);\n debugData(inspect(uniq884s, {depth: 3}));\n\n\n function uniqFields(fields) {\n return fields.reduce((uniq, field) => {\n if (!uniq.some(f => MarcRecord.isEqual(f, field))) { // eslint-disable-line functional/no-conditional-statements\n uniq.push(field); // eslint-disable-line functional/immutable-data\n }\n\n return uniq;\n }, []);\n }\n // Replace original Melinda-f884s with remaining Melinda-f884s\n // NOTE: this sorts MELINDA-f884s after possible other f884s\n newRecord.removeFields(f884Melindas);\n newRecord.insertFields(uniq884s);\n\n return newRecord;\n\n\n // Find conversion:source pairs\n // Find first date\n // Find last date and last hash\n\n\n function findConversion(f884) {\n const [sfA] = f884.subfields.filter((subfield) => subfield.code === 'a').map(subfield => subfield.value);\n const conversion = sfA;\n debugData(`Conversion: \"${conversion}\"`);\n return conversion;\n }\n\n function findSource(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const source = sfK.replace(/:.*$/u, '');\n if (source && source.length !== 64) {\n debugData(`Source: \"${source}\"`);\n return source;\n }\n const emptySource = 'NO_SOURCE';\n debugData(`Source: \"${emptySource}\"`);\n return emptySource;\n }\n\n function findHash(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const hash = sfK.replace(/^.*:/u, '');\n if (hash && hash.length === 64) {\n debugData(`Hash: \"${hash}\"`);\n return hash;\n }\n const emptyHash = '0000000000000000000000000000000000000000000000000000000000000000';\n debugData(`Hash: \"${emptyHash}\"`);\n return emptyHash;\n }\n\n function findDates(f884) {\n const [sfG] = f884.subfields.filter((subfield) => subfield.code === 'g').map(subfield => subfield.value);\n if (sfG && (/ - /u).test(sfG)) {\n const firstDate = sfG.replace(/ - .*$/u, '').padStart(8, '0');\n const lastDate = sfG.replace(/^.* - /u, '').padStart(8, '0');\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n const firstDate = sfG ? sfG.padStart(8, '0') : '00000000';\n const lastDate = sfG ? sfG.padStart(8, '0') : '00000000';\n\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AAEA,IAAAG,KAAA,GAAAH,OAAA;AADA;;AAGO,SAASI,UAAUA,CAACC,SAAS,EAAEC,OAAO,EAAE;EAC7C,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,yDAAyD,CAAC;EAC1F,MAAMC,SAAS,GAAGF,KAAK,CAACG,MAAM,CAAC,MAAM,CAAC;EAEtC,IAAIJ,OAAO,KAAK,IAAI,EAAE;IACpBC,KAAK,CAAE,0CAAyC,CAAC;IACjD,OAAOF,SAAS;EAClB;EAEAE,KAAK,CAAE,0BAAyB,CAAC;EACjCE,SAAS,CAAE,2BAA0BE,IAAI,CAACC,SAAS,CAACN,OAAO,CAAE,EAAC,CAAC;;EAE/D;EACA,MAAMO,aAAa,GAAGC,CAAC,IAAIA,CAAC,CAACC,GAAG,KAAK,KAAK,IAAID,CAAC,CAACE,SAAS,CAACC,IAAI,CAAC,CAAC;IAACC,IAAI;IAAEC;EAAK,CAAC,KAAKD,IAAI,KAAK,GAAG,IAAIC,KAAK,KAAK,SAAS,CAAC;EAEtH,MAAMC,YAAY,GAAGf,SAAS,CAACgB,MAAM,CAACC,MAAM,CAACT,aAAa,CAAC;EAC3DJ,SAAS,CAAE,oBAAmBW,YAAY,CAACG,MAAO,QAAOZ,IAAI,CAACC,SAAS,CAACQ,YAAY,CAAE,EAAC,CAAC;EACxF;;EAEA,IAAIA,YAAY,CAACG,MAAM,GAAG,CAAC,EAAE;IAC3BhB,KAAK,CAAE,yCAAwCa,YAAY,CAACG,MAAO,GAAE,CAAC;IACtE,OAAOlB,SAAS;EAClB;;EAEA;EACA,MAAMmB,OAAO,GAAGJ,YAAY,CAACK,MAAM,CAAC,CAACC,UAAU,EAAEC,IAAI,EAAEC,KAAK,KAAK;IAC/DnB,SAAS,CAAE,gBAAeE,IAAI,CAACC,SAAS,CAACc,UAAU,CAAE,EAAC,CAAC;IACvD;IACAjB,SAAS,CAAE,oBAAmBmB,KAAM,OAAMjB,IAAI,CAACC,SAAS,CAACe,IAAI,CAAE,EAAC,CAAC;IAEjE,MAAME,UAAU,GAAGC,cAAc,CAACH,IAAI,CAAC;IACvC,MAAMI,MAAM,GAAGC,UAAU,CAACL,IAAI,CAAC;IAC/B,MAAMM,UAAU,GAAI,GAAEJ,UAAW,IAAGE,MAAO,EAAC;IAC5C,MAAM;MAACG,SAAS;MAAEC;IAAQ,CAAC,GAAGC,SAAS,CAACT,IAAI,CAAC;IAC7C,MAAMU,IAAI,GAAGC,QAAQ,CAACX,IAAI,CAAC;;IAE3B;IACA,MAAMY,UAAU,GAAGb,UAAU,CAACO,UAAU,CAAC;IACzCxB,SAAS,CAACE,IAAI,CAACC,SAAS,CAAC2B,UAAU,CAAC,CAAC;;IAErC;IACA,IAAI,CAACA,UAAU,EAAE;MACfhC,KAAK,CAAE,wBAAuB0B,UAAW,aAAY,CAAC;MACtD,MAAMO,SAAS,GAAG;QAChBX,UAAU;QACVE,MAAM;QACNG,SAAS;QACTC,QAAQ;QACRE;MACF,CAAC;MACD5B,SAAS,CAAE,iBAAgBE,IAAI,CAACC,SAAS,CAAC4B,SAAS,CAAE,EAAC,CAAC;MACvD,OAAO;QACL,GAAGd,UAAU;QACb,CAACO,UAAU,GAAGO;MAChB,CAAC;IACH;IACA;IACAjC,KAAK,CAAE,qBAAoB0B,UAAW,EAAC,CAAC;IACxCxB,SAAS,CAAE,qBAAoBE,IAAI,CAACC,SAAS,CAAC2B,UAAU,CAAE,EAAC,CAAC;IAE5D,MAAME,aAAa,GAAG;MACpB,GAAGF,UAAU;MACbL,SAAS,EAAEK,UAAU,CAACL,SAAS,GAAGA,SAAS,IAAIA,SAAS,KAAK,UAAU,GAAGA,SAAS,GAAGK,UAAU,CAACL,SAAS;MAC1GC,QAAQ,EAAEI,UAAU,CAACJ,QAAQ,GAAGA,QAAQ,GAAGA,QAAQ,GAAGI,UAAU,CAACJ,QAAQ;MACzEE,IAAI,EAAEE,UAAU,CAACJ,QAAQ,GAAGA,QAAQ,IAAIA,QAAQ,KAAK,UAAU,IAAIE,IAAI,KAAK,kEAAkE,GAAGA,IAAI,GAAGE,UAAU,CAACF;IACrK,CAAC;IACD5B,SAAS,CAAE,qBAAoBE,IAAI,CAACC,SAAS,CAAC6B,aAAa,CAAE,EAAC,CAAC;IAC/D,OAAO;MACL,GAAGf,UAAU;MACb,CAACO,UAAU,GAAGQ;IAChB,CAAC;EACH,CAAC,EAAE,CAAC,CAAC,CAAC;EAENhC,SAAS,CAAE,YAAWE,IAAI,CAACC,SAAS,CAACY,OAAO,CAAE,EAAC,CAAC;EAChD,MAAMkB,WAAW,GAAGC,UAAU,CAACvB,YAAY,EAAEI,OAAO,CAAC;EAErDjB,KAAK,CAAE,kBAAiBmC,WAAW,CAACnB,MAAO,GAAE,CAAC;EAC9C;EACAd,SAAS,CAAE,GAAEE,IAAI,CAACC,SAAS,CAAC8B,WAAW,CAAE,EAAC,CAAC;;EAE3C;EACA;EACA,SAASC,UAAUA,CAACtB,MAAM,EAAEG,OAAO,EAAE;IACnCjB,KAAK,CAAE,mBAAkBc,MAAM,CAACE,MAAO,GAAE,CAAC;IAC1C,MAAMqB,YAAY,GAAGvB,MAAM,CAACwB,GAAG,CAAEC,KAAK,IAAK;MACzC,MAAMb,UAAU,GAAI,GAAEH,cAAc,CAACgB,KAAK,CAAE,IAAGd,UAAU,CAACc,KAAK,CAAE,EAAC;MAClEvC,KAAK,CAAE,gBAAe0B,UAAW,EAAC,CAAC;MAEnC,IAAIA,UAAU,IAAIT,OAAO,CAACS,UAAU,CAAC,EAAE;QACrCxB,SAAS,CAAE,UAASE,IAAI,CAACC,SAAS,CAACY,OAAO,CAACS,UAAU,CAAC,CAAE,EAAC,CAAC;QAC1D,MAAMC,SAAS,GAAGV,OAAO,CAACS,UAAU,CAAC,CAACC,SAAS,IAAIV,OAAO,CAACS,UAAU,CAAC,CAACC,SAAS,KAAK,UAAU,GAAGV,OAAO,CAACS,UAAU,CAAC,CAACC,SAAS,GAAG,EAAE;QACpI,MAAMC,QAAQ,GAAGX,OAAO,CAACS,UAAU,CAAC,CAACE,QAAQ,IAAIX,OAAO,CAACS,UAAU,CAAC,CAACE,QAAQ,KAAK,UAAU,GAAGX,OAAO,CAACS,UAAU,CAAC,CAACE,QAAQ,GAAG,EAAE;QAEhI,MAAMJ,MAAM,GAAGP,OAAO,CAACS,UAAU,CAAC,CAACF,MAAM,IAAIP,OAAO,CAACS,UAAU,CAAC,CAACF,MAAM,KAAK,WAAW,GAAGP,OAAO,CAACS,UAAU,CAAC,CAACF,MAAM,GAAG,EAAE;QACzH,MAAMM,IAAI,GAAGb,OAAO,CAACS,UAAU,CAAC,CAACI,IAAI,IAAIb,OAAO,CAACS,UAAU,CAAC,CAACI,IAAI,KAAK,kEAAkE,GAAGb,OAAO,CAACS,UAAU,CAAC,CAACI,IAAI,GAAG,EAAE;QAExK,MAAMU,MAAM,GAAGb,SAAS,KAAKC,QAAQ,GAAI,GAAED,SAAU,EAAC,GAAI,GAAEA,SAAU,MAAKC,QAAS,EAAC;QACrF1B,SAAS,CAAE,gBAAesC,MAAO,EAAC,CAAC;QACnC,MAAMC,MAAM,GAAI,GAAEjB,MAAO,IAAGM,IAAK,EAAC;QAElC,MAAMY,GAAG,GAAGF,MAAM,CAACG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5D,MAAMC,GAAG,GAAGH,MAAM,CAACE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAExD,OAAO;UACL,GAAGJ,KAAK;UACR9B,SAAS,EAAE8B,KAAK,CAAC9B,SAAS,CAAC6B,GAAG,CAACO,QAAQ,IAAI;YAEzC;YACA,IAAIA,QAAQ,CAAClC,IAAI,KAAK,GAAG,EAAE;cACzB,OAAO;gBACLA,IAAI,EAAEkC,QAAQ,CAAClC,IAAI;gBACnBC,KAAK,EAAE8B;cACT,CAAC;YACH;YAEA,IAAIG,QAAQ,CAAClC,IAAI,KAAK,GAAG,EAAE;cACzB,OAAO;gBACLA,IAAI,EAAEkC,QAAQ,CAAClC,IAAI;gBACnBC,KAAK,EAAEgC;cACT,CAAC;YACH;YAEA,OAAOC,QAAQ;UACjB,CAAC;QAEH,CAAC;MACH;MACA7C,KAAK,CAAE,cAAa0B,UAAW,EAAC,CAAC;MACjC,OAAOa,KAAK;IACd,CAAC,CAAC;IACF,OAAOF,YAAY;EACrB;;EAEA;;EAEA,MAAMS,QAAQ,GAAGC,UAAU,CAACZ,WAAW,CAAC;EACxCnC,KAAK,CAAE,eAAc8C,QAAQ,CAAC9B,MAAO,GAAE,CAAC;EACxCd,SAAS,CAAC,IAAA8C,aAAO,EAACF,QAAQ,EAAE;IAACG,KAAK,EAAE;EAAC,CAAC,CAAC,CAAC;EAGxC,SAASF,UAAUA,CAACjC,MAAM,EAAE;IAC1B,OAAOA,MAAM,CAACI,MAAM,CAAC,CAACgC,IAAI,EAAEX,KAAK,KAAK;MACpC,IAAI,CAACW,IAAI,CAACxC,IAAI,CAACH,CAAC,IAAI4C,sBAAU,CAACC,OAAO,CAAC7C,CAAC,EAAEgC,KAAK,CAAC,CAAC,EAAE;QAAE;QACnDW,IAAI,CAACG,IAAI,CAACd,KAAK,CAAC,CAAC,CAAC;MACpB;MAEA,OAAOW,IAAI;IACb,CAAC,EAAE,EAAE,CAAC;EACR;EACA;EACA;EACApD,SAAS,CAACwD,YAAY,CAACzC,YAAY,CAAC;EACpCf,SAAS,CAACyD,YAAY,CAACT,QAAQ,CAAC;EAEhC,OAAOhD,SAAS;;EAGhB;EACA;EACA;;EAGA,SAASyB,cAAcA,CAACH,IAAI,EAAE;IAC5B,MAAM,CAACoC,GAAG,CAAC,GAAGpC,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,MAAMU,UAAU,GAAGkC,GAAG;IACtBtD,SAAS,CAAE,gBAAeoB,UAAW,GAAE,CAAC;IACxC,OAAOA,UAAU;EACnB;EAEA,SAASG,UAAUA,CAACL,IAAI,EAAE;IACxB,MAAM,CAACwB,GAAG,CAAC,GAAGxB,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,MAAMY,MAAM,GAAGoB,GAAG,CAACD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACvC,IAAInB,MAAM,IAAIA,MAAM,CAACR,MAAM,KAAK,EAAE,EAAE;MAClCd,SAAS,CAAE,YAAWsB,MAAO,GAAE,CAAC;MAChC,OAAOA,MAAM;IACf;IACA,MAAMiC,WAAW,GAAG,WAAW;IAC/BvD,SAAS,CAAE,YAAWuD,WAAY,GAAE,CAAC;IACrC,OAAOA,WAAW;EACpB;EAEA,SAAS1B,QAAQA,CAACX,IAAI,EAAE;IACtB,MAAM,CAACwB,GAAG,CAAC,GAAGxB,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,MAAMkB,IAAI,GAAGc,GAAG,CAACD,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACrC,IAAIb,IAAI,IAAIA,IAAI,CAACd,MAAM,KAAK,EAAE,EAAE;MAC9Bd,SAAS,CAAE,UAAS4B,IAAK,GAAE,CAAC;MAC5B,OAAOA,IAAI;IACb;IACA,MAAM4B,SAAS,GAAG,kEAAkE;IACpFxD,SAAS,CAAE,UAASwD,SAAU,GAAE,CAAC;IACjC,OAAOA,SAAS;EAClB;EAEA,SAAS7B,SAASA,CAACT,IAAI,EAAE;IACvB,MAAM,CAACsB,GAAG,CAAC,GAAGtB,IAAI,CAACX,SAAS,CAACM,MAAM,CAAE8B,QAAQ,IAAKA,QAAQ,CAAClC,IAAI,KAAK,GAAG,CAAC,CAAC2B,GAAG,CAACO,QAAQ,IAAIA,QAAQ,CAACjC,KAAK,CAAC;IACxG,IAAI8B,GAAG,IAAK,MAAM,CAAEiB,IAAI,CAACjB,GAAG,CAAC,EAAE;MAC7B,MAAMf,SAAS,GAAGe,GAAG,CAACC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAACiB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;MAC7D,MAAMhC,QAAQ,GAAGc,GAAG,CAACC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAACiB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;MAC5D1D,SAAS,CAAE,eAAcyB,SAAU,iBAAgBC,QAAS,GAAE,CAAC;MAC/D,OAAO;QAACD,SAAS;QAAEC;MAAQ,CAAC;IAC9B;IACA,MAAMD,SAAS,GAAGe,GAAG,GAAGA,GAAG,CAACkB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU;IACzD,MAAMhC,QAAQ,GAAGc,GAAG,GAAGA,GAAG,CAACkB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,UAAU;IAExD1D,SAAS,CAAE,eAAcyB,SAAU,iBAAgBC,QAAS,GAAE,CAAC;IAC/D,OAAO;MAACD,SAAS;MAAEC;IAAQ,CAAC;EAC9B;AAEF","ignoreList":[]}
1
+ {"version":3,"file":"fix-strip-f884s.js","names":["_marcRecord","require","_debug","_interopRequireDefault","_util","stripF884s","newRecord","options","debug","createDebugLogger","debugData","extend","JSON","stringify","isMelindaf884","f","tag","subfields","some","code","value","f884Melindas","fields","filter","length","results","reduce","allResults","f884","index","conversion","findConversion","source","findSource","convSource","firstDate","lastDate","findDates","hash","findHash","currResult","newResult","updatedResult","editedf884s","editFields","editedFields","map","field","sfGAll","sfKAll","sfG","replace","sfK","subfield","uniq884s","uniqFields","inspect","depth","uniq","MarcRecord","isEqual","push","removeFields","insertFields","sfA","emptySource","emptyHash","test","padStart"],"sources":["../../src/helpers/fix-strip-f884s.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\nimport createDebugLogger from 'debug';\n//import {sortFieldsBySubfieldValue, removeSubfield} from './fix-utils';\nimport {inspect} from 'util';\n\nexport function stripF884s(newRecord, options) {\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fixRecord:stripF884s');\n const debugData = debug.extend('data');\n\n if (options !== true) {\n debug(`NOT running stripF884s fixer, no options`);\n return newRecord;\n }\n\n debug(`Running stripF884s fixer`);\n debugData(`Options for stripF884s: ${JSON.stringify(options)}`);\n\n // Handle only f884 with $5 MELINDA - let's no remove random f884s\n const isMelindaf884 = f => f.tag === '884' && f.subfields.some(({code, value}) => code === '5' && value === 'MELINDA');\n\n const f884Melindas = newRecord.fields.filter(isMelindaf884);\n debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${JSON.stringify(f884Melindas)}`);\n //debugData(`Melinda's f884s (${f884Melindas.length}) \\n ${inspect(f884Melindas, {depth: 3})}`);\n\n if (f884Melindas.length < 2) {\n debug(`Not enough Melinda's f884s to filter (${f884Melindas.length})`);\n return newRecord;\n }\n\n // Pick data (firstDate, lastDate, hash with latest date) for all conversion : source combinations\n const results = f884Melindas.reduce((allResults, f884, index) => {\n debugData(`All results: ${JSON.stringify(allResults)}`);\n //debugData(`Handling field (${index}): ${inspect(f884, {depth: 3})}`);\n debugData(`Handling field *(${index})*: ${JSON.stringify(f884)}`);\n\n const conversion = findConversion(f884);\n const source = findSource(f884);\n const convSource = `${conversion}:${source}`;\n const {firstDate, lastDate} = findDates(f884);\n const hash = findHash(f884);\n\n // Find currently existing data for conversion : source combination\n const currResult = allResults[convSource];\n debugData(JSON.stringify(currResult));\n\n // If we do not have any current data, add data from field\n if (!currResult) {\n debug(`Add a new convSource ${convSource} to results`);\n const newResult = {\n conversion,\n source,\n firstDate,\n lastDate,\n hash\n };\n debugData(`- New result: ${JSON.stringify(newResult)}`);\n return {\n ...allResults,\n [convSource]: newResult\n };\n }\n // If we have current data, update it from the data from field, if needed\n debug(`Update result for ${convSource}`);\n debugData(`- Current result: ${JSON.stringify(currResult)}`);\n\n const updatedResult = {\n ...currResult,\n firstDate: currResult.firstDate > firstDate && firstDate !== '00000000' ? firstDate : currResult.firstDate,\n lastDate: currResult.lastDate < lastDate ? lastDate : currResult.lastDate,\n hash: currResult.lastDate < lastDate && lastDate !== '00000000' && hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? hash : currResult.hash\n };\n debugData(`- Updated result: ${JSON.stringify(updatedResult)}`);\n return {\n ...allResults,\n [convSource]: updatedResult\n };\n }, {});\n\n debugData(`RESULTS: ${JSON.stringify(results)}`);\n const editedf884s = editFields(f884Melindas, results);\n\n debug(`Edited fields (${editedf884s.length})`);\n //debugData(inspect(editedf884s, {depth: 3}));\n debugData(`${JSON.stringify(editedf884s)}`);\n\n // We update each field based on the results we got from fields\n // Note: we do not add $g:s or $k:s if the field doesn't have them\n function editFields(fields, results) {\n debug(`EDITING FIELDS (${fields.length})`);\n const editedFields = fields.map((field) => {\n const convSource = `${findConversion(field)}:${findSource(field)}`;\n debug(`Looking for: ${convSource}`);\n\n if (convSource && results[convSource]) {\n debugData(`Found: ${JSON.stringify(results[convSource])}`);\n const firstDate = results[convSource].firstDate && results[convSource].firstDate !== '00000000' ? results[convSource].firstDate : '';\n const lastDate = results[convSource].lastDate && results[convSource].lastDate !== '00000000' ? results[convSource].lastDate : '';\n\n const source = results[convSource].source && results[convSource].source !== 'NO_SOURCE' ? results[convSource].source : '';\n const hash = results[convSource].hash && results[convSource].hash !== '0000000000000000000000000000000000000000000000000000000000000000' ? results[convSource].hash : '';\n\n const sfGAll = firstDate === lastDate ? `${firstDate}` : `${firstDate} - ${lastDate}`;\n debugData(`EditedDates: ${sfGAll}`);\n const sfKAll = `${source}:${hash}`;\n\n const sfG = sfGAll.replace(/^ - /u, '').replace(/ - $/u, '');\n const sfK = sfKAll.replace(/^:/u, '').replace(/:$/u, '');\n\n return {\n ...field,\n subfields: field.subfields.map(subfield => {\n\n // we don't get $g or $k if the original field doesn't have them\n if (subfield.code === 'g') {\n return {\n code: subfield.code,\n value: sfG\n };\n }\n\n if (subfield.code === 'k') {\n return {\n code: subfield.code,\n value: sfK\n };\n }\n\n return subfield;\n })\n\n };\n }\n debug(`Not found: ${convSource}`);\n return field;\n });\n return editedFields;\n }\n\n // we'll need to uniq these too\n\n const uniq884s = uniqFields(editedf884s);\n debug(`UniqFields (${uniq884s.length})`);\n debugData(inspect(uniq884s, {depth: 3}));\n\n\n function uniqFields(fields) {\n return fields.reduce((uniq, field) => {\n if (!uniq.some(f => MarcRecord.isEqual(f, field))) { // eslint-disable-line functional/no-conditional-statements\n uniq.push(field); // eslint-disable-line functional/immutable-data\n }\n\n return uniq;\n }, []);\n }\n // Replace original Melinda-f884s with remaining Melinda-f884s\n // NOTE: this sorts MELINDA-f884s after possible other f884s\n newRecord.removeFields(f884Melindas);\n newRecord.insertFields(uniq884s);\n\n return newRecord;\n\n\n // Find conversion:source pairs\n // Find first date\n // Find last date and last hash\n\n\n function findConversion(f884) {\n const [sfA] = f884.subfields.filter((subfield) => subfield.code === 'a').map(subfield => subfield.value);\n const conversion = sfA;\n debugData(`Conversion: \"${conversion}\"`);\n return conversion;\n }\n\n function findSource(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const source = sfK.replace(/:.*$/u, '');\n if (source && source.length !== 64) {\n debugData(`Source: \"${source}\"`);\n return source;\n }\n const emptySource = 'NO_SOURCE';\n debugData(`Source: \"${emptySource}\"`);\n return emptySource;\n }\n\n function findHash(f884) {\n const [sfK] = f884.subfields.filter((subfield) => subfield.code === 'k').map(subfield => subfield.value);\n const hash = sfK.replace(/^.*:/u, '');\n if (hash && hash.length === 64) {\n debugData(`Hash: \"${hash}\"`);\n return hash;\n }\n const emptyHash = '0000000000000000000000000000000000000000000000000000000000000000';\n debugData(`Hash: \"${emptyHash}\"`);\n return emptyHash;\n }\n\n function findDates(f884) {\n const [sfG] = f884.subfields.filter((subfield) => subfield.code === 'g').map(subfield => subfield.value);\n if (sfG && (/ - /u).test(sfG)) {\n const firstDate = sfG.replace(/ - .*$/u, '').padStart(8, '0');\n const lastDate = sfG.replace(/^.* - /u, '').padStart(8, '0');\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n const firstDate = sfG ? sfG.padStart(8, '0') : '00000000';\n const lastDate = sfG ? sfG.padStart(8, '0') : '00000000';\n\n debugData(`FirstDate: \"${firstDate}\", LastDate: \"${lastDate}\"`);\n return {firstDate, lastDate};\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"fix.js","names":["_marcRecord","require","_melindaBackendCommons","_debug","_interopRequireDefault","_fixHandleTempurns","_fixStripF884s","_marcRecordValidatorsMelinda","_fixConstants","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","logger","createLogger","debug","createDebugLogger","debugData","extend","fixRecord","record","settings","verbose","JSON","stringify","newRecord","MarcRecord","clone","subfieldValues","generateMissingSIDsOptions","generateMissingSIDs","undefined","newRecord1","replacePrefixesOptions","replacePrefixes","newRecord2","replaceAllPrefixes","newRecord3","handleTempUrns","newRecord4","stripF884s","newRecord5","stripF984s","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","stripF984sSettings","F984A_PATTERN","config","toString","validator","FieldExclusion","fix"],"sources":["../../src/helpers/fix.js"],"sourcesContent":["import {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\nimport {FieldExclusion} from '@natlibfi/marc-record-validators-melinda';\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 // Fix 5, strip extra field 984s\n const newRecord5 = stripF984s(newRecord4, settings.stripF984s || false);\n debugData(newRecord5);\n\n return newRecord5.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\nfunction stripF984s(record, stripF984sSettings) {\n const F984A_PATTERN = /^(?:ALWAYS|NEVER)-PREFER-IN-MERGE$/u;\n const config = [\n {\n tag: /^984$/u,\n subfields: [\n {\n code: /a/u,\n value: F984A_PATTERN\n }\n ]\n }\n ];\n\n debug(`Running removeF984AFields`);\n debugData(`removeF984AFieldsSettings: ${JSON.stringify(stripF984sSettings)}`);\n\n if (!stripF984sSettings || !F984A_PATTERN || record.get('984').length < 1) {\n debug(`No settings or pattern for removeF984AFields or f984 in record`);\n return record;\n }\n\n debug(`Removing f984 fields with subfield $a consisting values ${F984A_PATTERN.toString()}`);\n // eslint-disable-next-line new-cap\n const validator = FieldExclusion(config);\n validator.fix(record);\n return record;\n\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fix.js","names":["_marcRecord","require","_melindaBackendCommons","_debug","_interopRequireDefault","_fixHandleTempurns","_fixStripF884s","_marcRecordValidatorsMelinda","_fixConstants","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","logger","createLogger","debug","createDebugLogger","debugData","extend","fixRecord","record","settings","verbose","JSON","stringify","newRecord","MarcRecord","clone","subfieldValues","generateMissingSIDsOptions","generateMissingSIDs","undefined","newRecord1","replacePrefixesOptions","replacePrefixes","newRecord2","replaceAllPrefixes","newRecord3","handleTempUrns","newRecord4","stripF884s","newRecord5","stripF984s","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","stripF984sSettings","F984A_PATTERN","config","toString","validator","FieldExclusion","fix"],"sources":["../../src/helpers/fix.js"],"sourcesContent":["import {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\nimport {FieldExclusion} from '@natlibfi/marc-record-validators-melinda';\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 // Fix 5, strip extra field 984s\n const newRecord5 = stripF984s(newRecord4, settings.stripF984s || false);\n debugData(newRecord5);\n\n return newRecord5.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\nfunction stripF984s(record, stripF984sSettings) {\n const F984A_PATTERN = /^(?:ALWAYS|NEVER)-PREFER-IN-MERGE$/u;\n const config = [\n {\n tag: /^984$/u,\n subfields: [\n {\n code: /a/u,\n value: F984A_PATTERN\n }\n ]\n }\n ];\n\n debug(`Running removeF984AFields`);\n debugData(`removeF984AFieldsSettings: ${JSON.stringify(stripF984sSettings)}`);\n\n if (!stripF984sSettings || !F984A_PATTERN || record.get('984').length < 1) {\n debug(`No settings or pattern for removeF984AFields or f984 in record`);\n return record;\n }\n\n debug(`Removing f984 fields with subfield $a consisting values ${F984A_PATTERN.toString()}`);\n // eslint-disable-next-line new-cap\n const validator = FieldExclusion(config);\n validator.fix(record);\n return record;\n\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"fix.spec.js","names":["_chai","require","_marcRecord","_fixura","_fixugen","_interopRequireDefault","_fix","fixSettings","_interopRequireWildcard","_debug","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","debug","createDebugLogger","debugData","extend","generateTests","callback","path","__dirname","recurse","useMetadataFile","fixura","failWhenNotFound","reader","READERS","JSON","getFixture","settings","undefined","Error","runSettings","record","MarcRecord","subfieldValues","expectedRecord","stringify","resultRecord","fixRecord","expect","to","eql"],"sources":["../../src/helpers/fix.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport {fixRecord} from './fix';\nimport * as fixSettings from './fix-constants';\nimport createDebugLogger from 'debug';\n// import inspect from 'util';\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fix:test');\nconst debugData = debug.extend('data');\n\ngenerateTests({\n callback,\n path: [__dirname, '..', '..', 'test-fixtures', 'fix'],\n recurse: true,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: false,\n reader: READERS.JSON\n }\n});\n\nfunction callback({getFixture, settings = undefined}) {\n if (settings !== undefined && fixSettings[settings] === undefined) {\n throw new Error(`There are no settings ${settings} defined!`);\n }\n const runSettings = fixSettings[settings] || settings;\n\n const record = new MarcRecord(getFixture('record.json'), {subfieldValues: false});\n const expectedRecord = getFixture('expectedRecord.json');\n\n debug(`Running fixer with settings ${settings}.`);\n debugData(JSON.stringify(runSettings, null, 2));\n\n const resultRecord = fixRecord(record, runSettings);\n debugData(`Result: ${JSON.stringify(resultRecord)}`);\n debugData(`Expected: ${JSON.stringify(expectedRecord)}`);\n expect(resultRecord).to.eql(expectedRecord);\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fix.spec.js","names":["_chai","require","_marcRecord","_fixura","_fixugen","_interopRequireDefault","_fix","fixSettings","_interopRequireWildcard","_debug","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","debug","createDebugLogger","debugData","extend","generateTests","callback","path","__dirname","recurse","useMetadataFile","fixura","failWhenNotFound","reader","READERS","JSON","getFixture","settings","undefined","Error","runSettings","record","MarcRecord","subfieldValues","expectedRecord","stringify","resultRecord","fixRecord","expect","to","eql"],"sources":["../../src/helpers/fix.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport {fixRecord} from './fix';\nimport * as fixSettings from './fix-constants';\nimport createDebugLogger from 'debug';\n// import inspect from 'util';\n\nconst debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:fix:test');\nconst debugData = debug.extend('data');\n\ngenerateTests({\n callback,\n path: [__dirname, '..', '..', 'test-fixtures', 'fix'],\n recurse: true,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: false,\n reader: READERS.JSON\n }\n});\n\nfunction callback({getFixture, settings = undefined}) {\n if (settings !== undefined && fixSettings[settings] === undefined) {\n throw new Error(`There are no settings ${settings} defined!`);\n }\n const runSettings = fixSettings[settings] || settings;\n\n const record = new MarcRecord(getFixture('record.json'), {subfieldValues: false});\n const expectedRecord = getFixture('expectedRecord.json');\n\n debug(`Running fixer with settings ${settings}.`);\n debugData(JSON.stringify(runSettings, null, 2));\n\n const resultRecord = fixRecord(record, runSettings);\n debugData(`Result: ${JSON.stringify(resultRecord)}`);\n debugData(`Expected: ${JSON.stringify(expectedRecord)}`);\n expect(resultRecord).to.eql(expectedRecord);\n\n}\n"],"mappings":"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","ignoreList":[]}
package/dist/mongo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","records","errorMessage","errorStatus","creationTime","modificationTime","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","payload","message","logError","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","JSON","stringify","limit","skip","rest","find","projection","createProjection","parseInt","toArray","length","silly","showAll","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","_id","showParamToField","Object","keys","filter","param","map","excludeObject","fromEntries","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","clean","sanitize","noContent","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await db.collection(collection).find(rest, {projection: createProjection(showParams)})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n logger.silly(`${JSON.stringify(result)}`);\n return result;\n }\n\n // We default to NOT showing operations, operationSettings, recordLoadParams and importJobState when a queueItem is queried\n // These can all be shown with showAll\n // Single fields can be shown by showOperation, showOperationSettings, showRecordLoadParams and showImportJobState\n\n function createProjection(showParams = {}) {\n logger.silly(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n\n if (showAll) {\n return {\n _id: 0\n };\n }\n\n const showParamToField = {\n 'showOperations': 'operations',\n 'showOperationSettings': 'operationSettings',\n 'showRecordLoadParams': 'recordLoadParams',\n 'showImportJobState': 'importJobState'\n };\n\n const result = Object.keys(showParams)\n .filter(param => param !== 'showAll' && showParams[param] !== true && showParams[param] !== 1)\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.silly(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.silly(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n\n return {\n _id: 0,\n ...excludeObject\n };\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","records","errorMessage","errorStatus","creationTime","modificationTime","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","payload","message","logError","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","JSON","stringify","limit","skip","rest","find","projection","createProjection","parseInt","toArray","length","silly","showAll","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","_id","showParamToField","Object","keys","filter","param","map","excludeObject","fromEntries","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","clean","sanitize","noContent","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await db.collection(collection).find(rest, {projection: createProjection(showParams)})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n logger.silly(`${JSON.stringify(result)}`);\n return result;\n }\n\n // We default to NOT showing operations, operationSettings, recordLoadParams and importJobState when a queueItem is queried\n // These can all be shown with showAll\n // Single fields can be shown by showOperation, showOperationSettings, showRecordLoadParams and showImportJobState\n\n function createProjection(showParams = {}) {\n logger.silly(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n\n if (showAll) {\n return {\n _id: 0\n };\n }\n\n const showParamToField = {\n 'showOperations': 'operations',\n 'showOperationSettings': 'operationSettings',\n 'showRecordLoadParams': 'recordLoadParams',\n 'showImportJobState': 'importJobState'\n };\n\n const result = Object.keys(showParams)\n .filter(param => param !== 'showAll' && showParams[param] !== true && showParams[param] !== 1)\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.silly(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.silly(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n\n return {\n _id: 0,\n ...excludeObject\n };\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","_default","MONGO_URI","dbName","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","getListOfCatalogers","getListOfCorrelationIds","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","limit","skip","rest","debug","JSON","stringify","find","sort","parseInt","toArray","length","LOG_ITEM_TYPE","MERGE_LOG","distinct","logItemTypes","MATCH_LOG","catalogers","dateBefore","Date","dateAfter","test","silly","generateMatchObject","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","matchOptions","toISOString","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","force","clean","$ne","deleteMany","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["\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\n/**\n * Create log operator\n * @param {String} MONGO_URI connnection address to mongo\n * @param {String} dbName Mongo DB name, defaults 'rest-api'\n * @returns {Object} containing all log handling functions\n */\nexport default async function (MONGO_URI, dbName = 'rest-api') {\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(dbName);\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getListOfCatalogers, getListOfCorrelationIds, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n /**\n * Add log item to collection\n * @param {Object} logItem contains log item data\n * @returns void\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 // console.log(newLogItem); // eslint-disable-line\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 // console.log('addLogItem done', result); // eslint-disable-line\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 /**\n * Query log items\n * @param {Integer} limit defaults 5\n * @param {Integer} skip defaults 0\n * @param {Object} rest query params\n * @returns result array\n */\n async function query({limit = 5, skip = 0, ...rest}) {\n logger.debug(`Query params: ${JSON.stringify(rest)}`);\n logger.debug(`Limit and skip params: ${limit} | ${skip}`);\n checkLogItemType(rest.logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({creationTime: 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 // DEVELOP: queryById returns jsut one (randomish) log! is this useful?\n /**\n * Get single log item by correlationId\n * @param {String} correlationId\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @param {Integer} skip defaults 0\n * @param {Integer} limit defaults 1\n * @returns query result array\n */\n async function queryById(correlationId, logItemType = LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationId}, logItemType: ${logItemType}, skip: ${skip}, limit: ${limit}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId, logItemType})\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 // getListOfLogs returns list of correlationIds that have logs of given logItemType\n // if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG\n /**\n * Get list of correlationIds of logs filtered by logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @returns Array of query results\n */\n async function getListOfLogs(logItemType = LOG_ITEM_TYPE.MERGE_LOG) {\n checkLogItemType(logItemType, true, true);\n //logger.debug(logItemType);\n // eslint-disable-next-line no-console\n // console.log(`${JSON.stringify(logItemType)}`);\n const result = await db.collection(collection)\n .distinct('correlationId', {logItemType: `${logItemType}`});\n logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : 'Not found!'}`);\n return result;\n }\n\n /**\n * Get list of catalogers from all available logs\n * @returns Array of query results\n */\n async function getListOfCatalogers() {\n logger.debug(`Getting list of Catalogers`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('cataloger');\n\n return result;\n }\n\n /**\n * Get list of correlationIds from all available logs\n * @returns Array of query results\n */\n async function getListOfCorrelationIds() {\n logger.debug(`Getting list of CorrelationIds`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId');\n\n return result;\n }\n\n\n /**\n * Get filtered list of logs with extra info. Give params in Object\n * @param {[String]} logItemTypes: String array of logItemTypes. Defaults [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG]\n * @param {[String]} catalogers: String array of wanted catalogers. Defaults []\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'. Defaults new Date()\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'. Defaults '2000-01-01'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Parsed Object {'correlationId', 'logItemType', 'creationTime', 'cataloger', 'logCount'}\n */\n async function getExpandedListOfLogs({logItemTypes = [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG], catalogers = [], dateBefore = new Date(), dateAfter = '2000-01-01', test = false}) {\n logger.debug(`commons/getExpandedListOfLogs: logItemTypes: ${JSON.stringify(logItemTypes)}, dateAfter: ${dateAfter}, dateBefore: ${dateBefore}}, catalogers: ${JSON.stringify(catalogers)}`);\n logger.silly(JSON.stringify(generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter}))); // eslint-disable-line\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 generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test}),\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n },\n {\n '$group':\n {\n '_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}\n }\n },\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n }\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 fixedResult;\n\n /**\n * Generate match object for aggregation pipeline\n * @param {[String]} logItemTypes: String array of logItemTypes.\n * @param {[String]} catalogers: String array of wanted catalogers\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Match Object\n */\n function generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test = false}) {\n const matchOptions = {\n '$match': {\n 'logItemType': logItemTypes.length > 0 ? {'$in': logItemTypes} : /.*/ui,\n 'cataloger': catalogers.length > 0 ? {'$in': catalogers} : /.*/ui,\n 'creationTime': {\n '$gte': test ? new Date(dateAfter).toISOString() : new Date(dateAfter),\n '$lte': test ? new Date(dateBefore).toISOString() : new Date(dateBefore)\n }\n }\n };\n\n return matchOptions;\n }\n }\n\n /**\n * Protect logs from cleaning. Forced cleaning defaults 30days\n * @param {String} correlationId\n * @param {Integer} blobSequence\n * @returns result\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 result;\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 * Remove logs\n * @param {String} correlationId\n * @param {Boolean} force defaults false\n * @returns result\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 result;\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 * Remove logs by sequences\n * @param {String} correlationId\n * @param {[Integer]} sequences\n * @param {Boolean} force defaults false\n * @returns result\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 result;\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 * Checks existence and validity of logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE\n * @param {Boolean} errorUnknown defaults false\n * @param {Boolean} errorNotExisting defaults false\n * @returns void\n */\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\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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","ignoreList":[]}
1
+ {"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","_default","MONGO_URI","dbName","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","getListOfCatalogers","getListOfCorrelationIds","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","limit","skip","rest","debug","JSON","stringify","find","sort","parseInt","toArray","length","LOG_ITEM_TYPE","MERGE_LOG","distinct","logItemTypes","MATCH_LOG","catalogers","dateBefore","Date","dateAfter","test","silly","generateMatchObject","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","matchOptions","toISOString","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","force","clean","$ne","deleteMany","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["\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\n/**\n * Create log operator\n * @param {String} MONGO_URI connnection address to mongo\n * @param {String} dbName Mongo DB name, defaults 'rest-api'\n * @returns {Object} containing all log handling functions\n */\nexport default async function (MONGO_URI, dbName = 'rest-api') {\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(dbName);\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getListOfCatalogers, getListOfCorrelationIds, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n /**\n * Add log item to collection\n * @param {Object} logItem contains log item data\n * @returns void\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 // console.log(newLogItem); // eslint-disable-line\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 // console.log('addLogItem done', result); // eslint-disable-line\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 /**\n * Query log items\n * @param {Integer} limit defaults 5\n * @param {Integer} skip defaults 0\n * @param {Object} rest query params\n * @returns result array\n */\n async function query({limit = 5, skip = 0, ...rest}) {\n logger.debug(`Query params: ${JSON.stringify(rest)}`);\n logger.debug(`Limit and skip params: ${limit} | ${skip}`);\n checkLogItemType(rest.logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({creationTime: 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 // DEVELOP: queryById returns jsut one (randomish) log! is this useful?\n /**\n * Get single log item by correlationId\n * @param {String} correlationId\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @param {Integer} skip defaults 0\n * @param {Integer} limit defaults 1\n * @returns query result array\n */\n async function queryById(correlationId, logItemType = LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationId}, logItemType: ${logItemType}, skip: ${skip}, limit: ${limit}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId, logItemType})\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 // getListOfLogs returns list of correlationIds that have logs of given logItemType\n // if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG\n /**\n * Get list of correlationIds of logs filtered by logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @returns Array of query results\n */\n async function getListOfLogs(logItemType = LOG_ITEM_TYPE.MERGE_LOG) {\n checkLogItemType(logItemType, true, true);\n //logger.debug(logItemType);\n // eslint-disable-next-line no-console\n // console.log(`${JSON.stringify(logItemType)}`);\n const result = await db.collection(collection)\n .distinct('correlationId', {logItemType: `${logItemType}`});\n logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : 'Not found!'}`);\n return result;\n }\n\n /**\n * Get list of catalogers from all available logs\n * @returns Array of query results\n */\n async function getListOfCatalogers() {\n logger.debug(`Getting list of Catalogers`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('cataloger');\n\n return result;\n }\n\n /**\n * Get list of correlationIds from all available logs\n * @returns Array of query results\n */\n async function getListOfCorrelationIds() {\n logger.debug(`Getting list of CorrelationIds`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId');\n\n return result;\n }\n\n\n /**\n * Get filtered list of logs with extra info. Give params in Object\n * @param {[String]} logItemTypes: String array of logItemTypes. Defaults [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG]\n * @param {[String]} catalogers: String array of wanted catalogers. Defaults []\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'. Defaults new Date()\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'. Defaults '2000-01-01'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Parsed Object {'correlationId', 'logItemType', 'creationTime', 'cataloger', 'logCount'}\n */\n async function getExpandedListOfLogs({logItemTypes = [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG], catalogers = [], dateBefore = new Date(), dateAfter = '2000-01-01', test = false}) {\n logger.debug(`commons/getExpandedListOfLogs: logItemTypes: ${JSON.stringify(logItemTypes)}, dateAfter: ${dateAfter}, dateBefore: ${dateBefore}}, catalogers: ${JSON.stringify(catalogers)}`);\n logger.silly(JSON.stringify(generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter}))); // eslint-disable-line\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 generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test}),\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n },\n {\n '$group':\n {\n '_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}\n }\n },\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n }\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 fixedResult;\n\n /**\n * Generate match object for aggregation pipeline\n * @param {[String]} logItemTypes: String array of logItemTypes.\n * @param {[String]} catalogers: String array of wanted catalogers\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Match Object\n */\n function generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test = false}) {\n const matchOptions = {\n '$match': {\n 'logItemType': logItemTypes.length > 0 ? {'$in': logItemTypes} : /.*/ui,\n 'cataloger': catalogers.length > 0 ? {'$in': catalogers} : /.*/ui,\n 'creationTime': {\n '$gte': test ? new Date(dateAfter).toISOString() : new Date(dateAfter),\n '$lte': test ? new Date(dateBefore).toISOString() : new Date(dateBefore)\n }\n }\n };\n\n return matchOptions;\n }\n }\n\n /**\n * Protect logs from cleaning. Forced cleaning defaults 30days\n * @param {String} correlationId\n * @param {Integer} blobSequence\n * @returns result\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 result;\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 * Remove logs\n * @param {String} correlationId\n * @param {Boolean} force defaults false\n * @returns result\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 result;\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 * Remove logs by sequences\n * @param {String} correlationId\n * @param {[Integer]} sequences\n * @param {Boolean} force defaults false\n * @returns result\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 result;\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 * Checks existence and validity of logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE\n * @param {Boolean} errorUnknown defaults false\n * @param {Boolean} errorNotExisting defaults false\n * @returns void\n */\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\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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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"mongoLog.spec.js","names":["_fixura","require","_fixugen","_interopRequireDefault","_fixuraMongo","_chai","_mongoLog","mongoFixtures","generateTests","callback","path","__dirname","recurse","useMetadataFile","fixura","failWhenNotFound","reader","READERS","JSON","mocha","before","initMongofixtures","beforeEach","clear","afterEach","after","close","mongoFixturesFactory","rootPath","gridFS","bucketName","useObjectId","format","creationTime","v","Date","modificationTime","getFixture","functionName","params","preFillDb","mongoUri","getUri","mongoLogOperator","createMongoLogOperator","expectedResult","populate","addLogItem","dump","expect","logs","to","eql","result","getListOfCatalogers","getExpandedListOfLogs","getListOfLogs","Error"],"sources":["../src/mongoLog.spec.js"],"sourcesContent":["// import {expect} from 'chai';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport mongoFixturesFactory from '@natlibfi/fixura-mongo';\nimport {expect} from 'chai';\nimport createMongoLogOperator from './mongoLog';\n\nlet mongoFixtures; // eslint-disable-line functional/no-let\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'mongoLog'],\n recurse: false,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: true,\n reader: READERS.JSON\n },\n mocha: {\n before: async () => {\n await initMongofixtures();\n },\n beforeEach: () => mongoFixtures.clear(),\n afterEach: () => mongoFixtures.clear(),\n after: async () => {\n await mongoFixtures.close();\n }\n }\n});\n\nasync function initMongofixtures() {\n mongoFixtures = await mongoFixturesFactory({\n rootPath: [__dirname, '..', 'test-fixtures', 'mongoLog'],\n gridFS: {bucketName: 'blobs'},\n useObjectId: true,\n format: {\n creationTime: v => new Date(v),\n modificationTime: v => new Date(v)\n }\n });\n}\n\nasync function callback({\n getFixture,\n functionName,\n params,\n preFillDb = false\n}) {\n const mongoUri = await mongoFixtures.getUri();\n const mongoLogOperator = await createMongoLogOperator(mongoUri, '');\n const expectedResult = await getFixture('expectedResult.json');\n // console.log(typeof mongoUri); // eslint-disable-line\n\n if (preFillDb) { // eslint-disable-line functional/no-conditional-statements\n await mongoFixtures.populate(getFixture('dbContents.json'));\n }\n\n if (functionName === 'addLogItem') {\n await mongoLogOperator.addLogItem(params);\n const dump = await mongoFixtures.dump();\n\n return expect(dump.logs[0]['0']).to.eql(expectedResult);\n }\n\n if (functionName === 'getListOfCatalogers') {\n const result = await mongoLogOperator.getListOfCatalogers();\n // console.log(result); // eslint-disable-line\n\n return expect(result).to.eql(expectedResult);\n }\n\n if (functionName === 'getExpandedListOfLogs') {\n const result = await mongoLogOperator.getExpandedListOfLogs(params);\n // console.log(result); // eslint-disable-line\n\n return expect(result).to.eql(expectedResult);\n }\n\n if (functionName === 'getListOfLogs') {\n const result = await mongoLogOperator.getListOfLogs(params);\n // console.log(result); // eslint-disable-line\n return expect(result).to.eql(expectedResult);\n }\n throw new Error(`Unknown functionName: ${functionName}`);\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mongoLog.spec.js","names":["_fixura","require","_fixugen","_interopRequireDefault","_fixuraMongo","_chai","_mongoLog","mongoFixtures","generateTests","callback","path","__dirname","recurse","useMetadataFile","fixura","failWhenNotFound","reader","READERS","JSON","mocha","before","initMongofixtures","beforeEach","clear","afterEach","after","close","mongoFixturesFactory","rootPath","gridFS","bucketName","useObjectId","format","creationTime","v","Date","modificationTime","getFixture","functionName","params","preFillDb","mongoUri","getUri","mongoLogOperator","createMongoLogOperator","expectedResult","populate","addLogItem","dump","expect","logs","to","eql","result","getListOfCatalogers","getExpandedListOfLogs","getListOfLogs","Error"],"sources":["../src/mongoLog.spec.js"],"sourcesContent":["// import {expect} from 'chai';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport mongoFixturesFactory from '@natlibfi/fixura-mongo';\nimport {expect} from 'chai';\nimport createMongoLogOperator from './mongoLog';\n\nlet mongoFixtures; // eslint-disable-line functional/no-let\n\ngenerateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'mongoLog'],\n recurse: false,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: true,\n reader: READERS.JSON\n },\n mocha: {\n before: async () => {\n await initMongofixtures();\n },\n beforeEach: () => mongoFixtures.clear(),\n afterEach: () => mongoFixtures.clear(),\n after: async () => {\n await mongoFixtures.close();\n }\n }\n});\n\nasync function initMongofixtures() {\n mongoFixtures = await mongoFixturesFactory({\n rootPath: [__dirname, '..', 'test-fixtures', 'mongoLog'],\n gridFS: {bucketName: 'blobs'},\n useObjectId: true,\n format: {\n creationTime: v => new Date(v),\n modificationTime: v => new Date(v)\n }\n });\n}\n\nasync function callback({\n getFixture,\n functionName,\n params,\n preFillDb = false\n}) {\n const mongoUri = await mongoFixtures.getUri();\n const mongoLogOperator = await createMongoLogOperator(mongoUri, '');\n const expectedResult = await getFixture('expectedResult.json');\n // console.log(typeof mongoUri); // eslint-disable-line\n\n if (preFillDb) { // eslint-disable-line functional/no-conditional-statements\n await mongoFixtures.populate(getFixture('dbContents.json'));\n }\n\n if (functionName === 'addLogItem') {\n await mongoLogOperator.addLogItem(params);\n const dump = await mongoFixtures.dump();\n\n return expect(dump.logs[0]['0']).to.eql(expectedResult);\n }\n\n if (functionName === 'getListOfCatalogers') {\n const result = await mongoLogOperator.getListOfCatalogers();\n // console.log(result); // eslint-disable-line\n\n return expect(result).to.eql(expectedResult);\n }\n\n if (functionName === 'getExpandedListOfLogs') {\n const result = await mongoLogOperator.getExpandedListOfLogs(params);\n // console.log(result); // eslint-disable-line\n\n return expect(result).to.eql(expectedResult);\n }\n\n if (functionName === 'getListOfLogs') {\n const result = await mongoLogOperator.getListOfLogs(params);\n // console.log(result); // eslint-disable-line\n return expect(result).to.eql(expectedResult);\n }\n throw new Error(`Unknown functionName: ${functionName}`);\n}\n\n"],"mappings":"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","ignoreList":[]}
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_melindaBackendCommons","require","_melindaCommons","_constants","_httpStatus","_interopRequireDefault","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","FORBIDDEN","newMessage","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["import {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 if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message};\n }\n\n // Otherwise\n logger.debug(`Unknown responseStatus: ${responseStatus}`);\n const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n 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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","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["_melindaBackendCommons","require","_melindaCommons","_constants","_httpStatus","_interopRequireDefault","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","FORBIDDEN","newMessage","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["import {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 if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message};\n }\n\n // Otherwise\n logger.debug(`Unknown responseStatus: ${responseStatus}`);\n const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n 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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","ignoreList":[]}
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": "MIT",
17
- "version": "4.1.7",
17
+ "version": "4.1.8-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=18"
@@ -36,37 +36,37 @@
36
36
  "dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test nodemon"
37
37
  },
38
38
  "dependencies": {
39
- "@natlibfi/marc-record": "^8.1.3",
39
+ "@natlibfi/marc-record": "^9.0.1",
40
40
  "@natlibfi/marc-record-serializers": "^10.1.2",
41
- "@natlibfi/marc-record-validate": "^8.0.8",
42
- "@natlibfi/marc-record-validators-melinda": "^10.16.1",
43
- "@natlibfi/melinda-backend-commons": "^2.2.6",
44
- "@natlibfi/melinda-commons": "^13.0.14",
41
+ "@natlibfi/marc-record-validate": "^8.0.9",
42
+ "@natlibfi/marc-record-validators-melinda": "^11.3.1",
43
+ "@natlibfi/melinda-backend-commons": "^2.3.0",
44
+ "@natlibfi/melinda-commons": "^13.0.16",
45
45
  "amqplib": "^0.10.4",
46
- "debug": "^4.3.4",
46
+ "debug": "^4.3.6",
47
47
  "http-status": "^1.7.4",
48
48
  "moment": "^2.30.1",
49
49
  "mongo-sanitize": "^1.1.0",
50
50
  "mongodb": "^4.17.2"
51
51
  },
52
52
  "devDependencies": {
53
- "@babel/cli": "^7.24.5",
54
- "@babel/core": "^7.24.5",
55
- "@babel/plugin-transform-runtime": "^7.24.3",
56
- "@babel/preset-env": "^7.24.5",
57
- "@babel/register": "^7.23.7",
53
+ "@babel/cli": "^7.24.8",
54
+ "@babel/core": "^7.25.2",
55
+ "@babel/plugin-transform-runtime": "^7.24.7",
56
+ "@babel/preset-env": "^7.25.3",
57
+ "@babel/register": "^7.24.6",
58
58
  "@natlibfi/eslint-config-melinda-backend": "^3.0.5",
59
- "@natlibfi/fixugen": "^2.0.6",
60
- "@natlibfi/fixura": "^3.0.5",
61
- "@natlibfi/fixura-mongo": "^2.0.17",
62
- "babel-plugin-istanbul": "^6.1.1",
59
+ "@natlibfi/fixugen": "^2.0.9",
60
+ "@natlibfi/fixura": "^3.0.8",
61
+ "@natlibfi/fixura-mongo": "^2.0.18",
62
+ "babel-plugin-istanbul": "^7.0.0",
63
63
  "babel-plugin-rewire": "^1.2.0",
64
- "chai": "^4.4.1",
64
+ "chai": "^4.5.0",
65
65
  "cross-env": "^7.0.3",
66
66
  "eslint": "^8.57.0",
67
- "mocha": "^10.4.0",
68
- "nodemon": "^3.1.0",
69
- "nyc": "^15.1.0"
67
+ "mocha": "^10.7.3",
68
+ "nodemon": "^3.1.4",
69
+ "nyc": "^17.0.0"
70
70
  },
71
71
  "eslintConfig": {
72
72
  "extends": "@natlibfi/melinda-backend"