@natlibfi/melinda-rest-api-commons 2.2.0-alpha.13 → 2.2.0-alpha.16

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/mongo.js CHANGED
@@ -72,9 +72,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
72
72
  "CREATE": "EMPTY",
73
73
  "UPDATE": "EMPTY"
74
74
  },
75
+ blobSize: 1,
76
+ records: [],
77
+ errorMessage: '',
78
+ errorStatus: '',
75
79
  "creationTime":"2020-01-01T00:00:00.000Z",
76
80
  "modificationTime":"2020-01-01T00:00:01.000Z",
77
- "handledIds": []
78
81
  }
79
82
  */
80
83
  async function _default(MONGO_URI, collection) {
@@ -129,15 +132,16 @@ async function _default(MONGO_URI, collection) {
129
132
  ...operationSettings
130
133
  },
131
134
  queueItemState: _constants.QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,
135
+ blobSize: 1,
132
136
  importJobState: {
133
137
  CREATE: _constants.IMPORT_JOB_STATE.EMPTY,
134
138
  UPDATE: _constants.IMPORT_JOB_STATE.EMPTY
135
139
  },
136
- blobSize: 1,
140
+ records: [],
141
+ errorMessage: '',
142
+ errorStatus: '',
137
143
  creationTime: time,
138
- modificationTime: time,
139
- handledIds: [],
140
- rejectedIds: []
144
+ modificationTime: time
141
145
  };
142
146
 
143
147
  try {
@@ -184,10 +188,11 @@ async function _default(MONGO_URI, collection) {
184
188
  CREATE: _constants.IMPORT_JOB_STATE.EMPTY,
185
189
  UPDATE: _constants.IMPORT_JOB_STATE.EMPTY
186
190
  },
191
+ records: [],
192
+ errorMessage: '',
193
+ errorStatus: '',
187
194
  creationTime: time,
188
- modificationTime: time,
189
- handledIds: [],
190
- rejectedIds: []
195
+ modificationTime: time
191
196
  }; // eslint-disable-next-line functional/no-conditional-statement
192
197
 
193
198
  if (stream) {
@@ -284,12 +289,27 @@ async function _default(MONGO_URI, collection) {
284
289
  return false;
285
290
  }
286
291
 
287
- async function query(params) {
288
- const result = await db.collection(collection).find(params, {
292
+ async function query(params, showParams) {
293
+ const {
294
+ showOperations,
295
+ showOperationSettings,
296
+ showRecordLoadParams,
297
+ showImportJobState
298
+ } = showParams;
299
+ const {
300
+ limit = 1000,
301
+ skip = 0,
302
+ ...rest
303
+ } = params;
304
+ const result = await db.collection(collection).find(rest, {
289
305
  projection: {
290
- _id: 0
306
+ _id: 0,
307
+ operations: showOperations,
308
+ operationSettings: showOperationSettings,
309
+ recordLoadParams: showRecordLoadParams,
310
+ importJobState: showImportJobState
291
311
  }
292
- }).toArray();
312
+ }).limit(parseInt(limit, 10)).skip(parseInt(skip, 10)).toArray();
293
313
  logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);
294
314
  return result;
295
315
  }
@@ -657,13 +677,13 @@ async function _default(MONGO_URI, collection) {
657
677
  const queueItem = await db.collection(collection).findOne({
658
678
  correlationId: cleanCorrelationId
659
679
  });
660
- logger.debug(`We found a queueItem: ${JSON.stringify(queueItem)}`);
680
+ logger.silly(`We found a queueItem: ${JSON.stringify(queueItem)}`);
661
681
  const oldOperations = queueItem.operations;
662
- logger.info(`Setting queue-item operation from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);
682
+ logger.info(`Setting queue-item operations from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);
663
683
  const operationsAfterRemove = oldOperations.filter(operation => operation !== removeOperation);
664
684
  const operationsAfterRemoveAndAdd = operationsAfterRemove.includes(addOperation) ? operationsAfterRemove : [...operationsAfterRemove, addOperation];
665
- logger.debug(`operationsAfterRemove: ${operationsAfterRemove}`);
666
- logger.debug(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);
685
+ logger.silly(`operationsAfterRemove: ${operationsAfterRemove}`);
686
+ logger.silly(`operationAfterRemoveAndAdd: ${operationsAfterRemoveAndAdd}`);
667
687
  const result = await db.collection(collection).findOneAndUpdate({
668
688
  correlationId: cleanCorrelationId
669
689
  }, {
package/dist/mongo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mongo.js"],"names":["MONGO_URI","collection","logger","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","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","blobSize","creationTime","modificationTime","handledIds","rejectedIds","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","errorMessage","errorStatus","timeOut","checkTimeOut","params","find","projection","_id","toArray","length","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","silly","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","JSON","stringify","clean","noContent","deleteOne","err","MongoDriverError","message","indexOf","readStream","openDownloadStreamByName","NOT_FOUND","delete","cleanQueueItemState","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","Object","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","BAD_REQUEST","updateValues","keys","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","filter","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"mappings":";;;;;;;AA4BA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAUA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEe,wBAAgBA,SAAhB,EAA2BC,UAA3B,EAAuC;AACpD,QAAMC,MAAM,GAAG,0CAAf,CADoD,CAGpD;;AACA,QAAMC,MAAM,GAAG,MAAMC,qBAAYC,OAAZ,CAAoBL,SAApB,EAA+B;AAACM,IAAAA,eAAe,EAAE,IAAlB;AAAwBC,IAAAA,kBAAkB,EAAE;AAA5C,GAA/B,CAArB;AACA,QAAMC,EAAE,GAAGL,MAAM,CAACK,EAAP,CAAU,UAAV,CAAX;AACA,QAAMC,YAAY,GAAG,IAAIC,qBAAJ,CAAiBF,EAAjB,EAAqB;AAACG,IAAAA,UAAU,EAAEV;AAAb,GAArB,CAArB;AAEA,SAAO;AAACW,IAAAA,UAAD;AAAaC,IAAAA,UAAb;AAAyBC,IAAAA,gBAAzB;AAA2CC,IAAAA,yBAA3C;AAAsEC,IAAAA,KAAtE;AAA6EC,IAAAA,SAA7E;AAAwFC,IAAAA,MAAxF;AAAgGC,IAAAA,WAAhG;AAA6GC,IAAAA,aAA7G;AAA4HC,IAAAA,MAA5H;AAAoIC,IAAAA,SAApI;AAA+IC,IAAAA,QAA/I;AAAyJC,IAAAA,iBAAzJ;AAA4KC,IAAAA,OAA5K;AAAqLC,IAAAA,YAArL;AAAmMC,IAAAA,YAAnM;AAAiNC,IAAAA,aAAjN;AAAgOC,IAAAA,WAAhO;AAA6OC,IAAAA;AAA7O,GAAP;;AAEA,iBAAelB,UAAf,CAA0B;AAACmB,IAAAA,aAAD;AAAgBC,IAAAA,SAAhB;AAA2BC,IAAAA,YAA3B;AAAyCC,IAAAA,SAAzC;AAAoDC,IAAAA;AAApD,GAA1B,EAAkG;AAChG,UAAMC,IAAI,GAAG,uBAASC,MAAT,EAAb;AACA,UAAMC,YAAY,GAAG;AACnBP,MAAAA,aADmB;AAEnBC,MAAAA,SAFmB;AAGnBE,MAAAA,SAHmB;AAInBK,MAAAA,UAAU,EAAE,CAACL,SAAD,CAJO;AAKnBD,MAAAA,YALmB;AAMnBE,MAAAA,iBAAiB,EAAE;AACjBK,QAAAA,IAAI,EAAE,IADW;AAEjB,WAAGL;AAFc,OANA;AAUnBM,MAAAA,cAAc,EAAEC,4BAAiBC,SAAjB,CAA2BC,kBAVxB;AAWnBC,MAAAA,cAAc,EAAE;AACdC,QAAAA,MAAM,EAAEC,4BAAiBC,KADX;AAEdC,QAAAA,MAAM,EAAEF,4BAAiBC;AAFX,OAXG;AAenBE,MAAAA,QAAQ,EAAE,CAfS;AAgBnBC,MAAAA,YAAY,EAAEf,IAhBK;AAiBnBgB,MAAAA,gBAAgB,EAAEhB,IAjBC;AAkBnBiB,MAAAA,UAAU,EAAE,EAlBO;AAmBnBC,MAAAA,WAAW,EAAE;AAnBM,KAArB;;AAqBA,QAAI;AACF,YAAMC,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuD,SAA1B,CAAoClB,YAApC,CAArB;;AACA,UAAIiB,MAAM,CAACE,YAAX,EAAyB;AACvBvD,QAAAA,MAAM,CAACwD,IAAP,CAAa,2BAA0BxB,SAAU,IAAGH,aAAc,qBAAoB9B,UAAW,EAAjG;AACA;AACD;;AACD,YAAM,IAAI0D,qBAAJ,CAAaC,oBAAWC,qBAAxB,CAAN;AACD,KAPD,CAOE,OAAOC,KAAP,EAAc;AACd,2BAASA,KAAT;AACA,YAAM,IAAIH,qBAAJ,CAAaC,oBAAWC,qBAAxB,CAAN;AACD;AACF;;AAED,iBAAehD,UAAf,CAA0B;AAACkB,IAAAA,aAAD;AAAgBC,IAAAA,SAAhB;AAA2BC,IAAAA,YAA3B;AAAyCC,IAAAA,SAAzC;AAAoD6B,IAAAA,WAApD;AAAiEC,IAAAA,gBAAjE;AAAmFC,IAAAA,MAAnF;AAA2F9B,IAAAA;AAA3F,GAA1B,EAAyI;AACvI,UAAMC,IAAI,GAAG,uBAASC,MAAT,EAAb;AACA,UAAMC,YAAY,GAAG;AACnBP,MAAAA,aADmB;AAEnBC,MAAAA,SAFmB;AAGnBC,MAAAA,YAHmB;AAInBC,MAAAA,SAJmB;AAKnBK,MAAAA,UAAU,EAAE,CAACL,SAAD,CALO;AAMnBC,MAAAA,iBAAiB,EAAE;AACjBK,QAAAA,IAAI,EAAE,KADW;AAEjB,WAAGL;AAFc,OANA;AAUnB4B,MAAAA,WAVmB;AAWnBC,MAAAA,gBAXmB;AAYnBvB,MAAAA,cAAc,EAAEwB,MAAM,GAAGvB,4BAAiBC,SAAjB,CAA2BuB,SAA9B,GAA0CxB,4BAAiBC,SAAjB,CAA2BwB,mBAZxE;AAanBjB,MAAAA,QAAQ,EAAE,CAbS;AAcnBL,MAAAA,cAAc,EAAE;AACdC,QAAAA,MAAM,EAAEC,4BAAiBC,KADX;AAEdC,QAAAA,MAAM,EAAEF,4BAAiBC;AAFX,OAdG;AAkBnBG,MAAAA,YAAY,EAAEf,IAlBK;AAmBnBgB,MAAAA,gBAAgB,EAAEhB,IAnBC;AAoBnBiB,MAAAA,UAAU,EAAE,EApBO;AAqBnBC,MAAAA,WAAW,EAAE;AArBM,KAArB,CAFuI,CA0BvI;;AACA,QAAIW,MAAJ,EAAY;AACV,UAAI;AACF;AACAzD,QAAAA,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuD,SAA1B,CAAoClB,YAApC;AACApC,QAAAA,MAAM,CAACwD,IAAP,CAAa,2BAA0BxB,SAAU,IAAGH,aAAc,qBAAoB9B,UAAW,GAAjG;AACA,eAAO,IAAImE,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,gBAAMC,YAAY,GAAG9D,YAAY,CAAC+D,gBAAb,CAA8BzC,aAA9B,CAArB;AAEAkC,UAAAA,MAAM,CACHQ,EADH,CACM,OADN,EACeH,MADf,EAEGG,EAFH,CAEM,MAFN,EAEcC,KAAK,IAAIH,YAAY,CAACI,KAAb,CAAmBD,KAAnB,CAFvB,EAGGD,EAHH,CAGM,KAHN,EAGa,MAAMF,YAAY,CAACK,GAAb,CAAiBC,SAAjB,EAA4BA,SAA5B,EAAuC,MAAM;AAC5DR,YAAAA,OAAO,CAACtC,aAAD,CAAP;AACD,WAFgB,CAHnB;AAMD,SATM,CAAP;AAUD,OAdD,CAcE,OAAO+B,KAAP,EAAc;AACd,6BAASA,KAAT;AACA,cAAM,IAAIH,qBAAJ,CAAaC,oBAAWC,qBAAxB,CAAN;AACD;AACF;;AAED3D,IAAAA,MAAM,CAAC4E,KAAP,CAAc,WAAd,EAhDuI,CAiDvI;;AACA,QAAI,CAACb,MAAL,EAAa;AACX,UAAI;AACF,cAAMV,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuD,SAA1B,CAAoClB,YAApC,CAArB;;AACA,YAAIiB,MAAM,CAACE,YAAX,EAAyB;AACvBvD,UAAAA,MAAM,CAACwD,IAAP,CAAa,oCAAmCxB,SAAU,IAAGH,aAAc,qBAAoB9B,UAAW,EAA1G;AACA,iBAAO;AAAC8B,YAAAA,aAAD;AAAgBU,YAAAA,cAAc,EAAEC,4BAAiBC,SAAjB,CAA2BwB;AAA3D,WAAP;AACD;;AACD,cAAM,IAAIR,qBAAJ,CAAaC,oBAAWC,qBAAxB,CAAN;AACD,OAPD,CAOE,OAAOC,KAAP,EAAc;AACd,6BAASA,KAAT;AACA,cAAM,IAAIH,qBAAJ,CAAaC,oBAAWC,qBAAxB,CAAN;AACD;AACF;AACF,GA7GmD,CA+GpD;;;AACA,iBAAe/C,gBAAf,CAAgC;AAACiB,IAAAA,aAAD;AAAgBgD,IAAAA,KAAhB;AAAuBC,IAAAA,YAAY,GAAGH,SAAtC;AAAiDI,IAAAA,WAAW,GAAGJ;AAA/D,GAAhC,EAA2G;AACzG;AACA;AACA,UAAMK,OAAO,GAAG,MAAMC,YAAY,CAAC;AAACpD,MAAAA;AAAD,KAAD,CAAlC;;AACA,QAAImD,OAAJ,EAAa;AACX,aAAO3D,QAAQ,CAAC;AAACQ,QAAAA,aAAD;AAAgBgD,QAAAA,KAAhB;AAAuBC,QAAAA,YAAvB;AAAqCC,QAAAA;AAArC,OAAD,CAAf;AACD;;AACD,WAAO,KAAP;AACD,GAxHmD,CA0HpD;;;AACA,iBAAelE,yBAAf,CAAyC;AAACgB,IAAAA,aAAD;AAAgBG,IAAAA,SAAhB;AAA2BW,IAAAA,cAA3B;AAA2CmC,IAAAA,YAAY,GAAG,EAA1D;AAA8DC,IAAAA,WAAW,GAAG;AAA5E,GAAzC,EAA0H;AACxH;AACA;AACA/E,IAAAA,MAAM,CAAC4E,KAAP,CAAc,GAAE/C,aAAc,KAAIc,cAAe,KAAIX,SAAU,EAA/D;AACA,UAAMgD,OAAO,GAAG,MAAMC,YAAY,CAAC;AAACpD,MAAAA,aAAD;AAAgBG,MAAAA,SAAhB;AAA2BW,MAAAA;AAA3B,KAAD,CAAlC;;AACA,QAAIqC,OAAJ,EAAa;AACX,aAAO1D,iBAAiB,CAAC;AAACO,QAAAA,aAAD;AAAgBG,QAAAA,SAAhB;AAA2BW,QAAAA,cAA3B;AAA2CmC,QAAAA,YAA3C;AAAyDC,QAAAA;AAAzD,OAAD,CAAxB;AACD;;AACD,WAAO,KAAP;AACD;;AAED,iBAAejE,KAAf,CAAqBoE,MAArB,EAA6B;AAC3B,UAAM7B,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BoF,IAA1B,CAA+BD,MAA/B,EAAuC;AAACE,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN;AAAb,KAAvC,EAClBC,OADkB,EAArB;AAEAtF,IAAAA,MAAM,CAAC4E,KAAP,CAAc,iBAAgBvB,MAAM,CAACkC,MAAP,GAAgB,CAAhB,GAAoB,QAApB,GAA+B,YAAa,EAA1E;AACA,WAAOlC,MAAP;AACD;;AAED,iBAAetC,SAAf,CAAyB;AAACc,IAAAA,aAAD;AAAgB2D,IAAAA,YAAY,GAAG;AAA/B,GAAzB,EAAgE;AAC9D,UAAMnC,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC;AAAC5D,MAAAA;AAAD,KAAlC,CAArB;;AACA,QAAI2D,YAAJ,EAAkB;AAChB,YAAMR,OAAO,GAAG,MAAMC,YAAY,CAAC;AAACpD,QAAAA;AAAD,OAAD,CAAlC;;AACA,UAAImD,OAAJ,EAAa;AACX,eAAOjE,SAAS,CAAC;AAACc,UAAAA;AAAD,SAAD,CAAhB;AACD;;AACD,aAAOwB,MAAP;AACD;;AAED,WAAOA,MAAP;AACD,GAxJmD,CA0JpD;AACA;AACA;AACA;;;AAEA,iBAAe4B,YAAf,CAA4B;AAACpD,IAAAA;AAAD,GAA5B,EAA6C;AAC3C,UAAM;AAACqB,MAAAA,gBAAD;AAAmBwC,MAAAA,cAAc,EAAEC,QAAnC;AAA6ChD,MAAAA;AAA7C,QAA+D,MAAMrC,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC;AAAC5D,MAAAA;AAAD,KAAlC,CAA3E,CAD2C,CAG3C;;AACA,QAAI,CAACW,4BAAiBoD,KAAlB,EAAyBpD,4BAAiBqD,KAA1C,EAAiDrD,4BAAiBsD,IAAlE,EAAwEC,QAAxE,CAAiFJ,QAAjF,CAAJ,EAAgG;AAC9F3F,MAAAA,MAAM,CAACgG,KAAP,CAAc,GAAEnE,aAAc,uBAAsB8D,QAAS,EAA7D;AACA,aAAO,KAAP;AACD;;AAED,UAAMM,WAAW,GAAG,qBAAO/C,gBAAP,EAAyBgD,GAAzB,CAA6B,CAA7B,EAAgC,GAAhC,CAApB;AACAlG,IAAAA,MAAM,CAACgG,KAAP,CAAc,aAAYC,WAAY,EAAtC;;AAEA,QAAIA,WAAW,CAACE,QAAZ,EAAJ,EAA4B;AAC1B,YAAMC,oBAAoB,GAAG,CAACvD,4BAAiB+C,KAAlB,EAAyB/C,4BAAiBiD,IAA1C,EAAgDjD,4BAAiBC,KAAjE,EAAwED,4BAAiBgD,KAAzF,CAA7B;;AACA,UAAI,CAACO,oBAAoB,CAACL,QAArB,CAA8BpD,cAAc,CAACC,MAA7C,CAAL,EAA2D;AAAE;AAC3D,cAAMtB,iBAAiB,CAAC;AAACO,UAAAA,aAAD;AAAgBG,UAAAA,SAAS,EAAE,QAA3B;AAAqCW,UAAAA,cAAc,EAAEE,4BAAiB+C;AAAtE,SAAD,CAAvB;AACD;;AAED,UAAI,CAACQ,oBAAoB,CAACL,QAArB,CAA8BpD,cAAc,CAACI,MAA7C,CAAL,EAA2D;AAAE;AAC3D,cAAMzB,iBAAiB,CAAC;AAACO,UAAAA,aAAD;AAAgBG,UAAAA,SAAS,EAAE,QAA3B;AAAqCW,UAAAA,cAAc,EAAEE,4BAAiB+C;AAAtE,SAAD,CAAvB;AACD;;AAED,YAAMvE,QAAQ,CAAC;AAACQ,QAAAA,aAAD;AAAgBgD,QAAAA,KAAK,EAAErC,4BAAiBoD,KAAxC;AAA+Cb,QAAAA,WAAW,EAAErB,oBAAW2C,eAAvE;AAAwFvB,QAAAA,YAAY,EAAG,cAAaa,QAAS;AAA7H,OAAD,CAAd;AAEA,aAAO,KAAP;AACD;;AAED,WAAO,IAAP;AACD;;AAED,iBAAe3E,MAAf,CAAsBkE,MAAtB,EAA8B;AAC5BlF,IAAAA,MAAM,CAACgG,KAAP,CAAc,GAAEM,IAAI,CAACC,SAAL,CAAerB,MAAf,CAAuB,EAAvC;AACAlF,IAAAA,MAAM,CAACwD,IAAP,CAAa,wBAAuBzD,UAAW,SAAQmF,MAAM,CAACrD,aAAc,EAA5E;AACA,UAAM2E,KAAK,GAAG,4BAAStB,MAAM,CAACrD,aAAhB,CAAd;AACA7B,IAAAA,MAAM,CAACgG,KAAP,CAAc,wBAAuBM,IAAI,CAACC,SAAL,CAAeC,KAAf,CAAsB,EAA3D;;AAEA,QAAI;AACF;AACA;AACA,YAAMC,SAAS,GAAG,MAAMvF,aAAa,CAACgE,MAAD,CAArC;;AACA,UAAIuB,SAAJ,EAAe;AACb,cAAMnG,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B2G,SAA1B,CAAoC;AAAC7E,UAAAA,aAAa,EAAE2E;AAAhB,SAApC,CAAN;AACA,eAAO,IAAP;AACD;AACF,KARD,CAQE,OAAOG,GAAP,EAAY;AACZ,UAAIA,GAAG,YAAYC,yBAAnB,EAAqC;AACnC,YAAID,GAAG,CAACE,OAAJ,CAAYC,OAAZ,CAAoB,uBAApB,MAAiD,CAAC,CAAtD,EAAyD;AACvD9G,UAAAA,MAAM,CAACgG,KAAP,CAAc,oDAAmDM,IAAI,CAACC,SAAL,CAAeC,KAAf,CAAsB,SAAQzG,UAAW,EAA1G;AACA,gBAAMO,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B2G,SAA1B,CAAoC;AAAC7E,YAAAA,aAAa,EAAE2E;AAAhB,WAApC,CAAN;AACA,iBAAO,IAAP;AACD;;AACDxG,QAAAA,MAAM,CAAC4D,KAAP,CAAa+C,GAAG,CAACE,OAAjB;AACA,cAAM,IAAIpD,qBAAJ,CAAaC,oBAAWC,qBAAxB,EAA+CgD,GAAG,CAACE,OAAnD,CAAN;AACD;;AACD,YAAM,IAAIpD,qBAAJ,CAAaC,oBAAWC,qBAAxB,EAA+CgD,GAAG,CAACE,OAAnD,CAAN;AACD;AACF;;AAED,iBAAe5F,WAAf,CAA2BY,aAA3B,EAA0C;AACxC7B,IAAAA,MAAM,CAACwD,IAAP,CAAa,sCAAqC3B,aAAc,OAAM9B,UAAW,EAAjF;AACA,UAAMyG,KAAK,GAAG,4BAAS3E,aAAT,CAAd;AACA,UAAMwB,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC;AAAC5D,MAAAA,aAAa,EAAE2E;AAAhB,KAAlC,CAArB,CAHwC,CAGwC;;AAEhF,QAAInD,MAAJ,EAAY;AACV,aAAO;AACLQ,QAAAA,WAAW,EAAER,MAAM,CAACQ,WADf;AAELkD,QAAAA,UAAU,EAAExG,YAAY,CAACyG,wBAAb,CAAsCR,KAAtC;AAFP,OAAP;AAID;;AAED,UAAM,IAAI/C,qBAAJ,CAAaC,oBAAWuD,SAAxB,CAAN;AACD;;AAED,iBAAe/F,aAAf,CAA6BgE,MAA7B,EAAqC;AACnClF,IAAAA,MAAM,CAACwD,IAAP,CAAa,uCAAsC0B,MAAM,CAACrD,aAAc,OAAM9B,UAAW,EAAzF;AACA,UAAMyG,KAAK,GAAG,4BAAStB,MAAM,CAACrD,aAAhB,CAAd;AAEA,UAAMwB,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC;AAAC5D,MAAAA,aAAa,EAAE2E;AAAhB,KAAlC,CAArB,CAJmC,CAI6C;;AAChFxG,IAAAA,MAAM,CAACgG,KAAP,CAAc,+BAA8BM,IAAI,CAACC,SAAL,CAAelD,MAAf,CAAuB,EAAnE;;AAEA,QAAIA,MAAJ,EAAY;AACV,YAAM9C,YAAY,CAAC2G,MAAb,CAAoBV,KAApB,CAAN;AACA,aAAO,IAAP;AACD;;AAED,WAAO,IAAP;AACD,GArPmD,CAuPpD;;;AACA,WAASrF,MAAT,CAAgB;AAACoB,IAAAA,cAAD;AAAiBI,IAAAA,cAAc,GAAGgC;AAAlC,GAAhB,EAA8D;AAE5D3E,IAAAA,MAAM,CAACgG,KAAP,CAAc,mBAAkBzD,cAAe,qBAAoB+D,IAAI,CAACC,SAAL,CAAe5D,cAAf,CAA+B,EAAlG;AACA,UAAMwE,mBAAmB,GAAG5E,cAAc,GAAG;AAACA,MAAAA,cAAc,EAAE,4BAASA,cAAT;AAAjB,KAAH,GAAgDoC,SAA1F;;AAEA,QAAI;AAEF;AACA,UAAIpC,cAAc,IAAII,cAAc,KAAKgC,SAAzC,EAAoD;AAClD3E,QAAAA,MAAM,CAACgG,KAAP,CAAc,eAAcjG,UAAW,aAAYuG,IAAI,CAACC,SAAL,CAAeY,mBAAmB,CAAC5E,cAAnC,CAAmD,EAAtG;AACA,eAAOjC,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC,EAAC,GAAG0B;AAAJ,SAAlC,CAAP;AACD,OANC,CAQF;;;AACA,UAAIxE,cAAc,IAAIJ,cAAc,KAAKoC,SAAzC,EAAoD;AAClD3E,QAAAA,MAAM,CAACgG,KAAP,CAAc,eAAcjG,UAAW,QAAOuG,IAAI,CAACC,SAAL,CAAe5D,cAAf,CAA+B,EAA7E;AACA,eAAOrC,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC,EAAC,GAAG9C;AAAJ,SAAlC,CAAP;AACD,OAZC,CAcF;;;AACA,UAAIA,cAAc,IAAIJ,cAAtB,EAAsC;AACpCvC,QAAAA,MAAM,CAACgG,KAAP,CAAc,eAAcjG,UAAW,QAAOwC,cAAe,QAAO+D,IAAI,CAACC,SAAL,CAAe5D,cAAf,CAA+B,EAAnG;AACA,eAAOrC,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC,EAAC,GAAG0B,mBAAJ;AAAyB,aAAGxE;AAA5B,SAAlC,CAAP;AACD;;AAED3C,MAAAA,MAAM,CAAC4E,KAAP,CAAc,qBAAd;AACA,YAAM,IAAInB,qBAAJ,CAAaC,oBAAWC,qBAAxB,EAA+C,0CAA/C,CAAN;AAED,KAvBD,CAuBE,OAAOC,KAAP,EAAc;AACd,2BAASA,KAAT;AACD;AACF;;AAED,WAASxC,SAAT,CAAmBS,aAAnB,EAAkC;AAChC7B,IAAAA,MAAM,CAACwD,IAAP,CAAa,iCAAgC3B,aAAc,OAAM9B,UAAW,EAA5E;AACA,UAAMyG,KAAK,GAAG,4BAAS3E,aAAT,CAAd;;AACA,QAAI;AACF;AACA,aAAOtB,YAAY,CAACyG,wBAAb,CAAsCR,KAAtC,CAAP;AACD,KAHD,CAGE,OAAO5C,KAAP,EAAc;AACd,2BAASA,KAAT;AACD;AACF;;AAED,iBAAerC,OAAf,CAAuB;AAACM,IAAAA,aAAD;AAAgBsB,IAAAA,UAAhB;AAA4BC,IAAAA;AAA5B,GAAvB,EAAiE;AAC/DpD,IAAAA,MAAM,CAACoH,OAAP,CAAgB,aAAYjE,UAAU,CAACoC,MAAO,sBAAqBnC,WAAW,CAACmC,MAAO,KAAI1D,aAAc,OAAM9B,UAAW,EAAzH;AACAC,IAAAA,MAAM,CAAC4E,KAAP,CAAc,QAAOzB,UAAU,CAACoC,MAAO,MAAKe,IAAI,CAACC,SAAL,CAAepD,UAAf,CAA2B,iBAAgBC,WAAW,CAACmC,MAAO,KAAIe,IAAI,CAACC,SAAL,CAAenD,WAAf,CAA4B,EAA1I;AACA,UAAMoD,KAAK,GAAG,4BAAS3E,aAAT,CAAd;AACA,UAAMvB,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BsH,SAA1B,CAAoC;AACxCxF,MAAAA,aAAa,EAAE2E;AADyB,KAApC,EAEH;AACDc,MAAAA,IAAI,EAAE;AACJpE,QAAAA,gBAAgB,EAAE,uBAASf,MAAT;AADd,OADL;AAIDoF,MAAAA,KAAK,EAAE;AACLpE,QAAAA,UAAU,EAAE;AAACqE,UAAAA,KAAK,EAAErE;AAAR,SADP;AAELC,QAAAA,WAAW,EAAE;AAACoE,UAAAA,KAAK,EAAEpE;AAAR;AAFR;AAJN,KAFG,CAAN;AAWD;;AAED,iBAAe5B,YAAf,CAA4B;AAACK,IAAAA,aAAD;AAAgB4F,IAAAA,QAAhB;AAA0BC,IAAAA,YAAY,GAAG;AAAzC,GAA5B,EAAkF;AAChF1H,IAAAA,MAAM,CAACoH,OAAP,CAAgB,kBAAiBK,QAAQ,CAAClC,MAAO,QAAOmC,YAAa,IAAG7F,aAAc,OAAM9B,UAAW,EAAvG;AACAC,IAAAA,MAAM,CAACgG,KAAP,CAAc,aAAYyB,QAAQ,CAAClC,MAAO,MAAKe,IAAI,CAACC,SAAL,CAAekB,QAAf,CAAyB,GAAxE;AACA,UAAMjB,KAAK,GAAG,4BAAS3E,aAAT,CAAd;AACA,UAAM8F,iBAAiB,GAAG,4BAASD,YAAT,CAA1B;AACA,UAAMpH,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BsH,SAA1B,CAAoC;AACxCxF,MAAAA,aAAa,EAAE2E;AADyB,KAApC,EAEH;AACDc,MAAAA,IAAI,EAAE;AACJpE,QAAAA,gBAAgB,EAAE,uBAASf,MAAT;AADd,OADL;AAIDoF,MAAAA,KAAK,EAAE;AACL,SAACI,iBAAD,GAAqB;AAACH,UAAAA,KAAK,EAAEC;AAAR;AADhB;AAJN,KAFG,CAAN;AAUD;;AAED,WAASpG,QAAT,CAAkB;AAACQ,IAAAA,aAAD;AAAgBgD,IAAAA,KAAhB;AAAuBC,IAAAA,YAAY,GAAGH,SAAtC;AAAiDI,IAAAA,WAAW,GAAGJ;AAA/D,GAAlB,EAA6F;AAC3F,UAAMiD,WAAW,GAAG9C,YAAY,IAAIC,WAAhB,GAA+B,qBAAoBD,YAAY,IAAI,EAAG,qBAAoBC,WAAW,IAAI,EAAG,GAA5G,GAAiH,EAArI;AACA/E,IAAAA,MAAM,CAACwD,IAAP,CAAa,4BAA2BqB,KAAM,QAAOhD,aAAc,GAAE+F,WAAY,OAAM7H,UAAW,EAAlG;AAEA,UAAM8H,sBAAsB,GAAGC,MAAM,CAACC,MAAP,CAAcvF,2BAAd,EAAgCsE,OAAhC,CAAwCjC,KAAxC,IAAiD,CAAC,CAAjF;AACA,UAAMmD,+BAA+B,GAAGF,MAAM,CAACC,MAAP,CAAcvF,4BAAiBC,SAA/B,EAA0CqE,OAA1C,CAAkDjC,KAAlD,IAA2D,CAAC,CAApG;AACA,UAAMoD,8BAA8B,GAAGH,MAAM,CAACC,MAAP,CAAcvF,4BAAiB0F,QAA/B,EAAyCpB,OAAzC,CAAiDjC,KAAjD,IAA0D,CAAC,CAAlG;;AACA,QAAI,CAACgD,sBAAD,IAA2B,CAACG,+BAA5B,IAA+D,CAACC,8BAApE,EAAoG;AAClG,YAAM,IAAIxE,qBAAJ,CAAaC,oBAAWyE,WAAxB,EAAqC,6BAArC,CAAN;AACD;;AAED,UAAM3B,KAAK,GAAG,4BAAS3E,aAAT,CAAd;AACA,UAAMuG,YAAY,GAAG;AACnB7F,MAAAA,cAAc,EAAEsC,KADG;AAEnB3B,MAAAA,gBAAgB,EAAE,uBAASf,MAAT,EAFC;AAGnB2C,MAAAA,YAHmB;AAInBC,MAAAA;AAJmB,KAArB,CAZ2F,CAmB3F;AACA;;AACA+C,IAAAA,MAAM,CAACO,IAAP,CAAYD,YAAZ,EAA0BE,OAA1B,CAAkCC,GAAG,IAAIH,YAAY,CAACG,GAAD,CAAZ,KAAsB5D,SAAtB,IAAmC,OAAOyD,YAAY,CAACG,GAAD,CAA/F;AAEA,WAAOjI,EAAE,CAACP,UAAH,CAAcA,UAAd,EACJyI,gBADI,CAEH;AAAC3G,MAAAA,aAAa,EAAE2E;AAAhB,KAFG,EAGH;AAACc,MAAAA,IAAI,EAAEc;AAAP,KAHG,EAIH;AAAChD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAJG,CAAP;AAMD;;AAED,WAASnH,iBAAT,CAA2B;AAACO,IAAAA,aAAD;AAAgBG,IAAAA,SAAhB;AAA2BW,IAAAA;AAA3B,GAA3B,EAAuE;AAErE;AACA3C,IAAAA,MAAM,CAACwD,IAAP,CAAa,uCAAsCxB,SAAU,KAAIW,cAAe,SAAQd,aAAc,EAAtG;AACA,UAAM6G,kBAAkB,GAAG,4BAAS7G,aAAT,CAA3B;AACA,UAAM8G,mBAAmB,GAAG,4BAAShG,cAAT,CAA5B;;AAEA,QAAI,EAAEX,SAAS,IAAI4G,qBAAf,CAAJ,EAAgC;AAC9B,YAAM,IAAInF,qBAAJ,CAAa,KAAb,EAAoB,wCAApB,CAAN;AACD;;AAED,QAAI,EAAEkF,mBAAmB,IAAI9F,2BAAzB,CAAJ,EAAgD;AAC9C,YAAM,IAAIY,qBAAJ,CAAa,KAAb,EAAoB,0BAApB,CAAN;AACD;;AAED,UAAMoF,WAAW,GAAG7G,SAAS,KAAK4G,sBAAWhG,MAAzB,GAAkC;AAAC,+BAAyB+F;AAA1B,KAAlC,GAAmF;AAAC,+BAAyBA;AAA1B,KAAvG;AACA,WAAOrI,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0ByI,gBAA1B,CAA2C;AAChD3G,MAAAA,aAAa,EAAE6G;AADiC,KAA3C,EAEJ;AACDpB,MAAAA,IAAI,EAAE,EACJ,GAAGuB,WADC;AAEJ3F,QAAAA,gBAAgB,EAAE,uBAASf,MAAT;AAFd;AADL,KAFI,EAOJ;AAACiD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAPI,CAAP;AAQD;;AAED,iBAAehH,YAAf,CAA4B;AAACI,IAAAA,aAAD;AAAgBG,IAAAA;AAAhB,GAA5B,EAAwD;AACtD,UAAM8G,YAAY,GAAG9G,SAArB;AACA,UAAM;AAACA,MAAAA,SAAS,EAAE+G;AAAZ,QAA4B,MAAMzI,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC;AAAC5D,MAAAA;AAAD,KAAlC,CAAxC;AACA7B,IAAAA,MAAM,CAACwD,IAAP,CAAa,qCAAoCuF,YAAa,OAAMD,YAAa,QAAOjH,aAAc,OAAM9B,UAAW,EAAvH;AACA,UAAM2I,kBAAkB,GAAG,4BAAS7G,aAAT,CAA3B;AACA,UAAMmH,iBAAiB,GAAG,4BAASF,YAAT,CAA1B;AAEA,UAAMzF,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0ByI,gBAA1B,CAA2C;AAC9D3G,MAAAA,aAAa,EAAE6G;AAD+C,KAA3C,EAElB;AACDpB,MAAAA,IAAI,EAAE;AACJtF,QAAAA,SAAS,EAAEgH,iBADP;AAEJ9F,QAAAA,gBAAgB,EAAE,uBAASf,MAAT;AAFd;AADL,KAFkB,EAOlB;AAACiD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAPkB,CAArB;AASA,WAAOpF,MAAM,CAAC4F,EAAd,CAhBsD,CAiBtD;AACD;;AAED,iBAAevH,aAAf,CAA6B;AAACG,IAAAA,aAAD;AAAgBqH,IAAAA,YAAhB;AAA8BC,IAAAA,eAAe,GAAGxE;AAAhD,GAA7B,EAAyF;AACvF,UAAM+D,kBAAkB,GAAG,4BAAS7G,aAAT,CAA3B;AAEA,UAAMuH,SAAS,GAAG,MAAM9I,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0B0F,OAA1B,CAAkC;AAAC5D,MAAAA,aAAa,EAAE6G;AAAhB,KAAlC,CAAxB;AACA1I,IAAAA,MAAM,CAAC4E,KAAP,CAAc,yBAAwB0B,IAAI,CAACC,SAAL,CAAe6C,SAAf,CAA0B,EAAhE;AAEA,UAAMC,aAAa,GAAGD,SAAS,CAAC/G,UAAhC;AAEArC,IAAAA,MAAM,CAACwD,IAAP,CAAa,qCAAoC8C,IAAI,CAACC,SAAL,CAAe8C,aAAf,CAA8B,cAAaH,YAAa,iBAAgBC,eAAgB,QAAOtH,aAAc,OAAM9B,UAAW,EAA/K;AAEA,UAAMuJ,qBAAqB,GAAGD,aAAa,CAACE,MAAd,CAAqBvH,SAAS,IAAIA,SAAS,KAAKmH,eAAhD,CAA9B;AACA,UAAMK,2BAA2B,GAAGF,qBAAqB,CAACvD,QAAtB,CAA+BmD,YAA/B,IAA+CI,qBAA/C,GAAuE,CAAC,GAAGA,qBAAJ,EAA2BJ,YAA3B,CAA3G;AAEAlJ,IAAAA,MAAM,CAAC4E,KAAP,CAAc,0BAAyB0E,qBAAsB,EAA7D;AACAtJ,IAAAA,MAAM,CAAC4E,KAAP,CAAc,+BAA8B4E,2BAA4B,EAAxE;AAEA,UAAMnG,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0ByI,gBAA1B,CAA2C;AAC9D3G,MAAAA,aAAa,EAAE6G;AAD+C,KAA3C,EAElB;AACDpB,MAAAA,IAAI,EAAE;AACJjF,QAAAA,UAAU,EAAEmH,2BADR;AAEJtG,QAAAA,gBAAgB,EAAE,uBAASf,MAAT;AAFd;AADL,KAFkB,EAOlB;AAACiD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAPkB,CAArB;AASA,WAAOpF,MAAM,CAAC4F,EAAd,CAzBuF,CA0BvF;AACD;;AAED,iBAAetH,WAAf,CAA2B;AAACE,IAAAA;AAAD,GAA3B,EAA4C;AAC1C,UAAM6G,kBAAkB,GAAG,4BAAS7G,aAAT,CAA3B;AAEA,UAAMwB,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0ByI,gBAA1B,CAA2C;AAC9D3G,MAAAA,aAAa,EAAE6G,kBAD+C;AAE9DnG,MAAAA,cAAc,EAAEC,4BAAiBC,SAAjB,CAA2BwB;AAFmB,KAA3C,EAGlB;AACDwF,MAAAA,IAAI,EAAE;AACJzG,QAAAA,QAAQ,EAAE;AADN,OADL;AAIDsE,MAAAA,IAAI,EAAE;AACJpE,QAAAA,gBAAgB,EAAE,uBAASf,MAAT;AADd;AAJL,KAHkB,EAUlB;AAACiD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAVkB,CAArB;AAYAzI,IAAAA,MAAM,CAACoH,OAAP,CAAgB,+BAA8Bd,IAAI,CAACC,SAAL,CAAelD,MAAf,CAAuB,EAArE;AACA,WAAOA,MAAP;AACD;;AAED,iBAAezB,WAAf,CAA2B;AAACC,IAAAA,aAAD;AAAgBmB,IAAAA;AAAhB,GAA3B,EAAsD;AACpD,UAAM0F,kBAAkB,GAAG,4BAAS7G,aAAT,CAA3B;AACA,UAAM6H,aAAa,GAAG,4BAAS1G,QAAT,CAAtB;AAEA,UAAMK,MAAM,GAAG,MAAM/C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0ByI,gBAA1B,CAA2C;AAC9D3G,MAAAA,aAAa,EAAE6G;AAD+C,KAA3C,EAElB;AACDpB,MAAAA,IAAI,EAAE;AACJtE,QAAAA,QAAQ,EAAE0G,aADN;AAEJxG,QAAAA,gBAAgB,EAAE,uBAASf,MAAT;AAFd;AADL,KAFkB,EAOlB;AAACiD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAPkB,CAArB;AASAzI,IAAAA,MAAM,CAACoH,OAAP,CAAgB,+BAA8Bd,IAAI,CAACC,SAAL,CAAelD,MAAf,CAAuB,EAArE;AACA,WAAOA,MAAP;AACD;AAEF","sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n \"handledIds\": []\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 importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n blobSize: 1,\n creationTime: time,\n modificationTime: time,\n handledIds: [],\n rejectedIds: []\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n creationTime: time,\n modificationTime: time,\n handledIds: [],\n rejectedIds: []\n };\n\n // eslint-disable-next-line functional/no-conditional-statement\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statement\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params) {\n const result = await db.collection(collection).find(params, {projection: {_id: 0}})\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n return result;\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n\n throw new ApiError(httpStatus.NOT_FOUND);\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n logError(error);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n logError(error);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${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.debug(`We found a queueItem: ${JSON.stringify(queueItem)}`);\n\n const oldOperations = queueItem.operations;\n\n logger.info(`Setting queue-item operation 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.debug(`operationsAfterRemove: ${operationsAfterRemove}`);\n logger.debug(`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"],"file":"mongo.js"}
1
+ {"version":3,"sources":["../src/mongo.js"],"names":["MONGO_URI","collection","logger","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","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","contentType","recordLoadParams","stream","UPLOADING","WAITING_FOR_RECORDS","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","debug","state","timeOut","checkTimeOut","params","showParams","showOperations","showOperationSettings","showRecordLoadParams","showImportJobState","limit","skip","rest","find","projection","_id","parseInt","toArray","length","checkModTime","findOne","queueitemState","oldState","ABORT","ERROR","DONE","includes","silly","timeoutTime","add","isBefore","finalImportJobStates","REQUEST_TIMEOUT","JSON","stringify","clean","noContent","deleteOne","err","MongoDriverError","message","indexOf","readStream","openDownloadStreamByName","NOT_FOUND","delete","cleanQueueItemState","handledIds","rejectedIds","verbose","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","stateInQueueItemStates","Object","values","stateInQueueItemStatesValidator","stateInQueueItemStatesImporter","IMPORTER","BAD_REQUEST","updateValues","keys","forEach","key","findOneAndUpdate","returnNewDocument","cleanCorrelationId","cleanImportJobState","OPERATIONS","newJobState","newOperation","oldOperation","cleanNewOperation","ok","addOperation","removeOperation","queueItem","oldOperations","operationsAfterRemove","filter","operationsAfterRemoveAndAdd","$inc","cleanBlobSize"],"mappings":"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","sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient, GridFSBucket, MongoDriverError} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n//import isDeepStrictEqual from 'util';\n\n/* QueueItem:\n{\n \"correlationId\":\"FOO\",\n \"cataloger\":\"xxx0000\",\n \"oCatalogerIn\":\"xxx0000\"\n \"operation\":\"UPDATE\",\n \"operations\":[\"UPDATE\", \"CREATE\"]\n \"contentType\":\"application/json\",\n \"recordLoadParams\": {\n \"pActiveLibrary\": \"XXX00\",\n \"pInputFile\": \"filename.seq\",\n \"pRejectFile\": \"filename.rej\",\n \"pLogFile\": \"filename.syslog\",\n \"pOldNew\": \"NEW\"\n },\n \"queueItemState\":\"PENDING_QUEUING\",\n \"importJobState\": {\n \"CREATE\": \"EMPTY\",\n \"UPDATE\": \"EMPTY\"\n },\n blobSize: 1,\n records: [],\n errorMessage: '',\n errorStatus: '',\n \"creationTime\":\"2020-01-01T00:00:00.000Z\",\n \"modificationTime\":\"2020-01-01T00:00:01.000Z\",\n}\n*/\n\nexport default async function (MONGO_URI, collection) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const gridFSBucket = new GridFSBucket(db, {bucketName: collection});\n\n return {createPrio, createBulk, checkAndSetState, checkAndSetImportJobState, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, setImportJobState, pushIds, pushMessages, setOperation, setOperations, addBlobSize, setBlobSize};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {\n prio: true,\n ...operationSettings\n },\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\n blobSize: 1,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New PRIO queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream, operationSettings}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {\n prio: false,\n ...operationSettings\n },\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\n blobSize: 0,\n importJobState: {\n CREATE: IMPORT_JOB_STATE.EMPTY,\n UPDATE: IMPORT_JOB_STATE.EMPTY\n },\n records: [],\n errorMessage: '',\n errorStatus: '',\n creationTime: time,\n modificationTime: time\n };\n\n // eslint-disable-next-line functional/no-conditional-statement\n if (stream) {\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New BULK queue item for ${operation} ${correlationId} has been made in ${collection}!`);\n return new Promise((resolve, reject) => {\n const outputStream = gridFSBucket.openUploadStream(correlationId);\n\n stream\n .on('error', reject)\n .on('data', chunk => outputStream.write(chunk))\n .on('end', () => outputStream.end(undefined, undefined, () => {\n resolve(correlationId);\n }));\n });\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n logger.debug(`No stream`);\n // eslint-disable-next-line functional/no-conditional-statement\n if (!stream) {\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\n logger.info(`New noStream BULK queue item for ${operation} ${correlationId} has been made in ${collection}`);\n return {correlationId, queueItemState: QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS};\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return setState({correlationId, state, errorMessage, errorStatus});\n }\n return false;\n }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetImportJobState({correlationId, operation, importJobState, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute and it's state is not ABORT/ERROR\n // otherwise it sets queueItem to state ABORT (408, 'Timeout')\n logger.debug(`${correlationId}, ${importJobState}, ${operation}`);\n const timeOut = await checkTimeOut({correlationId, operation, importJobState});\n if (timeOut) {\n return setImportJobState({correlationId, operation, importJobState, errorMessage, errorStatus});\n }\n return false;\n }\n\n async function query(params, showParams) {\n const {showOperations, showOperationSettings, showRecordLoadParams, showImportJobState} = showParams;\n const {limit = 1000, skip = 0, ...rest} = params;\n const result = await db.collection(collection).find(rest, {projection: {\n _id: 0,\n operations: showOperations,\n operationSettings: showOperationSettings,\n recordLoadParams: showRecordLoadParams,\n importJobState: showImportJobState\n }})\n .limit(parseInt(limit, 10))\n .skip(parseInt(skip, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n return result;\n }\n\n async function queryById({correlationId, checkModTime = false}) {\n const result = await db.collection(collection).findOne({correlationId});\n if (checkModTime) {\n const timeOut = await checkTimeOut({correlationId});\n if (timeOut) {\n return queryById({correlationId});\n }\n return result;\n }\n\n return result;\n }\n\n // Check that if the item has waited too long\n // If the last modification time for the queueItem is older than 1 minute\n // set state to ABORT and return false, otherwise return true\n // If the state is already ABORT or ERROR return false\n\n async function checkTimeOut({correlationId}) {\n const {modificationTime, queueitemState: oldState, importJobState} = await db.collection(collection).findOne({correlationId});\n\n // should we check for DONE too?\n if ([QUEUE_ITEM_STATE.ABORT, QUEUE_ITEM_STATE.ERROR, QUEUE_ITEM_STATE.DONE].includes(oldState)) {\n logger.silly(`${correlationId} has already state: ${oldState}`);\n return false;\n }\n\n const timeoutTime = moment(modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n\n if (timeoutTime.isBefore()) {\n const finalImportJobStates = [IMPORT_JOB_STATE.ABORT, IMPORT_JOB_STATE.DONE, IMPORT_JOB_STATE.EMPTY, IMPORT_JOB_STATE.ERROR];\n if (!finalImportJobStates.includes(importJobState.CREATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'CREATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n if (!finalImportJobStates.includes(importJobState.UPDATE)) { // eslint-disable-line\n await setImportJobState({correlationId, operation: 'UPDATE', importJobState: IMPORT_JOB_STATE.ABORT});\n }\n\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.silly(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);\n\n try {\n //const metadataResult = await getFileMetadata({filename: clean});\n //logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);\n const noContent = await removeContent(params);\n if (noContent) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n } catch (err) {\n if (err instanceof MongoDriverError) {\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.silly(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n logger.error(err.message);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content from mongo for id: ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n\n if (result) {\n return {\n contentType: result.contentType,\n readStream: gridFSBucket.openDownloadStreamByName(clean)\n };\n }\n\n throw new ApiError(httpStatus.NOT_FOUND);\n }\n\n async function removeContent(params) {\n logger.info(`Removing content from mongo for id: ${params.correlationId} in ${collection}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); // njsscan-ignore: node_nosqli_injection\n logger.silly(`mongo/removeContent: result ${JSON.stringify(result)}`);\n\n if (result) {\n await gridFSBucket.delete(clean);\n return true;\n }\n\n return true;\n }\n\n // eslint-disable-next-line max-statements\n function getOne({queueItemState, importJobState = undefined}) {\n\n logger.silly(`queueItemState: ${queueItemState}, importJobState: ${JSON.stringify(importJobState)}`);\n const cleanQueueItemState = queueItemState ? {queueItemState: sanitize(queueItemState)} : undefined;\n\n try {\n\n // Just queueItemState\n if (queueItemState && importJobState === undefined) {\n logger.silly(`Checking DB ${collection} for just ${JSON.stringify(cleanQueueItemState.queueItemState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState});\n }\n\n // importJobState\n if (importJobState && queueItemState === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...importJobState});\n }\n\n // importJobState and queueItemState\n if (importJobState && queueItemState) {\n logger.silly(`Checking DB ${collection} for ${queueItemState} and ${JSON.stringify(importJobState)}`);\n return db.collection(collection).findOne({...cleanQueueItemState, ...importJobState});\n }\n\n logger.debug(`getOne not working!`);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, 'Missing parameters, cannot get queueItem');\n\n } catch (error) {\n logError(error);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from mongo for ${correlationId} in ${collection}`);\n const clean = sanitize(correlationId);\n try {\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n logError(error);\n }\n }\n\n async function pushIds({correlationId, handledIds, rejectedIds}) {\n logger.verbose(`Push ids (${handledIds.length}) and rejectedIds (${rejectedIds.length}) ${correlationId} to ${collection}`);\n logger.debug(`ids (${handledIds.length}): ${JSON.stringify(handledIds)}, rejectedIds ${rejectedIds.length}: ${JSON.stringify(rejectedIds)}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n handledIds: {$each: handledIds},\n rejectedIds: {$each: rejectedIds}\n }\n });\n }\n\n async function pushMessages({correlationId, messages, messageField = 'messages'}) {\n logger.verbose(`Push messages (${messages.length}) to ${messageField} ${correlationId} to ${collection}`);\n logger.silly(`Messages (${messages.length}): ${JSON.stringify(messages)}}`);\n const clean = sanitize(correlationId);\n const cleanMessageField = sanitize(messageField);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate()\n },\n $push: {\n [cleanMessageField]: {$each: messages}\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = undefined, errorStatus = undefined}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${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"],"file":"mongo.js"}
package/dist/utils.js CHANGED
@@ -96,7 +96,8 @@ function createRecordResponseItem({
96
96
  ...recordResponseStatusAndMessage
97
97
  };
98
98
  return recordResponseItem;
99
- }
99
+ } // eslint-disable-next-line max-statements
100
+
100
101
 
101
102
  function getRecordResponseStatusAndMessage(responseStatus, responsePayload) {
102
103
  logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);
@@ -132,6 +133,15 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload) {
132
133
  };
133
134
  }
134
135
 
136
+ if (/^MatchValidation for all/u.test(message)) {
137
+ const duplicateIds = responsePayload.ids || [];
138
+ return {
139
+ status: 'DUPLICATE',
140
+ message,
141
+ duplicateIds
142
+ };
143
+ }
144
+
135
145
  return {
136
146
  status: 'CONFLICT',
137
147
  message
@@ -139,10 +149,16 @@ function getRecordResponseStatusAndMessage(responseStatus, responsePayload) {
139
149
  }
140
150
 
141
151
  if ([_httpStatus.default.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {
142
- return {
152
+ const unprocessableIds = responsePayload.ids || [];
153
+ const response = unprocessableIds.length > 0 ? {
154
+ status: 'UNPROCESSABLE_ENTITY',
155
+ message,
156
+ unprocessableIds
157
+ } : {
143
158
  status: 'UNPROCESSABLE_ENTITY',
144
159
  message
145
160
  };
161
+ return response;
146
162
  }
147
163
 
148
164
  if ([_httpStatus.default.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.js"],"names":["logger","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","responseStatusName","httpStatus","message","getMessageFromResponsePayload","includes","status","possibleIds","ids","CONFLICT","test","duplicateIds","UNPROCESSABLE_ENTITY","NOT_FOUND","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField"],"mappings":"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","sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload) {\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\n logger.debug(`Response message: ${message}`);\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR'].includes(responseStatus)) {\n return {status: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n const possibleIds = responsePayload.ids || [];\n return {status: responseStatus, message, possibleIds};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n const duplicateIds = responsePayload.ids || [];\n return {status: 'DUPLICATE', message, duplicateIds};\n }\n return {status: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n return {status: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {status: 'NOT_FOUND', message};\n }\n\n // Otherwise\n return {status: 'ERROR', message};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../src/utils.js"],"names":["logger","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","responseStatusName","httpStatus","message","getMessageFromResponsePayload","includes","status","possibleIds","ids","CONFLICT","test","duplicateIds","UNPROCESSABLE_ENTITY","unprocessableIds","response","length","NOT_FOUND","String","addRecordResponseItem","correlationId","mongoOperator","pushMessages","messages","messageField"],"mappings":"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","sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants';\nimport httpStatus from 'http-status';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload);\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) {\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\n logger.debug(`Response message: ${message}`);\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR'].includes(responseStatus)) {\n return {status: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n const possibleIds = responsePayload.ids || [];\n return {status: responseStatus, message, possibleIds};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n const duplicateIds = responsePayload.ids || [];\n return {status: 'DUPLICATE', message, duplicateIds};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n const duplicateIds = responsePayload.ids || [];\n return {status: 'DUPLICATE', message, duplicateIds};\n }\n return {status: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n const unprocessableIds = responsePayload.ids || [];\n const response = unprocessableIds.length > 0 ? {status: 'UNPROCESSABLE_ENTITY', message, unprocessableIds} : {status: 'UNPROCESSABLE_ENTITY', message};\n return response;\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {status: 'NOT_FOUND', message};\n }\n\n // Otherwise\n return {status: 'ERROR', message};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n"],"file":"utils.js"}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/melinda-rest-api-commons.git"
15
15
  },
16
16
  "license": "AGPL-3.0+",
17
- "version": "2.2.0-alpha.13",
17
+ "version": "2.2.0-alpha.16",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=14"