@natlibfi/melinda-rest-api-commons 4.1.10-alpha.1 → 4.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/constants.js CHANGED
@@ -36,7 +36,8 @@ const IMPORT_JOB_STATE = exports.IMPORT_JOB_STATE = {
36
36
  };
37
37
  const OPERATIONS = exports.OPERATIONS = {
38
38
  CREATE: 'CREATE',
39
- UPDATE: 'UPDATE'
39
+ UPDATE: 'UPDATE',
40
+ FIX: 'FIX'
40
41
  };
41
42
  const CHUNK_SIZE = exports.CHUNK_SIZE = 100;
42
43
 
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["QUEUE_ITEM_STATE","exports","VALIDATOR","PENDING_QUEUING","PENDING_VALIDATION","QUEUING_IN_PROGRESS","UPLOADING","VALIDATING","WAITING_FOR_RECORDS","IMPORTER","IMPORTING","IN_PROCESS","IN_QUEUE","DONE","ERROR","ABORT","IMPORT_JOB_STATE","EMPTY","QUEUING","PROCESSING","OPERATIONS","CREATE","UPDATE","CHUNK_SIZE","LOG_ITEM_TYPE","INPUT_RECORD_LOG","MERGE_LOG","MATCH_LOG","RESULT_RECORD_LOG","SPLITTER_LOG","LOAD_PROCESS_LOG","CONVERSION_FORMATS","MARCXML","ISO2709","JSON","ALEPHSEQ"],"sources":["../src/constants.js"],"sourcesContent":["// QueueItemState flows: see README.md\n\nexport const QUEUE_ITEM_STATE = {\n VALIDATOR: {\n PENDING_QUEUING: 'PENDING_QUEUING',\n PENDING_VALIDATION: 'PENDING_VALIDATION',\n QUEUING_IN_PROGRESS: 'QUEUING_IN_PROGRESS',\n UPLOADING: 'UPLOADING',\n VALIDATING: 'VALIDATING',\n WAITING_FOR_RECORDS: 'WAITING_FOR_RECORDS'\n },\n IMPORTER: {\n IMPORTING: 'IMPORTING',\n IN_PROCESS: 'IN_PROCESS',\n IN_QUEUE: 'IN_QUEUE'\n },\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const IMPORT_JOB_STATE = {\n EMPTY: 'EMPTY',\n QUEUING: 'QUEUING',\n IN_QUEUE: 'IN_QUEUE',\n IMPORTING: 'IMPORTING',\n PROCESSING: 'PROCESSING',\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const OPERATIONS = {\n CREATE: 'CREATE',\n UPDATE: 'UPDATE'\n};\n\nexport const CHUNK_SIZE = 100;\n\n// We could configure here whether a logItemType is for a several records of a single record\n// ie. whether is has bulkSequence or bulkSequenceStart & bulkSequenceEnd\nexport const LOG_ITEM_TYPE = {\n INPUT_RECORD_LOG: 'INPUT_RECORD_LOG',\n MERGE_LOG: 'MERGE_LOG',\n MATCH_LOG: 'MATCH_LOG',\n RESULT_RECORD_LOG: 'RESULT_RECORD_LOG',\n SPLITTER_LOG: 'SPLITTER_LOG',\n LOAD_PROCESS_LOG: 'LOAD_PROCESS_LOG'\n};\n\nexport const CONVERSION_FORMATS = {\n MARCXML: 'MARCXML',\n ISO2709: 'ISO2709',\n JSON: 'JSON',\n ALEPHSEQ: 'ALEPHSEQ'\n};\n"],"mappings":";;;;;;AAAA;;AAEO,MAAMA,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG;EAC9BE,SAAS,EAAE;IACTC,eAAe,EAAE,iBAAiB;IAClCC,kBAAkB,EAAE,oBAAoB;IACxCC,mBAAmB,EAAE,qBAAqB;IAC1CC,SAAS,EAAE,WAAW;IACtBC,UAAU,EAAE,YAAY;IACxBC,mBAAmB,EAAE;EACvB,CAAC;EACDC,QAAQ,EAAE;IACRC,SAAS,EAAE,WAAW;IACtBC,UAAU,EAAE,YAAY;IACxBC,QAAQ,EAAE;EACZ,CAAC;EACDC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE;AACT,CAAC;AAEM,MAAMC,gBAAgB,GAAAf,OAAA,CAAAe,gBAAA,GAAG;EAC9BC,KAAK,EAAE,OAAO;EACdC,OAAO,EAAE,SAAS;EAClBN,QAAQ,EAAE,UAAU;EACpBF,SAAS,EAAE,WAAW;EACtBS,UAAU,EAAE,YAAY;EACxBN,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE;AACT,CAAC;AAEM,MAAMK,UAAU,GAAAnB,OAAA,CAAAmB,UAAA,GAAG;EACxBC,MAAM,EAAE,QAAQ;EAChBC,MAAM,EAAE;AACV,CAAC;AAEM,MAAMC,UAAU,GAAAtB,OAAA,CAAAsB,UAAA,GAAG,GAAG;;AAE7B;AACA;AACO,MAAMC,aAAa,GAAAvB,OAAA,CAAAuB,aAAA,GAAG;EAC3BC,gBAAgB,EAAE,kBAAkB;EACpCC,SAAS,EAAE,WAAW;EACtBC,SAAS,EAAE,WAAW;EACtBC,iBAAiB,EAAE,mBAAmB;EACtCC,YAAY,EAAE,cAAc;EAC5BC,gBAAgB,EAAE;AACpB,CAAC;AAEM,MAAMC,kBAAkB,GAAA9B,OAAA,CAAA8B,kBAAA,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE,SAAS;EAClBC,IAAI,EAAE,MAAM;EACZC,QAAQ,EAAE;AACZ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"constants.js","names":["QUEUE_ITEM_STATE","exports","VALIDATOR","PENDING_QUEUING","PENDING_VALIDATION","QUEUING_IN_PROGRESS","UPLOADING","VALIDATING","WAITING_FOR_RECORDS","IMPORTER","IMPORTING","IN_PROCESS","IN_QUEUE","DONE","ERROR","ABORT","IMPORT_JOB_STATE","EMPTY","QUEUING","PROCESSING","OPERATIONS","CREATE","UPDATE","FIX","CHUNK_SIZE","LOG_ITEM_TYPE","INPUT_RECORD_LOG","MERGE_LOG","MATCH_LOG","RESULT_RECORD_LOG","SPLITTER_LOG","LOAD_PROCESS_LOG","CONVERSION_FORMATS","MARCXML","ISO2709","JSON","ALEPHSEQ"],"sources":["../src/constants.js"],"sourcesContent":["// QueueItemState flows: see README.md\n\nexport const QUEUE_ITEM_STATE = {\n VALIDATOR: {\n PENDING_QUEUING: 'PENDING_QUEUING',\n PENDING_VALIDATION: 'PENDING_VALIDATION',\n QUEUING_IN_PROGRESS: 'QUEUING_IN_PROGRESS',\n UPLOADING: 'UPLOADING',\n VALIDATING: 'VALIDATING',\n WAITING_FOR_RECORDS: 'WAITING_FOR_RECORDS'\n },\n IMPORTER: {\n IMPORTING: 'IMPORTING',\n IN_PROCESS: 'IN_PROCESS',\n IN_QUEUE: 'IN_QUEUE'\n },\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const IMPORT_JOB_STATE = {\n EMPTY: 'EMPTY',\n QUEUING: 'QUEUING',\n IN_QUEUE: 'IN_QUEUE',\n IMPORTING: 'IMPORTING',\n PROCESSING: 'PROCESSING',\n DONE: 'DONE',\n ERROR: 'ERROR',\n ABORT: 'ABORT'\n};\n\nexport const OPERATIONS = {\n CREATE: 'CREATE',\n UPDATE: 'UPDATE',\n FIX: 'FIX'\n};\n\nexport const CHUNK_SIZE = 100;\n\n// We could configure here whether a logItemType is for a several records of a single record\n// ie. whether is has bulkSequence or bulkSequenceStart & bulkSequenceEnd\nexport const LOG_ITEM_TYPE = {\n INPUT_RECORD_LOG: 'INPUT_RECORD_LOG',\n MERGE_LOG: 'MERGE_LOG',\n MATCH_LOG: 'MATCH_LOG',\n RESULT_RECORD_LOG: 'RESULT_RECORD_LOG',\n SPLITTER_LOG: 'SPLITTER_LOG',\n LOAD_PROCESS_LOG: 'LOAD_PROCESS_LOG'\n};\n\nexport const CONVERSION_FORMATS = {\n MARCXML: 'MARCXML',\n ISO2709: 'ISO2709',\n JSON: 'JSON',\n ALEPHSEQ: 'ALEPHSEQ'\n};\n"],"mappings":";;;;;;AAAA;;AAEO,MAAMA,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG;EAC9BE,SAAS,EAAE;IACTC,eAAe,EAAE,iBAAiB;IAClCC,kBAAkB,EAAE,oBAAoB;IACxCC,mBAAmB,EAAE,qBAAqB;IAC1CC,SAAS,EAAE,WAAW;IACtBC,UAAU,EAAE,YAAY;IACxBC,mBAAmB,EAAE;EACvB,CAAC;EACDC,QAAQ,EAAE;IACRC,SAAS,EAAE,WAAW;IACtBC,UAAU,EAAE,YAAY;IACxBC,QAAQ,EAAE;EACZ,CAAC;EACDC,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE;AACT,CAAC;AAEM,MAAMC,gBAAgB,GAAAf,OAAA,CAAAe,gBAAA,GAAG;EAC9BC,KAAK,EAAE,OAAO;EACdC,OAAO,EAAE,SAAS;EAClBN,QAAQ,EAAE,UAAU;EACpBF,SAAS,EAAE,WAAW;EACtBS,UAAU,EAAE,YAAY;EACxBN,IAAI,EAAE,MAAM;EACZC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE;AACT,CAAC;AAEM,MAAMK,UAAU,GAAAnB,OAAA,CAAAmB,UAAA,GAAG;EACxBC,MAAM,EAAE,QAAQ;EAChBC,MAAM,EAAE,QAAQ;EAChBC,GAAG,EAAE;AACP,CAAC;AAEM,MAAMC,UAAU,GAAAvB,OAAA,CAAAuB,UAAA,GAAG,GAAG;;AAE7B;AACA;AACO,MAAMC,aAAa,GAAAxB,OAAA,CAAAwB,aAAA,GAAG;EAC3BC,gBAAgB,EAAE,kBAAkB;EACpCC,SAAS,EAAE,WAAW;EACtBC,SAAS,EAAE,WAAW;EACtBC,iBAAiB,EAAE,mBAAmB;EACtCC,YAAY,EAAE,cAAc;EAC5BC,gBAAgB,EAAE;AACpB,CAAC;AAEM,MAAMC,kBAAkB,GAAA/B,OAAA,CAAA+B,kBAAA,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE,SAAS;EAClBC,IAAI,EAAE,MAAM;EACZC,QAAQ,EAAE;AACZ,CAAC","ignoreList":[]}
package/dist/mongo.js CHANGED
@@ -101,7 +101,8 @@ async function _default(MONGO_URI, collection) {
101
101
  blobSize: 1,
102
102
  importJobState: {
103
103
  CREATE: _constants.IMPORT_JOB_STATE.EMPTY,
104
- UPDATE: _constants.IMPORT_JOB_STATE.EMPTY
104
+ UPDATE: _constants.IMPORT_JOB_STATE.EMPTY,
105
+ FIX: _constants.IMPORT_JOB_STATE.EMPTY
105
106
  },
106
107
  records: [],
107
108
  errorMessage: '',
@@ -151,7 +152,8 @@ async function _default(MONGO_URI, collection) {
151
152
  blobSize: 0,
152
153
  importJobState: {
153
154
  CREATE: _constants.IMPORT_JOB_STATE.EMPTY,
154
- UPDATE: _constants.IMPORT_JOB_STATE.EMPTY
155
+ UPDATE: _constants.IMPORT_JOB_STATE.EMPTY,
156
+ FIX: _constants.IMPORT_JOB_STATE.EMPTY
155
157
  },
156
158
  records: [],
157
159
  errorMessage: '',
@@ -341,7 +343,7 @@ async function _default(MONGO_URI, collection) {
341
343
  return false;
342
344
  }
343
345
  const timeoutTime = (0, _moment.default)(modificationTime).add(1, 'm');
344
- logger.silly(`timeOut @ ${timeoutTime}`);
346
+ logger.silly(`${correlationId} timeOut @ ${timeoutTime}`);
345
347
  if (timeoutTime.isBefore()) {
346
348
  const finalImportJobStates = [_constants.IMPORT_JOB_STATE.ABORT, _constants.IMPORT_JOB_STATE.DONE, _constants.IMPORT_JOB_STATE.EMPTY, _constants.IMPORT_JOB_STATE.ERROR];
347
349
  if (!finalImportJobStates.includes(importJobState.CREATE)) {
@@ -360,6 +362,14 @@ async function _default(MONGO_URI, collection) {
360
362
  importJobState: _constants.IMPORT_JOB_STATE.ABORT
361
363
  });
362
364
  }
365
+ if (!finalImportJobStates.includes(importJobState.FIX)) {
366
+ // eslint-disable-line
367
+ await setImportJobState({
368
+ correlationId,
369
+ operation: 'FIX',
370
+ importJobState: _constants.IMPORT_JOB_STATE.ABORT
371
+ });
372
+ }
363
373
  await setState({
364
374
  correlationId,
365
375
  state: _constants.QUEUE_ITEM_STATE.ABORT,
@@ -591,11 +601,25 @@ async function _default(MONGO_URI, collection) {
591
601
  if (!(cleanImportJobState in _constants.IMPORT_JOB_STATE)) {
592
602
  throw new _melindaCommons.Error('400', 'Invalid import job state');
593
603
  }
594
- const newJobState = operation === _constants.OPERATIONS.CREATE ? {
595
- 'importJobState.CREATE': cleanImportJobState
596
- } : {
597
- 'importJobState.UPDATE': cleanImportJobState
598
- };
604
+ const newJobState = getNewJobState(operation, cleanImportJobState);
605
+ function getNewJobState(operation, cleanImportJobState) {
606
+ if (operation === _constants.OPERATIONS.CREATE) {
607
+ return {
608
+ 'importJobState.CREATE': cleanImportJobState
609
+ };
610
+ }
611
+ if (operation === _constants.OPERATIONS.UPDATE) {
612
+ return {
613
+ 'importJobState.UPDATE': cleanImportJobState
614
+ };
615
+ }
616
+ if (operation === _constants.OPERATIONS.FIX) {
617
+ return {
618
+ 'importJobState.FIX': cleanImportJobState
619
+ };
620
+ }
621
+ throw new _melindaCommons.Error('400', 'Invalid operation for import job state');
622
+ }
599
623
  return db.collection(collection).findOneAndUpdate({
600
624
  correlationId: cleanCorrelationId
601
625
  }, {
package/dist/mongo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","records","errorMessage","errorStatus","creationTime","modificationTime","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","payload","message","logError","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","JSON","stringify","limit","skip","rest","find","projection","createProjection","parseInt","toArray","length","silly","showAll","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","_id","showParamToField","Object","keys","filter","param","map","excludeObject","fromEntries","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","clean","sanitize","noContent","deleteOne","err","MongoDriverError","indexOf","noStream","readStream","openDownloadStreamByName","BAD_REQUEST","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","updateValues","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"sources":["../src/mongo.js"],"sourcesContent":["/* eslint-disable max-lines */\n\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n // eslint-disable-next-line max-statements\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statements\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams = {}) {\n logger.debug(`Querying: ${JSON.stringify(params)}, ${JSON.stringify(showParams)}`);\n const {limit = 1000, skip = 0, ...rest} = params;\n\n const result = await db.collection(collection).find(rest, {projection: createProjection(showParams)})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n logger.silly(`${JSON.stringify(result)}`);\n return result;\n }\n\n // We default to NOT showing operations, operationSettings, recordLoadParams and importJobState when a queueItem is queried\n // These can all be shown with showAll\n // Single fields can be shown by showOperation, showOperationSettings, showRecordLoadParams and showImportJobState\n\n function createProjection(showParams = {}) {\n logger.silly(`Creating projection for query: ${JSON.stringify(showParams)}`);\n const {showAll = 0, showOperations = 0, showOperationSettings = 0, showRecordLoadParams = 0, showImportJobState = 0} = showParams;\n logger.debug(`showAll: ${showAll}, showOperations: ${showOperations}, showOperationSettings: ${showOperationSettings}, showRecordLoadParams: ${showRecordLoadParams}, showImportJobState: ${showImportJobState}`);\n\n if (showAll) {\n return {\n _id: 0\n };\n }\n\n const showParamToField = {\n 'showOperations': 'operations',\n 'showOperationSettings': 'operationSettings',\n 'showRecordLoadParams': 'recordLoadParams',\n 'showImportJobState': 'importJobState'\n };\n\n const result = Object.keys(showParams)\n .filter(param => param !== 'showAll' && showParams[param] !== true && showParams[param] !== 1)\n .filter(param => showParamToField[param])\n .map((param) => showParamToField[param]);\n logger.silly(`We want to exclude from projection: ${JSON.stringify(result)}`);\n\n const excludeObject = Object.fromEntries(result.map(param => [param, 0]));\n logger.silly(`We want to exclude from projection: ${JSON.stringify(excludeObject)}`);\n\n return {\n _id: 0,\n ...excludeObject\n };\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n const {operationSettings} = result;\n if (operationSettings.prio === false && operationSettings.noStream === false) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n logger.debug(`OperationSettings for ${correlationId}: ${JSON.stringify(operationSettings)}`);\n throw new ApiError(httpStatus.BAD_REQUEST, {message: `Content is only available for streamBulk jobs. ${correlationId} is not a streamBulk job.`});\n }\n\n throw new ApiError(httpStatus.NOT_FOUND, {message: `Job ${correlationId} not found.`});\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${JSON.stringify(errorMessage) || ''}', Error status: '${errorStatus || ''}'` : '';\n logger.info(`Setting queue-item state ${state} for ${correlationId}${errorString} to ${collection}`);\n\n const stateInQueueItemStates = Object.values(QUEUE_ITEM_STATE).indexOf(state) > -1;\n const stateInQueueItemStatesValidator = Object.values(QUEUE_ITEM_STATE.VALIDATOR).indexOf(state) > -1;\n const stateInQueueItemStatesImporter = Object.values(QUEUE_ITEM_STATE.IMPORTER).indexOf(state) > -1;\n if (!stateInQueueItemStates && !stateInQueueItemStatesValidator && !stateInQueueItemStatesImporter) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Trying to set invalid state');\n }\n\n const clean = sanitize(correlationId);\n const updateValues = {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n };\n\n // Do not update value that are undefined\n // eslint-disable-next-line functional/immutable-data\n Object.keys(updateValues).forEach(key => updateValues[key] === undefined && delete updateValues[key]);\n\n return db.collection(collection)\n .findOneAndUpdate(\n {correlationId: clean},\n {$set: updateValues},\n {projection: {_id: 0}, returnNewDocument: true}\n );\n }\n\n function setImportJobState({correlationId, operation, importJobState}) {\n\n // should this also get importJobState as previously created object? {}\n logger.info(`Setting queue-item importJobState: {${operation}: ${importJobState}} for ${correlationId}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanImportJobState = sanitize(importJobState);\n\n if (!(operation in OPERATIONS)) {\n throw new ApiError('400', 'Invalid operation for import job state');\n }\n\n if (!(cleanImportJobState in IMPORT_JOB_STATE)) {\n throw new ApiError('400', 'Invalid import job state');\n }\n\n const newJobState = operation === OPERATIONS.CREATE ? {'importJobState.CREATE': cleanImportJobState} : {'importJobState.UPDATE': cleanImportJobState};\n return db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n ...newJobState,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n async function setOperation({correlationId, operation}) {\n const newOperation = operation;\n const {operation: oldOperation} = await db.collection(collection).findOne({correlationId});\n logger.info(`Setting queue-item operation from ${oldOperation} to ${newOperation} for ${correlationId} to ${collection}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanNewOperation = sanitize(newOperation);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operation: cleanNewOperation,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function setOperations({correlationId, addOperation, removeOperation = undefined}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);\n const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];\n\n logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n operations: operationsAfterRemoveAndAdd,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n return result.ok;\n // logger.debug(JSON.stringify(result));\n }\n\n async function addBlobSize({correlationId}) {\n const cleanCorrelationId = sanitize(correlationId);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS\n }, {\n $inc: {\n blobSize: 1\n },\n $set: {\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`AddBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n async function setBlobSize({correlationId, blobSize}) {\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSize = sanitize(blobSize);\n\n const result = await db.collection(collection).findOneAndUpdate({\n correlationId: cleanCorrelationId\n }, {\n $set: {\n blobSize: cleanBlobSize,\n modificationTime: moment().toDate()\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n\n logger.verbose(`SetBlobSizeResult in mongo: ${JSON.stringify(result)}`);\n return result;\n }\n\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"mongo.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_constants","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_default","MONGO_URI","collection","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","checkAndSetImportJobState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","setImportJobState","pushIds","pushMessages","setOperation","setOperations","addBlobSize","setBlobSize","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","moment","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","blobSize","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","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":"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","ignoreList":[]}
package/dist/utils.js CHANGED
@@ -72,7 +72,7 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id)
72
72
  // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js
73
73
 
74
74
  // Non-http statuses
75
- if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED'].includes(responseStatus)) {
75
+ if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED', 'FIXED'].includes(responseStatus)) {
76
76
  return {
77
77
  recordStatus: responseStatus,
78
78
  detailedRecordStatus: responseStatus,
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["_melindaBackendCommons","require","_melindaCommons","_constants","_httpStatus","_interopRequireDefault","logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","httpStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","FORBIDDEN","newMessage","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["import {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\n// eslint-disable-next-line max-statements\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n // More detailed SKIPPED statuses\n if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {\n return {recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message};\n }\n\n // Otherwise\n logger.debug(`Unknown responseStatus: ${responseStatus}`);\n const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts\nexport async function addRecordResponseItems({recordResponseItems, correlationId, mongoOperator}) {\n if (!Array.isArray(recordResponseItems)) {\n throw new Error('RecordResponseItems is not an array!');\n }\n await mongoOperator.pushMessages({correlationId, messages: recordResponseItems, messageField: 'records'});\n return true;\n}\n\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["_melindaBackendCommons","require","_melindaCommons","_constants","_httpStatus","_interopRequireDefault","logger","createLogger","logError","err","ApiError","error","JSON","stringify","stack","undefined","createImportJobState","operation","state","queryImportJobState","IMPORT_JOB_STATE","Error","OPERATIONS","importJobStateWithOperation","importJobStateForQuery","createRecordResponseItem","responsePayload","responseStatus","recordMetadata","id","recordResponseStatusAndMessage","getRecordResponseStatusAndMessage","recordResponseItem","databaseId","debug","message","getMessageFromResponsePayload","ids","includes","recordStatus","detailedRecordStatus","httpStatus","CONFLICT","test","length","UNPROCESSABLE_ENTITY","NOT_FOUND","FORBIDDEN","newMessage","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField","addRecordResponseItems","recordResponseItems","Array","isArray"],"sources":["../src/utils.js"],"sourcesContent":["import {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\n// eslint-disable-next-line max-statements\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED', 'FIXED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n // More detailed SKIPPED statuses\n if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {\n return {recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n if (ids.length > 1 || ids[0] !== id) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message};\n }\n\n // Otherwise\n logger.debug(`Unknown responseStatus: ${responseStatus}`);\n const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts\nexport async function addRecordResponseItems({recordResponseItems, correlationId, mongoOperator}) {\n if (!Array.isArray(recordResponseItems)) {\n throw new Error('RecordResponseItems is not an array!');\n }\n await mongoOperator.pushMessages({correlationId, messages: recordResponseItems, messageField: 'records'});\n return true;\n}\n\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/melinda-rest-api-commons.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "4.1.10-alpha.1",
17
+ "version": "4.2.0-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=18"