@natlibfi/melinda-rest-api-commons 2.2.0-alpha.3 → 2.2.0-alpha.6

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
@@ -56,6 +56,7 @@ const IMPORT_JOB_STATE = {
56
56
  EMPTY: 'EMPTY',
57
57
  QUEUING: 'QUEUING',
58
58
  IN_QUEUE: 'IN_QUEUE',
59
+ IMPORTING: 'IMPORTING',
59
60
  PROCESSING: 'PROCESSING',
60
61
  DONE: 'DONE',
61
62
  ERROR: 'ERROR',
@@ -72,7 +73,8 @@ exports.CHUNK_SIZE = CHUNK_SIZE;
72
73
  const conversionFormats = {
73
74
  MARCXML: 1,
74
75
  ISO2709: 2,
75
- JSON: 3
76
+ JSON: 3,
77
+ ALEPHSEQ: 4
76
78
  };
77
79
  exports.conversionFormats = conversionFormats;
78
80
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.js"],"names":["QUEUE_ITEM_STATE","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","conversionFormats","MARCXML","ISO2709","JSON"],"mappings":";;;;;;;AAAA;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;AAEA;AAEO,MAAMA,gBAAgB,GAAG;AAC9BC,EAAAA,SAAS,EAAE;AACTC,IAAAA,eAAe,EAAE,iBADR;AAETC,IAAAA,kBAAkB,EAAE,oBAFX;AAGTC,IAAAA,mBAAmB,EAAE,qBAHZ;AAITC,IAAAA,SAAS,EAAE,WAJF;AAKTC,IAAAA,UAAU,EAAE,YALH;AAMTC,IAAAA,mBAAmB,EAAE;AANZ,GADmB;AAS9BC,EAAAA,QAAQ,EAAE;AACRC,IAAAA,SAAS,EAAE,WADH;AAERC,IAAAA,UAAU,EAAE,YAFJ;AAGRC,IAAAA,QAAQ,EAAE;AAHF,GAToB;AAc9BC,EAAAA,IAAI,EAAE,MAdwB;AAe9BC,EAAAA,KAAK,EAAE,OAfuB;AAgB9BC,EAAAA,KAAK,EAAE;AAhBuB,CAAzB;;AAmBA,MAAMC,gBAAgB,GAAG;AAC9BC,EAAAA,KAAK,EAAE,OADuB;AAE9BC,EAAAA,OAAO,EAAE,SAFqB;AAG9BN,EAAAA,QAAQ,EAAE,UAHoB;AAI9BO,EAAAA,UAAU,EAAE,YAJkB;AAK9BN,EAAAA,IAAI,EAAE,MALwB;AAM9BC,EAAAA,KAAK,EAAE,OANuB;AAO9BC,EAAAA,KAAK,EAAE;AAPuB,CAAzB;;AAUA,MAAMK,UAAU,GAAG;AACxBC,EAAAA,MAAM,EAAE,QADgB;AAExBC,EAAAA,MAAM,EAAE;AAFgB,CAAnB;;AAKA,MAAMC,UAAU,GAAG,GAAnB;;AAEA,MAAMC,iBAAiB,GAAG;AAC/BC,EAAAA,OAAO,EAAE,CADsB;AAE/BC,EAAAA,OAAO,EAAE,CAFsB;AAG/BC,EAAAA,IAAI,EAAE;AAHyB,CAA1B","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\n// 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 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\nexport const conversionFormats = {\n MARCXML: 1,\n ISO2709: 2,\n JSON: 3\n};\n"],"file":"constants.js"}
1
+ {"version":3,"sources":["../src/constants.js"],"names":["QUEUE_ITEM_STATE","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","conversionFormats","MARCXML","ISO2709","JSON","ALEPHSEQ"],"mappings":";;;;;;;AAAA;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;AAEA;AAEO,MAAMA,gBAAgB,GAAG;AAC9BC,EAAAA,SAAS,EAAE;AACTC,IAAAA,eAAe,EAAE,iBADR;AAETC,IAAAA,kBAAkB,EAAE,oBAFX;AAGTC,IAAAA,mBAAmB,EAAE,qBAHZ;AAITC,IAAAA,SAAS,EAAE,WAJF;AAKTC,IAAAA,UAAU,EAAE,YALH;AAMTC,IAAAA,mBAAmB,EAAE;AANZ,GADmB;AAS9BC,EAAAA,QAAQ,EAAE;AACRC,IAAAA,SAAS,EAAE,WADH;AAERC,IAAAA,UAAU,EAAE,YAFJ;AAGRC,IAAAA,QAAQ,EAAE;AAHF,GAToB;AAc9BC,EAAAA,IAAI,EAAE,MAdwB;AAe9BC,EAAAA,KAAK,EAAE,OAfuB;AAgB9BC,EAAAA,KAAK,EAAE;AAhBuB,CAAzB;;AAmBA,MAAMC,gBAAgB,GAAG;AAC9BC,EAAAA,KAAK,EAAE,OADuB;AAE9BC,EAAAA,OAAO,EAAE,SAFqB;AAG9BN,EAAAA,QAAQ,EAAE,UAHoB;AAI9BF,EAAAA,SAAS,EAAE,WAJmB;AAK9BS,EAAAA,UAAU,EAAE,YALkB;AAM9BN,EAAAA,IAAI,EAAE,MANwB;AAO9BC,EAAAA,KAAK,EAAE,OAPuB;AAQ9BC,EAAAA,KAAK,EAAE;AARuB,CAAzB;;AAWA,MAAMK,UAAU,GAAG;AACxBC,EAAAA,MAAM,EAAE,QADgB;AAExBC,EAAAA,MAAM,EAAE;AAFgB,CAAnB;;AAKA,MAAMC,UAAU,GAAG,GAAnB;;AAEA,MAAMC,iBAAiB,GAAG;AAC/BC,EAAAA,OAAO,EAAE,CADsB;AAE/BC,EAAAA,OAAO,EAAE,CAFsB;AAG/BC,EAAAA,IAAI,EAAE,CAHyB;AAI/BC,EAAAA,QAAQ,EAAE;AAJqB,CAA1B","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\n// 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\nexport const conversionFormats = {\n MARCXML: 1,\n ISO2709: 2,\n JSON: 3,\n ALEPHSEQ: 4\n};\n"],"file":"constants.js"}
@@ -69,6 +69,10 @@ function _default() {
69
69
  return _marcRecordSerializers.Json.to(record);
70
70
  }
71
71
 
72
+ if (format === _constants.conversionFormats.ALEPHSEQ) {
73
+ return _marcRecordSerializers.AlephSequential.to(record);
74
+ }
75
+
72
76
  throw new _melindaCommons.Error(_httpStatus.default.UNSUPPORTED_MEDIA_TYPE);
73
77
  } catch (err) {
74
78
  (0, _utils.logError)(err);
@@ -80,7 +84,8 @@ function _default() {
80
84
 
81
85
  throw new _melindaCommons.Error(_httpStatus.default.BAD_REQUEST, 'Error while serializing record');
82
86
  }
83
- }
87
+ } // eslint-disable-next-line max-statements
88
+
84
89
 
85
90
  function unserialize(data, format, validationOptions = {
86
91
  subfieldValues: false
@@ -106,6 +111,11 @@ function _default() {
106
111
  return _marcRecordSerializers.Json.from(data, validationOptions);
107
112
  }
108
113
 
114
+ if (format === _constants.conversionFormats.ALEPHSEQ) {
115
+ logger.silly('Unserialize format aleph sequential');
116
+ return _marcRecordSerializers.AlephSequential.from(data, validationOptions);
117
+ }
118
+
109
119
  throw new _melindaCommons.Error(_httpStatus.default.UNSUPPORTED_MEDIA_TYPE);
110
120
  } catch (err) {
111
121
  (0, _utils.logError)(err);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers/conversion.js"],"names":["logger","serialize","unserialize","record","format","verbose","conversionFormats","MARCXML","to","ISO2709","JSON","Json","ConversionError","httpStatus","UNSUPPORTED_MEDIA_TYPE","err","BAD_REQUEST","data","validationOptions","subfieldValues","silly","debug","stringify","from"],"mappings":";;;;;;;AA4BA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAjCA;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;AASe,oBAAY;AACzB,QAAMA,MAAM,GAAG,0CAAf;AAEA,SAAO;AAACC,IAAAA,SAAD;AAAYC,IAAAA;AAAZ,GAAP;;AAEA,WAASD,SAAT,CAAmBE,MAAnB,EAA2BC,MAA3B,EAAmC;AACjCJ,IAAAA,MAAM,CAACK,OAAP,CAAgB,yBAAwBD,MAAO,EAA/C;;AACA,QAAI;AACF,UAAIA,MAAM,KAAKE,6BAAkBC,OAAjC,EAA0C;AACxC,eAAOA,+BAAQC,EAAR,CAAWL,MAAX,CAAP;AACD;;AAED,UAAIC,MAAM,KAAKE,6BAAkBG,OAAjC,EAA0C;AACxC,eAAOA,+BAAQD,EAAR,CAAWL,MAAX,CAAP;AACD;;AAED,UAAIC,MAAM,KAAKE,6BAAkBI,IAAjC,EAAuC;AACrC,eAAOC,4BAAKH,EAAL,CAAQL,MAAR,CAAP;AACD;;AAED,YAAM,IAAIS,qBAAJ,CAAoBC,oBAAWC,sBAA/B,CAAN;AACD,KAdD,CAcE,OAAOC,GAAP,EAAY;AACZ,2BAASA,GAAT;;AACA,UAAIA,GAAG,YAAYH,qBAAnB,EAAoC;AAAE;AACpC,cAAMG,GAAN;AACD;;AACD,YAAM,IAAIH,qBAAJ,CAAoBC,oBAAWG,WAA/B,EAA4C,gCAA5C,CAAN;AACD;AACF;;AAED,WAASd,WAAT,CAAqBe,IAArB,EAA2Bb,MAA3B,EAAmCc,iBAAiB,GAAG;AAACC,IAAAA,cAAc,EAAE;AAAjB,GAAvD,EAAgF;AAC9EnB,IAAAA,MAAM,CAACK,OAAP,CAAgB,6BAA4BD,MAAO,EAAnD;AACAJ,IAAAA,MAAM,CAACoB,KAAP,CAAc,WAAUhB,MAAO,EAA/B;AACAJ,IAAAA,MAAM,CAACqB,KAAP,CAAc,uBAAsBX,IAAI,CAACY,SAAL,CAAeJ,iBAAf,CAAkC,EAAtE;AACAlB,IAAAA,MAAM,CAACoB,KAAP,CAAc,SAAQV,IAAI,CAACY,SAAL,CAAeL,IAAf,CAAqB,EAA3C;;AACA,QAAI;AACF,UAAIb,MAAM,KAAKE,6BAAkBC,OAAjC,EAA0C;AACxCP,QAAAA,MAAM,CAACoB,KAAP,CAAa,4BAAb;AACA,eAAOb,+BAAQgB,IAAR,CAAaN,IAAb,EAAmBC,iBAAnB,CAAP;AACD;;AAED,UAAId,MAAM,KAAKE,6BAAkBG,OAAjC,EAA0C;AACxCT,QAAAA,MAAM,CAACoB,KAAP,CAAa,4BAAb;AACA,eAAOX,+BAAQc,IAAR,CAAaN,IAAb,EAAmBC,iBAAnB,CAAP;AACD;;AAED,UAAId,MAAM,KAAKE,6BAAkBI,IAAjC,EAAuC;AACrCV,QAAAA,MAAM,CAACoB,KAAP,CAAa,yBAAb;AACA,eAAOT,4BAAKY,IAAL,CAAUN,IAAV,EAAgBC,iBAAhB,CAAP;AACD;;AAED,YAAM,IAAIN,qBAAJ,CAAoBC,oBAAWC,sBAA/B,CAAN;AACD,KAjBD,CAiBE,OAAOC,GAAP,EAAY;AACZ,2BAASA,GAAT;;AACA,UAAIA,GAAG,YAAYH,qBAAnB,EAAoC;AAAE;AACpC,cAAMG,GAAN;AACD;;AACD,YAAM,IAAIH,qBAAJ,CAAoBC,oBAAWG,WAA/B,EAA4C,kCAA5C,CAAN;AACD;AACF;AACF","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 httpStatus from 'http-status';\nimport {MARCXML, ISO2709, Json} from '@natlibfi/marc-record-serializers';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport {conversionFormats} from '../constants';\nimport {logError} from '../utils';\n\nexport default function () {\n const logger = createLogger();\n\n return {serialize, unserialize};\n\n function serialize(record, format) {\n logger.verbose(`Serializing record to ${format}`);\n try {\n if (format === conversionFormats.MARCXML) {\n return MARCXML.to(record);\n }\n\n if (format === conversionFormats.ISO2709) {\n return ISO2709.to(record);\n }\n\n if (format === conversionFormats.JSON) {\n return Json.to(record);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statement\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while serializing record');\n }\n }\n\n function unserialize(data, format, validationOptions = {subfieldValues: false}) {\n logger.verbose(`Unserializing record from ${format}`);\n logger.silly(`Format: ${format}`);\n logger.debug(`Validation options: ${JSON.stringify(validationOptions)}`);\n logger.silly(`Data: ${JSON.stringify(data)}`);\n try {\n if (format === conversionFormats.MARCXML) {\n logger.silly('Unserialize format marcxml');\n return MARCXML.from(data, validationOptions);\n }\n\n if (format === conversionFormats.ISO2709) {\n logger.silly('Unserialize format iso2709');\n return ISO2709.from(data, validationOptions);\n }\n\n if (format === conversionFormats.JSON) {\n logger.silly('Unserialize format json');\n return Json.from(data, validationOptions);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statement\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while unserializing record');\n }\n }\n}\n"],"file":"conversion.js"}
1
+ {"version":3,"sources":["../../src/helpers/conversion.js"],"names":["logger","serialize","unserialize","record","format","verbose","conversionFormats","MARCXML","to","ISO2709","JSON","Json","ALEPHSEQ","AlephSequential","ConversionError","httpStatus","UNSUPPORTED_MEDIA_TYPE","err","BAD_REQUEST","data","validationOptions","subfieldValues","silly","debug","stringify","from"],"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 httpStatus from 'http-status';\nimport {MARCXML, ISO2709, Json, AlephSequential} from '@natlibfi/marc-record-serializers';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport {conversionFormats} from '../constants';\nimport {logError} from '../utils';\n\nexport default function () {\n const logger = createLogger();\n\n return {serialize, unserialize};\n\n function serialize(record, format) {\n logger.verbose(`Serializing record to ${format}`);\n try {\n if (format === conversionFormats.MARCXML) {\n return MARCXML.to(record);\n }\n\n if (format === conversionFormats.ISO2709) {\n return ISO2709.to(record);\n }\n\n if (format === conversionFormats.JSON) {\n return Json.to(record);\n }\n\n if (format === conversionFormats.ALEPHSEQ) {\n return AlephSequential.to(record);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statement\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while serializing record');\n }\n }\n\n // eslint-disable-next-line max-statements\n function unserialize(data, format, validationOptions = {subfieldValues: false}) {\n logger.verbose(`Unserializing record from ${format}`);\n logger.silly(`Format: ${format}`);\n logger.debug(`Validation options: ${JSON.stringify(validationOptions)}`);\n logger.silly(`Data: ${JSON.stringify(data)}`);\n try {\n if (format === conversionFormats.MARCXML) {\n logger.silly('Unserialize format marcxml');\n return MARCXML.from(data, validationOptions);\n }\n\n if (format === conversionFormats.ISO2709) {\n logger.silly('Unserialize format iso2709');\n return ISO2709.from(data, validationOptions);\n }\n\n if (format === conversionFormats.JSON) {\n logger.silly('Unserialize format json');\n return Json.from(data, validationOptions);\n }\n\n if (format === conversionFormats.ALEPHSEQ) {\n logger.silly('Unserialize format aleph sequential');\n return AlephSequential.from(data, validationOptions);\n }\n\n throw new ConversionError(httpStatus.UNSUPPORTED_MEDIA_TYPE);\n } catch (err) {\n logError(err);\n if (err instanceof ConversionError) { // eslint-disable-line functional/no-conditional-statement\n throw err;\n }\n throw new ConversionError(httpStatus.BAD_REQUEST, 'Error while unserializing record');\n }\n }\n}\n"],"file":"conversion.js"}
@@ -62,6 +62,9 @@ describe('services/conversion', () => {
62
62
  const json = getFixture({
63
63
  components: ['json1']
64
64
  });
65
+ const alephSeq = getFixture({
66
+ components: ['aleph_sequential']
67
+ });
65
68
  describe('factory', () => {
66
69
  it('Should create the expected object', () => {
67
70
  const service = (0, _conversion.default)();
@@ -84,6 +87,10 @@ describe('services/conversion', () => {
84
87
  const data = conversionService.serialize(marcRecord, _constants.conversionFormats.JSON);
85
88
  (0, _chai.expect)(data).to.equal(json);
86
89
  });
90
+ it('Should serialize to aleph sequential', () => {
91
+ const data = conversionService.serialize(marcRecord, _constants.conversionFormats.ALEPHSEQ);
92
+ (0, _chai.expect)(data).to.equal(alephSeq);
93
+ });
87
94
  });
88
95
  describe('#unserialize', () => {
89
96
  it('Should throw because of unsupported format', () => {
@@ -101,6 +108,10 @@ describe('services/conversion', () => {
101
108
  const record = conversionService.unserialize(json, _constants.conversionFormats.JSON);
102
109
  (0, _chai.expect)(record.equalsTo(marcRecord)).to.equal(true);
103
110
  });
111
+ it('Should unserialize from Aleph sequential', () => {
112
+ const record = conversionService.unserialize(alephSeq, _constants.conversionFormats.ALEPHSEQ);
113
+ (0, _chai.expect)(record.equalsTo(marcRecord)).to.equal(true);
114
+ });
104
115
  it('Should throw because the record could not be unserialized', () => {
105
116
  (0, _chai.expect)(() => {
106
117
  conversionService.unserialize('', _constants.conversionFormats.JSON);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/helpers/conversion.spec.js"],"names":["describe","getFixture","root","__dirname","conversionService","marcRecord","MarcRecord","JSON","parse","components","subfieldValues","marcXml","iso2709","json","it","service","to","be","an","and","respondTo","serialize","throw","data","conversionFormats","MARCXML","equal","ISO2709","unserialize","record","equalsTo","ConversionError"],"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 {expect} from 'chai';\nimport fixtureFactory from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport createConversionService from './conversion';\nimport {conversionFormats} from '../constants';\n\ndescribe('services/conversion', () => {\n const {getFixture} = fixtureFactory({root: [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'conversion'\n ]});\n const conversionService = createConversionService();\n\n const marcRecord = new MarcRecord(JSON.parse(getFixture({components: ['json1']})), {subfieldValues: false});\n const marcXml = getFixture({components: ['marcxml1']});\n const iso2709 = getFixture({components: ['iso2709_1']});\n const json = getFixture({components: ['json1']});\n\n describe('factory', () => {\n it('Should create the expected object', () => {\n const service = createConversionService();\n expect(service).to.be.an('object').and\n .respondTo('serialize')\n .respondTo('unserialize');\n });\n });\n\n describe('#serialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.serialize).to.throw();\n });\n\n it('Should serialize to MARCXML', () => {\n const data = conversionService.serialize(marcRecord, conversionFormats.MARCXML);\n expect(data).to.equal(marcXml);\n });\n\n it('Should serialize to ISO2709', () => {\n const data = conversionService.serialize(marcRecord, conversionFormats.ISO2709);\n expect(data).to.equal(iso2709);\n });\n\n it('Should serialize to JSON', () => {\n const data = conversionService.serialize(marcRecord, conversionFormats.JSON);\n expect(data).to.equal(json);\n });\n });\n\n describe('#unserialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.unserialize).to.throw();\n });\n\n it('Should unserialize from MARCXML', async () => {\n const record = await conversionService.unserialize(marcXml, conversionFormats.MARCXML);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from ISO2709', () => {\n const record = conversionService.unserialize(iso2709, conversionFormats.ISO2709);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from JSON', () => {\n const record = conversionService.unserialize(json, conversionFormats.JSON);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should throw because the record could not be unserialized', () => {\n expect(() => {\n conversionService.unserialize('', conversionFormats.JSON);\n }).to.throw(ConversionError);\n });\n });\n});\n"],"file":"conversion.spec.js"}
1
+ {"version":3,"sources":["../../src/helpers/conversion.spec.js"],"names":["describe","getFixture","root","__dirname","conversionService","marcRecord","MarcRecord","JSON","parse","components","subfieldValues","marcXml","iso2709","json","alephSeq","it","service","to","be","an","and","respondTo","serialize","throw","data","conversionFormats","MARCXML","equal","ISO2709","ALEPHSEQ","unserialize","record","equalsTo","ConversionError"],"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 {expect} from 'chai';\nimport fixtureFactory from '@natlibfi/fixura';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ConversionError} from '@natlibfi/melinda-commons';\nimport createConversionService from './conversion';\nimport {conversionFormats} from '../constants';\n\ndescribe('services/conversion', () => {\n const {getFixture} = fixtureFactory({root: [\n __dirname,\n '..',\n '..',\n 'test-fixtures',\n 'conversion'\n ]});\n const conversionService = createConversionService();\n\n const marcRecord = new MarcRecord(JSON.parse(getFixture({components: ['json1']})), {subfieldValues: false});\n const marcXml = getFixture({components: ['marcxml1']});\n const iso2709 = getFixture({components: ['iso2709_1']});\n const json = getFixture({components: ['json1']});\n const alephSeq = getFixture({components: ['aleph_sequential']});\n\n\n describe('factory', () => {\n it('Should create the expected object', () => {\n const service = createConversionService();\n expect(service).to.be.an('object').and\n .respondTo('serialize')\n .respondTo('unserialize');\n });\n });\n\n describe('#serialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.serialize).to.throw();\n });\n\n it('Should serialize to MARCXML', () => {\n const data = conversionService.serialize(marcRecord, conversionFormats.MARCXML);\n expect(data).to.equal(marcXml);\n });\n\n it('Should serialize to ISO2709', () => {\n const data = conversionService.serialize(marcRecord, conversionFormats.ISO2709);\n expect(data).to.equal(iso2709);\n });\n\n it('Should serialize to JSON', () => {\n const data = conversionService.serialize(marcRecord, conversionFormats.JSON);\n expect(data).to.equal(json);\n });\n\n it('Should serialize to aleph sequential', () => {\n const data = conversionService.serialize(marcRecord, conversionFormats.ALEPHSEQ);\n expect(data).to.equal(alephSeq);\n });\n\n });\n\n describe('#unserialize', () => {\n it('Should throw because of unsupported format', () => {\n expect(conversionService.unserialize).to.throw();\n });\n\n it('Should unserialize from MARCXML', async () => {\n const record = await conversionService.unserialize(marcXml, conversionFormats.MARCXML);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from ISO2709', () => {\n const record = conversionService.unserialize(iso2709, conversionFormats.ISO2709);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from JSON', () => {\n const record = conversionService.unserialize(json, conversionFormats.JSON);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n it('Should unserialize from Aleph sequential', () => {\n const record = conversionService.unserialize(alephSeq, conversionFormats.ALEPHSEQ);\n expect(record.equalsTo(marcRecord)).to.equal(true);\n });\n\n\n it('Should throw because the record could not be unserialized', () => {\n expect(() => {\n conversionService.unserialize('', conversionFormats.JSON);\n }).to.throw(ConversionError);\n });\n });\n});\n"],"file":"conversion.spec.js"}
package/dist/mongo.js CHANGED
@@ -112,10 +112,7 @@ async function _default(MONGO_URI, collection) {
112
112
  cataloger,
113
113
  oCatalogerIn,
114
114
  operation,
115
- noop = undefined,
116
- unique = undefined,
117
- merge = undefined,
118
- prio = true
115
+ operationSettings
119
116
  }) {
120
117
  const time = (0, _moment.default)().toDate();
121
118
  const newQueueItem = {
@@ -125,11 +122,8 @@ async function _default(MONGO_URI, collection) {
125
122
  operations: [operation],
126
123
  oCatalogerIn,
127
124
  operationSettings: {
128
- unique,
129
- noop,
130
- prio,
131
- merge,
132
- originalOperation: operation
125
+ prio: true,
126
+ ...operationSettings
133
127
  },
134
128
  queueItemState: _constants.QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,
135
129
  importJobState: {
@@ -165,7 +159,7 @@ async function _default(MONGO_URI, collection) {
165
159
  contentType,
166
160
  recordLoadParams,
167
161
  stream,
168
- prio = false
162
+ operationSettings
169
163
  }) {
170
164
  const time = (0, _moment.default)().toDate();
171
165
  const newQueueItem = {
@@ -175,8 +169,8 @@ async function _default(MONGO_URI, collection) {
175
169
  operation,
176
170
  operations: [operation],
177
171
  operationSettings: {
178
- prio,
179
- originalOperation: operation
172
+ prio: false,
173
+ ...operationSettings
180
174
  },
181
175
  contentType,
182
176
  recordLoadParams,
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","correlationId","cataloger","oCatalogerIn","operation","noop","undefined","unique","merge","prio","time","toDate","newQueueItem","operations","operationSettings","originalOperation","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","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","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"],"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\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};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, noop = undefined, unique = undefined, merge = undefined, prio = true}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n operations: [operation],\n oCatalogerIn,\n operationSettings: {unique, noop, prio, merge, originalOperation: operation},\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\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 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, prio = false}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n operations: [operation],\n operationSettings: {prio, originalOperation: operation},\n contentType,\n recordLoadParams,\n queueItemState: stream ? QUEUE_ITEM_STATE.VALIDATOR.UPLOADING : QUEUE_ITEM_STATE.VALIDATOR.WAITING_FOR_RECORDS,\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 //logger.info(`Setting queue-item operation from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.debug(`We fould 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 = [addOperation, ...operationsAfterRemove];\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"],"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","correlationId","cataloger","oCatalogerIn","operation","operationSettings","time","toDate","newQueueItem","operations","prio","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","importJobState","CREATE","IMPORT_JOB_STATE","EMPTY","UPDATE","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"],"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;;AAWA;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,GAAP;;AAEA,iBAAehB,UAAf,CAA0B;AAACiB,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,YAAY,EAAEd,IAfK;AAgBnBe,MAAAA,gBAAgB,EAAEf,IAhBC;AAiBnBgB,MAAAA,UAAU,EAAE,EAjBO;AAkBnBC,MAAAA,WAAW,EAAE;AAlBM,KAArB;;AAoBA,QAAI;AACF,YAAMC,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BoD,SAA1B,CAAoCjB,YAApC,CAArB;;AACA,UAAIgB,MAAM,CAACE,YAAX,EAAyB;AACvBpD,QAAAA,MAAM,CAACqD,IAAP,CAAa,2BAA0BvB,SAAU,IAAGH,aAAc,qBAAoB5B,UAAW,EAAjG;AACA;AACD;;AACD,YAAM,IAAIuD,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,iBAAe7C,UAAf,CAA0B;AAACgB,IAAAA,aAAD;AAAgBC,IAAAA,SAAhB;AAA2BC,IAAAA,YAA3B;AAAyCC,IAAAA,SAAzC;AAAoD4B,IAAAA,WAApD;AAAiEC,IAAAA,gBAAjE;AAAmFC,IAAAA,MAAnF;AAA2F7B,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;AAUnB2B,MAAAA,WAVmB;AAWnBC,MAAAA,gBAXmB;AAYnBtB,MAAAA,cAAc,EAAEuB,MAAM,GAAGtB,4BAAiBC,SAAjB,CAA2BsB,SAA9B,GAA0CvB,4BAAiBC,SAAjB,CAA2BuB,mBAZxE;AAanBrB,MAAAA,cAAc,EAAE;AACdC,QAAAA,MAAM,EAAEC,4BAAiBC,KADX;AAEdC,QAAAA,MAAM,EAAEF,4BAAiBC;AAFX,OAbG;AAiBnBE,MAAAA,YAAY,EAAEd,IAjBK;AAkBnBe,MAAAA,gBAAgB,EAAEf,IAlBC;AAmBnBgB,MAAAA,UAAU,EAAE,EAnBO;AAoBnBC,MAAAA,WAAW,EAAE;AApBM,KAArB,CAFuI,CAyBvI;;AACA,QAAIW,MAAJ,EAAY;AACV,UAAI;AACF;AACAtD,QAAAA,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BoD,SAA1B,CAAoCjB,YAApC;AACAlC,QAAAA,MAAM,CAACqD,IAAP,CAAa,2BAA0BvB,SAAU,IAAGH,aAAc,qBAAoB5B,UAAW,GAAjG;AACA,eAAO,IAAIgE,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,gBAAMC,YAAY,GAAG3D,YAAY,CAAC4D,gBAAb,CAA8BxC,aAA9B,CAArB;AAEAiC,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,CAACrC,aAAD,CAAP;AACD,WAFgB,CAHnB;AAMD,SATM,CAAP;AAUD,OAdD,CAcE,OAAO8B,KAAP,EAAc;AACd,6BAASA,KAAT;AACA,cAAM,IAAIH,qBAAJ,CAAaC,oBAAWC,qBAAxB,CAAN;AACD;AACF;;AAEDxD,IAAAA,MAAM,CAACyE,KAAP,CAAc,WAAd,EA/CuI,CAgDvI;;AACA,QAAI,CAACb,MAAL,EAAa;AACX,UAAI;AACF,cAAMV,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BoD,SAA1B,CAAoCjB,YAApC,CAArB;;AACA,YAAIgB,MAAM,CAACE,YAAX,EAAyB;AACvBpD,UAAAA,MAAM,CAACqD,IAAP,CAAa,oCAAmCvB,SAAU,IAAGH,aAAc,qBAAoB5B,UAAW,EAA1G;AACA,iBAAO;AAAC4B,YAAAA,aAAD;AAAgBU,YAAAA,cAAc,EAAEC,4BAAiBC,SAAjB,CAA2BuB;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,GA3GmD,CA6GpD;;;AACA,iBAAe5C,gBAAf,CAAgC;AAACe,IAAAA,aAAD;AAAgB+C,IAAAA,KAAhB;AAAuBC,IAAAA,YAAY,GAAGH,SAAtC;AAAiDI,IAAAA,WAAW,GAAGJ;AAA/D,GAAhC,EAA2G;AACzG;AACA;AACA,UAAMK,OAAO,GAAG,MAAMC,YAAY,CAAC;AAACnD,MAAAA;AAAD,KAAD,CAAlC;;AACA,QAAIkD,OAAJ,EAAa;AACX,aAAOxD,QAAQ,CAAC;AAACM,QAAAA,aAAD;AAAgB+C,QAAAA,KAAhB;AAAuBC,QAAAA,YAAvB;AAAqCC,QAAAA;AAArC,OAAD,CAAf;AACD;;AACD,WAAO,KAAP;AACD,GAtHmD,CAwHpD;;;AACA,iBAAe/D,yBAAf,CAAyC;AAACc,IAAAA,aAAD;AAAgBG,IAAAA,SAAhB;AAA2BW,IAAAA,cAA3B;AAA2CkC,IAAAA,YAAY,GAAG,EAA1D;AAA8DC,IAAAA,WAAW,GAAG;AAA5E,GAAzC,EAA0H;AACxH;AACA;AACA5E,IAAAA,MAAM,CAACyE,KAAP,CAAc,GAAE9C,aAAc,KAAIc,cAAe,KAAIX,SAAU,EAA/D;AACA,UAAM+C,OAAO,GAAG,MAAMC,YAAY,CAAC;AAACnD,MAAAA,aAAD;AAAgBG,MAAAA,SAAhB;AAA2BW,MAAAA;AAA3B,KAAD,CAAlC;;AACA,QAAIoC,OAAJ,EAAa;AACX,aAAOvD,iBAAiB,CAAC;AAACK,QAAAA,aAAD;AAAgBG,QAAAA,SAAhB;AAA2BW,QAAAA,cAA3B;AAA2CkC,QAAAA,YAA3C;AAAyDC,QAAAA;AAAzD,OAAD,CAAxB;AACD;;AACD,WAAO,KAAP;AACD;;AAED,iBAAe9D,KAAf,CAAqBiE,MAArB,EAA6B;AAC3B,UAAM7B,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BiF,IAA1B,CAA+BD,MAA/B,EAAuC;AAACE,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN;AAAb,KAAvC,EAClBC,OADkB,EAArB;AAEAnF,IAAAA,MAAM,CAACyE,KAAP,CAAc,iBAAgBvB,MAAM,CAACkC,MAAP,GAAgB,CAAhB,GAAoB,QAApB,GAA+B,YAAa,EAA1E;AACA,WAAOlC,MAAP;AACD;;AAED,iBAAenC,SAAf,CAAyB;AAACY,IAAAA,aAAD;AAAgB0D,IAAAA,YAAY,GAAG;AAA/B,GAAzB,EAAgE;AAC9D,UAAMnC,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC;AAAC3D,MAAAA;AAAD,KAAlC,CAArB;;AACA,QAAI0D,YAAJ,EAAkB;AAChB,YAAMR,OAAO,GAAG,MAAMC,YAAY,CAAC;AAACnD,QAAAA;AAAD,OAAD,CAAlC;;AACA,UAAIkD,OAAJ,EAAa;AACX,eAAO9D,SAAS,CAAC;AAACY,UAAAA;AAAD,SAAD,CAAhB;AACD;;AACD,aAAOuB,MAAP;AACD;;AAED,WAAOA,MAAP;AACD,GAtJmD,CAwJpD;AACA;AACA;AACA;;;AAEA,iBAAe4B,YAAf,CAA4B;AAACnD,IAAAA;AAAD,GAA5B,EAA6C;AAC3C,UAAM;AAACoB,MAAAA,gBAAD;AAAmBwC,MAAAA,cAAc,EAAEC,QAAnC;AAA6C/C,MAAAA;AAA7C,QAA+D,MAAMnC,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC;AAAC3D,MAAAA;AAAD,KAAlC,CAA3E,CAD2C,CAG3C;;AACA,QAAI,CAACW,4BAAiBmD,KAAlB,EAAyBnD,4BAAiBoD,KAA1C,EAAiDpD,4BAAiBqD,IAAlE,EAAwEC,QAAxE,CAAiFJ,QAAjF,CAAJ,EAAgG;AAC9FxF,MAAAA,MAAM,CAAC6F,KAAP,CAAc,GAAElE,aAAc,uBAAsB6D,QAAS,EAA7D;AACA,aAAO,KAAP;AACD;;AAED,UAAMM,WAAW,GAAG,qBAAO/C,gBAAP,EAAyBgD,GAAzB,CAA6B,CAA7B,EAAgC,GAAhC,CAApB;AACA/F,IAAAA,MAAM,CAAC6F,KAAP,CAAc,aAAYC,WAAY,EAAtC;;AAEA,QAAIA,WAAW,CAACE,QAAZ,EAAJ,EAA4B;AAC1B,YAAMC,oBAAoB,GAAG,CAACtD,4BAAiB8C,KAAlB,EAAyB9C,4BAAiBgD,IAA1C,EAAgDhD,4BAAiBC,KAAjE,EAAwED,4BAAiB+C,KAAzF,CAA7B;;AACA,UAAI,CAACO,oBAAoB,CAACL,QAArB,CAA8BnD,cAAc,CAACC,MAA7C,CAAL,EAA2D;AAAE;AAC3D,cAAMpB,iBAAiB,CAAC;AAACK,UAAAA,aAAD;AAAgBG,UAAAA,SAAS,EAAE,QAA3B;AAAqCW,UAAAA,cAAc,EAAEE,4BAAiB8C;AAAtE,SAAD,CAAvB;AACD;;AAED,UAAI,CAACQ,oBAAoB,CAACL,QAArB,CAA8BnD,cAAc,CAACI,MAA7C,CAAL,EAA2D;AAAE;AAC3D,cAAMvB,iBAAiB,CAAC;AAACK,UAAAA,aAAD;AAAgBG,UAAAA,SAAS,EAAE,QAA3B;AAAqCW,UAAAA,cAAc,EAAEE,4BAAiB8C;AAAtE,SAAD,CAAvB;AACD;;AAED,YAAMpE,QAAQ,CAAC;AAACM,QAAAA,aAAD;AAAgB+C,QAAAA,KAAK,EAAEpC,4BAAiBmD,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,iBAAexE,MAAf,CAAsB+D,MAAtB,EAA8B;AAC5B/E,IAAAA,MAAM,CAAC6F,KAAP,CAAc,GAAEM,IAAI,CAACC,SAAL,CAAerB,MAAf,CAAuB,EAAvC;AACA/E,IAAAA,MAAM,CAACqD,IAAP,CAAa,wBAAuBtD,UAAW,SAAQgF,MAAM,CAACpD,aAAc,EAA5E;AACA,UAAM0E,KAAK,GAAG,4BAAStB,MAAM,CAACpD,aAAhB,CAAd;AACA3B,IAAAA,MAAM,CAAC6F,KAAP,CAAc,wBAAuBM,IAAI,CAACC,SAAL,CAAeC,KAAf,CAAsB,EAA3D;;AAEA,QAAI;AACF;AACA;AACA,YAAMC,SAAS,GAAG,MAAMpF,aAAa,CAAC6D,MAAD,CAArC;;AACA,UAAIuB,SAAJ,EAAe;AACb,cAAMhG,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BwG,SAA1B,CAAoC;AAAC5E,UAAAA,aAAa,EAAE0E;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;AACvD3G,UAAAA,MAAM,CAAC6F,KAAP,CAAc,oDAAmDM,IAAI,CAACC,SAAL,CAAeC,KAAf,CAAsB,SAAQtG,UAAW,EAA1G;AACA,gBAAMO,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BwG,SAA1B,CAAoC;AAAC5E,YAAAA,aAAa,EAAE0E;AAAhB,WAApC,CAAN;AACA,iBAAO,IAAP;AACD;;AACDrG,QAAAA,MAAM,CAACyD,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,iBAAezF,WAAf,CAA2BU,aAA3B,EAA0C;AACxC3B,IAAAA,MAAM,CAACqD,IAAP,CAAa,sCAAqC1B,aAAc,OAAM5B,UAAW,EAAjF;AACA,UAAMsG,KAAK,GAAG,4BAAS1E,aAAT,CAAd;AACA,UAAMuB,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC;AAAC3D,MAAAA,aAAa,EAAE0E;AAAhB,KAAlC,CAArB,CAHwC,CAGwC;;AAEhF,QAAInD,MAAJ,EAAY;AACV,aAAO;AACLQ,QAAAA,WAAW,EAAER,MAAM,CAACQ,WADf;AAELkD,QAAAA,UAAU,EAAErG,YAAY,CAACsG,wBAAb,CAAsCR,KAAtC;AAFP,OAAP;AAID;;AAED,UAAM,IAAI/C,qBAAJ,CAAaC,oBAAWuD,SAAxB,CAAN;AACD;;AAED,iBAAe5F,aAAf,CAA6B6D,MAA7B,EAAqC;AACnC/E,IAAAA,MAAM,CAACqD,IAAP,CAAa,uCAAsC0B,MAAM,CAACpD,aAAc,OAAM5B,UAAW,EAAzF;AACA,UAAMsG,KAAK,GAAG,4BAAStB,MAAM,CAACpD,aAAhB,CAAd;AAEA,UAAMuB,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC;AAAC3D,MAAAA,aAAa,EAAE0E;AAAhB,KAAlC,CAArB,CAJmC,CAI6C;;AAChFrG,IAAAA,MAAM,CAAC6F,KAAP,CAAc,+BAA8BM,IAAI,CAACC,SAAL,CAAelD,MAAf,CAAuB,EAAnE;;AAEA,QAAIA,MAAJ,EAAY;AACV,YAAM3C,YAAY,CAACwG,MAAb,CAAoBV,KAApB,CAAN;AACA,aAAO,IAAP;AACD;;AAED,WAAO,IAAP;AACD,GAnPmD,CAqPpD;;;AACA,WAASlF,MAAT,CAAgB;AAACkB,IAAAA,cAAD;AAAiBI,IAAAA,cAAc,GAAG+B;AAAlC,GAAhB,EAA8D;AAE5DxE,IAAAA,MAAM,CAAC6F,KAAP,CAAc,mBAAkBxD,cAAe,qBAAoB8D,IAAI,CAACC,SAAL,CAAe3D,cAAf,CAA+B,EAAlG;AACA,UAAMuE,mBAAmB,GAAG3E,cAAc,GAAG;AAACA,MAAAA,cAAc,EAAE,4BAASA,cAAT;AAAjB,KAAH,GAAgDmC,SAA1F;;AAEA,QAAI;AAEF;AACA,UAAInC,cAAc,IAAII,cAAc,KAAK+B,SAAzC,EAAoD;AAClDxE,QAAAA,MAAM,CAAC6F,KAAP,CAAc,eAAc9F,UAAW,aAAYoG,IAAI,CAACC,SAAL,CAAeY,mBAAmB,CAAC3E,cAAnC,CAAmD,EAAtG;AACA,eAAO/B,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC,EAAC,GAAG0B;AAAJ,SAAlC,CAAP;AACD,OANC,CAQF;;;AACA,UAAIvE,cAAc,IAAIJ,cAAc,KAAKmC,SAAzC,EAAoD;AAClDxE,QAAAA,MAAM,CAAC6F,KAAP,CAAc,eAAc9F,UAAW,QAAOoG,IAAI,CAACC,SAAL,CAAe3D,cAAf,CAA+B,EAA7E;AACA,eAAOnC,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC,EAAC,GAAG7C;AAAJ,SAAlC,CAAP;AACD,OAZC,CAcF;;;AACA,UAAIA,cAAc,IAAIJ,cAAtB,EAAsC;AACpCrC,QAAAA,MAAM,CAAC6F,KAAP,CAAc,eAAc9F,UAAW,QAAOsC,cAAe,QAAO8D,IAAI,CAACC,SAAL,CAAe3D,cAAf,CAA+B,EAAnG;AACA,eAAOnC,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC,EAAC,GAAG0B,mBAAJ;AAAyB,aAAGvE;AAA5B,SAAlC,CAAP;AACD;;AAEDzC,MAAAA,MAAM,CAACyE,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,WAASrC,SAAT,CAAmBO,aAAnB,EAAkC;AAChC3B,IAAAA,MAAM,CAACqD,IAAP,CAAa,iCAAgC1B,aAAc,OAAM5B,UAAW,EAA5E;AACA,UAAMsG,KAAK,GAAG,4BAAS1E,aAAT,CAAd;;AACA,QAAI;AACF;AACA,aAAOpB,YAAY,CAACsG,wBAAb,CAAsCR,KAAtC,CAAP;AACD,KAHD,CAGE,OAAO5C,KAAP,EAAc;AACd,2BAASA,KAAT;AACD;AACF;;AAED,iBAAelC,OAAf,CAAuB;AAACI,IAAAA,aAAD;AAAgBqB,IAAAA,UAAhB;AAA4BC,IAAAA;AAA5B,GAAvB,EAAiE;AAC/DjD,IAAAA,MAAM,CAACiH,OAAP,CAAgB,aAAYjE,UAAU,CAACoC,MAAO,sBAAqBnC,WAAW,CAACmC,MAAO,KAAIzD,aAAc,OAAM5B,UAAW,EAAzH;AACAC,IAAAA,MAAM,CAACyE,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,4BAAS1E,aAAT,CAAd;AACA,UAAMrB,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BmH,SAA1B,CAAoC;AACxCvF,MAAAA,aAAa,EAAE0E;AADyB,KAApC,EAEH;AACDc,MAAAA,IAAI,EAAE;AACJpE,QAAAA,gBAAgB,EAAE,uBAASd,MAAT;AADd,OADL;AAIDmF,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,iBAAezB,YAAf,CAA4B;AAACG,IAAAA,aAAD;AAAgB2F,IAAAA,QAAhB;AAA0BC,IAAAA,YAAY,GAAG;AAAzC,GAA5B,EAAkF;AAChFvH,IAAAA,MAAM,CAACiH,OAAP,CAAgB,kBAAiBK,QAAQ,CAAClC,MAAO,QAAOmC,YAAa,IAAG5F,aAAc,OAAM5B,UAAW,EAAvG;AACAC,IAAAA,MAAM,CAAC6F,KAAP,CAAc,aAAYyB,QAAQ,CAAClC,MAAO,MAAKe,IAAI,CAACC,SAAL,CAAekB,QAAf,CAAyB,GAAxE;AACA,UAAMjB,KAAK,GAAG,4BAAS1E,aAAT,CAAd;AACA,UAAM6F,iBAAiB,GAAG,4BAASD,YAAT,CAA1B;AACA,UAAMjH,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BmH,SAA1B,CAAoC;AACxCvF,MAAAA,aAAa,EAAE0E;AADyB,KAApC,EAEH;AACDc,MAAAA,IAAI,EAAE;AACJpE,QAAAA,gBAAgB,EAAE,uBAASd,MAAT;AADd,OADL;AAIDmF,MAAAA,KAAK,EAAE;AACL,SAACI,iBAAD,GAAqB;AAACH,UAAAA,KAAK,EAAEC;AAAR;AADhB;AAJN,KAFG,CAAN;AAUD;;AAED,WAASjG,QAAT,CAAkB;AAACM,IAAAA,aAAD;AAAgB+C,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;AACA5E,IAAAA,MAAM,CAACqD,IAAP,CAAa,4BAA2BqB,KAAM,QAAO/C,aAAc,GAAE8F,WAAY,OAAM1H,UAAW,EAAlG;AAEA,UAAM2H,sBAAsB,GAAGC,MAAM,CAACC,MAAP,CAActF,2BAAd,EAAgCqE,OAAhC,CAAwCjC,KAAxC,IAAiD,CAAC,CAAjF;AACA,UAAMmD,+BAA+B,GAAGF,MAAM,CAACC,MAAP,CAActF,4BAAiBC,SAA/B,EAA0CoE,OAA1C,CAAkDjC,KAAlD,IAA2D,CAAC,CAApG;AACA,UAAMoD,8BAA8B,GAAGH,MAAM,CAACC,MAAP,CAActF,4BAAiByF,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,4BAAS1E,aAAT,CAAd;AACA,UAAMsG,YAAY,GAAG;AACnB5F,MAAAA,cAAc,EAAEqC,KADG;AAEnB3B,MAAAA,gBAAgB,EAAE,uBAASd,MAAT,EAFC;AAGnB0C,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,WAAO9H,EAAE,CAACP,UAAH,CAAcA,UAAd,EACJsI,gBADI,CAEH;AAAC1G,MAAAA,aAAa,EAAE0E;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,WAAShH,iBAAT,CAA2B;AAACK,IAAAA,aAAD;AAAgBG,IAAAA,SAAhB;AAA2BW,IAAAA;AAA3B,GAA3B,EAAuE;AAErE;AACAzC,IAAAA,MAAM,CAACqD,IAAP,CAAa,uCAAsCvB,SAAU,KAAIW,cAAe,SAAQd,aAAc,EAAtG;AACA,UAAM4G,kBAAkB,GAAG,4BAAS5G,aAAT,CAA3B;AACA,UAAM6G,mBAAmB,GAAG,4BAAS/F,cAAT,CAA5B;;AAEA,QAAI,EAAEX,SAAS,IAAI2G,qBAAf,CAAJ,EAAgC;AAC9B,YAAM,IAAInF,qBAAJ,CAAa,KAAb,EAAoB,wCAApB,CAAN;AACD;;AAED,QAAI,EAAEkF,mBAAmB,IAAI7F,2BAAzB,CAAJ,EAAgD;AAC9C,YAAM,IAAIW,qBAAJ,CAAa,KAAb,EAAoB,0BAApB,CAAN;AACD;;AAED,UAAMoF,WAAW,GAAG5G,SAAS,KAAK2G,sBAAW/F,MAAzB,GAAkC;AAAC,+BAAyB8F;AAA1B,KAAlC,GAAmF;AAAC,+BAAyBA;AAA1B,KAAvG;AACA,WAAOlI,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BsI,gBAA1B,CAA2C;AAChD1G,MAAAA,aAAa,EAAE4G;AADiC,KAA3C,EAEJ;AACDpB,MAAAA,IAAI,EAAE,EACJ,GAAGuB,WADC;AAEJ3F,QAAAA,gBAAgB,EAAE,uBAASd,MAAT;AAFd;AADL,KAFI,EAOJ;AAACgD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAPI,CAAP;AAQD;;AAED,iBAAe7G,YAAf,CAA4B;AAACE,IAAAA,aAAD;AAAgBG,IAAAA;AAAhB,GAA5B,EAAwD;AACtD,UAAM6G,YAAY,GAAG7G,SAArB;AACA,UAAM;AAACA,MAAAA,SAAS,EAAE8G;AAAZ,QAA4B,MAAMtI,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC;AAAC3D,MAAAA;AAAD,KAAlC,CAAxC;AACA3B,IAAAA,MAAM,CAACqD,IAAP,CAAa,qCAAoCuF,YAAa,OAAMD,YAAa,QAAOhH,aAAc,OAAM5B,UAAW,EAAvH;AACA,UAAMwI,kBAAkB,GAAG,4BAAS5G,aAAT,CAA3B;AACA,UAAMkH,iBAAiB,GAAG,4BAASF,YAAT,CAA1B;AAEA,UAAMzF,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BsI,gBAA1B,CAA2C;AAC9D1G,MAAAA,aAAa,EAAE4G;AAD+C,KAA3C,EAElB;AACDpB,MAAAA,IAAI,EAAE;AACJrF,QAAAA,SAAS,EAAE+G,iBADP;AAEJ9F,QAAAA,gBAAgB,EAAE,uBAASd,MAAT;AAFd;AADL,KAFkB,EAOlB;AAACgD,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,iBAAepH,aAAf,CAA6B;AAACC,IAAAA,aAAD;AAAgBoH,IAAAA,YAAhB;AAA8BC,IAAAA,eAAe,GAAGxE;AAAhD,GAA7B,EAAyF;AACvF,UAAM+D,kBAAkB,GAAG,4BAAS5G,aAAT,CAA3B,CADuF,CAGvF;;AAEA,UAAMsH,SAAS,GAAG,MAAM3I,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BuF,OAA1B,CAAkC;AAAC3D,MAAAA,aAAa,EAAE4G;AAAhB,KAAlC,CAAxB;AACAvI,IAAAA,MAAM,CAACyE,KAAP,CAAc,yBAAwB0B,IAAI,CAACC,SAAL,CAAe6C,SAAf,CAA0B,EAAhE;AAEA,UAAMC,aAAa,GAAGD,SAAS,CAAC9G,UAAhC;AAEAnC,IAAAA,MAAM,CAACqD,IAAP,CAAa,qCAAoC8C,IAAI,CAACC,SAAL,CAAe8C,aAAf,CAA8B,cAAaH,YAAa,iBAAgBC,eAAgB,QAAOrH,aAAc,OAAM5B,UAAW,EAA/K;AAEA,UAAMoJ,qBAAqB,GAAGD,aAAa,CAACE,MAAd,CAAqBtH,SAAS,IAAIA,SAAS,KAAKkH,eAAhD,CAA9B;AACA,UAAMK,2BAA2B,GAAG,CAACN,YAAD,EAAe,GAAGI,qBAAlB,CAApC;AAEA,UAAMjG,MAAM,GAAG,MAAM5C,EAAE,CAACP,UAAH,CAAcA,UAAd,EAA0BsI,gBAA1B,CAA2C;AAC9D1G,MAAAA,aAAa,EAAE4G;AAD+C,KAA3C,EAElB;AACDpB,MAAAA,IAAI,EAAE;AACJhF,QAAAA,UAAU,EAAEkH,2BADR;AAEJtG,QAAAA,gBAAgB,EAAE,uBAASd,MAAT;AAFd;AADL,KAFkB,EAOlB;AAACgD,MAAAA,UAAU,EAAE;AAACC,QAAAA,GAAG,EAAE;AAAN,OAAb;AAAuBoD,MAAAA,iBAAiB,EAAE;AAA1C,KAPkB,CAArB;AASA,WAAOpF,MAAM,CAAC4F,EAAd,CAxBuF,CAyBvF;AACD;AACF","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\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};\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 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 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 //logger.info(`Setting queue-item operation from ${JSON.stringify(oldOperations)} by adding ${addOperation} and removing ${removeOperation} for ${correlationId} to ${collection}`);\n\n const queueItem = await db.collection(collection).findOne({correlationId: cleanCorrelationId});\n logger.debug(`We fould 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 = [addOperation, ...operationsAfterRemove];\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"],"file":"mongo.js"}
package/dist/utils.js CHANGED
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createImportJobState = createImportJobState;
7
- exports.createImportJobStateForQuery = createImportJobStateForQuery;
8
7
  exports.logError = logError;
9
8
 
10
9
  var _melindaBackendCommons = require("@natlibfi/melinda-backend-commons");
@@ -56,7 +55,7 @@ function logError(err) {
56
55
  logger.error(err.stack === undefined ? err : err.stack);
57
56
  }
58
57
 
59
- function createImportJobState(operation, state) {
58
+ function createImportJobState(operation, state, queryImportJobState = false) {
60
59
  if (!(state in _constants.IMPORT_JOB_STATE)) {
61
60
  throw new Error('Invalid IMPORT_JOB_STATE');
62
61
  }
@@ -65,31 +64,16 @@ function createImportJobState(operation, state) {
65
64
  throw new Error('Invalid operation');
66
65
  }
67
66
 
68
- return {
69
- [operation]: state
70
- };
71
- /*
72
- if (operation === OPERATIONS.CREATE) {
73
- return {CREATE: state};
74
- }
75
-
76
- return {UPDATE: state};
77
- */
78
- }
79
-
80
- function createImportJobStateForQuery(operation, state) {
81
- if (!(state in _constants.IMPORT_JOB_STATE)) {
82
- throw new Error('Invalid IMPORT_JOB_STATE');
67
+ if (queryImportJobState) {
68
+ const importJobStateWithOperation = `importJobState.${operation}`;
69
+ const importJobStateForQuery = {
70
+ [importJobStateWithOperation]: state
71
+ };
72
+ return importJobStateForQuery;
83
73
  }
84
74
 
85
- if (!(operation in _constants.OPERATIONS)) {
86
- throw new Error('Invalid operation');
87
- }
88
-
89
- const importJobStateWithOperation = `importJobState.${operation}`;
90
- const importJobStateForQuery = {
91
- [importJobStateWithOperation]: state
75
+ return {
76
+ [operation]: state
92
77
  };
93
- return importJobStateForQuery;
94
78
  }
95
79
  //# sourceMappingURL=utils.js.map
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","IMPORT_JOB_STATE","Error","OPERATIONS","createImportJobStateForQuery","importJobStateWithOperation","importJobStateForQuery"],"mappings":";;;;;;;;;AA4BA;;AACA;;AACA;;AA9BA;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;AAMA,MAAMA,MAAM,GAAG,0CAAf;;AAEO,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AAC5B,MAAIA,GAAG,YAAYC,qBAAnB,EAA6B;AAC3BH,IAAAA,MAAM,CAACI,KAAP,CAAaC,IAAI,CAACC,SAAL,CAAeJ,GAAf,CAAb;AACA;AACD;;AAED,MAAIA,GAAG,KAAK,QAAZ,EAAsB;AACpBF,IAAAA,MAAM,CAACI,KAAP,CAAaF,GAAb;AACA;AACD;;AAEDF,EAAAA,MAAM,CAACI,KAAP,CAAaF,GAAG,CAACK,KAAJ,KAAcC,SAAd,GAA0BN,GAA1B,GAAgCA,GAAG,CAACK,KAAjD;AACD;;AAEM,SAASE,oBAAT,CAA8BC,SAA9B,EAAyCC,KAAzC,EAAgD;AACrD,MAAI,EAAEA,KAAK,IAAIC,2BAAX,CAAJ,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,0BAAV,CAAN;AACD;;AAED,MAAI,EAAEH,SAAS,IAAII,qBAAf,CAAJ,EAAgC;AAC9B,UAAM,IAAID,KAAJ,CAAU,mBAAV,CAAN;AACD;;AAED,SAAO;AAAC,KAACH,SAAD,GAAaC;AAAd,GAAP;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACC;;AAEM,SAASI,4BAAT,CAAsCL,SAAtC,EAAiDC,KAAjD,EAAwD;AAC7D,MAAI,EAAEA,KAAK,IAAIC,2BAAX,CAAJ,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,0BAAV,CAAN;AACD;;AACD,MAAI,EAAEH,SAAS,IAAII,qBAAf,CAAJ,EAAgC;AAC9B,UAAM,IAAID,KAAJ,CAAU,mBAAV,CAAN;AACD;;AAED,QAAMG,2BAA2B,GAAI,kBAAiBN,SAAU,EAAhE;AACA,QAAMO,sBAAsB,GAAG;AAAC,KAACD,2BAAD,GAA+BL;AAAhC,GAA/B;AAEA,SAAOM,sBAAP;AACD","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';\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) {\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 return {[operation]: state};\n\n/*\n if (operation === OPERATIONS.CREATE) {\n return {CREATE: state};\n }\n\n return {UPDATE: state};\n*/\n}\n\nexport function createImportJobStateForQuery(operation, state) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\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"],"mappings":";;;;;;;;AA4BA;;AACA;;AACA;;AA9BA;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;AAMA,MAAMA,MAAM,GAAG,0CAAf;;AAEO,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AAC5B,MAAIA,GAAG,YAAYC,qBAAnB,EAA6B;AAC3BH,IAAAA,MAAM,CAACI,KAAP,CAAaC,IAAI,CAACC,SAAL,CAAeJ,GAAf,CAAb;AACA;AACD;;AAED,MAAIA,GAAG,KAAK,QAAZ,EAAsB;AACpBF,IAAAA,MAAM,CAACI,KAAP,CAAaF,GAAb;AACA;AACD;;AAEDF,EAAAA,MAAM,CAACI,KAAP,CAAaF,GAAG,CAACK,KAAJ,KAAcC,SAAd,GAA0BN,GAA1B,GAAgCA,GAAG,CAACK,KAAjD;AACD;;AAEM,SAASE,oBAAT,CAA8BC,SAA9B,EAAyCC,KAAzC,EAAgDC,mBAAmB,GAAG,KAAtE,EAA6E;AAClF,MAAI,EAAED,KAAK,IAAIE,2BAAX,CAAJ,EAAkC;AAChC,UAAM,IAAIC,KAAJ,CAAU,0BAAV,CAAN;AACD;;AAED,MAAI,EAAEJ,SAAS,IAAIK,qBAAf,CAAJ,EAAgC;AAC9B,UAAM,IAAID,KAAJ,CAAU,mBAAV,CAAN;AACD;;AAED,MAAIF,mBAAJ,EAAyB;AACvB,UAAMI,2BAA2B,GAAI,kBAAiBN,SAAU,EAAhE;AACA,UAAMO,sBAAsB,GAAG;AAAC,OAACD,2BAAD,GAA+BL;AAAhC,KAA/B;AAEA,WAAOM,sBAAP;AACD;;AAED,SAAO;AAAC,KAACP,SAAD,GAAaC;AAAd,GAAP;AACD","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';\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"],"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.3",
17
+ "version": "2.2.0-alpha.6",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=14"