@natlibfi/melinda-rest-api-commons 3.0.6-alpha.2 → 3.4.2-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/melinda-node-tests.yml +7 -7
- package/README.md +1 -1
- package/dist/amqp.health.spec.js.map +1 -1
- package/dist/amqp.js.map +1 -1
- package/dist/amqp.tests.spec.js +1 -1
- package/dist/amqp.tests.spec.js.map +1 -1
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/helpers/conversion.js +8 -4
- package/dist/helpers/conversion.js.map +1 -1
- package/dist/helpers/conversion.spec.js.map +1 -1
- package/dist/helpers/fix-constants.js.map +1 -1
- package/dist/helpers/fix-handle-tempurns.js.map +1 -1
- package/dist/helpers/fix-strip-f884s.js +170 -18
- package/dist/helpers/fix-strip-f884s.js.map +1 -1
- package/dist/helpers/fix-utils.js.map +1 -1
- package/dist/helpers/fix.js +2 -1
- package/dist/helpers/fix.js.map +1 -1
- package/dist/helpers/fix.spec.js +3 -3
- package/dist/helpers/fix.spec.js.map +1 -1
- package/dist/helpers/validation.js.map +1 -1
- package/dist/helpers/validation.spec.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mongo.js +41 -18
- package/dist/mongo.js.map +1 -1
- package/dist/mongoLog.js +12 -5
- package/dist/mongoLog.js.map +1 -1
- package/dist/utils.js +20 -2
- package/dist/utils.js.map +1 -1
- package/package.json +20 -20
package/dist/mongo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo.js","names":["MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","records","errorMessage","errorStatus","creationTime","modificationTime","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","payload","message","logError","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","limit","skip","rest","find","projection","_id","parseInt","toArray","length","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","silly","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","JSON","stringify","clean","sanitize","noContent","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","Object","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","keys","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","filter","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statement\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-statement\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n const {showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n const {limit = 1000, skip = 0, ...rest} = params;\n const result = await db.collection(collection).find(rest, {projection: {\n _id: 0,\n operations: showOperations,\n operationSettings: showOperationSettings,\n recordLoadParams: showRecordLoadParams,\n importJobState: showImportJobState\n }})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n return result;\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSetting for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","obj","__esModule","default","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","records","errorMessage","errorStatus","creationTime","modificationTime","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","payload","message","logError","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","JSON","stringify","limit","skip","rest","find","projection","createProjection","parseInt","toArray","length","silly","showAll","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","_id","showParamToField","Object","keys","filter","param","map","excludeObject","fromEntries","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","clean","sanitize","noContent","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2023 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await db.collection(collection).find(rest, {projection: createProjection(showParams)})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n logger.silly(`${JSON.stringify(result)}`);\n return result;\n }\n\n // We default to NOT showing operations, operationSettings, recordLoadParams and importJobState when a queueItem is queried\n // These can all be shown with showAll\n // Single fields can be shown by showOperation, showOperationSettings, showRecordLoadParams and showImportJobState\n\n function createProjection(showParams = {}) {\n logger.silly(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n\n if (showAll) {\n return {\n _id: 0\n };\n }\n\n const showParamToField = {\n 'showOperations': 'operations',\n 'showOperationSettings': 'operationSettings',\n 'showRecordLoadParams': 'recordLoadParams',\n 'showImportJobState': 'importJobState'\n };\n\n const result = Object.keys(showParams)\n .filter(param => param !== 'showAll' && showParams[param] !== true && showParams[param] !== 1)\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.debug(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.debug(`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(`OperationSetting for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":";;;;;;AA6BA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAC,sBAAA,CAAAN,OAAA;AACA,IAAAO,WAAA,GAAAD,sBAAA,CAAAN,OAAA;AACA,IAAAQ,cAAA,GAAAF,sBAAA,CAAAN,OAAA;AAAsC,SAAAM,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AApCtC;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;;AAUA;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;AAEe,eAAAG,SAAgBC,SAAS,EAAEC,UAAU,EAAE;EACpD,MAAMC,MAAM,GAAG,IAAAC,mCAAY,EAAC,CAAC;;EAE7B;EACA,MAAMC,MAAM,GAAG,MAAMC,oBAAW,CAACC,OAAO,CAACN,SAAS,EAAE;IAACO,eAAe,EAAE,IAAI;IAAEC,kBAAkB,EAAE;EAAI,CAAC,CAAC;EACtG,MAAMC,EAAE,GAAGL,MAAM,CAACK,EAAE,CAAC,UAAU,CAAC;EAChC,MAAMC,YAAY,GAAG,IAAIC,qBAAY,CAACF,EAAE,EAAE;IAACG,UAAU,EAAEX;EAAU,CAAC,CAAC;EAEnE,OAAO;IAACY,UAAU;IAAEC,UAAU;IAAEC,gBAAgB;IAAEC,yBAAyB;IAAEC,KAAK;IAAEC,SAAS;IAAEC,MAAM;IAAEC,WAAW;IAAEC,aAAa;IAAEC,MAAM;IAAEC,SAAS;IAAEC,QAAQ;IAAEC,iBAAiB;IAAEC,OAAO;IAAEC,YAAY;IAAEC,YAAY;IAAEC,aAAa;IAAEC,WAAW;IAAEC;EAAW,CAAC;EAEhQ,eAAelB,UAAUA,CAAC;IAACmB,aAAa;IAAEC,SAAS;IAAEC,YAAY;IAAEC,SAAS;IAAEC;EAAiB,CAAC,EAAE;IAChG,MAAMC,IAAI,GAAG,IAAAC,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC,CAAC;IAC9B,MAAMC,YAAY,GAAG;MACnBR,aAAa;MACbC,SAAS;MACTE,SAAS;MACTM,UAAU,EAAE,CAACN,SAAS,CAAC;MACvBD,YAAY;MACZE,iBAAiB,EAAE;QACjBM,IAAI,EAAE,IAAI;QACV,GAAGN;MACL,CAAC;MACDO,cAAc,EAAEC,2BAAgB,CAACC,SAAS,CAACC,kBAAkB;MAC7DC,QAAQ,EAAE,CAAC;MACXC,cAAc,EAAE;QACdC,MAAM,EAAEC,2BAAgB,CAACC,KAAK;QAC9BC,MAAM,EAAEF,2BAAgB,CAACC;MAC3B,CAAC;MACDE,OAAO,EAAE,EAAE;MACXC,YAAY,EAAE,EAAE;MAChBC,WAAW,EAAE,EAAE;MACfC,YAAY,EAAEnB,IAAI;MAClBoB,gBAAgB,EAAEpB;IACpB,CAAC;IACD,IAAI;MACF,MAAMqB,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC0D,SAAS,CAACnB,YAAY,CAAC;MACtE,IAAIkB,MAAM,CAACE,YAAY,EAAE;QACvB1D,MAAM,CAAC2D,IAAI,CAAE,2BAA0B1B,SAAU,IAAGH,aAAc,qBAAoB/B,UAAW,EAAC,CAAC;QACnG;MACF;MACA,MAAM,IAAI6D,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,CAAC;IACtD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,MAAMX,YAAY,GAAGW,KAAK,CAACC,OAAO,IAAID,KAAK,CAACE,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACH,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBV,YAAa,EAAC,CAAC;IACxF;EACF;;EAEA;EACA,eAAexC,UAAUA,CAAC;IAACkB,aAAa;IAAEC,SAAS;IAAEC,YAAY;IAAEC,SAAS;IAAEkC,WAAW;IAAEC,gBAAgB;IAAEC,MAAM;IAAEnC;EAAiB,CAAC,EAAE;IACvI,MAAMC,IAAI,GAAG,IAAAC,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC,CAAC;IAC9B,MAAMC,YAAY,GAAG;MACnBR,aAAa;MACbC,SAAS;MACTC,YAAY;MACZC,SAAS;MACTM,UAAU,EAAE,CAACN,SAAS,CAAC;MACvBC,iBAAiB,EAAE;QACjBM,IAAI,EAAE,KAAK;QACX,GAAGN;MACL,CAAC;MACDiC,WAAW;MACXC,gBAAgB;MAChB3B,cAAc,EAAE4B,MAAM,GAAG3B,2BAAgB,CAACC,SAAS,CAAC2B,SAAS,GAAG5B,2BAAgB,CAACC,SAAS,CAAC4B,mBAAmB;MAC9G1B,QAAQ,EAAE,CAAC;MACXC,cAAc,EAAE;QACdC,MAAM,EAAEC,2BAAgB,CAACC,KAAK;QAC9BC,MAAM,EAAEF,2BAAgB,CAACC;MAC3B,CAAC;MACDE,OAAO,EAAE,EAAE;MACXC,YAAY,EAAE,EAAE;MAChBC,WAAW,EAAE,EAAE;MACfC,YAAY,EAAEnB,IAAI;MAClBoB,gBAAgB,EAAEpB;IACpB,CAAC;;IAED;IACA,IAAIkC,MAAM,EAAE;MACV,IAAI;QACF;QACA9D,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC0D,SAAS,CAACnB,YAAY,CAAC;QACjDtC,MAAM,CAAC2D,IAAI,CAAE,2BAA0B1B,SAAU,IAAGH,aAAc,qBAAoB/B,UAAW,GAAE,CAAC;QACpG,OAAO,IAAIyE,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;UACtC,MAAMC,YAAY,GAAGnE,YAAY,CAACoE,gBAAgB,CAAC9C,aAAa,CAAC;UAEjEuC,MAAM,CACHQ,EAAE,CAAC,OAAO,EAAEH,MAAM,CAAC,CACnBG,EAAE,CAAC,MAAM,EAAEC,KAAK,IAAIH,YAAY,CAACI,KAAK,CAACD,KAAK,CAAC,CAAC,CAC9CD,EAAE,CAAC,KAAK,EAAE,MAAMF,YAAY,CAACK,GAAG,CAACC,SAAS,EAAEA,SAAS,EAAE,MAAM;YAC5DR,OAAO,CAAC3C,aAAa,CAAC;UACxB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;MACJ,CAAC,CAAC,OAAOiC,KAAK,EAAE;QACd,MAAMX,YAAY,GAAGW,KAAK,CAACC,OAAO,IAAID,KAAK,CAACE,OAAO,IAAI,EAAE;QACzD,IAAAC,eAAQ,EAACH,KAAK,CAAC;QACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBV,YAAa,EAAC,CAAC;MACxF;IACF;IAEApD,MAAM,CAACkF,KAAK,CAAE,WAAU,CAAC;IACzB;IACA,IAAI,CAACb,MAAM,EAAE;MACX,IAAI;QACF,MAAMb,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC0D,SAAS,CAACnB,YAAY,CAAC;QACtE,IAAIkB,MAAM,CAACE,YAAY,EAAE;UACvB1D,MAAM,CAAC2D,IAAI,CAAE,oCAAmC1B,SAAU,IAAGH,aAAc,qBAAoB/B,UAAW,EAAC,CAAC;UAC5G,OAAO;YAAC+B,aAAa;YAAEW,cAAc,EAAEC,2BAAgB,CAACC,SAAS,CAAC4B;UAAmB,CAAC;QACxF;QACA,MAAM,IAAIX,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,CAAC;MACtD,CAAC,CAAC,OAAOC,KAAK,EAAE;QACd,MAAMX,YAAY,GAAGW,KAAK,CAACC,OAAO,IAAID,KAAK,CAACE,OAAO,IAAI,EAAE;QACzD,IAAAC,eAAQ,EAACH,KAAK,CAAC;QACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBV,YAAa,EAAC,CAAC;MACxF;IACF;EACF;;EAEA;EACA,eAAevC,gBAAgBA,CAAC;IAACiB,aAAa;IAAEqD,KAAK;IAAE/B,YAAY,GAAG6B,SAAS;IAAE5B,WAAW,GAAG4B;EAAS,CAAC,EAAE;IACzG;IACA;IACA,MAAMG,OAAO,GAAG,MAAMC,YAAY,CAAC;MAACvD;IAAa,CAAC,CAAC;IACnD,IAAIsD,OAAO,EAAE;MACX,OAAO9D,QAAQ,CAAC;QAACQ,aAAa;QAAEqD,KAAK;QAAE/B,YAAY;QAAEC;MAAW,CAAC,CAAC;IACpE;IACA,OAAO,KAAK;EACd;;EAEA;EACA,eAAevC,yBAAyBA,CAAC;IAACgB,aAAa;IAAEG,SAAS;IAAEa,cAAc;IAAEM,YAAY,GAAG,EAAE;IAAEC,WAAW,GAAG;EAAE,CAAC,EAAE;IACxH;IACA;IACArD,MAAM,CAACkF,KAAK,CAAE,GAAEpD,aAAc,KAAIgB,cAAe,KAAIb,SAAU,EAAC,CAAC;IACjE,MAAMmD,OAAO,GAAG,MAAMC,YAAY,CAAC;MAACvD,aAAa;MAAEG,SAAS;MAAEa;IAAc,CAAC,CAAC;IAC9E,IAAIsC,OAAO,EAAE;MACX,OAAO7D,iBAAiB,CAAC;QAACO,aAAa;QAAEG,SAAS;QAAEa,cAAc;QAAEM,YAAY;QAAEC;MAAW,CAAC,CAAC;IACjG;IACA,OAAO,KAAK;EACd;EAEA,eAAetC,KAAKA,CAACuE,MAAM,EAAEC,UAAU,GAAG,CAAC,CAAC,EAAE;IAC5CvF,MAAM,CAACkF,KAAK,CAAE,aAAYM,IAAI,CAACC,SAAS,CAACH,MAAM,CAAE,KAAIE,IAAI,CAACC,SAAS,CAACF,UAAU,CAAE,EAAC,CAAC;IAClF,MAAM;MAACG,KAAK,GAAG,IAAI;MAAEC,IAAI,GAAG,CAAC;MAAE,GAAGC;IAAI,CAAC,GAAGN,MAAM;IAEhD,MAAM9B,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC8F,IAAI,CAACD,IAAI,EAAE;MAACE,UAAU,EAAEC,gBAAgB,CAACR,UAAU;IAAC,CAAC,CAAC,CAClGG,KAAK,CAACM,QAAQ,CAACN,KAAK,EAAE,EAAE,CAAC,CAAC,CAC1BC,IAAI,CAACK,QAAQ,CAACL,IAAI,EAAE,EAAE,CAAC,CAAC,CACxBM,OAAO,CAAC,CAAC;IACZjG,MAAM,CAACkF,KAAK,CAAE,iBAAgB1B,MAAM,CAAC0C,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,YAAa,EAAC,CAAC;IAC5ElG,MAAM,CAACmG,KAAK,CAAE,GAAEX,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAE,EAAC,CAAC;IACzC,OAAOA,MAAM;EACf;;EAEA;EACA;EACA;;EAEA,SAASuC,gBAAgBA,CAACR,UAAU,GAAG,CAAC,CAAC,EAAE;IACzCvF,MAAM,CAACmG,KAAK,CAAE,kCAAiCX,IAAI,CAACC,SAAS,CAACF,UAAU,CAAE,EAAC,CAAC;IAC5E,MAAM;MAACa,OAAO,GAAG,CAAC;MAAEC,cAAc,GAAG,CAAC;MAAEC,qBAAqB,GAAG,CAAC;MAAEC,oBAAoB,GAAG,CAAC;MAAEC,kBAAkB,GAAG;IAAC,CAAC,GAAGjB,UAAU;IACjIvF,MAAM,CAACkF,KAAK,CAAE,YAAWkB,OAAQ,qBAAoBC,cAAe,4BAA2BC,qBAAsB,2BAA0BC,oBAAqB,yBAAwBC,kBAAmB,EAAC,CAAC;IAEjN,IAAIJ,OAAO,EAAE;MACX,OAAO;QACLK,GAAG,EAAE;MACP,CAAC;IACH;IAEA,MAAMC,gBAAgB,GAAG;MACvB,gBAAgB,EAAE,YAAY;MAC9B,uBAAuB,EAAE,mBAAmB;MAC5C,sBAAsB,EAAE,kBAAkB;MAC1C,oBAAoB,EAAE;IACxB,CAAC;IAED,MAAMlD,MAAM,GAAGmD,MAAM,CAACC,IAAI,CAACrB,UAAU,CAAC,CACnCsB,MAAM,CAACC,KAAK,IAAIA,KAAK,KAAK,SAAS,IAAIvB,UAAU,CAACuB,KAAK,CAAC,KAAK,IAAI,IAAIvB,UAAU,CAACuB,KAAK,CAAC,KAAK,CAAC,CAAC,CAC7FD,MAAM,CAACC,KAAK,IAAIJ,gBAAgB,CAACI,KAAK,CAAC,CAAC,CACxCC,GAAG,CAAED,KAAK,IAAKJ,gBAAgB,CAACI,KAAK,CAAC,CAAC;IAC1C9G,MAAM,CAACkF,KAAK,CAAE,uCAAsCM,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAE,EAAC,CAAC;IAE7E,MAAMwD,aAAa,GAAGL,MAAM,CAACM,WAAW,CAACzD,MAAM,CAACuD,GAAG,CAACD,KAAK,IAAI,CAACA,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE9G,MAAM,CAACkF,KAAK,CAAE,uCAAsCM,IAAI,CAACC,SAAS,CAACuB,aAAa,CAAE,EAAC,CAAC;IAEpF,OAAO;MACLP,GAAG,EAAE,CAAC;MACN,GAAGO;IACL,CAAC;EACH;EAEA,eAAehG,SAASA,CAAC;IAACc,aAAa;IAAEoF,YAAY,GAAG;EAAK,CAAC,EAAE;IAC9D,MAAM1D,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;MAACrF;IAAa,CAAC,CAAC;IACvE,IAAIoF,YAAY,EAAE;MAChB,MAAM9B,OAAO,GAAG,MAAMC,YAAY,CAAC;QAACvD;MAAa,CAAC,CAAC;MACnD,IAAIsD,OAAO,EAAE;QACX,OAAOpE,SAAS,CAAC;UAACc;QAAa,CAAC,CAAC;MACnC;MACA,OAAO0B,MAAM;IACf;IAEA,OAAOA,MAAM;EACf;;EAEA;EACA;EACA;EACA;;EAEA,eAAe6B,YAAYA,CAAC;IAACvD;EAAa,CAAC,EAAE;IAC3C,MAAM;MAACyB,gBAAgB;MAAE6D,cAAc,EAAEC,QAAQ;MAAEvE;IAAc,CAAC,GAAG,MAAMvC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;MAACrF;IAAa,CAAC,CAAC;;IAE7H;IACA,IAAI,CAACY,2BAAgB,CAAC4E,KAAK,EAAE5E,2BAAgB,CAAC6E,KAAK,EAAE7E,2BAAgB,CAAC8E,IAAI,CAAC,CAACC,QAAQ,CAACJ,QAAQ,CAAC,EAAE;MAC9FrH,MAAM,CAACmG,KAAK,CAAE,GAAErE,aAAc,uBAAsBuF,QAAS,EAAC,CAAC;MAC/D,OAAO,KAAK;IACd;IAEA,MAAMK,WAAW,GAAG,IAAAtF,eAAM,EAACmB,gBAAgB,CAAC,CAACoE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;IACxD3H,MAAM,CAACmG,KAAK,CAAE,aAAYuB,WAAY,EAAC,CAAC;IAExC,IAAIA,WAAW,CAACE,QAAQ,CAAC,CAAC,EAAE;MAC1B,MAAMC,oBAAoB,GAAG,CAAC7E,2BAAgB,CAACsE,KAAK,EAAEtE,2BAAgB,CAACwE,IAAI,EAAExE,2BAAgB,CAACC,KAAK,EAAED,2BAAgB,CAACuE,KAAK,CAAC;MAC5H,IAAI,CAACM,oBAAoB,CAACJ,QAAQ,CAAC3E,cAAc,CAACC,MAAM,CAAC,EAAE;QAAE;QAC3D,MAAMxB,iBAAiB,CAAC;UAACO,aAAa;UAAEG,SAAS,EAAE,QAAQ;UAAEa,cAAc,EAAEE,2BAAgB,CAACsE;QAAK,CAAC,CAAC;MACvG;MAEA,IAAI,CAACO,oBAAoB,CAACJ,QAAQ,CAAC3E,cAAc,CAACI,MAAM,CAAC,EAAE;QAAE;QAC3D,MAAM3B,iBAAiB,CAAC;UAACO,aAAa;UAAEG,SAAS,EAAE,QAAQ;UAAEa,cAAc,EAAEE,2BAAgB,CAACsE;QAAK,CAAC,CAAC;MACvG;MAEA,MAAMhG,QAAQ,CAAC;QAACQ,aAAa;QAAEqD,KAAK,EAAEzC,2BAAgB,CAAC4E,KAAK;QAAEjE,WAAW,EAAEQ,mBAAU,CAACiE,eAAe;QAAE1E,YAAY,EAAG,cAAaiE,QAAS;MAAC,CAAC,CAAC;MAE/I,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb;EAEA,eAAepG,MAAMA,CAACqE,MAAM,EAAE;IAC5BtF,MAAM,CAACmG,KAAK,CAAE,GAAEX,IAAI,CAACC,SAAS,CAACH,MAAM,CAAE,EAAC,CAAC;IACzCtF,MAAM,CAAC2D,IAAI,CAAE,wBAAuB5D,UAAW,SAAQuF,MAAM,CAACxD,aAAc,EAAC,CAAC;IAC9E,MAAMiG,KAAK,GAAG,IAAAC,sBAAQ,EAAC1C,MAAM,CAACxD,aAAa,CAAC;IAC5C9B,MAAM,CAACmG,KAAK,CAAE,wBAAuBX,IAAI,CAACC,SAAS,CAACsC,KAAK,CAAE,EAAC,CAAC;IAE7D,IAAI;MACF;MACA;MACA,MAAME,SAAS,GAAG,MAAM9G,aAAa,CAACmE,MAAM,CAAC;MAC7C,IAAI2C,SAAS,EAAE;QACb,MAAM1H,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACmI,SAAS,CAAC;UAACpG,aAAa,EAAEiG;QAAK,CAAC,CAAC;QACjE,OAAO,IAAI;MACb;IACF,CAAC,CAAC,OAAOI,GAAG,EAAE;MACZ,IAAIA,GAAG,YAAYC,yBAAgB,EAAE;QACnC,IAAID,GAAG,CAAClE,OAAO,CAACoE,OAAO,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAAE;UACvDrI,MAAM,CAACmG,KAAK,CAAE,oDAAmDX,IAAI,CAACC,SAAS,CAACsC,KAAK,CAAE,SAAQhI,UAAW,EAAC,CAAC;UAC5G,MAAMQ,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACmI,SAAS,CAAC;YAACpG,aAAa,EAAEiG;UAAK,CAAC,CAAC;UACjE,OAAO,IAAI;QACb;QACA/H,MAAM,CAAC+D,KAAK,CAACoE,GAAG,CAAClE,OAAO,CAAC;QACzB,MAAM,IAAIL,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAEqE,GAAG,CAAClE,OAAO,CAAC;MACnE;MACA,MAAM,IAAIL,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAEqE,GAAG,CAAClE,OAAO,CAAC;IACnE;EACF;EAEA,eAAe/C,WAAWA,CAACY,aAAa,EAAE;IACxC9B,MAAM,CAAC2D,IAAI,CAAE,sCAAqC7B,aAAc,OAAM/B,UAAW,EAAC,CAAC;IACnF,MAAMgI,KAAK,GAAG,IAAAC,sBAAQ,EAAClG,aAAa,CAAC;IACrC,MAAM0B,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;MAACrF,aAAa,EAAEiG;IAAK,CAAC,CAAC,CAAC,CAAC;;IAEhF,IAAIvE,MAAM,EAAE;MACV,MAAM;QAACtB;MAAiB,CAAC,GAAGsB,MAAM;MAClC,IAAItB,iBAAiB,CAACM,IAAI,KAAK,KAAK,IAAIN,iBAAiB,CAACoG,QAAQ,KAAK,KAAK,EAAE;QAC5E,OAAO;UACLnE,WAAW,EAAEX,MAAM,CAACW,WAAW;UAC/BoE,UAAU,EAAE/H,YAAY,CAACgI,wBAAwB,CAACT,KAAK;QACzD,CAAC;MACH;MACA/H,MAAM,CAACkF,KAAK,CAAE,wBAAuBpD,aAAc,KAAI0D,IAAI,CAACC,SAAS,CAACvD,iBAAiB,CAAE,EAAC,CAAC;MAC3F,MAAM,IAAI0B,qBAAQ,CAACC,mBAAU,CAAC4E,WAAW,EAAE;QAACxE,OAAO,EAAG,kDAAiDnC,aAAc;MAA0B,CAAC,CAAC;IACnJ;IAEA,MAAM,IAAI8B,qBAAQ,CAACC,mBAAU,CAAC6E,SAAS,EAAE;MAACzE,OAAO,EAAG,OAAMnC,aAAc;IAAY,CAAC,CAAC;EACxF;EAEA,eAAeX,aAAaA,CAACmE,MAAM,EAAE;IACnCtF,MAAM,CAAC2D,IAAI,CAAE,uCAAsC2B,MAAM,CAACxD,aAAc,OAAM/B,UAAW,EAAC,CAAC;IAC3F,MAAMgI,KAAK,GAAG,IAAAC,sBAAQ,EAAC1C,MAAM,CAACxD,aAAa,CAAC;IAE5C,MAAM0B,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;MAACrF,aAAa,EAAEiG;IAAK,CAAC,CAAC,CAAC,CAAC;IAChF/H,MAAM,CAACmG,KAAK,CAAE,+BAA8BX,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAE,EAAC,CAAC;IAErE,IAAIA,MAAM,EAAE;MACV,MAAMhD,YAAY,CAACmI,MAAM,CAACZ,KAAK,CAAC;MAChC,OAAO,IAAI;IACb;IAEA,OAAO,IAAI;EACb;;EAEA;EACA,SAAS3G,MAAMA,CAAC;IAACqB,cAAc;IAAEK,cAAc,GAAGmC;EAAS,CAAC,EAAE;IAE5DjF,MAAM,CAACmG,KAAK,CAAE,mBAAkB1D,cAAe,qBAAoB+C,IAAI,CAACC,SAAS,CAAC3C,cAAc,CAAE,EAAC,CAAC;IACpG,MAAM8F,mBAAmB,GAAGnG,cAAc,GAAG;MAACA,cAAc,EAAE,IAAAuF,sBAAQ,EAACvF,cAAc;IAAC,CAAC,GAAGwC,SAAS;IAEnG,IAAI;MAEF;MACA,IAAIxC,cAAc,IAAIK,cAAc,KAAKmC,SAAS,EAAE;QAClDjF,MAAM,CAACmG,KAAK,CAAE,eAAcpG,UAAW,aAAYyF,IAAI,CAACC,SAAS,CAACmD,mBAAmB,CAACnG,cAAc,CAAE,EAAC,CAAC;QACxG,OAAOlC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;UAAC,GAAGyB;QAAmB,CAAC,CAAC;MACpE;;MAEA;MACA,IAAI9F,cAAc,IAAIL,cAAc,KAAKwC,SAAS,EAAE;QAClDjF,MAAM,CAACmG,KAAK,CAAE,eAAcpG,UAAW,QAAOyF,IAAI,CAACC,SAAS,CAAC3C,cAAc,CAAE,EAAC,CAAC;QAC/E,OAAOvC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;UAAC,GAAGrE;QAAc,CAAC,CAAC;MAC/D;;MAEA;MACA,IAAIA,cAAc,IAAIL,cAAc,EAAE;QACpCzC,MAAM,CAACmG,KAAK,CAAE,eAAcpG,UAAW,QAAO0C,cAAe,QAAO+C,IAAI,CAACC,SAAS,CAAC3C,cAAc,CAAE,EAAC,CAAC;QACrG,OAAOvC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;UAAC,GAAGyB,mBAAmB;UAAE,GAAG9F;QAAc,CAAC,CAAC;MACvF;MAEA9C,MAAM,CAACkF,KAAK,CAAE,qBAAoB,CAAC;MACnC,MAAM,IAAItB,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAE,0CAA0C,CAAC;IAElG,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,MAAMX,YAAY,GAAGW,KAAK,CAACC,OAAO,IAAID,KAAK,CAACE,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACH,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBV,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,SAAS/B,SAASA,CAACS,aAAa,EAAE;IAChC9B,MAAM,CAAC2D,IAAI,CAAE,iCAAgC7B,aAAc,OAAM/B,UAAW,EAAC,CAAC;IAC9E,MAAMgI,KAAK,GAAG,IAAAC,sBAAQ,EAAClG,aAAa,CAAC;IACrC,IAAI;MACF;MACA,OAAOtB,YAAY,CAACgI,wBAAwB,CAACT,KAAK,CAAC;IACrD,CAAC,CAAC,OAAOhE,KAAK,EAAE;MACd,MAAMX,YAAY,GAAGW,KAAK,CAACC,OAAO,IAAID,KAAK,CAACE,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACH,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBV,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,eAAe5B,OAAOA,CAAC;IAACM,aAAa;IAAE+G,UAAU;IAAEC;EAAW,CAAC,EAAE;IAC/D9I,MAAM,CAAC+I,OAAO,CAAE,aAAYF,UAAU,CAAC3C,MAAO,sBAAqB4C,WAAW,CAAC5C,MAAO,KAAIpE,aAAc,OAAM/B,UAAW,EAAC,CAAC;IAC3HC,MAAM,CAACkF,KAAK,CAAE,QAAO2D,UAAU,CAAC3C,MAAO,MAAKV,IAAI,CAACC,SAAS,CAACoD,UAAU,CAAE,iBAAgBC,WAAW,CAAC5C,MAAO,KAAIV,IAAI,CAACC,SAAS,CAACqD,WAAW,CAAE,EAAC,CAAC;IAC5I,MAAMf,KAAK,GAAG,IAAAC,sBAAQ,EAAClG,aAAa,CAAC;IACrC,MAAMvB,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACiJ,SAAS,CAAC;MACxClH,aAAa,EAAEiG;IACjB,CAAC,EAAE;MACDkB,IAAI,EAAE;QACJ1F,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC,CAAC;MACD6G,KAAK,EAAE;QACLL,UAAU,EAAE;UAACM,KAAK,EAAEN;QAAU,CAAC;QAC/BC,WAAW,EAAE;UAACK,KAAK,EAAEL;QAAW;MAClC;IACF,CAAC,CAAC;EACJ;EAEA,eAAerH,YAAYA,CAAC;IAACK,aAAa;IAAEsH,QAAQ;IAAEC,YAAY,GAAG;EAAU,CAAC,EAAE;IAChFrJ,MAAM,CAAC+I,OAAO,CAAE,kBAAiBK,QAAQ,CAAClD,MAAO,QAAOmD,YAAa,IAAGvH,aAAc,OAAM/B,UAAW,EAAC,CAAC;IACzGC,MAAM,CAACmG,KAAK,CAAE,aAAYiD,QAAQ,CAAClD,MAAO,MAAKV,IAAI,CAACC,SAAS,CAAC2D,QAAQ,CAAE,GAAE,CAAC;IAC3E,MAAMrB,KAAK,GAAG,IAAAC,sBAAQ,EAAClG,aAAa,CAAC;IACrC,MAAMwH,iBAAiB,GAAG,IAAAtB,sBAAQ,EAACqB,YAAY,CAAC;IAChD,MAAM9I,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACiJ,SAAS,CAAC;MACxClH,aAAa,EAAEiG;IACjB,CAAC,EAAE;MACDkB,IAAI,EAAE;QACJ1F,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC,CAAC;MACD6G,KAAK,EAAE;QACL,CAACI,iBAAiB,GAAG;UAACH,KAAK,EAAEC;QAAQ;MACvC;IACF,CAAC,CAAC;EACJ;EAEA,SAAS9H,QAAQA,CAAC;IAACQ,aAAa;IAAEqD,KAAK;IAAE/B,YAAY,GAAG6B,SAAS;IAAE5B,WAAW,GAAG4B;EAAS,CAAC,EAAE;IAC3F,MAAMsE,WAAW,GAAGnG,YAAY,IAAIC,WAAW,GAAI,qBAAoBmC,IAAI,CAACC,SAAS,CAACrC,YAAY,CAAC,IAAI,EAAG,qBAAoBC,WAAW,IAAI,EAAG,GAAE,GAAG,EAAE;IACvJrD,MAAM,CAAC2D,IAAI,CAAE,4BAA2BwB,KAAM,QAAOrD,aAAc,GAAEyH,WAAY,OAAMxJ,UAAW,EAAC,CAAC;IAEpG,MAAMyJ,sBAAsB,GAAG7C,MAAM,CAAC8C,MAAM,CAAC/G,2BAAgB,CAAC,CAAC2F,OAAO,CAAClD,KAAK,CAAC,GAAG,CAAC,CAAC;IAClF,MAAMuE,+BAA+B,GAAG/C,MAAM,CAAC8C,MAAM,CAAC/G,2BAAgB,CAACC,SAAS,CAAC,CAAC0F,OAAO,CAAClD,KAAK,CAAC,GAAG,CAAC,CAAC;IACrG,MAAMwE,8BAA8B,GAAGhD,MAAM,CAAC8C,MAAM,CAAC/G,2BAAgB,CAACkH,QAAQ,CAAC,CAACvB,OAAO,CAAClD,KAAK,CAAC,GAAG,CAAC,CAAC;IACnG,IAAI,CAACqE,sBAAsB,IAAI,CAACE,+BAA+B,IAAI,CAACC,8BAA8B,EAAE;MAClG,MAAM,IAAI/F,qBAAQ,CAACC,mBAAU,CAAC4E,WAAW,EAAE,6BAA6B,CAAC;IAC3E;IAEA,MAAMV,KAAK,GAAG,IAAAC,sBAAQ,EAAClG,aAAa,CAAC;IACrC,MAAM+H,YAAY,GAAG;MACnBpH,cAAc,EAAE0C,KAAK;MACrB5B,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC,CAAC;MACnCe,YAAY;MACZC;IACF,CAAC;;IAED;IACA;IACAsD,MAAM,CAACC,IAAI,CAACiD,YAAY,CAAC,CAACC,OAAO,CAACC,GAAG,IAAIF,YAAY,CAACE,GAAG,CAAC,KAAK9E,SAAS,IAAI,OAAO4E,YAAY,CAACE,GAAG,CAAC,CAAC;IAErG,OAAOxJ,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAC7BiK,gBAAgB,CACf;MAAClI,aAAa,EAAEiG;IAAK,CAAC,EACtB;MAACkB,IAAI,EAAEY;IAAY,CAAC,EACpB;MAAC/D,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAChD,CAAC;EACL;EAEA,SAAS1I,iBAAiBA,CAAC;IAACO,aAAa;IAAEG,SAAS;IAAEa;EAAc,CAAC,EAAE;IAErE;IACA9C,MAAM,CAAC2D,IAAI,CAAE,uCAAsC1B,SAAU,KAAIa,cAAe,SAAQhB,aAAc,EAAC,CAAC;IACxG,MAAMoI,kBAAkB,GAAG,IAAAlC,sBAAQ,EAAClG,aAAa,CAAC;IAClD,MAAMqI,mBAAmB,GAAG,IAAAnC,sBAAQ,EAAClF,cAAc,CAAC;IAEpD,IAAI,EAAEb,SAAS,IAAImI,qBAAU,CAAC,EAAE;MAC9B,MAAM,IAAIxG,qBAAQ,CAAC,KAAK,EAAE,wCAAwC,CAAC;IACrE;IAEA,IAAI,EAAEuG,mBAAmB,IAAInH,2BAAgB,CAAC,EAAE;MAC9C,MAAM,IAAIY,qBAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAC;IACvD;IAEA,MAAMyG,WAAW,GAAGpI,SAAS,KAAKmI,qBAAU,CAACrH,MAAM,GAAG;MAAC,uBAAuB,EAAEoH;IAAmB,CAAC,GAAG;MAAC,uBAAuB,EAAEA;IAAmB,CAAC;IACrJ,OAAO5J,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACiK,gBAAgB,CAAC;MAChDlI,aAAa,EAAEoI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJ,GAAGoB,WAAW;QACd9G,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAACyD,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;EACrD;EAEA,eAAevI,YAAYA,CAAC;IAACI,aAAa;IAAEG;EAAS,CAAC,EAAE;IACtD,MAAMqI,YAAY,GAAGrI,SAAS;IAC9B,MAAM;MAACA,SAAS,EAAEsI;IAAY,CAAC,GAAG,MAAMhK,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;MAACrF;IAAa,CAAC,CAAC;IAC1F9B,MAAM,CAAC2D,IAAI,CAAE,qCAAoC4G,YAAa,OAAMD,YAAa,QAAOxI,aAAc,OAAM/B,UAAW,EAAC,CAAC;IACzH,MAAMmK,kBAAkB,GAAG,IAAAlC,sBAAQ,EAAClG,aAAa,CAAC;IAClD,MAAM0I,iBAAiB,GAAG,IAAAxC,sBAAQ,EAACsC,YAAY,CAAC;IAEhD,MAAM9G,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACiK,gBAAgB,CAAC;MAC9DlI,aAAa,EAAEoI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJhH,SAAS,EAAEuI,iBAAiB;QAC5BjH,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAACyD,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnD,OAAOzG,MAAM,CAACiH,EAAE;IAChB;EACF;;EAEA,eAAe9I,aAAaA,CAAC;IAACG,aAAa;IAAE4I,YAAY;IAAEC,eAAe,GAAG1F;EAAS,CAAC,EAAE;IACvF,MAAMiF,kBAAkB,GAAG,IAAAlC,sBAAQ,EAAClG,aAAa,CAAC;IAElD,MAAM8I,SAAS,GAAG,MAAMrK,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoH,OAAO,CAAC;MAACrF,aAAa,EAAEoI;IAAkB,CAAC,CAAC;IAC9FlK,MAAM,CAACmG,KAAK,CAAE,yBAAwBX,IAAI,CAACC,SAAS,CAACmF,SAAS,CAAE,EAAC,CAAC;IAElE,MAAMC,aAAa,GAAGD,SAAS,CAACrI,UAAU;IAE1CvC,MAAM,CAAC2D,IAAI,CAAE,sCAAqC6B,IAAI,CAACC,SAAS,CAACoF,aAAa,CAAE,cAAaH,YAAa,iBAAgBC,eAAgB,QAAO7I,aAAc,OAAM/B,UAAW,EAAC,CAAC;IAElL,MAAM+K,qBAAqB,GAAGD,aAAa,CAAChE,MAAM,CAAC5E,SAAS,IAAIA,SAAS,KAAK0I,eAAe,CAAC;IAC9F,MAAMI,2BAA2B,GAAGD,qBAAqB,CAACrD,QAAQ,CAACiD,YAAY,CAAC,GAAGI,qBAAqB,GAAG,CAAC,GAAGA,qBAAqB,EAAEJ,YAAY,CAAC;IAEnJ1K,MAAM,CAACmG,KAAK,CAAE,0BAAyB2E,qBAAsB,EAAC,CAAC;IAC/D9K,MAAM,CAACmG,KAAK,CAAE,+BAA8B4E,2BAA4B,EAAC,CAAC;IAE1E,MAAMvH,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACiK,gBAAgB,CAAC;MAC9DlI,aAAa,EAAEoI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJ1G,UAAU,EAAEwI,2BAA2B;QACvCxH,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAACyD,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnD,OAAOzG,MAAM,CAACiH,EAAE;IAChB;EACF;;EAEA,eAAe7I,WAAWA,CAAC;IAACE;EAAa,CAAC,EAAE;IAC1C,MAAMoI,kBAAkB,GAAG,IAAAlC,sBAAQ,EAAClG,aAAa,CAAC;IAElD,MAAM0B,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACiK,gBAAgB,CAAC;MAC9DlI,aAAa,EAAEoI,kBAAkB;MACjCzH,cAAc,EAAEC,2BAAgB,CAACC,SAAS,CAAC4B;IAC7C,CAAC,EAAE;MACDyG,IAAI,EAAE;QACJnI,QAAQ,EAAE;MACZ,CAAC;MACDoG,IAAI,EAAE;QACJ1F,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAACyD,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnDjK,MAAM,CAAC+I,OAAO,CAAE,+BAA8BvD,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAE,EAAC,CAAC;IACvE,OAAOA,MAAM;EACf;EAEA,eAAe3B,WAAWA,CAAC;IAACC,aAAa;IAAEe;EAAQ,CAAC,EAAE;IACpD,MAAMqH,kBAAkB,GAAG,IAAAlC,sBAAQ,EAAClG,aAAa,CAAC;IAClD,MAAMmJ,aAAa,GAAG,IAAAjD,sBAAQ,EAACnF,QAAQ,CAAC;IAExC,MAAMW,MAAM,GAAG,MAAMjD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACiK,gBAAgB,CAAC;MAC9DlI,aAAa,EAAEoI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJpG,QAAQ,EAAEoI,aAAa;QACvB1H,gBAAgB,EAAE,IAAAnB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAACyD,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnDjK,MAAM,CAAC+I,OAAO,CAAE,+BAA8BvD,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAE,EAAC,CAAC;IACvE,OAAOA,MAAM;EACf;AAEF"}
|
package/dist/mongoLog.js
CHANGED
|
@@ -96,14 +96,17 @@ async function _default(MONGO_URI) {
|
|
|
96
96
|
skip = 0,
|
|
97
97
|
...rest
|
|
98
98
|
} = params;
|
|
99
|
+
logger.debug(`Actual query params: ${JSON.stringify(rest)}`);
|
|
99
100
|
const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
|
|
100
101
|
.find(rest).sort({
|
|
101
|
-
|
|
102
|
+
creationTime: 1
|
|
102
103
|
}).skip(parseInt(skip, 10)).limit(parseInt(limit, 10)).toArray();
|
|
103
|
-
logger.debug(`Query result: ${result}`);
|
|
104
|
+
//logger.debug(`Query result: ${result}`);
|
|
104
105
|
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);
|
|
105
106
|
return result;
|
|
106
107
|
}
|
|
108
|
+
|
|
109
|
+
// DEVELOP: queryById returns jsut one (randomish) log! is this useful?
|
|
107
110
|
async function queryById(correlationIdString, skip = 0, limit = 1) {
|
|
108
111
|
logger.debug(`QueryById: ${correlationIdString}`);
|
|
109
112
|
const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
|
|
@@ -115,6 +118,9 @@ async function _default(MONGO_URI) {
|
|
|
115
118
|
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);
|
|
116
119
|
return result;
|
|
117
120
|
}
|
|
121
|
+
|
|
122
|
+
// getListOfLogs returns list of correlationIds that have logs of given logItemType
|
|
123
|
+
// if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG
|
|
118
124
|
async function getListOfLogs(logItemType = 'MERGE_LOG') {
|
|
119
125
|
checkLogItemType(logItemType, false, false);
|
|
120
126
|
const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
|
|
@@ -127,8 +133,10 @@ async function _default(MONGO_URI) {
|
|
|
127
133
|
payload: result.length > 0 ? result : 'No logs found'
|
|
128
134
|
};
|
|
129
135
|
}
|
|
130
|
-
|
|
131
|
-
|
|
136
|
+
|
|
137
|
+
// getExpandedListOfLogs returns groped MERGE_LOGs and MATCH_LOGs
|
|
138
|
+
async function getExpandedListOfLogs() {
|
|
139
|
+
//checkLogItemType(logItemType, false, false);
|
|
132
140
|
logger.debug(`Getting expanded list of logs`);
|
|
133
141
|
const pipeline = [
|
|
134
142
|
// currently return only MERGE_LOG and MATCH_LOG
|
|
@@ -153,7 +161,6 @@ async function _default(MONGO_URI) {
|
|
|
153
161
|
'creationTime': {
|
|
154
162
|
'$first': '$creationTime'
|
|
155
163
|
},
|
|
156
|
-
// We don't currently have cataloger in logs, this will always be null
|
|
157
164
|
'cataloger': {
|
|
158
165
|
'$first': '$cataloger'
|
|
159
166
|
},
|
package/dist/mongoLog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongoLog.js","names":["MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","getExpandedListOfLogs","protect","remove","removeBySequences","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","errorMessage","payload","message","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","silly","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","force","clean","$ne","deleteMany","deletedCount","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n checkLogItemType(params.logItemType, false, false);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function getExpandedListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n {'$match': {'logItemType': {'$in': ['MERGE_LOG', 'MATCH_LOG']}}},\n {'$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}},\n {'$group':\n {'_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n // We don't currently have cataloger in logs, this will always be null\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}}}\n ];\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return {status: fixedResult.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: fixedResult.length > 0 ? fixedResult : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":";;;;;;AA4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAA0C;AAnC1C;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;;AAWe,wBAAgBA,SAAS,EAAE;EACxC,MAAMC,MAAM,GAAG,IAAAC,mCAAY,GAAE;;EAE7B;EACA,MAAMC,MAAM,GAAG,MAAMC,oBAAW,CAACC,OAAO,CAACL,SAAS,EAAE;IAACM,eAAe,EAAE,IAAI;IAAEC,kBAAkB,EAAE;EAAI,CAAC,CAAC;EACtG,MAAMC,EAAE,GAAGL,MAAM,CAACK,EAAE,CAAC,UAAU,CAAC;EAChC,MAAMC,UAAU,GAAG,MAAM;EACzB,OAAO;IAACC,UAAU;IAAEC,KAAK;IAAEC,SAAS;IAAEC,aAAa;IAAEC,qBAAqB;IAAEC,OAAO;IAAEC,MAAM;IAAEC;EAAiB,CAAC;EAE/G,eAAeP,UAAU,CAACQ,OAAO,EAAE;IACjC,MAAMC,IAAI,GAAG,IAAAC,eAAM,GAAE,CAACC,MAAM,EAAE;IAC9B,MAAMC,UAAU,GAAG;MACjB,GAAGJ,OAAO;MACVK,YAAY,EAAEJ,IAAI;MAClBK,SAAS,EAAE;IACb,CAAC;IACD,IAAI;MACFC,gBAAgB,CAACP,OAAO,CAACQ,WAAW,EAAE,KAAK,CAAC;MAC5C,MAAMC,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACmB,SAAS,CAACN,UAAU,CAAC;MACpE,IAAIK,MAAM,CAACE,YAAY,EAAE;QACvB,MAAM;UAACC,YAAY;UAAEC,iBAAiB;UAAEC;QAAe,CAAC,GAAGd,OAAO;QAClE,MAAMe,UAAU,GAAGF,iBAAiB,IAAIC,eAAe,GAAI,GAAED,iBAAkB,MAAKC,eAAgB,EAAC,GAAI,GAAEF,YAAa,EAAC;QACzH7B,MAAM,CAACiC,IAAI,CAAE,WAAUhB,OAAO,CAACQ,WAAY,cAAaR,OAAO,CAACiB,aAAc,sBAAqBF,UAAW,OAAM,CAAC;QACrH;MACF;MACA,MAAM,IAAIG,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,CAAC;IACtD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,eAAe7B,KAAK,CAACiC,MAAM,EAAE;IAC3B3C,MAAM,CAAC4C,KAAK,CAAE,iBAAgBC,IAAI,CAACC,SAAS,CAACH,MAAM,CAAE,EAAC,CAAC;IACvDnB,gBAAgB,CAACmB,MAAM,CAAClB,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;IAClD,MAAM;MAACsB,KAAK,GAAG,CAAC;MAAEC,IAAI,GAAG,CAAC;MAAE,GAAGC;IAAI,CAAC,GAAGN,MAAM;IAC7C,MAAMjB,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5C0C,IAAI,CAACD,IAAI,CAAC,CACVE,IAAI,CAAC;MAACtB,YAAY,EAAE;IAAC,CAAC,CAAC,CACvBmB,IAAI,CAACI,QAAQ,CAACJ,IAAI,EAAE,EAAE,CAAC,CAAC,CACxBD,KAAK,CAACK,QAAQ,CAACL,KAAK,EAAE,EAAE,CAAC,CAAC,CAC1BM,OAAO,EAAE;IACZrD,MAAM,CAAC4C,KAAK,CAAE,iBAAgBlB,MAAO,EAAC,CAAC;IACvC1B,MAAM,CAAC4C,KAAK,CAAE,iBAAgBlB,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAI,SAAQ5B,MAAM,CAAC4B,MAAO,sBAAqBN,IAAK,WAAUD,KAAM,GAAE,GAAG,YAAa,EAAC,CAAC;IACvI,OAAOrB,MAAM;EACf;EAEA,eAAef,SAAS,CAAC4C,mBAAmB,EAAEP,IAAI,GAAG,CAAC,EAAED,KAAK,GAAG,CAAC,EAAE;IACjE/C,MAAM,CAAC4C,KAAK,CAAE,cAAaW,mBAAoB,EAAC,CAAC;IACjD,MAAM7B,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5C0C,IAAI,CAAC;MAAChB,aAAa,EAAEqB;IAAmB,CAAC,CAAC,CAC1CJ,IAAI,CAAC;MAACtB,YAAY,EAAE;IAAC,CAAC,CAAC,CACvBmB,IAAI,CAACI,QAAQ,CAACJ,IAAI,EAAE,EAAE,CAAC,CAAC,CACxBD,KAAK,CAACK,QAAQ,CAACL,KAAK,EAAE,EAAE,CAAC,CAAC,CAC1BM,OAAO,EAAE;IACZrD,MAAM,CAAC4C,KAAK,CAAE,iBAAgBlB,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAI,SAAQ5B,MAAM,CAAC4B,MAAO,aAAY,GAAG,YAAa,EAAC,CAAC;IACvG,OAAO5B,MAAM;EACf;EAEA,eAAed,aAAa,CAACa,WAAW,GAAG,WAAW,EAAE;IACtDD,gBAAgB,CAACC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;IAC3C,MAAMC,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5CgD,QAAQ,CAAC,eAAe,EAAE;MAAC/B;IAAW,CAAC,CAAC;IAC3CzB,MAAM,CAAC4C,KAAK,CAAE,iBAAgBlB,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAI,SAAQ5B,MAAM,CAAC4B,MAAO,aAAY,GAAG,YAAa,EAAC,CAAC;IACvG,OAAO;MAACG,MAAM,EAAE/B,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAGlB,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;MAAEnB,OAAO,EAAEd,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAG5B,MAAM,GAAG;IAAe,CAAC;EAClI;EAEA,eAAeb,qBAAqB,CAACY,WAAW,GAAG,WAAW,EAAE;IAC9DD,gBAAgB,CAACC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;IAC3CzB,MAAM,CAAC4C,KAAK,CAAE,+BAA8B,CAAC;IAC7C,MAAMgB,QAAQ,GAAG;IACf;IACA;MAAC,QAAQ,EAAE;QAAC,aAAa,EAAE;UAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW;QAAC;MAAC;IAAC,CAAC,EAChE;MAAC,OAAO,EACN;QAAC,eAAe,EAAE,CAAC;QAAE,aAAa,EAAE,CAAC;QAAE,cAAc,EAAE;MAAC;IAAC,CAAC,EAC5D;MAAC,QAAQ,EACP;QAAC,KAAK,EAAE;UAAC,eAAe,EAAE,gBAAgB;UAAE,aAAa,EAAE;QAAc,CAAC;QACxE,cAAc,EAAE;UAAC,QAAQ,EAAE;QAAe,CAAC;QAC3C;QACA,WAAW,EAAE;UAAC,QAAQ,EAAE;QAAY,CAAC;QACrC,UAAU,EAAE;UAAC,MAAM,EAAE;QAAC;MAAC;IAAC,CAAC,CAC9B;IAED,MAAMlC,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5CqD,SAAS,CAACD,QAAQ,CAAC,CACnBP,OAAO,EAAE;IAEZ,MAAMS,WAAW,GAAGpC,MAAM,CAACqC,GAAG,CAAEC,UAAU,IAAK;MAC7C,MAAM;QAAC9B,aAAa;QAAET;MAAW,CAAC,GAAGuC,UAAU,CAACC,GAAG;MACnD,MAAM;QAACC,SAAS;QAAE5C,YAAY;QAAE6C;MAAQ,CAAC,GAAGH,UAAU;MACtD,OAAO;QAAC9B,aAAa;QAAET,WAAW;QAAEyC,SAAS;QAAE5C,YAAY;QAAE6C;MAAQ,CAAC;IACxE,CAAC,CAAC;IAEFnE,MAAM,CAACoE,KAAK,CAAE,iBAAgBvB,IAAI,CAACC,SAAS,CAACpB,MAAM,CAAE,EAAC,CAAC;IACvD1B,MAAM,CAACoE,KAAK,CAAE,iBAAgBvB,IAAI,CAACC,SAAS,CAACgB,WAAW,CAAE,EAAC,CAAC;IAE5D9D,MAAM,CAAC4C,KAAK,CAAE,iBAAgBkB,WAAW,CAACR,MAAM,GAAG,CAAC,GAAI,SAAQQ,WAAW,CAACR,MAAO,aAAY,GAAG,YAAa,EAAC,CAAC;IACjH,OAAO;MAACG,MAAM,EAAEK,WAAW,CAACR,MAAM,GAAG,CAAC,GAAGlB,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;MAAEnB,OAAO,EAAEsB,WAAW,CAACR,MAAM,GAAG,CAAC,GAAGQ,WAAW,GAAG;IAAe,CAAC;EACjJ;EAEA,eAAehD,OAAO,CAACoB,aAAa,EAAEL,YAAY,EAAE;IAClD7B,MAAM,CAACiC,IAAI,CAAE,wBAAuBzB,UAAW,oBAAmB0B,aAAc,mBAAkBL,YAAa,EAAC,CAAC;IACjH,MAAMwC,kBAAkB,GAAG,IAAAC,sBAAQ,EAACpC,aAAa,CAAC;IAClD,MAAMqC,iBAAiB,GAAG,IAAAD,sBAAQ,EAACzC,YAAY,CAAC;IAChD,MAAM2C,MAAM,GAAG3C,YAAY,GAAG;MAACK,aAAa,EAAEmC,kBAAkB;MAAExC,YAAY,EAAEuB,QAAQ,CAACmB,iBAAiB,EAAE,EAAE;IAAC,CAAC,GAAG;MAACrC,aAAa,EAAEmC;IAAkB,CAAC;IAEtJ,IAAI;MACF,MAAM3C,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACiE,UAAU,CACvDD,MAAM,EACN,CACE;QACEE,IAAI,EAAE;UACJC,gBAAgB,EAAE,IAAAxD,eAAM,GAAE,CAACC,MAAM,EAAE;UACnCG,SAAS,EAAE;YAACqD,IAAI,EAAE;UAAY;QAChC;MACF,CAAC,CACF,CACF;MACD,OAAO;QAACnB,MAAM,EAAE/B,MAAM,CAACmD,aAAa,GAAG,CAAC,GAAGzC,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;QAAEnB,OAAO,EAAEd,MAAM,CAACmD,aAAa,GAAG,CAAC,GAAGnD,MAAM,GAAG;MAAe,CAAC;IAChJ,CAAC,CAAC,OAAOY,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,eAAexB,MAAM,CAACmB,aAAa,EAAE4C,KAAK,GAAG,KAAK,EAAE;IAClD9E,MAAM,CAACiC,IAAI,CAAE,wBAAuBzB,UAAW,oBAAmB0B,aAAc,EAAC,CAAC;IAClF,MAAM6C,KAAK,GAAG,IAAAT,sBAAQ,EAACpC,aAAa,CAAC;IACrC,MAAMsC,MAAM,GAAGM,KAAK,GAAG;MAAC5C,aAAa,EAAE6C;IAAK,CAAC,GAAG;MAAC7C,aAAa,EAAE6C,KAAK;MAAExD,SAAS,EAAE;QAACyD,GAAG,EAAE;MAAI;IAAC,CAAC;IAE9F,IAAI;MACF,MAAMtD,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACyE,UAAU,CAACT,MAAM,CAAC;MACjE,OAAO;QAACf,MAAM,EAAE/B,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAG9C,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;QAAEnB,OAAO,EAAEd,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAGxD,MAAM,GAAG;MAAe,CAAC;IAC9I,CAAC,CAAC,OAAOY,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,eAAevB,iBAAiB,CAACkB,aAAa,EAAEiD,SAAS,GAAG,EAAE,EAAEL,KAAK,GAAG,KAAK,EAAE;IAC7E9E,MAAM,CAACiC,IAAI,CAAE,wBAAuBzB,UAAW,oBAAmB0B,aAAc,gBAAeiD,SAAS,CAAC7B,MAAO,EAAC,CAAC;IAClH,MAAMyB,KAAK,GAAG,IAAAT,sBAAQ,EAACpC,aAAa,CAAC;IACrC;IACA;IACA,MAAMkD,cAAc,GAAGD,SAAS,CAACX,MAAM,CAACa,QAAQ,IAAIC,MAAM,CAACC,SAAS,CAACD,MAAM,CAACD,QAAQ,CAAC,CAAC,IAAIA,QAAQ,GAAG,CAAC,CAAC;IAEvG,IAAIF,SAAS,CAAC7B,MAAM,KAAK8B,cAAc,CAAC9B,MAAM,EAAE;MAC9C,MAAM,IAAInB,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,+EAA8E,CAAC;IACvI;IAEA,MAAMmC,MAAM,GAAGM,KAAK,GAAG;MAAC5C,aAAa,EAAE6C,KAAK;MAAElD,YAAY,EAAE;QAAC2D,GAAG,EAAEJ;MAAc;IAAC,CAAC,GAAG;MAAClD,aAAa,EAAE6C,KAAK;MAAElD,YAAY,EAAE;QAAC2D,GAAG,EAAEL;MAAS,CAAC;MAAE5D,SAAS,EAAE;QAACyD,GAAG,EAAE;MAAI;IAAC,CAAC;IAEnK,IAAI;MACF,MAAMtD,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACyE,UAAU,CAACT,MAAM,CAAC;MACjE,OAAO;QAACf,MAAM,EAAE/B,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAG9C,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;QAAEnB,OAAO,EAAEd,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAGxD,MAAM,GAAG;MAAe,CAAC;IAC9I,CAAC,CAAC,OAAOY,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,SAASf,gBAAgB,CAACC,WAAW,EAAEgE,YAAY,GAAG,KAAK,EAAEC,gBAAgB,GAAG,KAAK,EAAE;IAErF,IAAIjE,WAAW,EAAE;MACf,MAAMkE,kBAAkB,GAAGC,MAAM,CAACC,MAAM,CAACC,wBAAa,CAAC,CAACC,OAAO,CAACtE,WAAW,CAAC,GAAG,CAAC,CAAC;MACjF,IAAIkE,kBAAkB,EAAE;QACtB,OAAO3F,MAAM,CAAC4C,KAAK,CAAE,sBAAqBnB,WAAY,EAAC,CAAC;MAC1D;MACA,IAAIgE,YAAY,EAAE;QAChB,MAAM,IAAItD,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,wBAAuBZ,WAAY,EAAC,CAAC;MAC7F;MACA,OAAOzB,MAAM,CAAC4C,KAAK,CAAE,kCAAiCnB,WAAY,EAAC,CAAC;IACtE;IAEA,IAAIiE,gBAAgB,EAAE;MACpB,MAAM,IAAIvD,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,mBAAkBZ,WAAY,EAAC,CAAC;IACxF;IACA,OAAOzB,MAAM,CAAC4C,KAAK,CAAE,mBAAkBnB,WAAY,EAAC,CAAC;EACvD;AACF"}
|
|
1
|
+
{"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","obj","__esModule","default","_default","MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","getExpandedListOfLogs","protect","remove","removeBySequences","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","errorMessage","payload","message","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","silly","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","force","clean","$ne","deleteMany","deletedCount","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n checkLogItemType(params.logItemType, false, false);\n const {limit = 5, skip = 0, ...rest} = params;\n logger.debug(`Actual query params: ${JSON.stringify(rest)}`);\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 async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n // 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 async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n // getExpandedListOfLogs returns groped MERGE_LOGs and MATCH_LOGs\n async function getExpandedListOfLogs() {\n //checkLogItemType(logItemType, false, false);\n logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n {'$match': {'logItemType': {'$in': ['MERGE_LOG', 'MATCH_LOG']}}},\n {'$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}},\n {'$group':\n {'_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}}}\n ];\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return {status: fixedResult.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: fixedResult.length > 0 ? fixedResult : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":";;;;;;AA4BA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAC,sBAAA,CAAAL,OAAA;AACA,IAAAM,WAAA,GAAAD,sBAAA,CAAAL,OAAA;AACA,IAAAO,cAAA,GAAAF,sBAAA,CAAAL,OAAA;AACA,IAAAQ,UAAA,GAAAR,OAAA;AAA0C,SAAAK,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAnC1C;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;;AAWe,eAAAG,SAAgBC,SAAS,EAAE;EACxC,MAAMC,MAAM,GAAG,IAAAC,mCAAY,EAAC,CAAC;;EAE7B;EACA,MAAMC,MAAM,GAAG,MAAMC,oBAAW,CAACC,OAAO,CAACL,SAAS,EAAE;IAACM,eAAe,EAAE,IAAI;IAAEC,kBAAkB,EAAE;EAAI,CAAC,CAAC;EACtG,MAAMC,EAAE,GAAGL,MAAM,CAACK,EAAE,CAAC,UAAU,CAAC;EAChC,MAAMC,UAAU,GAAG,MAAM;EACzB,OAAO;IAACC,UAAU;IAAEC,KAAK;IAAEC,SAAS;IAAEC,aAAa;IAAEC,qBAAqB;IAAEC,OAAO;IAAEC,MAAM;IAAEC;EAAiB,CAAC;EAE/G,eAAeP,UAAUA,CAACQ,OAAO,EAAE;IACjC,MAAMC,IAAI,GAAG,IAAAC,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC,CAAC;IAC9B,MAAMC,UAAU,GAAG;MACjB,GAAGJ,OAAO;MACVK,YAAY,EAAEJ,IAAI;MAClBK,SAAS,EAAE;IACb,CAAC;IACD,IAAI;MACFC,gBAAgB,CAACP,OAAO,CAACQ,WAAW,EAAE,KAAK,CAAC;MAC5C,MAAMC,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACmB,SAAS,CAACN,UAAU,CAAC;MACpE,IAAIK,MAAM,CAACE,YAAY,EAAE;QACvB,MAAM;UAACC,YAAY;UAAEC,iBAAiB;UAAEC;QAAe,CAAC,GAAGd,OAAO;QAClE,MAAMe,UAAU,GAAGF,iBAAiB,IAAIC,eAAe,GAAI,GAAED,iBAAkB,MAAKC,eAAgB,EAAC,GAAI,GAAEF,YAAa,EAAC;QACzH7B,MAAM,CAACiC,IAAI,CAAE,WAAUhB,OAAO,CAACQ,WAAY,cAAaR,OAAO,CAACiB,aAAc,sBAAqBF,UAAW,OAAM,CAAC;QACrH;MACF;MACA,MAAM,IAAIG,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,CAAC;IACtD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,eAAe7B,KAAKA,CAACiC,MAAM,EAAE;IAC3B3C,MAAM,CAAC4C,KAAK,CAAE,iBAAgBC,IAAI,CAACC,SAAS,CAACH,MAAM,CAAE,EAAC,CAAC;IACvDnB,gBAAgB,CAACmB,MAAM,CAAClB,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;IAClD,MAAM;MAACsB,KAAK,GAAG,CAAC;MAAEC,IAAI,GAAG,CAAC;MAAE,GAAGC;IAAI,CAAC,GAAGN,MAAM;IAC7C3C,MAAM,CAAC4C,KAAK,CAAE,wBAAuBC,IAAI,CAACC,SAAS,CAACG,IAAI,CAAE,EAAC,CAAC;IAC5D,MAAMvB,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5C0C,IAAI,CAACD,IAAI,CAAC,CACVE,IAAI,CAAC;MAAC7B,YAAY,EAAE;IAAC,CAAC,CAAC,CACvB0B,IAAI,CAACI,QAAQ,CAACJ,IAAI,EAAE,EAAE,CAAC,CAAC,CACxBD,KAAK,CAACK,QAAQ,CAACL,KAAK,EAAE,EAAE,CAAC,CAAC,CAC1BM,OAAO,CAAC,CAAC;IACZ;IACArD,MAAM,CAAC4C,KAAK,CAAE,iBAAgBlB,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAI,SAAQ5B,MAAM,CAAC4B,MAAO,sBAAqBN,IAAK,WAAUD,KAAM,GAAE,GAAG,YAAa,EAAC,CAAC;IACvI,OAAOrB,MAAM;EACf;;EAEA;EACA,eAAef,SAASA,CAAC4C,mBAAmB,EAAEP,IAAI,GAAG,CAAC,EAAED,KAAK,GAAG,CAAC,EAAE;IACjE/C,MAAM,CAAC4C,KAAK,CAAE,cAAaW,mBAAoB,EAAC,CAAC;IACjD,MAAM7B,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5C0C,IAAI,CAAC;MAAChB,aAAa,EAAEqB;IAAmB,CAAC,CAAC,CAC1CJ,IAAI,CAAC;MAACtB,YAAY,EAAE;IAAC,CAAC,CAAC,CACvBmB,IAAI,CAACI,QAAQ,CAACJ,IAAI,EAAE,EAAE,CAAC,CAAC,CACxBD,KAAK,CAACK,QAAQ,CAACL,KAAK,EAAE,EAAE,CAAC,CAAC,CAC1BM,OAAO,CAAC,CAAC;IACZrD,MAAM,CAAC4C,KAAK,CAAE,iBAAgBlB,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAI,SAAQ5B,MAAM,CAAC4B,MAAO,aAAY,GAAG,YAAa,EAAC,CAAC;IACvG,OAAO5B,MAAM;EACf;;EAEA;EACA;EACA,eAAed,aAAaA,CAACa,WAAW,GAAG,WAAW,EAAE;IACtDD,gBAAgB,CAACC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;IAC3C,MAAMC,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5CgD,QAAQ,CAAC,eAAe,EAAE;MAAC/B;IAAW,CAAC,CAAC;IAC3CzB,MAAM,CAAC4C,KAAK,CAAE,iBAAgBlB,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAI,SAAQ5B,MAAM,CAAC4B,MAAO,aAAY,GAAG,YAAa,EAAC,CAAC;IACvG,OAAO;MAACG,MAAM,EAAE/B,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAGlB,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;MAAEnB,OAAO,EAAEd,MAAM,CAAC4B,MAAM,GAAG,CAAC,GAAG5B,MAAM,GAAG;IAAe,CAAC;EAClI;;EAEA;EACA,eAAeb,qBAAqBA,CAAA,EAAG;IACrC;IACAb,MAAM,CAAC4C,KAAK,CAAE,+BAA8B,CAAC;IAC7C,MAAMgB,QAAQ,GAAG;IACf;IACA;MAAC,QAAQ,EAAE;QAAC,aAAa,EAAE;UAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW;QAAC;MAAC;IAAC,CAAC,EAChE;MAAC,OAAO,EACN;QAAC,eAAe,EAAE,CAAC;QAAE,aAAa,EAAE,CAAC;QAAE,cAAc,EAAE;MAAC;IAAC,CAAC,EAC5D;MAAC,QAAQ,EACP;QAAC,KAAK,EAAE;UAAC,eAAe,EAAE,gBAAgB;UAAE,aAAa,EAAE;QAAc,CAAC;QACxE,cAAc,EAAE;UAAC,QAAQ,EAAE;QAAe,CAAC;QAC3C,WAAW,EAAE;UAAC,QAAQ,EAAE;QAAY,CAAC;QACrC,UAAU,EAAE;UAAC,MAAM,EAAE;QAAC;MAAC;IAAC,CAAC,CAC9B;IAED,MAAMlC,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAAC;IAAA,CAC5CqD,SAAS,CAACD,QAAQ,CAAC,CACnBP,OAAO,CAAC,CAAC;IAEZ,MAAMS,WAAW,GAAGpC,MAAM,CAACqC,GAAG,CAAEC,UAAU,IAAK;MAC7C,MAAM;QAAC9B,aAAa;QAAET;MAAW,CAAC,GAAGuC,UAAU,CAACC,GAAG;MACnD,MAAM;QAACC,SAAS;QAAE5C,YAAY;QAAE6C;MAAQ,CAAC,GAAGH,UAAU;MACtD,OAAO;QAAC9B,aAAa;QAAET,WAAW;QAAEyC,SAAS;QAAE5C,YAAY;QAAE6C;MAAQ,CAAC;IACxE,CAAC,CAAC;IAEFnE,MAAM,CAACoE,KAAK,CAAE,iBAAgBvB,IAAI,CAACC,SAAS,CAACpB,MAAM,CAAE,EAAC,CAAC;IACvD1B,MAAM,CAACoE,KAAK,CAAE,iBAAgBvB,IAAI,CAACC,SAAS,CAACgB,WAAW,CAAE,EAAC,CAAC;IAE5D9D,MAAM,CAAC4C,KAAK,CAAE,iBAAgBkB,WAAW,CAACR,MAAM,GAAG,CAAC,GAAI,SAAQQ,WAAW,CAACR,MAAO,aAAY,GAAG,YAAa,EAAC,CAAC;IACjH,OAAO;MAACG,MAAM,EAAEK,WAAW,CAACR,MAAM,GAAG,CAAC,GAAGlB,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;MAAEnB,OAAO,EAAEsB,WAAW,CAACR,MAAM,GAAG,CAAC,GAAGQ,WAAW,GAAG;IAAe,CAAC;EACjJ;EAEA,eAAehD,OAAOA,CAACoB,aAAa,EAAEL,YAAY,EAAE;IAClD7B,MAAM,CAACiC,IAAI,CAAE,wBAAuBzB,UAAW,oBAAmB0B,aAAc,mBAAkBL,YAAa,EAAC,CAAC;IACjH,MAAMwC,kBAAkB,GAAG,IAAAC,sBAAQ,EAACpC,aAAa,CAAC;IAClD,MAAMqC,iBAAiB,GAAG,IAAAD,sBAAQ,EAACzC,YAAY,CAAC;IAChD,MAAM2C,MAAM,GAAG3C,YAAY,GAAG;MAACK,aAAa,EAAEmC,kBAAkB;MAAExC,YAAY,EAAEuB,QAAQ,CAACmB,iBAAiB,EAAE,EAAE;IAAC,CAAC,GAAG;MAACrC,aAAa,EAAEmC;IAAkB,CAAC;IAEtJ,IAAI;MACF,MAAM3C,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACiE,UAAU,CACvDD,MAAM,EACN,CACE;QACEE,IAAI,EAAE;UACJC,gBAAgB,EAAE,IAAAxD,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC,CAAC;UACnCG,SAAS,EAAE;YAACqD,IAAI,EAAE;UAAY;QAChC;MACF,CAAC,CAEL,CAAC;MACD,OAAO;QAACnB,MAAM,EAAE/B,MAAM,CAACmD,aAAa,GAAG,CAAC,GAAGzC,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;QAAEnB,OAAO,EAAEd,MAAM,CAACmD,aAAa,GAAG,CAAC,GAAGnD,MAAM,GAAG;MAAe,CAAC;IAChJ,CAAC,CAAC,OAAOY,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,eAAexB,MAAMA,CAACmB,aAAa,EAAE4C,KAAK,GAAG,KAAK,EAAE;IAClD9E,MAAM,CAACiC,IAAI,CAAE,wBAAuBzB,UAAW,oBAAmB0B,aAAc,EAAC,CAAC;IAClF,MAAM6C,KAAK,GAAG,IAAAT,sBAAQ,EAACpC,aAAa,CAAC;IACrC,MAAMsC,MAAM,GAAGM,KAAK,GAAG;MAAC5C,aAAa,EAAE6C;IAAK,CAAC,GAAG;MAAC7C,aAAa,EAAE6C,KAAK;MAAExD,SAAS,EAAE;QAACyD,GAAG,EAAE;MAAI;IAAC,CAAC;IAE9F,IAAI;MACF,MAAMtD,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACyE,UAAU,CAACT,MAAM,CAAC;MACjE,OAAO;QAACf,MAAM,EAAE/B,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAG9C,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;QAAEnB,OAAO,EAAEd,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAGxD,MAAM,GAAG;MAAe,CAAC;IAC9I,CAAC,CAAC,OAAOY,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,eAAevB,iBAAiBA,CAACkB,aAAa,EAAEiD,SAAS,GAAG,EAAE,EAAEL,KAAK,GAAG,KAAK,EAAE;IAC7E9E,MAAM,CAACiC,IAAI,CAAE,wBAAuBzB,UAAW,oBAAmB0B,aAAc,gBAAeiD,SAAS,CAAC7B,MAAO,EAAC,CAAC;IAClH,MAAMyB,KAAK,GAAG,IAAAT,sBAAQ,EAACpC,aAAa,CAAC;IACrC;IACA;IACA,MAAMkD,cAAc,GAAGD,SAAS,CAACX,MAAM,CAACa,QAAQ,IAAIC,MAAM,CAACC,SAAS,CAACD,MAAM,CAACD,QAAQ,CAAC,CAAC,IAAIA,QAAQ,GAAG,CAAC,CAAC;IAEvG,IAAIF,SAAS,CAAC7B,MAAM,KAAK8B,cAAc,CAAC9B,MAAM,EAAE;MAC9C,MAAM,IAAInB,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,+EAA8E,CAAC;IACvI;IAEA,MAAMmC,MAAM,GAAGM,KAAK,GAAG;MAAC5C,aAAa,EAAE6C,KAAK;MAAElD,YAAY,EAAE;QAAC2D,GAAG,EAAEJ;MAAc;IAAC,CAAC,GAAG;MAAClD,aAAa,EAAE6C,KAAK;MAAElD,YAAY,EAAE;QAAC2D,GAAG,EAAEL;MAAS,CAAC;MAAE5D,SAAS,EAAE;QAACyD,GAAG,EAAE;MAAI;IAAC,CAAC;IAEnK,IAAI;MACF,MAAMtD,MAAM,GAAG,MAAMnB,EAAE,CAACC,UAAU,CAACA,UAAU,CAAC,CAACyE,UAAU,CAACT,MAAM,CAAC;MACjE,OAAO;QAACf,MAAM,EAAE/B,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAG9C,mBAAU,CAACsB,EAAE,GAAGtB,mBAAU,CAACuB,SAAS;QAAEnB,OAAO,EAAEd,MAAM,CAACwD,YAAY,GAAG,CAAC,GAAGxD,MAAM,GAAG;MAAe,CAAC;IAC9I,CAAC,CAAC,OAAOY,KAAK,EAAE;MACd,MAAMC,YAAY,GAAGD,KAAK,CAACE,OAAO,IAAIF,KAAK,CAACG,OAAO,IAAI,EAAE;MACzD,IAAAC,eAAQ,EAACJ,KAAK,CAAC;MACf,MAAM,IAAIH,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,kBAAiBE,YAAa,EAAC,CAAC;IACxF;EACF;EAEA,SAASf,gBAAgBA,CAACC,WAAW,EAAEgE,YAAY,GAAG,KAAK,EAAEC,gBAAgB,GAAG,KAAK,EAAE;IAErF,IAAIjE,WAAW,EAAE;MACf,MAAMkE,kBAAkB,GAAGC,MAAM,CAACC,MAAM,CAACC,wBAAa,CAAC,CAACC,OAAO,CAACtE,WAAW,CAAC,GAAG,CAAC,CAAC;MACjF,IAAIkE,kBAAkB,EAAE;QACtB,OAAO3F,MAAM,CAAC4C,KAAK,CAAE,sBAAqBnB,WAAY,EAAC,CAAC;MAC1D;MACA,IAAIgE,YAAY,EAAE;QAChB,MAAM,IAAItD,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,wBAAuBZ,WAAY,EAAC,CAAC;MAC7F;MACA,OAAOzB,MAAM,CAAC4C,KAAK,CAAE,kCAAiCnB,WAAY,EAAC,CAAC;IACtE;IAEA,IAAIiE,gBAAgB,EAAE;MACpB,MAAM,IAAIvD,qBAAQ,CAACC,mBAAU,CAACC,qBAAqB,EAAG,mBAAkBZ,WAAY,EAAC,CAAC;IACxF;IACA,OAAOzB,MAAM,CAAC4C,KAAK,CAAE,mBAAkBnB,WAAY,EAAC,CAAC;EACvD;AACF"}
|
package/dist/utils.js
CHANGED
|
@@ -19,7 +19,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
19
19
|
*
|
|
20
20
|
* Shared modules for microservices of Melinda rest api batch import system
|
|
21
21
|
*
|
|
22
|
-
* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)
|
|
22
|
+
* Copyright (C) 2020-2021, 2023 University Of Helsinki (The National Library Of Finland)
|
|
23
23
|
*
|
|
24
24
|
* This file is part of melinda-rest-api-commons
|
|
25
25
|
*
|
|
@@ -107,6 +107,15 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
107
107
|
message
|
|
108
108
|
};
|
|
109
109
|
}
|
|
110
|
+
|
|
111
|
+
// More detailed SKIPPED statuses
|
|
112
|
+
if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {
|
|
113
|
+
return {
|
|
114
|
+
recordStatus: 'SKIPPED',
|
|
115
|
+
detailedRecordStatus: responseStatus,
|
|
116
|
+
message
|
|
117
|
+
};
|
|
118
|
+
}
|
|
110
119
|
if (['UNKNOWN'].includes(responseStatus)) {
|
|
111
120
|
return {
|
|
112
121
|
recordStatus: 'ERROR',
|
|
@@ -172,12 +181,21 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
172
181
|
message
|
|
173
182
|
};
|
|
174
183
|
}
|
|
184
|
+
if ([_httpStatus.default.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {
|
|
185
|
+
return {
|
|
186
|
+
recordStatus: 'ERROR',
|
|
187
|
+
detailedRecordStatus: 'FORBIDDEN',
|
|
188
|
+
message
|
|
189
|
+
};
|
|
190
|
+
}
|
|
175
191
|
|
|
176
192
|
// Otherwise
|
|
193
|
+
logger.debug(`Unknown responseStatus: ${responseStatus}`);
|
|
194
|
+
const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;
|
|
177
195
|
return {
|
|
178
196
|
recordStatus: 'ERROR',
|
|
179
197
|
detailedRecordStatus: responseStatus,
|
|
180
|
-
message
|
|
198
|
+
message: newMessage
|
|
181
199
|
};
|
|
182
200
|
}
|
|
183
201
|
function getMessageFromResponsePayload(responsePayload) {
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","httpStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\n// eslint-disable-next-line max-statements\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n // Otherwise\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts\nexport async function addRecordResponseItems({recordResponseItems, correlationId, mongoOperator}) {\n if (!Array.isArray(recordResponseItems)) {\n throw new Error('RecordResponseItems is not an array!');\n }\n await mongoOperator.pushMessages({correlationId, messages: recordResponseItems, messageField: 'records'});\n return true;\n}\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["_melindaBackendCommons","require","_melindaCommons","_constants","_httpStatus","_interopRequireDefault","obj","__esModule","default","logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","httpStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","FORBIDDEN","newMessage","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021, 2023 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\n// eslint-disable-next-line max-statements\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n // More detailed SKIPPED statuses\n if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {\n return {recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n 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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"}
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"url": "git@github.com:natlibfi/melinda-rest-api-commons.git"
|
|
15
15
|
},
|
|
16
16
|
"license": "AGPL-3.0+",
|
|
17
|
-
"version": "3.
|
|
17
|
+
"version": "3.4.2-alpha.1",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=18"
|
|
@@ -38,36 +38,36 @@
|
|
|
38
38
|
"build": "babel src --source-maps --copy-files --delete-dir-on-start --out-dir=dist"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@natlibfi/
|
|
42
|
-
"@natlibfi/marc-record": "^
|
|
43
|
-
"@natlibfi/marc-record-
|
|
44
|
-
"@natlibfi/marc-record-
|
|
45
|
-
"@natlibfi/
|
|
46
|
-
"@natlibfi/melinda-
|
|
47
|
-
"
|
|
48
|
-
"amqplib": ">=0.10.3 <1.0.0",
|
|
41
|
+
"@natlibfi/marc-record": "^7.3.1",
|
|
42
|
+
"@natlibfi/marc-record-serializers": "^10.1.1",
|
|
43
|
+
"@natlibfi/marc-record-validate": "^8.0.1",
|
|
44
|
+
"@natlibfi/marc-record-validators-melinda": "^10.13.0",
|
|
45
|
+
"@natlibfi/melinda-backend-commons": "^2.2.1",
|
|
46
|
+
"@natlibfi/melinda-commons": "^13.0.6",
|
|
47
|
+
"amqplib": "^0.10.3",
|
|
49
48
|
"debug": "^4.3.4",
|
|
50
|
-
"http-status": "^1.
|
|
49
|
+
"http-status": "^1.7.0",
|
|
51
50
|
"moment": "^2.29.4",
|
|
52
51
|
"mongo-sanitize": "^1.1.0",
|
|
53
|
-
"mongodb": "^4.
|
|
52
|
+
"mongodb": "^4.17.1"
|
|
54
53
|
},
|
|
55
54
|
"devDependencies": {
|
|
56
|
-
"@babel/cli": "^7.
|
|
57
|
-
"@babel/core": "^7.
|
|
58
|
-
"@babel/eslint-parser": "^7.
|
|
55
|
+
"@babel/cli": "^7.22.15",
|
|
56
|
+
"@babel/core": "^7.22.15",
|
|
57
|
+
"@babel/eslint-parser": "^7.22.15",
|
|
59
58
|
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
|
60
|
-
"@babel/preset-env": "^7.
|
|
61
|
-
"@natlibfi/eslint-config-melinda-backend": "^
|
|
62
|
-
"@natlibfi/
|
|
59
|
+
"@babel/preset-env": "^7.22.15",
|
|
60
|
+
"@natlibfi/eslint-config-melinda-backend": "^3.0.1",
|
|
61
|
+
"@natlibfi/fixugen": "^2.0.1",
|
|
62
|
+
"@natlibfi/fixura": "^3.0.1",
|
|
63
63
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
64
64
|
"babel-plugin-istanbul": "^6.1.1",
|
|
65
65
|
"babel-plugin-rewire": "^1.2.0",
|
|
66
|
-
"chai": "^4.3.
|
|
66
|
+
"chai": "^4.3.8",
|
|
67
67
|
"cross-env": "^7.0.3",
|
|
68
|
-
"eslint": "^8.
|
|
68
|
+
"eslint": "^8.48.0",
|
|
69
69
|
"mocha": "^10.2.0",
|
|
70
|
-
"nodemon": "^
|
|
70
|
+
"nodemon": "^3.0.1",
|
|
71
71
|
"nyc": "^15.1.0"
|
|
72
72
|
},
|
|
73
73
|
"eslintConfig": {
|