@memberjunction/archiving-engine 0.0.1 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,403 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { CompositeKey, LogError, LogStatus, Metadata, RunView } from '@memberjunction/core';
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { BaseArchiveDriver } from './BaseArchiveDriver.js';
10
+ /**
11
+ * Default archive driver implementation. Archives configured field values to
12
+ * external storage, applies the appropriate post-archive action based on mode
13
+ * (StripFields, HardDelete, ArchiveOnly), and supports restoring the original
14
+ * values from the stored archive document.
15
+ */
16
+ let DefaultArchiveDriver = class DefaultArchiveDriver extends BaseArchiveDriver {
17
+ /**
18
+ * Determines whether the record should be archived by checking if at least
19
+ * one of the configured fields (or SkipIfAllNullFields) has a non-null value.
20
+ * If no specific fields are configured but ArchiveFullRecord is true,
21
+ * always archives — the intent is a full record snapshot, not field stripping.
22
+ */
23
+ ShouldArchiveRecord(context) {
24
+ const fieldsToCheck = this.GetFieldsToCheck(context);
25
+ // If no specific fields are configured but ArchiveFullRecord is true,
26
+ // always archive — the intent is a full record snapshot, not field stripping
27
+ if (fieldsToCheck.length === 0) {
28
+ return context.FieldConfig.ArchiveFullRecord === true;
29
+ }
30
+ return fieldsToCheck.some(fieldName => {
31
+ const value = context.Record.Get(fieldName);
32
+ return value != null;
33
+ });
34
+ }
35
+ /**
36
+ * Archives a single record:
37
+ * 1. Builds the archive document with field values
38
+ * 2. Writes the document to external storage
39
+ * 3. Applies the post-archive action based on mode:
40
+ * - StripFields: nullifies configured fields on the source record
41
+ * - HardDelete: cascades to archive+delete dependent records, then deletes the source record
42
+ * - ArchiveOnly: no changes to the source record
43
+ */
44
+ async ArchiveRecord(context) {
45
+ try {
46
+ const versionStamp = new Date();
47
+ const document = this.BuildArchiveDocument(context, versionStamp);
48
+ const storagePath = this.BuildStoragePath(context.BasePath, context.Record.EntityInfo.Name, document.recordId, versionStamp);
49
+ const writeResult = await this.WriteDocumentToStorage(context, storagePath, document);
50
+ if (!writeResult.Success) {
51
+ return writeResult;
52
+ }
53
+ const postArchiveResult = await this.ApplyPostArchiveAction(context);
54
+ if (!postArchiveResult.Success) {
55
+ return postArchiveResult;
56
+ }
57
+ return {
58
+ Success: true,
59
+ StoragePath: storagePath,
60
+ BytesArchived: writeResult.BytesArchived,
61
+ };
62
+ }
63
+ catch (error) {
64
+ const message = error instanceof Error ? error.message : String(error);
65
+ LogError(`DefaultArchiveDriver.ArchiveRecord failed: ${message}`);
66
+ return {
67
+ Success: false,
68
+ StoragePath: null,
69
+ BytesArchived: 0,
70
+ ErrorMessage: message,
71
+ };
72
+ }
73
+ }
74
+ /**
75
+ * Restores a previously archived record by reading the archive document
76
+ * from storage and setting the field values back on the source record.
77
+ */
78
+ async RestoreRecord(context) {
79
+ try {
80
+ const storagePath = context.ArchiveRunDetail.Get('StoragePath');
81
+ if (!storagePath) {
82
+ return { Success: false, ErrorMessage: 'No StoragePath on ArchiveRunDetail', RestoredFields: [] };
83
+ }
84
+ const document = await this.ReadDocumentFromStorage(context, storagePath);
85
+ const restoredFields = await this.ApplyArchivedFieldsToRecord(context, document);
86
+ return {
87
+ Success: true,
88
+ RestoredFields: restoredFields,
89
+ };
90
+ }
91
+ catch (error) {
92
+ const message = error instanceof Error ? error.message : String(error);
93
+ LogError(`DefaultArchiveDriver.RestoreRecord failed: ${message}`);
94
+ return {
95
+ Success: false,
96
+ ErrorMessage: message,
97
+ RestoredFields: [],
98
+ };
99
+ }
100
+ }
101
+ // ========================================
102
+ // ShouldArchive Helpers
103
+ // ========================================
104
+ /**
105
+ * Determines which fields to check for the "should archive" decision.
106
+ * Uses SkipIfAllNullFields if configured, otherwise all active field names.
107
+ */
108
+ GetFieldsToCheck(context) {
109
+ if (context.FieldConfig.SkipIfAllNullFields && context.FieldConfig.SkipIfAllNullFields.length > 0) {
110
+ return context.FieldConfig.SkipIfAllNullFields;
111
+ }
112
+ return context.FieldConfig.Fields
113
+ .filter(f => f.IsActive !== false)
114
+ .map(f => f.FieldName);
115
+ }
116
+ // ========================================
117
+ // Storage Write
118
+ // ========================================
119
+ /**
120
+ * Serializes the archive document and writes it to storage.
121
+ */
122
+ async WriteDocumentToStorage(context, storagePath, document) {
123
+ const jsonContent = JSON.stringify(document, null, 2);
124
+ const buffer = Buffer.from(jsonContent, 'utf8');
125
+ const success = await context.StorageDriver.PutObject(storagePath, buffer, 'application/json');
126
+ if (!success) {
127
+ return {
128
+ Success: false,
129
+ BytesArchived: 0,
130
+ StoragePath: null,
131
+ ErrorMessage: `Failed to write archive document to storage path: ${storagePath}`,
132
+ };
133
+ }
134
+ LogStatus(`Archived record to ${storagePath} (${buffer.byteLength} bytes)`);
135
+ return { Success: true, BytesArchived: buffer.byteLength, StoragePath: storagePath };
136
+ }
137
+ // ========================================
138
+ // Post-Archive Mode Handling
139
+ // ========================================
140
+ /**
141
+ * Resolves the effective archive mode from the entity config or parent config.
142
+ */
143
+ ResolveMode(context) {
144
+ return context.ConfigEntity.Get('Mode')
145
+ ?? context.Config.Get('DefaultMode')
146
+ ?? 'StripFields';
147
+ }
148
+ /**
149
+ * Applies the appropriate post-archive action based on the resolved mode.
150
+ */
151
+ async ApplyPostArchiveAction(context) {
152
+ const mode = this.ResolveMode(context);
153
+ switch (mode) {
154
+ case 'StripFields':
155
+ return this.NullifyArchivedFields(context);
156
+ case 'HardDelete':
157
+ return this.HardDeleteRecord(context);
158
+ case 'ArchiveOnly':
159
+ return { Success: true, StoragePath: null, BytesArchived: 0 };
160
+ default:
161
+ return {
162
+ Success: false,
163
+ StoragePath: null,
164
+ BytesArchived: 0,
165
+ ErrorMessage: `Unknown archive mode: ${mode}`,
166
+ };
167
+ }
168
+ }
169
+ // ========================================
170
+ // StripFields Mode
171
+ // ========================================
172
+ /**
173
+ * Sets all configured archive fields to their empty value on the source record and saves it.
174
+ * Uses null for nullable columns and empty string for NOT NULL string columns.
175
+ */
176
+ async NullifyArchivedFields(context) {
177
+ for (const fieldConfig of context.FieldConfig.Fields) {
178
+ if (fieldConfig.IsActive !== false) {
179
+ const emptyValue = this.GetEmptyValueForField(context, fieldConfig.FieldName);
180
+ context.Record.Set(fieldConfig.FieldName, emptyValue);
181
+ }
182
+ }
183
+ const saveResult = await context.Record.Save();
184
+ if (!saveResult) {
185
+ return {
186
+ Success: false,
187
+ StoragePath: null,
188
+ BytesArchived: 0,
189
+ ErrorMessage: `Failed to save record after nullifying archived fields: ${context.Record.LatestResult?.CompleteMessage ?? 'Unknown error'}`,
190
+ };
191
+ }
192
+ return { Success: true, StoragePath: null, BytesArchived: 0 };
193
+ }
194
+ /**
195
+ * Returns the appropriate empty value for a field based on its nullability.
196
+ * NOT NULL string fields get empty string; nullable fields get null.
197
+ */
198
+ GetEmptyValueForField(context, fieldName) {
199
+ const fieldInfo = context.Record.EntityInfo.Fields.find(f => f.Name === fieldName);
200
+ if (fieldInfo && !fieldInfo.AllowsNull) {
201
+ return '';
202
+ }
203
+ return null;
204
+ }
205
+ // ========================================
206
+ // HardDelete Mode (with Cascade)
207
+ // ========================================
208
+ /**
209
+ * Deletes the source record from the database after successful archival.
210
+ * Automatically cascades to dependent (child) records via FK relationships
211
+ * discovered from entity metadata, archiving each child to storage before deleting it.
212
+ */
213
+ async HardDeleteRecord(context) {
214
+ const cascadeResult = await this.ArchiveAndDeleteDependentRecords(context);
215
+ if (!cascadeResult.Success) {
216
+ return cascadeResult;
217
+ }
218
+ const deleteResult = await context.Record.Delete();
219
+ if (!deleteResult) {
220
+ return {
221
+ Success: false,
222
+ StoragePath: null,
223
+ BytesArchived: 0,
224
+ ErrorMessage: `Failed to delete record after archiving: ${context.Record.LatestResult?.CompleteMessage ?? 'Unknown error'}`,
225
+ };
226
+ }
227
+ return { Success: true, StoragePath: null, BytesArchived: 0 };
228
+ }
229
+ /**
230
+ * Collects all dependent records depth-first, writes one batch archive file
231
+ * per entity to storage, then deletes all records leaf-first. This batched
232
+ * approach dramatically reduces storage API calls compared to per-record writes.
233
+ */
234
+ async ArchiveAndDeleteDependentRecords(context) {
235
+ // 1. Collect all dependent records depth-first (leaves first in the resulting array)
236
+ const collectedRecords = [];
237
+ await this.CollectDependentsDepthFirst(context.Record, context.ContextUser, collectedRecords, new Set());
238
+ if (collectedRecords.length === 0) {
239
+ return { Success: true, StoragePath: null, BytesArchived: 0 };
240
+ }
241
+ LogStatus(`HardDelete cascade: collected ${collectedRecords.length} dependent record(s) across ${new Set(collectedRecords.map(r => r.EntityInfo.Name)).size} entity type(s)`);
242
+ // 2. Batch-archive: group records by entity name and write one file per entity
243
+ const archiveResult = await this.BatchArchiveDependents(collectedRecords, context);
244
+ if (!archiveResult.Success) {
245
+ return archiveResult;
246
+ }
247
+ // 3. Delete all records (already in leaf-first order from depth-first collection)
248
+ for (const record of collectedRecords) {
249
+ const deleted = await record.Delete();
250
+ if (!deleted) {
251
+ return {
252
+ Success: false,
253
+ StoragePath: null,
254
+ BytesArchived: 0,
255
+ ErrorMessage: `Failed to cascade-delete ${record.EntityInfo.Name} record ${record.PrimaryKey.Values()}: ${record.LatestResult?.CompleteMessage ?? 'Unknown error'}`,
256
+ };
257
+ }
258
+ }
259
+ return { Success: true, StoragePath: null, BytesArchived: 0 };
260
+ }
261
+ /**
262
+ * Recursively collects all dependent records depth-first. Leaves (deepest
263
+ * children) are added to the array first, so deleting in array order
264
+ * respects FK constraints. Uses a visited set to prevent infinite loops
265
+ * from circular references.
266
+ */
267
+ async CollectDependentsDepthFirst(parentRecord, contextUser, collected, visited) {
268
+ const entityInfo = parentRecord.EntityInfo;
269
+ const recordKey = `${entityInfo.ID}:${parentRecord.PrimaryKey.Values()}`;
270
+ if (visited.has(recordKey))
271
+ return;
272
+ visited.add(recordKey);
273
+ const cascadeRels = entityInfo.RelatedEntities.filter(r => r.Type?.trim() === 'One To Many' && r.RelatedEntityID !== entityInfo.ID);
274
+ for (const rel of cascadeRels) {
275
+ const childEntityName = rel.RelatedEntity;
276
+ const joinField = rel.RelatedEntityJoinField;
277
+ if (!childEntityName || !joinField)
278
+ continue;
279
+ const childRecords = await this.LoadChildRecords(childEntityName, joinField, parentRecord.PrimaryKey.Values(), contextUser);
280
+ for (const child of childRecords) {
281
+ // Recurse into grandchildren first (depth-first)
282
+ await this.CollectDependentsDepthFirst(child, contextUser, collected, visited);
283
+ // Then add this child (so it appears after its own dependents)
284
+ const childKey = `${child.EntityInfo.ID}:${child.PrimaryKey.Values()}`;
285
+ if (!visited.has(childKey)) {
286
+ visited.add(childKey);
287
+ }
288
+ collected.push(child);
289
+ }
290
+ }
291
+ }
292
+ /**
293
+ * Groups collected records by entity name and writes one batch archive
294
+ * document per entity to storage. A batch document contains all records
295
+ * of that entity type in a single JSON array, dramatically reducing
296
+ * the number of storage API calls.
297
+ */
298
+ async BatchArchiveDependents(records, context) {
299
+ // Group by entity name
300
+ const byEntity = new Map();
301
+ for (const record of records) {
302
+ const name = record.EntityInfo.Name;
303
+ if (!byEntity.has(name)) {
304
+ byEntity.set(name, []);
305
+ }
306
+ byEntity.get(name).push(record);
307
+ }
308
+ const versionStamp = new Date();
309
+ const parentRecordId = context.Record.PrimaryKey.Values();
310
+ for (const [entityName, entityRecords] of byEntity) {
311
+ const batchDocument = {
312
+ archiveVersion: 1,
313
+ batchType: 'cascade-delete',
314
+ parentEntityName: context.Record.EntityInfo.Name,
315
+ parentRecordId: parentRecordId,
316
+ entityName: entityName,
317
+ archivedAt: versionStamp.toISOString(),
318
+ recordCount: entityRecords.length,
319
+ records: entityRecords.map(r => ({
320
+ recordId: r.PrimaryKey.Values(),
321
+ primaryKey: r.PrimaryKey.KeyValuePairs.map(kv => ({
322
+ FieldName: kv.FieldName,
323
+ Value: String(kv.Value),
324
+ })),
325
+ fullRecord: r.GetAll(),
326
+ })),
327
+ };
328
+ const sanitizedEntity = entityName.replace(/[^a-zA-Z0-9]/g, '_');
329
+ const sanitizedParent = parentRecordId.replace(/[^a-zA-Z0-9-]/g, '_');
330
+ const storagePath = `${context.BasePath}/${sanitizedEntity}/cascade_${sanitizedParent}_${versionStamp.toISOString().replace(/[:.]/g, '_')}.json`;
331
+ const jsonContent = JSON.stringify(batchDocument, null, 2);
332
+ const batchBuffer = Buffer.from(jsonContent, 'utf8');
333
+ const writeSuccess = await context.StorageDriver.PutObject(storagePath, batchBuffer, 'application/json');
334
+ if (!writeSuccess) {
335
+ return {
336
+ Success: false,
337
+ StoragePath: null,
338
+ BytesArchived: 0,
339
+ ErrorMessage: `Failed to batch-archive ${entityRecords.length} ${entityName} record(s) to storage`,
340
+ };
341
+ }
342
+ LogStatus(`Cascade batch-archived ${entityRecords.length} ${entityName} record(s) to ${storagePath} (${batchBuffer.byteLength} bytes)`);
343
+ }
344
+ return { Success: true, StoragePath: null, BytesArchived: 0 };
345
+ }
346
+ /**
347
+ * Loads all records from a child entity that reference a parent record via a join field.
348
+ */
349
+ async LoadChildRecords(entityName, joinField, parentRecordId, contextUser) {
350
+ const rv = new RunView();
351
+ const escapedId = parentRecordId.replace(/'/g, "''");
352
+ const result = await rv.RunView({
353
+ EntityName: entityName,
354
+ ExtraFilter: `${joinField}='${escapedId}'`,
355
+ ResultType: 'entity_object',
356
+ }, contextUser);
357
+ if (!result.Success) {
358
+ LogError(`Failed to load dependent ${entityName} records for cascade delete: ${result.ErrorMessage}`);
359
+ return [];
360
+ }
361
+ return result.Results;
362
+ }
363
+ // ========================================
364
+ // Restore Helpers
365
+ // ========================================
366
+ /**
367
+ * Reads and parses an archive document from storage.
368
+ */
369
+ async ReadDocumentFromStorage(context, storagePath) {
370
+ const buffer = await context.StorageDriver.GetObject({ fullPath: storagePath });
371
+ const jsonContent = buffer.toString('utf8');
372
+ return JSON.parse(jsonContent);
373
+ }
374
+ /**
375
+ * Applies the archived field values from the document back onto the entity record and saves.
376
+ */
377
+ async ApplyArchivedFieldsToRecord(context, document) {
378
+ const entityName = document.entityName;
379
+ const md = new Metadata();
380
+ const record = await md.GetEntityObject(entityName, context.ContextUser);
381
+ const compositeKey = new CompositeKey(document.primaryKey.map(pk => ({ FieldName: pk.FieldName, Value: pk.Value })));
382
+ const loaded = await record.InnerLoad(compositeKey);
383
+ if (!loaded) {
384
+ throw new Error(`Failed to load record for entity "${entityName}" with key: ${JSON.stringify(document.primaryKey)}`);
385
+ }
386
+ const restoredFields = [];
387
+ for (const [fieldName, fieldValue] of Object.entries(document.archivedFields)) {
388
+ record.Set(fieldName, fieldValue);
389
+ restoredFields.push(fieldName);
390
+ }
391
+ const saveResult = await record.Save();
392
+ if (!saveResult) {
393
+ throw new Error(`Failed to save restored record: ${record.LatestResult?.CompleteMessage ?? 'Unknown error'}`);
394
+ }
395
+ LogStatus(`Restored ${restoredFields.length} fields for ${entityName} record ${document.recordId}`);
396
+ return restoredFields;
397
+ }
398
+ };
399
+ DefaultArchiveDriver = __decorate([
400
+ RegisterClass(BaseArchiveDriver, 'DefaultArchiveDriver')
401
+ ], DefaultArchiveDriver);
402
+ export { DefaultArchiveDriver };
403
+ //# sourceMappingURL=DefaultArchiveDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultArchiveDriver.js","sourceRoot":"","sources":["../src/DefaultArchiveDriver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './types.js';
2
+ export * from './BaseArchiveDriver.js';
3
+ export * from './DefaultArchiveDriver.js';
4
+ export * from './ArchiveStorageManager.js';
5
+ export * from './ArchiveProcessor.js';
6
+ export * from './ArchiveRecovery.js';
7
+ export * from './ArchiveEngine.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from './types.js';
2
+ export * from './BaseArchiveDriver.js';
3
+ export * from './DefaultArchiveDriver.js';
4
+ export * from './ArchiveStorageManager.js';
5
+ export * from './ArchiveProcessor.js';
6
+ export * from './ArchiveRecovery.js';
7
+ export * from './ArchiveEngine.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { BaseEntity, UserInfo } from '@memberjunction/core';
2
+ import { FileStorageBase } from '@memberjunction/storage';
3
+ /**
4
+ * Configuration for which fields to archive on an entity.
5
+ */
6
+ export interface ArchiveFieldConfiguration {
7
+ /** List of field-level configurations */
8
+ Fields: ArchiveFieldConfig[];
9
+ /** Whether to include the full record snapshot in the archive document */
10
+ ArchiveFullRecord?: boolean;
11
+ /** If all of these fields are null, skip archiving (record already archived) */
12
+ SkipIfAllNullFields?: string[];
13
+ }
14
+ /**
15
+ * Per-field configuration within an archive configuration entity.
16
+ */
17
+ export interface ArchiveFieldConfig {
18
+ /** Name of the entity field to archive */
19
+ FieldName: string;
20
+ /** Whether this field configuration is active */
21
+ IsActive?: boolean;
22
+ /** Additional driver-specific options for this field */
23
+ Options?: Record<string, unknown>;
24
+ }
25
+ /**
26
+ * The JSON document stored in external storage for each archived record version.
27
+ */
28
+ export interface ArchiveDocument {
29
+ /** Schema version for forward compatibility */
30
+ archiveVersion: number;
31
+ /** Name of the entity that was archived */
32
+ entityName: string;
33
+ /** ID of the Entity metadata record */
34
+ entityId: string;
35
+ /** Primary key value of the archived record (first key field) */
36
+ recordId: string;
37
+ /** Full composite primary key */
38
+ primaryKey: ArchivePrimaryKeyField[];
39
+ /** ISO 8601 timestamp used as the version identifier */
40
+ versionStamp: string;
41
+ /** ISO 8601 timestamp when the archive was created */
42
+ archivedAt: string;
43
+ /** ID of the ArchiveConfigurationEntity that triggered this archive */
44
+ archiveConfigurationEntityId: string;
45
+ /** ID of the parent ArchiveConfiguration */
46
+ archiveConfigurationId: string;
47
+ /** Archive mode (e.g. 'archive', 'purge') */
48
+ mode: string;
49
+ /** Map of field names to their archived values */
50
+ archivedFields: Record<string, unknown>;
51
+ /** Full record snapshot, or null if ArchiveFullRecord was false */
52
+ fullRecord: Record<string, unknown> | null;
53
+ }
54
+ /**
55
+ * Represents a single field in a composite primary key.
56
+ */
57
+ export interface ArchivePrimaryKeyField {
58
+ FieldName: string;
59
+ Value: string;
60
+ }
61
+ /**
62
+ * Context passed to archive drivers for processing a single record.
63
+ */
64
+ export interface ArchiveRecordContext {
65
+ /** The entity record to archive */
66
+ Record: BaseEntity;
67
+ /** Field configuration for this entity */
68
+ FieldConfig: ArchiveFieldConfiguration;
69
+ /** The ArchiveConfigurationEntity record */
70
+ ConfigEntity: BaseEntity;
71
+ /** The parent ArchiveConfiguration record */
72
+ Config: BaseEntity;
73
+ /** Initialized storage driver for writing archive documents */
74
+ StorageDriver: FileStorageBase;
75
+ /** Base path prefix in storage */
76
+ BasePath: string;
77
+ /** User context for server-side operations */
78
+ ContextUser: UserInfo;
79
+ /** The current ArchiveRun record */
80
+ ArchiveRun: BaseEntity;
81
+ }
82
+ /**
83
+ * Result of archiving a single record.
84
+ */
85
+ export interface ArchiveRecordResult {
86
+ /** Whether the archive operation succeeded */
87
+ Success: boolean;
88
+ /** Storage path where the archive document was written, or null on failure */
89
+ StoragePath: string | null;
90
+ /** Number of bytes written to storage */
91
+ BytesArchived: number;
92
+ /** Error message if Success is false */
93
+ ErrorMessage?: string;
94
+ /** True if the record was intentionally skipped (e.g., all fields already null) */
95
+ Skipped?: boolean;
96
+ }
97
+ /**
98
+ * Context passed to archive drivers for restoring a single record.
99
+ */
100
+ export interface RestoreRecordContext {
101
+ /** The ArchiveRunDetail record describing what was archived */
102
+ ArchiveRunDetail: BaseEntity;
103
+ /** Initialized storage driver for reading archive documents */
104
+ StorageDriver: FileStorageBase;
105
+ /** User context for server-side operations */
106
+ ContextUser: UserInfo;
107
+ }
108
+ /**
109
+ * Result of restoring a single archived record.
110
+ */
111
+ export interface RestoreRecordResult {
112
+ /** Whether the restore operation succeeded */
113
+ Success: boolean;
114
+ /** Error message if Success is false */
115
+ ErrorMessage?: string;
116
+ /** List of field names that were restored */
117
+ RestoredFields: string[];
118
+ }
119
+ /**
120
+ * Result of a complete archive run across all configured entities.
121
+ */
122
+ export interface ArchiveRunResult {
123
+ /** Whether the overall run succeeded */
124
+ Success: boolean;
125
+ /** ID of the ArchiveRun record created for this execution */
126
+ ArchiveRunId: string;
127
+ /** Total number of records evaluated */
128
+ TotalRecords: number;
129
+ /** Number of records successfully archived */
130
+ ArchivedRecords: number;
131
+ /** Number of records that failed to archive */
132
+ FailedRecords: number;
133
+ /** Number of records intentionally skipped */
134
+ SkippedRecords: number;
135
+ /** Total bytes written to storage across all records */
136
+ TotalBytesArchived: number;
137
+ /** Error message if Success is false */
138
+ ErrorMessage?: string;
139
+ }
140
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,10 +1,34 @@
1
1
  {
2
2
  "name": "@memberjunction/archiving-engine",
3
- "version": "0.0.1",
4
- "description": "OIDC trusted publishing setup package for @memberjunction/archiving-engine",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
3
+ "type": "module",
4
+ "version": "5.30.0",
5
+ "description": "Core archiving engine for MemberJunction - handles field-level archiving, storage, and recovery of entity records.",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "/dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc && tsc-alias -f",
13
+ "watch": "tsc -w",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "test:coverage": "vitest run --coverage"
17
+ },
18
+ "author": "MemberJunction.com",
19
+ "license": "ISC",
20
+ "devDependencies": {
21
+ "vitest": "^3.1.1",
22
+ "typescript": "^5.9.3"
23
+ },
24
+ "dependencies": {
25
+ "@memberjunction/core": "5.30.0",
26
+ "@memberjunction/core-entities": "5.30.0",
27
+ "@memberjunction/global": "5.30.0",
28
+ "@memberjunction/storage": "5.30.0"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/MemberJunction/MJ"
33
+ }
10
34
  }