@futdevpro/nts-dynamo 1.15.117 → 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.
Files changed (35) hide show
  1. package/.dynamo/logs/cicd-pipeline/output.log +1646 -1607
  2. package/.dynamo/logs/cicd-pipeline/status.json +40 -34
  3. package/build/_collections/field-encryption.util.d.ts +52 -0
  4. package/build/_collections/field-encryption.util.d.ts.map +1 -0
  5. package/build/_collections/field-encryption.util.js +148 -0
  6. package/build/_collections/field-encryption.util.js.map +1 -0
  7. package/build/_models/data-models/schema-migration.data-model.d.ts +29 -0
  8. package/build/_models/data-models/schema-migration.data-model.d.ts.map +1 -0
  9. package/build/_models/data-models/schema-migration.data-model.js +47 -0
  10. package/build/_models/data-models/schema-migration.data-model.js.map +1 -0
  11. package/build/_models/interfaces/migration-entry.interface.d.ts +20 -0
  12. package/build/_models/interfaces/migration-entry.interface.d.ts.map +1 -0
  13. package/build/_models/interfaces/migration-entry.interface.js +3 -0
  14. package/build/_models/interfaces/migration-entry.interface.js.map +1 -0
  15. package/build/_services/base/db.service.d.ts.map +1 -1
  16. package/build/_services/base/db.service.js +15 -2
  17. package/build/_services/base/db.service.js.map +1 -1
  18. package/build/_services/core/migration-runner.service.d.ts +40 -0
  19. package/build/_services/core/migration-runner.service.d.ts.map +1 -0
  20. package/build/_services/core/migration-runner.service.js +75 -0
  21. package/build/_services/core/migration-runner.service.js.map +1 -0
  22. package/build/index.d.ts +3 -0
  23. package/build/index.d.ts.map +1 -1
  24. package/build/index.js +4 -0
  25. package/build/index.js.map +1 -1
  26. package/package.json +2 -2
  27. package/src/_collections/field-encryption.util.spec.ts +109 -0
  28. package/src/_collections/field-encryption.util.ts +173 -0
  29. package/src/_models/data-models/schema-migration.data-model.ts +50 -0
  30. package/src/_models/interfaces/migration-entry.interface.ts +19 -0
  31. package/src/_services/base/db.service.encryption.spec.ts +76 -0
  32. package/src/_services/base/db.service.ts +22 -6
  33. package/src/_services/core/migration-runner.service.spec.ts +91 -0
  34. package/src/_services/core/migration-runner.service.ts +106 -0
  35. package/src/index.ts +5 -0
@@ -1,7 +1,7 @@
1
1
  {
2
- "pid": 12980,
3
- "startedAt": "2026-07-22T16:27:24.871Z",
4
- "startedAtMs": 1784737644871,
2
+ "pid": 15048,
3
+ "startedAt": "2026-07-26T21:11:37.191Z",
4
+ "startedAtMs": 1785100297191,
5
5
  "phase": "npm-publish",
6
6
  "pipelineComplete": false,
7
7
  "serverRunning": false,
@@ -10,77 +10,83 @@
10
10
  "steps": {
11
11
  "validate-secrets": {
12
12
  "status": "ok",
13
- "startedAt": "2026-07-22T16:27:24.886Z",
13
+ "startedAt": "2026-07-26T21:11:37.214Z",
14
14
  "logLineStart": 2,
15
15
  "logLineEnd": 8,
16
- "durationSec": 0.2
16
+ "durationSec": 0.3
17
17
  },
18
18
  "discord-start": {
19
19
  "status": "ok",
20
- "startedAt": "2026-07-22T16:27:26.115Z",
20
+ "startedAt": "2026-07-26T21:11:38.480Z",
21
21
  "logLineStart": 9,
22
22
  "logLineEnd": 14,
23
23
  "durationSec": 3
24
24
  },
25
25
  "pre-flight": {
26
26
  "status": "ok",
27
- "startedAt": "2026-07-22T16:27:30.142Z",
27
+ "startedAt": "2026-07-26T21:11:42.473Z",
28
28
  "logLineStart": 15,
29
29
  "logLineEnd": 17,
30
30
  "durationSec": 0.2
31
31
  },
32
32
  "install": {
33
33
  "status": "ok",
34
- "startedAt": "2026-07-22T16:27:31.332Z",
34
+ "startedAt": "2026-07-26T21:11:43.675Z",
35
35
  "logLineStart": 18,
36
- "logLineEnd": 99,
37
- "durationSec": 20.2
36
+ "logLineEnd": 104,
37
+ "durationSec": 25.6
38
38
  },
39
39
  "check-dev-leftovers": {
40
40
  "status": "ok",
41
- "startedAt": "2026-07-22T16:27:52.517Z",
42
- "logLineStart": 100,
43
- "logLineEnd": 107,
44
- "durationSec": 4.2
41
+ "startedAt": "2026-07-26T21:12:10.230Z",
42
+ "logLineStart": 105,
43
+ "logLineEnd": 112,
44
+ "durationSec": 4.4
45
45
  },
46
46
  "build": {
47
47
  "status": "ok",
48
- "startedAt": "2026-07-22T16:27:57.733Z",
49
- "logLineStart": 108,
50
- "logLineEnd": 109,
51
- "durationSec": 23.7
48
+ "startedAt": "2026-07-26T21:12:15.627Z",
49
+ "logLineStart": 113,
50
+ "logLineEnd": 114,
51
+ "durationSec": 27.8
52
52
  },
53
53
  "test": {
54
54
  "status": "ok",
55
- "startedAt": "2026-07-22T16:28:22.412Z",
56
- "logLineStart": 110,
57
- "logLineEnd": 2800,
58
- "durationSec": 21.7,
55
+ "startedAt": "2026-07-26T21:12:44.425Z",
56
+ "logLineStart": 115,
57
+ "logLineEnd": 2839,
58
+ "durationSec": 20.3,
59
59
  "testSummary": {
60
- "totalSpecs": 1576,
60
+ "totalSpecs": 1593,
61
61
  "failures": 0,
62
- "passed": 1576,
63
- "testDurationSec": 6.499
62
+ "passed": 1593,
63
+ "testDurationSec": 6.601
64
64
  },
65
65
  "errors": [
66
66
  {
67
- "line": 1779,
68
- "text": ".....(checkDbReadiness) diagnostics collection failed (non-fatal) Error: diag boom",
69
- "details": ".....INVALID route type: invalid - undefined\n......DYNAMO-NTS ERROR: INVALID route type: invalid - undefined\n..*****..................ServerStatus snapshot created\nat Object.get host [as host] (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/build/_modules/server/server-status/server-status.control-service.spec.js:487:36)\nat TestServerStatusControlService.checkDbReadiness (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/build/_modules/server/server-status/server-status.control-service.js:177:29)\nat async UserContext.<anonymous> (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/build/_modules/server/server-status/server-status.control-service.spec.js:490:28)",
70
- "detailLineEnd": 1782
67
+ "line": 386,
68
+ "text": "......................................(checkDbReadiness) diagnostics collection failed (non-fatal) Error: diag boom",
69
+ "details": ".Authentication Service missing!\n.Authentication Service missing!\n.Authentication Service missing!\nat Object.get host [as host] (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/build/_modules/server/server-status/server-status.control-service.spec.js:487:36)\nat TestServerStatusControlService.checkDbReadiness (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/build/_modules/server/server-status/server-status.control-service.js:177:29)\nat processTicksAndRejections (node:internal/process/task_queues:95:5)\nat async UserContext.<anonymous> (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/build/_modules/server/server-status/server-status.control-service.spec.js:490:28)",
70
+ "detailLineEnd": 390
71
71
  },
72
72
  {
73
- "line": 1799,
73
+ "line": 399,
74
74
  "text": "(checkDbReadiness) diagnostics collection failed (non-fatal) Error: boom",
75
- "details": "at runNext (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8355:16)\nat /tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8361:11\nat /tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8241:9\nat UserContext.<anonymous> (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/build/_modules/server/server-status/server-status.control-service.spec.js:507:68)\nat QueueRunner.attempt (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8414:40)\nat QueueRunner.run (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8452:27)\nat runNext (/tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8355:16)\nat /tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8361:11\nat /tmp/pipeline-runs/af24a796-61b4-449c-9323-2372640557e4/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8241:9",
76
- "detailLineEnd": 1805
75
+ "details": "at /tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8361:11\nat /tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8241:9\nat processTicksAndRejections (node:internal/process/task_queues:95:5)\nat UserContext.<anonymous> (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/build/_modules/server/server-status/server-status.control-service.spec.js:507:68)\nat QueueRunner.attempt (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8414:40)\nat QueueRunner.run (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8452:27)\nat runNext (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8355:16)\nat /tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8361:11\nat /tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/node_modules/.pnpm/jasmine-core@5.10.0/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:8241:9\nat processTicksAndRejections (node:internal/process/task_queues:95:5)",
76
+ "detailLineEnd": 406
77
+ },
78
+ {
79
+ "line": 2056,
80
+ "text": "[dynts-migration] FAILED bad Error: boom",
81
+ "details": "at Object.run (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/build/_services/core/migration-runner.service.spec.js:67:50)\nat DyNTS_Migration_Runner.runPending (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/build/_services/core/migration-runner.service.js:52:49)\nat async UserContext.<anonymous> (/tmp/pipeline-runs/a686f4ed-5884-4898-92e6-77674803c205/build/_services/core/migration-runner.service.spec.js:70:25)",
82
+ "detailLineEnd": 2059
77
83
  }
78
84
  ]
79
85
  },
80
86
  "npm-publish": {
81
87
  "status": "running",
82
- "startedAt": "2026-07-22T16:28:45.168Z",
83
- "logLineStart": 2801,
88
+ "startedAt": "2026-07-26T21:13:05.802Z",
89
+ "logLineStart": 2840,
84
90
  "logLineEnd": null,
85
91
  "durationSec": null
86
92
  }
@@ -0,0 +1,52 @@
1
+ import { DyFM_DataProperties } from '@futdevpro/fsm-dynamo';
2
+ /**
3
+ * AT-REST field-encryption transzform (Option B, bedrock). A DBService a közös írási úton
4
+ * (`createData` / `modifyData`) a persist ELŐTT titkosítja, a read-post-processor
5
+ * (`stringifyDataId`) a load UTÁN visszafejti az `encrypt:true` mezőket.
6
+ *
7
+ * **App-rétegben fut, NEM mongoose-hook** — a `modifyData` `findByIdAndUpdate`-je megkerüli a
8
+ * mongoose settereket/pre-save-hookokat, ezért a transzform explicit itt történik.
9
+ *
10
+ * **Opt-in, default-off:** ha egy modell egyetlen mezője sem `encrypt:true`, a transzform tiszta
11
+ * NO-OP (ugyanaz az objektum-referencia, nincs klónozás, nincs viselkedés-változás, kulcs sem kell).
12
+ *
13
+ * **Legacy-plaintext biztonságos:** a read-transzform CSAK a `DYENC1:` envelope-értékeket fejti vissza
14
+ * (`isEncryptedDbValue`); a régi, még nem migrált plaintext értékek változatlanul jönnek vissza.
15
+ *
16
+ * Kulcs: `FDP_CORE_DBCONTENT_CRYPT_KEY` (Keystore/CI-env). Verzió: `FDP_CORE_DBCONTENT_CRYPT_KEY_VERSION`
17
+ * (default 1) — a kulcs-rotációhoz (a verzió az envelope-ban utazik).
18
+ */
19
+ export declare class DyNTS_FieldEncryption_Util {
20
+ static readonly ENV_KEY: string;
21
+ static readonly ENV_KEY_VERSION: string;
22
+ /** `hasEncryptedFields` cache per properties-objektum (referencia szerint). */
23
+ private static readonly _hasEncCache;
24
+ /** A titkosító kulcs env-ből (üres string, ha nincs beállítva). */
25
+ static getKey(): string;
26
+ /** Az aktuális kulcs-verzió (default 1). */
27
+ static getKeyVersion(): number;
28
+ /**
29
+ * True, ha a properties-fa (rekurzívan a `subObjectParams`-on át) tartalmaz `encrypt:true` mezőt.
30
+ * Cache-elt (a properties-objektum immutábilis a modell-élettartam alatt).
31
+ */
32
+ static hasEncryptedFields(properties?: DyFM_DataProperties<any>): boolean;
33
+ /**
34
+ * Titkosítja a doc `encrypt:true` mezőit persist előtt. **Klónt ad vissza** — az eredeti (hívó)
35
+ * objektumot NEM mutálja (különben a `this.data` ciphertextté válna). NO-OP, ha nincs enc-mező.
36
+ * @throws ha van enc-mező, de a kulcs env-var nincs beállítva (fail-loud misconfiguration).
37
+ */
38
+ static encryptDoc<T>(data: T, properties?: DyFM_DataProperties<any>): T;
39
+ /**
40
+ * Visszafejti a doc `encrypt:true` mezőit load után. CSAK a `DYENC1:` envelope-értékeket bántja
41
+ * (legacy plaintext változatlan). NO-OP, ha nincs enc-mező. Kulcs hiányában read-en NEM dob
42
+ * (a read ne törjön el) — az envelope-értékek visszafejtetlenül maradnak (a hívó látja + a hiba loggolt).
43
+ */
44
+ static decryptDoc<T>(data: T, properties?: DyFM_DataProperties<any>): T;
45
+ /**
46
+ * Rekurzív per-field walk: az `encrypt:true` mezőket titkosítja/visszafejti, a `subObjectParams`-os
47
+ * mezőkbe (objektum VAGY objektum-tömb) leszáll. Immutábilis: minden érintett konténert sekélyen
48
+ * klónoz (az eredetit nem mutálja); a nem-érintett ágakat referencia szerint megosztja (read-only).
49
+ */
50
+ private static _transform;
51
+ }
52
+ //# sourceMappingURL=field-encryption.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-encryption.util.d.ts","sourceRoot":"","sources":["../../src/_collections/field-encryption.util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAEpB,MAAM,uBAAuB,CAAC;AAG/B;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,0BAA0B;IACrC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAkC;IACjE,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAA0C;IAEjF,+EAA+E;IAC/E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAA2C;IAE/E,mEAAmE;IACnE,MAAM,CAAC,MAAM,IAAI,MAAM;IAIvB,4CAA4C;IAC5C,MAAM,CAAC,aAAa,IAAI,MAAM;IAK9B;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,OAAO;IA8BzE;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;IAmBvE;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;IAavE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;CAkD1B"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_FieldEncryption_Util = void 0;
4
+ const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
5
+ const crypto_1 = require("@futdevpro/fsm-dynamo/crypto");
6
+ /**
7
+ * AT-REST field-encryption transzform (Option B, bedrock). A DBService a közös írási úton
8
+ * (`createData` / `modifyData`) a persist ELŐTT titkosítja, a read-post-processor
9
+ * (`stringifyDataId`) a load UTÁN visszafejti az `encrypt:true` mezőket.
10
+ *
11
+ * **App-rétegben fut, NEM mongoose-hook** — a `modifyData` `findByIdAndUpdate`-je megkerüli a
12
+ * mongoose settereket/pre-save-hookokat, ezért a transzform explicit itt történik.
13
+ *
14
+ * **Opt-in, default-off:** ha egy modell egyetlen mezője sem `encrypt:true`, a transzform tiszta
15
+ * NO-OP (ugyanaz az objektum-referencia, nincs klónozás, nincs viselkedés-változás, kulcs sem kell).
16
+ *
17
+ * **Legacy-plaintext biztonságos:** a read-transzform CSAK a `DYENC1:` envelope-értékeket fejti vissza
18
+ * (`isEncryptedDbValue`); a régi, még nem migrált plaintext értékek változatlanul jönnek vissza.
19
+ *
20
+ * Kulcs: `FDP_CORE_DBCONTENT_CRYPT_KEY` (Keystore/CI-env). Verzió: `FDP_CORE_DBCONTENT_CRYPT_KEY_VERSION`
21
+ * (default 1) — a kulcs-rotációhoz (a verzió az envelope-ban utazik).
22
+ */
23
+ class DyNTS_FieldEncryption_Util {
24
+ static ENV_KEY = 'FDP_CORE_DBCONTENT_CRYPT_KEY';
25
+ static ENV_KEY_VERSION = 'FDP_CORE_DBCONTENT_CRYPT_KEY_VERSION';
26
+ /** `hasEncryptedFields` cache per properties-objektum (referencia szerint). */
27
+ static _hasEncCache = new WeakMap();
28
+ /** A titkosító kulcs env-ből (üres string, ha nincs beállítva). */
29
+ static getKey() {
30
+ return process.env[this.ENV_KEY] ?? '';
31
+ }
32
+ /** Az aktuális kulcs-verzió (default 1). */
33
+ static getKeyVersion() {
34
+ const parsed = Number(process.env[this.ENV_KEY_VERSION]);
35
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;
36
+ }
37
+ /**
38
+ * True, ha a properties-fa (rekurzívan a `subObjectParams`-on át) tartalmaz `encrypt:true` mezőt.
39
+ * Cache-elt (a properties-objektum immutábilis a modell-élettartam alatt).
40
+ */
41
+ static hasEncryptedFields(properties) {
42
+ if (!properties) {
43
+ return false;
44
+ }
45
+ const cached = this._hasEncCache.get(properties);
46
+ if (cached !== undefined) {
47
+ return cached;
48
+ }
49
+ let has = false;
50
+ for (const key in properties) {
51
+ const prop = properties[key]; // ccap-review-disable-line no-any-type
52
+ if (!prop) {
53
+ continue;
54
+ }
55
+ if (prop.encrypt === true) {
56
+ has = true;
57
+ break;
58
+ }
59
+ if (prop.subObjectParams && this.hasEncryptedFields(prop.subObjectParams)) {
60
+ has = true;
61
+ break;
62
+ }
63
+ }
64
+ this._hasEncCache.set(properties, has);
65
+ return has;
66
+ }
67
+ /**
68
+ * Titkosítja a doc `encrypt:true` mezőit persist előtt. **Klónt ad vissza** — az eredeti (hívó)
69
+ * objektumot NEM mutálja (különben a `this.data` ciphertextté válna). NO-OP, ha nincs enc-mező.
70
+ * @throws ha van enc-mező, de a kulcs env-var nincs beállítva (fail-loud misconfiguration).
71
+ */
72
+ static encryptDoc(data, properties) {
73
+ if (data == null || !this.hasEncryptedFields(properties)) {
74
+ return data;
75
+ }
76
+ const key = this.getKey();
77
+ if (!key) {
78
+ throw new fsm_dynamo_1.DyFM_Error({
79
+ status: 500,
80
+ errorCode: 'DyNTS-ENC-KEY-MISSING',
81
+ message: `At-rest encryption: "${this.ENV_KEY}" env-var is not set, but a model field is encrypt:true. ` +
82
+ `Set the key in the Keystore/CI-env and redeploy.`,
83
+ });
84
+ }
85
+ return this._transform(data, properties, 'encrypt', key, this.getKeyVersion());
86
+ }
87
+ /**
88
+ * Visszafejti a doc `encrypt:true` mezőit load után. CSAK a `DYENC1:` envelope-értékeket bántja
89
+ * (legacy plaintext változatlan). NO-OP, ha nincs enc-mező. Kulcs hiányában read-en NEM dob
90
+ * (a read ne törjön el) — az envelope-értékek visszafejtetlenül maradnak (a hívó látja + a hiba loggolt).
91
+ */
92
+ static decryptDoc(data, properties) {
93
+ if (data == null || !this.hasEncryptedFields(properties)) {
94
+ return data;
95
+ }
96
+ const key = this.getKey();
97
+ if (!key) {
98
+ return data;
99
+ }
100
+ return this._transform(data, properties, 'decrypt', key, this.getKeyVersion());
101
+ }
102
+ /**
103
+ * Rekurzív per-field walk: az `encrypt:true` mezőket titkosítja/visszafejti, a `subObjectParams`-os
104
+ * mezőkbe (objektum VAGY objektum-tömb) leszáll. Immutábilis: minden érintett konténert sekélyen
105
+ * klónoz (az eredetit nem mutálja); a nem-érintett ágakat referencia szerint megosztja (read-only).
106
+ */
107
+ static _transform(value, properties, mode, key, keyVersion) {
108
+ if (value == null || typeof value !== 'object') {
109
+ return value;
110
+ }
111
+ const result = Array.isArray(value) ? [...value] : { ...value }; // ccap-review-disable-line no-any-type
112
+ for (const propKey in properties) {
113
+ const prop = properties[propKey]; // ccap-review-disable-line no-any-type
114
+ if (!prop) {
115
+ continue;
116
+ }
117
+ if (prop.encrypt === true) {
118
+ const current = result[propKey]; // ccap-review-disable-line no-any-type
119
+ if (mode === 'encrypt') {
120
+ // Üres/undefined/null-t NEM titkosítunk (a DyFM_Crypto ezekre dob); már-envelope-ot sem (idempotens).
121
+ if (current != null && current !== '' && !crypto_1.DyFM_Crypto.isEncryptedDbValue(current)) {
122
+ result[propKey] = crypto_1.DyFM_Crypto.encryptDbValue(current, key, keyVersion);
123
+ }
124
+ }
125
+ else {
126
+ // CSAK envelope-ot fejtünk vissza (legacy plaintext változatlan).
127
+ if (crypto_1.DyFM_Crypto.isEncryptedDbValue(current)) {
128
+ result[propKey] = crypto_1.DyFM_Crypto.decryptDbValue(current, key);
129
+ }
130
+ }
131
+ }
132
+ else if (prop.subObjectParams) {
133
+ const current = result[propKey]; // ccap-review-disable-line no-any-type
134
+ if (current != null && typeof current === 'object') {
135
+ if (Array.isArray(current)) {
136
+ result[propKey] = current.map((item) => this._transform(item, prop.subObjectParams, mode, key, keyVersion));
137
+ }
138
+ else {
139
+ result[propKey] = this._transform(current, prop.subObjectParams, mode, key, keyVersion);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ return result;
145
+ }
146
+ }
147
+ exports.DyNTS_FieldEncryption_Util = DyNTS_FieldEncryption_Util;
148
+ //# sourceMappingURL=field-encryption.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-encryption.util.js","sourceRoot":"","sources":["../../src/_collections/field-encryption.util.ts"],"names":[],"mappings":";;;AAAA,sDAG+B;AAC/B,yDAA2D;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,0BAA0B;IACrC,MAAM,CAAU,OAAO,GAAW,8BAA8B,CAAC;IACjE,MAAM,CAAU,eAAe,GAAW,sCAAsC,CAAC;IAEjF,+EAA+E;IACvE,MAAM,CAAU,YAAY,GAA6B,IAAI,OAAO,EAAE,CAAC;IAE/E,mEAAmE;IACnE,MAAM,CAAC,MAAM;QACX,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,4CAA4C;IAC5C,MAAM,CAAC,aAAa;QAClB,MAAM,MAAM,GAAW,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,UAAqC;QAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAwB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,GAAG,GAAY,KAAK,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAQ,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,uCAAuC;YAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC1B,GAAG,GAAG,IAAI,CAAC;gBACX,MAAM;YACR,CAAC;YACD,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1E,GAAG,GAAG,IAAI,CAAC;gBACX,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAI,IAAO,EAAE,UAAqC;QACjE,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,uBAAU,CAAC;gBACnB,MAAM,EAAE,GAAG;gBACX,SAAS,EAAE,uBAAuB;gBAClC,OAAO,EACL,wBAAwB,IAAI,CAAC,OAAO,2DAA2D;oBAC/F,kDAAkD;aACrD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAsC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7G,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAI,IAAO,EAAE,UAAqC;QACjE,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,UAAsC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7G,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,UAAU,CACvB,KAAQ,EACR,UAAoC,EACpC,IAA2B,EAC3B,GAAW,EACX,UAAkB;QAElB,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAQ,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,GAAI,KAAe,CAAE,CAAC,CAAC,CAAC,EAAE,GAAI,KAAa,EAAE,CAAC,CAAC,uCAAuC;QAEnI,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,GAAQ,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;YAC9E,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAQ,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;gBAE7E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,sGAAsG;oBACtG,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,KAAK,EAAE,IAAI,CAAC,oBAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;wBAClF,MAAM,CAAC,OAAO,CAAC,GAAG,oBAAW,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;oBACzE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,kEAAkE;oBAClE,IAAI,oBAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC5C,MAAM,CAAC,OAAO,CAAC,GAAG,oBAAW,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAQ,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;gBAE7E,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACnD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,CAC3B,CAAC,IAAS,EAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CACvF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;oBAC1F,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAW,CAAC;IACrB,CAAC;;AApJH,gEAqJC"}
@@ -0,0 +1,29 @@
1
+ import { DyFM_DataModel_Params, DyFM_Metadata } from '@futdevpro/fsm-dynamo';
2
+ /**
3
+ * **Migráció-nyilvántartó ("server info") LEDGER** — bedrock, újrahasználható az egész flottának.
4
+ * (A token-service app-lokál `SchemaMigration` mintájából emelve bedrock nts-be.)
5
+ *
6
+ * Egy-egy `migrationId` **PONTOSAN EGYSZER** fut le rendszerenként: a `DyNTS_Migration_Runner.runPending()`
7
+ * boot-on (az app `app.server.postProcess()`-éből) lekéri a már-alkalmazott ID-kat, a pending
8
+ * migrációkat lefuttatja, majd egy sort rögzít ide. A `migrationId` **unique index** → race-safe
9
+ * (két párhuzamos instance esetén az egyik `save`-je duplicate-key-re bukik → skip).
10
+ *
11
+ * A ledger a KÖTELEZŐ kanon-adatokat tartja: **mely migrációk futottak** (id + idő) + **mely app-verzió**
12
+ * alkalmazta (a `appliedVersion`-ökből a "mely verziók futottak" levezethető).
13
+ *
14
+ * Az app a saját DB-jében regisztrálja a `dyNTS_schemaMigration_dataParams`-t (`getGlobalServiceCollection
15
+ * ().dbModels`), így per-app saját `dynts_schema_migrations` collection-t kap.
16
+ */
17
+ export declare class DyNTS_SchemaMigration extends DyFM_Metadata {
18
+ /** A migráció egyedi azonosítója (konvenció: `YYYY-MM-DD-NNN-descriptor`). */
19
+ migrationId?: string;
20
+ /** Alkalmazás időbélyege. */
21
+ appliedAt?: Date;
22
+ /** Az alkalmazó app-verzió (a `package.json` version-je — audit-trail + "mely verziók futottak"). */
23
+ appliedVersion?: string;
24
+ /** Diag — pl. `touched=<n>` vagy hiba-részletek. */
25
+ notes?: string;
26
+ constructor(set?: DyNTS_SchemaMigration);
27
+ }
28
+ export declare const dyNTS_schemaMigration_dataParams: DyFM_DataModel_Params<DyNTS_SchemaMigration>;
29
+ //# sourceMappingURL=schema-migration.data-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-migration.data-model.d.ts","sourceRoot":"","sources":["../../../src/_models/data-models/schema-migration.data-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE7E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,qBAAsB,SAAQ,aAAa;IAEtD,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,qGAAqG;IACrG,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;gBAEH,GAAG,CAAC,EAAE,qBAAqB;CAMxC;AAED,eAAO,MAAM,gCAAgC,EAAE,qBAAqB,CAAC,qBAAqB,CAUtF,CAAC"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dyNTS_schemaMigration_dataParams = exports.DyNTS_SchemaMigration = void 0;
4
+ const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
5
+ /**
6
+ * **Migráció-nyilvántartó ("server info") LEDGER** — bedrock, újrahasználható az egész flottának.
7
+ * (A token-service app-lokál `SchemaMigration` mintájából emelve bedrock nts-be.)
8
+ *
9
+ * Egy-egy `migrationId` **PONTOSAN EGYSZER** fut le rendszerenként: a `DyNTS_Migration_Runner.runPending()`
10
+ * boot-on (az app `app.server.postProcess()`-éből) lekéri a már-alkalmazott ID-kat, a pending
11
+ * migrációkat lefuttatja, majd egy sort rögzít ide. A `migrationId` **unique index** → race-safe
12
+ * (két párhuzamos instance esetén az egyik `save`-je duplicate-key-re bukik → skip).
13
+ *
14
+ * A ledger a KÖTELEZŐ kanon-adatokat tartja: **mely migrációk futottak** (id + idő) + **mely app-verzió**
15
+ * alkalmazta (a `appliedVersion`-ökből a "mely verziók futottak" levezethető).
16
+ *
17
+ * Az app a saját DB-jében regisztrálja a `dyNTS_schemaMigration_dataParams`-t (`getGlobalServiceCollection
18
+ * ().dbModels`), így per-app saját `dynts_schema_migrations` collection-t kap.
19
+ */
20
+ class DyNTS_SchemaMigration extends fsm_dynamo_1.DyFM_Metadata {
21
+ /** A migráció egyedi azonosítója (konvenció: `YYYY-MM-DD-NNN-descriptor`). */
22
+ migrationId;
23
+ /** Alkalmazás időbélyege. */
24
+ appliedAt;
25
+ /** Az alkalmazó app-verzió (a `package.json` version-je — audit-trail + "mely verziók futottak"). */
26
+ appliedVersion;
27
+ /** Diag — pl. `touched=<n>` vagy hiba-részletek. */
28
+ notes;
29
+ constructor(set) {
30
+ super(set);
31
+ if (set) {
32
+ Object.assign(this, set);
33
+ }
34
+ }
35
+ }
36
+ exports.DyNTS_SchemaMigration = DyNTS_SchemaMigration;
37
+ exports.dyNTS_schemaMigration_dataParams = new fsm_dynamo_1.DyFM_DataModel_Params({
38
+ dataName: 'dynts_schema_migrations',
39
+ addArchive: false,
40
+ properties: {
41
+ migrationId: { type: 'string', required: true, unique: true, index: true },
42
+ appliedAt: { type: 'date', required: true },
43
+ appliedVersion: { type: 'string' },
44
+ notes: { type: 'string' },
45
+ },
46
+ });
47
+ //# sourceMappingURL=schema-migration.data-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-migration.data-model.js","sourceRoot":"","sources":["../../../src/_models/data-models/schema-migration.data-model.ts"],"names":[],"mappings":";;;AAAA,sDAA6E;AAE7E;;;;;;;;;;;;;;GAcG;AACH,MAAa,qBAAsB,SAAQ,0BAAa;IAEtD,8EAA8E;IAC9E,WAAW,CAAU;IAErB,6BAA6B;IAC7B,SAAS,CAAQ;IAEjB,qGAAqG;IACrG,cAAc,CAAU;IAExB,oDAAoD;IACpD,KAAK,CAAU;IAEf,YAAY,GAA2B;QACrC,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AApBD,sDAoBC;AAEY,QAAA,gCAAgC,GAC3C,IAAI,kCAAqB,CAAwB;IAC/C,QAAQ,EAAE,yBAAyB;IACnC,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE;QACV,WAAW,EAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAC7E,SAAS,EAAO,EAAE,IAAI,EAAE,MAAM,EAAI,QAAQ,EAAE,IAAI,EAAE;QAClD,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClC,KAAK,EAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;KACnC;CACF,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Egy regisztrált deploy-integrált migráció leírója. Az app egy `DyNTS_MigrationEntry[]` registry-t
3
+ * ad át a `DyNTS_Migration_Runner.runPending(...)`-nek; a runner a pending (még nem alkalmazott)
4
+ * entry-ket **egyszer** futtatja le, sorrendben, majd a `DyNTS_SchemaMigration` ledgerbe rögzíti.
5
+ */
6
+ export interface DyNTS_MigrationEntry {
7
+ /** Egyedi, monoton bővíthető ID (konvenció: `YYYY-MM-DD-NNN-descriptor`). A ledger ez alapján run-once-ol. */
8
+ id: string;
9
+ /** Rövid leíró (admin/debug/log). */
10
+ description: string;
11
+ /**
12
+ * A tényleges migráció-logika. Az app már-csatlakozott Mongo-kapcsolatát használja (a runner a
13
+ * `postProcess`-ből fut, ahol a DB már él). Hibára DOBHAT — a runner catch-eli, a `notes`-ba menti,
14
+ * és NEM állítja meg a boot-ot. Visszaad: `{ touched }` (a módosított dokumentumok száma — count/riport).
15
+ */
16
+ run: (issuer: string) => Promise<{
17
+ touched: number;
18
+ }>;
19
+ }
20
+ //# sourceMappingURL=migration-entry.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-entry.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/migration-entry.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,8GAA8G;IAC9G,EAAE,EAAE,MAAM,CAAC;IAEX,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=migration-entry.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-entry.interface.js","sourceRoot":"","sources":["../../../src/_models/interfaces/migration-entry.interface.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"db.service.d.ts","sourceRoot":"","sources":["../../../src/_services/base/db.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.service.d.ts","sourceRoot":"","sources":["../../../src/_services/base/db.service.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ const mongoose = tslib_1.__importStar(require("mongoose"));
6
6
  const mongoose_1 = require("mongoose");
7
7
  const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
8
8
  const archive_util_1 = require("../../_collections/archive.util");
9
+ const field_encryption_util_1 = require("../../_collections/field-encryption.util");
9
10
  const global_settings_const_1 = require("../../_collections/global-settings.const");
10
11
  /**
11
12
  * DB Service for MongoDB
@@ -73,7 +74,10 @@ class DyNTS_DBService {
73
74
  data.__lastModified = new Date();
74
75
  data.__createdBy = issuer;
75
76
  data.__lastModifiedBy = issuer;
76
- const dataModel = new this.dataModel(data);
77
+ // AT-REST field-encryption (opt-in): az encrypt:true mezőket a persist ELŐTT titkosítjuk, egy
78
+ // KLÓNON (a hívó `data`-ja plaintext marad). NO-OP, ha nincs encrypt:true mező.
79
+ const encData = field_encryption_util_1.DyNTS_FieldEncryption_Util.encryptDoc(data, this.dataParams.properties);
80
+ const dataModel = new this.dataModel(encData);
77
81
  const newData = await dataModel.save().then((res) => {
78
82
  if (res) {
79
83
  return res?.toObject();
@@ -119,12 +123,17 @@ class DyNTS_DBService {
119
123
  data.__lastModified = new Date();
120
124
  data.__lastModifiedBy = issuer;
121
125
  }
126
+ // AT-REST field-encryption (opt-in): az encrypt:true mezőket a persist ELŐTT titkosítjuk, egy
127
+ // KLÓNON. KRITIKUS: a `findByIdAndUpdate` MEGKERÜLI a mongoose settereket/pre-save-hookokat, ezért
128
+ // a titkosítás itt, app-rétegben történik (nem mongoose-hookban). A hívó `data`-ja plaintext marad,
129
+ // így a `stringifyDataId(data)` alant no-op decrypttel a plaintextet adja vissza. NO-OP enc-mező nélkül.
130
+ const encData = field_encryption_util_1.DyNTS_FieldEncryption_Util.encryptDoc(data, this.dataParams.properties);
122
131
  /**
123
132
  * EZ A SZAR TELJESEN SZAR, nem friss, nem a db-be mentett adatokat ad vissza,
124
133
  * átír random value-kat össze vissza, WTF
125
134
  * */
126
135
  /* let newData: T = */
127
- await this.dataModel.findByIdAndUpdate(data._id, data) /* .then((res) => {
136
+ await this.dataModel.findByIdAndUpdate(data._id, encData) /* .then((res) => {
128
137
  if (res) {
129
138
  //return res?.toObject() as T;
130
139
  } else {
@@ -1029,6 +1038,10 @@ class DyNTS_DBService {
1029
1038
  // ----------------------------------------------------------------------------------
1030
1039
  // PRIVATE FUNCTIONS
1031
1040
  stringifyDataId(data, fnName) {
1041
+ // AT-REST field-decryption (opt-in): ez a KÖZÖS read+write post-processor (minden read + a
1042
+ // create/modify EREDMÉNYE is átmegy rajta), ezért itt fejtjük vissza az encrypt:true envelope-
1043
+ // mezőket load után. NO-OP, ha nincs encrypt:true mező (ugyanaz a referencia — nulla változás).
1044
+ data = field_encryption_util_1.DyNTS_FieldEncryption_Util.decryptDoc(data, this.dataParams.properties);
1032
1045
  if (data?._id && (typeof data._id !== 'string' || typeof data._id === 'object')) {
1033
1046
  data._id = `${data._id}`;
1034
1047
  if (typeof data._id !== 'string' || typeof data._id === 'object') {