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