@natlibfi/melinda-rest-api-commons 2.0.0-alpha.1 → 2.0.0-alpha.13
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/amqp.js +63 -73
- package/dist/amqp.js.map +1 -1
- package/dist/constants.js +1 -1
- package/dist/helpers/conversion.js +2 -0
- package/dist/helpers/conversion.js.map +1 -1
- package/dist/helpers/format.js +1 -1
- package/dist/index.js +11 -11
- package/dist/mongo.js +99 -74
- package/dist/mongo.js.map +1 -1
- package/package.json +16 -16
package/dist/amqp.js
CHANGED
|
@@ -62,7 +62,6 @@ async function _default(AMQP_URL) {
|
|
|
62
62
|
consumeRawChunk,
|
|
63
63
|
consumeOne,
|
|
64
64
|
consumeRaw,
|
|
65
|
-
ackNReplyMessages,
|
|
66
65
|
ackMessages,
|
|
67
66
|
nackMessages,
|
|
68
67
|
sendToQueue,
|
|
@@ -71,7 +70,7 @@ async function _default(AMQP_URL) {
|
|
|
71
70
|
};
|
|
72
71
|
|
|
73
72
|
async function checkQueue(queue, style = 'basic', purge = false, toRecord = true) {
|
|
74
|
-
logger.
|
|
73
|
+
logger.verbose(`checkQueue: ${queue}, Style: ${style}: Purge: ${purge}, toRecord: ${toRecord}`);
|
|
75
74
|
|
|
76
75
|
try {
|
|
77
76
|
const channelInfo = await channel.assertQueue(queue, {
|
|
@@ -80,7 +79,7 @@ async function _default(AMQP_URL) {
|
|
|
80
79
|
|
|
81
80
|
if (purge) {
|
|
82
81
|
await purgeQueue(purge);
|
|
83
|
-
logger.debug(`Queue ${queue} has purged ${channelInfo.messageCount}
|
|
82
|
+
logger.debug(`Queue ${queue} has purged ${channelInfo.messageCount} messages`);
|
|
84
83
|
return checkQueue(queue, style);
|
|
85
84
|
}
|
|
86
85
|
|
|
@@ -89,28 +88,33 @@ async function _default(AMQP_URL) {
|
|
|
89
88
|
return false;
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
logger.
|
|
91
|
+
logger.silly(`Queue ${queue} has ${channelInfo.messageCount} messages`);
|
|
93
92
|
|
|
94
93
|
if (style === 'messages') {
|
|
95
94
|
return channelInfo.messageCount;
|
|
96
|
-
}
|
|
95
|
+
} // Note: returns a message + a record
|
|
96
|
+
|
|
97
97
|
|
|
98
98
|
if (style === 'one') {
|
|
99
99
|
return consumeOne(queue);
|
|
100
|
-
}
|
|
100
|
+
} // Note: returns just a message
|
|
101
|
+
|
|
101
102
|
|
|
102
103
|
if (style === 'raw') {
|
|
103
104
|
return consumeRaw(queue);
|
|
104
|
-
}
|
|
105
|
+
} // Note: returns a chunk of messages + records
|
|
106
|
+
|
|
105
107
|
|
|
106
108
|
if (style === 'rawChunk') {
|
|
107
109
|
return consumeRawChunk(queue);
|
|
108
|
-
}
|
|
110
|
+
} // Note: returns a chunk of messages or a chunk of messages + records (depending on toRecord)
|
|
111
|
+
|
|
109
112
|
|
|
110
113
|
if (/^.{8}-.{4}-.{4}-.{4}-.{12}$/u.test(style)) {
|
|
111
|
-
logger.
|
|
114
|
+
logger.silly(`checkQueue: regexp match ${style}`);
|
|
112
115
|
return consumeByCorrelationId(queue, style, toRecord);
|
|
113
|
-
}
|
|
116
|
+
} // Note: returns a chunk of messages + records
|
|
117
|
+
|
|
114
118
|
|
|
115
119
|
if (style === 'basic') {
|
|
116
120
|
return consumeChunk(queue);
|
|
@@ -135,20 +139,30 @@ async function _default(AMQP_URL) {
|
|
|
135
139
|
try {
|
|
136
140
|
await channel.assertQueue(queue, {
|
|
137
141
|
durable: true
|
|
138
|
-
});
|
|
142
|
+
}); // getData: next chunk (100) messages
|
|
143
|
+
|
|
139
144
|
const queMessages = await getData(queue);
|
|
140
145
|
const headers = getHeaderInfo(queMessages[0]);
|
|
141
|
-
logger.debug(`Filtering messages by ${JSON.stringify(headers)}`);
|
|
146
|
+
logger.debug(`Filtering messages by cataloger in ${JSON.stringify(headers)}`);
|
|
147
|
+
let filterIn = 0; // eslint-disable-line functional/no-let
|
|
148
|
+
|
|
149
|
+
let filterOut = 0; // eslint-disable-line functional/no-let
|
|
150
|
+
// Check that cataloger match! headers
|
|
142
151
|
|
|
143
152
|
const messages = queMessages.filter(message => {
|
|
144
153
|
if (message.properties.headers.cataloger === headers.cataloger) {
|
|
154
|
+
filterIn++; // eslint-disable-line no-plusplus
|
|
155
|
+
|
|
145
156
|
return true;
|
|
146
157
|
} // Nack unwanted ones
|
|
147
158
|
|
|
148
159
|
|
|
149
160
|
channel.nack(message, false, true);
|
|
161
|
+
filterOut++; // eslint-disable-line no-plusplus
|
|
162
|
+
|
|
150
163
|
return false;
|
|
151
164
|
});
|
|
165
|
+
logger.debug(`Filtering result: valid: ${filterIn} non-valid: ${filterOut}`);
|
|
152
166
|
const records = await messagesToRecords(messages);
|
|
153
167
|
return {
|
|
154
168
|
headers,
|
|
@@ -166,19 +180,29 @@ async function _default(AMQP_URL) {
|
|
|
166
180
|
try {
|
|
167
181
|
await channel.assertQueue(queue, {
|
|
168
182
|
durable: true
|
|
169
|
-
});
|
|
183
|
+
}); // get next chunk (100) messages
|
|
184
|
+
|
|
170
185
|
const queMessages = await getData(queue);
|
|
171
|
-
logger.debug(`Filtering messages by ${correlationId}`);
|
|
186
|
+
logger.debug(`Filtering messages by ${correlationId}`);
|
|
187
|
+
let filterIn = 0; // eslint-disable-line functional/no-let
|
|
188
|
+
|
|
189
|
+
let filterOut = 0; // eslint-disable-line functional/no-let
|
|
190
|
+
// Check that correlationId matches query
|
|
172
191
|
|
|
173
192
|
const messages = queMessages.filter(message => {
|
|
174
193
|
if (message.properties.correlationId === correlationId) {
|
|
194
|
+
filterIn++; // eslint-disable-line no-plusplus
|
|
195
|
+
|
|
175
196
|
return true;
|
|
176
197
|
} // Nack unwanted ones
|
|
177
198
|
|
|
178
199
|
|
|
179
200
|
channel.nack(message, false, true);
|
|
201
|
+
filterOut++; // eslint-disable-line no-plusplus
|
|
202
|
+
|
|
180
203
|
return false;
|
|
181
204
|
});
|
|
205
|
+
logger.debug(`Filtering result: valid: ${filterIn} non-valid: ${filterOut}`);
|
|
182
206
|
const headers = getHeaderInfo(messages[0]);
|
|
183
207
|
|
|
184
208
|
if (toRecord) {
|
|
@@ -205,20 +229,31 @@ async function _default(AMQP_URL) {
|
|
|
205
229
|
try {
|
|
206
230
|
await channel.assertQueue(queue, {
|
|
207
231
|
durable: true
|
|
208
|
-
});
|
|
232
|
+
}); // Get next chunk (100) messages
|
|
233
|
+
|
|
209
234
|
const queMessages = await getData(queue);
|
|
210
235
|
const headers = getHeaderInfo(queMessages[0]);
|
|
211
|
-
logger.debug(`Filtering messages by ${JSON.stringify(headers)}
|
|
236
|
+
logger.debug(`Filtering messages by ${JSON.stringify(headers)}`);
|
|
237
|
+
let filterIn = 0; // eslint-disable-line functional/no-let
|
|
238
|
+
|
|
239
|
+
let filterOut = 0; // eslint-disable-line functional/no-let
|
|
240
|
+
// Check that cataloger match! headers
|
|
212
241
|
|
|
213
242
|
const messages = queMessages.filter(message => {
|
|
214
243
|
if (message.properties.headers.cataloger === headers.cataloger) {
|
|
244
|
+
filterIn++; // eslint-disable-line no-plusplus
|
|
245
|
+
|
|
215
246
|
return true;
|
|
216
247
|
} // Nack unwanted ones
|
|
217
248
|
|
|
218
249
|
|
|
219
250
|
channel.nack(message, false, true);
|
|
251
|
+
filterOut++; // eslint-disable-line no-plusplus
|
|
252
|
+
|
|
220
253
|
return false;
|
|
221
254
|
});
|
|
255
|
+
logger.debug(`Filtering result: valid: ${filterIn} non-valid: ${filterOut}`); // return raw (do not convert messages to records)
|
|
256
|
+
|
|
222
257
|
return {
|
|
223
258
|
headers,
|
|
224
259
|
messages
|
|
@@ -229,7 +264,7 @@ async function _default(AMQP_URL) {
|
|
|
229
264
|
}
|
|
230
265
|
|
|
231
266
|
async function consumeOne(queue) {
|
|
232
|
-
logger.verbose(`Prepared to
|
|
267
|
+
logger.verbose(`Prepared to consumeOne from queue: ${queue}`);
|
|
233
268
|
|
|
234
269
|
try {
|
|
235
270
|
await channel.assertQueue(queue, {
|
|
@@ -255,7 +290,7 @@ async function _default(AMQP_URL) {
|
|
|
255
290
|
}
|
|
256
291
|
|
|
257
292
|
async function consumeRaw(queue) {
|
|
258
|
-
logger.verbose(`Prepared to
|
|
293
|
+
logger.verbose(`Prepared to consumeRaw from queue: ${queue}`);
|
|
259
294
|
|
|
260
295
|
try {
|
|
261
296
|
await channel.assertQueue(queue, {
|
|
@@ -266,56 +301,9 @@ async function _default(AMQP_URL) {
|
|
|
266
301
|
} catch (error) {
|
|
267
302
|
(0, _utils.logError)(error);
|
|
268
303
|
}
|
|
269
|
-
} // ACK records
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
async function ackNReplyMessages({
|
|
273
|
-
status,
|
|
274
|
-
messages,
|
|
275
|
-
payloads
|
|
276
|
-
}) {
|
|
277
|
-
logger.verbose('Ack and reply messages!');
|
|
278
|
-
logger.debug(`Ack and reply messages. status: ${JSON.stringify(status)} messages: ${messages} payloads: ${JSON.stringify(payloads)}`);
|
|
279
|
-
logger.debug(`Handling ${messages.length} messages`);
|
|
280
|
-
await messages.forEach((message, index) => {
|
|
281
|
-
const headers = getHeaderInfo(message);
|
|
282
|
-
logger.debug(`Message: ${message}, index: ${index}`);
|
|
283
|
-
logger.debug(`Headers: ${JSON.stringify(headers)}`); // payloads ids are parsed both form old payloads including just array of ids and new payloads including both array of ids and array of rejected ids
|
|
284
|
-
|
|
285
|
-
const ids = payloads.ids || payloads;
|
|
286
|
-
const rejectedIds = payloads.rejectedIds || [];
|
|
287
|
-
logger.debug(`ids: ${JSON.stringify(ids)}, rejectedIds: ${JSON.stringify(rejectedIds)}`);
|
|
288
|
-
|
|
289
|
-
if (ids.length < 1 && rejectedIds.length > 0) {
|
|
290
|
-
logger.debug(`Got 0 valid ids and rejected ${rejectedIds}`);
|
|
291
|
-
sendToQueue({
|
|
292
|
-
queue: message.properties.correlationId,
|
|
293
|
-
correlationId: message.properties.correlationId,
|
|
294
|
-
headers,
|
|
295
|
-
data: {
|
|
296
|
-
status: _httpStatus.default.UNPROCESSABLE_ENTITY,
|
|
297
|
-
payload: rejectedIds
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
return channel.ack(message);
|
|
301
|
-
} // Reply consumer gets: {"data":{"status":"UPDATED","payload":"0"}}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
sendToQueue({
|
|
305
|
-
queue: message.properties.correlationId,
|
|
306
|
-
correlationId: message.properties.correlationId,
|
|
307
|
-
headers,
|
|
308
|
-
data: {
|
|
309
|
-
status,
|
|
310
|
-
payload: ids[index]
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
channel.ack(message);
|
|
314
|
-
});
|
|
315
304
|
}
|
|
316
305
|
|
|
317
306
|
function ackMessages(messages) {
|
|
318
|
-
logger.verbose(`Ack messages! (${messages.length})`);
|
|
319
307
|
messages.forEach(message => {
|
|
320
308
|
logger.silly(`Ack message ${message.properties.correlationId}`);
|
|
321
309
|
channel.ack(message);
|
|
@@ -323,7 +311,6 @@ async function _default(AMQP_URL) {
|
|
|
323
311
|
}
|
|
324
312
|
|
|
325
313
|
function nackMessages(messages) {
|
|
326
|
-
logger.verbose(`Nack messages! (${messages.length})`);
|
|
327
314
|
messages.forEach(message => {
|
|
328
315
|
logger.silly(`Nack message ${message.properties.correlationId}`);
|
|
329
316
|
channel.nack(message);
|
|
@@ -336,11 +323,13 @@ async function _default(AMQP_URL) {
|
|
|
336
323
|
headers,
|
|
337
324
|
data
|
|
338
325
|
}) {
|
|
326
|
+
logger.verbose(`Send message for ${correlationId} to queue: ${queue}`);
|
|
327
|
+
|
|
339
328
|
try {
|
|
340
|
-
logger.silly(`
|
|
341
|
-
logger.silly(`
|
|
342
|
-
logger.silly(`
|
|
343
|
-
logger.silly(`
|
|
329
|
+
logger.silly(`Queue ${queue}`);
|
|
330
|
+
logger.silly(`CorrelationId ${correlationId}`);
|
|
331
|
+
logger.silly(`Data ${JSON.stringify(data)}`);
|
|
332
|
+
logger.silly(`Headers ${JSON.stringify(headers)}`);
|
|
344
333
|
await channel.assertQueue(queue, {
|
|
345
334
|
durable: true
|
|
346
335
|
});
|
|
@@ -358,6 +347,7 @@ async function _default(AMQP_URL) {
|
|
|
358
347
|
}
|
|
359
348
|
|
|
360
349
|
async function removeQueue(queue) {
|
|
350
|
+
logger.verbose(`Removing queue ${queue}.`);
|
|
361
351
|
await channel.deleteQueue(queue);
|
|
362
352
|
} // ----------------
|
|
363
353
|
// Helper functions
|
|
@@ -365,7 +355,7 @@ async function _default(AMQP_URL) {
|
|
|
365
355
|
|
|
366
356
|
|
|
367
357
|
function messagesToRecords(messages) {
|
|
368
|
-
logger.verbose(`Parsing messages (${messages.length})to records`);
|
|
358
|
+
logger.verbose(`Parsing messages (${messages.length}) to records`);
|
|
369
359
|
return messages.map(message => {
|
|
370
360
|
const content = JSON.parse(message.content.toString());
|
|
371
361
|
return new _marcRecord.MarcRecord(content.data);
|
|
@@ -379,9 +369,9 @@ async function _default(AMQP_URL) {
|
|
|
379
369
|
const {
|
|
380
370
|
messageCount
|
|
381
371
|
} = await channel.checkQueue(queue);
|
|
382
|
-
logger.
|
|
372
|
+
logger.silly(`There is ${messageCount} messages in queue ${queue}`);
|
|
383
373
|
const messagesToGet = messageCount >= _constants.CHUNK_SIZE ? _constants.CHUNK_SIZE : messageCount;
|
|
384
|
-
logger.
|
|
374
|
+
logger.silly(`Getting ${messagesToGet} messages from queue ${queue}`);
|
|
385
375
|
const messages = await pump(messagesToGet);
|
|
386
376
|
logger.debug(`Returning ${messages.length} unique messages`);
|
|
387
377
|
return messages;
|
package/dist/amqp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/amqp.js"],"names":["AMQP_URL","connection","amqplib","connect","channel","createChannel","logger","checkQueue","consumeChunk","consumeRawChunk","consumeOne","consumeRaw","ackNReplyMessages","ackMessages","nackMessages","sendToQueue","removeQueue","messagesToRecords","queue","style","purge","toRecord","debug","channelInfo","assertQueue","durable","purgeQueue","messageCount","test","consumeByCorrelationId","ApiError","httpStatus","UNPROCESSABLE_ENTITY","error","verbose","queMessages","getData","headers","getHeaderInfo","JSON","stringify","messages","filter","message","properties","cataloger","nack","records","correlationId","get","status","payloads","length","forEach","index","ids","rejectedIds","data","payload","ack","silly","Buffer","from","persistent","deleteQueue","map","content","parse","toString","MarcRecord","messagesToGet","CHUNK_SIZE","pump","count","results","identifiers","identifier","deliveryTag","fields","includes","concat"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements */\n/* eslint-disable max-lines */\n/**\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 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 amqplib from 'amqplib';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {CHUNK_SIZE} from './constants';\nimport {logError} from './utils';\nimport httpStatus from 'http-status';\n\nexport default async function (AMQP_URL) {\n const connection = await amqplib.connect(AMQP_URL);\n const channel = await connection.createChannel();\n const logger = createLogger();\n\n return {checkQueue, consumeChunk, consumeRawChunk, consumeOne, consumeRaw, ackNReplyMessages, ackMessages, nackMessages, sendToQueue, removeQueue, messagesToRecords};\n\n async function checkQueue(queue, style = 'basic', purge = false, toRecord = true) {\n logger.debug(`checkQueue: ${queue}, Style: ${style}`);\n try {\n const channelInfo = await channel.assertQueue(queue, {durable: true});\n if (purge) {\n await purgeQueue(purge);\n logger.debug(`Queue ${queue} has purged ${channelInfo.messageCount} records`);\n return checkQueue(queue, style);\n }\n\n if (channelInfo.messageCount < 1) {\n logger.debug(`checkQueue: ${channelInfo.messageCount} - ${queue} is empty`);\n return false;\n }\n logger.debug(`Queue ${queue} has ${channelInfo.messageCount} records`);\n\n if (style === 'messages') {\n return channelInfo.messageCount;\n }\n\n if (style === 'one') {\n return consumeOne(queue);\n }\n\n if (style === 'raw') {\n return consumeRaw(queue);\n }\n\n if (style === 'rawChunk') {\n return consumeRawChunk(queue);\n }\n\n if ((/^.{8}-.{4}-.{4}-.{4}-.{12}$/u).test(style)) {\n logger.debug(`checkQueue: regexp match ${style}`);\n return consumeByCorrelationId(queue, style, toRecord);\n }\n\n if (style === 'basic') {\n return consumeChunk(queue);\n }\n\n // Defaults:\n throw new ApiError(httpStatus.UNPROCESSABLE_ENTITY);\n } catch (error) {\n logError(error);\n }\n\n function purgeQueue(purge) {\n if (purge) {\n return channel.purgeQueue(queue);\n }\n }\n }\n\n async function consumeChunk(queue) {\n logger.verbose(`Prepared to consumeChunk from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n const queMessages = await getData(queue);\n\n const headers = getHeaderInfo(queMessages[0]);\n logger.debug(`Filtering messages by ${JSON.stringify(headers)}`);\n\n // Check that cataloger match! headers\n const messages = queMessages.filter(message => {\n if (message.properties.headers.cataloger === headers.cataloger) {\n return true;\n }\n\n // Nack unwanted ones\n channel.nack(message, false, true);\n return false;\n });\n\n const records = await messagesToRecords(messages);\n\n return {headers, records, messages};\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeByCorrelationId(queue, correlationId, toRecord = true) {\n logger.verbose(`Prepared to consumeByCorrelationId from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n const queMessages = await getData(queue);\n\n logger.debug(`Filtering messages by ${correlationId}`);\n\n // Check that cataloger match! headers\n const messages = queMessages.filter(message => {\n if (message.properties.correlationId === correlationId) {\n return true;\n }\n\n // Nack unwanted ones\n channel.nack(message, false, true);\n return false;\n });\n const headers = getHeaderInfo(messages[0]);\n\n if (toRecord) {\n const records = await messagesToRecords(messages);\n\n return {headers, records, messages};\n }\n return {headers, messages};\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeRawChunk(queue) {\n logger.verbose(`Prepared to consumeRawChunk from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n const queMessages = await getData(queue);\n\n const headers = getHeaderInfo(queMessages[0]);\n logger.debug(`Filtering messages by ${JSON.stringify(headers)} and timeout`);\n\n // Check that cataloger match! headers\n const messages = queMessages.filter(message => {\n if (message.properties.headers.cataloger === headers.cataloger) {\n return true;\n }\n\n // Nack unwanted ones\n channel.nack(message, false, true);\n return false;\n });\n\n return {headers, messages};\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeOne(queue) {\n logger.verbose(`Prepared to consume one from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n\n // Returns false if 0 items in queue\n const message = await channel.get(queue);\n if (message) {\n const headers = getHeaderInfo(message);\n const records = messagesToRecords([message]);\n return {headers, records, messages: [message]};\n }\n\n return false;\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeRaw(queue) {\n logger.verbose(`Prepared to consume raw from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n // Returns false if 0 items in queue\n return await channel.get(queue);\n } catch (error) {\n logError(error);\n }\n }\n\n // ACK records\n async function ackNReplyMessages({status, messages, payloads}) {\n logger.verbose('Ack and reply messages!');\n logger.debug(`Ack and reply messages. status: ${JSON.stringify(status)} messages: ${messages} payloads: ${JSON.stringify(payloads)}`);\n logger.debug(`Handling ${messages.length} messages`);\n await messages.forEach((message, index) => {\n const headers = getHeaderInfo(message);\n\n logger.debug(`Message: ${message}, index: ${index}`);\n logger.debug(`Headers: ${JSON.stringify(headers)}`);\n\n // payloads ids are parsed both form old payloads including just array of ids and new payloads including both array of ids and array of rejected ids\n const ids = payloads.ids || payloads;\n const rejectedIds = payloads.rejectedIds || [];\n logger.debug(`ids: ${JSON.stringify(ids)}, rejectedIds: ${JSON.stringify(rejectedIds)}`);\n\n if (ids.length < 1 && rejectedIds.length > 0) {\n logger.debug(`Got 0 valid ids and rejected ${rejectedIds}`);\n\n sendToQueue({\n queue: message.properties.correlationId,\n correlationId: message.properties.correlationId,\n headers,\n data: {\n status: httpStatus.UNPROCESSABLE_ENTITY, payload: rejectedIds\n }\n });\n\n return channel.ack(message);\n }\n\n // Reply consumer gets: {\"data\":{\"status\":\"UPDATED\",\"payload\":\"0\"}}\n sendToQueue({\n queue: message.properties.correlationId,\n correlationId: message.properties.correlationId,\n headers,\n data: {\n status, payload: ids[index]\n }\n });\n\n channel.ack(message);\n });\n }\n\n function ackMessages(messages) {\n logger.verbose(`Ack messages! (${messages.length})`);\n messages.forEach(message => {\n logger.silly(`Ack message ${message.properties.correlationId}`);\n channel.ack(message);\n });\n }\n\n function nackMessages(messages) {\n logger.verbose(`Nack messages! (${messages.length})`);\n messages.forEach(message => {\n logger.silly(`Nack message ${message.properties.correlationId}`);\n channel.nack(message);\n });\n }\n\n async function sendToQueue({queue, correlationId, headers, data}) {\n try {\n logger.silly(`Record queue ${queue}`);\n logger.silly(`Record correlationId ${correlationId}`);\n logger.silly(`Record data ${JSON.stringify(data)}`);\n logger.silly(`Record headers ${JSON.stringify(headers)}`);\n\n await channel.assertQueue(queue, {durable: true});\n\n channel.sendToQueue(\n queue,\n Buffer.from(JSON.stringify({data})),\n {\n correlationId,\n persistent: true,\n headers\n }\n );\n\n logger.silly(`Message send to queue ${queue}`);\n } catch (error) {\n logError(error);\n }\n }\n\n async function removeQueue(queue) {\n await channel.deleteQueue(queue);\n }\n\n // ----------------\n // Helper functions\n // ----------------\n\n function messagesToRecords(messages) {\n logger.verbose(`Parsing messages (${messages.length})to records`);\n\n return messages.map(message => {\n const content = JSON.parse(message.content.toString());\n return new MarcRecord(content.data);\n });\n }\n\n async function getData(queue) {\n logger.verbose(`Getting queue data from ${queue}`);\n try {\n const {messageCount} = await channel.checkQueue(queue);\n logger.debug(`There is ${messageCount} messages in queue ${queue}`);\n const messagesToGet = messageCount >= CHUNK_SIZE ? CHUNK_SIZE : messageCount;\n logger.debug(`Getting ${messagesToGet} messages from queue ${queue}`);\n\n const messages = await pump(messagesToGet);\n\n logger.debug(`Returning ${messages.length} unique messages`);\n\n return messages;\n } catch (error) {\n logError(error);\n }\n\n async function pump(count, results = [], identifiers = []) {\n if (count === 0) {\n return results;\n }\n\n const message = await channel.get(queue);\n const identifier = {\n correlationId: message.properties.correlationId,\n deliveryTag: message.fields.deliveryTag\n };\n // Filter not unique messages\n if (identifiers.includes(identifier)) {\n return pump(count - 1, results, identifiers);\n }\n\n return pump(count - 1, results.concat(message), identifiers.concat(identifier));\n }\n }\n\n function getHeaderInfo(data) {\n return data.properties.headers;\n }\n}\n"],"file":"amqp.js"}
|
|
1
|
+
{"version":3,"sources":["../src/amqp.js"],"names":["AMQP_URL","connection","amqplib","connect","channel","createChannel","logger","checkQueue","consumeChunk","consumeRawChunk","consumeOne","consumeRaw","ackMessages","nackMessages","sendToQueue","removeQueue","messagesToRecords","queue","style","purge","toRecord","verbose","channelInfo","assertQueue","durable","purgeQueue","debug","messageCount","silly","test","consumeByCorrelationId","ApiError","httpStatus","UNPROCESSABLE_ENTITY","error","queMessages","getData","headers","getHeaderInfo","JSON","stringify","filterIn","filterOut","messages","filter","message","properties","cataloger","nack","records","correlationId","get","forEach","ack","data","Buffer","from","persistent","deleteQueue","length","map","content","parse","toString","MarcRecord","messagesToGet","CHUNK_SIZE","pump","count","results","identifiers","identifier","deliveryTag","fields","includes","concat"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements */\n/* eslint-disable max-lines */\n/**\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 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 amqplib from 'amqplib';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {CHUNK_SIZE} from './constants';\nimport {logError} from './utils';\nimport httpStatus from 'http-status';\n\nexport default async function (AMQP_URL) {\n const connection = await amqplib.connect(AMQP_URL);\n const channel = await connection.createChannel();\n const logger = createLogger();\n\n return {checkQueue, consumeChunk, consumeRawChunk, consumeOne, consumeRaw, ackMessages, nackMessages, sendToQueue, removeQueue, messagesToRecords};\n\n async function checkQueue(queue, style = 'basic', purge = false, toRecord = true) {\n logger.verbose(`checkQueue: ${queue}, Style: ${style}: Purge: ${purge}, toRecord: ${toRecord}`);\n try {\n const channelInfo = await channel.assertQueue(queue, {durable: true});\n if (purge) {\n await purgeQueue(purge);\n logger.debug(`Queue ${queue} has purged ${channelInfo.messageCount} messages`);\n return checkQueue(queue, style);\n }\n\n if (channelInfo.messageCount < 1) {\n logger.debug(`checkQueue: ${channelInfo.messageCount} - ${queue} is empty`);\n return false;\n }\n logger.silly(`Queue ${queue} has ${channelInfo.messageCount} messages`);\n\n if (style === 'messages') {\n return channelInfo.messageCount;\n }\n\n // Note: returns a message + a record\n if (style === 'one') {\n return consumeOne(queue);\n }\n\n // Note: returns just a message\n if (style === 'raw') {\n return consumeRaw(queue);\n }\n\n // Note: returns a chunk of messages + records\n if (style === 'rawChunk') {\n return consumeRawChunk(queue);\n }\n\n // Note: returns a chunk of messages or a chunk of messages + records (depending on toRecord)\n if ((/^.{8}-.{4}-.{4}-.{4}-.{12}$/u).test(style)) {\n logger.silly(`checkQueue: regexp match ${style}`);\n return consumeByCorrelationId(queue, style, toRecord);\n }\n\n // Note: returns a chunk of messages + records\n if (style === 'basic') {\n return consumeChunk(queue);\n }\n\n // Defaults:\n throw new ApiError(httpStatus.UNPROCESSABLE_ENTITY);\n } catch (error) {\n logError(error);\n }\n\n function purgeQueue(purge) {\n if (purge) {\n return channel.purgeQueue(queue);\n }\n }\n }\n\n async function consumeChunk(queue) {\n logger.verbose(`Prepared to consumeChunk from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n\n // getData: next chunk (100) messages\n const queMessages = await getData(queue);\n\n const headers = getHeaderInfo(queMessages[0]);\n logger.debug(`Filtering messages by cataloger in ${JSON.stringify(headers)}`);\n\n let filterIn = 0; // eslint-disable-line functional/no-let\n let filterOut = 0; // eslint-disable-line functional/no-let\n\n // Check that cataloger match! headers\n const messages = queMessages.filter(message => {\n if (message.properties.headers.cataloger === headers.cataloger) {\n filterIn++; // eslint-disable-line no-plusplus\n return true;\n }\n\n // Nack unwanted ones\n channel.nack(message, false, true);\n filterOut++; // eslint-disable-line no-plusplus\n return false;\n });\n\n logger.debug(`Filtering result: valid: ${filterIn} non-valid: ${filterOut}`);\n const records = await messagesToRecords(messages);\n\n return {headers, records, messages};\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeByCorrelationId(queue, correlationId, toRecord = true) {\n logger.verbose(`Prepared to consumeByCorrelationId from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n // get next chunk (100) messages\n const queMessages = await getData(queue);\n\n logger.debug(`Filtering messages by ${correlationId}`);\n\n let filterIn = 0; // eslint-disable-line functional/no-let\n let filterOut = 0; // eslint-disable-line functional/no-let\n\n // Check that correlationId matches query\n const messages = queMessages.filter(message => {\n if (message.properties.correlationId === correlationId) {\n filterIn++; // eslint-disable-line no-plusplus\n return true;\n }\n\n // Nack unwanted ones\n channel.nack(message, false, true);\n filterOut++; // eslint-disable-line no-plusplus\n return false;\n });\n logger.debug(`Filtering result: valid: ${filterIn} non-valid: ${filterOut}`);\n\n const headers = getHeaderInfo(messages[0]);\n\n if (toRecord) {\n const records = await messagesToRecords(messages);\n\n return {headers, records, messages};\n }\n return {headers, messages};\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeRawChunk(queue) {\n logger.verbose(`Prepared to consumeRawChunk from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n // Get next chunk (100) messages\n const queMessages = await getData(queue);\n\n const headers = getHeaderInfo(queMessages[0]);\n logger.debug(`Filtering messages by ${JSON.stringify(headers)}`);\n\n let filterIn = 0; // eslint-disable-line functional/no-let\n let filterOut = 0; // eslint-disable-line functional/no-let\n\n // Check that cataloger match! headers\n const messages = queMessages.filter(message => {\n if (message.properties.headers.cataloger === headers.cataloger) {\n filterIn++; // eslint-disable-line no-plusplus\n\n return true;\n }\n\n // Nack unwanted ones\n channel.nack(message, false, true);\n filterOut++; // eslint-disable-line no-plusplus\n\n return false;\n });\n logger.debug(`Filtering result: valid: ${filterIn} non-valid: ${filterOut}`);\n\n // return raw (do not convert messages to records)\n return {headers, messages};\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeOne(queue) {\n logger.verbose(`Prepared to consumeOne from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n\n // Returns false if 0 items in queue\n const message = await channel.get(queue);\n if (message) {\n const headers = getHeaderInfo(message);\n const records = messagesToRecords([message]);\n return {headers, records, messages: [message]};\n }\n\n return false;\n } catch (error) {\n logError(error);\n }\n }\n\n async function consumeRaw(queue) {\n logger.verbose(`Prepared to consumeRaw from queue: ${queue}`);\n try {\n await channel.assertQueue(queue, {durable: true});\n // Returns false if 0 items in queue\n return await channel.get(queue);\n } catch (error) {\n logError(error);\n }\n }\n\n function ackMessages(messages) {\n messages.forEach(message => {\n logger.silly(`Ack message ${message.properties.correlationId}`);\n channel.ack(message);\n });\n }\n\n function nackMessages(messages) {\n messages.forEach(message => {\n logger.silly(`Nack message ${message.properties.correlationId}`);\n channel.nack(message);\n });\n }\n\n async function sendToQueue({queue, correlationId, headers, data}) {\n logger.verbose(`Send message for ${correlationId} to queue: ${queue}`);\n try {\n logger.silly(`Queue ${queue}`);\n logger.silly(`CorrelationId ${correlationId}`);\n logger.silly(`Data ${JSON.stringify(data)}`);\n logger.silly(`Headers ${JSON.stringify(headers)}`);\n\n await channel.assertQueue(queue, {durable: true});\n\n channel.sendToQueue(\n queue,\n Buffer.from(JSON.stringify({data})),\n {\n correlationId,\n persistent: true,\n headers\n }\n );\n\n logger.silly(`Message send to queue ${queue}`);\n } catch (error) {\n logError(error);\n }\n }\n\n async function removeQueue(queue) {\n logger.verbose(`Removing queue ${queue}.`);\n await channel.deleteQueue(queue);\n }\n\n // ----------------\n // Helper functions\n // ----------------\n\n function messagesToRecords(messages) {\n logger.verbose(`Parsing messages (${messages.length}) to records`);\n\n return messages.map(message => {\n const content = JSON.parse(message.content.toString());\n return new MarcRecord(content.data);\n });\n }\n\n async function getData(queue) {\n logger.verbose(`Getting queue data from ${queue}`);\n try {\n const {messageCount} = await channel.checkQueue(queue);\n logger.silly(`There is ${messageCount} messages in queue ${queue}`);\n const messagesToGet = messageCount >= CHUNK_SIZE ? CHUNK_SIZE : messageCount;\n logger.silly(`Getting ${messagesToGet} messages from queue ${queue}`);\n\n const messages = await pump(messagesToGet);\n\n logger.debug(`Returning ${messages.length} unique messages`);\n\n return messages;\n } catch (error) {\n logError(error);\n }\n\n async function pump(count, results = [], identifiers = []) {\n if (count === 0) {\n return results;\n }\n\n const message = await channel.get(queue);\n const identifier = {\n correlationId: message.properties.correlationId,\n deliveryTag: message.fields.deliveryTag\n };\n // Filter not unique messages\n if (identifiers.includes(identifier)) {\n return pump(count - 1, results, identifiers);\n }\n\n return pump(count - 1, results.concat(message), identifiers.concat(identifier));\n }\n }\n\n function getHeaderInfo(data) {\n return data.properties.headers;\n }\n}\n"],"file":"amqp.js"}
|
package/dist/constants.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.conversionFormats = exports.
|
|
6
|
+
exports.conversionFormats = exports.QUEUE_ITEM_STATE = exports.OPERATIONS = exports.CHUNK_SIZE = void 0;
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
*
|
|
@@ -19,6 +19,8 @@ var _utils = require("../utils");
|
|
|
19
19
|
|
|
20
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
21
|
|
|
22
|
+
/* eslint-disable max-statements */
|
|
23
|
+
|
|
22
24
|
/**
|
|
23
25
|
*
|
|
24
26
|
* @licstart The following is the entire license notice for the JavaScript code in this file.
|
|
@@ -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","stringify","from"],"mappings":";;;;;;;
|
|
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","stringify","from"],"mappings":";;;;;;;AA6BA;;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;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,CAAe,oBAAf;;AACA,QAAI;AACF,UAAID,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,CAAe,sBAAf;AACAL,IAAAA,MAAM,CAACoB,KAAP,CAAc,WAAUhB,MAAO,EAA/B;AACAJ,IAAAA,MAAM,CAACoB,KAAP,CAAc,uBAAsBV,IAAI,CAACW,SAAL,CAAeH,iBAAf,CAAkC,EAAtE;AACAlB,IAAAA,MAAM,CAACoB,KAAP,CAAc,SAAQV,IAAI,CAACW,SAAL,CAAeJ,IAAf,CAAqB,EAA3C;;AACA,QAAI;AACF,UAAIb,MAAM,KAAKE,6BAAkBC,OAAjC,EAA0C;AACxCP,QAAAA,MAAM,CAACK,OAAP,CAAe,4BAAf;AACA,eAAOE,+BAAQe,IAAR,CAAaL,IAAb,EAAmBC,iBAAnB,CAAP;AACD;;AAED,UAAId,MAAM,KAAKE,6BAAkBG,OAAjC,EAA0C;AACxCT,QAAAA,MAAM,CAACK,OAAP,CAAe,4BAAf;AACA,eAAOI,+BAAQa,IAAR,CAAaL,IAAb,EAAmBC,iBAAnB,CAAP;AACD;;AAED,UAAId,MAAM,KAAKE,6BAAkBI,IAAjC,EAAuC;AACrCV,QAAAA,MAAM,CAACK,OAAP,CAAe,yBAAf;AACA,eAAOM,4BAAKW,IAAL,CAAUL,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":["/* eslint-disable max-statements */\n/**\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 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');\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');\n logger.silly(`Format: ${format}`);\n logger.silly(`Validation options: ${JSON.stringify(validationOptions)}`);\n logger.silly(`Data: ${JSON.stringify(data)}`);\n try {\n if (format === conversionFormats.MARCXML) {\n logger.verbose('Unserialize format marcxml');\n return MARCXML.from(data, validationOptions);\n }\n\n if (format === conversionFormats.ISO2709) {\n logger.verbose('Unserialize format iso2709');\n return ISO2709.from(data, validationOptions);\n }\n\n if (format === conversionFormats.JSON) {\n logger.verbose('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"}
|
package/dist/helpers/format.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -11,12 +11,6 @@ var _exportNames = {
|
|
|
11
11
|
format: true,
|
|
12
12
|
logError: true
|
|
13
13
|
};
|
|
14
|
-
Object.defineProperty(exports, "mongoFactory", {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function () {
|
|
17
|
-
return _mongo.default;
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
14
|
Object.defineProperty(exports, "amqpFactory", {
|
|
21
15
|
enumerable: true,
|
|
22
16
|
get: function () {
|
|
@@ -29,19 +23,25 @@ Object.defineProperty(exports, "conversions", {
|
|
|
29
23
|
return _conversion.default;
|
|
30
24
|
}
|
|
31
25
|
});
|
|
32
|
-
|
|
26
|
+
exports.format = void 0;
|
|
27
|
+
Object.defineProperty(exports, "logError", {
|
|
33
28
|
enumerable: true,
|
|
34
29
|
get: function () {
|
|
35
|
-
return
|
|
30
|
+
return _utils.logError;
|
|
36
31
|
}
|
|
37
32
|
});
|
|
38
|
-
Object.defineProperty(exports, "
|
|
33
|
+
Object.defineProperty(exports, "mongoFactory", {
|
|
39
34
|
enumerable: true,
|
|
40
35
|
get: function () {
|
|
41
|
-
return
|
|
36
|
+
return _mongo.default;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(exports, "validations", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () {
|
|
42
|
+
return _validation.default;
|
|
42
43
|
}
|
|
43
44
|
});
|
|
44
|
-
exports.format = void 0;
|
|
45
45
|
|
|
46
46
|
var _mongo = _interopRequireDefault(require("./mongo"));
|
|
47
47
|
|
package/dist/mongo.js
CHANGED
|
@@ -23,6 +23,8 @@ var _mongoSanitize = _interopRequireDefault(require("mongo-sanitize"));
|
|
|
23
23
|
|
|
24
24
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
25
|
|
|
26
|
+
/* eslint-disable max-lines */
|
|
27
|
+
|
|
26
28
|
/* eslint-disable max-statements */
|
|
27
29
|
|
|
28
30
|
/**
|
|
@@ -97,14 +99,17 @@ async function _default(MONGO_URI, collection) {
|
|
|
97
99
|
getStream,
|
|
98
100
|
setState,
|
|
99
101
|
pushIds,
|
|
100
|
-
|
|
102
|
+
pushMessages
|
|
101
103
|
};
|
|
102
104
|
|
|
103
105
|
async function createPrio({
|
|
104
106
|
correlationId,
|
|
105
107
|
cataloger,
|
|
106
108
|
oCatalogerIn,
|
|
107
|
-
operation
|
|
109
|
+
operation,
|
|
110
|
+
noop = undefined,
|
|
111
|
+
unique = undefined,
|
|
112
|
+
prio = undefined
|
|
108
113
|
}) {
|
|
109
114
|
const time = (0, _moment.default)().toDate();
|
|
110
115
|
const newQueueItem = {
|
|
@@ -112,16 +117,23 @@ async function _default(MONGO_URI, collection) {
|
|
|
112
117
|
cataloger,
|
|
113
118
|
operation,
|
|
114
119
|
oCatalogerIn,
|
|
115
|
-
|
|
120
|
+
operationSettings: {
|
|
121
|
+
unique,
|
|
122
|
+
noop,
|
|
123
|
+
prio
|
|
124
|
+
},
|
|
125
|
+
queueItemState: _constants.QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,
|
|
116
126
|
creationTime: time,
|
|
117
127
|
modificationTime: time,
|
|
118
|
-
|
|
128
|
+
handledIds: [],
|
|
129
|
+
rejectedIds: []
|
|
119
130
|
};
|
|
120
131
|
|
|
121
132
|
try {
|
|
122
133
|
const result = await db.collection(collection).insertOne(newQueueItem);
|
|
123
134
|
|
|
124
135
|
if (result.acknowledged) {
|
|
136
|
+
logger.info(`New prio queue item for ${correlationId} has been made in ${collection}`);
|
|
125
137
|
return;
|
|
126
138
|
}
|
|
127
139
|
|
|
@@ -149,15 +161,17 @@ async function _default(MONGO_URI, collection) {
|
|
|
149
161
|
operation,
|
|
150
162
|
contentType,
|
|
151
163
|
recordLoadParams,
|
|
152
|
-
queueItemState: _constants.QUEUE_ITEM_STATE.UPLOADING,
|
|
164
|
+
queueItemState: _constants.QUEUE_ITEM_STATE.VALIDATOR.UPLOADING,
|
|
153
165
|
creationTime: time,
|
|
154
166
|
modificationTime: time,
|
|
155
|
-
handledIds: []
|
|
167
|
+
handledIds: [],
|
|
168
|
+
rejectedIds: []
|
|
156
169
|
};
|
|
157
170
|
|
|
158
171
|
try {
|
|
172
|
+
// No await here, promises later
|
|
159
173
|
db.collection(collection).insertOne(newQueueItem);
|
|
160
|
-
logger.
|
|
174
|
+
logger.info(`New bulk queue item for ${correlationId} has been made in ${collection}!`);
|
|
161
175
|
} catch (error) {
|
|
162
176
|
(0, _utils.logError)(error);
|
|
163
177
|
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR);
|
|
@@ -169,18 +183,25 @@ async function _default(MONGO_URI, collection) {
|
|
|
169
183
|
resolve(correlationId);
|
|
170
184
|
}));
|
|
171
185
|
});
|
|
172
|
-
}
|
|
186
|
+
} // Check state that the queueItem has not waited too long and set state
|
|
187
|
+
|
|
173
188
|
|
|
174
189
|
async function checkAndSetState({
|
|
175
190
|
correlationId,
|
|
176
|
-
state
|
|
191
|
+
state,
|
|
192
|
+
errorMessage = '',
|
|
193
|
+
errorStatus = ''
|
|
177
194
|
}) {
|
|
195
|
+
// checkTimeOut returns true, if queueItem is fresher than 1 minute
|
|
196
|
+
// otherwise it sets queueItem to state ABORT (408, 'Timeout')
|
|
178
197
|
const timeOut = await checkTimeOut(correlationId);
|
|
179
198
|
|
|
180
199
|
if (timeOut) {
|
|
181
200
|
return setState({
|
|
182
201
|
correlationId,
|
|
183
|
-
state
|
|
202
|
+
state,
|
|
203
|
+
errorMessage,
|
|
204
|
+
errorStatus
|
|
184
205
|
});
|
|
185
206
|
}
|
|
186
207
|
|
|
@@ -193,7 +214,7 @@ async function _default(MONGO_URI, collection) {
|
|
|
193
214
|
_id: 0
|
|
194
215
|
}
|
|
195
216
|
}).toArray();
|
|
196
|
-
logger.
|
|
217
|
+
logger.debug(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);
|
|
197
218
|
return result;
|
|
198
219
|
}
|
|
199
220
|
|
|
@@ -213,7 +234,10 @@ async function _default(MONGO_URI, collection) {
|
|
|
213
234
|
}
|
|
214
235
|
|
|
215
236
|
return result;
|
|
216
|
-
}
|
|
237
|
+
} // Check that if the item has waited too long
|
|
238
|
+
// If the last modification time for the queueItem is older than 1 minute
|
|
239
|
+
// set state to ABORT and return false, otherwise return true
|
|
240
|
+
|
|
217
241
|
|
|
218
242
|
async function checkTimeOut(correlationId) {
|
|
219
243
|
const result = await db.collection(collection).findOne({
|
|
@@ -223,9 +247,12 @@ async function _default(MONGO_URI, collection) {
|
|
|
223
247
|
logger.silly(`timeOut @ ${timeoutTime}`);
|
|
224
248
|
|
|
225
249
|
if (timeoutTime.isBefore()) {
|
|
250
|
+
const oldState = result.queueItemState;
|
|
226
251
|
await setState({
|
|
227
252
|
correlationId,
|
|
228
|
-
state: _constants.
|
|
253
|
+
state: _constants.QUEUE_ITEM_STATE.ABORT,
|
|
254
|
+
errorStatus: _httpStatus.default.REQUEST_TIMEOUT,
|
|
255
|
+
errorMessage: `Timeout in ${oldState}`
|
|
229
256
|
});
|
|
230
257
|
return false;
|
|
231
258
|
}
|
|
@@ -235,14 +262,13 @@ async function _default(MONGO_URI, collection) {
|
|
|
235
262
|
|
|
236
263
|
async function remove(params) {
|
|
237
264
|
logger.debug(`${JSON.stringify(params)}`);
|
|
238
|
-
logger.info(`Removing from Mongo id: ${params.correlationId}`);
|
|
265
|
+
logger.info(`Removing from Mongo (${collection}) id: ${params.correlationId}`);
|
|
239
266
|
const clean = (0, _mongoSanitize.default)(params.correlationId);
|
|
267
|
+
logger.silly(`mongo/remove: clean: ${JSON.stringify(clean)}`);
|
|
240
268
|
|
|
241
269
|
try {
|
|
242
|
-
await getFileMetadata({
|
|
243
|
-
|
|
244
|
-
filename: clean
|
|
245
|
-
});
|
|
270
|
+
//const metadataResult = await getFileMetadata({filename: clean});
|
|
271
|
+
//logger.debug(`mongo/remove: metadataResult: ${JSON.stringify(metadataResult)}`);
|
|
246
272
|
const noContent = await removeContent(params);
|
|
247
273
|
|
|
248
274
|
if (noContent) {
|
|
@@ -252,30 +278,32 @@ async function _default(MONGO_URI, collection) {
|
|
|
252
278
|
return true;
|
|
253
279
|
}
|
|
254
280
|
} catch (err) {
|
|
255
|
-
if (err
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
281
|
+
if (err instanceof _mongodb.MongoDriverError) {
|
|
282
|
+
logger.error(err.message);
|
|
283
|
+
|
|
284
|
+
if (err.message.indexOf('File not found for id') !== -1) {
|
|
285
|
+
logger.debug(`mongo/remove: File not found, removing queueItem ${JSON.stringify(clean)} from ${collection}`);
|
|
286
|
+
await db.collection(collection).deleteOne({
|
|
287
|
+
correlationId: clean
|
|
288
|
+
});
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, err.message);
|
|
260
293
|
}
|
|
261
294
|
|
|
262
|
-
throw err;
|
|
295
|
+
throw new _melindaCommons.Error(_httpStatus.default.INTERNAL_SERVER_ERROR, err.message);
|
|
263
296
|
}
|
|
264
297
|
}
|
|
265
298
|
|
|
266
299
|
async function readContent(correlationId) {
|
|
267
|
-
logger.info(`Reading content for id: ${correlationId}`);
|
|
300
|
+
logger.info(`Reading content for id: ${correlationId} in ${collection}`);
|
|
268
301
|
const clean = (0, _mongoSanitize.default)(correlationId);
|
|
269
302
|
const result = await db.collection(collection).findOne({
|
|
270
303
|
correlationId: clean
|
|
271
|
-
}); //ignore: node_nosqli_injection
|
|
304
|
+
}); // njsscan-ignore: node_nosqli_injection
|
|
272
305
|
|
|
273
306
|
if (result) {
|
|
274
|
-
// Check if the file exists
|
|
275
|
-
await getFileMetadata({
|
|
276
|
-
gridFSBucket,
|
|
277
|
-
filename: clean
|
|
278
|
-
});
|
|
279
307
|
return {
|
|
280
308
|
contentType: result.contentType,
|
|
281
309
|
readStream: gridFSBucket.openDownloadStreamByName(clean)
|
|
@@ -286,22 +314,20 @@ async function _default(MONGO_URI, collection) {
|
|
|
286
314
|
}
|
|
287
315
|
|
|
288
316
|
async function removeContent(params) {
|
|
289
|
-
logger.info(`Removing content for id: ${params.correlationId}`);
|
|
317
|
+
logger.info(`Removing content for id: ${params.correlationId} in ${collection}`);
|
|
290
318
|
const clean = (0, _mongoSanitize.default)(params.correlationId);
|
|
291
319
|
const result = await db.collection(collection).findOne({
|
|
292
320
|
correlationId: clean
|
|
293
|
-
}); //ignore: node_nosqli_injection
|
|
321
|
+
}); // njsscan-ignore: node_nosqli_injection
|
|
322
|
+
|
|
323
|
+
logger.debug(`mongo/removeContent: result ${JSON.stringify(result)}`);
|
|
294
324
|
|
|
295
325
|
if (result) {
|
|
296
|
-
|
|
297
|
-
_id: fileId
|
|
298
|
-
} = await getFileMetadata({
|
|
299
|
-
gridFSBucket,
|
|
300
|
-
filename: clean
|
|
301
|
-
});
|
|
302
|
-
await gridFSBucket.delete(fileId);
|
|
326
|
+
await gridFSBucket.delete(clean);
|
|
303
327
|
return true;
|
|
304
328
|
}
|
|
329
|
+
|
|
330
|
+
return true;
|
|
305
331
|
}
|
|
306
332
|
|
|
307
333
|
function getOne({
|
|
@@ -314,34 +340,29 @@ async function _default(MONGO_URI, collection) {
|
|
|
314
340
|
|
|
315
341
|
try {
|
|
316
342
|
if (operation === undefined) {
|
|
317
|
-
logger.
|
|
343
|
+
logger.silly(`Checking DB ${collection} for ${JSON.stringify(clean.queueItemState)}`);
|
|
318
344
|
return db.collection(collection).findOne({ ...clean
|
|
319
|
-
});
|
|
345
|
+
});
|
|
320
346
|
}
|
|
321
347
|
|
|
322
348
|
const clean2 = {
|
|
323
349
|
operation: (0, _mongoSanitize.default)(operation)
|
|
324
350
|
};
|
|
325
|
-
logger.
|
|
351
|
+
logger.silly(`Checking DB ${collection} for ${clean.queueItemState} + ${clean2.operation}`);
|
|
326
352
|
return db.collection(collection).findOne({ ...clean,
|
|
327
353
|
...clean2
|
|
328
|
-
});
|
|
354
|
+
});
|
|
329
355
|
} catch (error) {
|
|
330
356
|
(0, _utils.logError)(error);
|
|
331
357
|
}
|
|
332
358
|
}
|
|
333
359
|
|
|
334
|
-
|
|
335
|
-
logger.info(`Forming stream from db: ${correlationId}`);
|
|
360
|
+
function getStream(correlationId) {
|
|
361
|
+
logger.info(`Forming stream from db: ${correlationId} in ${collection}`);
|
|
336
362
|
const clean = (0, _mongoSanitize.default)(correlationId);
|
|
337
363
|
|
|
338
364
|
try {
|
|
339
|
-
//
|
|
340
|
-
await getFileMetadata({
|
|
341
|
-
gridFSBucket,
|
|
342
|
-
filename: clean
|
|
343
|
-
}); // Return content stream
|
|
344
|
-
|
|
365
|
+
// Return content stream
|
|
345
366
|
return gridFSBucket.openDownloadStreamByName(clean);
|
|
346
367
|
} catch (error) {
|
|
347
368
|
(0, _utils.logError)(error);
|
|
@@ -350,9 +371,11 @@ async function _default(MONGO_URI, collection) {
|
|
|
350
371
|
|
|
351
372
|
async function pushIds({
|
|
352
373
|
correlationId,
|
|
353
|
-
|
|
374
|
+
handledIds,
|
|
375
|
+
rejectedIds
|
|
354
376
|
}) {
|
|
355
|
-
logger.
|
|
377
|
+
logger.info(`Push queue-item ids to list: ${correlationId} to ${collection}`);
|
|
378
|
+
logger.debug(`ids: ${JSON.stringify(handledIds)}, rejectedIds: ${JSON.stringify(rejectedIds)}`);
|
|
356
379
|
const clean = (0, _mongoSanitize.default)(correlationId);
|
|
357
380
|
await db.collection(collection).updateOne({
|
|
358
381
|
correlationId: clean
|
|
@@ -362,24 +385,34 @@ async function _default(MONGO_URI, collection) {
|
|
|
362
385
|
},
|
|
363
386
|
$push: {
|
|
364
387
|
handledIds: {
|
|
365
|
-
$each:
|
|
388
|
+
$each: handledIds
|
|
389
|
+
},
|
|
390
|
+
rejectedIds: {
|
|
391
|
+
$each: rejectedIds
|
|
366
392
|
}
|
|
367
393
|
}
|
|
368
394
|
});
|
|
369
395
|
}
|
|
370
396
|
|
|
371
|
-
async function
|
|
397
|
+
async function pushMessages({
|
|
372
398
|
correlationId,
|
|
373
|
-
|
|
399
|
+
messages,
|
|
400
|
+
messageField = 'messages'
|
|
374
401
|
}) {
|
|
375
|
-
logger.
|
|
402
|
+
logger.info(`Push messages to ${messageField} ${correlationId} to ${collection}`);
|
|
403
|
+
logger.debug(`Messages: ${JSON.stringify(messages)}}`);
|
|
376
404
|
const clean = (0, _mongoSanitize.default)(correlationId);
|
|
405
|
+
const cleanMessageField = (0, _mongoSanitize.default)(messageField);
|
|
377
406
|
await db.collection(collection).updateOne({
|
|
378
407
|
correlationId: clean
|
|
379
408
|
}, {
|
|
380
409
|
$set: {
|
|
381
|
-
modificationTime: (0, _moment.default)().toDate()
|
|
382
|
-
|
|
410
|
+
modificationTime: (0, _moment.default)().toDate()
|
|
411
|
+
},
|
|
412
|
+
$push: {
|
|
413
|
+
[cleanMessageField]: {
|
|
414
|
+
$each: messages
|
|
415
|
+
}
|
|
383
416
|
}
|
|
384
417
|
});
|
|
385
418
|
}
|
|
@@ -387,9 +420,11 @@ async function _default(MONGO_URI, collection) {
|
|
|
387
420
|
function setState({
|
|
388
421
|
correlationId,
|
|
389
422
|
state,
|
|
390
|
-
errorMessage = ''
|
|
423
|
+
errorMessage = '',
|
|
424
|
+
errorStatus = ''
|
|
391
425
|
}) {
|
|
392
|
-
|
|
426
|
+
const errorString = errorMessage || errorStatus ? `, Error message: '${errorMessage}', Error status: '${errorStatus}'` : '';
|
|
427
|
+
logger.log('info', `Setting queue-item state: ${correlationId}${state}${errorString} to ${collection}`);
|
|
393
428
|
const clean = (0, _mongoSanitize.default)(correlationId);
|
|
394
429
|
return db.collection(collection).findOneAndUpdate({
|
|
395
430
|
correlationId: clean
|
|
@@ -397,7 +432,8 @@ async function _default(MONGO_URI, collection) {
|
|
|
397
432
|
$set: {
|
|
398
433
|
queueItemState: state,
|
|
399
434
|
modificationTime: (0, _moment.default)().toDate(),
|
|
400
|
-
errorMessage
|
|
435
|
+
errorMessage,
|
|
436
|
+
errorStatus
|
|
401
437
|
}
|
|
402
438
|
}, {
|
|
403
439
|
projection: {
|
|
@@ -406,16 +442,5 @@ async function _default(MONGO_URI, collection) {
|
|
|
406
442
|
returnNewDocument: true
|
|
407
443
|
});
|
|
408
444
|
}
|
|
409
|
-
|
|
410
|
-
function getFileMetadata({
|
|
411
|
-
gridFSBucket,
|
|
412
|
-
filename
|
|
413
|
-
}) {
|
|
414
|
-
return new Promise((resolve, reject) => {
|
|
415
|
-
gridFSBucket.find({
|
|
416
|
-
filename
|
|
417
|
-
}).on('error', reject).on('data', resolve).on('end', () => reject(new _melindaCommons.Error(_httpStatus.default.NOT_FOUND, 'No content')));
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
445
|
}
|
|
421
446
|
//# sourceMappingURL=mongo.js.map
|
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","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","pushIds","pushId","correlationId","cataloger","oCatalogerIn","operation","time","toDate","newQueueItem","queueItemState","PRIO_QUEUE_ITEM_STATE","PENDING_VALIDATION","creationTime","modificationTime","handledId","result","insertOne","acknowledged","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","contentType","recordLoadParams","stream","QUEUE_ITEM_STATE","UPLOADING","handledIds","log","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","undefined","state","timeOut","checkTimeOut","params","find","projection","_id","toArray","info","length","checkModTime","findOne","timeoutTime","add","silly","isBefore","ABORT","debug","JSON","stringify","clean","getFileMetadata","filename","noContent","deleteOne","err","status","NOT_FOUND","readStream","openDownloadStreamByName","fileId","delete","clean2","ids","updateOne","$set","$push","$each","id","errorMessage","findOneAndUpdate","returnNewDocument"],"mappings":"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","sourcesContent":["/* eslint-disable max-statements */\n/**\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 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} from 'mongodb';\nimport {createLogger} from '@natlibfi/melinda-backend-commons';\nimport {Error as ApiError} from '@natlibfi/melinda-commons';\nimport {QUEUE_ITEM_STATE, PRIO_QUEUE_ITEM_STATE} 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 \"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 \"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, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, pushIds, pushId};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n oCatalogerIn,\n queueItemState: PRIO_QUEUE_ITEM_STATE.PENDING_VALIDATION,\n creationTime: time,\n modificationTime: time,\n handledId: ''\n };\n try {\n const result = await db.collection(collection).insertOne(newQueueItem);\n if (result.acknowledged) {\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 function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n contentType,\n recordLoadParams,\n queueItemState: QUEUE_ITEM_STATE.UPLOADING,\n creationTime: time,\n modificationTime: time,\n handledIds: []\n };\n try {\n db.collection(collection).insertOne(newQueueItem);\n logger.log('info', 'New queue item has been made!');\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n\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 }\n\n async function checkAndSetState({correlationId, state}) {\n const timeOut = await checkTimeOut(correlationId);\n if (timeOut) {\n return setState({correlationId, state});\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.info(`Query result: ${result.length > 0 ? 'Found!' : 'Not found!'}`);\n return result;\n }\n\n async function queryById(correlationId, checkModTime) {\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 async function checkTimeOut(correlationId) {\n const result = await db.collection(collection).findOne({correlationId});\n const timeoutTime = moment(result.modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n if (timeoutTime.isBefore()) {\n await setState({correlationId, state: PRIO_QUEUE_ITEM_STATE.ABORT});\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.debug(`${JSON.stringify(params)}`);\n logger.info(`Removing from Mongo id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n\n try {\n await getFileMetadata({gridFSBucket, filename: clean});\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.status === httpStatus.NOT_FOUND) {\n await db.collection(collection).deleteOne({correlationId: clean});\n return true;\n }\n throw err;\n }\n }\n\n async function readContent(correlationId) {\n logger.info(`Reading content for id: ${correlationId}`);\n const clean = sanitize(correlationId);\n const result = await db.collection(collection).findOne({correlationId: clean}); //ignore: node_nosqli_injection\n\n if (result) {\n // Check if the file exists\n await getFileMetadata({gridFSBucket, filename: clean});\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 for id: ${params.correlationId}`);\n const clean = sanitize(params.correlationId);\n\n const result = await db.collection(collection).findOne({correlationId: clean}); //ignore: node_nosqli_injection\n if (result) {\n const {_id: fileId} = await getFileMetadata({gridFSBucket, filename: clean});\n await gridFSBucket.delete(fileId);\n return true;\n }\n }\n\n function getOne({operation, queueItemState}) {\n const clean = {queueItemState: sanitize(queueItemState)};\n try {\n if (operation === undefined) {\n logger.log('silly', `Checking DB for ${JSON.stringify(clean.queueItemState)}`);\n return db.collection(collection).findOne({...clean}); //ignore: node_nosqli_injection\n }\n\n const clean2 = {operation: sanitize(operation)};\n logger.log('silly', `Checking DB for ${clean.queueItemState} + ${clean2.operation}`);\n return db.collection(collection).findOne({...clean, ...clean2}); //ignore: node_nosqli_injection\n } catch (error) {\n logError(error);\n }\n }\n\n async function getStream(correlationId) {\n logger.info(`Forming stream from db: ${correlationId}`);\n const clean = sanitize(correlationId);\n try {\n // Check that content is there\n await getFileMetadata({gridFSBucket, filename: clean});\n\n // Return content stream\n return gridFSBucket.openDownloadStreamByName(clean);\n } catch (error) {\n logError(error);\n }\n }\n\n async function pushIds({correlationId, ids}) {\n logger.debug(`Push queue-item ids to list: ${correlationId}, ${ids}`);\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: ids}\n }\n });\n }\n\n async function pushId({correlationId, id}) {\n logger.debug(`Push queue-item id: ${correlationId}, ${id}`);\n const clean = sanitize(correlationId);\n await db.collection(collection).updateOne({\n correlationId: clean\n }, {\n $set: {\n modificationTime: moment().toDate(),\n handledId: id\n }\n });\n }\n\n function setState({correlationId, state, errorMessage = ''}) {\n logger.log('info', `Setting queue-item state: ${correlationId}, ${state}, ${errorMessage}`);\n const clean = sanitize(correlationId);\n return db.collection(collection).findOneAndUpdate({\n correlationId: clean\n }, {\n $set: {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n\n function getFileMetadata({gridFSBucket, filename}) {\n return new Promise((resolve, reject) => {\n gridFSBucket.find({filename})\n .on('error', reject)\n .on('data', resolve)\n .on('end', () => reject(new ApiError(httpStatus.NOT_FOUND, 'No content')));\n });\n }\n}\n"],"file":"mongo.js"}
|
|
1
|
+
{"version":3,"sources":["../src/mongo.js"],"names":["MONGO_URI","collection","logger","client","MongoClient","connect","useNewUrlParser","useUnifiedTopology","db","gridFSBucket","GridFSBucket","bucketName","createPrio","createBulk","checkAndSetState","query","queryById","remove","readContent","removeContent","getOne","getStream","setState","pushIds","pushMessages","correlationId","cataloger","oCatalogerIn","operation","noop","undefined","unique","prio","time","toDate","newQueueItem","operationSettings","queueItemState","QUEUE_ITEM_STATE","VALIDATOR","PENDING_VALIDATION","creationTime","modificationTime","handledIds","rejectedIds","result","insertOne","acknowledged","info","ApiError","httpStatus","INTERNAL_SERVER_ERROR","error","contentType","recordLoadParams","stream","UPLOADING","Promise","resolve","reject","outputStream","openUploadStream","on","chunk","write","end","state","errorMessage","errorStatus","timeOut","checkTimeOut","params","find","projection","_id","toArray","debug","length","checkModTime","findOne","timeoutTime","add","silly","isBefore","oldState","ABORT","REQUEST_TIMEOUT","JSON","stringify","clean","noContent","deleteOne","err","MongoDriverError","message","indexOf","readStream","openDownloadStreamByName","NOT_FOUND","delete","clean2","updateOne","$set","$push","$each","messages","messageField","cleanMessageField","errorString","log","findOneAndUpdate","returnNewDocument"],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n/* eslint-disable max-statements */\n/**\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 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} 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 \"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 \"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, query, queryById, remove, readContent, removeContent, getOne, getStream, setState, pushIds, pushMessages};\n\n async function createPrio({correlationId, cataloger, oCatalogerIn, operation, noop = undefined, unique = undefined, prio = undefined}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n operation,\n oCatalogerIn,\n operationSettings: {unique, noop, prio},\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.PENDING_VALIDATION,\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 ${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 function createBulk({correlationId, cataloger, oCatalogerIn, operation, contentType, recordLoadParams, stream}) {\n const time = moment().toDate();\n const newQueueItem = {\n correlationId,\n cataloger,\n oCatalogerIn,\n operation,\n contentType,\n recordLoadParams,\n queueItemState: QUEUE_ITEM_STATE.VALIDATOR.UPLOADING,\n creationTime: time,\n modificationTime: time,\n handledIds: [],\n rejectedIds: []\n };\n try {\n // No await here, promises later\n db.collection(collection).insertOne(newQueueItem);\n logger.info(`New bulk queue item for ${correlationId} has been made in ${collection}!`);\n } catch (error) {\n logError(error);\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR);\n }\n\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 }\n\n // Check state that the queueItem has not waited too long and set state\n async function checkAndSetState({correlationId, state, errorMessage = '', errorStatus = ''}) {\n // checkTimeOut returns true, if queueItem is fresher than 1 minute\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 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) {\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 async function checkTimeOut(correlationId) {\n const result = await db.collection(collection).findOne({correlationId});\n const timeoutTime = moment(result.modificationTime).add(1, 'm');\n logger.silly(`timeOut @ ${timeoutTime}`);\n if (timeoutTime.isBefore()) {\n const oldState = result.queueItemState;\n await setState({correlationId, state: QUEUE_ITEM_STATE.ABORT, errorStatus: httpStatus.REQUEST_TIMEOUT, errorMessage: `Timeout in ${oldState}`});\n return false;\n }\n\n return true;\n }\n\n async function remove(params) {\n logger.debug(`${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 logger.error(err.message);\n if (err.message.indexOf('File not found for id') !== -1) {\n logger.debug(`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 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 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 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.debug(`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 function getOne({operation, queueItemState}) {\n const clean = {queueItemState: sanitize(queueItemState)};\n try {\n if (operation === undefined) {\n logger.silly(`Checking DB ${collection} for ${JSON.stringify(clean.queueItemState)}`);\n return db.collection(collection).findOne({...clean});\n }\n\n const clean2 = {operation: sanitize(operation)};\n logger.silly(`Checking DB ${collection} for ${clean.queueItemState} + ${clean2.operation}`);\n return db.collection(collection).findOne({...clean, ...clean2});\n } catch (error) {\n logError(error);\n }\n }\n\n function getStream(correlationId) {\n logger.info(`Forming stream from db: ${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.info(`Push queue-item ids to list: ${correlationId} to ${collection}`);\n logger.debug(`ids: ${JSON.stringify(handledIds)}, rejectedIds: ${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.info(`Push messages to ${messageField} ${correlationId} to ${collection}`);\n logger.debug(`Messages: ${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 = '', errorStatus = ''}) {\n const errorString = errorMessage || errorStatus ? `, Error message: '${errorMessage}', Error status: '${errorStatus}'` : '';\n logger.log('info', `Setting queue-item state: ${correlationId}${state}${errorString} to ${collection}`);\n const clean = sanitize(correlationId);\n return db.collection(collection).findOneAndUpdate({\n correlationId: clean\n }, {\n $set: {\n queueItemState: state,\n modificationTime: moment().toDate(),\n errorMessage,\n errorStatus\n }\n }, {projection: {_id: 0}, returnNewDocument: true});\n }\n}\n"],"file":"mongo.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.0.0-alpha.
|
|
17
|
+
"version": "2.0.0-alpha.13",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"engines": {
|
|
20
20
|
"node": ">=12"
|
|
@@ -33,35 +33,35 @@
|
|
|
33
33
|
"build": "babel src --source-maps --copy-files --delete-dir-on-start --out-dir=dist"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@natlibfi/fixura": "^2.1
|
|
36
|
+
"@natlibfi/fixura": "^2.2.1",
|
|
37
37
|
"@natlibfi/marc-record": "^6.1.2",
|
|
38
|
-
"@natlibfi/marc-record-serializers": "^
|
|
38
|
+
"@natlibfi/marc-record-serializers": "^8.0.0-alpha.1",
|
|
39
39
|
"@natlibfi/marc-record-validate": "^6.0.1",
|
|
40
|
-
"@natlibfi/marc-record-validators-melinda": "^8.
|
|
41
|
-
"@natlibfi/melinda-backend-commons": "^2.0.
|
|
42
|
-
"@natlibfi/melinda-commons": "^11.1.1",
|
|
40
|
+
"@natlibfi/marc-record-validators-melinda": "^8.4.4",
|
|
41
|
+
"@natlibfi/melinda-backend-commons": "^2.0.5",
|
|
42
|
+
"@natlibfi/melinda-commons": "^11.1.10-alpha.1",
|
|
43
43
|
"amqplib": ">=0.8.0 <1.0.0",
|
|
44
44
|
"http-status": "^1.5.0",
|
|
45
45
|
"moment": "^2.29.1",
|
|
46
46
|
"mongo-sanitize": "^1.1.0",
|
|
47
|
-
"mongodb": "^4.
|
|
47
|
+
"mongodb": "^4.1.3"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@babel/cli": "^7.
|
|
51
|
-
"@babel/core": "^7.
|
|
50
|
+
"@babel/cli": "^7.15.7",
|
|
51
|
+
"@babel/core": "^7.15.8",
|
|
52
52
|
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
|
53
|
-
"@babel/preset-env": "^7.
|
|
54
|
-
"@natlibfi/eslint-config-melinda-backend": "^1.
|
|
55
|
-
"@babel/eslint-parser": "^7.
|
|
53
|
+
"@babel/preset-env": "^7.15.8",
|
|
54
|
+
"@natlibfi/eslint-config-melinda-backend": "^1.1.1",
|
|
55
|
+
"@babel/eslint-parser": "^7.15.8",
|
|
56
56
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
57
|
-
"babel-plugin-istanbul": "^6.
|
|
57
|
+
"babel-plugin-istanbul": "^6.1.1",
|
|
58
58
|
"babel-plugin-rewire": "^1.2.0",
|
|
59
59
|
"chai": "^4.3.4",
|
|
60
60
|
"cross-env": "^7.0.3",
|
|
61
61
|
"eslint": "^7.32.0",
|
|
62
|
-
"eslint-plugin-import": "^2.
|
|
63
|
-
"mocha": "^9.
|
|
64
|
-
"nodemon": "^2.0.
|
|
62
|
+
"eslint-plugin-import": "^2.25.2",
|
|
63
|
+
"mocha": "^9.1.3",
|
|
64
|
+
"nodemon": "^2.0.14",
|
|
65
65
|
"nyc": "^15.1.0"
|
|
66
66
|
},
|
|
67
67
|
"eslintConfig": {
|