@natlibfi/melinda-rest-api-commons 2.3.1-alpha.4 → 2.3.1-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 +7 -1
- package/dist/constants.js.map +1 -1
- package/dist/mongoLog.js +27 -3
- package/dist/mongoLog.js.map +1 -1
- package/package.json +1 -1
package/dist/constants.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.QUEUE_ITEM_STATE = exports.OPERATIONS = exports.IMPORT_JOB_STATE = exports.CONVERSION_FORMATS = exports.CHUNK_SIZE = void 0;
|
|
6
|
+
exports.QUEUE_ITEM_STATE = exports.OPERATIONS = exports.LOG_ITEM_TYPE = exports.IMPORT_JOB_STATE = exports.CONVERSION_FORMATS = exports.CHUNK_SIZE = void 0;
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
*
|
|
@@ -70,6 +70,12 @@ const OPERATIONS = {
|
|
|
70
70
|
exports.OPERATIONS = OPERATIONS;
|
|
71
71
|
const CHUNK_SIZE = 100;
|
|
72
72
|
exports.CHUNK_SIZE = CHUNK_SIZE;
|
|
73
|
+
const LOG_ITEM_TYPE = {
|
|
74
|
+
MERGE_LOG: 'MERGE_LOG',
|
|
75
|
+
MATCH_LOG: 'MATCH_LOG',
|
|
76
|
+
SPLITTER_LOG: 'SPLITTER_LOG'
|
|
77
|
+
};
|
|
78
|
+
exports.LOG_ITEM_TYPE = LOG_ITEM_TYPE;
|
|
73
79
|
const CONVERSION_FORMATS = {
|
|
74
80
|
MARCXML: 'MARCXML',
|
|
75
81
|
ISO2709: 'ISO2709',
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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","CONVERSION_FORMATS","MARCXML","ISO2709","JSON","ALEPHSEQ"],"sources":["../src/constants.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\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 CONVERSION_FORMATS = {\n MARCXML: 'MARCXML',\n ISO2709: 'ISO2709',\n JSON: 'JSON',\n ALEPHSEQ: 'ALEPHSEQ'\n};\n"],"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;EAC9BC,SAAS,EAAE;IACTC,eAAe,EAAE,iBADR;IAETC,kBAAkB,EAAE,oBAFX;IAGTC,mBAAmB,EAAE,qBAHZ;IAITC,SAAS,EAAE,WAJF;IAKTC,UAAU,EAAE,YALH;IAMTC,mBAAmB,EAAE;EANZ,CADmB;EAS9BC,QAAQ,EAAE;IACRC,SAAS,EAAE,WADH;IAERC,UAAU,EAAE,YAFJ;IAGRC,QAAQ,EAAE;EAHF,CAToB;EAc9BC,IAAI,EAAE,MAdwB;EAe9BC,KAAK,EAAE,OAfuB;EAgB9BC,KAAK,EAAE;AAhBuB,CAAzB;;AAmBA,MAAMC,gBAAgB,GAAG;EAC9BC,KAAK,EAAE,OADuB;EAE9BC,OAAO,EAAE,SAFqB;EAG9BN,QAAQ,EAAE,UAHoB;EAI9BF,SAAS,EAAE,WAJmB;EAK9BS,UAAU,EAAE,YALkB;EAM9BN,IAAI,EAAE,MANwB;EAO9BC,KAAK,EAAE,OAPuB;EAQ9BC,KAAK,EAAE;AARuB,CAAzB;;AAWA,MAAMK,UAAU,GAAG;EACxBC,MAAM,EAAE,QADgB;EAExBC,MAAM,EAAE;AAFgB,CAAnB;;AAKA,MAAMC,UAAU,GAAG,GAAnB;;AAEA,MAAMC,kBAAkB,GAAG;EAChCC,OAAO,EAAE,SADuB;EAEhCC,OAAO,EAAE,SAFuB;EAGhCC,IAAI,EAAE,MAH0B;EAIhCC,QAAQ,EAAE;AAJsB,CAA3B"}
|
|
1
|
+
{"version":3,"file":"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","LOG_ITEM_TYPE","MERGE_LOG","MATCH_LOG","SPLITTER_LOG","CONVERSION_FORMATS","MARCXML","ISO2709","JSON","ALEPHSEQ"],"sources":["../src/constants.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2021 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\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 LOG_ITEM_TYPE = {\n MERGE_LOG: 'MERGE_LOG',\n MATCH_LOG: 'MATCH_LOG',\n SPLITTER_LOG: 'SPLITTER_LOG'\n};\n\nexport const CONVERSION_FORMATS = {\n MARCXML: 'MARCXML',\n ISO2709: 'ISO2709',\n JSON: 'JSON',\n ALEPHSEQ: 'ALEPHSEQ'\n};\n"],"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;EAC9BC,SAAS,EAAE;IACTC,eAAe,EAAE,iBADR;IAETC,kBAAkB,EAAE,oBAFX;IAGTC,mBAAmB,EAAE,qBAHZ;IAITC,SAAS,EAAE,WAJF;IAKTC,UAAU,EAAE,YALH;IAMTC,mBAAmB,EAAE;EANZ,CADmB;EAS9BC,QAAQ,EAAE;IACRC,SAAS,EAAE,WADH;IAERC,UAAU,EAAE,YAFJ;IAGRC,QAAQ,EAAE;EAHF,CAToB;EAc9BC,IAAI,EAAE,MAdwB;EAe9BC,KAAK,EAAE,OAfuB;EAgB9BC,KAAK,EAAE;AAhBuB,CAAzB;;AAmBA,MAAMC,gBAAgB,GAAG;EAC9BC,KAAK,EAAE,OADuB;EAE9BC,OAAO,EAAE,SAFqB;EAG9BN,QAAQ,EAAE,UAHoB;EAI9BF,SAAS,EAAE,WAJmB;EAK9BS,UAAU,EAAE,YALkB;EAM9BN,IAAI,EAAE,MANwB;EAO9BC,KAAK,EAAE,OAPuB;EAQ9BC,KAAK,EAAE;AARuB,CAAzB;;AAWA,MAAMK,UAAU,GAAG;EACxBC,MAAM,EAAE,QADgB;EAExBC,MAAM,EAAE;AAFgB,CAAnB;;AAKA,MAAMC,UAAU,GAAG,GAAnB;;AAEA,MAAMC,aAAa,GAAG;EAC3BC,SAAS,EAAE,WADgB;EAE3BC,SAAS,EAAE,WAFgB;EAG3BC,YAAY,EAAE;AAHa,CAAtB;;AAMA,MAAMC,kBAAkB,GAAG;EAChCC,OAAO,EAAE,SADuB;EAEhCC,OAAO,EAAE,SAFuB;EAGhCC,IAAI,EAAE,MAH0B;EAIhCC,QAAQ,EAAE;AAJsB,CAA3B"}
|
package/dist/mongoLog.js
CHANGED
|
@@ -19,6 +19,8 @@ var _httpStatus = _interopRequireDefault(require("http-status"));
|
|
|
19
19
|
|
|
20
20
|
var _mongoSanitize = _interopRequireDefault(require("mongo-sanitize"));
|
|
21
21
|
|
|
22
|
+
var _constants = require("./constants");
|
|
23
|
+
|
|
22
24
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
25
|
|
|
24
26
|
/**
|
|
@@ -74,10 +76,17 @@ async function _default(MONGO_URI) {
|
|
|
74
76
|
};
|
|
75
77
|
|
|
76
78
|
try {
|
|
79
|
+
checkLogItemType(logItem.logItemType, false);
|
|
77
80
|
const result = await db.collection(collection).insertOne(newLogItem);
|
|
78
81
|
|
|
79
82
|
if (result.acknowledged) {
|
|
80
|
-
|
|
83
|
+
const {
|
|
84
|
+
blobSequence,
|
|
85
|
+
blobSequenceStart,
|
|
86
|
+
blobSequenceEnd
|
|
87
|
+
} = logItem;
|
|
88
|
+
const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;
|
|
89
|
+
logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);
|
|
81
90
|
return;
|
|
82
91
|
}
|
|
83
92
|
|
|
@@ -99,7 +108,7 @@ async function _default(MONGO_URI) {
|
|
|
99
108
|
.find(rest).sort({
|
|
100
109
|
blobSequence: 1
|
|
101
110
|
}).skip(parseInt(skip, 10)).limit(parseInt(limit, 10)).toArray();
|
|
102
|
-
logger.debug(result);
|
|
111
|
+
logger.debug(`Query result: ${result}`);
|
|
103
112
|
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);
|
|
104
113
|
return result;
|
|
105
114
|
}
|
|
@@ -117,6 +126,7 @@ async function _default(MONGO_URI) {
|
|
|
117
126
|
}
|
|
118
127
|
|
|
119
128
|
async function getListOfLogs(logItemType = 'MERGE_LOG') {
|
|
129
|
+
checkLogItemType(logItemType, false);
|
|
120
130
|
const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
|
|
121
131
|
.distinct('correlationId', {
|
|
122
132
|
logItemType
|
|
@@ -129,7 +139,7 @@ async function _default(MONGO_URI) {
|
|
|
129
139
|
}
|
|
130
140
|
|
|
131
141
|
async function protect(correlationId, blobSequence) {
|
|
132
|
-
logger.info(`
|
|
142
|
+
logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);
|
|
133
143
|
const cleanCorrelationId = (0, _mongoSanitize.default)(correlationId);
|
|
134
144
|
const cleanBlobSequence = (0, _mongoSanitize.default)(blobSequence);
|
|
135
145
|
const filter = blobSequence ? {
|
|
@@ -179,5 +189,19 @@ async function _default(MONGO_URI) {
|
|
|
179
189
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, err.message);
|
|
180
190
|
}
|
|
181
191
|
}
|
|
192
|
+
|
|
193
|
+
function checkLogItemType(logItemType, errorUnknown = false) {
|
|
194
|
+
const typeInLogItemTypes = Object.values(_constants.LOG_ITEM_TYPE).indexOf(logItemType) > -1;
|
|
195
|
+
|
|
196
|
+
if (typeInLogItemTypes) {
|
|
197
|
+
return logger.debug(`Valid logItemType: ${logItemType}`);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (errorUnknown) {
|
|
201
|
+
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return logger.debug(`WARN: We have unknown logType: ${logItemType}`);
|
|
205
|
+
}
|
|
182
206
|
}
|
|
183
207
|
//# sourceMappingURL=mongoLog.js.map
|
package/dist/mongoLog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongoLog.js","names":["MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","protect","remove","logItem","time","moment","toDate","newLogItem","creationTime","protected","result","insertOne","acknowledged","info","logItemType","correlationId","blobSequenceStart","blobSequenceEnd","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","blobSequence","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","payload","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","err","message","force","clean","$ne","deleteMany","deletedCount"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, protect, remove};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId} items ${logItem.blobSequenceStart}-${logItem.blobSequenceEnd}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(result);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: cleanBlobSequence} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n {\n $set: {\n modificationTime: moment().toDate(),\n protect: {$not: '$protect'}\n }\n }\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n}\n"],"mappings":";;;;;;;AA4BA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAlCA;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;AAUe,wBAAgBA,SAAhB,EAA2B;EACxC,MAAMC,MAAM,GAAG,IAAAC,mCAAA,GAAf,CADwC,CAGxC;;EACA,MAAMC,MAAM,GAAG,MAAMC,oBAAA,CAAYC,OAAZ,CAAoBL,SAApB,EAA+B;IAACM,eAAe,EAAE,IAAlB;IAAwBC,kBAAkB,EAAE;EAA5C,CAA/B,CAArB;EACA,MAAMC,EAAE,GAAGL,MAAM,CAACK,EAAP,CAAU,UAAV,CAAX;EACA,MAAMC,UAAU,GAAG,MAAnB;EACA,OAAO;IAACC,UAAD;IAAaC,KAAb;IAAoBC,SAApB;IAA+BC,aAA/B;IAA8CC,OAA9C;IAAuDC;EAAvD,CAAP;;EAEA,eAAeL,UAAf,CAA0BM,OAA1B,EAAmC;IACjC,MAAMC,IAAI,GAAG,IAAAC,eAAA,IAASC,MAAT,EAAb;IACA,MAAMC,UAAU,GAAG,EACjB,GAAGJ,OADc;MAEjBK,YAAY,EAAEJ,IAFG;MAGjBK,SAAS,EAAE;IAHM,CAAnB;;IAKA,IAAI;MACF,MAAMC,MAAM,GAAG,MAAMf,EAAE,CAACC,UAAH,CAAcA,UAAd,EAA0Be,SAA1B,CAAoCJ,UAApC,CAArB;;MACA,IAAIG,MAAM,CAACE,YAAX,EAAyB;QACvBxB,MAAM,CAACyB,IAAP,CAAa,WAAUV,OAAO,CAACW,WAAY,cAAaX,OAAO,CAACY,aAAc,UAASZ,OAAO,CAACa,iBAAkB,IAAGb,OAAO,CAACc,eAAgB,OAA5I;QACA;MACD;;MACD,MAAM,IAAIC,qBAAJ,CAAaC,mBAAA,CAAWC,qBAAxB,CAAN;IACD,CAPD,CAOE,OAAOC,KAAP,EAAc;MACd,IAAAC,eAAA,EAASD,KAAT;MACA,MAAM,IAAIH,qBAAJ,CAAaC,mBAAA,CAAWC,qBAAxB,CAAN;IACD;EACF;;EAED,eAAetB,KAAf,CAAqByB,MAArB,EAA6B;IAC3BnC,MAAM,CAACoC,KAAP,CAAc,iBAAgBC,IAAI,CAACC,SAAL,CAAeH,MAAf,CAAuB,EAArD;IACA,MAAM;MAACI,KAAK,GAAG,CAAT;MAAYC,IAAI,GAAG,CAAnB;MAAsB,GAAGC;IAAzB,IAAiCN,MAAvC;IACA,MAAMb,MAAM,GAAG,MAAMf,EAAE,CAACC,UAAH,CAAcA,UAAd,EAA0B;IAA1B,CAClBkC,IADkB,CACbD,IADa,EAElBE,IAFkB,CAEb;MAACC,YAAY,EAAE;IAAf,CAFa,EAGlBJ,IAHkB,CAGbK,QAAQ,CAACL,IAAD,EAAO,EAAP,CAHK,EAIlBD,KAJkB,CAIZM,QAAQ,CAACN,KAAD,EAAQ,EAAR,CAJI,EAKlBO,OALkB,EAArB;IAMA9C,MAAM,CAACoC,KAAP,CAAad,MAAb;IACAtB,MAAM,CAACoC,KAAP,CAAc,iBAAgBd,MAAM,CAACyB,MAAP,GAAgB,CAAhB,GAAqB,SAAQzB,MAAM,CAACyB,MAAO,sBAAqBP,IAAK,WAAUD,KAAM,GAArF,GAA0F,YAAa,EAArI;IACA,OAAOjB,MAAP;EACD;;EAED,eAAeX,SAAf,CAAyBqC,mBAAzB,EAA8CR,IAAI,GAAG,CAArD,EAAwDD,KAAK,GAAG,CAAhE,EAAmE;IACjEvC,MAAM,CAACoC,KAAP,CAAc,cAAaY,mBAAoB,EAA/C;IACA,MAAM1B,MAAM,GAAG,MAAMf,EAAE,CAACC,UAAH,CAAcA,UAAd,EAA0B;IAA1B,CAClBkC,IADkB,CACb;MAACf,aAAa,EAAEqB;IAAhB,CADa,EAElBL,IAFkB,CAEb;MAACC,YAAY,EAAE;IAAf,CAFa,EAGlBJ,IAHkB,CAGbK,QAAQ,CAACL,IAAD,EAAO,EAAP,CAHK,EAIlBD,KAJkB,CAIZM,QAAQ,CAACN,KAAD,EAAQ,EAAR,CAJI,EAKlBO,OALkB,EAArB;IAMA9C,MAAM,CAACoC,KAAP,CAAc,iBAAgBd,MAAM,CAACyB,MAAP,GAAgB,CAAhB,GAAqB,SAAQzB,MAAM,CAACyB,MAAO,aAA3C,GAA0D,YAAa,EAArG;IACA,OAAOzB,MAAP;EACD;;EAED,eAAeV,aAAf,CAA6Bc,WAAW,GAAG,WAA3C,EAAwD;IACtD,MAAMJ,MAAM,GAAG,MAAMf,EAAE,CAACC,UAAH,CAAcA,UAAd,EAA0B;IAA1B,CAClByC,QADkB,CACT,eADS,EACQ;MAACvB;IAAD,CADR,CAArB;IAEA1B,MAAM,CAACoC,KAAP,CAAc,iBAAgBd,MAAM,CAACyB,MAAP,GAAgB,CAAhB,GAAqB,SAAQzB,MAAM,CAACyB,MAAO,aAA3C,GAA0D,YAAa,EAArG;IACA,OAAO;MAACG,MAAM,EAAE5B,MAAM,CAACyB,MAAP,GAAgB,CAAhB,GAAoBhB,mBAAA,CAAWoB,EAA/B,GAAoCpB,mBAAA,CAAWqB,SAAxD;MAAmEC,OAAO,EAAE/B,MAAM,CAACyB,MAAP,GAAgB,CAAhB,GAAoBzB,MAApB,GAA6B;IAAzG,CAAP;EACD;;EAED,eAAeT,OAAf,CAAuBc,aAAvB,EAAsCiB,YAAtC,EAAoD;IAClD5C,MAAM,CAACyB,IAAP,CAAa,wBAAuBjB,UAAW,oBAAmBmB,aAAc,mBAAkBiB,YAAa,EAA/G;IACA,MAAMU,kBAAkB,GAAG,IAAAC,sBAAA,EAAS5B,aAAT,CAA3B;IACA,MAAM6B,iBAAiB,GAAG,IAAAD,sBAAA,EAASX,YAAT,CAA1B;IACA,MAAMa,MAAM,GAAGb,YAAY,GAAG;MAACjB,aAAa,EAAE2B,kBAAhB;MAAoCV,YAAY,EAAEY;IAAlD,CAAH,GAA0E;MAAC7B,aAAa,EAAE2B;IAAhB,CAArG;;IAEA,IAAI;MACF,MAAMhC,MAAM,GAAG,MAAMf,EAAE,CAACC,UAAH,CAAcA,UAAd,EAA0BkD,UAA1B,CACnBD,MADmB,EAEnB;QACEE,IAAI,EAAE;UACJC,gBAAgB,EAAE,IAAA3C,eAAA,IAASC,MAAT,EADd;UAEJL,OAAO,EAAE;YAACgD,IAAI,EAAE;UAAP;QAFL;MADR,CAFmB,CAArB;MASA,OAAO;QAACX,MAAM,EAAE5B,MAAM,CAACwC,aAAP,GAAuB,CAAvB,GAA2B/B,mBAAA,CAAWoB,EAAtC,GAA2CpB,mBAAA,CAAWqB,SAA/D;QAA0EC,OAAO,EAAE/B,MAAM,CAACwC,aAAP,GAAuB,CAAvB,GAA2BxC,MAA3B,GAAoC;MAAvH,CAAP;IACD,CAXD,CAWE,OAAOyC,GAAP,EAAY;MACZ,MAAM,IAAIjC,qBAAJ,CAAaC,mBAAA,CAAWC,qBAAxB,EAA+C+B,GAAG,CAACC,OAAnD,CAAN;IACD;EACF;;EAED,eAAelD,MAAf,CAAsBa,aAAtB,EAAqCsC,KAAK,GAAG,KAA7C,EAAoD;IAClDjE,MAAM,CAACyB,IAAP,CAAa,wBAAuBjB,UAAW,oBAAmBmB,aAAc,EAAhF;IACA,MAAMuC,KAAK,GAAG,IAAAX,sBAAA,EAAS5B,aAAT,CAAd;IACA,MAAM8B,MAAM,GAAGQ,KAAK,GAAG;MAACtC,aAAa,EAAEuC;IAAhB,CAAH,GAA4B;MAACvC,aAAa,EAAEuC,KAAhB;MAAuB7C,SAAS,EAAE;QAAC8C,GAAG,EAAE;MAAN;IAAlC,CAAhD;;IAEA,IAAI;MACF,MAAM7C,MAAM,GAAG,MAAMf,EAAE,CAACC,UAAH,CAAcA,UAAd,EAA0B4D,UAA1B,CAAqCX,MAArC,CAArB;MACA,OAAO;QAACP,MAAM,EAAE5B,MAAM,CAAC+C,YAAP,GAAsB,CAAtB,GAA0BtC,mBAAA,CAAWoB,EAArC,GAA0CpB,mBAAA,CAAWqB,SAA9D;QAAyEC,OAAO,EAAE/B,MAAM,CAAC+C,YAAP,GAAsB,CAAtB,GAA0B/C,MAA1B,GAAmC;MAArH,CAAP;IACD,CAHD,CAGE,OAAOyC,GAAP,EAAY;MACZ,MAAM,IAAIjC,qBAAJ,CAAaC,mBAAA,CAAWC,qBAAxB,EAA+C+B,GAAG,CAACC,OAAnD,CAAN;IACD;EACF;AACF"}
|
|
1
|
+
{"version":3,"file":"mongoLog.js","names":["MONGO_URI","logger","createLogger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","collection","addLogItem","query","queryById","getListOfLogs","protect","remove","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","logError","params","debug","JSON","stringify","limit","skip","rest","find","sort","parseInt","toArray","length","correlationIdString","distinct","status","OK","NOT_FOUND","payload","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","modifiedCount","err","message","force","clean","$ne","deleteMany","deletedCount","errorUnknown","typeInLogItemTypes","Object","values","LOG_ITEM_TYPE","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* Shared modules for microservices of Melinda rest api batch import system\n*\n* Copyright (C) 2020-2022 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of melinda-rest-api-commons\n*\n* melinda-rest-api-commons program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* melinda-rest-api-commons is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\nexport default async function (MONGO_URI) {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI, {useNewUrlParser: true, useUnifiedTopology: true});\n const db = client.db('rest-api');\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, protect, remove};\n\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n }\n\n async function query(params) {\n logger.debug(`Query params: ${JSON.stringify(params)}`);\n const {limit = 5, skip = 0, ...rest} = params;\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationIdString, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationIdString}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId: correlationIdString})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n async function getListOfLogs(logItemType = 'MERGE_LOG') {\n checkLogItemType(logItemType, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId', {logItemType});\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return {status: result.length > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.length > 0 ? result : 'No logs found'};\n }\n\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: cleanBlobSequence} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n {\n $set: {\n modificationTime: moment().toDate(),\n protect: {$not: '$protect'}\n }\n }\n );\n return {status: result.modifiedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.modifiedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return {status: result.deletedCount > 0 ? httpStatus.OK : httpStatus.NOT_FOUND, payload: result.deletedCount > 0 ? result : 'No logs found'};\n } catch (err) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, err.message);\n }\n }\n\n function checkLogItemType(logItemType, errorUnknown = false) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n}\n"],"mappings":"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"}
|