@natlibfi/melinda-rest-api-commons 2.3.2-alpha.6 → 2.3.2-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/amqp.js +118 -87
- package/dist/amqp.js.map +1 -1
- package/dist/amqp.spec.js +252 -0
- package/dist/amqp.spec.js.map +1 -0
- package/dist/constants.js +5 -3
- package/dist/constants.js.map +1 -1
- package/dist/helpers/conversion.js +5 -25
- package/dist/helpers/conversion.js.map +1 -1
- package/dist/helpers/conversion.spec.js +1 -7
- package/dist/helpers/conversion.spec.js.map +1 -1
- package/dist/helpers/fix-constants.js +6 -4
- package/dist/helpers/fix-constants.js.map +1 -1
- package/dist/helpers/fix-handle-tempurns.js +19 -27
- package/dist/helpers/fix-handle-tempurns.js.map +1 -1
- package/dist/helpers/fix-strip-f884s.js +12 -16
- package/dist/helpers/fix-strip-f884s.js.map +1 -1
- package/dist/helpers/fix-utils.js +9 -15
- package/dist/helpers/fix-utils.js.map +1 -1
- package/dist/helpers/fix.js +17 -32
- package/dist/helpers/fix.js.map +1 -1
- package/dist/helpers/fix.spec.js +1 -12
- package/dist/helpers/fix.spec.js.map +1 -1
- package/dist/helpers/validation.js +0 -6
- package/dist/helpers/validation.js.map +1 -1
- package/dist/helpers/validation.spec.js +1 -7
- package/dist/helpers/validation.spec.js.map +1 -1
- package/dist/index.js +8 -14
- package/dist/index.js.map +1 -1
- package/dist/mongo.js +38 -87
- package/dist/mongo.js.map +1 -1
- package/dist/mongoLog.js +5 -29
- package/dist/mongoLog.js.map +1 -1
- package/dist/utils.js +33 -35
- package/dist/utils.js.map +1 -1
- package/package.json +5 -4
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","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","message","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":["/**\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 logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\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 logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\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 logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\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 logError(error);\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 logError(error);\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":["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","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","message","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":["/**\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 logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\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 logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\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 logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\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 logError(error);\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 logError(error);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":"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"}
|
package/dist/mongoLog.js
CHANGED
|
@@ -4,25 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = _default;
|
|
7
|
-
|
|
8
7
|
var _mongodb = require("mongodb");
|
|
9
|
-
|
|
10
8
|
var _melindaBackendCommons = require("@natlibfi/melinda-backend-commons");
|
|
11
|
-
|
|
12
9
|
var _melindaCommons = require("@natlibfi/melinda-commons");
|
|
13
|
-
|
|
14
10
|
var _utils = require("./utils.js");
|
|
15
|
-
|
|
16
11
|
var _moment = _interopRequireDefault(require("moment"));
|
|
17
|
-
|
|
18
12
|
var _httpStatus = _interopRequireDefault(require("http-status"));
|
|
19
|
-
|
|
20
13
|
var _mongoSanitize = _interopRequireDefault(require("mongo-sanitize"));
|
|
21
|
-
|
|
22
14
|
var _constants = require("./constants");
|
|
23
|
-
|
|
24
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
-
|
|
26
16
|
/**
|
|
27
17
|
*
|
|
28
18
|
* @licstart The following is the entire license notice for the JavaScript code in this file.
|
|
@@ -50,9 +40,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
50
40
|
* for the JavaScript code in this file.
|
|
51
41
|
*
|
|
52
42
|
*/
|
|
43
|
+
|
|
53
44
|
async function _default(MONGO_URI) {
|
|
54
|
-
const logger = (0, _melindaBackendCommons.createLogger)();
|
|
45
|
+
const logger = (0, _melindaBackendCommons.createLogger)();
|
|
55
46
|
|
|
47
|
+
// Connect to mongo (MONGO)
|
|
56
48
|
const client = await _mongodb.MongoClient.connect(MONGO_URI, {
|
|
57
49
|
useNewUrlParser: true,
|
|
58
50
|
useUnifiedTopology: true
|
|
@@ -67,18 +59,16 @@ async function _default(MONGO_URI) {
|
|
|
67
59
|
protect,
|
|
68
60
|
remove
|
|
69
61
|
};
|
|
70
|
-
|
|
71
62
|
async function addLogItem(logItem) {
|
|
72
63
|
const time = (0, _moment.default)().toDate();
|
|
73
|
-
const newLogItem = {
|
|
64
|
+
const newLogItem = {
|
|
65
|
+
...logItem,
|
|
74
66
|
creationTime: time,
|
|
75
67
|
protected: false
|
|
76
68
|
};
|
|
77
|
-
|
|
78
69
|
try {
|
|
79
70
|
checkLogItemType(logItem.logItemType, false);
|
|
80
71
|
const result = await db.collection(collection).insertOne(newLogItem);
|
|
81
|
-
|
|
82
72
|
if (result.acknowledged) {
|
|
83
73
|
const {
|
|
84
74
|
blobSequence,
|
|
@@ -89,14 +79,12 @@ async function _default(MONGO_URI) {
|
|
|
89
79
|
logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);
|
|
90
80
|
return;
|
|
91
81
|
}
|
|
92
|
-
|
|
93
82
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR);
|
|
94
83
|
} catch (error) {
|
|
95
84
|
(0, _utils.logError)(error);
|
|
96
85
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR);
|
|
97
86
|
}
|
|
98
87
|
}
|
|
99
|
-
|
|
100
88
|
async function query(params) {
|
|
101
89
|
logger.debug(`Query params: ${JSON.stringify(params)}`);
|
|
102
90
|
checkLogItemType(params.logItemType, false, false);
|
|
@@ -113,7 +101,6 @@ async function _default(MONGO_URI) {
|
|
|
113
101
|
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);
|
|
114
102
|
return result;
|
|
115
103
|
}
|
|
116
|
-
|
|
117
104
|
async function queryById(correlationIdString, skip = 0, limit = 1) {
|
|
118
105
|
logger.debug(`QueryById: ${correlationIdString}`);
|
|
119
106
|
const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
|
|
@@ -125,7 +112,6 @@ async function _default(MONGO_URI) {
|
|
|
125
112
|
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);
|
|
126
113
|
return result;
|
|
127
114
|
}
|
|
128
|
-
|
|
129
115
|
async function getListOfLogs(logItemType = 'MERGE_LOG') {
|
|
130
116
|
checkLogItemType(logItemType, false, false);
|
|
131
117
|
const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
|
|
@@ -138,7 +124,6 @@ async function _default(MONGO_URI) {
|
|
|
138
124
|
payload: result.length > 0 ? result : 'No logs found'
|
|
139
125
|
};
|
|
140
126
|
}
|
|
141
|
-
|
|
142
127
|
async function protect(correlationId, blobSequence) {
|
|
143
128
|
logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);
|
|
144
129
|
const cleanCorrelationId = (0, _mongoSanitize.default)(correlationId);
|
|
@@ -149,7 +134,6 @@ async function _default(MONGO_URI) {
|
|
|
149
134
|
} : {
|
|
150
135
|
correlationId: cleanCorrelationId
|
|
151
136
|
};
|
|
152
|
-
|
|
153
137
|
try {
|
|
154
138
|
const result = await db.collection(collection).updateMany(filter, {
|
|
155
139
|
$set: {
|
|
@@ -167,7 +151,6 @@ async function _default(MONGO_URI) {
|
|
|
167
151
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, err.message);
|
|
168
152
|
}
|
|
169
153
|
}
|
|
170
|
-
|
|
171
154
|
async function remove(correlationId, force = false) {
|
|
172
155
|
logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);
|
|
173
156
|
const clean = (0, _mongoSanitize.default)(correlationId);
|
|
@@ -179,7 +162,6 @@ async function _default(MONGO_URI) {
|
|
|
179
162
|
$ne: true
|
|
180
163
|
}
|
|
181
164
|
};
|
|
182
|
-
|
|
183
165
|
try {
|
|
184
166
|
const result = await db.collection(collection).deleteMany(filter);
|
|
185
167
|
return {
|
|
@@ -190,26 +172,20 @@ async function _default(MONGO_URI) {
|
|
|
190
172
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, err.message);
|
|
191
173
|
}
|
|
192
174
|
}
|
|
193
|
-
|
|
194
175
|
function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {
|
|
195
176
|
if (logItemType) {
|
|
196
177
|
const typeInLogItemTypes = Object.values(_constants.LOG_ITEM_TYPE).indexOf(logItemType) > -1;
|
|
197
|
-
|
|
198
178
|
if (typeInLogItemTypes) {
|
|
199
179
|
return logger.debug(`Valid logItemType: ${logItemType}`);
|
|
200
180
|
}
|
|
201
|
-
|
|
202
181
|
if (errorUnknown) {
|
|
203
182
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);
|
|
204
183
|
}
|
|
205
|
-
|
|
206
184
|
return logger.debug(`WARN: We have unknown logType: ${logItemType}`);
|
|
207
185
|
}
|
|
208
|
-
|
|
209
186
|
if (errorNotExisting) {
|
|
210
187
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);
|
|
211
188
|
}
|
|
212
|
-
|
|
213
189
|
return logger.debug(`No logItemType: ${logItemType}`);
|
|
214
190
|
}
|
|
215
191
|
}
|
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","protect","remove","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","payload","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","err","message","force","clean","$ne","deleteMany","deletedCount","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, protect, remove};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n checkLogItemType(params.logItemType, false, false);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n {\n $set: {\n modificationTime: moment().toDate(),\n protect: {$not: '$protect'}\n }\n }\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mongoLog.js","names":["MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","protect","remove","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","payload","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","err","message","force","clean","$ne","deleteMany","deletedCount","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, protect, remove};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n checkLogItemType(params.logItemType, false, false);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n {\n $set: {\n modificationTime: moment().toDate(),\n protect: {$not: '$protect'}\n }\n }\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -4,20 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.addRecordResponseItem = addRecordResponseItem;
|
|
7
|
+
exports.addRecordResponseItems = addRecordResponseItems;
|
|
7
8
|
exports.createImportJobState = createImportJobState;
|
|
8
9
|
exports.createRecordResponseItem = createRecordResponseItem;
|
|
9
10
|
exports.logError = logError;
|
|
10
|
-
|
|
11
11
|
var _melindaBackendCommons = require("@natlibfi/melinda-backend-commons");
|
|
12
|
-
|
|
13
12
|
var _melindaCommons = require("@natlibfi/melinda-commons");
|
|
14
|
-
|
|
15
13
|
var _constants = require("./constants");
|
|
16
|
-
|
|
17
14
|
var _httpStatus = _interopRequireDefault(require("http-status"));
|
|
18
|
-
|
|
19
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
|
-
|
|
21
16
|
/**
|
|
22
17
|
*
|
|
23
18
|
* @licstart The following is the entire license notice for the JavaScript code in this file.
|
|
@@ -45,31 +40,26 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
45
40
|
* for the JavaScript code in this file.
|
|
46
41
|
*
|
|
47
42
|
*/
|
|
48
|
-
const logger = (0, _melindaBackendCommons.createLogger)();
|
|
49
43
|
|
|
44
|
+
const logger = (0, _melindaBackendCommons.createLogger)();
|
|
50
45
|
function logError(err) {
|
|
51
46
|
if (err instanceof _melindaCommons.Error) {
|
|
52
47
|
logger.error(JSON.stringify(err));
|
|
53
48
|
return;
|
|
54
49
|
}
|
|
55
|
-
|
|
56
50
|
if (err === 'SIGINT') {
|
|
57
51
|
logger.error(err);
|
|
58
52
|
return;
|
|
59
53
|
}
|
|
60
|
-
|
|
61
54
|
logger.error(err.stack === undefined ? err : err.stack);
|
|
62
55
|
}
|
|
63
|
-
|
|
64
56
|
function createImportJobState(operation, state, queryImportJobState = false) {
|
|
65
57
|
if (!(state in _constants.IMPORT_JOB_STATE)) {
|
|
66
58
|
throw new Error('Invalid IMPORT_JOB_STATE');
|
|
67
59
|
}
|
|
68
|
-
|
|
69
60
|
if (!(operation in _constants.OPERATIONS)) {
|
|
70
61
|
throw new Error('Invalid operation');
|
|
71
62
|
}
|
|
72
|
-
|
|
73
63
|
if (queryImportJobState) {
|
|
74
64
|
const importJobStateWithOperation = `importJobState.${operation}`;
|
|
75
65
|
const importJobStateForQuery = {
|
|
@@ -77,12 +67,10 @@ function createImportJobState(operation, state, queryImportJobState = false) {
|
|
|
77
67
|
};
|
|
78
68
|
return importJobStateForQuery;
|
|
79
69
|
}
|
|
80
|
-
|
|
81
70
|
return {
|
|
82
71
|
[operation]: state
|
|
83
72
|
};
|
|
84
73
|
}
|
|
85
|
-
|
|
86
74
|
function createRecordResponseItem({
|
|
87
75
|
responsePayload,
|
|
88
76
|
responseStatus,
|
|
@@ -96,19 +84,22 @@ function createRecordResponseItem({
|
|
|
96
84
|
...recordResponseStatusAndMessage
|
|
97
85
|
};
|
|
98
86
|
return recordResponseItem;
|
|
99
|
-
}
|
|
100
|
-
|
|
87
|
+
}
|
|
101
88
|
|
|
89
|
+
// eslint-disable-next-line max-statements
|
|
102
90
|
function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {
|
|
103
|
-
logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);
|
|
91
|
+
logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);
|
|
92
|
+
//const responseStatusName = httpStatus[`${responseStatus}_NAME`];
|
|
104
93
|
//logger.debug(`Response status name: ${responseStatusName}`);
|
|
105
94
|
|
|
106
95
|
const message = getMessageFromResponsePayload(responsePayload);
|
|
107
96
|
const ids = responsePayload.ids || [];
|
|
108
|
-
logger.debug(`Response message: ${message}`);
|
|
97
|
+
logger.debug(`Response message: ${message}`);
|
|
98
|
+
|
|
99
|
+
// We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus
|
|
109
100
|
// recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js
|
|
110
|
-
// Non-http statuses
|
|
111
101
|
|
|
102
|
+
// Non-http statuses
|
|
112
103
|
if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED'].includes(responseStatus)) {
|
|
113
104
|
return {
|
|
114
105
|
recordStatus: responseStatus,
|
|
@@ -116,7 +107,6 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
116
107
|
message
|
|
117
108
|
};
|
|
118
109
|
}
|
|
119
|
-
|
|
120
110
|
if (['UNKNOWN'].includes(responseStatus)) {
|
|
121
111
|
return {
|
|
122
112
|
recordStatus: 'ERROR',
|
|
@@ -124,9 +114,9 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
124
114
|
message,
|
|
125
115
|
ids
|
|
126
116
|
};
|
|
127
|
-
}
|
|
128
|
-
|
|
117
|
+
}
|
|
129
118
|
|
|
119
|
+
// Duplicates and other CONFLICT statuses
|
|
130
120
|
if ([_httpStatus.default.CONFLICT, 'CONFLICT'].includes(responseStatus)) {
|
|
131
121
|
if (/^Duplicates in database/u.test(message)) {
|
|
132
122
|
return {
|
|
@@ -136,7 +126,6 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
136
126
|
ids
|
|
137
127
|
};
|
|
138
128
|
}
|
|
139
|
-
|
|
140
129
|
if (/^MatchValidation for all/u.test(message)) {
|
|
141
130
|
return {
|
|
142
131
|
recordStatus: 'ERROR',
|
|
@@ -144,9 +133,9 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
144
133
|
message,
|
|
145
134
|
ids
|
|
146
135
|
};
|
|
147
|
-
}
|
|
148
|
-
|
|
136
|
+
}
|
|
149
137
|
|
|
138
|
+
// Use ids only if there are more than one id or the id in payload does not match databaseId
|
|
150
139
|
if (ids.length > 1 || ids[0] !== id) {
|
|
151
140
|
return {
|
|
152
141
|
recordStatus: 'ERROR',
|
|
@@ -155,14 +144,12 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
155
144
|
ids
|
|
156
145
|
};
|
|
157
146
|
}
|
|
158
|
-
|
|
159
147
|
return {
|
|
160
148
|
recordStatus: 'ERROR',
|
|
161
149
|
detailedRecordStatus: 'CONFLICT',
|
|
162
150
|
message
|
|
163
151
|
};
|
|
164
152
|
}
|
|
165
|
-
|
|
166
153
|
if ([_httpStatus.default.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {
|
|
167
154
|
if (ids.length > 1 || ids[0] !== id) {
|
|
168
155
|
return {
|
|
@@ -172,42 +159,36 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
|
|
|
172
159
|
ids
|
|
173
160
|
};
|
|
174
161
|
}
|
|
175
|
-
|
|
176
162
|
return {
|
|
177
163
|
recordStatus: 'INVALID',
|
|
178
164
|
detailedRecordStatus: 'UNPROCESSABLE_ENTITY',
|
|
179
165
|
message
|
|
180
166
|
};
|
|
181
167
|
}
|
|
182
|
-
|
|
183
168
|
if ([_httpStatus.default.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {
|
|
184
169
|
return {
|
|
185
170
|
recordStatus: 'ERROR',
|
|
186
171
|
detailedRecordStatus: 'NOT_FOUND',
|
|
187
172
|
message
|
|
188
173
|
};
|
|
189
|
-
}
|
|
190
|
-
|
|
174
|
+
}
|
|
191
175
|
|
|
176
|
+
// Otherwise
|
|
192
177
|
return {
|
|
193
178
|
recordStatus: 'ERROR',
|
|
194
179
|
detailedRecordStatus: responseStatus,
|
|
195
180
|
message
|
|
196
181
|
};
|
|
197
182
|
}
|
|
198
|
-
|
|
199
183
|
function getMessageFromResponsePayload(responsePayload) {
|
|
200
184
|
if (responsePayload.message) {
|
|
201
185
|
return responsePayload.message;
|
|
202
186
|
}
|
|
203
|
-
|
|
204
187
|
if (typeof responsePayload === 'string' || responsePayload instanceof String) {
|
|
205
188
|
return responsePayload;
|
|
206
189
|
}
|
|
207
|
-
|
|
208
190
|
return '';
|
|
209
191
|
}
|
|
210
|
-
|
|
211
192
|
async function addRecordResponseItem({
|
|
212
193
|
recordResponseItem,
|
|
213
194
|
correlationId,
|
|
@@ -220,4 +201,21 @@ async function addRecordResponseItem({
|
|
|
220
201
|
});
|
|
221
202
|
return true;
|
|
222
203
|
}
|
|
204
|
+
|
|
205
|
+
// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts
|
|
206
|
+
async function addRecordResponseItems({
|
|
207
|
+
recordResponseItems,
|
|
208
|
+
correlationId,
|
|
209
|
+
mongoOperator
|
|
210
|
+
}) {
|
|
211
|
+
if (!Array.isArray(recordResponseItems)) {
|
|
212
|
+
throw new Error('RecordResponseItems is not an array!');
|
|
213
|
+
}
|
|
214
|
+
await mongoOperator.pushMessages({
|
|
215
|
+
correlationId,
|
|
216
|
+
messages: recordResponseItems,
|
|
217
|
+
messageField: 'records'
|
|
218
|
+
});
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
223
221
|
//# sourceMappingURL=utils.js.map
|