@natlibfi/melinda-rest-api-commons 4.2.5 → 5.0.0-alpha.2
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/.github/workflows/melinda-node-tests.yml +9 -6
- package/dist/amqp.js +60 -151
- package/dist/amqp.js.map +7 -1
- package/dist/constants.js +40 -51
- package/dist/constants.js.map +7 -1
- package/dist/helpers/conversion.js +39 -57
- package/dist/helpers/conversion.js.map +7 -1
- package/dist/helpers/fix-constants.js +40 -47
- package/dist/helpers/fix-constants.js.map +7 -1
- package/dist/helpers/fix-handle-tempurns.js +23 -73
- package/dist/helpers/fix-handle-tempurns.js.map +7 -1
- package/dist/helpers/fix-strip-f884s.js +44 -94
- package/dist/helpers/fix-strip-f884s.js.map +7 -1
- package/dist/helpers/fix-utils.js +7 -22
- package/dist/helpers/fix-utils.js.map +7 -1
- package/dist/helpers/fix.js +62 -122
- package/dist/helpers/fix.js.map +7 -1
- package/dist/helpers/validation.js +12 -30
- package/dist/helpers/validation.js.map +7 -1
- package/dist/index.js +10 -109
- package/dist/index.js.map +7 -1
- package/dist/mongo.js +173 -509
- package/dist/mongo.js.map +7 -1
- package/dist/mongoLog.js +92 -317
- package/dist/mongoLog.js.map +7 -1
- package/dist/utils.js +46 -155
- package/dist/utils.js.map +7 -1
- package/eslint.config.js +53 -0
- package/package.json +23 -96
- package/tests/{amqp.health.spec.js → amqp.healthtest.js} +2 -2
- package/tests/{amqp.tests.spec.js → amqp.tests.localtest.js} +46 -46
- package/tests/helpers/{conversion.spec.js → conversion.test.js} +38 -25
- package/tests/helpers/{fix.spec.js → fix.test.js} +6 -6
- package/tests/helpers/{validation.spec.js → validation.test.js} +12 -9
- package/tests/{mongo-add-blob-size.spec.js → mongo-add-blob-size.test.js} +6 -6
- package/tests/{mongo-check-and-check-state.spec.js → mongo-check-and-check-state.test.js} +7 -7
- package/tests/{mongo-check-and-set-import-job-state.spec.js → mongo-check-and-set-import-job-state.test.js} +7 -7
- package/tests/{mongo-check-timeout.spec.js → mongo-check-timeout.test.js} +7 -7
- package/tests/{mongo-create-bulk.spec.js → mongo-create-bulk.test.js} +5 -5
- package/tests/{mongo-create-prio.spec.js → mongo-create-prio.test.js} +6 -6
- package/tests/{mongo-get-one.spec.js → mongo-get-one.test.js} +7 -7
- package/tests/{mongo-get-stream.spec.js → mongo-get-stream.test.js} +7 -7
- package/tests/{mongo-push-ids.spec.js → mongo-push-ids.test.js} +5 -5
- package/tests/{mongo-push-messages.spec.js → mongo-push-messages.test.js} +6 -6
- package/tests/{mongo-query-by-id.spec.js → mongo-query-by-id.test.js} +7 -7
- package/tests/{mongo-query.spec.js → mongo-query.test.js} +7 -7
- package/tests/{mongo-read-content.spec.js → mongo-read-content.test.js} +8 -8
- package/tests/{mongo-remove.spec.js → mongo-remove.test.js} +6 -6
- package/tests/{mongo-set-blob-size.spec.js → mongo-set-blob-size.test.js} +6 -6
- package/tests/{mongo-set-import-job-state.spec.js → mongo-set-import-job-state.test.js} +6 -6
- package/tests/{mongo-set-operation.spec.js → mongo-set-operation.test.js} +6 -6
- package/tests/{mongo-set-operations.spec.js → mongo-set-operations.test.js} +6 -6
- package/tests/{mongo-set-state.spec.js → mongo-set-state.test.js} +7 -7
- package/tests/{mongoLog.spec.js → mongoLog.test.js} +10 -11
- package/tests/testUtils.js +9 -8
package/dist/mongoLog.js
CHANGED
|
@@ -1,409 +1,184 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var _moment = _interopRequireDefault(require("moment"));
|
|
13
|
-
var _httpStatus = _interopRequireDefault(require("http-status"));
|
|
14
|
-
var _mongoSanitize = _interopRequireDefault(require("mongo-sanitize"));
|
|
15
|
-
var _constants = require("./constants");
|
|
16
|
-
/**
|
|
17
|
-
* Create log operator
|
|
18
|
-
* @param {String} MONGO_URI connnection address to mongo
|
|
19
|
-
* @param {String} dbName Mongo DB name, defaults 'rest-api'
|
|
20
|
-
* @returns {Object} containing all log handling functions
|
|
21
|
-
*/
|
|
22
|
-
async function _default(MONGO_URI, dbName = 'rest-api') {
|
|
23
|
-
const logger = (0, _melindaBackendCommons.createLogger)();
|
|
24
|
-
|
|
25
|
-
// Connect to mongo (MONGO)
|
|
26
|
-
const client = await _mongodb.MongoClient.connect(MONGO_URI);
|
|
1
|
+
import { MongoClient } from "mongodb";
|
|
2
|
+
import moment from "moment";
|
|
3
|
+
import httpStatus from "http-status";
|
|
4
|
+
import sanitize from "mongo-sanitize";
|
|
5
|
+
import { createLogger } from "@natlibfi/melinda-backend-commons";
|
|
6
|
+
import { Error as ApiError } from "@natlibfi/melinda-commons";
|
|
7
|
+
import { logError } from "./utils.js";
|
|
8
|
+
import { LOG_ITEM_TYPE } from "./constants.js";
|
|
9
|
+
export default async function(MONGO_URI, dbName = "rest-api") {
|
|
10
|
+
const logger = createLogger();
|
|
11
|
+
const client = await MongoClient.connect(MONGO_URI);
|
|
27
12
|
const db = client.db(dbName);
|
|
28
|
-
const collection =
|
|
29
|
-
return {
|
|
30
|
-
addLogItem,
|
|
31
|
-
query,
|
|
32
|
-
queryById,
|
|
33
|
-
getListOfLogs,
|
|
34
|
-
getListOfCatalogers,
|
|
35
|
-
getListOfCorrelationIds,
|
|
36
|
-
getExpandedListOfLogs,
|
|
37
|
-
protect,
|
|
38
|
-
remove,
|
|
39
|
-
removeBySequences
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Add log item to collection
|
|
44
|
-
* @param {Object} logItem contains log item data
|
|
45
|
-
* @returns void
|
|
46
|
-
*/
|
|
13
|
+
const collection = "logs";
|
|
14
|
+
return { addLogItem, query, queryById, getListOfLogs, getListOfCatalogers, getListOfCorrelationIds, getExpandedListOfLogs, protect, remove, removeBySequences };
|
|
47
15
|
async function addLogItem(logItem) {
|
|
48
|
-
const time = (
|
|
16
|
+
const time = moment().toDate();
|
|
49
17
|
const newLogItem = {
|
|
50
18
|
...logItem,
|
|
51
19
|
creationTime: time,
|
|
52
20
|
protected: false
|
|
53
21
|
};
|
|
54
22
|
try {
|
|
55
|
-
// console.log(newLogItem); // eslint-disable-line
|
|
56
23
|
checkLogItemType(logItem.logItemType, false);
|
|
57
24
|
const result = await db.collection(collection).insertOne(newLogItem);
|
|
58
25
|
if (result.acknowledged) {
|
|
59
|
-
const {
|
|
60
|
-
blobSequence,
|
|
61
|
-
blobSequenceStart,
|
|
62
|
-
blobSequenceEnd
|
|
63
|
-
} = logItem;
|
|
26
|
+
const { blobSequence, blobSequenceStart, blobSequenceEnd } = logItem;
|
|
64
27
|
const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;
|
|
65
28
|
logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);
|
|
66
|
-
// console.log('addLogItem done', result); // eslint-disable-line
|
|
67
29
|
return;
|
|
68
30
|
}
|
|
69
|
-
throw new
|
|
31
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);
|
|
70
32
|
} catch (error) {
|
|
71
|
-
const errorMessage = error.payload || error.message ||
|
|
72
|
-
|
|
73
|
-
throw new
|
|
33
|
+
const errorMessage = error.payload || error.message || "";
|
|
34
|
+
logError(error);
|
|
35
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);
|
|
74
36
|
}
|
|
75
37
|
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Query log items
|
|
79
|
-
* @param {Integer} limit defaults 5
|
|
80
|
-
* @param {Integer} skip defaults 0
|
|
81
|
-
* @param {Object} rest query params
|
|
82
|
-
* @returns result array
|
|
83
|
-
*/
|
|
84
|
-
async function query({
|
|
85
|
-
limit = 5,
|
|
86
|
-
skip = 0,
|
|
87
|
-
...rest
|
|
88
|
-
}) {
|
|
38
|
+
async function query({ limit = 5, skip = 0, ...rest }) {
|
|
89
39
|
logger.debug(`Query params: ${JSON.stringify(rest)}`);
|
|
90
40
|
logger.debug(`Limit and skip params: ${limit} | ${skip}`);
|
|
91
41
|
checkLogItemType(rest.logItemType, false, false);
|
|
92
|
-
const result = await db.collection(collection)
|
|
93
|
-
.
|
|
94
|
-
creationTime: 1
|
|
95
|
-
}).skip(parseInt(skip, 10)).limit(parseInt(limit, 10)).toArray();
|
|
96
|
-
//logger.debug(`Query result: ${result}`);
|
|
97
|
-
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);
|
|
42
|
+
const result = await db.collection(collection).find(rest).sort({ creationTime: 1 }).skip(parseInt(skip, 10)).limit(parseInt(limit, 10)).toArray();
|
|
43
|
+
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : "Not found!"}`);
|
|
98
44
|
return result;
|
|
99
45
|
}
|
|
100
|
-
|
|
101
|
-
// DEVELOP: queryById returns jsut one (randomish) log! is this useful?
|
|
102
|
-
/**
|
|
103
|
-
* Get single log item by correlationId
|
|
104
|
-
* @param {String} correlationId
|
|
105
|
-
* @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG
|
|
106
|
-
* @param {Integer} skip defaults 0
|
|
107
|
-
* @param {Integer} limit defaults 1
|
|
108
|
-
* @returns query result array
|
|
109
|
-
*/
|
|
110
|
-
async function queryById(correlationId, logItemType = _constants.LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {
|
|
46
|
+
async function queryById(correlationId, logItemType = LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {
|
|
111
47
|
logger.debug(`QueryById: ${correlationId}, logItemType: ${logItemType}, skip: ${skip}, limit: ${limit}`);
|
|
112
|
-
const result = await db.collection(collection)
|
|
113
|
-
.
|
|
114
|
-
correlationId,
|
|
115
|
-
logItemType
|
|
116
|
-
}).sort({
|
|
117
|
-
blobSequence: 1
|
|
118
|
-
}).skip(parseInt(skip, 10)).limit(parseInt(limit, 10)).toArray();
|
|
119
|
-
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);
|
|
48
|
+
const result = await db.collection(collection).find({ correlationId, logItemType }).sort({ blobSequence: 1 }).skip(parseInt(skip, 10)).limit(parseInt(limit, 10)).toArray();
|
|
49
|
+
logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : "Not found!"}`);
|
|
120
50
|
return result;
|
|
121
51
|
}
|
|
122
|
-
|
|
123
|
-
// getListOfLogs returns list of correlationIds that have logs of given logItemType
|
|
124
|
-
// if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG
|
|
125
|
-
/**
|
|
126
|
-
* Get list of correlationIds of logs filtered by logItemType
|
|
127
|
-
* @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG
|
|
128
|
-
* @returns Array of query results
|
|
129
|
-
*/
|
|
130
|
-
async function getListOfLogs(logItemType = _constants.LOG_ITEM_TYPE.MERGE_LOG) {
|
|
52
|
+
async function getListOfLogs(logItemType = LOG_ITEM_TYPE.MERGE_LOG) {
|
|
131
53
|
checkLogItemType(logItemType, true, true);
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// console.log(`${JSON.stringify(logItemType)}`);
|
|
135
|
-
const result = await db.collection(collection).distinct('correlationId', {
|
|
136
|
-
logItemType: `${logItemType}`
|
|
137
|
-
});
|
|
138
|
-
logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : 'Not found!'}`);
|
|
54
|
+
const result = await db.collection(collection).distinct("correlationId", { logItemType: `${logItemType}` });
|
|
55
|
+
logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : "Not found!"}`);
|
|
139
56
|
return result;
|
|
140
57
|
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Get list of catalogers from all available logs
|
|
144
|
-
* @returns Array of query results
|
|
145
|
-
*/
|
|
146
58
|
async function getListOfCatalogers() {
|
|
147
59
|
logger.debug(`Getting list of Catalogers`);
|
|
148
|
-
const result = await db.collection(collection)
|
|
149
|
-
.distinct('cataloger');
|
|
60
|
+
const result = await db.collection(collection).distinct("cataloger");
|
|
150
61
|
return result;
|
|
151
62
|
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Get list of correlationIds from all available logs
|
|
155
|
-
* @returns Array of query results
|
|
156
|
-
*/
|
|
157
63
|
async function getListOfCorrelationIds() {
|
|
158
64
|
logger.debug(`Getting list of CorrelationIds`);
|
|
159
|
-
const result = await db.collection(collection)
|
|
160
|
-
.distinct('correlationId');
|
|
65
|
+
const result = await db.collection(collection).distinct("correlationId");
|
|
161
66
|
return result;
|
|
162
67
|
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Get filtered list of logs with extra info. Give params in Object
|
|
166
|
-
* @param {[String]} logItemTypes: String array of logItemTypes. Defaults [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG]
|
|
167
|
-
* @param {[String]} catalogers: String array of wanted catalogers. Defaults []
|
|
168
|
-
* @param {String} dateBefore: String date schema 'YYYY-MM-DD'. Defaults new Date()
|
|
169
|
-
* @param {String} dateAfter: String date schema 'YYYY-MM-DD'. Defaults '2000-01-01'
|
|
170
|
-
* @param {Boolean} test: Boolean is this test run. Defaults false
|
|
171
|
-
* @returns Parsed Object {'correlationId', 'logItemType', 'creationTime', 'cataloger', 'logCount'}
|
|
172
|
-
*/
|
|
173
|
-
async function getExpandedListOfLogs({
|
|
174
|
-
logItemTypes = [_constants.LOG_ITEM_TYPE.MERGE_LOG, _constants.LOG_ITEM_TYPE.MATCH_LOG],
|
|
175
|
-
catalogers = [],
|
|
176
|
-
dateBefore = new Date(),
|
|
177
|
-
dateAfter = '2000-01-01',
|
|
178
|
-
test = false
|
|
179
|
-
}) {
|
|
68
|
+
async function getExpandedListOfLogs({ logItemTypes = [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG], catalogers = [], dateBefore = /* @__PURE__ */ new Date(), dateAfter = "2000-01-01", test = false }) {
|
|
180
69
|
logger.debug(`commons/getExpandedListOfLogs: logItemTypes: ${JSON.stringify(logItemTypes)}, dateAfter: ${dateAfter}, dateBefore: ${dateBefore}}, catalogers: ${JSON.stringify(catalogers)}`);
|
|
181
|
-
logger.silly(JSON.stringify(generateMatchObject({
|
|
182
|
-
logItemTypes,
|
|
183
|
-
catalogers,
|
|
184
|
-
dateBefore,
|
|
185
|
-
dateAfter
|
|
186
|
-
}))); // eslint-disable-line
|
|
187
|
-
//checkLogItemType(logItemType, false, false);
|
|
188
|
-
//logger.debug(`Getting expanded list of logs`);
|
|
70
|
+
logger.silly(JSON.stringify(generateMatchObject({ logItemTypes, catalogers, dateBefore, dateAfter })));
|
|
189
71
|
const pipeline = [
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
'creationTime': 1
|
|
202
|
-
}
|
|
203
|
-
}, {
|
|
204
|
-
'$group': {
|
|
205
|
-
'_id': {
|
|
206
|
-
'correlationId': '$correlationId',
|
|
207
|
-
'logItemType': '$logItemType'
|
|
208
|
-
},
|
|
209
|
-
'creationTime': {
|
|
210
|
-
'$first': '$creationTime'
|
|
211
|
-
},
|
|
212
|
-
'cataloger': {
|
|
213
|
-
'$first': '$cataloger'
|
|
214
|
-
},
|
|
215
|
-
'logCount': {
|
|
216
|
-
'$sum': 1
|
|
72
|
+
// currently return only MERGE_LOG and MATCH_LOG
|
|
73
|
+
generateMatchObject({ logItemTypes, catalogers, dateBefore, dateAfter, test }),
|
|
74
|
+
{
|
|
75
|
+
"$sort": { "correlationId": 1, "logItemType": 1, "creationTime": 1 }
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"$group": {
|
|
79
|
+
"_id": { "correlationId": "$correlationId", "logItemType": "$logItemType" },
|
|
80
|
+
"creationTime": { "$first": "$creationTime" },
|
|
81
|
+
"cataloger": { "$first": "$cataloger" },
|
|
82
|
+
"logCount": { "$sum": 1 }
|
|
217
83
|
}
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"$sort": { "correlationId": 1, "logItemType": 1, "creationTime": 1 }
|
|
218
87
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}
|
|
225
|
-
}];
|
|
226
|
-
const result = await db.collection(collection) // eslint-disable-line functional/immutable-data
|
|
227
|
-
.aggregate(pipeline).toArray();
|
|
228
|
-
const fixedResult = result.map(logListing => {
|
|
229
|
-
const {
|
|
230
|
-
correlationId,
|
|
231
|
-
logItemType
|
|
232
|
-
} = logListing._id;
|
|
233
|
-
const {
|
|
234
|
-
cataloger,
|
|
235
|
-
creationTime,
|
|
236
|
-
logCount
|
|
237
|
-
} = logListing;
|
|
238
|
-
return {
|
|
239
|
-
correlationId,
|
|
240
|
-
logItemType,
|
|
241
|
-
cataloger,
|
|
242
|
-
creationTime,
|
|
243
|
-
logCount
|
|
244
|
-
};
|
|
88
|
+
];
|
|
89
|
+
const result = await db.collection(collection).aggregate(pipeline).toArray();
|
|
90
|
+
const fixedResult = result.map((logListing) => {
|
|
91
|
+
const { correlationId, logItemType } = logListing._id;
|
|
92
|
+
const { cataloger, creationTime, logCount } = logListing;
|
|
93
|
+
return { correlationId, logItemType, cataloger, creationTime, logCount };
|
|
245
94
|
});
|
|
246
95
|
logger.silly(`Query result: ${JSON.stringify(result)}`);
|
|
247
96
|
logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);
|
|
248
|
-
logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` :
|
|
97
|
+
logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : "Not found!"}`);
|
|
249
98
|
return fixedResult;
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Generate match object for aggregation pipeline
|
|
253
|
-
* @param {[String]} logItemTypes: String array of logItemTypes.
|
|
254
|
-
* @param {[String]} catalogers: String array of wanted catalogers
|
|
255
|
-
* @param {String} dateBefore: String date schema 'YYYY-MM-DD'
|
|
256
|
-
* @param {String} dateAfter: String date schema 'YYYY-MM-DD'
|
|
257
|
-
* @param {Boolean} test: Boolean is this test run. Defaults false
|
|
258
|
-
* @returns Match Object
|
|
259
|
-
*/
|
|
260
|
-
function generateMatchObject({
|
|
261
|
-
logItemTypes,
|
|
262
|
-
catalogers,
|
|
263
|
-
dateBefore,
|
|
264
|
-
dateAfter,
|
|
265
|
-
test = false
|
|
266
|
-
}) {
|
|
99
|
+
function generateMatchObject({ logItemTypes: logItemTypes2, catalogers: catalogers2, dateBefore: dateBefore2, dateAfter: dateAfter2, test: test2 = false }) {
|
|
267
100
|
const matchOptions = {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
} : /.*/ui,
|
|
275
|
-
'creationTime': {
|
|
276
|
-
'$gte': test ? new Date(dateAfter).toISOString() : new Date(dateAfter),
|
|
277
|
-
'$lte': test ? new Date(dateBefore).toISOString() : new Date(dateBefore)
|
|
101
|
+
"$match": {
|
|
102
|
+
"logItemType": logItemTypes2.length > 0 ? { "$in": logItemTypes2 } : /.*/ui,
|
|
103
|
+
"cataloger": catalogers2.length > 0 ? { "$in": catalogers2 } : /.*/ui,
|
|
104
|
+
"creationTime": {
|
|
105
|
+
"$gte": test2 ? new Date(dateAfter2).toISOString() : new Date(dateAfter2),
|
|
106
|
+
"$lte": test2 ? new Date(dateBefore2).toISOString() : new Date(dateBefore2)
|
|
278
107
|
}
|
|
279
108
|
}
|
|
280
109
|
};
|
|
281
110
|
return matchOptions;
|
|
282
111
|
}
|
|
283
112
|
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Protect logs from cleaning. Forced cleaning defaults 30days
|
|
287
|
-
* @param {String} correlationId
|
|
288
|
-
* @param {Integer} blobSequence
|
|
289
|
-
* @returns result
|
|
290
|
-
*/
|
|
291
113
|
async function protect(correlationId, blobSequence) {
|
|
292
114
|
logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);
|
|
293
|
-
const cleanCorrelationId = (
|
|
294
|
-
const cleanBlobSequence = (
|
|
295
|
-
const filter = blobSequence ? {
|
|
296
|
-
correlationId: cleanCorrelationId,
|
|
297
|
-
blobSequence: parseInt(cleanBlobSequence, 10)
|
|
298
|
-
} : {
|
|
299
|
-
correlationId: cleanCorrelationId
|
|
300
|
-
};
|
|
115
|
+
const cleanCorrelationId = sanitize(correlationId);
|
|
116
|
+
const cleanBlobSequence = sanitize(blobSequence);
|
|
117
|
+
const filter = blobSequence ? { correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10) } : { correlationId: cleanCorrelationId };
|
|
301
118
|
try {
|
|
302
|
-
const result = await db.collection(collection).updateMany(
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
$
|
|
119
|
+
const result = await db.collection(collection).updateMany(
|
|
120
|
+
filter,
|
|
121
|
+
[
|
|
122
|
+
{
|
|
123
|
+
$set: {
|
|
124
|
+
modificationTime: moment().toDate(),
|
|
125
|
+
protected: { $not: "$protected" }
|
|
126
|
+
}
|
|
307
127
|
}
|
|
308
|
-
|
|
309
|
-
|
|
128
|
+
]
|
|
129
|
+
);
|
|
310
130
|
return result;
|
|
311
131
|
} catch (error) {
|
|
312
|
-
const errorMessage = error.payload || error.message ||
|
|
313
|
-
|
|
314
|
-
throw new
|
|
132
|
+
const errorMessage = error.payload || error.message || "";
|
|
133
|
+
logError(error);
|
|
134
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);
|
|
315
135
|
}
|
|
316
136
|
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Remove logs
|
|
320
|
-
* @param {String} correlationId
|
|
321
|
-
* @param {Boolean} force defaults false
|
|
322
|
-
* @returns result
|
|
323
|
-
*/
|
|
324
137
|
async function remove(correlationId, force = false) {
|
|
325
138
|
logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);
|
|
326
|
-
const clean = (
|
|
327
|
-
const filter = force ? {
|
|
328
|
-
correlationId: clean
|
|
329
|
-
} : {
|
|
330
|
-
correlationId: clean,
|
|
331
|
-
protected: {
|
|
332
|
-
$ne: true
|
|
333
|
-
}
|
|
334
|
-
};
|
|
139
|
+
const clean = sanitize(correlationId);
|
|
140
|
+
const filter = force ? { correlationId: clean } : { correlationId: clean, protected: { $ne: true } };
|
|
335
141
|
try {
|
|
336
142
|
const result = await db.collection(collection).deleteMany(filter);
|
|
337
143
|
return result;
|
|
338
144
|
} catch (error) {
|
|
339
|
-
const errorMessage = error.payload || error.message ||
|
|
340
|
-
|
|
341
|
-
throw new
|
|
145
|
+
const errorMessage = error.payload || error.message || "";
|
|
146
|
+
logError(error);
|
|
147
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);
|
|
342
148
|
}
|
|
343
149
|
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Remove logs by sequences
|
|
347
|
-
* @param {String} correlationId
|
|
348
|
-
* @param {[Integer]} sequences
|
|
349
|
-
* @param {Boolean} force defaults false
|
|
350
|
-
* @returns result
|
|
351
|
-
*/
|
|
352
150
|
async function removeBySequences(correlationId, sequences = [], force = false) {
|
|
353
151
|
logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);
|
|
354
|
-
const clean = (
|
|
355
|
-
|
|
356
|
-
// we accept also strings that are convertilble to integers greated than 0
|
|
357
|
-
const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);
|
|
152
|
+
const clean = sanitize(correlationId);
|
|
153
|
+
const cleanSequences = sequences.filter((sequence) => Number.isInteger(Number(sequence)) && sequence > 0);
|
|
358
154
|
if (sequences.length !== cleanSequences.length) {
|
|
359
|
-
throw new
|
|
155
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);
|
|
360
156
|
}
|
|
361
|
-
const filter = force ? {
|
|
362
|
-
correlationId: clean,
|
|
363
|
-
blobSequence: {
|
|
364
|
-
$in: cleanSequences
|
|
365
|
-
}
|
|
366
|
-
} : {
|
|
367
|
-
correlationId: clean,
|
|
368
|
-
blobSequence: {
|
|
369
|
-
$in: sequences
|
|
370
|
-
},
|
|
371
|
-
protected: {
|
|
372
|
-
$ne: true
|
|
373
|
-
}
|
|
374
|
-
};
|
|
157
|
+
const filter = force ? { correlationId: clean, blobSequence: { $in: cleanSequences } } : { correlationId: clean, blobSequence: { $in: sequences }, protected: { $ne: true } };
|
|
375
158
|
try {
|
|
376
159
|
const result = await db.collection(collection).deleteMany(filter);
|
|
377
160
|
return result;
|
|
378
161
|
} catch (error) {
|
|
379
|
-
const errorMessage = error.payload || error.message ||
|
|
380
|
-
|
|
381
|
-
throw new
|
|
162
|
+
const errorMessage = error.payload || error.message || "";
|
|
163
|
+
logError(error);
|
|
164
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);
|
|
382
165
|
}
|
|
383
166
|
}
|
|
384
|
-
|
|
385
|
-
/**
|
|
386
|
-
* Checks existence and validity of logItemType
|
|
387
|
-
* @param {String} logItemType constant LOG_ITEM_TYPE
|
|
388
|
-
* @param {Boolean} errorUnknown defaults false
|
|
389
|
-
* @param {Boolean} errorNotExisting defaults false
|
|
390
|
-
* @returns void
|
|
391
|
-
*/
|
|
392
167
|
function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {
|
|
393
168
|
if (logItemType) {
|
|
394
|
-
const typeInLogItemTypes = Object.values(
|
|
169
|
+
const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;
|
|
395
170
|
if (typeInLogItemTypes) {
|
|
396
171
|
return logger.debug(`Valid logItemType: ${logItemType}`);
|
|
397
172
|
}
|
|
398
173
|
if (errorUnknown) {
|
|
399
|
-
throw new
|
|
174
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);
|
|
400
175
|
}
|
|
401
176
|
return logger.debug(`WARN: We have unknown logType: ${logItemType}`);
|
|
402
177
|
}
|
|
403
178
|
if (errorNotExisting) {
|
|
404
|
-
throw new
|
|
179
|
+
throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);
|
|
405
180
|
}
|
|
406
181
|
return logger.debug(`No logItemType: ${logItemType}`);
|
|
407
182
|
}
|
|
408
183
|
}
|
|
409
|
-
//# sourceMappingURL=mongoLog.js.map
|
|
184
|
+
//# sourceMappingURL=mongoLog.js.map
|
package/dist/mongoLog.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"mongoLog.js","names":["_mongodb","require","_melindaBackendCommons","_melindaCommons","_utils","_moment","_interopRequireDefault","_httpStatus","_mongoSanitize","_constants","_default","MONGO_URI","dbName","logger","createLogger","client","MongoClient","connect","db","collection","addLogItem","query","queryById","getListOfLogs","getListOfCatalogers","getListOfCorrelationIds","getExpandedListOfLogs","protect","remove","removeBySequences","logItem","time","moment","toDate","newLogItem","creationTime","protected","checkLogItemType","logItemType","result","insertOne","acknowledged","blobSequence","blobSequenceStart","blobSequenceEnd","itemString","info","correlationId","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","errorMessage","payload","message","logError","limit","skip","rest","debug","JSON","stringify","find","sort","parseInt","toArray","length","LOG_ITEM_TYPE","MERGE_LOG","distinct","logItemTypes","MATCH_LOG","catalogers","dateBefore","Date","dateAfter","test","silly","generateMatchObject","pipeline","aggregate","fixedResult","map","logListing","_id","cataloger","logCount","matchOptions","toISOString","cleanCorrelationId","sanitize","cleanBlobSequence","filter","updateMany","$set","modificationTime","$not","force","clean","$ne","deleteMany","sequences","cleanSequences","sequence","Number","isInteger","$in","errorUnknown","errorNotExisting","typeInLogItemTypes","Object","values","indexOf"],"sources":["../src/mongoLog.js"],"sourcesContent":["\n\nimport {MongoClient} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {LOG_ITEM_TYPE} from './constants';\n\n/**\n * Create log operator\n * @param {String} MONGO_URI connnection address to mongo\n * @param {String} dbName Mongo DB name, defaults 'rest-api'\n * @returns {Object} containing all log handling functions\n */\nexport default async function (MONGO_URI, dbName = 'rest-api') {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI);\n const db = client.db(dbName);\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getListOfCatalogers, getListOfCorrelationIds, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n /**\n * Add log item to collection\n * @param {Object} logItem contains log item data\n * @returns void\n */\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n // console.log(newLogItem); // eslint-disable-line\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n // console.log('addLogItem done', result); // eslint-disable-line\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Query log items\n * @param {Integer} limit defaults 5\n * @param {Integer} skip defaults 0\n * @param {Object} rest query params\n * @returns result array\n */\n async function query({limit = 5, skip = 0, ...rest}) {\n logger.debug(`Query params: ${JSON.stringify(rest)}`);\n logger.debug(`Limit and skip params: ${limit} | ${skip}`);\n checkLogItemType(rest.logItemType, false, false);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find(rest)\n .sort({creationTime: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n //logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n // DEVELOP: queryById returns jsut one (randomish) log! is this useful?\n /**\n * Get single log item by correlationId\n * @param {String} correlationId\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @param {Integer} skip defaults 0\n * @param {Integer} limit defaults 1\n * @returns query result array\n */\n async function queryById(correlationId, logItemType = LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationId}, logItemType: ${logItemType}, skip: ${skip}, limit: ${limit}`);\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .find({correlationId, logItemType})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n // getListOfLogs returns list of correlationIds that have logs of given logItemType\n // if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG\n /**\n * Get list of correlationIds of logs filtered by logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @returns Array of query results\n */\n async function getListOfLogs(logItemType = LOG_ITEM_TYPE.MERGE_LOG) {\n checkLogItemType(logItemType, true, true);\n //logger.debug(logItemType);\n // eslint-disable-next-line no-console\n // console.log(`${JSON.stringify(logItemType)}`);\n const result = await db.collection(collection)\n .distinct('correlationId', {logItemType: `${logItemType}`});\n logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : 'Not found!'}`);\n return result;\n }\n\n /**\n * Get list of catalogers from all available logs\n * @returns Array of query results\n */\n async function getListOfCatalogers() {\n logger.debug(`Getting list of Catalogers`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('cataloger');\n\n return result;\n }\n\n /**\n * Get list of correlationIds from all available logs\n * @returns Array of query results\n */\n async function getListOfCorrelationIds() {\n logger.debug(`Getting list of CorrelationIds`);\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .distinct('correlationId');\n\n return result;\n }\n\n\n /**\n * Get filtered list of logs with extra info. Give params in Object\n * @param {[String]} logItemTypes: String array of logItemTypes. Defaults [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG]\n * @param {[String]} catalogers: String array of wanted catalogers. Defaults []\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'. Defaults new Date()\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'. Defaults '2000-01-01'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Parsed Object {'correlationId', 'logItemType', 'creationTime', 'cataloger', 'logCount'}\n */\n async function getExpandedListOfLogs({logItemTypes = [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG], catalogers = [], dateBefore = new Date(), dateAfter = '2000-01-01', test = false}) {\n logger.debug(`commons/getExpandedListOfLogs: logItemTypes: ${JSON.stringify(logItemTypes)}, dateAfter: ${dateAfter}, dateBefore: ${dateBefore}}, catalogers: ${JSON.stringify(catalogers)}`);\n logger.silly(JSON.stringify(generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter}))); // eslint-disable-line\n //checkLogItemType(logItemType, false, false);\n //logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test}),\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n },\n {\n '$group':\n {\n '_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}\n }\n },\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n }\n ];\n\n const result = await db.collection(collection) // eslint-disable-line functional/immutable-data\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return fixedResult;\n\n /**\n * Generate match object for aggregation pipeline\n * @param {[String]} logItemTypes: String array of logItemTypes.\n * @param {[String]} catalogers: String array of wanted catalogers\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Match Object\n */\n function generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test = false}) {\n const matchOptions = {\n '$match': {\n 'logItemType': logItemTypes.length > 0 ? {'$in': logItemTypes} : /.*/ui,\n 'cataloger': catalogers.length > 0 ? {'$in': catalogers} : /.*/ui,\n 'creationTime': {\n '$gte': test ? new Date(dateAfter).toISOString() : new Date(dateAfter),\n '$lte': test ? new Date(dateBefore).toISOString() : new Date(dateBefore)\n }\n }\n };\n\n return matchOptions;\n }\n }\n\n /**\n * Protect logs from cleaning. Forced cleaning defaults 30days\n * @param {String} correlationId\n * @param {Integer} blobSequence\n * @returns result\n */\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs\n * @param {String} correlationId\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs by sequences\n * @param {String} correlationId\n * @param {[Integer]} sequences\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Checks existence and validity of logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE\n * @param {Boolean} errorUnknown defaults false\n * @param {Boolean} errorNotExisting defaults false\n * @returns void\n */\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mongoLog.js"],
|
|
4
|
+
"sourcesContent": ["import {MongoClient} from 'mongodb';\nimport moment from 'moment';\nimport httpStatus from 'http-status';\nimport sanitize from 'mongo-sanitize';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {logError} from './utils.js';\nimport {LOG_ITEM_TYPE} from './constants.js';\n\n/**\n * Create log operator\n * @param {String} MONGO_URI connnection address to mongo\n * @param {String} dbName Mongo DB name, defaults 'rest-api'\n * @returns {Object} containing all log handling functions\n */\nexport default async function (MONGO_URI, dbName = 'rest-api') {\n const logger = createLogger();\n\n // Connect to mongo (MONGO)\n const client = await MongoClient.connect(MONGO_URI);\n const db = client.db(dbName);\n const collection = 'logs';\n return {addLogItem, query, queryById, getListOfLogs, getListOfCatalogers, getListOfCorrelationIds, getExpandedListOfLogs, protect, remove, removeBySequences};\n\n /**\n * Add log item to collection\n * @param {Object} logItem contains log item data\n * @returns void\n */\n async function addLogItem(logItem) {\n const time = moment().toDate();\n const newLogItem = {\n ...logItem,\n creationTime: time,\n protected: false\n };\n try {\n // console.log(newLogItem); // eslint-disable-line\n checkLogItemType(logItem.logItemType, false);\n const result = await db.collection(collection).insertOne(newLogItem);\n if (result.acknowledged) {\n const {blobSequence, blobSequenceStart, blobSequenceEnd} = logItem;\n const itemString = blobSequenceStart && blobSequenceEnd ? `${blobSequenceStart} - ${blobSequenceEnd}` : `${blobSequence}`;\n logger.info(`*** New ${logItem.logItemType} added for ${logItem.correlationId}, blobSequence(s): ${itemString}. ***`);\n // console.log('addLogItem done', result); // eslint-disable-line\n return;\n }\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Query log items\n * @param {Integer} limit defaults 5\n * @param {Integer} skip defaults 0\n * @param {Object} rest query params\n * @returns result array\n */\n async function query({limit = 5, skip = 0, ...rest}) {\n logger.debug(`Query params: ${JSON.stringify(rest)}`);\n logger.debug(`Limit and skip params: ${limit} | ${skip}`);\n checkLogItemType(rest.logItemType, false, false);\n const result = await db.collection(collection)\n .find(rest)\n .sort({creationTime: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n //logger.debug(`Query result: ${result}`);\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items! (skip: ${skip} limit: ${limit})` : 'Not found!'}`);\n return result;\n }\n\n // DEVELOP: queryById returns jsut one (randomish) log! is this useful?\n /**\n * Get single log item by correlationId\n * @param {String} correlationId\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @param {Integer} skip defaults 0\n * @param {Integer} limit defaults 1\n * @returns query result array\n */\n async function queryById(correlationId, logItemType = LOG_ITEM_TYPE.MERGE_LOG, skip = 0, limit = 1) {\n logger.debug(`QueryById: ${correlationId}, logItemType: ${logItemType}, skip: ${skip}, limit: ${limit}`);\n const result = await db.collection(collection)\n .find({correlationId, logItemType})\n .sort({blobSequence: 1})\n .skip(parseInt(skip, 10))\n .limit(parseInt(limit, 10))\n .toArray();\n logger.debug(`Query result: ${result.length > 0 ? `Found ${result.length} log items!` : 'Not found!'}`);\n return result;\n }\n\n // getListOfLogs returns list of correlationIds that have logs of given logItemType\n // if logItemType is not given, getListOfLogs returns list of correlationIds that have MERGE_LOG\n /**\n * Get list of correlationIds of logs filtered by logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE defaults LOG_ITEM_TYPE.MERGE_LOG\n * @returns Array of query results\n */\n async function getListOfLogs(logItemType = LOG_ITEM_TYPE.MERGE_LOG) {\n checkLogItemType(logItemType, true, true);\n //logger.debug(logItemType);\n // eslint-disable-next-line no-console\n // console.log(`${JSON.stringify(logItemType)}`);\n const result = await db.collection(collection)\n .distinct('correlationId', {logItemType: `${logItemType}`});\n logger.debug(`Query result for getListOfLogs: ${result.length > 0 ? `Found ${result.length} correlationIds for ${logItemType}!` : 'Not found!'}`);\n return result;\n }\n\n /**\n * Get list of catalogers from all available logs\n * @returns Array of query results\n */\n async function getListOfCatalogers() {\n logger.debug(`Getting list of Catalogers`);\n\n const result = await db.collection(collection)\n .distinct('cataloger');\n\n return result;\n }\n\n /**\n * Get list of correlationIds from all available logs\n * @returns Array of query results\n */\n async function getListOfCorrelationIds() {\n logger.debug(`Getting list of CorrelationIds`);\n\n const result = await db.collection(collection)\n .distinct('correlationId');\n\n return result;\n }\n\n\n /**\n * Get filtered list of logs with extra info. Give params in Object\n * @param {[String]} logItemTypes: String array of logItemTypes. Defaults [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG]\n * @param {[String]} catalogers: String array of wanted catalogers. Defaults []\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'. Defaults new Date()\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'. Defaults '2000-01-01'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Parsed Object {'correlationId', 'logItemType', 'creationTime', 'cataloger', 'logCount'}\n */\n async function getExpandedListOfLogs({logItemTypes = [LOG_ITEM_TYPE.MERGE_LOG, LOG_ITEM_TYPE.MATCH_LOG], catalogers = [], dateBefore = new Date(), dateAfter = '2000-01-01', test = false}) {\n logger.debug(`commons/getExpandedListOfLogs: logItemTypes: ${JSON.stringify(logItemTypes)}, dateAfter: ${dateAfter}, dateBefore: ${dateBefore}}, catalogers: ${JSON.stringify(catalogers)}`);\n logger.silly(JSON.stringify(generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter}))); // eslint-disable-line\n //checkLogItemType(logItemType, false, false);\n //logger.debug(`Getting expanded list of logs`);\n const pipeline = [\n // currently return only MERGE_LOG and MATCH_LOG\n generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test}),\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n },\n {\n '$group':\n {\n '_id': {'correlationId': '$correlationId', 'logItemType': '$logItemType'},\n 'creationTime': {'$first': '$creationTime'},\n 'cataloger': {'$first': '$cataloger'},\n 'logCount': {'$sum': 1}\n }\n },\n {\n '$sort':\n {'correlationId': 1, 'logItemType': 1, 'creationTime': 1}\n }\n ];\n\n const result = await db.collection(collection)\n .aggregate(pipeline)\n .toArray();\n\n const fixedResult = result.map((logListing) => {\n const {correlationId, logItemType} = logListing._id;\n const {cataloger, creationTime, logCount} = logListing;\n return {correlationId, logItemType, cataloger, creationTime, logCount};\n });\n\n logger.silly(`Query result: ${JSON.stringify(result)}`);\n logger.silly(`Query result: ${JSON.stringify(fixedResult)}`);\n\n logger.debug(`Query result: ${fixedResult.length > 0 ? `Found ${fixedResult.length} log items!` : 'Not found!'}`);\n return fixedResult;\n\n /**\n * Generate match object for aggregation pipeline\n * @param {[String]} logItemTypes: String array of logItemTypes.\n * @param {[String]} catalogers: String array of wanted catalogers\n * @param {String} dateBefore: String date schema 'YYYY-MM-DD'\n * @param {String} dateAfter: String date schema 'YYYY-MM-DD'\n * @param {Boolean} test: Boolean is this test run. Defaults false\n * @returns Match Object\n */\n function generateMatchObject({logItemTypes, catalogers, dateBefore, dateAfter, test = false}) {\n const matchOptions = {\n '$match': {\n 'logItemType': logItemTypes.length > 0 ? {'$in': logItemTypes} : /.*/ui,\n 'cataloger': catalogers.length > 0 ? {'$in': catalogers} : /.*/ui,\n 'creationTime': {\n '$gte': test ? new Date(dateAfter).toISOString() : new Date(dateAfter),\n '$lte': test ? new Date(dateBefore).toISOString() : new Date(dateBefore)\n }\n }\n };\n\n return matchOptions;\n }\n }\n\n /**\n * Protect logs from cleaning. Forced cleaning defaults 30days\n * @param {String} correlationId\n * @param {Integer} blobSequence\n * @returns result\n */\n async function protect(correlationId, blobSequence) {\n logger.info(`Protecting in Mongo (${collection}) correlationId: ${correlationId}, blobSequence: ${blobSequence}`);\n const cleanCorrelationId = sanitize(correlationId);\n const cleanBlobSequence = sanitize(blobSequence);\n const filter = blobSequence ? {correlationId: cleanCorrelationId, blobSequence: parseInt(cleanBlobSequence, 10)} : {correlationId: cleanCorrelationId};\n\n try {\n const result = await db.collection(collection).updateMany(\n filter,\n [\n {\n $set: {\n modificationTime: moment().toDate(),\n protected: {$not: '$protected'}\n }\n }\n ]\n );\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs\n * @param {String} correlationId\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function remove(correlationId, force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}`);\n const clean = sanitize(correlationId);\n const filter = force ? {correlationId: clean} : {correlationId: clean, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Remove logs by sequences\n * @param {String} correlationId\n * @param {[Integer]} sequences\n * @param {Boolean} force defaults false\n * @returns result\n */\n async function removeBySequences(correlationId, sequences = [], force = false) {\n logger.info(`Removing from Mongo (${collection}) correlationId: ${correlationId}, sequences: ${sequences.length}`);\n const clean = sanitize(correlationId);\n // blobSequences are integers that start from 1\n // we accept also strings that are convertilble to integers greated than 0\n const cleanSequences = sequences.filter(sequence => Number.isInteger(Number(sequence)) && sequence > 0);\n\n if (sequences.length !== cleanSequences.length) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Invalid sequences in removeBySequences. Sequences should be positive integers`);\n }\n\n const filter = force ? {correlationId: clean, blobSequence: {$in: cleanSequences}} : {correlationId: clean, blobSequence: {$in: sequences}, protected: {$ne: true}};\n\n try {\n const result = await db.collection(collection).deleteMany(filter);\n return result;\n } catch (error) {\n const errorMessage = error.payload || error.message || '';\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Mongo errored: ${errorMessage}`);\n }\n }\n\n /**\n * Checks existence and validity of logItemType\n * @param {String} logItemType constant LOG_ITEM_TYPE\n * @param {Boolean} errorUnknown defaults false\n * @param {Boolean} errorNotExisting defaults false\n * @returns void\n */\n function checkLogItemType(logItemType, errorUnknown = false, errorNotExisting = false) {\n if (logItemType) {\n const typeInLogItemTypes = Object.values(LOG_ITEM_TYPE).indexOf(logItemType) > -1;\n if (typeInLogItemTypes) {\n return logger.debug(`Valid logItemType: ${logItemType}`);\n }\n if (errorUnknown) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Unknown logItemType: ${logItemType}`);\n }\n return logger.debug(`WARN: We have unknown logType: ${logItemType}`);\n }\n\n if (errorNotExisting) {\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `No logItemType: ${logItemType}`);\n }\n return logger.debug(`No logItemType: ${logItemType}`);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["logItemTypes", "catalogers", "dateBefore", "dateAfter", "test"]
|
|
7
|
+
}
|