@natlibfi/melinda-rest-api-commons 4.2.3-alpha.1 → 4.2.4-alpha.11

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.
Files changed (47) hide show
  1. package/.github/workflows/melinda-node-tests.yml +1 -1
  2. package/dist/amqp.js +2 -2
  3. package/dist/amqp.js.map +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/mongo.js +158 -80
  7. package/dist/mongo.js.map +1 -1
  8. package/dist/mongoLog.js +1 -4
  9. package/dist/mongoLog.js.map +1 -1
  10. package/package.json +26 -24
  11. package/{dist → tests}/amqp.health.spec.js +17 -10
  12. package/tests/amqp.tests.spec.js +301 -0
  13. package/tests/helpers/conversion.spec.js +95 -0
  14. package/tests/helpers/fix.spec.js +41 -0
  15. package/tests/helpers/validation.spec.js +58 -0
  16. package/tests/mongo-add-blob-size.spec.js +100 -0
  17. package/tests/mongo-check-and-check-state.spec.js +112 -0
  18. package/tests/mongo-check-and-set-import-job-state.spec.js +112 -0
  19. package/tests/mongo-check-timeout.spec.js +111 -0
  20. package/tests/mongo-create-bulk.spec.js +100 -0
  21. package/tests/mongo-create-prio.spec.js +98 -0
  22. package/tests/mongo-get-one.spec.js +103 -0
  23. package/tests/mongo-get-stream.spec.js +120 -0
  24. package/tests/mongo-push-ids.spec.js +101 -0
  25. package/tests/mongo-push-messages.spec.js +99 -0
  26. package/tests/mongo-query-by-id.spec.js +112 -0
  27. package/tests/mongo-query.spec.js +108 -0
  28. package/tests/mongo-read-content.spec.js +123 -0
  29. package/tests/mongo-remove.spec.js +115 -0
  30. package/tests/mongo-set-blob-size.spec.js +99 -0
  31. package/tests/mongo-set-import-job-state.spec.js +102 -0
  32. package/tests/mongo-set-operation.spec.js +102 -0
  33. package/tests/mongo-set-operations.spec.js +101 -0
  34. package/tests/mongo-set-state.spec.js +102 -0
  35. package/{dist → tests}/mongoLog.spec.js +22 -22
  36. package/tests/testUtils.js +94 -0
  37. package/dist/amqp.health.spec.js.map +0 -1
  38. package/dist/amqp.tests.spec.js +0 -310
  39. package/dist/amqp.tests.spec.js.map +0 -1
  40. package/dist/helpers/conversion.spec.js +0 -88
  41. package/dist/helpers/conversion.spec.js.map +0 -1
  42. package/dist/helpers/fix.spec.js +0 -46
  43. package/dist/helpers/fix.spec.js.map +0 -1
  44. package/dist/helpers/validation.spec.js +0 -47
  45. package/dist/helpers/validation.spec.js.map +0 -1
  46. package/dist/mongo.spec.js.draft +0 -54
  47. package/dist/mongoLog.spec.js.map +0 -1
package/dist/mongo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","FIX","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","getNewJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY,\n FIX: 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 FIX: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await db.collection(collection).find(rest, {projection: createProjection(showParams)})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n logger.silly(`${JSON.stringify(result)}`);\n return result;\n }\n\n // We default to NOT showing operations, operationSettings, recordLoadParams and importJobState when a queueItem is queried\n // These can all be shown with showAll\n // Single fields can be shown by showOperation, showOperationSettings, showRecordLoadParams and showImportJobState\n\n function createProjection(showParams = {}) {\n logger.silly(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n\n if (showAll) {\n return {\n _id: 0\n };\n }\n\n const showParamToField = {\n 'showOperations': 'operations',\n 'showOperationSettings': 'operationSettings',\n 'showRecordLoadParams': 'recordLoadParams',\n 'showImportJobState': 'importJobState'\n };\n\n const result = Object.keys(showParams)\n .filter(param => param !== 'showAll' && showParams[param] !== true && showParams[param] !== 1)\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.silly(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.silly(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n\n return {\n _id: 0,\n ...excludeObject\n };\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`${correlationId} 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 if (!finalImportJobStates.includes(importJobState.FIX)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'FIX', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = getNewJobState(operation, cleanImportJobState);\n\n\n function getNewJobState(operation, cleanImportJobState) {\n if (operation === OPERATIONS.CREATE) {\n return {'importJobState.CREATE': cleanImportJobState};\n }\n if (operation === OPERATIONS.UPDATE) {\n return {'importJobState.UPDATE': cleanImportJobState};\n }\n if (operation === OPERATIONS.FIX) {\n return {'importJobState.FIX': cleanImportJobState};\n }\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\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":";;;;;;;AAGA,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;AAVA;;AAWA;;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,eAAAS,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,KAAK;QAC9BE,GAAG,EAAEH,2BAAgB,CAACC;MACxB,CAAC;MACDG,OAAO,EAAE,EAAE;MACXC,YAAY,EAAE,EAAE;MAChBC,WAAW,EAAE,EAAE;MACfC,YAAY,EAAEpB,IAAI;MAClBqB,gBAAgB,EAAErB;IACpB,CAAC;IACD,IAAI;MACF,MAAMsB,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC2D,SAAS,CAACpB,YAAY,CAAC;MACtE,IAAImB,MAAM,CAACE,YAAY,EAAE;QACvB3D,MAAM,CAAC4D,IAAI,CAAC,2BAA2B3B,SAAS,IAAIH,aAAa,qBAAqB/B,UAAU,EAAE,CAAC;QACnG;MACF;MACA,MAAM,IAAI8D,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,EAAE,kBAAkBV,YAAY,EAAE,CAAC;IACxF;EACF;;EAEA;EACA,eAAezC,UAAUA,CAAC;IAACkB,aAAa;IAAEC,SAAS;IAAEC,YAAY;IAAEC,SAAS;IAAEmC,WAAW;IAAEC,gBAAgB;IAAEC,MAAM;IAAEpC;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;MACDkC,WAAW;MACXC,gBAAgB;MAChB5B,cAAc,EAAE6B,MAAM,GAAG5B,2BAAgB,CAACC,SAAS,CAAC4B,SAAS,GAAG7B,2BAAgB,CAACC,SAAS,CAAC6B,mBAAmB;MAC9G3B,QAAQ,EAAE,CAAC;MACXC,cAAc,EAAE;QACdC,MAAM,EAAEC,2BAAgB,CAACC,KAAK;QAC9BC,MAAM,EAAEF,2BAAgB,CAACC,KAAK;QAC9BE,GAAG,EAAEH,2BAAgB,CAACC;MACxB,CAAC;MACDG,OAAO,EAAE,EAAE;MACXC,YAAY,EAAE,EAAE;MAChBC,WAAW,EAAE,EAAE;MACfC,YAAY,EAAEpB,IAAI;MAClBqB,gBAAgB,EAAErB;IACpB,CAAC;;IAED;IACA,IAAImC,MAAM,EAAE;MACV,IAAI;QACF;QACA/D,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC2D,SAAS,CAACpB,YAAY,CAAC;QACjDtC,MAAM,CAAC4D,IAAI,CAAC,2BAA2B3B,SAAS,IAAIH,aAAa,qBAAqB/B,UAAU,GAAG,CAAC;QACpG,OAAO,IAAI0E,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;UACtC,MAAMC,YAAY,GAAGpE,YAAY,CAACqE,gBAAgB,CAAC/C,aAAa,CAAC;UAEjEwC,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,CAAC5C,aAAa,CAAC;UACxB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;MACJ,CAAC,CAAC,OAAOkC,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,EAAE,kBAAkBV,YAAY,EAAE,CAAC;MACxF;IACF;IAEArD,MAAM,CAACmF,KAAK,CAAC,WAAW,CAAC;IACzB;IACA,IAAI,CAACb,MAAM,EAAE;MACX,IAAI;QACF,MAAMb,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC2D,SAAS,CAACpB,YAAY,CAAC;QACtE,IAAImB,MAAM,CAACE,YAAY,EAAE;UACvB3D,MAAM,CAAC4D,IAAI,CAAC,oCAAoC3B,SAAS,IAAIH,aAAa,qBAAqB/B,UAAU,EAAE,CAAC;UAC5G,OAAO;YAAC+B,aAAa;YAAEW,cAAc,EAAEC,2BAAgB,CAACC,SAAS,CAAC6B;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,EAAE,kBAAkBV,YAAY,EAAE,CAAC;MACxF;IACF;EACF;;EAEA;EACA,eAAexC,gBAAgBA,CAAC;IAACiB,aAAa;IAAEsD,KAAK;IAAE/B,YAAY,GAAG6B,SAAS;IAAE5B,WAAW,GAAG4B;EAAS,CAAC,EAAE;IACzG;IACA;IACA,MAAMG,OAAO,GAAG,MAAMC,YAAY,CAAC;MAACxD;IAAa,CAAC,CAAC;IACnD,IAAIuD,OAAO,EAAE;MACX,OAAO/D,QAAQ,CAAC;QAACQ,aAAa;QAAEsD,KAAK;QAAE/B,YAAY;QAAEC;MAAW,CAAC,CAAC;IACpE;IACA,OAAO,KAAK;EACd;;EAEA;EACA,eAAexC,yBAAyBA,CAAC;IAACgB,aAAa;IAAEG,SAAS;IAAEa,cAAc;IAAEO,YAAY,GAAG,EAAE;IAAEC,WAAW,GAAG;EAAE,CAAC,EAAE;IACxH;IACA;IACAtD,MAAM,CAACmF,KAAK,CAAC,GAAGrD,aAAa,KAAKgB,cAAc,KAAKb,SAAS,EAAE,CAAC;IACjE,MAAMoD,OAAO,GAAG,MAAMC,YAAY,CAAC;MAACxD,aAAa;MAAEG,SAAS;MAAEa;IAAc,CAAC,CAAC;IAC9E,IAAIuC,OAAO,EAAE;MACX,OAAO9D,iBAAiB,CAAC;QAACO,aAAa;QAAEG,SAAS;QAAEa,cAAc;QAAEO,YAAY;QAAEC;MAAW,CAAC,CAAC;IACjG;IACA,OAAO,KAAK;EACd;EAEA,eAAevC,KAAKA,CAACwE,MAAM,EAAEC,UAAU,GAAG,CAAC,CAAC,EAAE;IAC5CxF,MAAM,CAACmF,KAAK,CAAC,aAAaM,IAAI,CAACC,SAAS,CAACH,MAAM,CAAC,KAAKE,IAAI,CAACC,SAAS,CAACF,UAAU,CAAC,EAAE,CAAC;IAClF,MAAM;MAACG,KAAK,GAAG,IAAI;MAAEC,IAAI,GAAG,CAAC;MAAE,GAAGC;IAAI,CAAC,GAAGN,MAAM;IAEhD,MAAM9B,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAAC+F,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;IACZlG,MAAM,CAACmF,KAAK,CAAC,iBAAiB1B,MAAM,CAAC0C,MAAM,GAAG,CAAC,GAAG,QAAQ,GAAG,YAAY,EAAE,CAAC;IAC5EnG,MAAM,CAACoG,KAAK,CAAC,GAAGX,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAC,EAAE,CAAC;IACzC,OAAOA,MAAM;EACf;;EAEA;EACA;EACA;;EAEA,SAASuC,gBAAgBA,CAACR,UAAU,GAAG,CAAC,CAAC,EAAE;IACzCxF,MAAM,CAACoG,KAAK,CAAC,kCAAkCX,IAAI,CAACC,SAAS,CAACF,UAAU,CAAC,EAAE,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;IACjIxF,MAAM,CAACmF,KAAK,CAAC,YAAYkB,OAAO,qBAAqBC,cAAc,4BAA4BC,qBAAqB,2BAA2BC,oBAAoB,yBAAyBC,kBAAkB,EAAE,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;IAC1C/G,MAAM,CAACoG,KAAK,CAAC,uCAAuCX,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAC,EAAE,CAAC;IAE7E,MAAMwD,aAAa,GAAGL,MAAM,CAACM,WAAW,CAACzD,MAAM,CAACuD,GAAG,CAACD,KAAK,IAAI,CAACA,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE/G,MAAM,CAACoG,KAAK,CAAC,uCAAuCX,IAAI,CAACC,SAAS,CAACuB,aAAa,CAAC,EAAE,CAAC;IAEpF,OAAO;MACLP,GAAG,EAAE,CAAC;MACN,GAAGO;IACL,CAAC;EACH;EAEA,eAAejG,SAASA,CAAC;IAACc,aAAa;IAAEqF,YAAY,GAAG;EAAK,CAAC,EAAE;IAC9D,MAAM1D,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;MAACtF;IAAa,CAAC,CAAC;IACvE,IAAIqF,YAAY,EAAE;MAChB,MAAM9B,OAAO,GAAG,MAAMC,YAAY,CAAC;QAACxD;MAAa,CAAC,CAAC;MACnD,IAAIuD,OAAO,EAAE;QACX,OAAOrE,SAAS,CAAC;UAACc;QAAa,CAAC,CAAC;MACnC;MACA,OAAO2B,MAAM;IACf;IAEA,OAAOA,MAAM;EACf;;EAEA;EACA;EACA;EACA;;EAEA,eAAe6B,YAAYA,CAAC;IAACxD;EAAa,CAAC,EAAE;IAC3C,MAAM;MAAC0B,gBAAgB;MAAE6D,cAAc,EAAEC,QAAQ;MAAExE;IAAc,CAAC,GAAG,MAAMvC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;MAACtF;IAAa,CAAC,CAAC;;IAE7H;IACA,IAAI,CAACY,2BAAgB,CAAC6E,KAAK,EAAE7E,2BAAgB,CAAC8E,KAAK,EAAE9E,2BAAgB,CAAC+E,IAAI,CAAC,CAACC,QAAQ,CAACJ,QAAQ,CAAC,EAAE;MAC9FtH,MAAM,CAACoG,KAAK,CAAC,GAAGtE,aAAa,uBAAuBwF,QAAQ,EAAE,CAAC;MAC/D,OAAO,KAAK;IACd;IAEA,MAAMK,WAAW,GAAG,IAAAvF,eAAM,EAACoB,gBAAgB,CAAC,CAACoE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;IACxD5H,MAAM,CAACoG,KAAK,CAAC,GAAGtE,aAAa,cAAc6F,WAAW,EAAE,CAAC;IAEzD,IAAIA,WAAW,CAACE,QAAQ,CAAC,CAAC,EAAE;MAC1B,MAAMC,oBAAoB,GAAG,CAAC9E,2BAAgB,CAACuE,KAAK,EAAEvE,2BAAgB,CAACyE,IAAI,EAAEzE,2BAAgB,CAACC,KAAK,EAAED,2BAAgB,CAACwE,KAAK,CAAC;MAC5H,IAAI,CAACM,oBAAoB,CAACJ,QAAQ,CAAC5E,cAAc,CAACC,MAAM,CAAC,EAAE;QAAE;QAC3D,MAAMxB,iBAAiB,CAAC;UAACO,aAAa;UAAEG,SAAS,EAAE,QAAQ;UAAEa,cAAc,EAAEE,2BAAgB,CAACuE;QAAK,CAAC,CAAC;MACvG;MAEA,IAAI,CAACO,oBAAoB,CAACJ,QAAQ,CAAC5E,cAAc,CAACI,MAAM,CAAC,EAAE;QAAE;QAC3D,MAAM3B,iBAAiB,CAAC;UAACO,aAAa;UAAEG,SAAS,EAAE,QAAQ;UAAEa,cAAc,EAAEE,2BAAgB,CAACuE;QAAK,CAAC,CAAC;MACvG;MAEA,IAAI,CAACO,oBAAoB,CAACJ,QAAQ,CAAC5E,cAAc,CAACK,GAAG,CAAC,EAAE;QAAE;QACxD,MAAM5B,iBAAiB,CAAC;UAACO,aAAa;UAAEG,SAAS,EAAE,KAAK;UAAEa,cAAc,EAAEE,2BAAgB,CAACuE;QAAK,CAAC,CAAC;MACpG;MAEA,MAAMjG,QAAQ,CAAC;QAACQ,aAAa;QAAEsD,KAAK,EAAE1C,2BAAgB,CAAC6E,KAAK;QAAEjE,WAAW,EAAEQ,mBAAU,CAACiE,eAAe;QAAE1E,YAAY,EAAE,cAAciE,QAAQ;MAAE,CAAC,CAAC;MAE/I,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb;EAEA,eAAerG,MAAMA,CAACsE,MAAM,EAAE;IAC5BvF,MAAM,CAACoG,KAAK,CAAC,GAAGX,IAAI,CAACC,SAAS,CAACH,MAAM,CAAC,EAAE,CAAC;IACzCvF,MAAM,CAAC4D,IAAI,CAAC,wBAAwB7D,UAAU,SAASwF,MAAM,CAACzD,aAAa,EAAE,CAAC;IAC9E,MAAMkG,KAAK,GAAG,IAAAC,sBAAQ,EAAC1C,MAAM,CAACzD,aAAa,CAAC;IAC5C9B,MAAM,CAACoG,KAAK,CAAC,wBAAwBX,IAAI,CAACC,SAAS,CAACsC,KAAK,CAAC,EAAE,CAAC;IAE7D,IAAI;MACF;MACA;MACA,MAAME,SAAS,GAAG,MAAM/G,aAAa,CAACoE,MAAM,CAAC;MAC7C,IAAI2C,SAAS,EAAE;QACb,MAAM3H,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoI,SAAS,CAAC;UAACrG,aAAa,EAAEkG;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;UACvDtI,MAAM,CAACoG,KAAK,CAAC,oDAAoDX,IAAI,CAACC,SAAS,CAACsC,KAAK,CAAC,SAASjI,UAAU,EAAE,CAAC;UAC5G,MAAMQ,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACoI,SAAS,CAAC;YAACrG,aAAa,EAAEkG;UAAK,CAAC,CAAC;UACjE,OAAO,IAAI;QACb;QACAhI,MAAM,CAACgE,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,eAAehD,WAAWA,CAACY,aAAa,EAAE;IACxC9B,MAAM,CAAC4D,IAAI,CAAC,sCAAsC9B,aAAa,OAAO/B,UAAU,EAAE,CAAC;IACnF,MAAMiI,KAAK,GAAG,IAAAC,sBAAQ,EAACnG,aAAa,CAAC;IACrC,MAAM2B,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;MAACtF,aAAa,EAAEkG;IAAK,CAAC,CAAC,CAAC,CAAC;;IAEhF,IAAIvE,MAAM,EAAE;MACV,MAAM;QAACvB;MAAiB,CAAC,GAAGuB,MAAM;MAClC,IAAIvB,iBAAiB,CAACM,IAAI,KAAK,KAAK,IAAIN,iBAAiB,CAACqG,QAAQ,KAAK,KAAK,EAAE;QAC5E,OAAO;UACLnE,WAAW,EAAEX,MAAM,CAACW,WAAW;UAC/BoE,UAAU,EAAEhI,YAAY,CAACiI,wBAAwB,CAACT,KAAK;QACzD,CAAC;MACH;MACAhI,MAAM,CAACmF,KAAK,CAAC,yBAAyBrD,aAAa,KAAK2D,IAAI,CAACC,SAAS,CAACxD,iBAAiB,CAAC,EAAE,CAAC;MAC5F,MAAM,IAAI2B,qBAAQ,CAACC,mBAAU,CAAC4E,WAAW,EAAE;QAACxE,OAAO,EAAE,kDAAkDpC,aAAa;MAA2B,CAAC,CAAC;IACnJ;IAEA,MAAM,IAAI+B,qBAAQ,CAACC,mBAAU,CAAC6E,SAAS,EAAE;MAACzE,OAAO,EAAE,OAAOpC,aAAa;IAAa,CAAC,CAAC;EACxF;EAEA,eAAeX,aAAaA,CAACoE,MAAM,EAAE;IACnCvF,MAAM,CAAC4D,IAAI,CAAC,uCAAuC2B,MAAM,CAACzD,aAAa,OAAO/B,UAAU,EAAE,CAAC;IAC3F,MAAMiI,KAAK,GAAG,IAAAC,sBAAQ,EAAC1C,MAAM,CAACzD,aAAa,CAAC;IAE5C,MAAM2B,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;MAACtF,aAAa,EAAEkG;IAAK,CAAC,CAAC,CAAC,CAAC;IAChFhI,MAAM,CAACoG,KAAK,CAAC,+BAA+BX,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAC,EAAE,CAAC;IAErE,IAAIA,MAAM,EAAE;MACV,MAAMjD,YAAY,CAACoI,MAAM,CAACZ,KAAK,CAAC;MAChC,OAAO,IAAI;IACb;IAEA,OAAO,IAAI;EACb;;EAEA;EACA,SAAS5G,MAAMA,CAAC;IAACqB,cAAc;IAAEK,cAAc,GAAGoC;EAAS,CAAC,EAAE;IAE5DlF,MAAM,CAACoG,KAAK,CAAC,mBAAmB3D,cAAc,qBAAqBgD,IAAI,CAACC,SAAS,CAAC5C,cAAc,CAAC,EAAE,CAAC;IACpG,MAAM+F,mBAAmB,GAAGpG,cAAc,GAAG;MAACA,cAAc,EAAE,IAAAwF,sBAAQ,EAACxF,cAAc;IAAC,CAAC,GAAGyC,SAAS;IAEnG,IAAI;MAEF;MACA,IAAIzC,cAAc,IAAIK,cAAc,KAAKoC,SAAS,EAAE;QAClDlF,MAAM,CAACoG,KAAK,CAAC,eAAerG,UAAU,aAAa0F,IAAI,CAACC,SAAS,CAACmD,mBAAmB,CAACpG,cAAc,CAAC,EAAE,CAAC;QACxG,OAAOlC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;UAAC,GAAGyB;QAAmB,CAAC,CAAC;MACpE;;MAEA;MACA,IAAI/F,cAAc,IAAIL,cAAc,KAAKyC,SAAS,EAAE;QAClDlF,MAAM,CAACoG,KAAK,CAAC,eAAerG,UAAU,QAAQ0F,IAAI,CAACC,SAAS,CAAC5C,cAAc,CAAC,EAAE,CAAC;QAC/E,OAAOvC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;UAAC,GAAGtE;QAAc,CAAC,CAAC;MAC/D;;MAEA;MACA,IAAIA,cAAc,IAAIL,cAAc,EAAE;QACpCzC,MAAM,CAACoG,KAAK,CAAC,eAAerG,UAAU,QAAQ0C,cAAc,QAAQgD,IAAI,CAACC,SAAS,CAAC5C,cAAc,CAAC,EAAE,CAAC;QACrG,OAAOvC,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;UAAC,GAAGyB,mBAAmB;UAAE,GAAG/F;QAAc,CAAC,CAAC;MACvF;MAEA9C,MAAM,CAACmF,KAAK,CAAC,qBAAqB,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,EAAE,kBAAkBV,YAAY,EAAE,CAAC;IACxF;EACF;EAEA,SAAShC,SAASA,CAACS,aAAa,EAAE;IAChC9B,MAAM,CAAC4D,IAAI,CAAC,iCAAiC9B,aAAa,OAAO/B,UAAU,EAAE,CAAC;IAC9E,MAAMiI,KAAK,GAAG,IAAAC,sBAAQ,EAACnG,aAAa,CAAC;IACrC,IAAI;MACF;MACA,OAAOtB,YAAY,CAACiI,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,EAAE,kBAAkBV,YAAY,EAAE,CAAC;IACxF;EACF;EAEA,eAAe7B,OAAOA,CAAC;IAACM,aAAa;IAAEgH,UAAU;IAAEC;EAAW,CAAC,EAAE;IAC/D/I,MAAM,CAACgJ,OAAO,CAAC,aAAaF,UAAU,CAAC3C,MAAM,sBAAsB4C,WAAW,CAAC5C,MAAM,KAAKrE,aAAa,OAAO/B,UAAU,EAAE,CAAC;IAC3HC,MAAM,CAACmF,KAAK,CAAC,QAAQ2D,UAAU,CAAC3C,MAAM,MAAMV,IAAI,CAACC,SAAS,CAACoD,UAAU,CAAC,iBAAiBC,WAAW,CAAC5C,MAAM,KAAKV,IAAI,CAACC,SAAS,CAACqD,WAAW,CAAC,EAAE,CAAC;IAC5I,MAAMf,KAAK,GAAG,IAAAC,sBAAQ,EAACnG,aAAa,CAAC;IACrC,MAAMvB,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACkJ,SAAS,CAAC;MACxCnH,aAAa,EAAEkG;IACjB,CAAC,EAAE;MACDkB,IAAI,EAAE;QACJ1F,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC,CAAC;MACD8G,KAAK,EAAE;QACLL,UAAU,EAAE;UAACM,KAAK,EAAEN;QAAU,CAAC;QAC/BC,WAAW,EAAE;UAACK,KAAK,EAAEL;QAAW;MAClC;IACF,CAAC,CAAC;EACJ;EAEA,eAAetH,YAAYA,CAAC;IAACK,aAAa;IAAEuH,QAAQ;IAAEC,YAAY,GAAG;EAAU,CAAC,EAAE;IAChFtJ,MAAM,CAACgJ,OAAO,CAAC,kBAAkBK,QAAQ,CAAClD,MAAM,QAAQmD,YAAY,IAAIxH,aAAa,OAAO/B,UAAU,EAAE,CAAC;IACzGC,MAAM,CAACoG,KAAK,CAAC,aAAaiD,QAAQ,CAAClD,MAAM,MAAMV,IAAI,CAACC,SAAS,CAAC2D,QAAQ,CAAC,GAAG,CAAC;IAC3E,MAAMrB,KAAK,GAAG,IAAAC,sBAAQ,EAACnG,aAAa,CAAC;IACrC,MAAMyH,iBAAiB,GAAG,IAAAtB,sBAAQ,EAACqB,YAAY,CAAC;IAChD,MAAM/I,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACkJ,SAAS,CAAC;MACxCnH,aAAa,EAAEkG;IACjB,CAAC,EAAE;MACDkB,IAAI,EAAE;QACJ1F,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC,CAAC;MACD8G,KAAK,EAAE;QACL,CAACI,iBAAiB,GAAG;UAACH,KAAK,EAAEC;QAAQ;MACvC;IACF,CAAC,CAAC;EACJ;EAEA,SAAS/H,QAAQA,CAAC;IAACQ,aAAa;IAAEsD,KAAK;IAAE/B,YAAY,GAAG6B,SAAS;IAAE5B,WAAW,GAAG4B;EAAS,CAAC,EAAE;IAC3F,MAAMsE,WAAW,GAAGnG,YAAY,IAAIC,WAAW,GAAG,qBAAqBmC,IAAI,CAACC,SAAS,CAACrC,YAAY,CAAC,IAAI,EAAE,qBAAqBC,WAAW,IAAI,EAAE,GAAG,GAAG,EAAE;IACvJtD,MAAM,CAAC4D,IAAI,CAAC,4BAA4BwB,KAAK,QAAQtD,aAAa,GAAG0H,WAAW,OAAOzJ,UAAU,EAAE,CAAC;IAEpG,MAAM0J,sBAAsB,GAAG7C,MAAM,CAAC8C,MAAM,CAAChH,2BAAgB,CAAC,CAAC4F,OAAO,CAAClD,KAAK,CAAC,GAAG,CAAC,CAAC;IAClF,MAAMuE,+BAA+B,GAAG/C,MAAM,CAAC8C,MAAM,CAAChH,2BAAgB,CAACC,SAAS,CAAC,CAAC2F,OAAO,CAAClD,KAAK,CAAC,GAAG,CAAC,CAAC;IACrG,MAAMwE,8BAA8B,GAAGhD,MAAM,CAAC8C,MAAM,CAAChH,2BAAgB,CAACmH,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,EAACnG,aAAa,CAAC;IACrC,MAAMgI,YAAY,GAAG;MACnBrH,cAAc,EAAE2C,KAAK;MACrB5B,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC,CAAC;MACnCgB,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,OAAOzJ,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAC7BkK,gBAAgB,CACf;MAACnI,aAAa,EAAEkG;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,SAAS3I,iBAAiBA,CAAC;IAACO,aAAa;IAAEG,SAAS;IAAEa;EAAc,CAAC,EAAE;IAErE;IACA9C,MAAM,CAAC4D,IAAI,CAAC,uCAAuC3B,SAAS,KAAKa,cAAc,SAAShB,aAAa,EAAE,CAAC;IACxG,MAAMqI,kBAAkB,GAAG,IAAAlC,sBAAQ,EAACnG,aAAa,CAAC;IAClD,MAAMsI,mBAAmB,GAAG,IAAAnC,sBAAQ,EAACnF,cAAc,CAAC;IAEpD,IAAI,EAAEb,SAAS,IAAIoI,qBAAU,CAAC,EAAE;MAC9B,MAAM,IAAIxG,qBAAQ,CAAC,KAAK,EAAE,wCAAwC,CAAC;IACrE;IAEA,IAAI,EAAEuG,mBAAmB,IAAIpH,2BAAgB,CAAC,EAAE;MAC9C,MAAM,IAAIa,qBAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAC;IACvD;IAEA,MAAMyG,WAAW,GAAGC,cAAc,CAACtI,SAAS,EAAEmI,mBAAmB,CAAC;IAGlE,SAASG,cAAcA,CAACtI,SAAS,EAAEmI,mBAAmB,EAAE;MACtD,IAAInI,SAAS,KAAKoI,qBAAU,CAACtH,MAAM,EAAE;QACnC,OAAO;UAAC,uBAAuB,EAAEqH;QAAmB,CAAC;MACvD;MACA,IAAInI,SAAS,KAAKoI,qBAAU,CAACnH,MAAM,EAAE;QACnC,OAAO;UAAC,uBAAuB,EAAEkH;QAAmB,CAAC;MACvD;MACA,IAAInI,SAAS,KAAKoI,qBAAU,CAAClH,GAAG,EAAE;QAChC,OAAO;UAAC,oBAAoB,EAAEiH;QAAmB,CAAC;MACpD;MACA,MAAM,IAAIvG,qBAAQ,CAAC,KAAK,EAAE,wCAAwC,CAAC;IACrE;IAEA,OAAOtD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACkK,gBAAgB,CAAC;MAChDnI,aAAa,EAAEqI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJ,GAAGoB,WAAW;QACd9G,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAAC0D,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;EACrD;EAEA,eAAexI,YAAYA,CAAC;IAACI,aAAa;IAAEG;EAAS,CAAC,EAAE;IACtD,MAAMuI,YAAY,GAAGvI,SAAS;IAC9B,MAAM;MAACA,SAAS,EAAEwI;IAAY,CAAC,GAAG,MAAMlK,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;MAACtF;IAAa,CAAC,CAAC;IAC1F9B,MAAM,CAAC4D,IAAI,CAAC,qCAAqC6G,YAAY,OAAOD,YAAY,QAAQ1I,aAAa,OAAO/B,UAAU,EAAE,CAAC;IACzH,MAAMoK,kBAAkB,GAAG,IAAAlC,sBAAQ,EAACnG,aAAa,CAAC;IAClD,MAAM4I,iBAAiB,GAAG,IAAAzC,sBAAQ,EAACuC,YAAY,CAAC;IAEhD,MAAM/G,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACkK,gBAAgB,CAAC;MAC9DnI,aAAa,EAAEqI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJjH,SAAS,EAAEyI,iBAAiB;QAC5BlH,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAAC0D,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnD,OAAOzG,MAAM,CAACkH,EAAE;IAChB;EACF;EAEA,eAAehJ,aAAaA,CAAC;IAACG,aAAa;IAAE8I,YAAY;IAAEC,eAAe,GAAG3F;EAAS,CAAC,EAAE;IACvF,MAAMiF,kBAAkB,GAAG,IAAAlC,sBAAQ,EAACnG,aAAa,CAAC;IAElD,MAAMgJ,SAAS,GAAG,MAAMvK,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACqH,OAAO,CAAC;MAACtF,aAAa,EAAEqI;IAAkB,CAAC,CAAC;IAC9FnK,MAAM,CAACoG,KAAK,CAAC,yBAAyBX,IAAI,CAACC,SAAS,CAACoF,SAAS,CAAC,EAAE,CAAC;IAElE,MAAMC,aAAa,GAAGD,SAAS,CAACvI,UAAU;IAE1CvC,MAAM,CAAC4D,IAAI,CAAC,sCAAsC6B,IAAI,CAACC,SAAS,CAACqF,aAAa,CAAC,cAAcH,YAAY,iBAAiBC,eAAe,QAAQ/I,aAAa,OAAO/B,UAAU,EAAE,CAAC;IAElL,MAAMiL,qBAAqB,GAAGD,aAAa,CAACjE,MAAM,CAAC7E,SAAS,IAAIA,SAAS,KAAK4I,eAAe,CAAC;IAC9F,MAAMI,2BAA2B,GAAGD,qBAAqB,CAACtD,QAAQ,CAACkD,YAAY,CAAC,GAAGI,qBAAqB,GAAG,CAAC,GAAGA,qBAAqB,EAAEJ,YAAY,CAAC;IAEnJ5K,MAAM,CAACoG,KAAK,CAAC,0BAA0B4E,qBAAqB,EAAE,CAAC;IAC/DhL,MAAM,CAACoG,KAAK,CAAC,+BAA+B6E,2BAA2B,EAAE,CAAC;IAE1E,MAAMxH,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACkK,gBAAgB,CAAC;MAC9DnI,aAAa,EAAEqI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJ3G,UAAU,EAAE0I,2BAA2B;QACvCzH,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAAC0D,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnD,OAAOzG,MAAM,CAACkH,EAAE;IAChB;EACF;EAEA,eAAe/I,WAAWA,CAAC;IAACE;EAAa,CAAC,EAAE;IAC1C,MAAMqI,kBAAkB,GAAG,IAAAlC,sBAAQ,EAACnG,aAAa,CAAC;IAElD,MAAM2B,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACkK,gBAAgB,CAAC;MAC9DnI,aAAa,EAAEqI,kBAAkB;MACjC1H,cAAc,EAAEC,2BAAgB,CAACC,SAAS,CAAC6B;IAC7C,CAAC,EAAE;MACD0G,IAAI,EAAE;QACJrI,QAAQ,EAAE;MACZ,CAAC;MACDqG,IAAI,EAAE;QACJ1F,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAAC0D,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnDlK,MAAM,CAACgJ,OAAO,CAAC,+BAA+BvD,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAC,EAAE,CAAC;IACvE,OAAOA,MAAM;EACf;EAEA,eAAe5B,WAAWA,CAAC;IAACC,aAAa;IAAEe;EAAQ,CAAC,EAAE;IACpD,MAAMsH,kBAAkB,GAAG,IAAAlC,sBAAQ,EAACnG,aAAa,CAAC;IAClD,MAAMqJ,aAAa,GAAG,IAAAlD,sBAAQ,EAACpF,QAAQ,CAAC;IAExC,MAAMY,MAAM,GAAG,MAAMlD,EAAE,CAACR,UAAU,CAACA,UAAU,CAAC,CAACkK,gBAAgB,CAAC;MAC9DnI,aAAa,EAAEqI;IACjB,CAAC,EAAE;MACDjB,IAAI,EAAE;QACJrG,QAAQ,EAAEsI,aAAa;QACvB3H,gBAAgB,EAAE,IAAApB,eAAM,EAAC,CAAC,CAACC,MAAM,CAAC;MACpC;IACF,CAAC,EAAE;MAAC0D,UAAU,EAAE;QAACW,GAAG,EAAE;MAAC,CAAC;MAAEwD,iBAAiB,EAAE;IAAI,CAAC,CAAC;IAEnDlK,MAAM,CAACgJ,OAAO,CAAC,+BAA+BvD,IAAI,CAACC,SAAS,CAACjC,MAAM,CAAC,EAAE,CAAC;IACvE,OAAOA,MAAM;EACf;AAEF","ignoreList":[]}
1
+ {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_debug","_default","MONGO_URI","collection","db","logger","createLogger","debug","createDebugLogger","debugDev","extend","client","MongoClient","connect","dbConnection","gridFSBucket","GridFSBucket","bucketName","operator","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","createProjection","queryById","checkTimeOut","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","FIX","records","errorMessage","errorStatus","creationTime","modificationTime","JSON","stringify","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","state","timeOut","params","showParams","limit","skip","rest","find","projection","parseInt","toArray","length","silly","showAll","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","combinedShowParams","parseBoolean","_id","showParamToField","Object","keys","filter","param","map","excludeObject","fromEntries","checkModTime","findOne","oldState","ABORT","ERROR","DONE","includes","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","clean","sanitize","noContent","deleteResult","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","filename","firstBucketResult","fileId","delete","cleanQueueItemState","options","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","forEach","key","findOneAndUpdate","returnDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","getNewJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError, parseBoolean} 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';\nimport createDebugLogger from 'debug';\n\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, db = 'rest-api') {\n const logger = createLogger();\n const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons/mongo');\n const debugDev = debug.extend(':dev');\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI);\n const dbConnection = client.db(db);\n const gridFSBucket = new GridFSBucket(dbConnection, {bucketName: collection});\n const operator = dbConnection.collection(collection);\n debugDev(`mongo: ${MONGO_URI}, db: ${db}, collection: ${collection}`);\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, createProjection, queryById, checkTimeOut, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n debugDev('createPrio');\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 FIX: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n debugDev(`Inserting: ${JSON.stringify(newQueueItem)} to ${collection}}`);\n const result = await operator.insertOne(newQueueItem);\n debugDev(JSON.stringify(result));\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n // TEST-COVERAGE: this error is not (currently) tested\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n // TEST-COVERAGE: this error is not (currently) tested\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 FIX: 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 debug(`Creating streamBulk`);\n try {\n await 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 logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n debug(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return operator.insertOne(newQueueItem);\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 debug(`Creating noStreamBulk`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await operator.insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n debug(`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 // TEST-COVERAGE: this error is not (currently) tested\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n // TEST-COVERAGE: this error is not (currently) tested\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 // Optionally set also queueItems errorStatus & errorMessage\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/DONE\n // otherwise it sets queueItem and importJobStates to state ABORT and add errorStatus and errorMessage (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 importJobState\n // Note: checkAndSetImportJobState cannot be used to set queueItems errorStatus & errorMessage (expect in case of a TimeOut)\n async function checkAndSetImportJobState({correlationId, operation, importJobState}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR/DONE\n // otherwise it sets queueItem and importJobStates to state ABORT and errorStatue and errorMessage (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});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await operator.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 debug(`${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 debug(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n const combinedShowParams = {\n showAll,\n showOperations,\n showOperationSettings,\n showRecordLoadParams,\n showImportJobState\n };\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n debug(`${JSON.stringify(combinedShowParams)}`);\n\n // NOTE: parseBoolean parses any non-empty, non-\"false\" string as true!\n if (parseBoolean(showAll)) {\n //if (showAll === true || showAll === '1' || showAll === 1) {\n debug(`ShowAll: ${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(combinedShowParams)\n //.filter(param => param !== 'showAll' && combinedShowParams[param] !== true && combinedShowParams[param] !== 1 && combinedShowParams[param] !== '1')\n .filter(param => param !== 'showAll' && !parseBoolean(combinedShowParams[param]))\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.silly(`We want to exclude from projection: ${JSON.stringify(result)}`);\n debug(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.silly(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n debug(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n\n\n return {\n _id: 0,\n ...excludeObject\n };\n }\n\n // Note: edited in v4.2.4 to return queueItem *after* possible timout has aborted it\n // Note: previous versions returned queueItem *before* its state/queueItemState is timeOuted\n async function queryById({correlationId, checkModTime = false}) {\n if (checkModTime) {\n debug(`queryById checkModTime: ${checkModTime}`);\n await checkTimeOut({correlationId});\n return queryById({correlationId});\n }\n const result = await operator.findOne({correlationId}, {projection: {_id: 0}});\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 or DONE return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueItemState: oldState, importJobState} = await operator.findOne({correlationId});\n //debug(`${modificationTime} - oldState: ${oldState}`);\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(`${correlationId} 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 if (!finalImportJobStates.includes(importJobState.FIX)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'FIX', 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 // eslint-disable-next-line max-statements\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n debug(`${JSON.stringify(params)}`);\n debug(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n debug(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent({correlationId: params.correlationId});\n debug(`noContent (removeContent result): ${JSON.stringify(noContent)}`);\n if (noContent) {\n const deleteResult = await operator.deleteOne({correlationId: clean});\n debug(`deleteResult: ${JSON.stringify(deleteResult)}`);\n return true;\n }\n } catch (err) {\n // TEST-COVERAGE: this error is not (currently) tested\n if (err instanceof MongoDriverError) {\n debug(err);\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 debug(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await operator.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 debug(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n\n const clean = sanitize(correlationId);\n debug(clean);\n\n const result = await operator.findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n debug(result);\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n debug(`Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`);\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 debug(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await gridFSBucket.find({filename: clean}).toArray();\n debug(`mongo/removeContent: find bucket result ${JSON.stringify(result)}`);\n\n\n if (result.length > 0) {\n // Note: we assume and handle just one file for filename!\n const [firstBucketResult] = result;\n const fileId = firstBucketResult._id;\n\n await gridFSBucket.delete(fileId);\n return true;\n }\n\n logger.debug(`No files for ${params.correlationId} to delete`);\n return true;\n }\n\n function getOne({queueItemState, importJobState = undefined}) {\n //params example: \"queueItemState\": \"IMPORTER.IN_QUEUE\", \"importJobState\":{\"importJobState.UPDATE\": \"IN_QUEUE\"}\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n //debug(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n const options = {projection: {_id: 0}};\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 //debug(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return operator.findOne({...cleanQueueItemState}, options);\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n //debug(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return operator.findOne({...importJobState}, options);\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n //debug(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return operator.findOne({...cleanQueueItemState, ...importJobState}, options);\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 // TEST-COVERAGE: this error is not (currently) tested\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 operator.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 debug(`${messageField} -> ${cleanMessageField}`);\n await operator.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 debug(`Trying to set invalid state ${state}`);\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 operator\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnDocument: 'after'}\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 debug(`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 debug(`Error: ${operation} is not in ${JSON.stringify(OPERATIONS)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n debug(`Error: ${cleanImportJobState} is not in ${JSON.stringify(IMPORT_JOB_STATE)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, 'Invalid import job state');\n }\n\n const newJobState = getNewJobState(operation, cleanImportJobState);\n\n\n function getNewJobState(operation, cleanImportJobState) {\n if (operation === OPERATIONS.CREATE) {\n return {'importJobState.CREATE': cleanImportJobState};\n }\n if (operation === OPERATIONS.UPDATE) {\n return {'importJobState.UPDATE': cleanImportJobState};\n }\n if (operation === OPERATIONS.FIX) {\n return {'importJobState.FIX': cleanImportJobState};\n }\n // istanbul ignore next\n // Ignoring for coverage - we error this already\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n return operator.findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnDocument: 'after'});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await operator.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 operator.findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnDocument: 'after'});\n debugDev(`${JSON.stringify(result)}`);\n return result.ok || result;\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 operator.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 operator.findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnDocument: 'after'});\n debugDev(`${JSON.stringify(result)}`);\n return result.ok || result;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await operator.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}, returnDocument: 'after'});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n debugDev(`${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 operator.findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnDocument: 'after'});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n debugDev(`${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
package/dist/mongoLog.js CHANGED
@@ -23,10 +23,7 @@ async function _default(MONGO_URI, dbName = 'rest-api') {
23
23
  const logger = (0, _melindaBackendCommons.createLogger)();
24
24
 
25
25
  // Connect to mongo (MONGO)
26
- const client = await _mongodb.MongoClient.connect(MONGO_URI, {
27
- useNewUrlParser: true,
28
- useUnifiedTopology: true
29
- });
26
+ const client = await _mongodb.MongoClient.connect(MONGO_URI);
30
27
  const db = client.db(dbName);
31
28
  const collection = 'logs';
32
29
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","_default","MONGO_URI","dbName","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","getListOfCatalogers","getListOfCorrelationIds","getExpandedListOfLogs","protect","remove","removeBySequences","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","errorMessage","payload","message","logError","limit","skip","rest","debug","JSON","stringify","find","sort","parseInt","toArray","length","LOG_ITEM_TYPE","MERGE_LOG","distinct","logItemTypes","MATCH_LOG","catalogers","dateBefore","Date","dateAfter","test","silly","generateMatchObject","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","matchOptions","toISOString","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","force","clean","$ne","deleteMany","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\n/**\n * Create log operator\n * @param {String} MONGO_URI connnection address to mongo\n * @param {String} dbName Mongo DB name, defaults 'rest-api'\n * @returns {Object} containing all log handling functions\n */\nexport default async function (MONGO_URI, dbName = 'rest-api') {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db(dbName);\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getListOfCatalogers, getListOfCorrelationIds, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n /**\n * Add log item to collection\n * @param {Object} logItem contains log item data\n * @returns void\n */\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n // console.log(newLogItem); // eslint-disable-line\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n // console.log('addLogItem done', result); // eslint-disable-line\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Query log items\n * @param {Integer} limit defaults 5\n * @param {Integer} skip defaults 0\n * @param {Object} rest query params\n * @returns result array\n */\n async function query({limit = 5, skip = 0, ...rest}) {\n logger.debug(`Query params: ${JSON.stringify(rest)}`);\n logger.debug(`Limit and skip params: ${limit} | ${skip}`);\n checkLogItemType(rest.logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({creationTime: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n //logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n // DEVELOP: queryById returns jsut one (randomish) log! is this useful?\n /**\n * Get single log item by correlationId\n * @param {String} correlationId\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @param {Integer} skip defaults 0\n * @param {Integer} limit defaults 1\n * @returns query result array\n */\n async function queryById(correlationId, logItemType = LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationId}, logItemType: ${logItemType}, skip: ${skip}, limit: ${limit}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId, logItemType})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n // getListOfLogs returns list of correlationIds that have logs of given logItemType\n // if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG\n /**\n * Get list of correlationIds of logs filtered by logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @returns Array of query results\n */\n async function getListOfLogs(logItemType = LOG_ITEM_TYPE.MERGE_LOG) {\n checkLogItemType(logItemType, true, true);\n //logger.debug(logItemType);\n // eslint-disable-next-line no-console\n // console.log(`${JSON.stringify(logItemType)}`);\n const result = await db.collection(collection)\n .distinct('correlationId', {logItemType: `${logItemType}`});\n logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : 'Not found!'}`);\n return result;\n }\n\n /**\n * Get list of catalogers from all available logs\n * @returns Array of query results\n */\n async function getListOfCatalogers() {\n logger.debug(`Getting list of Catalogers`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('cataloger');\n\n return result;\n }\n\n /**\n * Get list of correlationIds from all available logs\n * @returns Array of query results\n */\n async function getListOfCorrelationIds() {\n logger.debug(`Getting list of CorrelationIds`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId');\n\n return result;\n }\n\n\n /**\n * Get filtered list of logs with extra info. Give params in Object\n * @param {[String]} logItemTypes: String array of logItemTypes. Defaults [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG]\n * @param {[String]} catalogers: String array of wanted catalogers. Defaults []\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'. Defaults new Date()\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'. Defaults '2000-01-01'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Parsed Object {'correlationId', 'logItemType', 'creationTime', 'cataloger', 'logCount'}\n */\n async function getExpandedListOfLogs({logItemTypes = [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG], catalogers = [], dateBefore = new Date(), dateAfter = '2000-01-01', test = false}) {\n logger.debug(`commons/getExpandedListOfLogs: logItemTypes: ${JSON.stringify(logItemTypes)}, dateAfter: ${dateAfter}, dateBefore: ${dateBefore}}, catalogers: ${JSON.stringify(catalogers)}`);\n logger.silly(JSON.stringify(generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter}))); // eslint-disable-line\n //checkLogItemType(logItemType, false, false);\n //logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test}),\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n },\n {\n '$group':\n {\n '_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}\n }\n },\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n }\n ];\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return fixedResult;\n\n /**\n * Generate match object for aggregation pipeline\n * @param {[String]} logItemTypes: String array of logItemTypes.\n * @param {[String]} catalogers: String array of wanted catalogers\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Match Object\n */\n function generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test = false}) {\n const matchOptions = {\n '$match': {\n 'logItemType': logItemTypes.length > 0 ? {'$in': logItemTypes} : /.*/ui,\n 'cataloger': catalogers.length > 0 ? {'$in': catalogers} : /.*/ui,\n 'creationTime': {\n '$gte': test ? new Date(dateAfter).toISOString() : new Date(dateAfter),\n '$lte': test ? new Date(dateBefore).toISOString() : new Date(dateBefore)\n }\n }\n };\n\n return matchOptions;\n }\n }\n\n /**\n * Protect logs from cleaning. Forced cleaning defaults 30days\n * @param {String} correlationId\n * @param {Integer} blobSequence\n * @returns result\n */\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs\n * @param {String} correlationId\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs by sequences\n * @param {String} correlationId\n * @param {[Integer]} sequences\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Checks existence and validity of logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE\n * @param {Boolean} errorUnknown defaults false\n * @param {Boolean} errorNotExisting defaults false\n * @returns void\n */\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","_default","MONGO_URI","dbName","logger","createLogger","client","MongoClient","connect","db","collection","addLogItem","query","queryById","getListOfLogs","getListOfCatalogers","getListOfCorrelationIds","getExpandedListOfLogs","protect","remove","removeBySequences","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","errorMessage","payload","message","logError","limit","skip","rest","debug","JSON","stringify","find","sort","parseInt","toArray","length","LOG_ITEM_TYPE","MERGE_LOG","distinct","logItemTypes","MATCH_LOG","catalogers","dateBefore","Date","dateAfter","test","silly","generateMatchObject","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","matchOptions","toISOString","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","force","clean","$ne","deleteMany","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\n/**\n * Create log operator\n * @param {String} MONGO_URI connnection address to mongo\n * @param {String} dbName Mongo DB name, defaults 'rest-api'\n * @returns {Object} containing all log handling functions\n */\nexport default async function (MONGO_URI, dbName = 'rest-api') {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI);\n const db = client.db(dbName);\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getListOfCatalogers, getListOfCorrelationIds, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n /**\n * Add log item to collection\n * @param {Object} logItem contains log item data\n * @returns void\n */\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n // console.log(newLogItem); // eslint-disable-line\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n // console.log('addLogItem done', result); // eslint-disable-line\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Query log items\n * @param {Integer} limit defaults 5\n * @param {Integer} skip defaults 0\n * @param {Object} rest query params\n * @returns result array\n */\n async function query({limit = 5, skip = 0, ...rest}) {\n logger.debug(`Query params: ${JSON.stringify(rest)}`);\n logger.debug(`Limit and skip params: ${limit} | ${skip}`);\n checkLogItemType(rest.logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({creationTime: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n //logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n // DEVELOP: queryById returns jsut one (randomish) log! is this useful?\n /**\n * Get single log item by correlationId\n * @param {String} correlationId\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @param {Integer} skip defaults 0\n * @param {Integer} limit defaults 1\n * @returns query result array\n */\n async function queryById(correlationId, logItemType = LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationId}, logItemType: ${logItemType}, skip: ${skip}, limit: ${limit}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId, logItemType})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n // getListOfLogs returns list of correlationIds that have logs of given logItemType\n // if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG\n /**\n * Get list of correlationIds of logs filtered by logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @returns Array of query results\n */\n async function getListOfLogs(logItemType = LOG_ITEM_TYPE.MERGE_LOG) {\n checkLogItemType(logItemType, true, true);\n //logger.debug(logItemType);\n // eslint-disable-next-line no-console\n // console.log(`${JSON.stringify(logItemType)}`);\n const result = await db.collection(collection)\n .distinct('correlationId', {logItemType: `${logItemType}`});\n logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : 'Not found!'}`);\n return result;\n }\n\n /**\n * Get list of catalogers from all available logs\n * @returns Array of query results\n */\n async function getListOfCatalogers() {\n logger.debug(`Getting list of Catalogers`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('cataloger');\n\n return result;\n }\n\n /**\n * Get list of correlationIds from all available logs\n * @returns Array of query results\n */\n async function getListOfCorrelationIds() {\n logger.debug(`Getting list of CorrelationIds`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId');\n\n return result;\n }\n\n\n /**\n * Get filtered list of logs with extra info. Give params in Object\n * @param {[String]} logItemTypes: String array of logItemTypes. Defaults [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG]\n * @param {[String]} catalogers: String array of wanted catalogers. Defaults []\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'. Defaults new Date()\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'. Defaults '2000-01-01'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Parsed Object {'correlationId', 'logItemType', 'creationTime', 'cataloger', 'logCount'}\n */\n async function getExpandedListOfLogs({logItemTypes = [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG], catalogers = [], dateBefore = new Date(), dateAfter = '2000-01-01', test = false}) {\n logger.debug(`commons/getExpandedListOfLogs: logItemTypes: ${JSON.stringify(logItemTypes)}, dateAfter: ${dateAfter}, dateBefore: ${dateBefore}}, catalogers: ${JSON.stringify(catalogers)}`);\n logger.silly(JSON.stringify(generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter}))); // eslint-disable-line\n //checkLogItemType(logItemType, false, false);\n //logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test}),\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n },\n {\n '$group':\n {\n '_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}\n }\n },\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n }\n ];\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return fixedResult;\n\n /**\n * Generate match object for aggregation pipeline\n * @param {[String]} logItemTypes: String array of logItemTypes.\n * @param {[String]} catalogers: String array of wanted catalogers\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Match Object\n */\n function generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test = false}) {\n const matchOptions = {\n '$match': {\n 'logItemType': logItemTypes.length > 0 ? {'$in': logItemTypes} : /.*/ui,\n 'cataloger': catalogers.length > 0 ? {'$in': catalogers} : /.*/ui,\n 'creationTime': {\n '$gte': test ? new Date(dateAfter).toISOString() : new Date(dateAfter),\n '$lte': test ? new Date(dateBefore).toISOString() : new Date(dateBefore)\n }\n }\n };\n\n return matchOptions;\n }\n }\n\n /**\n * Protect logs from cleaning. Forced cleaning defaults 30days\n * @param {String} correlationId\n * @param {Integer} blobSequence\n * @returns result\n */\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs\n * @param {String} correlationId\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs by sequences\n * @param {String} correlationId\n * @param {[Integer]} sequences\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Checks existence and validity of logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE\n * @param {Boolean} errorUnknown defaults false\n * @param {Boolean} errorNotExisting defaults false\n * @returns void\n */\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/melinda-rest-api-commons.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "4.2.3-alpha.1",
17
+ "version": "4.2.4-alpha.11",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=18"
@@ -28,32 +28,32 @@
28
28
  "lint": "eslint ./src",
29
29
  "lint:dev": "eslint ./src --fix",
30
30
  "test": "npm run lint && npm run test:base",
31
- "test:base": "cross-env NODE_ENV=test nyc mocha --package ./package.json --exclude src/amqp.health.spec.js --exclude src/amqp.tests.spec.js",
32
- "test:dev": "npm run lint:dev && cross-env NODE_ENV=test nyc mocha --package ./package.json --exclude src/amqp.health.spec.js --exclude src/amqp.tests.spec.js",
33
- "test:local": "cross-env NODE_ENV=test nyc mocha --package ./package.json -- src/amqp.*.spec.js",
34
- "test:healthcheck": "cross-env NODE_ENV=test nyc mocha --require @babel/register -- src/amqp.health.spec.js",
31
+ "test:base": "cross-env NODE_ENV=test nyc mocha --package ./package.json --exclude tests/amqp.health.spec.js --exclude tests/amqp.tests.spec.js",
32
+ "test:dev": "npm run lint:dev && cross-env NODE_ENV=test nyc mocha --package ./package.json --exclude tests/amqp.health.spec.js --exclude tests/amqp.tests.spec.js",
33
+ "test:local": "cross-env NODE_ENV=test nyc mocha --package ./package.json -- tests/amqp.*.spec.js",
34
+ "test:healthcheck": "cross-env NODE_ENV=test nyc mocha --require @babel/register -- tests/amqp.health.spec.js",
35
35
  "dev": "nodemon",
36
36
  "dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test nodemon"
37
37
  },
38
38
  "dependencies": {
39
- "@natlibfi/marc-record": "^9.1.1",
40
- "@natlibfi/marc-record-serializers": "^10.1.4",
41
- "@natlibfi/marc-record-validate": "^8.0.11",
42
- "@natlibfi/marc-record-validators-melinda": "^11.4.8",
43
- "@natlibfi/melinda-backend-commons": "^2.3.5",
44
- "@natlibfi/melinda-commons": "^13.0.18",
45
- "amqplib": "^0.10.4",
46
- "debug": "^4.3.7",
39
+ "@natlibfi/marc-record": "^9.1.3",
40
+ "@natlibfi/marc-record-serializers": "^10.1.5",
41
+ "@natlibfi/marc-record-validate": "^8.0.12",
42
+ "@natlibfi/marc-record-validators-melinda": "^11.5.3",
43
+ "@natlibfi/melinda-backend-commons": "^2.3.6",
44
+ "@natlibfi/melinda-commons": "^13.0.19",
45
+ "amqplib": "^0.10.5",
46
+ "debug": "^4.4.0",
47
47
  "http-status": "^2.1.0",
48
48
  "moment": "^2.30.1",
49
49
  "mongo-sanitize": "^1.1.0",
50
- "mongodb": "^4.17.2"
50
+ "mongodb": "^6.12.0"
51
51
  },
52
52
  "devDependencies": {
53
- "@babel/cli": "^7.25.9",
54
- "@babel/core": "^7.26.0",
53
+ "@babel/cli": "^7.26.4",
54
+ "@babel/core": "^7.26.7",
55
55
  "@babel/plugin-transform-runtime": "^7.25.9",
56
- "@babel/preset-env": "^7.26.0",
56
+ "@babel/preset-env": "^7.26.7",
57
57
  "@babel/register": "^7.25.9",
58
58
  "@natlibfi/eslint-config-melinda-backend": "^3.0.5",
59
59
  "@natlibfi/fixugen": "^2.0.12",
@@ -64,8 +64,8 @@
64
64
  "chai": "^4.5.0",
65
65
  "cross-env": "^7.0.3",
66
66
  "eslint": "^8.57.1",
67
- "mocha": "^11.0.1",
68
- "nodemon": "^3.1.7",
67
+ "mocha": "^11.1.0",
68
+ "nodemon": "^3.1.9",
69
69
  "nyc": "^17.1.0"
70
70
  },
71
71
  "overrides": {
@@ -99,8 +99,8 @@
99
99
  },
100
100
  "mocha": {
101
101
  "spec": [
102
- "src/*.spec.js",
103
- "src/**/*.spec.js"
102
+ "tests/*.spec.js",
103
+ "tests/**/*.spec.js"
104
104
  ],
105
105
  "require": [
106
106
  "@babel/register"
@@ -108,19 +108,21 @@
108
108
  "inline-diffs": true,
109
109
  "maxDiffSize": 25000,
110
110
  "bail": true,
111
- "exit": true
111
+ "exit": true,
112
+ "timeout": 10000
112
113
  },
113
114
  "nodemonConfig": {
114
115
  "exec": "npm run test:dev",
115
116
  "watch": [
117
+ "tests/*",
116
118
  "src/*",
117
119
  "test-fixtures/*"
118
120
  ]
119
121
  },
120
122
  "nyc": {
121
123
  "exclude": [
122
- "src/*.spec.js",
123
- "src/**/*.spec.js"
124
+ "tests/*.spec.js",
125
+ "tests/**/*.spec.js"
124
126
  ],
125
127
  "reporter": [
126
128
  "text"
@@ -1,41 +1,48 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _debug = _interopRequireDefault(require("debug"));
5
- var _index = require("./index");
6
- var _util = require("util");
7
1
  //import {expect} from 'chai';
2
+ import createDebugLogger from 'debug';
3
+ import {amqpFactory} from '../src/index';
4
+
8
5
 
9
- const debug = (0, _debug.default)('@natlibfi/melinda-rest-api-commons:amqp:test');
6
+ const debug = createDebugLogger('@natlibfi/melinda-rest-api-commons:amqp:test');
10
7
  //const debugData = debug.extend('data');
11
8
 
12
- const setTimeoutPromise = (0, _util.promisify)(setTimeout);
9
+ import {promisify} from 'util';
10
+ const setTimeoutPromise = promisify(setTimeout);
11
+
13
12
  describe('HealthCheck: amqpOperator should error if channel or connection fails', () => {
13
+
14
14
  it('FIX: test healthCheck - this test does not really test anything, but error can be seen in debug!', async () => {
15
15
  debug(`Testing amqp against a local AMQP instance - we'll need some kind of mockup for this`);
16
16
  const amqpUrl = 'amqp://127.0.0.1:5672/';
17
- const amqpOperator = await (0, _index.amqpFactory)(amqpUrl, true);
17
+
18
+ const amqpOperator = await amqpFactory(amqpUrl, true);
18
19
  debug(`Connecting to ${amqpUrl}, with healthCheck running`);
19
20
  await awaitTime(amqpOperator, false);
21
+
20
22
  debug(`Testing healthCheckLoop for ${amqpOperator}`);
21
23
  debug(`Waiting 0.5s and expecting healthCheckLoop to work`);
22
24
  await awaitTime(amqpOperator, false);
23
25
  debug(`Amqp Operator should have been alive.`);
26
+
24
27
  debug(`Testing healthCheckLoop with closed channel`);
25
28
  debug(`Waiting 0.5s and expecting healthCheckLoop to throw error`);
26
29
  await awaitTime(amqpOperator, true);
27
30
  debug(`Amqp Operator should have been errored.`);
31
+
28
32
  debug(`Closing connection`);
29
33
  await amqpOperator.closeConnection();
34
+
30
35
  async function awaitTime(amqpOperator, close) {
31
36
  if (close) {
32
37
  await amqpOperator.closeChannel();
33
38
  await setTimeoutPromise(500);
34
39
  return;
35
40
  }
41
+
36
42
  await setTimeoutPromise(500);
37
43
  return;
38
44
  }
45
+
39
46
  });
40
47
  });
41
- //# sourceMappingURL=amqp.health.spec.js.map
48
+