@futdevpro/nts-dynamo 1.15.118 → 1.15.119
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/.dynamo/logs/cicd-pipeline/output.log +1906 -1869
- package/.dynamo/logs/cicd-pipeline/status.json +41 -35
- package/build/_models/data-models/schema-migration.data-model.d.ts +29 -0
- package/build/_models/data-models/schema-migration.data-model.d.ts.map +1 -0
- package/build/_models/data-models/schema-migration.data-model.js +47 -0
- package/build/_models/data-models/schema-migration.data-model.js.map +1 -0
- package/build/_models/interfaces/migration-entry.interface.d.ts +20 -0
- package/build/_models/interfaces/migration-entry.interface.d.ts.map +1 -0
- package/build/_models/interfaces/migration-entry.interface.js +3 -0
- package/build/_models/interfaces/migration-entry.interface.js.map +1 -0
- package/build/_services/core/migration-runner.service.d.ts +40 -0
- package/build/_services/core/migration-runner.service.d.ts.map +1 -0
- package/build/_services/core/migration-runner.service.js +75 -0
- package/build/_services/core/migration-runner.service.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -0
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/_models/data-models/schema-migration.data-model.ts +50 -0
- package/src/_models/interfaces/migration-entry.interface.ts +19 -0
- package/src/_services/core/migration-runner.service.spec.ts +91 -0
- package/src/_services/core/migration-runner.service.ts +106 -0
- package/src/index.ts +5 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
2
|
+
|
|
3
|
+
import { DyNTS_SingletonService } from '../base/singleton.service';
|
|
4
|
+
import { DyNTS_DataService } from '../base/data.service';
|
|
5
|
+
import {
|
|
6
|
+
DyNTS_SchemaMigration, dyNTS_schemaMigration_dataParams,
|
|
7
|
+
} from '../../_models/data-models/schema-migration.data-model';
|
|
8
|
+
import { DyNTS_MigrationEntry } from '../../_models/interfaces/migration-entry.interface';
|
|
9
|
+
|
|
10
|
+
/** A `runPending` összesítő eredménye. */
|
|
11
|
+
export interface DyNTS_MigrationRunResult {
|
|
12
|
+
applied: number;
|
|
13
|
+
skipped: number;
|
|
14
|
+
failed: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* **Deploy-integrált migráció-futtató** — bedrock, újrahasználható. Az app a `app.server.postProcess()`-
|
|
19
|
+
* ből hívja: `DyNTS_Migration_Runner.getInstance().runPending(ALL_MIGRATIONS, appVersion)`.
|
|
20
|
+
*
|
|
21
|
+
* Mechanizmus (kanon `deploy-integrated-migrations.md`):
|
|
22
|
+
* - Boot-on lekéri a `DyNTS_SchemaMigration` ledgerből a MÁR-alkalmazott `migrationId`-kat.
|
|
23
|
+
* - A **pending** (még nem alkalmazott) entry-ket **sorrendben, egyszer** lefuttatja.
|
|
24
|
+
* - Mindegyik után egy ledger-sort rögzít (`migrationId` + `appliedAt` + `appliedVersion` + `notes`).
|
|
25
|
+
* - **RUN-ONCE:** a `migrationId` unique-index → re-boot / párhuzamos instance esetén skip (duplicate-key).
|
|
26
|
+
* - **Boot-safe:** egy hibás migráció NEM állítja meg a boot-ot (catch + notes; a runner tovább megy).
|
|
27
|
+
*/
|
|
28
|
+
export class DyNTS_Migration_Runner extends DyNTS_SingletonService {
|
|
29
|
+
|
|
30
|
+
static getInstance(): DyNTS_Migration_Runner {
|
|
31
|
+
return DyNTS_Migration_Runner.getSingletonInstance();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* TISZTA pending-szelekció (DB nélkül tesztelhető): azok az entry-k, amiknek az `id`-ja NINCS az
|
|
36
|
+
* `appliedIds`-ban. A regisztráció sorrendje megőrződik (a bővítés a tömb VÉGÉRE).
|
|
37
|
+
*/
|
|
38
|
+
static selectPending(
|
|
39
|
+
migrations: DyNTS_MigrationEntry[],
|
|
40
|
+
appliedIds: Set<string>,
|
|
41
|
+
): DyNTS_MigrationEntry[] {
|
|
42
|
+
return (migrations ?? []).filter((migration: DyNTS_MigrationEntry): boolean => !appliedIds.has(migration.id));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** A ledger-DataService előállítása. `protected` → a spec felül tudja írni (mock-hoz). */
|
|
46
|
+
protected createLedgerDataService(issuer: string): DyNTS_DataService<DyNTS_SchemaMigration> {
|
|
47
|
+
return new DyNTS_DataService<DyNTS_SchemaMigration>(
|
|
48
|
+
new DyNTS_SchemaMigration(),
|
|
49
|
+
dyNTS_schemaMigration_dataParams,
|
|
50
|
+
issuer,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* A pending migrációk lefuttatása + rögzítése.
|
|
56
|
+
*
|
|
57
|
+
* @param migrations - az app registry-je (`DyNTS_MigrationEntry[]`)
|
|
58
|
+
* @param appVersion - az app aktuális verziója (a ledger `appliedVersion`-jébe)
|
|
59
|
+
* @param issuer - opcionális issuer-cimke (default `DyNTS_Migration_Runner`)
|
|
60
|
+
*/
|
|
61
|
+
async runPending(
|
|
62
|
+
migrations: DyNTS_MigrationEntry[],
|
|
63
|
+
appVersion: string,
|
|
64
|
+
issuer: string = 'DyNTS_Migration_Runner',
|
|
65
|
+
): Promise<DyNTS_MigrationRunResult> {
|
|
66
|
+
const result: DyNTS_MigrationRunResult = { applied: 0, skipped: 0, failed: 0 };
|
|
67
|
+
|
|
68
|
+
DyFM_Log.info(`[dynts-migration] sweep start — ${migrations?.length ?? 0} migration(s) registered · appVersion=${appVersion}`);
|
|
69
|
+
|
|
70
|
+
const ledger_DS: DyNTS_DataService<DyNTS_SchemaMigration> = this.createLedgerDataService(issuer);
|
|
71
|
+
|
|
72
|
+
const applied: DyNTS_SchemaMigration[] = await ledger_DS.dataDBService.find({} as never);
|
|
73
|
+
const appliedIds: Set<string> = new Set(
|
|
74
|
+
applied.map((record: DyNTS_SchemaMigration): string => record.migrationId ?? ''),
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const pending: DyNTS_MigrationEntry[] = DyNTS_Migration_Runner.selectPending(migrations, appliedIds);
|
|
78
|
+
result.skipped = (migrations?.length ?? 0) - pending.length;
|
|
79
|
+
|
|
80
|
+
for (const migration of pending) {
|
|
81
|
+
try {
|
|
82
|
+
DyFM_Log.info(`[dynts-migration] applying ${migration.id} — ${migration.description}`);
|
|
83
|
+
const outcome: { touched: number } = await migration.run(issuer);
|
|
84
|
+
|
|
85
|
+
// Atomikus claim — a unique-index dob duplicate-ra (race-safe, két párhuzamos instance).
|
|
86
|
+
ledger_DS.data = new DyNTS_SchemaMigration({
|
|
87
|
+
migrationId: migration.id,
|
|
88
|
+
appliedAt: new Date(),
|
|
89
|
+
appliedVersion: appVersion,
|
|
90
|
+
notes: `touched=${outcome?.touched ?? 0}`,
|
|
91
|
+
});
|
|
92
|
+
await ledger_DS.saveData();
|
|
93
|
+
|
|
94
|
+
DyFM_Log.success(`[dynts-migration] applied ${migration.id} (touched=${outcome?.touched ?? 0})`);
|
|
95
|
+
result.applied++;
|
|
96
|
+
} catch (error) {
|
|
97
|
+
// Egy hibás migráció NEM állíthatja meg a boot-ot (catch + log; a következő entry mehet).
|
|
98
|
+
DyFM_Error.logSimple(`[dynts-migration] FAILED ${migration.id}`, error);
|
|
99
|
+
result.failed++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
DyFM_Log.info(`[dynts-migration] sweep done — applied=${result.applied} skipped=${result.skipped} failed=${result.failed}`);
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -53,6 +53,7 @@ export * from './_models/interfaces/static-client-settings.interface';
|
|
|
53
53
|
export * from './_models/interfaces/cors-settings.interface';
|
|
54
54
|
export * from './_models/interfaces/security-headers-settings.interface';
|
|
55
55
|
export * from './_models/interfaces/db-query-options.interface';
|
|
56
|
+
export * from './_models/interfaces/migration-entry.interface';
|
|
56
57
|
export * from './_collections/security-headers.util';
|
|
57
58
|
export * from './_collections/client-safe-error.util';
|
|
58
59
|
export * from './_collections/load-shed.util';
|
|
@@ -70,6 +71,9 @@ export * from './_models/control-models/system-control.control-model';
|
|
|
70
71
|
// models/TYPES
|
|
71
72
|
export * from './_models/types/db-update.type';
|
|
72
73
|
|
|
74
|
+
// models/DATA-MODELS
|
|
75
|
+
export * from './_models/data-models/schema-migration.data-model';
|
|
76
|
+
|
|
73
77
|
|
|
74
78
|
// SERVICES
|
|
75
79
|
// services/CORE
|
|
@@ -82,6 +86,7 @@ export * from './_services/core/global.service';
|
|
|
82
86
|
export * from './_services/core/memory-guard.service';
|
|
83
87
|
|
|
84
88
|
export * from './_services/core/service-collection.service';
|
|
89
|
+
export * from './_services/core/migration-runner.service';
|
|
85
90
|
|
|
86
91
|
// services/BASE
|
|
87
92
|
export * from './_services/base/api.service-base';
|