@researchdatabox/sails-hook-redbox-storage-mongo 0.0.1-beta.8936

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.
@@ -0,0 +1,933 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Services = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const rxjs_2 = require("rxjs");
6
+ const crypto_1 = require("crypto");
7
+ const luxon_1 = require("luxon");
8
+ const mongodb = require("mongodb");
9
+ const stream = require("stream");
10
+ const json2csv_1 = require("json2csv");
11
+ const redbox_core_1 = require("@researchdatabox/redbox-core");
12
+ const redbox_core_2 = require("@researchdatabox/redbox-core");
13
+ const { flatten } = json2csv_1.transforms;
14
+ var Services;
15
+ (function (Services) {
16
+ class MongoStorageService extends redbox_core_1.Services.Core.Service {
17
+ gridFsBucket;
18
+ db;
19
+ recordCol;
20
+ deletedRecordCol;
21
+ _readyHookRegistered = false;
22
+ _exportedMethods = [
23
+ 'init',
24
+ 'create',
25
+ 'updateMeta',
26
+ 'getMeta',
27
+ 'createBatch',
28
+ 'provideUserAccessAndRemovePendingAccess',
29
+ 'getRelatedRecords',
30
+ 'delete',
31
+ 'updateNotificationLog',
32
+ 'getRecords',
33
+ 'restoreRecord',
34
+ 'destroyDeletedRecord',
35
+ 'getDeletedRecords',
36
+ 'exportAllPlans',
37
+ 'addDatastreams',
38
+ 'updateDatastream',
39
+ 'removeDatastream',
40
+ 'addDatastream',
41
+ 'addAndRemoveDatastreams',
42
+ 'getDatastream',
43
+ 'listDatastreams',
44
+ 'createRecordAudit',
45
+ 'getRecordAudit',
46
+ 'exists',
47
+ ];
48
+ constructor() {
49
+ super();
50
+ this.logHeader = 'MongoStorageService::';
51
+ this.registerReadyHook();
52
+ }
53
+ getUuid() {
54
+ return (0, crypto_1.randomUUID)().replace(/-/g, '');
55
+ }
56
+ getErrorMessage(err) {
57
+ if (err instanceof Error) {
58
+ return err.message;
59
+ }
60
+ return String(err);
61
+ }
62
+ init() {
63
+ this.registerReadyHook();
64
+ void this.performInit();
65
+ }
66
+ registerReadyHook() {
67
+ if (this._readyHookRegistered) {
68
+ return;
69
+ }
70
+ this._readyHookRegistered = true;
71
+ const that = this;
72
+ this.registerSailsHook('on', 'ready', function () {
73
+ void that.performInit();
74
+ });
75
+ }
76
+ async collectionExists(collectionName) {
77
+ if (typeof this.db.listCollections === 'function') {
78
+ const collectionInfo = await this.db.listCollections({ name: collectionName }, { nameOnly: true }).toArray();
79
+ if (!_.isEmpty(collectionInfo)) {
80
+ sails.log.verbose(`${this.logHeader} Collection '${collectionName}' info:`);
81
+ sails.log.verbose(JSON.stringify(collectionInfo));
82
+ return true;
83
+ }
84
+ return false;
85
+ }
86
+ try {
87
+ const collectionInfo = this.db.collection(collectionName, { strict: true });
88
+ sails.log.verbose(`${this.logHeader} Collection '${collectionName}' info:`);
89
+ sails.log.verbose(JSON.stringify(collectionInfo));
90
+ return true;
91
+ }
92
+ catch (_err) {
93
+ return false;
94
+ }
95
+ }
96
+ async performInit() {
97
+ if (this.recordCol && this.deletedRecordCol && this.gridFsBucket) {
98
+ return;
99
+ }
100
+ this.db = Record.getDatastore().manager;
101
+ if (!(await this.collectionExists(Record.tableName))) {
102
+ sails.log.verbose(`Collection doesn't exist, creating: ${Record.tableName}`);
103
+ const uuid = this.getUuid();
104
+ const initRec = { redboxOid: uuid };
105
+ await Record.create(initRec);
106
+ await Record.destroyOne({ redboxOid: uuid });
107
+ }
108
+ this.gridFsBucket = new mongodb.GridFSBucket(this.db);
109
+ this.recordCol = this.db.collection(Record.tableName);
110
+ this.deletedRecordCol = this.db.collection(DeletedRecord.tableName);
111
+ await this.createIndices(this.db);
112
+ sails.emit('hook:redbox:storage:ready');
113
+ sails.emit('hook:redbox:datastream:ready');
114
+ sails.log.verbose(`${this.logHeader} Ready!`);
115
+ }
116
+ async createIndices(db) {
117
+ sails.log.verbose(`${this.logHeader} Existing indices:`);
118
+ const currentIndices = await db.collection(Record.tableName).indexes();
119
+ sails.log.verbose(JSON.stringify(currentIndices));
120
+ try {
121
+ const storageConfig = sails.config.storage;
122
+ const indices = storageConfig.mongodb?.indices ?? [];
123
+ if (_.size(indices) > 0) {
124
+ await db.collection(Record.tableName).createIndexes(indices);
125
+ }
126
+ }
127
+ catch (err) {
128
+ sails.log.error(`Failed to create indices:`);
129
+ sails.log.error(JSON.stringify(err));
130
+ }
131
+ }
132
+ async create(_brand, record, _recordType, _user) {
133
+ sails.log.verbose(`${this.logHeader} create() -> Begin`);
134
+ const response = new redbox_core_1.StorageServiceResponse();
135
+ record.redboxOid = this.getUuid();
136
+ response.oid = String(record.redboxOid);
137
+ try {
138
+ sails.log.verbose(`${this.logHeader} Saving to DB...`);
139
+ await Record.create(record);
140
+ response.success = true;
141
+ sails.log.verbose(`${this.logHeader} Record created...`);
142
+ }
143
+ catch (err) {
144
+ sails.log.error(`${this.logHeader} Failed to create Record:`);
145
+ sails.log.error(JSON.stringify(err));
146
+ response.success = false;
147
+ response.message = this.getErrorMessage(err);
148
+ return response;
149
+ }
150
+ sails.log.verbose(JSON.stringify(response));
151
+ sails.log.verbose(`${this.logHeader} create() -> End`);
152
+ return response;
153
+ }
154
+ async updateMeta(brand, oid, record, user) {
155
+ const response = new redbox_core_1.StorageServiceResponse();
156
+ response.oid = oid;
157
+ try {
158
+ _.unset(record, 'dateCreated');
159
+ _.unset(record, 'lastSaveDate');
160
+ _.unset(record, '_id');
161
+ _.unset(record, 'id');
162
+ await Record.updateOne({ redboxOid: oid }).set(record);
163
+ response.success = true;
164
+ }
165
+ catch (err) {
166
+ sails.log.error(`${this.logHeader} Failed to save update to MongoDB: ${JSON.stringify({
167
+ error: err,
168
+ response,
169
+ brand,
170
+ oid,
171
+ record,
172
+ user,
173
+ })}`);
174
+ response.success = false;
175
+ response.message = this.getErrorMessage(err);
176
+ }
177
+ return response;
178
+ }
179
+ async getMeta(oid) {
180
+ if (_.isEmpty(oid)) {
181
+ const msg = `${this.logHeader} getMeta() -> refusing to search using an empty OID`;
182
+ sails.log.error(msg);
183
+ throw new Error(msg);
184
+ }
185
+ const criteria = { redboxOid: oid };
186
+ sails.log.verbose(`${this.logHeader} finding: `);
187
+ sails.log.verbose(JSON.stringify(criteria));
188
+ return (await Record.findOne(criteria));
189
+ }
190
+ async createBatch(type, data, harvestIdFldName) {
191
+ const response = new redbox_core_1.StorageServiceResponse();
192
+ response.message = '';
193
+ let failFlag = false;
194
+ _.each(data, async (dataItem) => {
195
+ dataItem.harvestId = _.get(dataItem, harvestIdFldName, '');
196
+ _.set(dataItem, 'metaMetadata.type', type);
197
+ try {
198
+ await this.create(null, dataItem, null, null);
199
+ }
200
+ catch (err) {
201
+ failFlag = true;
202
+ sails.log.error(`${this.logHeader} Failed createBatch entry: `);
203
+ sails.log.error(JSON.stringify(dataItem));
204
+ sails.log.error(`${this.logHeader} Failed createBatch error: `);
205
+ sails.log.error(JSON.stringify(err));
206
+ response.message = `${response.message}, ${err.message}`;
207
+ }
208
+ });
209
+ response.success = failFlag === false;
210
+ return response;
211
+ }
212
+ provideUserAccessAndRemovePendingAccess(oid, userid, pendingValue) {
213
+ const batchFn = async () => {
214
+ const metadata = (await this.getMeta(oid));
215
+ const pendingEditArray = _.get(metadata, 'authorization.editPending', []);
216
+ const editArray = _.get(metadata, 'authorization.edit', []);
217
+ const pendingEditArrayFiltered = pendingEditArray.filter(value => value !== pendingValue);
218
+ const pendingEditFound = pendingEditArray.length > pendingEditArrayFiltered.length;
219
+ if (pendingEditFound && !editArray.includes(userid)) {
220
+ editArray.push(userid);
221
+ }
222
+ _.set(metadata, 'authorization.editPending', pendingEditArrayFiltered);
223
+ _.set(metadata, 'authorization.edit', editArray);
224
+ const pendingViewArray = _.get(metadata, 'authorization.viewPending', []);
225
+ const viewArray = _.get(metadata, 'authorization.view', []);
226
+ const pendingViewArrayFiltered = pendingViewArray.filter(value => value !== pendingValue);
227
+ const pendingViewFound = pendingViewArray.length > pendingViewArrayFiltered.length;
228
+ if (pendingViewFound && !viewArray.includes(userid)) {
229
+ viewArray.push(userid);
230
+ }
231
+ _.set(metadata, 'authorization.viewPending', pendingViewArrayFiltered);
232
+ _.set(metadata, 'authorization.view', viewArray);
233
+ try {
234
+ await this.updateMeta(null, oid, metadata);
235
+ }
236
+ catch (err) {
237
+ sails.log.error(`${this.logHeader} Failed to update on 'provideUserAccessAndRemovePendingAccess': `);
238
+ sails.log.error(JSON.stringify(err));
239
+ }
240
+ };
241
+ batchFn();
242
+ }
243
+ async getRelatedRecords(oid, brand, recordTypeName = null, mappingContext = null) {
244
+ const record = (await this.getMeta(oid));
245
+ if (_.isEmpty(recordTypeName)) {
246
+ recordTypeName = String(_.get(record, 'metaMetadata.type', ''));
247
+ }
248
+ const recordType = await (0, rxjs_1.firstValueFrom)(RecordTypesService.get(brand, recordTypeName));
249
+ if (_.isEmpty(mappingContext)) {
250
+ mappingContext = {
251
+ processedRelationships: [recordTypeName],
252
+ relatedObjects: {},
253
+ };
254
+ mappingContext.relatedObjects[recordTypeName] = [record];
255
+ }
256
+ const relatedTo = recordType['relatedTo'];
257
+ if (_.isArray(relatedTo) && _.size(relatedTo) > 0) {
258
+ for (const relationship of relatedTo) {
259
+ sails.log.verbose(`${this.logHeader} Processing relationship:`);
260
+ sails.log.verbose(JSON.stringify(relationship));
261
+ const targetRecordType = relationship['recordType'];
262
+ const criteria = {};
263
+ criteria['metaMetadata.type'] = targetRecordType;
264
+ criteria[relationship['foreignField']] = oid;
265
+ sails.log.verbose(`${this.logHeader} Finding related records criteria:`);
266
+ sails.log.verbose(JSON.stringify(criteria));
267
+ const relatedRecords = await Record.find(criteria).meta({ enableExperimentalDeepTargets: true });
268
+ sails.log.verbose(`${this.logHeader} Got related records:`);
269
+ sails.log.verbose(JSON.stringify(relatedRecords));
270
+ if (_.size(relatedRecords) > 0) {
271
+ if (_.isEmpty(mappingContext.relatedObjects[targetRecordType])) {
272
+ mappingContext.relatedObjects[targetRecordType] = relatedRecords;
273
+ }
274
+ else {
275
+ mappingContext.relatedObjects[targetRecordType] =
276
+ mappingContext.relatedObjects[targetRecordType].concat(relatedRecords);
277
+ }
278
+ for (let j = 0; j < relatedRecords.length; j++) {
279
+ const recordRelationship = relatedRecords[j];
280
+ mappingContext = await this.getRelatedRecords(String(recordRelationship.redboxOid), brand, null, mappingContext);
281
+ }
282
+ }
283
+ if (!_.includes(mappingContext.processedRelationships, targetRecordType)) {
284
+ mappingContext.processedRelationships.push(targetRecordType);
285
+ }
286
+ }
287
+ }
288
+ else {
289
+ sails.log.verbose(`${this.logHeader} RecordType has no relationships: ${recordTypeName}`);
290
+ }
291
+ sails.log.verbose(`${this.logHeader} Current mapping context:`);
292
+ sails.log.verbose(JSON.stringify(mappingContext));
293
+ return mappingContext;
294
+ }
295
+ async delete(oid, permanentlyDelete = false) {
296
+ const response = new redbox_core_1.StorageServiceResponse();
297
+ try {
298
+ if (permanentlyDelete) {
299
+ const datastreams = await this.listDatastreams(oid, null);
300
+ if (_.size(datastreams) > 0) {
301
+ _.each(datastreams, async (file) => {
302
+ sails.log.verbose(`Deleting:`);
303
+ sails.log.verbose(JSON.stringify(file));
304
+ try {
305
+ await this.gridFsBucket.delete(file['_id']);
306
+ }
307
+ catch (err) {
308
+ sails.log.error(`Error deleting: ${file['_id']}`);
309
+ sails.log.error(JSON.stringify(err));
310
+ }
311
+ });
312
+ }
313
+ }
314
+ else {
315
+ const record = (await this.getMeta(oid));
316
+ const deletedRecord = {
317
+ redboxOid: record.redboxOid,
318
+ deletedRecordMetadata: record,
319
+ };
320
+ await DeletedRecord.create(deletedRecord);
321
+ }
322
+ await Record.destroyOne({ redboxOid: oid });
323
+ response.success = true;
324
+ }
325
+ catch (err) {
326
+ sails.log.error(`${this.logHeader} Failed to delete record: ${oid}`);
327
+ sails.log.error(JSON.stringify(err));
328
+ response.success = false;
329
+ response.message = err.message;
330
+ }
331
+ return response;
332
+ }
333
+ async updateNotificationLog(oid, record, options) {
334
+ if (super.metTriggerCondition(oid, record, options) == 'true') {
335
+ sails.log.verbose(`${this.logHeader} Updating notification log for oid: ${oid}`);
336
+ const logName = _.get(options, 'logName', null);
337
+ if (logName) {
338
+ let log = _.get(record, logName, null);
339
+ const entry = { date: luxon_1.DateTime.now().toFormat("yyyy-LL-dd'T'HH:mm:ss") };
340
+ if (log) {
341
+ log.push(entry);
342
+ }
343
+ else {
344
+ log = [entry];
345
+ }
346
+ _.set(record, logName, log);
347
+ }
348
+ const updateFlagName = _.get(options, 'flagName', null);
349
+ if (updateFlagName) {
350
+ _.set(record, updateFlagName, _.get(options, 'flagVal', null));
351
+ }
352
+ sails.log.verbose(`======== Notification log updates =========`);
353
+ sails.log.verbose(JSON.stringify(record));
354
+ sails.log.verbose(`======== End update =========`);
355
+ if (_.get(options, 'saveRecord', false)) {
356
+ try {
357
+ await this.updateMeta(null, oid, record, null);
358
+ }
359
+ catch (err) {
360
+ sails.log.error(`${this.logHeader} Failed to update notification log of ${oid}:`);
361
+ sails.log.error(JSON.stringify(err));
362
+ throw err;
363
+ }
364
+ }
365
+ }
366
+ else {
367
+ sails.log.verbose(`Notification log name: '${options.name}', for oid: ${oid}, not running, condition not met: ${options.triggerCondition}`);
368
+ sails.log.verbose(JSON.stringify(record));
369
+ }
370
+ return record;
371
+ }
372
+ async getDeletedRecords(workflowState, recordType = undefined, start, rows = 10, username, roles, brand, _editAccessOnly = undefined, packageType = undefined, sort = undefined, filterFields = undefined, filterString = undefined, filterMode = 'regex', secondarySort = undefined) {
373
+ const query = {
374
+ 'deletedRecordMetadata.metaMetadata.brandId': brand.id,
375
+ };
376
+ const options = {
377
+ limit: _.toNumber(rows),
378
+ skip: _.toNumber(start),
379
+ };
380
+ if (_.isEmpty(sort)) {
381
+ sort = '{"lastSaveDate": -1}';
382
+ }
383
+ sails.log.verbose(`Sort is: ${sort}`);
384
+ if (_.indexOf(`${sort}`, '1') == -1) {
385
+ sort = `{"${sort}":-1}`;
386
+ }
387
+ else {
388
+ try {
389
+ options['sort'] = JSON.parse(sort);
390
+ }
391
+ catch (_error) {
392
+ options['sort'] = {};
393
+ options['sort'][`${sort.substring(0, sort.indexOf(':'))}`] = _.toNumber(sort.substring(sort.indexOf(':') + 1));
394
+ }
395
+ }
396
+ if (!_.isEmpty(secondarySort)) {
397
+ options['sort'][`${secondarySort.substring(0, secondarySort.indexOf(':'))}`] = _.toNumber(secondarySort.substring(secondarySort.indexOf(':') + 1));
398
+ }
399
+ const roleNames = this.getRoleNames(roles, brand);
400
+ const andArray = [];
401
+ const permissions = {
402
+ $or: [
403
+ { 'deletedRecordMetadata.authorization.view': username },
404
+ { 'deletedRecordMetadata.authorization.edit': username },
405
+ { 'deletedRecordMetadata.authorization.editRoles': { $in: roleNames } },
406
+ { 'deletedRecordMetadata.authorization.viewRoles': { $in: roleNames } },
407
+ ],
408
+ };
409
+ andArray.push(permissions);
410
+ if (!_.isUndefined(recordType) && !_.isEmpty(recordType)) {
411
+ const typeArray = [];
412
+ _.each(recordType, rType => {
413
+ typeArray.push({ 'deletedRecordMetadata.metaMetadata.type': rType });
414
+ });
415
+ andArray.push({ $or: typeArray });
416
+ }
417
+ if (!_.isUndefined(packageType) && !_.isEmpty(packageType)) {
418
+ const typeArray = [];
419
+ _.each(packageType, rType => {
420
+ typeArray.push({ 'deletedRecordMetadata.metaMetadata.packageType': rType });
421
+ });
422
+ andArray.push({ $or: typeArray });
423
+ }
424
+ if (workflowState != undefined) {
425
+ query['deletedRecordMetadata.workflow.stage'] = workflowState;
426
+ }
427
+ if (!_.isEmpty(filterString) && !_.isEmpty(filterFields)) {
428
+ const escapedFilterString = this.escapeRegExp(filterString);
429
+ sails.log.verbose('escapedFilterString ' + escapedFilterString);
430
+ for (const filterField of filterFields) {
431
+ const filterQuery = {};
432
+ if (filterMode == 'equal') {
433
+ filterQuery[filterField] = filterString;
434
+ }
435
+ else if (filterMode == 'regex') {
436
+ filterQuery[filterField] = new RegExp(`.*${escapedFilterString}.*`);
437
+ sails.log.verbose(filterQuery);
438
+ }
439
+ andArray.push(filterQuery);
440
+ }
441
+ }
442
+ query['$and'] = andArray;
443
+ sails.log.verbose(`Query: ${JSON.stringify(query)}`);
444
+ sails.log.verbose(`Options: ${JSON.stringify(options)}`);
445
+ const { items, totalItems } = await this.runDeletedRecordQuery(Record.tableName, query, options);
446
+ const response = new redbox_core_1.StorageServiceResponse();
447
+ response.success = true;
448
+ response.items = items;
449
+ response.totalItems = totalItems;
450
+ return response;
451
+ }
452
+ async getRecords(workflowState, recordType = undefined, start, rows = 10, username, roles, brand, _editAccessOnly = undefined, packageType = undefined, sort = undefined, filterFields = undefined, filterString = undefined, filterMode = undefined, secondarySort = undefined) {
453
+ if (_.isUndefined(filterMode) || _.isNull(filterMode) || _.isEmpty(filterMode)) {
454
+ filterMode = 'regex';
455
+ }
456
+ const query = {
457
+ 'metaMetadata.brandId': brand.id,
458
+ };
459
+ const options = {
460
+ limit: _.toNumber(rows),
461
+ skip: _.toNumber(start),
462
+ };
463
+ if (_.isEmpty(sort)) {
464
+ sort = '{"lastSaveDate": -1}';
465
+ }
466
+ sails.log.verbose(`Sort is: ${sort}`);
467
+ if (_.indexOf(`${sort}`, '1') == -1) {
468
+ sort = `{"${sort}":-1}`;
469
+ }
470
+ else {
471
+ try {
472
+ options['sort'] = JSON.parse(sort);
473
+ }
474
+ catch (_error) {
475
+ options['sort'] = {};
476
+ options['sort'][`${sort.substring(0, sort.indexOf(':'))}`] = _.toNumber(sort.substring(sort.indexOf(':') + 1));
477
+ }
478
+ }
479
+ if (!_.isEmpty(secondarySort)) {
480
+ options['sort'][`${secondarySort.substring(0, secondarySort.indexOf(':'))}`] = _.toNumber(secondarySort.substring(secondarySort.indexOf(':') + 1));
481
+ }
482
+ const roleNames = this.getRoleNames(roles, brand);
483
+ const andArray = [];
484
+ const permissions = {
485
+ $or: [
486
+ { 'authorization.view': username },
487
+ { 'authorization.edit': username },
488
+ { 'authorization.editRoles': { $in: roleNames } },
489
+ { 'authorization.viewRoles': { $in: roleNames } },
490
+ ],
491
+ };
492
+ andArray.push(permissions);
493
+ if (_.isArray(recordType)) {
494
+ if (recordType.length > 1) {
495
+ const typeArray = [];
496
+ _.each(recordType, rType => {
497
+ typeArray.push({ 'metaMetadata.type': rType });
498
+ });
499
+ query['$or'] = typeArray;
500
+ }
501
+ else {
502
+ const recType = recordType[0];
503
+ if (!_.isUndefined(recType) && !_.isEmpty(recType)) {
504
+ query['metaMetadata.type'] = recType;
505
+ }
506
+ }
507
+ }
508
+ else if (recordType != undefined && recordType != '') {
509
+ query['metaMetadata.type'] = recordType;
510
+ }
511
+ if (_.isArray(packageType)) {
512
+ if (packageType.length > 1) {
513
+ const typeArray = [];
514
+ _.each(packageType, rType => {
515
+ typeArray.push({ 'metaMetadata.packageType': rType });
516
+ });
517
+ query['metaMetadata.packageType'] = { $or: typeArray };
518
+ }
519
+ else {
520
+ const packType = packageType[0];
521
+ if (!_.isUndefined(packType) && !_.isEmpty(packType)) {
522
+ query['metaMetadata.packageType'] = packType;
523
+ }
524
+ }
525
+ }
526
+ else if (packageType != undefined && packageType != '') {
527
+ query['metaMetadata.packageType'] = packageType;
528
+ }
529
+ if (workflowState != undefined && workflowState != '') {
530
+ query['workflow.stage'] = workflowState;
531
+ }
532
+ if (!_.isEmpty(filterString) && !_.isEmpty(filterFields)) {
533
+ const escapedFilterString = this.escapeRegExp(filterString);
534
+ sails.log.verbose('escapedFilterString ' + escapedFilterString);
535
+ for (const filterField of filterFields) {
536
+ if (filterMode == 'equal') {
537
+ query[filterField] = filterString;
538
+ }
539
+ else if (filterMode == 'regex') {
540
+ query[filterField] = new RegExp(`.*${escapedFilterString}.*`, 'i');
541
+ }
542
+ }
543
+ }
544
+ query['$and'] = andArray;
545
+ sails.log.verbose(query);
546
+ sails.log.verbose(`Query: ${JSON.stringify(query)}`);
547
+ sails.log.verbose(`Options: ${JSON.stringify(options)}`);
548
+ const { items, totalItems } = await this.runRecordQuery(Record.tableName, query, options);
549
+ const response = new redbox_core_1.StorageServiceResponse();
550
+ response.success = true;
551
+ response.items = items;
552
+ response.totalItems = totalItems;
553
+ return response;
554
+ }
555
+ escapeRegExp(string) {
556
+ return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
557
+ }
558
+ async runRecordQuery(colName, query, options) {
559
+ return {
560
+ items: await this.recordCol.find(query, options).toArray(),
561
+ totalItems: await this.recordCol.count(query),
562
+ };
563
+ }
564
+ async runDeletedRecordQuery(colName, query, options) {
565
+ return {
566
+ items: await this.deletedRecordCol.find(query, options).toArray(),
567
+ totalItems: await this.deletedRecordCol.count(query),
568
+ };
569
+ }
570
+ async *fetchAllRecords(query, options, stringifyJSON = false) {
571
+ let skip = 0;
572
+ const limit = options.limit;
573
+ options.skip = skip;
574
+ let result = await this.recordCol.find(query, options).toArray();
575
+ while (result.length > 0) {
576
+ for (const record of result) {
577
+ if (stringifyJSON) {
578
+ yield JSON.stringify(record);
579
+ }
580
+ else {
581
+ yield record;
582
+ }
583
+ }
584
+ skip = skip + limit;
585
+ options.skip = skip;
586
+ result = await this.recordCol.find(query, options).toArray();
587
+ }
588
+ }
589
+ exportAllPlans(username, roles, brand, format, modBefore, modAfter, recType) {
590
+ const andArray = [];
591
+ const query = {
592
+ 'metaMetadata.brandId': brand.id,
593
+ 'metaMetadata.type': recType,
594
+ };
595
+ const roleNames = this.getRoleNames(roles, brand);
596
+ const permissions = {
597
+ $or: [
598
+ { 'authorization.view': username },
599
+ { 'authorization.edit': username },
600
+ { 'authorization.editRoles': { $in: roleNames } },
601
+ { 'authorization.viewRoles': { $in: roleNames } },
602
+ ],
603
+ };
604
+ andArray.push(permissions);
605
+ const options = {
606
+ limit: _.toNumber(sails.config.record.export.maxRecords),
607
+ sort: {
608
+ lastSaveDate: -1,
609
+ },
610
+ };
611
+ if (!_.isEmpty(modAfter)) {
612
+ andArray.push({
613
+ lastSaveDate: {
614
+ $gte: `${modAfter}`,
615
+ },
616
+ });
617
+ }
618
+ if (!_.isEmpty(modBefore)) {
619
+ andArray.push({
620
+ lastSaveDate: {
621
+ $lte: `${modBefore}`,
622
+ },
623
+ });
624
+ }
625
+ query['$and'] = andArray;
626
+ sails.log.verbose(`Query: ${JSON.stringify(query)}`);
627
+ sails.log.verbose(`Options: ${JSON.stringify(options)}`);
628
+ if (format == 'csv') {
629
+ const opts = { transforms: [flatten()] };
630
+ const transformOpts = { objectMode: true };
631
+ const json2csv = new json2csv_1.Transform(opts, transformOpts);
632
+ return stream.Readable.from(this.fetchAllRecords(query, options)).pipe(json2csv);
633
+ }
634
+ const jsonTransformer = new redbox_core_2.ExportJSONTransformer(recType, modBefore, modAfter);
635
+ return stream.Readable.from(this.fetchAllRecords(query, options, true)).pipe(jsonTransformer);
636
+ }
637
+ getRoleNames(roles, brand) {
638
+ const roleNames = [];
639
+ for (let i = 0; i < roles.length; i++) {
640
+ const role = roles[i];
641
+ if (role.branding == brand.id) {
642
+ roleNames.push(roles[i].name);
643
+ }
644
+ }
645
+ return roleNames;
646
+ }
647
+ async addDatastreams(oid, fileIds) {
648
+ const response = new redbox_core_1.DatastreamServiceResponse();
649
+ response.message = '';
650
+ let hasFailure = false;
651
+ for (const fileId of fileIds) {
652
+ try {
653
+ await this.addDatastream(oid, fileId, StorageManagerService.stagingDisk());
654
+ const successMessage = `Successfully uploaded: ${JSON.stringify(fileId)}`;
655
+ response.message = _.isEmpty(response.message) ? successMessage : `${response.message}\n${successMessage}`;
656
+ }
657
+ catch (err) {
658
+ hasFailure = true;
659
+ sails.log.error(`${this.logHeader} Failed to upload datastream for oid '${oid}':`);
660
+ sails.log.error(err);
661
+ const failureMessage = `Failed to upload: ${JSON.stringify(fileId)}, error is:\n${this.getErrorMessage(err)}`;
662
+ response.message = _.isEmpty(response.message) ? failureMessage : `${response.message}\n${failureMessage}`;
663
+ }
664
+ }
665
+ response.success = !hasFailure;
666
+ return response;
667
+ }
668
+ updateDatastream(oid, record, newMetadata, fileRoot, fileIdsAdded) {
669
+ let stagingDisk;
670
+ if (typeof fileRoot === 'string') {
671
+ stagingDisk = StorageManagerService.disk(fileRoot);
672
+ }
673
+ else if (fileRoot && typeof fileRoot.getStream === 'function') {
674
+ stagingDisk = fileRoot;
675
+ }
676
+ else {
677
+ throw new Error(`${this.logHeader} updateDatastream requires fileRoot to be a disk name or an IDisk instance with getStream()`);
678
+ }
679
+ return FormsService.getFormByName(record.metaMetadata.form, true, record.metaMetadata.brandId).pipe((0, rxjs_2.mergeMap)(form => {
680
+ const formConfig = form;
681
+ const attachmentFields = _.get(formConfig, 'configuration.attachmentFields', _.get(formConfig, 'attachmentFields', []));
682
+ const reqs = [];
683
+ record.metaMetadata.attachmentFields = attachmentFields;
684
+ _.each(attachmentFields, async (attField) => {
685
+ const oldAttachments = record.metadata[attField];
686
+ const newAttachments = newMetadata[attField];
687
+ const removeIds = [];
688
+ if (!_.isUndefined(oldAttachments) && !_.isNull(oldAttachments) && !_.isNull(newAttachments)) {
689
+ const toRemove = _.differenceBy(oldAttachments, newAttachments, 'fileId');
690
+ _.each(toRemove, removeAtt => {
691
+ if (removeAtt.type == 'attachment') {
692
+ removeIds.push(new redbox_core_1.Datastream(removeAtt));
693
+ }
694
+ });
695
+ }
696
+ if (!_.isUndefined(newAttachments) && !_.isNull(newAttachments)) {
697
+ const toAdd = _.differenceBy(newAttachments, oldAttachments, 'fileId');
698
+ _.each(toAdd, addAtt => {
699
+ if (addAtt.type == 'attachment') {
700
+ fileIdsAdded.push(new redbox_core_1.Datastream(addAtt));
701
+ }
702
+ });
703
+ }
704
+ reqs.push(this.addAndRemoveDatastreams(oid, fileIdsAdded, removeIds, stagingDisk));
705
+ });
706
+ if (_.isEmpty(reqs)) {
707
+ reqs.push(Promise.resolve({ request: 'dummy' }));
708
+ }
709
+ return (0, rxjs_1.of)(reqs);
710
+ }));
711
+ }
712
+ async removeDatastream(oid, datastream) {
713
+ const fileId = datastream.fileId;
714
+ const fileName = `${oid}/${fileId}`;
715
+ const fileRes = await this.getFileWithName(fileName).toArray();
716
+ if (!_.isEmpty(fileRes)) {
717
+ const fileDoc = fileRes[0];
718
+ sails.log.verbose(`${this.logHeader} removeDatastream() -> Deleting:`);
719
+ sails.log.verbose(JSON.stringify(fileDoc));
720
+ try {
721
+ await this.gridFsBucket.delete(fileDoc._id);
722
+ }
723
+ catch (err) {
724
+ sails.log.error(`Error deleting: ${fileDoc._id}`);
725
+ sails.log.error(JSON.stringify(err));
726
+ }
727
+ sails.log.verbose(`${this.logHeader} removeDatastream() -> Delete successful.`);
728
+ }
729
+ else {
730
+ sails.log.verbose(`${this.logHeader} removeDatastream() -> File not found: ${fileName}`);
731
+ }
732
+ }
733
+ async addDatastream(oid, datastream, stagingDisk) {
734
+ const fileId = datastream.fileId;
735
+ sails.log.verbose(`${this.logHeader} addDatastream() -> Meta: ${fileId}`);
736
+ sails.log.verbose(JSON.stringify(datastream));
737
+ const metadata = _.merge(datastream.metadata, { redboxOid: oid });
738
+ const fileName = `${oid}/${fileId}`;
739
+ sails.log.verbose(`${this.logHeader} addDatastream() -> Adding: ${fileName}`);
740
+ const effectiveStagingDisk = stagingDisk ?? StorageManagerService.stagingDisk();
741
+ const readable = await effectiveStagingDisk.getStream(fileId);
742
+ await this.streamFileToBucket(readable, fileName, metadata);
743
+ sails.log.verbose(`${this.logHeader} addDatastream() -> Successfully added: ${fileName}`);
744
+ }
745
+ streamFileToBucket(readable, fileName, metadata) {
746
+ const uploadStream = this.gridFsBucket.openUploadStream(fileName, { metadata });
747
+ readable.pipe(uploadStream);
748
+ return new Promise((resolve, reject) => {
749
+ uploadStream.on('finish', () => {
750
+ resolve(uploadStream.gridFSFile);
751
+ });
752
+ uploadStream.on('error', err => {
753
+ sails.log.error(`${this.logHeader} streamFileToBucket() -> Failed uploading '${fileName}':`);
754
+ sails.log.error(err);
755
+ reject(err);
756
+ });
757
+ readable.on('error', err => {
758
+ sails.log.error(`${this.logHeader} streamFileToBucket() -> Failed reading source for '${fileName}':`);
759
+ sails.log.error(err);
760
+ reject(err);
761
+ });
762
+ });
763
+ }
764
+ async addAndRemoveDatastreams(oid, addIds, removeIds, stagingDisk) {
765
+ if (!stagingDisk) {
766
+ throw new Error('MongoStorageService.addAndRemoveDatastreams requires a staging disk');
767
+ }
768
+ for (const addId of addIds) {
769
+ await this.addDatastream(oid, addId, stagingDisk);
770
+ }
771
+ for (const removeId of removeIds) {
772
+ await this.removeDatastream(oid, removeId);
773
+ }
774
+ }
775
+ async getDatastream(oid, fileId) {
776
+ return this.getDatastreamAsync(oid, fileId);
777
+ }
778
+ async getDatastreamAsync(oid, fileId) {
779
+ const fileName = `${oid}/${fileId}`;
780
+ const fileRes = await this.getFileWithName(fileName).toArray();
781
+ if (_.isArray(fileRes) && fileRes.length === 0) {
782
+ throw new Error(TranslationService.t('attachment-not-found'));
783
+ }
784
+ const response = new redbox_core_1.Attachment();
785
+ response.readstream = this.gridFsBucket.openDownloadStreamByName(fileName);
786
+ return response;
787
+ }
788
+ async listDatastreams(oid, fileId) {
789
+ let query = { 'metadata.redboxOid': oid };
790
+ if (!_.isEmpty(fileId)) {
791
+ const fileName = `${oid}/${fileId}`;
792
+ query = { filename: fileName };
793
+ }
794
+ sails.log.verbose(`${this.logHeader} listDatastreams() -> Listing attachments of oid: ${oid}`);
795
+ sails.log.verbose(JSON.stringify(query));
796
+ return (await this.gridFsBucket.find(query, {}).toArray());
797
+ }
798
+ toJsonSafe(value) {
799
+ if (_.isUndefined(value)) {
800
+ return undefined;
801
+ }
802
+ if (_.isObject(value) && !_.isPlainObject(value) && !_.isArray(value)) {
803
+ return undefined;
804
+ }
805
+ try {
806
+ const json = JSON.stringify(value);
807
+ if (_.isUndefined(json)) {
808
+ return undefined;
809
+ }
810
+ return JSON.parse(json);
811
+ }
812
+ catch (_err) {
813
+ return undefined;
814
+ }
815
+ }
816
+ sanitizeRecordAudit(recordAudit) {
817
+ const payload = {
818
+ redboxOid: recordAudit.redboxOid,
819
+ action: recordAudit.action,
820
+ user: this.toJsonSafe(recordAudit.user),
821
+ record: this.toJsonSafe(recordAudit.record),
822
+ };
823
+ if (_.isUndefined(payload.user)) {
824
+ delete payload.user;
825
+ }
826
+ if (_.isUndefined(payload.record)) {
827
+ delete payload.record;
828
+ }
829
+ return payload;
830
+ }
831
+ async createRecordAudit(recordAudit) {
832
+ const response = new redbox_core_1.StorageServiceResponse();
833
+ const payload = this.sanitizeRecordAudit(recordAudit);
834
+ try {
835
+ sails.log.verbose(`${this.logHeader} Saving to DB...`);
836
+ const savedRecordAudit = await RecordAudit.create(payload);
837
+ response.oid = String(savedRecordAudit._id ?? '');
838
+ response.success = true;
839
+ sails.log.verbose(`${this.logHeader} Record Audit created...`);
840
+ }
841
+ catch (err) {
842
+ sails.log.error(`${this.logHeader} Failed to create Record Audit:`);
843
+ sails.log.error(JSON.stringify(err));
844
+ response.success = false;
845
+ response.message = this.getErrorMessage(err);
846
+ return response;
847
+ }
848
+ sails.log.verbose(JSON.stringify(response));
849
+ sails.log.verbose(`${this.logHeader} create() -> End`);
850
+ return response;
851
+ }
852
+ async getRecordAudit(params) {
853
+ const oid = params.oid;
854
+ const dateFrom = params.dateFrom;
855
+ const dateTo = params.dateTo;
856
+ if (_.isEmpty(oid)) {
857
+ const msg = `${this.logHeader} getMeta() -> refusing to search using an empty OID`;
858
+ sails.log.error(msg);
859
+ throw new Error(msg);
860
+ }
861
+ const criteria = { redboxOid: oid };
862
+ if (_.isDate(dateFrom)) {
863
+ criteria['createdAt'] = { ['>=']: dateFrom };
864
+ }
865
+ if (_.isDate(dateTo)) {
866
+ if (_.isUndefined(criteria['createdAt'])) {
867
+ criteria['createdAt'] = {};
868
+ }
869
+ criteria['createdAt']['<='] = dateTo;
870
+ sails.log.verbose(criteria);
871
+ }
872
+ sails.log.verbose(`${this.logHeader} finding: `);
873
+ sails.log.verbose(JSON.stringify(criteria));
874
+ return RecordAudit.find(criteria);
875
+ }
876
+ async restoreRecord(oid) {
877
+ const response = new redbox_core_1.StorageServiceResponse();
878
+ if (_.isEmpty(oid)) {
879
+ const msg = `${this.logHeader} restoreRecord() -> refusing to search using an empty OID`;
880
+ sails.log.error(msg);
881
+ throw new Error(msg);
882
+ }
883
+ try {
884
+ sails.log.verbose(`${this.logHeader} Restoring record ${oid} to DB...`);
885
+ const deletedRecord = await DeletedRecord.findOne({ redboxOid: oid });
886
+ delete deletedRecord.deletedRecordMetadata._id;
887
+ const record = await Record.create(deletedRecord.deletedRecordMetadata);
888
+ response.metadata = record;
889
+ await DeletedRecord.destroyOne({ redboxOid: oid });
890
+ response.success = true;
891
+ sails.log.verbose(`${this.logHeader} Record restored...`);
892
+ return response;
893
+ }
894
+ catch (err) {
895
+ sails.log.error(`${this.logHeader} Failed to create Record:`);
896
+ sails.log.error(JSON.stringify(err));
897
+ response.success = false;
898
+ response.message = this.getErrorMessage(err);
899
+ return response;
900
+ }
901
+ }
902
+ async destroyDeletedRecord(oid) {
903
+ const response = new redbox_core_1.StorageServiceResponse();
904
+ if (_.isEmpty(oid)) {
905
+ const msg = `${this.logHeader} destroyRecord() -> refusing to search using an empty OID`;
906
+ sails.log.error(msg);
907
+ throw new Error(msg);
908
+ }
909
+ try {
910
+ sails.log.verbose(`${this.logHeader} destroying deleted record ${oid} to DB...`);
911
+ await DeletedRecord.destroyOne({ redboxOid: oid });
912
+ response.success = true;
913
+ sails.log.verbose(`${this.logHeader} deleted record destroyed...`);
914
+ return response;
915
+ }
916
+ catch (err) {
917
+ sails.log.error(`${this.logHeader} Failed to create Record:`);
918
+ sails.log.error(JSON.stringify(err));
919
+ response.success = false;
920
+ response.message = this.getErrorMessage(err);
921
+ return response;
922
+ }
923
+ }
924
+ getFileWithName(fileName, options = { limit: 1 }) {
925
+ return this.gridFsBucket.find({ filename: fileName }, options);
926
+ }
927
+ async exists(oid) {
928
+ return (await Record.count({ redboxOid: oid })) > 0;
929
+ }
930
+ }
931
+ Services.MongoStorageService = MongoStorageService;
932
+ })(Services || (exports.Services = Services = {}));
933
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uZ29TdG9yYWdlU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9Nb25nb1N0b3JhZ2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFzRDtBQUN0RCwrQkFBZ0M7QUFDaEMsbUNBQW9DO0FBR3BDLGlDQUFpQztBQUVqQyxtQ0FBb0M7QUFFcEMsaUNBQWtDO0FBQ2xDLHVDQUFpRDtBQUNqRCw4REFlc0M7QUFDdEMsOERBQXFFO0FBRXJFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBVSxDQUFDO0FBb0IvQixJQUFpQixRQUFRLENBNGdDeEI7QUE1Z0NELFdBQWlCLFFBQVE7SUFDdkIsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUSxDQUFDLElBQUksQ0FBQyxPQUFPO1FBQzVELFlBQVksQ0FBd0I7UUFDcEMsRUFBRSxDQUFNO1FBQ1IsU0FBUyxDQUFtQztRQUM1QyxnQkFBZ0IsQ0FBbUM7UUFDM0Msb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBRTNCLGdCQUFnQixHQUFhO1lBQ3JDLE1BQU07WUFDTixRQUFRO1lBQ1IsWUFBWTtZQUNaLFNBQVM7WUFDVCxhQUFhO1lBQ2IseUNBQXlDO1lBQ3pDLG1CQUFtQjtZQUNuQixRQUFRO1lBQ1IsdUJBQXVCO1lBQ3ZCLFlBQVk7WUFDWixlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLG1CQUFtQjtZQUNuQixnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLGtCQUFrQjtZQUNsQixrQkFBa0I7WUFDbEIsZUFBZTtZQUNmLHlCQUF5QjtZQUN6QixlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLG1CQUFtQjtZQUNuQixnQkFBZ0I7WUFDaEIsUUFBUTtTQUNULENBQUM7UUFFRjtZQUNFLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztZQUN6QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixD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