@researchdatabox/sails-hook-redbox-storage-mongo 5.0.3 → 5.0.4-beta.12498
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 +41 -0
- package/dist/config/storage.d.ts +52 -0
- package/dist/config/storage.js +18 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/dist/migrations/index.d.ts +5 -0
- package/dist/migrations/index.js +26 -0
- package/dist/migrations/recordRevisionBackfill.d.ts +26 -0
- package/dist/migrations/recordRevisionBackfill.js +115 -0
- package/dist/models/DeletedRecord.d.ts +8 -0
- package/dist/models/DeletedRecord.js +55 -1
- package/dist/models/Record.d.ts +5 -0
- package/dist/models/Record.js +43 -1
- package/dist/models/RecordAudit.d.ts +2 -0
- package/dist/models/RecordAudit.js +11 -1
- package/dist/models/RecordSchemaArtifact.d.ts +14 -0
- package/dist/models/RecordSchemaArtifact.js +75 -0
- package/dist/models/RecordSchemaReference.d.ts +25 -0
- package/dist/models/RecordSchemaReference.js +128 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.js +7 -1
- package/dist/services/MongoStorageService.d.ts +174 -11
- package/dist/services/MongoStorageService.js +1683 -199
- package/dist/services/recordSchemaPersistence.d.ts +27 -0
- package/dist/services/recordSchemaPersistence.js +258 -0
- package/package.json +4 -3
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Services = void 0;
|
|
3
|
+
exports.Services = exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS = exports.RECORD_SCHEMA_REFERENCE_INDEXES = exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY = exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_NAME = exports.RECORD_SCHEMA_ARTIFACT_INDEXES = void 0;
|
|
4
4
|
const rxjs_1 = require("rxjs");
|
|
5
5
|
const rxjs_2 = require("rxjs");
|
|
6
6
|
const crypto_1 = require("crypto");
|
|
7
|
+
const node_util_1 = require("node:util");
|
|
7
8
|
const luxon_1 = require("luxon");
|
|
8
9
|
const mongodb = require("mongodb");
|
|
9
10
|
const stream = require("node:stream");
|
|
@@ -12,6 +13,8 @@ const json2csv_1 = require("json2csv");
|
|
|
12
13
|
const redbox_core_1 = require("@researchdatabox/redbox-core");
|
|
13
14
|
const redbox_core_2 = require("@researchdatabox/redbox-core");
|
|
14
15
|
const redbox_core_3 = require("@researchdatabox/redbox-core");
|
|
16
|
+
const RecordSchemaReference_1 = require("../models/RecordSchemaReference");
|
|
17
|
+
const recordSchemaPersistence_1 = require("./recordSchemaPersistence");
|
|
15
18
|
const { flatten } = json2csv_1.transforms;
|
|
16
19
|
const UTF8_BOM = '\uFEFF';
|
|
17
20
|
const CSV_DANGEROUS_PREFIX = /^[=+\-@\t\r\n]/;
|
|
@@ -36,6 +39,112 @@ function sanitizeCsvRecord(record) {
|
|
|
36
39
|
}
|
|
37
40
|
return sanitized;
|
|
38
41
|
}
|
|
42
|
+
const RECORD_IDENTITY_COLLECTION = 'recordidentity';
|
|
43
|
+
exports.RECORD_SCHEMA_ARTIFACT_INDEXES = [
|
|
44
|
+
{
|
|
45
|
+
key: { digest: 1 },
|
|
46
|
+
// Match the index Sails Mongo creates for `@Attr({ unique: true })` so
|
|
47
|
+
// native readiness initialization is idempotent after Waterline setup.
|
|
48
|
+
name: 'digest_1',
|
|
49
|
+
unique: true,
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_NAME = 'record_schema_reference_authorization_cursor_lookup';
|
|
53
|
+
exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY = {
|
|
54
|
+
digest: 1,
|
|
55
|
+
kind: 1,
|
|
56
|
+
brand: 1,
|
|
57
|
+
portal: 1,
|
|
58
|
+
schemaKind: 1,
|
|
59
|
+
recordType: 1,
|
|
60
|
+
operation: 1,
|
|
61
|
+
referenceKey: 1,
|
|
62
|
+
};
|
|
63
|
+
exports.RECORD_SCHEMA_REFERENCE_INDEXES = [
|
|
64
|
+
{
|
|
65
|
+
key: { referenceKey: 1 },
|
|
66
|
+
name: 'referenceKey_1',
|
|
67
|
+
unique: true,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
key: { digest: 1, kind: 1 },
|
|
71
|
+
name: 'record_schema_reference_digest_kind',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
key: { digest: 1, kind: 1, brand: 1, portal: 1, referenceKey: 1 },
|
|
75
|
+
name: 'record_schema_reference_grant_lookup',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
key: { digest: 1, kind: 1, brand: 1, portal: 1, schemaKind: 1, recordType: 1, operation: 1, oid: 1 },
|
|
79
|
+
name: 'record_schema_reference_authorization_lookup',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
key: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY,
|
|
83
|
+
name: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_NAME,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
key: { oid: 1, kind: 1 },
|
|
87
|
+
name: 'record_schema_reference_oid_kind',
|
|
88
|
+
sparse: true,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
key: { kind: 1, expiresAt: 1 },
|
|
92
|
+
name: 'record_schema_reference_pin_expiry',
|
|
93
|
+
partialFilterExpression: { kind: 'pin' },
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
/**
|
|
97
|
+
* Authorization lookups fail as unavailable instead of consuming an
|
|
98
|
+
* unbounded database work budget. This is a time/availability boundary, not
|
|
99
|
+
* a result cap: a query that cannot complete is never reported as a denial.
|
|
100
|
+
*/
|
|
101
|
+
exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS = 1_000;
|
|
102
|
+
const PERSISTENT_INDEX_BOOLEAN_OPTIONS = ['unique', 'sparse', 'hidden'];
|
|
103
|
+
const PERSISTENT_INDEX_VALUE_OPTIONS = [
|
|
104
|
+
'partialFilterExpression',
|
|
105
|
+
'expireAfterSeconds',
|
|
106
|
+
'storageEngine',
|
|
107
|
+
'weights',
|
|
108
|
+
'default_language',
|
|
109
|
+
'language_override',
|
|
110
|
+
'textIndexVersion',
|
|
111
|
+
'2dsphereIndexVersion',
|
|
112
|
+
'bits',
|
|
113
|
+
'min',
|
|
114
|
+
'max',
|
|
115
|
+
'bucketSize',
|
|
116
|
+
'wildcardProjection',
|
|
117
|
+
'collation',
|
|
118
|
+
];
|
|
119
|
+
function indexKeyEntries(key) {
|
|
120
|
+
if (key instanceof Map)
|
|
121
|
+
return [...key.entries()];
|
|
122
|
+
return Object.keys(key).map(name => [name, key[name]]);
|
|
123
|
+
}
|
|
124
|
+
function indexKeysEqual(existing, required) {
|
|
125
|
+
return (0, node_util_1.isDeepStrictEqual)(indexKeyEntries(existing.key), indexKeyEntries(required.key));
|
|
126
|
+
}
|
|
127
|
+
function indexOptionsEqual(existing, required) {
|
|
128
|
+
for (const option of PERSISTENT_INDEX_BOOLEAN_OPTIONS) {
|
|
129
|
+
if (Boolean(existing[option]) !== Boolean(required[option]))
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
return PERSISTENT_INDEX_VALUE_OPTIONS.every(option => {
|
|
133
|
+
if (option === 'collation') {
|
|
134
|
+
// MongoDB 9 reports the default simple collation explicitly; earlier versions omit it.
|
|
135
|
+
return (0, node_util_1.isDeepStrictEqual)(existing.collation ?? { locale: 'simple' }, required.collation ?? { locale: 'simple' });
|
|
136
|
+
}
|
|
137
|
+
return (0, node_util_1.isDeepStrictEqual)(existing[option], required[option]);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function indexDisplayName(index) {
|
|
141
|
+
return typeof index.name === 'string' && index.name.trim() !== '' ? index.name : '<unnamed>';
|
|
142
|
+
}
|
|
143
|
+
function isMongoNamespaceNotFoundError(error) {
|
|
144
|
+
if (!(error instanceof Error))
|
|
145
|
+
return false;
|
|
146
|
+
return ('code' in error && error.code === 26) || ('codeName' in error && error.codeName === 'NamespaceNotFound');
|
|
147
|
+
}
|
|
39
148
|
var Services;
|
|
40
149
|
(function (Services) {
|
|
41
150
|
class MongoStorageService extends redbox_core_1.Services.Core.Service {
|
|
@@ -43,11 +152,24 @@ var Services;
|
|
|
43
152
|
db;
|
|
44
153
|
recordCol;
|
|
45
154
|
deletedRecordCol;
|
|
155
|
+
recordIdentityCol;
|
|
156
|
+
recordSchemaArtifactCol;
|
|
157
|
+
recordSchemaReferenceCol;
|
|
46
158
|
_readyHookRegistered = false;
|
|
159
|
+
_requiredIndicesReady = false;
|
|
160
|
+
_initializationPromise;
|
|
47
161
|
_exportedMethods = [
|
|
48
162
|
'init',
|
|
49
163
|
'create',
|
|
50
164
|
'updateMeta',
|
|
165
|
+
'getCapabilities',
|
|
166
|
+
'removeActiveRecord',
|
|
167
|
+
'createTombstone',
|
|
168
|
+
'updateTombstone',
|
|
169
|
+
'removeTombstone',
|
|
170
|
+
'createActiveRecordFromTombstone',
|
|
171
|
+
'getTombstone',
|
|
172
|
+
'getLifecycleTombstones',
|
|
51
173
|
'getMeta',
|
|
52
174
|
'createBatch',
|
|
53
175
|
'provideUserAccessAndRemovePendingAccess',
|
|
@@ -63,6 +185,7 @@ var Services;
|
|
|
63
185
|
'addDatastreams',
|
|
64
186
|
'updateDatastream',
|
|
65
187
|
'removeDatastream',
|
|
188
|
+
'removeStagedDatastream',
|
|
66
189
|
'addDatastream',
|
|
67
190
|
'addAndRemoveDatastreams',
|
|
68
191
|
'getDatastream',
|
|
@@ -72,6 +195,13 @@ var Services;
|
|
|
72
195
|
'getRecordAudit',
|
|
73
196
|
'getIntegrationAudit',
|
|
74
197
|
'countIntegrationAudit',
|
|
198
|
+
'putRecordSchemaArtifact',
|
|
199
|
+
'getRecordSchemaArtifact',
|
|
200
|
+
'listRecordSchemaArtifacts',
|
|
201
|
+
'touchRecordSchemaArtifact',
|
|
202
|
+
'putRecordSchemaReference',
|
|
203
|
+
'findRecordSchemaGrantForAuthorization',
|
|
204
|
+
'listRecordSchemaReferences',
|
|
75
205
|
'exists',
|
|
76
206
|
];
|
|
77
207
|
constructor() {
|
|
@@ -85,9 +215,7 @@ var Services;
|
|
|
85
215
|
getErrorMessage(err) {
|
|
86
216
|
if (err instanceof Error) {
|
|
87
217
|
const messageParts = [err.message];
|
|
88
|
-
const causeMessage = err.cause instanceof Error
|
|
89
|
-
? err.cause.message
|
|
90
|
-
: (typeof err.cause === 'string' ? err.cause : undefined);
|
|
218
|
+
const causeMessage = err.cause instanceof Error ? err.cause.message : typeof err.cause === 'string' ? err.cause : undefined;
|
|
91
219
|
if (causeMessage != null && causeMessage !== '' && causeMessage !== err.message) {
|
|
92
220
|
messageParts.push(`Cause: ${causeMessage}`);
|
|
93
221
|
}
|
|
@@ -95,9 +223,442 @@ var Services;
|
|
|
95
223
|
}
|
|
96
224
|
return String(err);
|
|
97
225
|
}
|
|
98
|
-
|
|
226
|
+
classifyStorageInitializationError(err) {
|
|
227
|
+
if (err instanceof recordSchemaPersistence_1.RecordSchemaPersistenceError)
|
|
228
|
+
return 'record-schema-persistence-error';
|
|
229
|
+
if (err instanceof mongodb.MongoNetworkError)
|
|
230
|
+
return 'mongo-network-error';
|
|
231
|
+
if (err instanceof mongodb.MongoError)
|
|
232
|
+
return 'mongo-driver-error';
|
|
233
|
+
return err instanceof Error ? 'unexpected-error' : 'non-error';
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Resolve the native driver collection behind a Waterline model. Strict
|
|
237
|
+
* concurrency needs `findOneAndUpdate`/`findOneAndDelete` facts that
|
|
238
|
+
* Waterline cannot certify, so the compare-and-set paths talk to the
|
|
239
|
+
* driver directly. Discovery never throws: an adapter that cannot supply a
|
|
240
|
+
* native collection is simply unsupported.
|
|
241
|
+
*/
|
|
242
|
+
getNativeCollection(model, cacheKey) {
|
|
243
|
+
const cached = this[cacheKey];
|
|
244
|
+
if (cached)
|
|
245
|
+
return cached;
|
|
246
|
+
try {
|
|
247
|
+
const manager = model.getDatastore()?.manager;
|
|
248
|
+
if (manager && typeof manager.collection === 'function') {
|
|
249
|
+
this.db = manager;
|
|
250
|
+
this[cacheKey] = manager.collection(model.tableName);
|
|
251
|
+
return this[cacheKey];
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Capability discovery is deliberately non-throwing and fail-closed.
|
|
256
|
+
}
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
getNativeRecordCollection() {
|
|
260
|
+
return this.getNativeCollection(Record, 'recordCol');
|
|
261
|
+
}
|
|
262
|
+
getNativeTombstoneCollection() {
|
|
263
|
+
return this.getNativeCollection(DeletedRecord, 'deletedRecordCol');
|
|
264
|
+
}
|
|
265
|
+
getNativeRecordIdentityCollection() {
|
|
266
|
+
if (this.recordIdentityCol)
|
|
267
|
+
return this.recordIdentityCol;
|
|
268
|
+
try {
|
|
269
|
+
const manager = (this.db ?? Record.getDatastore()?.manager);
|
|
270
|
+
if (manager && typeof manager.collection === 'function') {
|
|
271
|
+
this.db = manager;
|
|
272
|
+
this.recordIdentityCol = manager.collection(RECORD_IDENTITY_COLLECTION);
|
|
273
|
+
return this.recordIdentityCol;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// Capability discovery is deliberately non-throwing and fail-closed.
|
|
278
|
+
}
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
supportsAtomicMutation(collection) {
|
|
282
|
+
return (typeof collection?.findOneAndUpdate === 'function' &&
|
|
283
|
+
typeof collection?.findOneAndDelete === 'function' &&
|
|
284
|
+
typeof collection?.findOne === 'function');
|
|
285
|
+
}
|
|
286
|
+
getCapabilities() {
|
|
287
|
+
const supported = this._requiredIndicesReady &&
|
|
288
|
+
this.supportsAtomicMutation(this.getNativeRecordCollection()) &&
|
|
289
|
+
this.supportsAtomicMutation(this.getNativeTombstoneCollection()) &&
|
|
290
|
+
typeof this.getNativeRecordIdentityCollection()?.findOne === 'function' &&
|
|
291
|
+
typeof this.getNativeRecordIdentityCollection()?.insertOne === 'function' &&
|
|
292
|
+
typeof this.getNativeRecordIdentityCollection()?.deleteOne === 'function' &&
|
|
293
|
+
typeof this.getNativeRecordCollection()?.insertOne === 'function' &&
|
|
294
|
+
typeof this.getNativeTombstoneCollection()?.insertOne === 'function' &&
|
|
295
|
+
typeof this.getNativeTombstoneCollection()?.find === 'function';
|
|
296
|
+
return supported ? { recordConcurrency: redbox_core_1.RECORD_STORAGE_CONCURRENCY_CAPABILITY_VERSION } : {};
|
|
297
|
+
}
|
|
298
|
+
createMutationResponse(oid, options) {
|
|
299
|
+
const response = new redbox_core_1.StorageMutationResponse();
|
|
300
|
+
response.oid = oid;
|
|
301
|
+
if ((0, redbox_core_1.isCanonicalSaveRequestId)(options?.requestId))
|
|
302
|
+
response.requestId = options.requestId;
|
|
303
|
+
if ((0, redbox_core_1.isRecordConcurrencyResolution)(options?.resolution))
|
|
304
|
+
response.resolution = options.resolution;
|
|
305
|
+
return response;
|
|
306
|
+
}
|
|
307
|
+
notApplied(response, reason, message = 'Record mutation was not applied') {
|
|
308
|
+
response.success = false;
|
|
309
|
+
response.applicationState = 'not-applied';
|
|
310
|
+
response.nonApplicationReason = reason;
|
|
311
|
+
response.message = message;
|
|
312
|
+
return response;
|
|
313
|
+
}
|
|
314
|
+
unknownMutation(response, message) {
|
|
315
|
+
response.success = false;
|
|
316
|
+
response.applicationState = 'unknown';
|
|
317
|
+
response.message = message;
|
|
318
|
+
return response;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Normalize the caller's precondition. Returning `null` means the response
|
|
322
|
+
* already carries a certified non-application: a malformed precondition is
|
|
323
|
+
* a caller defect, and answering it with a definite no-write is safer than
|
|
324
|
+
* guessing which revision was meant.
|
|
325
|
+
*/
|
|
326
|
+
expectedRevision(options, response) {
|
|
327
|
+
const precondition = options?.precondition;
|
|
328
|
+
if (!precondition)
|
|
329
|
+
return undefined;
|
|
330
|
+
const { expectedRevision, requireRevision } = precondition;
|
|
331
|
+
if (typeof requireRevision !== 'boolean' ||
|
|
332
|
+
(expectedRevision === undefined ? requireRevision : !(0, redbox_core_1.isRecordRevision)(expectedRevision))) {
|
|
333
|
+
sails.log.error(`${this.logHeader} refusing a mutation for oid ${response.oid}: the supplied revision precondition is invalid`);
|
|
334
|
+
this.notApplied(response, 'capability-unavailable', 'A valid record revision is required');
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
return expectedRevision;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* The lazy compatibility clause matches only a genuinely absent revision.
|
|
341
|
+
* An explicit null is corrupt state: `$inc` cannot advance it and must not
|
|
342
|
+
* be made to look like a safe first revision.
|
|
343
|
+
*/
|
|
344
|
+
revisionSelector(expectedRevision) {
|
|
345
|
+
if (expectedRevision === redbox_core_1.INITIAL_RECORD_REVISION) {
|
|
346
|
+
// Atomic lazy compatibility for a legacy record that escaped the
|
|
347
|
+
// single-lift migration. The winning $inc makes a second match fail.
|
|
348
|
+
return { $or: [{ revision: redbox_core_1.INITIAL_RECORD_REVISION }, { revision: { $exists: false } }] };
|
|
349
|
+
}
|
|
350
|
+
if (expectedRevision !== undefined)
|
|
351
|
+
return { revision: expectedRevision };
|
|
352
|
+
// Tokenless compatibility: match anything that can still be advanced.
|
|
353
|
+
return { $or: [{ revision: { $lt: Number.MAX_SAFE_INTEGER } }, { revision: { $exists: false } }] };
|
|
354
|
+
}
|
|
355
|
+
mutationSelector(identity, expectedRevision) {
|
|
356
|
+
return { $and: [identity, this.revisionSelector(expectedRevision)] };
|
|
357
|
+
}
|
|
358
|
+
lifecycleMutationSelector(identity, expectedRevision, options) {
|
|
359
|
+
const selector = this.mutationSelector(identity, expectedRevision);
|
|
360
|
+
const predicates = selector.$and;
|
|
361
|
+
if (options?.lifecycle?.expectedState) {
|
|
362
|
+
predicates.push({ lifecycleState: options.lifecycle.expectedState });
|
|
363
|
+
}
|
|
364
|
+
if (options?.lifecycle?.operationId) {
|
|
365
|
+
predicates.push({ 'lifecycleOperation.operationId': options.lifecycle.operationId });
|
|
366
|
+
}
|
|
367
|
+
return selector;
|
|
368
|
+
}
|
|
369
|
+
isDuplicateKeyError(error) {
|
|
370
|
+
return Boolean(error && typeof error === 'object' && Number(error.code) === 11000);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Whether the driver fact proves that `insertOne` did not commit. Local
|
|
374
|
+
* argument rejection and a server command error without retry/write-
|
|
375
|
+
* concern ambiguity are definitive. Network, selection, timeout, and
|
|
376
|
+
* write-concern failures retain the reservation for later reconciliation.
|
|
377
|
+
*/
|
|
378
|
+
isCertifiedCreateNonApplication(error) {
|
|
379
|
+
if (error instanceof mongodb.MongoInvalidArgumentError)
|
|
380
|
+
return true;
|
|
381
|
+
if (!(error instanceof mongodb.MongoServerError) || error instanceof mongodb.MongoWriteConcernError) {
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
const serverError = error;
|
|
385
|
+
if (serverError.writeConcernError)
|
|
386
|
+
return false;
|
|
387
|
+
if (serverError.hasErrorLabel?.('RetryableWriteError'))
|
|
388
|
+
return false;
|
|
389
|
+
if (serverError.hasErrorLabel?.('UnknownTransactionCommitResult'))
|
|
390
|
+
return false;
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
storedIncarnationId(record) {
|
|
394
|
+
const value = String(record?.incarnationId ?? '').trim();
|
|
395
|
+
return (0, redbox_core_1.isCanonicalSaveRequestId)(value) ? value : undefined;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Establish the permanent OID owner for a state that already exists. The
|
|
399
|
+
* ledger outlives active records and tombstones, so purge cannot reopen a
|
|
400
|
+
* revision-zero alias. Duplicate insertion is an ordinary concurrent
|
|
401
|
+
* winner; its durable identity is re-read and adopted.
|
|
402
|
+
*/
|
|
403
|
+
async ensureRecordIdentity(oid, source) {
|
|
404
|
+
const identities = this.getNativeRecordIdentityCollection();
|
|
405
|
+
if (typeof identities?.findOne !== 'function' || typeof identities?.insertOne !== 'function')
|
|
406
|
+
return undefined;
|
|
407
|
+
const existing = this.mutationDocument(await identities.findOne({ redboxOid: oid }));
|
|
408
|
+
if (existing === undefined)
|
|
409
|
+
return undefined;
|
|
410
|
+
const existingId = this.storedIncarnationId(existing);
|
|
411
|
+
if (existing !== null)
|
|
412
|
+
return existingId;
|
|
413
|
+
const incarnationId = this.storedIncarnationId(source) ?? (0, crypto_1.randomUUID)();
|
|
414
|
+
try {
|
|
415
|
+
await identities.insertOne({ redboxOid: oid, incarnationId, createdAt: new Date().toISOString() });
|
|
416
|
+
return incarnationId;
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
if (!this.isDuplicateKeyError(error))
|
|
420
|
+
return undefined;
|
|
421
|
+
const winner = this.mutationDocument(await identities.findOne({ redboxOid: oid }));
|
|
422
|
+
return winner === undefined ? undefined : this.storedIncarnationId(winner);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/** Claim a never-before-used OID. Any durable owner or active/tombstone state is a collision. */
|
|
426
|
+
async claimNewRecordIdentity(oid) {
|
|
427
|
+
const identities = this.getNativeRecordIdentityCollection();
|
|
428
|
+
if (typeof identities?.findOne !== 'function' ||
|
|
429
|
+
typeof identities?.insertOne !== 'function' ||
|
|
430
|
+
typeof identities?.deleteOne !== 'function')
|
|
431
|
+
return undefined;
|
|
432
|
+
const existingOwner = this.mutationDocument(await identities.findOne({ redboxOid: oid }));
|
|
433
|
+
if (existingOwner === undefined)
|
|
434
|
+
return undefined;
|
|
435
|
+
if (existingOwner !== null)
|
|
436
|
+
return { collision: true };
|
|
437
|
+
// Legacy state may predate the ledger. Seed its owner before returning a
|
|
438
|
+
// collision so a concurrent purge cannot make the OID reusable.
|
|
439
|
+
const current = await this.readCurrentState(oid);
|
|
440
|
+
if (!current)
|
|
441
|
+
return undefined;
|
|
442
|
+
const existingState = current.active ?? current.tombstone;
|
|
443
|
+
if (existingState) {
|
|
444
|
+
return (await this.ensureRecordIdentity(oid, existingState)) ? { collision: true } : undefined;
|
|
445
|
+
}
|
|
446
|
+
const incarnationId = (0, crypto_1.randomUUID)();
|
|
447
|
+
try {
|
|
448
|
+
await identities.insertOne({ redboxOid: oid, incarnationId, createdAt: new Date().toISOString() });
|
|
449
|
+
return { incarnationId };
|
|
450
|
+
}
|
|
451
|
+
catch (error) {
|
|
452
|
+
return this.isDuplicateKeyError(error) ? { collision: true } : undefined;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Compensate an ownership claim this call made but never used.
|
|
457
|
+
*
|
|
458
|
+
* The ledger is otherwise permanent, and deliberately so: a purge must not
|
|
459
|
+
* let an old revision-zero tag alias a recreated incarnation. Releasing is
|
|
460
|
+
* only safe — and only necessary — for a row that still carries the
|
|
461
|
+
* incarnation this call minted and that no active record or tombstone
|
|
462
|
+
* refers to. That is exactly the state a create leaves behind when its
|
|
463
|
+
* insert never reached the collection, and without this the caller-selected
|
|
464
|
+
* OID would be permanently unusable with no operator recovery path. While
|
|
465
|
+
* this row exists its unique index prevents another ordinary create from
|
|
466
|
+
* becoming owner; the exact incarnation selector also cannot remove a row
|
|
467
|
+
* replaced during an operator recovery race.
|
|
468
|
+
*/
|
|
469
|
+
async releaseUnusedRecordIdentity(oid, incarnationId) {
|
|
470
|
+
const identities = this.getNativeRecordIdentityCollection();
|
|
471
|
+
if (typeof identities?.deleteOne !== 'function')
|
|
472
|
+
return;
|
|
473
|
+
try {
|
|
474
|
+
const current = await this.readCurrentState(oid);
|
|
475
|
+
// Unobservable or still-owned state keeps the claim: a permanent row is
|
|
476
|
+
// always safer than one released while something still refers to it.
|
|
477
|
+
if (!current || current.active || current.tombstone)
|
|
478
|
+
return;
|
|
479
|
+
await identities.deleteOne({ redboxOid: oid, incarnationId });
|
|
480
|
+
}
|
|
481
|
+
catch {
|
|
482
|
+
sails.log.error(`${this.logHeader} record_identity_reservation_release_failed`, {
|
|
483
|
+
event: 'record_identity_reservation_release_failed',
|
|
484
|
+
outcome: 'unknown',
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Interpret a `findOneAndUpdate`/`findOneAndDelete` result issued with
|
|
490
|
+
* `includeResultMetadata: false`: `null` is a certified no-match and a
|
|
491
|
+
* document is the committed state. Anything else is an unrecognized driver
|
|
492
|
+
* fact that must stay `unknown` rather than being certified either way.
|
|
493
|
+
*/
|
|
494
|
+
mutationDocument(result) {
|
|
495
|
+
if (result === null)
|
|
496
|
+
return null;
|
|
497
|
+
if (result === undefined)
|
|
498
|
+
return undefined;
|
|
499
|
+
if (typeof result !== 'object' || Array.isArray(result))
|
|
500
|
+
return undefined;
|
|
501
|
+
return result;
|
|
502
|
+
}
|
|
503
|
+
committed(response, document, kind, expectedRevision) {
|
|
504
|
+
// A removal returns the pre-removal document, which may predate the
|
|
505
|
+
// revision backfill; an update always returns the incremented value.
|
|
506
|
+
const normalizedRevision = (0, redbox_core_1.isRecordRevision)(document.revision)
|
|
507
|
+
? document.revision
|
|
508
|
+
: document.revision == null && kind === 'removed'
|
|
509
|
+
? redbox_core_1.INITIAL_RECORD_REVISION
|
|
510
|
+
: undefined;
|
|
511
|
+
if (normalizedRevision === undefined) {
|
|
512
|
+
return this.unknownMutation(response, 'Storage returned an invalid committed revision');
|
|
513
|
+
}
|
|
514
|
+
const expectedCommittedRevision = expectedRevision === undefined
|
|
515
|
+
? undefined
|
|
516
|
+
: kind === 'updated'
|
|
517
|
+
? (0, redbox_core_1.nextRecordRevision)(expectedRevision)
|
|
518
|
+
: expectedRevision;
|
|
519
|
+
if (expectedCommittedRevision !== undefined && normalizedRevision !== expectedCommittedRevision) {
|
|
520
|
+
return this.unknownMutation(response, 'Storage returned an inconsistent committed revision');
|
|
521
|
+
}
|
|
522
|
+
const normalized = { ...document, revision: normalizedRevision };
|
|
523
|
+
response.success = true;
|
|
524
|
+
response.applicationState = 'applied';
|
|
525
|
+
response.committedRevision = normalizedRevision;
|
|
526
|
+
if (kind === 'removed')
|
|
527
|
+
response.removedRecord = normalized;
|
|
528
|
+
else
|
|
529
|
+
response.committedRecord = normalized;
|
|
530
|
+
return response;
|
|
531
|
+
}
|
|
532
|
+
brandIdOf(brand) {
|
|
533
|
+
return String(brand?.id ?? '').trim();
|
|
534
|
+
}
|
|
535
|
+
activeIdentity(brand, oid) {
|
|
536
|
+
const brandId = this.brandIdOf(brand);
|
|
537
|
+
return brandId ? { redboxOid: oid, 'metaMetadata.brandId': brandId } : { redboxOid: oid };
|
|
538
|
+
}
|
|
539
|
+
tombstoneIdentity(brand, oid) {
|
|
540
|
+
const brandId = this.brandIdOf(brand);
|
|
541
|
+
// Tombstones written before the lifecycle wrapper existed only carry the
|
|
542
|
+
// brand inside the embedded snapshot. A present wrapper brand remains
|
|
543
|
+
// authoritative: an inconsistent snapshot must never widen brand scope.
|
|
544
|
+
return brandId
|
|
545
|
+
? {
|
|
546
|
+
redboxOid: oid,
|
|
547
|
+
$or: [
|
|
548
|
+
{ brandId },
|
|
549
|
+
{
|
|
550
|
+
$and: [{ brandId: { $exists: false } }, { 'deletedRecordMetadata.metaMetadata.brandId': brandId }],
|
|
551
|
+
},
|
|
552
|
+
],
|
|
553
|
+
}
|
|
554
|
+
: { redboxOid: oid };
|
|
555
|
+
}
|
|
556
|
+
static BRAND_ID_PATHS = [
|
|
557
|
+
'brandId',
|
|
558
|
+
'metaMetadata.brandId',
|
|
559
|
+
'deletedRecordMetadata.metaMetadata.brandId',
|
|
560
|
+
];
|
|
561
|
+
storedBrandId(record) {
|
|
562
|
+
for (const path of MongoStorageService.BRAND_ID_PATHS) {
|
|
563
|
+
const brandId = String(_.get(record, path, '') ?? '').trim();
|
|
564
|
+
if (brandId)
|
|
565
|
+
return brandId;
|
|
566
|
+
}
|
|
567
|
+
return '';
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Reject candidate keys the driver would read as update operators or
|
|
571
|
+
* dotted paths. Waterline rejected them before the compare-and-set paths
|
|
572
|
+
* started building `$set` documents directly, and honouring them would let
|
|
573
|
+
* a candidate reach fields — such as the stored brand — that the explicit
|
|
574
|
+
* checks above deliberately guard.
|
|
575
|
+
*/
|
|
576
|
+
unsafeCandidateField(candidate) {
|
|
577
|
+
return Object.keys(candidate).find(key => key.startsWith('$') || key.includes('.'));
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Read the current state behind a certified no-match so the caller can be
|
|
581
|
+
* told why nothing was written. Cross-brand state is never returned: the
|
|
582
|
+
* reason alone is bounded, and callers outside the brand map it onto the
|
|
583
|
+
* same not-found answer an absent record produces.
|
|
584
|
+
*/
|
|
585
|
+
async readCurrentState(oid) {
|
|
586
|
+
const records = this.getNativeRecordCollection();
|
|
587
|
+
const tombstones = this.getNativeTombstoneCollection();
|
|
588
|
+
if (typeof records?.findOne !== 'function' || typeof tombstones?.findOne !== 'function') {
|
|
589
|
+
return undefined;
|
|
590
|
+
}
|
|
591
|
+
const [activeResult, tombstoneResult] = await Promise.all([
|
|
592
|
+
records.findOne({ redboxOid: oid }),
|
|
593
|
+
tombstones.findOne({ redboxOid: oid }),
|
|
594
|
+
]);
|
|
595
|
+
const active = this.mutationDocument(activeResult);
|
|
596
|
+
const tombstone = this.mutationDocument(tombstoneResult);
|
|
597
|
+
if (active === undefined || tombstone === undefined)
|
|
598
|
+
return undefined;
|
|
599
|
+
return { active, tombstone };
|
|
600
|
+
}
|
|
601
|
+
isRequestedBrand(record, requestedBrandId) {
|
|
602
|
+
return record !== null && (!requestedBrandId || this.storedBrandId(record) === requestedBrandId);
|
|
603
|
+
}
|
|
604
|
+
async classifyActiveNoMatch(brand, oid, expectedRevision) {
|
|
605
|
+
const current = await this.readCurrentState(oid);
|
|
606
|
+
if (!current)
|
|
607
|
+
return 'capability-unavailable';
|
|
608
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
609
|
+
if (current.active) {
|
|
610
|
+
if (!this.isRequestedBrand(current.active, requestedBrandId))
|
|
611
|
+
return 'brand-mismatch';
|
|
612
|
+
// A tokenless selector matches every advanceable revision, so a
|
|
613
|
+
// present in-brand record that still did not match cannot be advanced.
|
|
614
|
+
return expectedRevision !== undefined ? 'stale-revision' : 'capability-unavailable';
|
|
615
|
+
}
|
|
616
|
+
if (this.isRequestedBrand(current.tombstone, requestedBrandId))
|
|
617
|
+
return 'deleted';
|
|
618
|
+
return 'not-found';
|
|
619
|
+
}
|
|
620
|
+
async classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options) {
|
|
621
|
+
const current = await this.readCurrentState(oid);
|
|
622
|
+
if (!current)
|
|
623
|
+
return 'capability-unavailable';
|
|
624
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
625
|
+
if (current.tombstone) {
|
|
626
|
+
if (!this.isRequestedBrand(current.tombstone, requestedBrandId))
|
|
627
|
+
return 'brand-mismatch';
|
|
628
|
+
const currentRevision = (0, redbox_core_1.isRecordRevision)(current.tombstone.revision)
|
|
629
|
+
? current.tombstone.revision
|
|
630
|
+
: redbox_core_1.INITIAL_RECORD_REVISION;
|
|
631
|
+
if (expectedRevision !== undefined && currentRevision !== expectedRevision)
|
|
632
|
+
return 'stale-revision';
|
|
633
|
+
if ((options?.lifecycle?.expectedState && current.tombstone.lifecycleState !== options.lifecycle.expectedState) ||
|
|
634
|
+
(options?.lifecycle?.operationId &&
|
|
635
|
+
_.get(current.tombstone, 'lifecycleOperation.operationId') !== options.lifecycle.operationId)) {
|
|
636
|
+
return 'lifecycle-conflict';
|
|
637
|
+
}
|
|
638
|
+
return 'capability-unavailable';
|
|
639
|
+
}
|
|
640
|
+
if (this.isRequestedBrand(current.active, requestedBrandId))
|
|
641
|
+
return 'lifecycle-conflict';
|
|
642
|
+
return 'not-found';
|
|
643
|
+
}
|
|
644
|
+
async init() {
|
|
99
645
|
this.registerReadyHook();
|
|
100
|
-
|
|
646
|
+
const initialization = this._initializationPromise ?? this.performInit();
|
|
647
|
+
this._initializationPromise = initialization;
|
|
648
|
+
try {
|
|
649
|
+
await initialization;
|
|
650
|
+
}
|
|
651
|
+
catch (error) {
|
|
652
|
+
if (this._initializationPromise === initialization) {
|
|
653
|
+
this._initializationPromise = undefined;
|
|
654
|
+
sails.log.error(`${this.logHeader} storage_initialization_failed`, {
|
|
655
|
+
event: 'storage_initialization_failed',
|
|
656
|
+
outcome: 'not-ready',
|
|
657
|
+
error_classification: this.classifyStorageInitializationError(error),
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
throw error;
|
|
661
|
+
}
|
|
101
662
|
}
|
|
102
663
|
registerReadyHook() {
|
|
103
664
|
if (this._readyHookRegistered) {
|
|
@@ -105,8 +666,8 @@ var Services;
|
|
|
105
666
|
}
|
|
106
667
|
this._readyHookRegistered = true;
|
|
107
668
|
const that = this;
|
|
108
|
-
this.registerSailsHook('on', 'ready', function () {
|
|
109
|
-
|
|
669
|
+
this.registerSailsHook('on', 'ready', async function () {
|
|
670
|
+
await that.init();
|
|
110
671
|
});
|
|
111
672
|
}
|
|
112
673
|
async collectionExists(collectionName) {
|
|
@@ -130,7 +691,15 @@ var Services;
|
|
|
130
691
|
}
|
|
131
692
|
}
|
|
132
693
|
async performInit() {
|
|
133
|
-
if (this.
|
|
694
|
+
if (this._requiredIndicesReady &&
|
|
695
|
+
this.recordCol &&
|
|
696
|
+
this.deletedRecordCol &&
|
|
697
|
+
this.recordIdentityCol &&
|
|
698
|
+
this.recordCol &&
|
|
699
|
+
this.deletedRecordCol &&
|
|
700
|
+
this.recordSchemaArtifactCol &&
|
|
701
|
+
this.recordSchemaReferenceCol &&
|
|
702
|
+
this.gridFsBucket) {
|
|
134
703
|
return;
|
|
135
704
|
}
|
|
136
705
|
this.db = Record.getDatastore().manager;
|
|
@@ -144,7 +713,12 @@ var Services;
|
|
|
144
713
|
this.gridFsBucket = new mongodb.GridFSBucket(this.db);
|
|
145
714
|
this.recordCol = this.db.collection(Record.tableName);
|
|
146
715
|
this.deletedRecordCol = this.db.collection(DeletedRecord.tableName);
|
|
716
|
+
this.recordIdentityCol = this.db.collection(RECORD_IDENTITY_COLLECTION);
|
|
717
|
+
this.recordSchemaArtifactCol = this.db.collection(RecordSchemaArtifact.tableName);
|
|
718
|
+
this.recordSchemaReferenceCol = this.db.collection(RecordSchemaReference.tableName);
|
|
147
719
|
await this.createIndices(this.db);
|
|
720
|
+
await this.createRecordSchemaIndices();
|
|
721
|
+
this._requiredIndicesReady = true;
|
|
148
722
|
sails.emit('hook:redbox:storage:ready');
|
|
149
723
|
sails.emit('hook:redbox:datastream:ready');
|
|
150
724
|
sails.log.verbose(`${this.logHeader} Ready!`);
|
|
@@ -153,66 +727,966 @@ var Services;
|
|
|
153
727
|
sails.log.verbose(`${this.logHeader} Existing indices:`);
|
|
154
728
|
const currentIndices = await db.collection(Record.tableName).indexes();
|
|
155
729
|
sails.log.verbose(JSON.stringify(currentIndices));
|
|
730
|
+
const storageConfig = sails.config.storage;
|
|
731
|
+
const indices = storageConfig.mongodb?.indices ?? [];
|
|
732
|
+
if (_.size(indices) > 0) {
|
|
733
|
+
await db.collection(Record.tableName).createIndexes(indices);
|
|
734
|
+
}
|
|
735
|
+
const deletedRecordIndices = storageConfig.mongodb?.deletedRecordIndices ?? [];
|
|
736
|
+
if (_.size(deletedRecordIndices) > 0) {
|
|
737
|
+
await db.collection(DeletedRecord.tableName).createIndexes(deletedRecordIndices);
|
|
738
|
+
}
|
|
739
|
+
const recordIdentityIndices = storageConfig.mongodb?.recordIdentityIndices ?? [
|
|
740
|
+
{ key: { redboxOid: 1 }, unique: true },
|
|
741
|
+
];
|
|
742
|
+
await db.collection(RECORD_IDENTITY_COLLECTION).createIndexes(recordIdentityIndices);
|
|
743
|
+
}
|
|
744
|
+
async createRecordSchemaIndices() {
|
|
745
|
+
await this.createRequiredIndexes(this.recordSchemaArtifactCol, exports.RECORD_SCHEMA_ARTIFACT_INDEXES);
|
|
746
|
+
await this.createRequiredIndexes(this.recordSchemaReferenceCol, exports.RECORD_SCHEMA_REFERENCE_INDEXES);
|
|
747
|
+
}
|
|
748
|
+
async createRequiredIndexes(collection, requiredIndexes) {
|
|
749
|
+
let existingIndexes;
|
|
156
750
|
try {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
751
|
+
existingIndexes = await collection.indexes();
|
|
752
|
+
}
|
|
753
|
+
catch (error) {
|
|
754
|
+
if (!isMongoNamespaceNotFoundError(error)) {
|
|
755
|
+
throw error;
|
|
161
756
|
}
|
|
757
|
+
existingIndexes = [];
|
|
162
758
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
759
|
+
const missingIndexes = [];
|
|
760
|
+
for (const required of requiredIndexes) {
|
|
761
|
+
const matchingKeys = existingIndexes.filter(existing => indexKeysEqual(existing, required));
|
|
762
|
+
if (matchingKeys.some(existing => indexOptionsEqual(existing, required)))
|
|
763
|
+
continue;
|
|
764
|
+
if (matchingKeys.length > 0) {
|
|
765
|
+
throw new Error(`Existing index ${indexDisplayName(matchingKeys[0])} has options that do not match required index ${indexDisplayName(required)}.`);
|
|
766
|
+
}
|
|
767
|
+
const matchingName = existingIndexes.find(existing => existing.name === required.name);
|
|
768
|
+
if (matchingName) {
|
|
769
|
+
throw new Error(`Existing index ${indexDisplayName(matchingName)} has keys that do not match the required definition.`);
|
|
770
|
+
}
|
|
771
|
+
missingIndexes.push(required);
|
|
772
|
+
}
|
|
773
|
+
if (missingIndexes.length > 0) {
|
|
774
|
+
await collection.createIndexes(missingIndexes);
|
|
166
775
|
}
|
|
167
776
|
}
|
|
168
|
-
|
|
169
|
-
|
|
777
|
+
recordSchemaSuccess(data) {
|
|
778
|
+
const response = new redbox_core_1.StorageServiceResponse();
|
|
779
|
+
response.success = true;
|
|
780
|
+
response.data = data;
|
|
781
|
+
return response;
|
|
782
|
+
}
|
|
783
|
+
recordSchemaFailure(code, message, action, error) {
|
|
170
784
|
const response = new redbox_core_1.StorageServiceResponse();
|
|
171
|
-
|
|
172
|
-
response.
|
|
785
|
+
response.success = false;
|
|
786
|
+
response.message = message;
|
|
787
|
+
response.details = { code };
|
|
788
|
+
const errorType = error instanceof Error ? error.name : typeof error;
|
|
789
|
+
sails.log.error(`${this.logHeader} ${action} failed (${code}; ${errorType})`);
|
|
790
|
+
return response;
|
|
791
|
+
}
|
|
792
|
+
recordSchemaFailureFromError(action, error) {
|
|
793
|
+
if (error instanceof recordSchemaPersistence_1.RecordSchemaPersistenceError) {
|
|
794
|
+
return this.recordSchemaFailure(error.code, error.message, action, error);
|
|
795
|
+
}
|
|
796
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, 'Record schema storage operation failed.', action, error);
|
|
797
|
+
}
|
|
798
|
+
throwRecordSchemaReadFailure(action, error) {
|
|
799
|
+
if (error instanceof recordSchemaPersistence_1.RecordSchemaPersistenceError) {
|
|
800
|
+
throw error;
|
|
801
|
+
}
|
|
802
|
+
const errorType = error instanceof Error ? error.name : typeof error;
|
|
803
|
+
sails.log.error(`${this.logHeader} ${action} failed (${errorType})`);
|
|
804
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, 'Record schema storage read failed.');
|
|
805
|
+
}
|
|
806
|
+
artifactCollection() {
|
|
807
|
+
if (!this.recordSchemaArtifactCol) {
|
|
808
|
+
this.db = this.db ?? RecordSchemaArtifact.getDatastore().manager;
|
|
809
|
+
this.recordSchemaArtifactCol = this.db.collection(RecordSchemaArtifact.tableName);
|
|
810
|
+
}
|
|
811
|
+
return this.recordSchemaArtifactCol;
|
|
812
|
+
}
|
|
813
|
+
referenceCollection() {
|
|
814
|
+
if (!this.recordSchemaReferenceCol) {
|
|
815
|
+
this.db = this.db ?? RecordSchemaReference.getDatastore().manager;
|
|
816
|
+
this.recordSchemaReferenceCol = this.db.collection(RecordSchemaReference.tableName);
|
|
817
|
+
}
|
|
818
|
+
return this.recordSchemaReferenceCol;
|
|
819
|
+
}
|
|
820
|
+
recordSchemaReferenceDocument(reference, now) {
|
|
821
|
+
const document = {
|
|
822
|
+
referenceKey: reference.referenceKey,
|
|
823
|
+
digest: reference.digest,
|
|
824
|
+
kind: reference.kind,
|
|
825
|
+
brand: reference.brand,
|
|
826
|
+
portal: reference.portal,
|
|
827
|
+
schemaKind: reference.schemaKind,
|
|
828
|
+
recordType: reference.recordType,
|
|
829
|
+
operation: reference.operation,
|
|
830
|
+
createdAt: now,
|
|
831
|
+
updatedAt: now,
|
|
832
|
+
};
|
|
833
|
+
if (reference.kind === 'save' || (reference.kind === 'grant' && reference.schemaKind === 'update')) {
|
|
834
|
+
document.oid = reference.oid;
|
|
835
|
+
}
|
|
836
|
+
if (reference.kind === 'pin') {
|
|
837
|
+
document.owner = reference.owner;
|
|
838
|
+
document.purpose = reference.purpose;
|
|
839
|
+
if (reference.expiresAt !== undefined) {
|
|
840
|
+
document.expiresAt = reference.expiresAt;
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
return document;
|
|
844
|
+
}
|
|
845
|
+
async existingArtifactMatches(existing, artifact) {
|
|
846
|
+
return (0, recordSchemaPersistence_1.artifactContentIdentity)((0, recordSchemaPersistence_1.artifactModelFromDocument)(existing)) === (0, recordSchemaPersistence_1.artifactContentIdentity)(artifact);
|
|
847
|
+
}
|
|
848
|
+
async putRecordSchemaArtifact(artifact) {
|
|
849
|
+
try {
|
|
850
|
+
const validated = (0, recordSchemaPersistence_1.validateRecordSchemaArtifactInput)(artifact);
|
|
851
|
+
const collection = this.artifactCollection();
|
|
852
|
+
const existing = await collection.findOne({ digest: validated.digest });
|
|
853
|
+
if (existing) {
|
|
854
|
+
if (await this.existingArtifactMatches(existing, validated)) {
|
|
855
|
+
return this.recordSchemaSuccess({ digest: validated.digest });
|
|
856
|
+
}
|
|
857
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.DIGEST_COLLISION, 'Record schema artifact integrity check failed.', 'putRecordSchemaArtifact');
|
|
858
|
+
}
|
|
859
|
+
const now = new Date();
|
|
860
|
+
try {
|
|
861
|
+
await collection.insertOne({
|
|
862
|
+
digest: validated.digest,
|
|
863
|
+
document: validated.document,
|
|
864
|
+
contractFormat: validated.contractFormat,
|
|
865
|
+
completeness: validated.completeness,
|
|
866
|
+
byteLength: validated.byteLength,
|
|
867
|
+
createdAt: now,
|
|
868
|
+
updatedAt: now,
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
catch (error) {
|
|
872
|
+
if (!(0, recordSchemaPersistence_1.isDuplicateKeyError)(error)) {
|
|
873
|
+
throw error;
|
|
874
|
+
}
|
|
875
|
+
const racedArtifact = await collection.findOne({ digest: validated.digest });
|
|
876
|
+
if (!racedArtifact || !(await this.existingArtifactMatches(racedArtifact, validated))) {
|
|
877
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.DIGEST_COLLISION, 'Record schema artifact integrity check failed.', 'putRecordSchemaArtifact', error);
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
return this.recordSchemaSuccess({ digest: validated.digest });
|
|
881
|
+
}
|
|
882
|
+
catch (error) {
|
|
883
|
+
return this.recordSchemaFailureFromError('putRecordSchemaArtifact', error);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
async getRecordSchemaArtifact(digest) {
|
|
887
|
+
const validatedDigest = (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(digest);
|
|
888
|
+
try {
|
|
889
|
+
const document = await this.artifactCollection().findOne({ digest: validatedDigest });
|
|
890
|
+
return document ? (0, recordSchemaPersistence_1.artifactModelFromDocument)(document) : null;
|
|
891
|
+
}
|
|
892
|
+
catch (error) {
|
|
893
|
+
const errorType = error instanceof Error ? error.name : typeof error;
|
|
894
|
+
sails.log.error(`${this.logHeader} getRecordSchemaArtifact failed (${errorType})`);
|
|
895
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, 'Record schema artifact read failed.');
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
async listRecordSchemaArtifacts(query) {
|
|
899
|
+
try {
|
|
900
|
+
if (!query || typeof query !== 'object') {
|
|
901
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_ARTIFACT, 'Record schema artifact query is required.');
|
|
902
|
+
}
|
|
903
|
+
const limit = this.recordSchemaQueryLimit(query.limit);
|
|
904
|
+
const criteria = {};
|
|
905
|
+
if (query.afterDigest !== undefined) {
|
|
906
|
+
criteria.digest = { $gt: (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(query.afterDigest) };
|
|
907
|
+
}
|
|
908
|
+
const documents = await this.artifactCollection()
|
|
909
|
+
.find(criteria, { projection: { _id: 0, digest: 1, createdAt: 1 } })
|
|
910
|
+
.sort({ digest: 1 })
|
|
911
|
+
.limit(limit)
|
|
912
|
+
.toArray();
|
|
913
|
+
return documents.map(document => ({
|
|
914
|
+
digest: (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(document.digest),
|
|
915
|
+
createdAt: this.storedRecordSchemaDate(document.createdAt, 'artifact createdAt'),
|
|
916
|
+
}));
|
|
917
|
+
}
|
|
918
|
+
catch (error) {
|
|
919
|
+
return this.throwRecordSchemaReadFailure('listRecordSchemaArtifacts', error);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
async touchRecordSchemaArtifact(digest) {
|
|
923
|
+
try {
|
|
924
|
+
const validatedDigest = (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(digest);
|
|
925
|
+
const result = await this.artifactCollection().updateOne({ digest: validatedDigest }, { $set: { lastAccessedAt: new Date() } });
|
|
926
|
+
if (result.matchedCount !== 1) {
|
|
927
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.ARTIFACT_NOT_FOUND, 'Record schema artifact was not found.', 'touchRecordSchemaArtifact');
|
|
928
|
+
}
|
|
929
|
+
return this.recordSchemaSuccess({ digest: validatedDigest });
|
|
930
|
+
}
|
|
931
|
+
catch (error) {
|
|
932
|
+
return this.recordSchemaFailureFromError('touchRecordSchemaArtifact', error);
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
async storeRecordSchemaReference(reference, now) {
|
|
936
|
+
const collection = this.referenceCollection();
|
|
937
|
+
const existing = await collection.findOne({ referenceKey: reference.referenceKey });
|
|
938
|
+
if (existing) {
|
|
939
|
+
if ((0, recordSchemaPersistence_1.referenceContentIdentity)((0, recordSchemaPersistence_1.referenceModelFromDocument)(existing)) !== (0, recordSchemaPersistence_1.referenceContentIdentity)(reference)) {
|
|
940
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.REFERENCE_KEY_COLLISION, 'Record schema reference integrity check failed.', 'putRecordSchemaReference');
|
|
941
|
+
}
|
|
942
|
+
await collection.updateOne({ referenceKey: reference.referenceKey }, { $set: { updatedAt: now } });
|
|
943
|
+
return this.recordSchemaSuccess({ referenceKey: reference.referenceKey });
|
|
944
|
+
}
|
|
945
|
+
try {
|
|
946
|
+
await collection.insertOne(this.recordSchemaReferenceDocument(reference, now));
|
|
947
|
+
}
|
|
948
|
+
catch (error) {
|
|
949
|
+
if (!(0, recordSchemaPersistence_1.isDuplicateKeyError)(error)) {
|
|
950
|
+
throw error;
|
|
951
|
+
}
|
|
952
|
+
const racedReference = await collection.findOne({ referenceKey: reference.referenceKey });
|
|
953
|
+
if (!racedReference ||
|
|
954
|
+
(0, recordSchemaPersistence_1.referenceContentIdentity)((0, recordSchemaPersistence_1.referenceModelFromDocument)(racedReference)) !== (0, recordSchemaPersistence_1.referenceContentIdentity)(reference)) {
|
|
955
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.REFERENCE_KEY_COLLISION, 'Record schema reference integrity check failed.', 'putRecordSchemaReference', error);
|
|
956
|
+
}
|
|
957
|
+
await collection.updateOne({ referenceKey: reference.referenceKey }, { $set: { updatedAt: now } });
|
|
958
|
+
}
|
|
959
|
+
return this.recordSchemaSuccess({ referenceKey: reference.referenceKey });
|
|
960
|
+
}
|
|
961
|
+
async putRecordSchemaReference(reference) {
|
|
962
|
+
try {
|
|
963
|
+
const validated = (0, recordSchemaPersistence_1.validateRecordSchemaReferenceInput)(reference);
|
|
964
|
+
const now = new Date();
|
|
965
|
+
const artifactCriteria = { digest: validated.digest };
|
|
966
|
+
const artifact = await this.artifactCollection().findOne(artifactCriteria, {
|
|
967
|
+
projection: { _id: 1 },
|
|
968
|
+
});
|
|
969
|
+
if (!artifact) {
|
|
970
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.ARTIFACT_NOT_FOUND, 'Record schema reference target was not found.', 'putRecordSchemaReference');
|
|
971
|
+
}
|
|
972
|
+
const response = await this.storeRecordSchemaReference(validated, now);
|
|
973
|
+
if (!response.success) {
|
|
974
|
+
return response;
|
|
975
|
+
}
|
|
976
|
+
// Reference writes and retention deletion share this lock protocol.
|
|
977
|
+
// A writer that raced with deletion removes its own temporary row and
|
|
978
|
+
// fails, so no successful reference can become orphaned.
|
|
979
|
+
const artifactAfterWrite = await this.artifactCollection().findOne({ digest: validated.digest }, { projection: { _id: 1 } });
|
|
980
|
+
if (!artifactAfterWrite) {
|
|
981
|
+
await this.referenceCollection().deleteOne({
|
|
982
|
+
referenceKey: validated.referenceKey,
|
|
983
|
+
digest: validated.digest,
|
|
984
|
+
});
|
|
985
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.ARTIFACT_NOT_FOUND, 'Record schema reference target was not found.', 'putRecordSchemaReference');
|
|
986
|
+
}
|
|
987
|
+
return response;
|
|
988
|
+
}
|
|
989
|
+
catch (error) {
|
|
990
|
+
return this.recordSchemaFailureFromError('putRecordSchemaReference', error);
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
recordSchemaQueryString(value, field, maximumLength = 512) {
|
|
994
|
+
if (typeof value !== 'string' || value.length === 0 || value !== value.trim() || value.length > maximumLength) {
|
|
995
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, `Record schema reference query ${field} is invalid.`);
|
|
996
|
+
}
|
|
997
|
+
return value;
|
|
998
|
+
}
|
|
999
|
+
recordSchemaQueryLimit(value) {
|
|
1000
|
+
if (typeof value !== 'number' ||
|
|
1001
|
+
!Number.isSafeInteger(value) ||
|
|
1002
|
+
value <= 0 ||
|
|
1003
|
+
value > recordSchemaPersistence_1.RECORD_SCHEMA_REFERENCE_QUERY_LIMIT_MAX) {
|
|
1004
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, `Record schema reference query limit must be between 1 and ${recordSchemaPersistence_1.RECORD_SCHEMA_REFERENCE_QUERY_LIMIT_MAX}.`);
|
|
1005
|
+
}
|
|
1006
|
+
return value;
|
|
1007
|
+
}
|
|
1008
|
+
async findRecordSchemaGrantForAuthorization(query) {
|
|
1009
|
+
try {
|
|
1010
|
+
if (!query || typeof query !== 'object') {
|
|
1011
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query is required.');
|
|
1012
|
+
}
|
|
1013
|
+
const schemaKind = query.schemaKind;
|
|
1014
|
+
if (schemaKind !== 'create' && schemaKind !== 'update') {
|
|
1015
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query schemaKind is invalid.');
|
|
1016
|
+
}
|
|
1017
|
+
if (!Array.isArray(query.roleNames)) {
|
|
1018
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query roleNames is invalid.');
|
|
1019
|
+
}
|
|
1020
|
+
const roleNames = [
|
|
1021
|
+
...new Set(query.roleNames.map(role => this.recordSchemaQueryString(role, 'roleNames'))),
|
|
1022
|
+
].sort();
|
|
1023
|
+
const criteria = {
|
|
1024
|
+
digest: (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(query.digest),
|
|
1025
|
+
kind: 'grant',
|
|
1026
|
+
brand: this.recordSchemaQueryString(query.brand, 'brand'),
|
|
1027
|
+
portal: this.recordSchemaQueryString(query.portal, 'portal'),
|
|
1028
|
+
schemaKind,
|
|
1029
|
+
recordType: this.recordSchemaQueryString(query.recordType, 'recordType'),
|
|
1030
|
+
operation: this.recordSchemaQueryString(query.operation, 'operation', 64),
|
|
1031
|
+
};
|
|
1032
|
+
if (query.afterReferenceKey !== undefined) {
|
|
1033
|
+
const afterReferenceKey = this.recordSchemaQueryString(query.afterReferenceKey, 'afterReferenceKey');
|
|
1034
|
+
if (!RecordSchemaReference_1.RECORD_SCHEMA_REFERENCE_KEY_PATTERN.test(afterReferenceKey)) {
|
|
1035
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query afterReferenceKey is invalid.');
|
|
1036
|
+
}
|
|
1037
|
+
criteria.referenceKey = { $gt: afterReferenceKey };
|
|
1038
|
+
}
|
|
1039
|
+
if (schemaKind === 'create') {
|
|
1040
|
+
const grant = await this.referenceCollection().findOne(criteria, {
|
|
1041
|
+
sort: { referenceKey: 1 },
|
|
1042
|
+
hint: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY,
|
|
1043
|
+
maxTimeMS: exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS,
|
|
1044
|
+
});
|
|
1045
|
+
return grant ? (0, recordSchemaPersistence_1.referenceModelFromDocument)(grant) : null;
|
|
1046
|
+
}
|
|
1047
|
+
const username = this.recordSchemaQueryString(query.username, 'username');
|
|
1048
|
+
const recordBrandId = this.recordSchemaQueryString(query.recordBrandId, 'recordBrandId');
|
|
1049
|
+
const editConditions = [{ 'authorization.edit': username }];
|
|
1050
|
+
if (roleNames.length > 0) {
|
|
1051
|
+
editConditions.push({ 'authorization.editRoles': { $in: roleNames } });
|
|
1052
|
+
}
|
|
1053
|
+
const grants = await this.referenceCollection()
|
|
1054
|
+
.aggregate([
|
|
1055
|
+
{ $match: criteria },
|
|
1056
|
+
{
|
|
1057
|
+
$lookup: {
|
|
1058
|
+
from: Record.tableName,
|
|
1059
|
+
localField: 'oid',
|
|
1060
|
+
foreignField: 'redboxOid',
|
|
1061
|
+
pipeline: [
|
|
1062
|
+
{
|
|
1063
|
+
$match: {
|
|
1064
|
+
'metaMetadata.brandId': recordBrandId,
|
|
1065
|
+
$or: editConditions,
|
|
1066
|
+
},
|
|
1067
|
+
},
|
|
1068
|
+
],
|
|
1069
|
+
as: 'authorizedRecords',
|
|
1070
|
+
},
|
|
1071
|
+
},
|
|
1072
|
+
{ $match: { 'authorizedRecords.0': { $exists: true } } },
|
|
1073
|
+
{ $sort: { referenceKey: 1 } },
|
|
1074
|
+
{ $limit: 1 },
|
|
1075
|
+
], { hint: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY })
|
|
1076
|
+
.maxTimeMS(exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS)
|
|
1077
|
+
.toArray();
|
|
1078
|
+
return grants[0] ? (0, recordSchemaPersistence_1.referenceModelFromDocument)(grants[0]) : null;
|
|
1079
|
+
}
|
|
1080
|
+
catch (error) {
|
|
1081
|
+
return this.throwRecordSchemaReadFailure('findRecordSchemaGrantForAuthorization', error);
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
async listRecordSchemaReferences(query) {
|
|
1085
|
+
try {
|
|
1086
|
+
if (!query || typeof query !== 'object') {
|
|
1087
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query is required.');
|
|
1088
|
+
}
|
|
1089
|
+
const limit = this.recordSchemaQueryLimit(query.limit);
|
|
1090
|
+
const criteria = {};
|
|
1091
|
+
if (query.digest !== undefined) {
|
|
1092
|
+
criteria.digest = (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(query.digest);
|
|
1093
|
+
}
|
|
1094
|
+
if (query.kind !== undefined) {
|
|
1095
|
+
if (!['grant', 'save', 'pin'].includes(query.kind)) {
|
|
1096
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query kind is invalid.');
|
|
1097
|
+
}
|
|
1098
|
+
criteria.kind = query.kind;
|
|
1099
|
+
}
|
|
1100
|
+
if (query.schemaKind !== undefined) {
|
|
1101
|
+
if (query.schemaKind !== 'create' && query.schemaKind !== 'update') {
|
|
1102
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query schemaKind is invalid.');
|
|
1103
|
+
}
|
|
1104
|
+
criteria.schemaKind = query.schemaKind;
|
|
1105
|
+
}
|
|
1106
|
+
for (const [field, value] of [
|
|
1107
|
+
['brand', query.brand],
|
|
1108
|
+
['portal', query.portal],
|
|
1109
|
+
['recordType', query.recordType],
|
|
1110
|
+
['oid', query.oid],
|
|
1111
|
+
['operation', query.operation],
|
|
1112
|
+
['owner', query.owner],
|
|
1113
|
+
]) {
|
|
1114
|
+
if (value !== undefined) {
|
|
1115
|
+
criteria[field] = this.recordSchemaQueryString(value, field);
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
if (query.includeExpiredPins !== undefined && typeof query.includeExpiredPins !== 'boolean') {
|
|
1119
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query includeExpiredPins must be boolean.');
|
|
1120
|
+
}
|
|
1121
|
+
if (query.includeExpiredPins !== true) {
|
|
1122
|
+
criteria.$and = [
|
|
1123
|
+
{
|
|
1124
|
+
$or: [{ kind: { $ne: 'pin' } }, { expiresAt: { $exists: false } }, { expiresAt: { $gt: new Date() } }],
|
|
1125
|
+
},
|
|
1126
|
+
];
|
|
1127
|
+
}
|
|
1128
|
+
if (query.afterReferenceKey !== undefined) {
|
|
1129
|
+
const afterReferenceKey = this.recordSchemaQueryString(query.afterReferenceKey, 'afterReferenceKey');
|
|
1130
|
+
if (!RecordSchemaReference_1.RECORD_SCHEMA_REFERENCE_KEY_PATTERN.test(afterReferenceKey)) {
|
|
1131
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query afterReferenceKey is invalid.');
|
|
1132
|
+
}
|
|
1133
|
+
criteria.referenceKey = { $gt: afterReferenceKey };
|
|
1134
|
+
}
|
|
1135
|
+
const documents = await this.referenceCollection()
|
|
1136
|
+
.find(criteria)
|
|
1137
|
+
.sort({ referenceKey: 1 })
|
|
1138
|
+
.limit(limit)
|
|
1139
|
+
.toArray();
|
|
1140
|
+
return documents.map(recordSchemaPersistence_1.referenceModelFromDocument);
|
|
1141
|
+
}
|
|
1142
|
+
catch (error) {
|
|
1143
|
+
return this.throwRecordSchemaReadFailure('listRecordSchemaReferences', error);
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
storedRecordSchemaDate(value, field) {
|
|
1147
|
+
const date = value instanceof Date ? value : new Date(String(value ?? ''));
|
|
1148
|
+
if (Number.isNaN(date.getTime())) {
|
|
1149
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, `Stored record schema ${field} is invalid.`);
|
|
1150
|
+
}
|
|
1151
|
+
return date;
|
|
1152
|
+
}
|
|
1153
|
+
async create(_brand, record, _recordType, _user, options) {
|
|
1154
|
+
sails.log.verbose(`${this.logHeader} create() -> Begin`);
|
|
1155
|
+
// RecordsService may pre-assign the OID so attachment journal rows can
|
|
1156
|
+
// be prepared before the primary metadata commit. Preserve it when
|
|
1157
|
+
// supplied, while retaining the historical generated-OID behavior.
|
|
1158
|
+
record.redboxOid = record.redboxOid ?? this.getUuid();
|
|
1159
|
+
const response = this.createMutationResponse(String(record.redboxOid), options);
|
|
1160
|
+
const precondition = options?.precondition;
|
|
1161
|
+
// A create has no prior revision to compare, so a caller asserting one is
|
|
1162
|
+
// addressing a record that this call cannot be. An empty precondition is
|
|
1163
|
+
// accepted so callers can pass one normalized options object everywhere.
|
|
1164
|
+
if (precondition && (precondition.requireRevision || precondition.expectedRevision !== undefined)) {
|
|
1165
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Record creation does not accept an existing revision');
|
|
1166
|
+
}
|
|
1167
|
+
const serverRecord = _.cloneDeep(record);
|
|
1168
|
+
// The storage boundary owns creation revision regardless of anything a
|
|
1169
|
+
// request candidate supplied.
|
|
1170
|
+
serverRecord.revision = redbox_core_1.INITIAL_RECORD_REVISION;
|
|
1171
|
+
_.unset(serverRecord, '_id');
|
|
1172
|
+
_.unset(serverRecord, 'id');
|
|
1173
|
+
_.unset(serverRecord, 'incarnationId');
|
|
1174
|
+
_.unset(serverRecord, 'lifecycleOperationId');
|
|
1175
|
+
const records = this.getNativeRecordCollection();
|
|
1176
|
+
if (typeof records?.insertOne !== 'function') {
|
|
1177
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic active record creation is unavailable');
|
|
1178
|
+
}
|
|
1179
|
+
let identity;
|
|
1180
|
+
try {
|
|
1181
|
+
identity = await this.claimNewRecordIdentity(String(record.redboxOid));
|
|
1182
|
+
}
|
|
1183
|
+
catch {
|
|
1184
|
+
return this.unknownMutation(response, 'Durable record identity ownership could not be confirmed');
|
|
1185
|
+
}
|
|
1186
|
+
if (!identity) {
|
|
1187
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1188
|
+
}
|
|
1189
|
+
if ('collision' in identity) {
|
|
1190
|
+
return this.notApplied(response, 'lifecycle-conflict', 'The record OID already has a durable incarnation');
|
|
1191
|
+
}
|
|
1192
|
+
const now = new Date().toISOString();
|
|
1193
|
+
const claimedIncarnationId = identity.incarnationId;
|
|
1194
|
+
serverRecord.incarnationId = claimedIncarnationId;
|
|
1195
|
+
serverRecord.dateCreated = serverRecord.dateCreated ?? now;
|
|
1196
|
+
serverRecord.lastSaveDate = now;
|
|
173
1197
|
try {
|
|
174
1198
|
sails.log.verbose(`${this.logHeader} Saving to DB...`);
|
|
175
|
-
await
|
|
176
|
-
response
|
|
1199
|
+
await records.insertOne(serverRecord);
|
|
1200
|
+
this.committed(response, serverRecord, 'updated');
|
|
177
1201
|
sails.log.verbose(`${this.logHeader} Record created...`);
|
|
178
1202
|
}
|
|
179
1203
|
catch (err) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
1204
|
+
if (this.isDuplicateKeyError(err)) {
|
|
1205
|
+
// Another writer owns this OID's state, so its ledger row is correct.
|
|
1206
|
+
return this.notApplied(response, 'lifecycle-conflict', 'The record OID already exists');
|
|
1207
|
+
}
|
|
1208
|
+
sails.log.error(`${this.logHeader} record_create_outcome_unknown`, {
|
|
1209
|
+
event: 'record_create_outcome_unknown',
|
|
1210
|
+
error_type: err instanceof Error ? err.name : 'unknown',
|
|
1211
|
+
});
|
|
1212
|
+
let observed;
|
|
1213
|
+
try {
|
|
1214
|
+
observed = await this.readCurrentState(String(record.redboxOid));
|
|
1215
|
+
}
|
|
1216
|
+
catch {
|
|
1217
|
+
observed = undefined;
|
|
1218
|
+
}
|
|
1219
|
+
if (observed?.active && this.storedIncarnationId(observed.active) === claimedIncarnationId) {
|
|
1220
|
+
return this.committed(response, observed.active, 'updated');
|
|
1221
|
+
}
|
|
1222
|
+
// A dispatched/ambiguous failure may still materialize later, so only
|
|
1223
|
+
// a definitive driver rejection is eligible for compensating release.
|
|
1224
|
+
if (this.isCertifiedCreateNonApplication(err)) {
|
|
1225
|
+
await this.releaseUnusedRecordIdentity(String(record.redboxOid), claimedIncarnationId);
|
|
1226
|
+
}
|
|
1227
|
+
this.unknownMutation(response, 'Record creation could not be confirmed');
|
|
184
1228
|
return response;
|
|
185
1229
|
}
|
|
186
|
-
sails.log.verbose(JSON.stringify(response));
|
|
187
1230
|
sails.log.verbose(`${this.logHeader} create() -> End`);
|
|
188
1231
|
return response;
|
|
189
1232
|
}
|
|
190
|
-
async updateMeta(brand, oid, record, user) {
|
|
191
|
-
const response =
|
|
192
|
-
|
|
1233
|
+
async updateMeta(brand, oid, record, user, options) {
|
|
1234
|
+
const response = this.createMutationResponse(oid, options);
|
|
1235
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1236
|
+
if (expectedRevision === null)
|
|
1237
|
+
return response;
|
|
1238
|
+
if (expectedRevision === Number.MAX_SAFE_INTEGER) {
|
|
1239
|
+
return this.notApplied(response, 'capability-unavailable', 'The record revision cannot be advanced safely');
|
|
1240
|
+
}
|
|
1241
|
+
const collection = this.getNativeRecordCollection();
|
|
1242
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1243
|
+
return this.notApplied(response, 'capability-unavailable', 'The storage adapter cannot perform an atomic record revision update');
|
|
1244
|
+
}
|
|
1245
|
+
const candidate = _.cloneDeep(record);
|
|
1246
|
+
// Identity, creation, and revision are owned by storage, never by the
|
|
1247
|
+
// candidate; lastSaveDate is reissued with the committing write.
|
|
1248
|
+
for (const field of [
|
|
1249
|
+
'_id',
|
|
1250
|
+
'id',
|
|
1251
|
+
'redboxOid',
|
|
1252
|
+
'revision',
|
|
1253
|
+
'incarnationId',
|
|
1254
|
+
'lifecycleOperationId',
|
|
1255
|
+
'dateCreated',
|
|
1256
|
+
'lastSaveDate',
|
|
1257
|
+
]) {
|
|
1258
|
+
_.unset(candidate, field);
|
|
1259
|
+
}
|
|
1260
|
+
if (this.unsafeCandidateField(candidate) !== undefined) {
|
|
1261
|
+
sails.log.error(`${this.logHeader} refusing an update for oid ${oid}: unsupported candidate field name`);
|
|
1262
|
+
return this.notApplied(response, 'capability-unavailable', 'Record candidate contains an unsupported field');
|
|
1263
|
+
}
|
|
1264
|
+
const activeBrandId = this.brandIdOf(brand);
|
|
1265
|
+
const candidateSuppliesMetaMetadata = Object.prototype.hasOwnProperty.call(candidate, 'metaMetadata');
|
|
1266
|
+
const candidateBrandId = String(_.get(candidate, 'metaMetadata.brandId', '') ?? '').trim();
|
|
1267
|
+
if (activeBrandId && candidateSuppliesMetaMetadata && candidateBrandId !== activeBrandId) {
|
|
1268
|
+
return this.notApplied(response, 'brand-mismatch', 'Record was not found');
|
|
1269
|
+
}
|
|
1270
|
+
return this.commitConditionalMutation({
|
|
1271
|
+
response,
|
|
1272
|
+
kind: 'updated',
|
|
1273
|
+
dispatch: () => collection.findOneAndUpdate(this.mutationSelector(this.activeIdentity(brand, oid), expectedRevision), {
|
|
1274
|
+
$set: { ...candidate, lastSaveDate: new Date().toISOString() },
|
|
1275
|
+
$inc: { revision: 1 },
|
|
1276
|
+
}, { returnDocument: 'after', includeResultMetadata: false }),
|
|
1277
|
+
classify: () => this.classifyActiveNoMatch(brand, oid, expectedRevision),
|
|
1278
|
+
expectedRevision,
|
|
1279
|
+
onDispatchError: err => {
|
|
1280
|
+
sails.log.error(`${this.logHeader} updateMeta() failed for oid ${oid}: ${this.getErrorMessage(err)}`);
|
|
1281
|
+
sails.log.error(`${this.logHeader} Failed to save update to MongoDB: ${JSON.stringify({
|
|
1282
|
+
error: err,
|
|
1283
|
+
response,
|
|
1284
|
+
brand,
|
|
1285
|
+
oid,
|
|
1286
|
+
user,
|
|
1287
|
+
})}`);
|
|
1288
|
+
},
|
|
1289
|
+
});
|
|
1290
|
+
}
|
|
1291
|
+
/**
|
|
1292
|
+
* Dispatch one atomic conditional mutation and turn its single driver fact
|
|
1293
|
+
* into a mutation response.
|
|
1294
|
+
*
|
|
1295
|
+
* The three outcomes are deliberately distinct: a returned document is an
|
|
1296
|
+
* applied commit, `null` certifies that the selector matched nothing and
|
|
1297
|
+
* therefore that no write happened, and anything else — including a throw
|
|
1298
|
+
* after dispatch — stays `unknown`. A failed follow-up classification only
|
|
1299
|
+
* costs the precise reason; it never turns a certified no-match into a
|
|
1300
|
+
* write, and it never issues one.
|
|
1301
|
+
*/
|
|
1302
|
+
async commitConditionalMutation(operation) {
|
|
1303
|
+
const { response, kind, dispatch, classify, expectedRevision, onDispatchError } = operation;
|
|
1304
|
+
let document;
|
|
193
1305
|
try {
|
|
194
|
-
|
|
195
|
-
_.unset(record, 'lastSaveDate');
|
|
196
|
-
_.unset(record, '_id');
|
|
197
|
-
_.unset(record, 'id');
|
|
198
|
-
await Record.updateOne({ redboxOid: oid }).set(record);
|
|
199
|
-
response.success = true;
|
|
1306
|
+
document = this.mutationDocument(await dispatch());
|
|
200
1307
|
}
|
|
201
1308
|
catch (err) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
response
|
|
213
|
-
|
|
1309
|
+
onDispatchError?.(err);
|
|
1310
|
+
return this.unknownMutation(response, this.getErrorMessage(err));
|
|
1311
|
+
}
|
|
1312
|
+
if (document === undefined) {
|
|
1313
|
+
return this.unknownMutation(response, 'Storage returned an unrecognized mutation result');
|
|
1314
|
+
}
|
|
1315
|
+
if (document !== null) {
|
|
1316
|
+
return this.committed(response, document, kind, expectedRevision);
|
|
1317
|
+
}
|
|
1318
|
+
try {
|
|
1319
|
+
return this.notApplied(response, await classify());
|
|
1320
|
+
}
|
|
1321
|
+
catch (err) {
|
|
1322
|
+
sails.log.error(`${this.logHeader} could not classify a certified no-match for oid ${response.oid}: ` +
|
|
1323
|
+
this.getErrorMessage(err));
|
|
1324
|
+
return this.notApplied(response, 'capability-unavailable');
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
async removeActiveRecord(brand, oid, options) {
|
|
1328
|
+
const response = this.createMutationResponse(oid, options);
|
|
1329
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1330
|
+
if (expectedRevision === null)
|
|
1331
|
+
return response;
|
|
1332
|
+
const collection = this.getNativeRecordCollection();
|
|
1333
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1334
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic active record removal is unavailable');
|
|
1335
|
+
}
|
|
1336
|
+
let current;
|
|
1337
|
+
try {
|
|
1338
|
+
current = this.mutationDocument(await collection.findOne(this.mutationSelector(this.activeIdentity(brand, oid), expectedRevision)));
|
|
1339
|
+
if (current && !(await this.ensureRecordIdentity(oid, current))) {
|
|
1340
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
catch (error) {
|
|
1344
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1345
|
+
}
|
|
1346
|
+
return this.commitConditionalMutation({
|
|
1347
|
+
response,
|
|
1348
|
+
kind: 'removed',
|
|
1349
|
+
dispatch: () => collection.findOneAndDelete(this.mutationSelector(this.activeIdentity(brand, oid), expectedRevision), {
|
|
1350
|
+
includeResultMetadata: false,
|
|
1351
|
+
}),
|
|
1352
|
+
classify: () => this.classifyActiveNoMatch(brand, oid, expectedRevision),
|
|
1353
|
+
expectedRevision,
|
|
1354
|
+
});
|
|
1355
|
+
}
|
|
1356
|
+
async createTombstone(brand, oid, record, options) {
|
|
1357
|
+
const response = this.createMutationResponse(oid, options);
|
|
1358
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1359
|
+
if (expectedRevision === null)
|
|
1360
|
+
return response;
|
|
1361
|
+
if (expectedRevision === undefined || !(0, redbox_core_1.isCanonicalSaveRequestId)(options?.lifecycle?.operationId)) {
|
|
1362
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact lifecycle intent ownership is required');
|
|
1363
|
+
}
|
|
1364
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1365
|
+
if (!this.supportsAtomicMutation(collection) || typeof collection.insertOne !== 'function') {
|
|
1366
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic tombstone creation is unavailable');
|
|
1367
|
+
}
|
|
1368
|
+
const candidate = _.cloneDeep(record);
|
|
1369
|
+
for (const field of ['_id', 'id'])
|
|
1370
|
+
_.unset(candidate, field);
|
|
1371
|
+
const operation = candidate.lifecycleOperation;
|
|
1372
|
+
const targetRevision = (0, redbox_core_1.nextRecordRevision)(expectedRevision);
|
|
1373
|
+
const expectedState = options.lifecycle.expectedState;
|
|
1374
|
+
if (candidate.redboxOid !== oid ||
|
|
1375
|
+
candidate.revision !== targetRevision ||
|
|
1376
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleState)(candidate.lifecycleState) ||
|
|
1377
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(operation) ||
|
|
1378
|
+
(expectedState !== 'delete-pending' && expectedState !== 'purge-pending') ||
|
|
1379
|
+
candidate.lifecycleState !== expectedState ||
|
|
1380
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(candidate.lifecycleState, operation.kind) ||
|
|
1381
|
+
operation.operationId !== options.lifecycle.operationId ||
|
|
1382
|
+
operation.sourceRevision !== expectedRevision ||
|
|
1383
|
+
operation.targetRevision !== targetRevision) {
|
|
1384
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone lifecycle intent is invalid');
|
|
1385
|
+
}
|
|
1386
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
1387
|
+
const candidateBrandId = String(candidate.brandId ?? '').trim();
|
|
1388
|
+
const snapshotBrandId = String(_.get(candidate, 'deletedRecordMetadata.metaMetadata.brandId', '') ?? '').trim();
|
|
1389
|
+
if (requestedBrandId && (candidateBrandId !== requestedBrandId || snapshotBrandId !== requestedBrandId)) {
|
|
1390
|
+
return this.notApplied(response, 'brand-mismatch', 'Tombstone was not found');
|
|
1391
|
+
}
|
|
1392
|
+
if (!candidate.deletedRecordMetadata ||
|
|
1393
|
+
typeof candidate.deletedRecordMetadata !== 'object' ||
|
|
1394
|
+
Array.isArray(candidate.deletedRecordMetadata) ||
|
|
1395
|
+
_.get(candidate, 'deletedRecordMetadata.redboxOid') !== oid) {
|
|
1396
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone record snapshot is invalid');
|
|
1397
|
+
}
|
|
1398
|
+
_.unset(candidate, 'deletedRecordMetadata.revision');
|
|
1399
|
+
let incarnationId;
|
|
1400
|
+
try {
|
|
1401
|
+
incarnationId = await this.ensureRecordIdentity(oid, candidate.deletedRecordMetadata);
|
|
1402
|
+
}
|
|
1403
|
+
catch (error) {
|
|
1404
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1405
|
+
}
|
|
1406
|
+
if (!incarnationId) {
|
|
1407
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1408
|
+
}
|
|
1409
|
+
const suppliedIncarnationId = this.storedIncarnationId(candidate) ?? this.storedIncarnationId(candidate.deletedRecordMetadata);
|
|
1410
|
+
if (suppliedIncarnationId && suppliedIncarnationId !== incarnationId) {
|
|
1411
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone incarnation identity diverged');
|
|
1412
|
+
}
|
|
1413
|
+
candidate.incarnationId = incarnationId;
|
|
1414
|
+
candidate.deletedRecordMetadata.incarnationId = incarnationId;
|
|
1415
|
+
try {
|
|
1416
|
+
await collection.insertOne(candidate);
|
|
1417
|
+
return this.committed(response, candidate, 'updated', expectedRevision);
|
|
1418
|
+
}
|
|
1419
|
+
catch (error) {
|
|
1420
|
+
if (!this.isDuplicateKeyError(error)) {
|
|
1421
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1422
|
+
}
|
|
1423
|
+
try {
|
|
1424
|
+
const existing = this.mutationDocument(await collection.findOne({ redboxOid: oid }));
|
|
1425
|
+
if (existing === undefined)
|
|
1426
|
+
return this.unknownMutation(response, 'Tombstone ownership could not be observed');
|
|
1427
|
+
if (existing === null)
|
|
1428
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1429
|
+
if (!this.isRequestedBrand(existing, requestedBrandId))
|
|
1430
|
+
return this.notApplied(response, 'brand-mismatch');
|
|
1431
|
+
const existingOperation = existing.lifecycleOperation;
|
|
1432
|
+
if (!(0, redbox_core_1.isRecordRevision)(existing.revision) ||
|
|
1433
|
+
existing.revision < targetRevision ||
|
|
1434
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleState)(existing.lifecycleState) ||
|
|
1435
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(existingOperation) ||
|
|
1436
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(existing.lifecycleState, existingOperation.kind) ||
|
|
1437
|
+
existingOperation.operationId !== options.lifecycle.operationId ||
|
|
1438
|
+
existingOperation.kind !== operation.kind) {
|
|
1439
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1440
|
+
}
|
|
1441
|
+
return this.committed(response, existing, 'updated');
|
|
1442
|
+
}
|
|
1443
|
+
catch (readError) {
|
|
1444
|
+
return this.unknownMutation(response, this.getErrorMessage(readError));
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
async updateTombstone(brand, oid, record, options) {
|
|
1449
|
+
const response = this.createMutationResponse(oid, options);
|
|
1450
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1451
|
+
if (expectedRevision === null)
|
|
1452
|
+
return response;
|
|
1453
|
+
if (expectedRevision === Number.MAX_SAFE_INTEGER) {
|
|
1454
|
+
return this.notApplied(response, 'capability-unavailable', 'The tombstone revision cannot be advanced safely');
|
|
1455
|
+
}
|
|
1456
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1457
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1458
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic tombstone update is unavailable');
|
|
1459
|
+
}
|
|
1460
|
+
if (expectedRevision === undefined || !options?.lifecycle?.expectedState) {
|
|
1461
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact lifecycle state and revision are required');
|
|
1462
|
+
}
|
|
1463
|
+
const candidate = _.cloneDeep(record);
|
|
1464
|
+
for (const field of ['_id', 'id', 'redboxOid', 'revision', 'incarnationId', 'dateDeleted'])
|
|
1465
|
+
_.unset(candidate, field);
|
|
1466
|
+
if (this.unsafeCandidateField(candidate) !== undefined) {
|
|
1467
|
+
sails.log.error(`${this.logHeader} refusing a tombstone update for oid ${oid}: unsupported candidate field`);
|
|
1468
|
+
return this.notApplied(response, 'capability-unavailable', 'Tombstone candidate contains an unsupported field');
|
|
1469
|
+
}
|
|
1470
|
+
if (!(0, redbox_core_1.isDeletedRecordLifecycleState)(candidate.lifecycleState)) {
|
|
1471
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone lifecycle state is invalid');
|
|
1472
|
+
}
|
|
1473
|
+
const operation = candidate.lifecycleOperation;
|
|
1474
|
+
if (!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(operation) ||
|
|
1475
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(candidate.lifecycleState, operation.kind) ||
|
|
1476
|
+
operation.sourceRevision > expectedRevision ||
|
|
1477
|
+
operation.targetRevision !== (0, redbox_core_1.nextRecordRevision)(expectedRevision) ||
|
|
1478
|
+
(options.lifecycle.operationId !== undefined && operation.operationId !== options.lifecycle.operationId)) {
|
|
1479
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone lifecycle operation is invalid');
|
|
1480
|
+
}
|
|
1481
|
+
if (candidate.deletedRecordMetadata !== undefined &&
|
|
1482
|
+
(candidate.deletedRecordMetadata === null ||
|
|
1483
|
+
typeof candidate.deletedRecordMetadata !== 'object' ||
|
|
1484
|
+
Array.isArray(candidate.deletedRecordMetadata))) {
|
|
1485
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone record snapshot is invalid');
|
|
1486
|
+
}
|
|
1487
|
+
if (candidate.deletedRecordMetadata && typeof candidate.deletedRecordMetadata === 'object') {
|
|
1488
|
+
// The wrapper is the sole current lifecycle revision authority. Source
|
|
1489
|
+
// lineage lives in lifecycleOperation.sourceRevision.
|
|
1490
|
+
_.unset(candidate, 'deletedRecordMetadata.revision');
|
|
1491
|
+
}
|
|
1492
|
+
try {
|
|
1493
|
+
const current = this.mutationDocument(await collection.findOne(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options)));
|
|
1494
|
+
if (current) {
|
|
1495
|
+
const incarnationId = await this.ensureRecordIdentity(oid, current);
|
|
1496
|
+
if (!incarnationId) {
|
|
1497
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1498
|
+
}
|
|
1499
|
+
if (candidate.deletedRecordMetadata && typeof candidate.deletedRecordMetadata === 'object') {
|
|
1500
|
+
candidate.deletedRecordMetadata.incarnationId = incarnationId;
|
|
1501
|
+
}
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
catch (error) {
|
|
1505
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1506
|
+
}
|
|
1507
|
+
const activeBrandId = this.brandIdOf(brand);
|
|
1508
|
+
const candidateBrandId = String(candidate.brandId ?? '').trim();
|
|
1509
|
+
const candidateSuppliesBrandId = Object.prototype.hasOwnProperty.call(candidate, 'brandId');
|
|
1510
|
+
const candidateSuppliesSnapshot = Object.prototype.hasOwnProperty.call(candidate, 'deletedRecordMetadata');
|
|
1511
|
+
const candidateSnapshotBrandId = String(_.get(candidate, 'deletedRecordMetadata.metaMetadata.brandId', '') ?? '').trim();
|
|
1512
|
+
if (activeBrandId &&
|
|
1513
|
+
((candidateSuppliesBrandId && candidateBrandId !== activeBrandId) ||
|
|
1514
|
+
(candidateSuppliesSnapshot && candidateSnapshotBrandId !== activeBrandId))) {
|
|
1515
|
+
return this.notApplied(response, 'brand-mismatch', 'Tombstone was not found');
|
|
1516
|
+
}
|
|
1517
|
+
return this.commitConditionalMutation({
|
|
1518
|
+
response,
|
|
1519
|
+
kind: 'updated',
|
|
1520
|
+
dispatch: () => collection.findOneAndUpdate(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options), { $set: candidate, $inc: { revision: 1 } }, { returnDocument: 'after', includeResultMetadata: false }),
|
|
1521
|
+
classify: () => this.classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options),
|
|
1522
|
+
expectedRevision,
|
|
1523
|
+
});
|
|
1524
|
+
}
|
|
1525
|
+
async removeTombstone(brand, oid, options) {
|
|
1526
|
+
const response = this.createMutationResponse(oid, options);
|
|
1527
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1528
|
+
if (expectedRevision === null)
|
|
1529
|
+
return response;
|
|
1530
|
+
if (expectedRevision === undefined ||
|
|
1531
|
+
!options?.lifecycle?.expectedState ||
|
|
1532
|
+
!(0, redbox_core_1.isCanonicalSaveRequestId)(options.lifecycle.operationId)) {
|
|
1533
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact lifecycle removal ownership is required');
|
|
1534
|
+
}
|
|
1535
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1536
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1537
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic tombstone removal is unavailable');
|
|
1538
|
+
}
|
|
1539
|
+
try {
|
|
1540
|
+
const current = this.mutationDocument(await collection.findOne(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options)));
|
|
1541
|
+
if (current && !(await this.ensureRecordIdentity(oid, current))) {
|
|
1542
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
catch (error) {
|
|
1546
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1547
|
+
}
|
|
1548
|
+
return this.commitConditionalMutation({
|
|
1549
|
+
response,
|
|
1550
|
+
kind: 'removed',
|
|
1551
|
+
dispatch: () => collection.findOneAndDelete(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options), { includeResultMetadata: false }),
|
|
1552
|
+
classify: () => this.classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options),
|
|
1553
|
+
expectedRevision,
|
|
1554
|
+
});
|
|
1555
|
+
}
|
|
1556
|
+
async createActiveRecordFromTombstone(brand, oid, record, options) {
|
|
1557
|
+
const response = this.createMutationResponse(oid, options);
|
|
1558
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1559
|
+
const operationId = options?.lifecycle?.operationId;
|
|
1560
|
+
if (expectedRevision === null ||
|
|
1561
|
+
expectedRevision === undefined ||
|
|
1562
|
+
!(0, redbox_core_1.isCanonicalSaveRequestId)(operationId) ||
|
|
1563
|
+
(options?.lifecycle?.expectedState !== 'restore-pending' &&
|
|
1564
|
+
options?.lifecycle?.expectedState !== 'recovery-required')) {
|
|
1565
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact restore ownership is required');
|
|
1566
|
+
}
|
|
1567
|
+
const records = this.getNativeRecordCollection();
|
|
1568
|
+
const tombstones = this.getNativeTombstoneCollection();
|
|
1569
|
+
if (!this.supportsAtomicMutation(records) ||
|
|
1570
|
+
!this.supportsAtomicMutation(tombstones) ||
|
|
1571
|
+
typeof records.insertOne !== 'function') {
|
|
1572
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic restore creation is unavailable');
|
|
1573
|
+
}
|
|
1574
|
+
let claimed;
|
|
1575
|
+
try {
|
|
1576
|
+
claimed = this.mutationDocument(await tombstones.findOne(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options)));
|
|
1577
|
+
}
|
|
1578
|
+
catch (error) {
|
|
1579
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1580
|
+
}
|
|
1581
|
+
if (claimed === undefined)
|
|
1582
|
+
return this.unknownMutation(response, 'Restore ownership could not be observed');
|
|
1583
|
+
if (claimed === null) {
|
|
1584
|
+
const reason = await this.classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options).catch(() => 'capability-unavailable');
|
|
1585
|
+
return this.notApplied(response, reason);
|
|
1586
|
+
}
|
|
1587
|
+
const targetRevision = (0, redbox_core_1.nextRecordRevision)(expectedRevision);
|
|
1588
|
+
const claimedOperation = claimed.lifecycleOperation;
|
|
1589
|
+
const claimedSnapshot = claimed.deletedRecordMetadata;
|
|
1590
|
+
if (!(0, redbox_core_1.isDeletedRecordLifecycleState)(claimed.lifecycleState) ||
|
|
1591
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(claimedOperation) ||
|
|
1592
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(claimed.lifecycleState, claimedOperation.kind) ||
|
|
1593
|
+
claimedOperation.kind !== 'restore' ||
|
|
1594
|
+
claimedOperation.operationId !== operationId ||
|
|
1595
|
+
claimedOperation.targetRevision !== expectedRevision ||
|
|
1596
|
+
!claimedSnapshot ||
|
|
1597
|
+
typeof claimedSnapshot !== 'object' ||
|
|
1598
|
+
Array.isArray(claimedSnapshot)) {
|
|
1599
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Claimed restore state is invalid');
|
|
1600
|
+
}
|
|
1601
|
+
let incarnationId;
|
|
1602
|
+
try {
|
|
1603
|
+
incarnationId = await this.ensureRecordIdentity(oid, claimed);
|
|
1604
|
+
}
|
|
1605
|
+
catch (error) {
|
|
1606
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1607
|
+
}
|
|
1608
|
+
if (!incarnationId) {
|
|
1609
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1610
|
+
}
|
|
1611
|
+
const claimedIncarnationId = this.storedIncarnationId(claimed) ?? this.storedIncarnationId(claimedSnapshot);
|
|
1612
|
+
if (claimedIncarnationId && claimedIncarnationId !== incarnationId) {
|
|
1613
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Restore incarnation identity diverged');
|
|
1614
|
+
}
|
|
1615
|
+
const restoredInput = _.cloneDeep(record);
|
|
1616
|
+
const restored = _.cloneDeep(claimedSnapshot);
|
|
1617
|
+
for (const field of ['_id', 'id', 'revision', 'incarnationId', 'lifecycleOperationId', 'lastSaveDate']) {
|
|
1618
|
+
_.unset(restored, field);
|
|
1619
|
+
}
|
|
1620
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
1621
|
+
if (restoredInput.redboxOid !== oid ||
|
|
1622
|
+
restored.redboxOid !== oid ||
|
|
1623
|
+
(requestedBrandId &&
|
|
1624
|
+
(String(_.get(restoredInput, 'metaMetadata.brandId', '') ?? '').trim() !== requestedBrandId ||
|
|
1625
|
+
String(_.get(restored, 'metaMetadata.brandId', '') ?? '').trim() !== requestedBrandId))) {
|
|
1626
|
+
return this.notApplied(response, 'brand-mismatch', 'Record was not found');
|
|
1627
|
+
}
|
|
1628
|
+
if (this.unsafeCandidateField(restored) !== undefined) {
|
|
1629
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Restored record contains an unsupported field');
|
|
1630
|
+
}
|
|
1631
|
+
const candidate = {
|
|
1632
|
+
...restored,
|
|
1633
|
+
redboxOid: oid,
|
|
1634
|
+
revision: targetRevision,
|
|
1635
|
+
incarnationId,
|
|
1636
|
+
lifecycleOperationId: operationId,
|
|
1637
|
+
lastSaveDate: new Date().toISOString(),
|
|
1638
|
+
};
|
|
1639
|
+
try {
|
|
1640
|
+
await records.insertOne(candidate);
|
|
1641
|
+
return this.committed(response, candidate, 'updated', expectedRevision);
|
|
1642
|
+
}
|
|
1643
|
+
catch (error) {
|
|
1644
|
+
if (!this.isDuplicateKeyError(error)) {
|
|
1645
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1646
|
+
}
|
|
1647
|
+
try {
|
|
1648
|
+
const existing = this.mutationDocument(await records.findOne({ redboxOid: oid }));
|
|
1649
|
+
if (existing === undefined)
|
|
1650
|
+
return this.unknownMutation(response, 'Restored active state could not be observed');
|
|
1651
|
+
if (existing === null)
|
|
1652
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1653
|
+
if (!this.isRequestedBrand(existing, requestedBrandId))
|
|
1654
|
+
return this.notApplied(response, 'brand-mismatch');
|
|
1655
|
+
if (existing.lifecycleOperationId !== operationId ||
|
|
1656
|
+
!(0, redbox_core_1.isRecordRevision)(existing.revision) ||
|
|
1657
|
+
existing.revision < targetRevision) {
|
|
1658
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1659
|
+
}
|
|
1660
|
+
return this.committed(response, existing, 'updated');
|
|
1661
|
+
}
|
|
1662
|
+
catch (readError) {
|
|
1663
|
+
return this.unknownMutation(response, this.getErrorMessage(readError));
|
|
1664
|
+
}
|
|
214
1665
|
}
|
|
215
|
-
|
|
1666
|
+
}
|
|
1667
|
+
async getTombstone(brand, oid) {
|
|
1668
|
+
if (!oid.trim())
|
|
1669
|
+
throw new Error(`${this.logHeader} getTombstone() -> refusing to search using an empty OID`);
|
|
1670
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1671
|
+
if (typeof collection?.findOne !== 'function')
|
|
1672
|
+
throw new Error('Tombstone reads are unavailable');
|
|
1673
|
+
const result = this.mutationDocument(await collection.findOne(this.tombstoneIdentity(brand, oid)));
|
|
1674
|
+
if (result === undefined)
|
|
1675
|
+
throw new Error('Storage returned an unrecognized tombstone result');
|
|
1676
|
+
return result;
|
|
1677
|
+
}
|
|
1678
|
+
async getLifecycleTombstones(states, limit = 100) {
|
|
1679
|
+
const normalizedStates = states.filter(redbox_core_1.isDeletedRecordLifecycleState);
|
|
1680
|
+
if (normalizedStates.length === 0)
|
|
1681
|
+
return [];
|
|
1682
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1683
|
+
if (typeof collection?.find !== 'function')
|
|
1684
|
+
throw new Error('Lifecycle recovery scans are unavailable');
|
|
1685
|
+
const boundedLimit = Math.max(1, Math.min(Number.isSafeInteger(limit) ? limit : 100, 1000));
|
|
1686
|
+
return (await collection
|
|
1687
|
+
.find({ lifecycleState: { $in: normalizedStates } })
|
|
1688
|
+
.limit(boundedLimit)
|
|
1689
|
+
.toArray());
|
|
216
1690
|
}
|
|
217
1691
|
async getMeta(oid) {
|
|
218
1692
|
if (_.isEmpty(oid)) {
|
|
@@ -235,60 +1709,56 @@ var Services;
|
|
|
235
1709
|
sails.log.verbose(`${this.logHeader} finding deleted record: `);
|
|
236
1710
|
sails.log.verbose(JSON.stringify(criteria));
|
|
237
1711
|
const deletedRecord = await DeletedRecord.findOne(criteria);
|
|
238
|
-
|
|
1712
|
+
if (!deletedRecord?.deletedRecordMetadata)
|
|
1713
|
+
return null;
|
|
1714
|
+
const revision = (0, redbox_core_1.isRecordRevision)(deletedRecord.revision) ? deletedRecord.revision : redbox_core_1.INITIAL_RECORD_REVISION;
|
|
1715
|
+
// Tombstone wrapper revision is authoritative even when a legacy
|
|
1716
|
+
// embedded snapshot still contains a historical active revision.
|
|
1717
|
+
return { ...deletedRecord.deletedRecordMetadata, revision };
|
|
239
1718
|
}
|
|
240
1719
|
async createBatch(type, data, harvestIdFldName) {
|
|
241
|
-
const response = new redbox_core_1.
|
|
242
|
-
|
|
243
|
-
let
|
|
244
|
-
|
|
1720
|
+
const response = new redbox_core_1.StorageMutationResponse();
|
|
1721
|
+
let notAppliedCount = 0;
|
|
1722
|
+
let unknownCount = 0;
|
|
1723
|
+
for (const [rowIndex, dataItem] of data.entries()) {
|
|
245
1724
|
dataItem.harvestId = _.get(dataItem, harvestIdFldName, '');
|
|
246
1725
|
_.set(dataItem, 'metaMetadata.type', type);
|
|
247
1726
|
try {
|
|
248
|
-
await this.create(null, dataItem, null, null);
|
|
1727
|
+
const rowResponse = await this.create(null, dataItem, null, null);
|
|
1728
|
+
if (rowResponse.applicationState === 'applied' && rowResponse.success === true) {
|
|
1729
|
+
continue;
|
|
1730
|
+
}
|
|
1731
|
+
if (rowResponse.applicationState === 'not-applied') {
|
|
1732
|
+
notAppliedCount += 1;
|
|
1733
|
+
sails.log.error(`${this.logHeader} createBatch row was not applied`, {
|
|
1734
|
+
event: 'record_batch_create_row_not_applied',
|
|
1735
|
+
row_index: rowIndex,
|
|
1736
|
+
});
|
|
1737
|
+
continue;
|
|
1738
|
+
}
|
|
1739
|
+
unknownCount += 1;
|
|
1740
|
+
sails.log.error(`${this.logHeader} createBatch row outcome is unknown`, {
|
|
1741
|
+
event: 'record_batch_create_row_unknown',
|
|
1742
|
+
row_index: rowIndex,
|
|
1743
|
+
});
|
|
249
1744
|
}
|
|
250
|
-
catch
|
|
251
|
-
|
|
252
|
-
sails.log.error(`${this.logHeader}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
response.message = `${response.message}, ${err.message}`;
|
|
1745
|
+
catch {
|
|
1746
|
+
unknownCount += 1;
|
|
1747
|
+
sails.log.error(`${this.logHeader} createBatch row outcome is unknown`, {
|
|
1748
|
+
event: 'record_batch_create_row_unknown',
|
|
1749
|
+
row_index: rowIndex,
|
|
1750
|
+
});
|
|
257
1751
|
}
|
|
258
|
-
}
|
|
259
|
-
response.success =
|
|
1752
|
+
}
|
|
1753
|
+
response.success = notAppliedCount === 0 && unknownCount === 0;
|
|
1754
|
+
response.applicationState = unknownCount > 0 ? 'unknown' : notAppliedCount > 0 ? 'not-applied' : 'applied';
|
|
1755
|
+
response.message = response.success
|
|
1756
|
+
? ''
|
|
1757
|
+
: `Batch create incomplete (${notAppliedCount} not applied, ${unknownCount} unknown).`;
|
|
260
1758
|
return response;
|
|
261
1759
|
}
|
|
262
|
-
provideUserAccessAndRemovePendingAccess(oid,
|
|
263
|
-
|
|
264
|
-
const metadata = (await this.getMeta(oid));
|
|
265
|
-
const pendingEditArray = _.get(metadata, 'authorization.editPending', []);
|
|
266
|
-
const editArray = _.get(metadata, 'authorization.edit', []);
|
|
267
|
-
const pendingEditArrayFiltered = pendingEditArray.filter(value => value !== pendingValue);
|
|
268
|
-
const pendingEditFound = pendingEditArray.length > pendingEditArrayFiltered.length;
|
|
269
|
-
if (pendingEditFound && !editArray.includes(userid)) {
|
|
270
|
-
editArray.push(userid);
|
|
271
|
-
}
|
|
272
|
-
_.set(metadata, 'authorization.editPending', pendingEditArrayFiltered);
|
|
273
|
-
_.set(metadata, 'authorization.edit', editArray);
|
|
274
|
-
const pendingViewArray = _.get(metadata, 'authorization.viewPending', []);
|
|
275
|
-
const viewArray = _.get(metadata, 'authorization.view', []);
|
|
276
|
-
const pendingViewArrayFiltered = pendingViewArray.filter(value => value !== pendingValue);
|
|
277
|
-
const pendingViewFound = pendingViewArray.length > pendingViewArrayFiltered.length;
|
|
278
|
-
if (pendingViewFound && !viewArray.includes(userid)) {
|
|
279
|
-
viewArray.push(userid);
|
|
280
|
-
}
|
|
281
|
-
_.set(metadata, 'authorization.viewPending', pendingViewArrayFiltered);
|
|
282
|
-
_.set(metadata, 'authorization.view', viewArray);
|
|
283
|
-
try {
|
|
284
|
-
await this.updateMeta(null, oid, metadata);
|
|
285
|
-
}
|
|
286
|
-
catch (err) {
|
|
287
|
-
sails.log.error(`${this.logHeader} Failed to update on 'provideUserAccessAndRemovePendingAccess': `);
|
|
288
|
-
sails.log.error(JSON.stringify(err));
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
batchFn();
|
|
1760
|
+
async provideUserAccessAndRemovePendingAccess(oid, _userid, _pendingValue) {
|
|
1761
|
+
return this.notApplied(this.createMutationResponse(oid), 'capability-unavailable', 'Permission rewrites require the authoritative RecordsService mutation pipeline');
|
|
292
1762
|
}
|
|
293
1763
|
async getRelatedRecords(oid, brand, options = {}) {
|
|
294
1764
|
const mappingContext = await this.walkRelatedRecords(String(oid ?? ''), brand, options);
|
|
@@ -307,8 +1777,8 @@ var Services;
|
|
|
307
1777
|
const record = (await this.getMeta(normalizedOid));
|
|
308
1778
|
const currentRecordTypeName = String(recordTypeName ?? _.get(record, 'metaMetadata.type', '')).trim();
|
|
309
1779
|
const maxDepth = typeof options.depth === 'number' && options.depth >= 0 ? options.depth : Number.POSITIVE_INFINITY;
|
|
310
|
-
const includeRecordTypes = new Set((options.includeRecordTypes ?? []).map(
|
|
311
|
-
const includeRelationIds = new Set((options.includeRelationIds ?? []).map(
|
|
1780
|
+
const includeRecordTypes = new Set((options.includeRecordTypes ?? []).map(value => String(value ?? '').trim()).filter(Boolean));
|
|
1781
|
+
const includeRelationIds = new Set((options.includeRelationIds ?? []).map(value => String(value ?? '').trim()).filter(Boolean));
|
|
312
1782
|
if (_.isEmpty(mappingContext)) {
|
|
313
1783
|
mappingContext = {
|
|
314
1784
|
rootOid: normalizedOid,
|
|
@@ -403,17 +1873,13 @@ var Services;
|
|
|
403
1873
|
extractRelationshipLocalValues(record, relationship) {
|
|
404
1874
|
const rawValue = _.get(record, relationship.localField, relationship.localField === 'redboxOid' ? record.redboxOid : undefined);
|
|
405
1875
|
const values = Array.isArray(rawValue) ? rawValue : [rawValue];
|
|
406
|
-
return values
|
|
407
|
-
.map((value) => String(value ?? '').trim())
|
|
408
|
-
.filter((value) => value !== '');
|
|
1876
|
+
return values.map(value => String(value ?? '').trim()).filter(value => value !== '');
|
|
409
1877
|
}
|
|
410
1878
|
buildRelationshipCriteria(relationship, localValues) {
|
|
411
1879
|
const criteria = {
|
|
412
1880
|
'metaMetadata.type': relationship.recordType,
|
|
413
1881
|
};
|
|
414
|
-
criteria[relationship.foreignField] = localValues.length === 1
|
|
415
|
-
? localValues[0]
|
|
416
|
-
: { in: localValues };
|
|
1882
|
+
criteria[relationship.foreignField] = localValues.length === 1 ? localValues[0] : { in: localValues };
|
|
417
1883
|
return criteria;
|
|
418
1884
|
}
|
|
419
1885
|
async findRelatedRecords(relationship, criteria) {
|
|
@@ -421,8 +1887,9 @@ var Services;
|
|
|
421
1887
|
if (relationship.cardinality === 'one' && typeof query.sort === 'function' && typeof query.limit === 'function') {
|
|
422
1888
|
const chainedQuery = query.sort('redboxOid ASC');
|
|
423
1889
|
if (typeof chainedQuery.limit === 'function') {
|
|
424
|
-
return await chainedQuery.limit(1)
|
|
425
|
-
|
|
1890
|
+
return await chainedQuery.limit(1).meta({
|
|
1891
|
+
enableExperimentalDeepTargets: true,
|
|
1892
|
+
});
|
|
426
1893
|
}
|
|
427
1894
|
}
|
|
428
1895
|
const relatedRecords = await query.meta({ enableExperimentalDeepTargets: true });
|
|
@@ -453,46 +1920,14 @@ var Services;
|
|
|
453
1920
|
targetRecordType: relationship.recordType,
|
|
454
1921
|
};
|
|
455
1922
|
}
|
|
456
|
-
async delete(oid,
|
|
457
|
-
|
|
458
|
-
try {
|
|
459
|
-
if (permanentlyDelete) {
|
|
460
|
-
const datastreams = await this.listDatastreams(oid, null);
|
|
461
|
-
if (_.size(datastreams) > 0) {
|
|
462
|
-
_.each(datastreams, async (file) => {
|
|
463
|
-
sails.log.verbose(`Deleting:`);
|
|
464
|
-
sails.log.verbose(JSON.stringify(file));
|
|
465
|
-
try {
|
|
466
|
-
await this.gridFsBucket.delete(file['_id']);
|
|
467
|
-
}
|
|
468
|
-
catch (err) {
|
|
469
|
-
sails.log.error(`Error deleting: ${file['_id']}`);
|
|
470
|
-
sails.log.error(JSON.stringify(err));
|
|
471
|
-
}
|
|
472
|
-
});
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
else {
|
|
476
|
-
const record = (await this.getMeta(oid));
|
|
477
|
-
const deletedRecord = {
|
|
478
|
-
redboxOid: record.redboxOid,
|
|
479
|
-
deletedRecordMetadata: record,
|
|
480
|
-
};
|
|
481
|
-
await DeletedRecord.create(deletedRecord);
|
|
482
|
-
}
|
|
483
|
-
await Record.destroyOne({ redboxOid: oid });
|
|
484
|
-
response.success = true;
|
|
485
|
-
}
|
|
486
|
-
catch (err) {
|
|
487
|
-
sails.log.error(`${this.logHeader} Failed to delete record: ${oid}`);
|
|
488
|
-
sails.log.error(JSON.stringify(err));
|
|
489
|
-
response.success = false;
|
|
490
|
-
response.message = err.message;
|
|
491
|
-
}
|
|
492
|
-
return response;
|
|
1923
|
+
async delete(oid, _permanentlyDelete = false, options) {
|
|
1924
|
+
return this.notApplied(this.createMutationResponse(oid, options), 'capability-unavailable', 'Record deletion requires staged lifecycle orchestration');
|
|
493
1925
|
}
|
|
494
1926
|
async updateNotificationLog(oid, record, options) {
|
|
495
1927
|
if (super.metTriggerCondition(oid, record, options) == 'true') {
|
|
1928
|
+
if (_.get(options, 'saveRecord', false)) {
|
|
1929
|
+
return this.notApplied(this.createMutationResponse(oid), 'capability-unavailable', 'Notification writes require the authoritative RecordsService mutation pipeline');
|
|
1930
|
+
}
|
|
496
1931
|
sails.log.verbose(`${this.logHeader} Updating notification log for oid: ${oid}`);
|
|
497
1932
|
const logName = _.get(options, 'logName', null);
|
|
498
1933
|
if (logName) {
|
|
@@ -513,16 +1948,6 @@ var Services;
|
|
|
513
1948
|
sails.log.verbose(`======== Notification log updates =========`);
|
|
514
1949
|
sails.log.verbose(JSON.stringify(record));
|
|
515
1950
|
sails.log.verbose(`======== End update =========`);
|
|
516
|
-
if (_.get(options, 'saveRecord', false)) {
|
|
517
|
-
try {
|
|
518
|
-
await this.updateMeta(null, oid, record, null);
|
|
519
|
-
}
|
|
520
|
-
catch (err) {
|
|
521
|
-
sails.log.error(`${this.logHeader} Failed to update notification log of ${oid}:`);
|
|
522
|
-
sails.log.error(JSON.stringify(err));
|
|
523
|
-
throw err;
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
1951
|
}
|
|
527
1952
|
else {
|
|
528
1953
|
sails.log.verbose(`Notification log name: '${options.name}', for oid: ${oid}, not running, condition not met: ${options.triggerCondition}`);
|
|
@@ -854,7 +2279,7 @@ var Services;
|
|
|
854
2279
|
objectMode: true,
|
|
855
2280
|
transform(record, _encoding, callback) {
|
|
856
2281
|
callback(null, sanitizeCsvRecord(record));
|
|
857
|
-
}
|
|
2282
|
+
},
|
|
858
2283
|
});
|
|
859
2284
|
const json2csv = new json2csv_1.Transform({ fields, transforms: [flatten()] }, { objectMode: true });
|
|
860
2285
|
await (0, promises_1.pipeline)(stream.Readable.from(this.fetchAllRecords(query, { ...options })), sanitize, json2csv, passThrough);
|
|
@@ -984,6 +2409,15 @@ var Services;
|
|
|
984
2409
|
sails.log.verbose(`${this.logHeader} removeDatastream() -> File not found: ${fileName}`);
|
|
985
2410
|
}
|
|
986
2411
|
}
|
|
2412
|
+
async removeStagedDatastream(fileId) {
|
|
2413
|
+
const normalizedFileId = (0, redbox_core_1.normalizeAttachmentStagingFileId)(fileId);
|
|
2414
|
+
if (!normalizedFileId)
|
|
2415
|
+
throw new Error('Invalid staged attachment identity.');
|
|
2416
|
+
const stagingDisk = StorageManagerService.stagingDisk();
|
|
2417
|
+
if (await stagingDisk.exists(normalizedFileId)) {
|
|
2418
|
+
await stagingDisk.delete(normalizedFileId);
|
|
2419
|
+
}
|
|
2420
|
+
}
|
|
987
2421
|
async addDatastream(oid, datastream, stagingDisk) {
|
|
988
2422
|
const fileId = datastream.fileId;
|
|
989
2423
|
sails.log.verbose(`${this.logHeader} addDatastream() -> Meta: ${fileId}`);
|
|
@@ -1067,12 +2501,101 @@ var Services;
|
|
|
1067
2501
|
return undefined;
|
|
1068
2502
|
}
|
|
1069
2503
|
}
|
|
2504
|
+
sanitizeRecordHookExecutionSummary(value) {
|
|
2505
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
2506
|
+
return undefined;
|
|
2507
|
+
}
|
|
2508
|
+
const source = value;
|
|
2509
|
+
if (source.schemaVersion !== 1 || source.trigger !== 'record-hook') {
|
|
2510
|
+
return undefined;
|
|
2511
|
+
}
|
|
2512
|
+
const safeStatuses = new Set(['succeeded', 'failed', 'timed_out', 'interrupted', 'skipped', 'dispatched']);
|
|
2513
|
+
const safeKinds = new Set([
|
|
2514
|
+
'configuration',
|
|
2515
|
+
'validation',
|
|
2516
|
+
'domain',
|
|
2517
|
+
'transient',
|
|
2518
|
+
'timeout',
|
|
2519
|
+
'interrupted',
|
|
2520
|
+
'unexpected',
|
|
2521
|
+
]);
|
|
2522
|
+
const safeReasons = new Set([
|
|
2523
|
+
'prior_action_failed',
|
|
2524
|
+
'phase_not_reached',
|
|
2525
|
+
'save_not_persisted',
|
|
2526
|
+
'trigger_disabled',
|
|
2527
|
+
]);
|
|
2528
|
+
const actions = Array.isArray(source.actions)
|
|
2529
|
+
? source.actions.slice(0, 100).flatMap(item => {
|
|
2530
|
+
if (!item || typeof item !== 'object' || Array.isArray(item))
|
|
2531
|
+
return [];
|
|
2532
|
+
const action = item;
|
|
2533
|
+
if (typeof action.actionId !== 'string' ||
|
|
2534
|
+
typeof action.mode !== 'string' ||
|
|
2535
|
+
typeof action.phase !== 'string' ||
|
|
2536
|
+
typeof action.status !== 'string' ||
|
|
2537
|
+
!safeStatuses.has(action.status))
|
|
2538
|
+
return [];
|
|
2539
|
+
const result = {
|
|
2540
|
+
actionId: action.actionId.slice(0, 128),
|
|
2541
|
+
mode: action.mode,
|
|
2542
|
+
phase: action.phase,
|
|
2543
|
+
status: action.status,
|
|
2544
|
+
attempts: Number.isInteger(action.attempts) && Number(action.attempts) >= 0 ? Number(action.attempts) : 0,
|
|
2545
|
+
durationMs: Number.isInteger(action.durationMs) && Number(action.durationMs) >= 0 ? Number(action.durationMs) : 0,
|
|
2546
|
+
};
|
|
2547
|
+
if (typeof action.failureKind === 'string' && safeKinds.has(action.failureKind))
|
|
2548
|
+
result.failureKind = action.failureKind;
|
|
2549
|
+
if (typeof action.failureCode === 'string' && action.failureCode.length <= 128)
|
|
2550
|
+
result.failureCode = action.failureCode;
|
|
2551
|
+
if (typeof action.skippedReason === 'string' && safeReasons.has(action.skippedReason))
|
|
2552
|
+
result.skippedReason = action.skippedReason;
|
|
2553
|
+
return [result];
|
|
2554
|
+
})
|
|
2555
|
+
: [];
|
|
2556
|
+
const counts = {};
|
|
2557
|
+
if (source.counts && typeof source.counts === 'object' && !Array.isArray(source.counts)) {
|
|
2558
|
+
for (const [key, count] of Object.entries(source.counts)) {
|
|
2559
|
+
if (safeStatuses.has(key) && Number.isInteger(count) && Number(count) >= 0)
|
|
2560
|
+
counts[key] = Number(count);
|
|
2561
|
+
}
|
|
2562
|
+
}
|
|
2563
|
+
const summary = {
|
|
2564
|
+
schemaVersion: 1,
|
|
2565
|
+
executionId: typeof source.executionId === 'string' ? source.executionId.slice(0, 128) : '',
|
|
2566
|
+
trigger: 'record-hook',
|
|
2567
|
+
operation: ['create', 'update', 'delete', 'transition'].includes(String(source.operation))
|
|
2568
|
+
? source.operation
|
|
2569
|
+
: 'update',
|
|
2570
|
+
partial: source.partial === true,
|
|
2571
|
+
durationMs: Number.isInteger(source.durationMs) && Number(source.durationMs) >= 0 ? Number(source.durationMs) : 0,
|
|
2572
|
+
totalActions: Number.isInteger(source.totalActions) && Number(source.totalActions) >= 0
|
|
2573
|
+
? Number(source.totalActions)
|
|
2574
|
+
: actions.length,
|
|
2575
|
+
counts,
|
|
2576
|
+
actions,
|
|
2577
|
+
truncated: source.truncated === true,
|
|
2578
|
+
};
|
|
2579
|
+
if (typeof source.requestId === 'string' && source.requestId.length <= 128)
|
|
2580
|
+
summary.requestId = source.requestId;
|
|
2581
|
+
if (['pre', 'persistence', 'postSync', 'post-dispatch'].includes(String(source.completedThrough))) {
|
|
2582
|
+
summary.completedThrough = source.completedThrough;
|
|
2583
|
+
}
|
|
2584
|
+
if (['complete', 'grace-expired'].includes(String(source.detachedFinalization))) {
|
|
2585
|
+
summary.detachedFinalization = source.detachedFinalization;
|
|
2586
|
+
}
|
|
2587
|
+
if (Number.isInteger(source.detachedPending) && Number(source.detachedPending) > 0) {
|
|
2588
|
+
summary.detachedPending = Number(source.detachedPending);
|
|
2589
|
+
}
|
|
2590
|
+
return summary;
|
|
2591
|
+
}
|
|
1070
2592
|
sanitizeRecordAudit(recordAudit) {
|
|
1071
2593
|
const payload = {
|
|
1072
2594
|
redboxOid: recordAudit.redboxOid,
|
|
1073
2595
|
action: recordAudit.action,
|
|
1074
2596
|
user: this.toJsonSafe(recordAudit.user),
|
|
1075
2597
|
record: this.toJsonSafe(recordAudit.record),
|
|
2598
|
+
executionSummary: this.sanitizeRecordHookExecutionSummary(recordAudit.executionSummary),
|
|
1076
2599
|
};
|
|
1077
2600
|
if (_.isUndefined(payload.user)) {
|
|
1078
2601
|
delete payload.user;
|
|
@@ -1080,6 +2603,9 @@ var Services;
|
|
|
1080
2603
|
if (_.isUndefined(payload.record)) {
|
|
1081
2604
|
delete payload.record;
|
|
1082
2605
|
}
|
|
2606
|
+
if (_.isUndefined(payload.executionSummary)) {
|
|
2607
|
+
delete payload.executionSummary;
|
|
2608
|
+
}
|
|
1083
2609
|
return payload;
|
|
1084
2610
|
}
|
|
1085
2611
|
sanitizeIntegrationAudit(audit) {
|
|
@@ -1255,53 +2781,11 @@ var Services;
|
|
|
1255
2781
|
sails.log.verbose(JSON.stringify(criteria));
|
|
1256
2782
|
return await IntegrationAudit.count(criteria);
|
|
1257
2783
|
}
|
|
1258
|
-
async restoreRecord(oid) {
|
|
1259
|
-
|
|
1260
|
-
if (_.isEmpty(oid)) {
|
|
1261
|
-
const msg = `${this.logHeader} restoreRecord() -> refusing to search using an empty OID`;
|
|
1262
|
-
sails.log.error(msg);
|
|
1263
|
-
throw new Error(msg);
|
|
1264
|
-
}
|
|
1265
|
-
try {
|
|
1266
|
-
sails.log.verbose(`${this.logHeader} Restoring record ${oid} to DB...`);
|
|
1267
|
-
const deletedRecord = await DeletedRecord.findOne({ redboxOid: oid });
|
|
1268
|
-
delete deletedRecord.deletedRecordMetadata._id;
|
|
1269
|
-
const record = await Record.create(deletedRecord.deletedRecordMetadata);
|
|
1270
|
-
response.metadata = record;
|
|
1271
|
-
await DeletedRecord.destroyOne({ redboxOid: oid });
|
|
1272
|
-
response.success = true;
|
|
1273
|
-
sails.log.verbose(`${this.logHeader} Record restored...`);
|
|
1274
|
-
return response;
|
|
1275
|
-
}
|
|
1276
|
-
catch (err) {
|
|
1277
|
-
sails.log.error(`${this.logHeader} Failed to create Record:`);
|
|
1278
|
-
sails.log.error(JSON.stringify(err));
|
|
1279
|
-
response.success = false;
|
|
1280
|
-
response.message = this.getErrorMessage(err);
|
|
1281
|
-
return response;
|
|
1282
|
-
}
|
|
2784
|
+
async restoreRecord(oid, options) {
|
|
2785
|
+
return this.notApplied(this.createMutationResponse(oid, options), 'capability-unavailable', 'Record restoration requires staged lifecycle orchestration');
|
|
1283
2786
|
}
|
|
1284
|
-
async destroyDeletedRecord(oid) {
|
|
1285
|
-
|
|
1286
|
-
if (_.isEmpty(oid)) {
|
|
1287
|
-
const msg = `${this.logHeader} destroyRecord() -> refusing to search using an empty OID`;
|
|
1288
|
-
sails.log.error(msg);
|
|
1289
|
-
throw new Error(msg);
|
|
1290
|
-
}
|
|
1291
|
-
try {
|
|
1292
|
-
sails.log.verbose(`${this.logHeader} destroying deleted record ${oid} to DB...`);
|
|
1293
|
-
await DeletedRecord.destroyOne({ redboxOid: oid });
|
|
1294
|
-
response.success = true;
|
|
1295
|
-
sails.log.verbose(`${this.logHeader} deleted record destroyed...`);
|
|
1296
|
-
return response;
|
|
1297
|
-
}
|
|
1298
|
-
catch (err) {
|
|
1299
|
-
sails.log.error(`${this.logHeader} Failed to create Record:`);
|
|
1300
|
-
sails.log.error(JSON.stringify(err));
|
|
1301
|
-
response.success = false;
|
|
1302
|
-
response.message = this.getErrorMessage(err);
|
|
1303
|
-
return response;
|
|
1304
|
-
}
|
|
2787
|
+
async destroyDeletedRecord(oid, options) {
|
|
2788
|
+
return this.notApplied(this.createMutationResponse(oid, options), 'capability-unavailable', 'Tombstone destruction requires staged lifecycle orchestration');
|
|
1305
2789
|
}
|
|
1306
2790
|
getFileWithName(fileName, options = { limit: 1 }) {
|
|
1307
2791
|
return this.gridFsBucket.find({ filename: fileName }, options);
|
|
@@ -1312,4 +2796,4 @@ var Services;
|
|
|
1312
2796
|
}
|
|
1313
2797
|
Services.MongoStorageService = MongoStorageService;
|
|
1314
2798
|
})(Services || (exports.Services = Services = {}));
|
|
1315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uZ29TdG9yYWdlU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9Nb25nb1N0b3JhZ2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFzRDtBQUN0RCwrQkFBZ0M7QUFDaEMsbUNBQW9DO0FBR3BDLGlDQUFpQztBQUVqQyxtQ0FBb0M7QUFFcEMsc0NBQXVDO0FBQ3ZDLG1EQUFnRDtBQUNoRCx1Q0FBaUQ7QUFDakQsOERBb0JzQztBQUN0Qyw4REFBcUU7QUFDckUsOERBQWtHO0FBRWxHLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBVSxDQUFDO0FBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUUxQixNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0FBQzlDLFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQ0UsS0FBSyxJQUFJLElBQUk7UUFDYixPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQzVGLENBQUM7UUFDRCxPQUFPLGlCQUFpQixDQUFDLEtBQWdDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FB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
|
|
2799
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uZ29TdG9yYWdlU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9Nb25nb1N0b3JhZ2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFzRDtBQUN0RCwrQkFBZ0M7QUFDaEMsbUNBQW9DO0FBQ3BDLHlDQUE4QztBQUc5QyxpQ0FBaUM7QUFFakMsbUNBQW9DO0FBYXBDLHNDQUF1QztBQUN2QyxtREFBZ0Q7QUFDaEQsdUNBQWlEO0FBQ2pELDhEQW1Dc0M7QUFXdEMsOERBQXFFO0FBQ3JFLDhEQUFrRztBQUNsRywyRUFBc0Y7QUFDdEYsdUVBWW1DO0FBRW5DLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBVSxDQUFDO0FBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUUxQixNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0FBQzlDLFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQ0UsS0FBSyxJQUFJLElBQUk7UUFDYixPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQzVGLENBQUM7UUFDRCxPQUFPLGlCQUFpQixDQUFDLEtBQWdDLENBQUMsQ0FBQztJQUM3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
|