@futdevpro/nts-dynamo 1.15.316 → 1.15.323
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/build/_collections/database-unavailable.util.d.ts +27 -0
- package/build/_collections/database-unavailable.util.d.ts.map +1 -0
- package/build/_collections/database-unavailable.util.js +55 -0
- package/build/_collections/database-unavailable.util.js.map +1 -0
- package/build/_modules/privacy-lifecycle/index.d.ts +2 -0
- package/build/_modules/privacy-lifecycle/index.d.ts.map +1 -1
- package/build/_modules/privacy-lifecycle/index.js +5 -1
- package/build/_modules/privacy-lifecycle/index.js.map +1 -1
- package/build/_modules/privacy-lifecycle/privacy-ledger.mongo-store.d.ts +92 -0
- package/build/_modules/privacy-lifecycle/privacy-ledger.mongo-store.d.ts.map +1 -0
- package/build/_modules/privacy-lifecycle/privacy-ledger.mongo-store.js +295 -0
- package/build/_modules/privacy-lifecycle/privacy-ledger.mongo-store.js.map +1 -0
- package/build/_modules/privacy-lifecycle/privacy-lifecycle.mongo-store.d.ts +136 -0
- package/build/_modules/privacy-lifecycle/privacy-lifecycle.mongo-store.d.ts.map +1 -0
- package/build/_modules/privacy-lifecycle/privacy-lifecycle.mongo-store.js +316 -0
- package/build/_modules/privacy-lifecycle/privacy-lifecycle.mongo-store.js.map +1 -0
- package/build/_modules/usage/index.d.ts +2 -0
- package/build/_modules/usage/index.d.ts.map +1 -1
- package/build/_modules/usage/index.js +2 -0
- package/build/_modules/usage/index.js.map +1 -1
- package/build/_modules/usage/usage-session-account-query.interface.d.ts +13 -0
- package/build/_modules/usage/usage-session-account-query.interface.d.ts.map +1 -0
- package/build/_modules/usage/usage-session-account-query.interface.js +3 -0
- package/build/_modules/usage/usage-session-account-query.interface.js.map +1 -0
- package/build/_modules/usage/usage-session-owner.interface.d.ts +15 -0
- package/build/_modules/usage/usage-session-owner.interface.d.ts.map +1 -0
- package/build/_modules/usage/usage-session-owner.interface.js +3 -0
- package/build/_modules/usage/usage-session-owner.interface.js.map +1 -0
- package/build/_modules/usage/usage.controller.d.ts +16 -0
- package/build/_modules/usage/usage.controller.d.ts.map +1 -1
- package/build/_modules/usage/usage.controller.js +42 -9
- package/build/_modules/usage/usage.controller.js.map +1 -1
- package/build/_modules/usage/usage.data-service.d.ts +41 -1
- package/build/_modules/usage/usage.data-service.d.ts.map +1 -1
- package/build/_modules/usage/usage.data-service.js +112 -0
- package/build/_modules/usage/usage.data-service.js.map +1 -1
- package/build/_services/base/data.service.d.ts +14 -2
- package/build/_services/base/data.service.d.ts.map +1 -1
- package/build/_services/base/data.service.js +26 -11
- package/build/_services/base/data.service.js.map +1 -1
- package/build/_services/base/db.service.d.ts.map +1 -1
- package/build/_services/base/db.service.js +7 -2
- package/build/_services/base/db.service.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -22,18 +22,14 @@ class DyNTS_Usage_Controller extends controller_service_1.DyNTS_Controller {
|
|
|
22
22
|
endpoint: usage_1.DyFM_usageModule_settings.endPoints.newSession,
|
|
23
23
|
tasks: [
|
|
24
24
|
async (req, res, issuer) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
username = this.authService?.getUsernameFromRequest(req) ?? 'unknown';
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
username = 'unknown';
|
|
32
|
-
}
|
|
25
|
+
// BFR-FUTDEVPRO-015 / `fdp-issuer-is-account-id`: the session owner is the ACCOUNT ID —
|
|
26
|
+
// the session stores the IP address, so account erasure must be able to find it by accountId.
|
|
27
|
+
const owner = this.getSessionOwnerFromRequest(req);
|
|
33
28
|
const usageService = new usage_data_service_1.DyNTS_Usage_DataService({
|
|
34
29
|
usageSession: new usage_1.DyFM_UsageSession({
|
|
35
30
|
sessionStart: new Date(),
|
|
36
|
-
issuer:
|
|
31
|
+
issuer: owner.accountId,
|
|
32
|
+
loggedInAs: owner.username,
|
|
37
33
|
}),
|
|
38
34
|
issuer,
|
|
39
35
|
});
|
|
@@ -101,6 +97,43 @@ class DyNTS_Usage_Controller extends controller_service_1.DyNTS_Controller {
|
|
|
101
97
|
'the protected "getUsageData" endpoint is SKIPPED; session endpoints remain available.');
|
|
102
98
|
}
|
|
103
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Resolves the owner of a new usage session (BFR-FUTDEVPRO-015).
|
|
102
|
+
*
|
|
103
|
+
* The `issuer` of a session is ALWAYS the account id (`fdp-issuer-is-account-id`) — before this fix it was
|
|
104
|
+
* the username, so account erasure could not find the sessions (which carry the visitor's IP address).
|
|
105
|
+
* The username is kept in `loggedInAs` only for logged-in sessions, as a bridge to legacy records.
|
|
106
|
+
*
|
|
107
|
+
* Never throws: the endpoint is public, so an absent/invalid token or a missing auth service
|
|
108
|
+
* (optional-auth mode, BFR-FDPPAL-001) yields an anonymous `'unknown'` owner.
|
|
109
|
+
*
|
|
110
|
+
* @param req the incoming request
|
|
111
|
+
* @returns the resolved owner
|
|
112
|
+
*/
|
|
113
|
+
getSessionOwnerFromRequest(req) {
|
|
114
|
+
let accountId;
|
|
115
|
+
try {
|
|
116
|
+
accountId = this.authService?.getIssuerFromRequest(req);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
accountId = undefined;
|
|
120
|
+
}
|
|
121
|
+
if (!accountId) {
|
|
122
|
+
return { accountId: 'unknown' };
|
|
123
|
+
}
|
|
124
|
+
let username;
|
|
125
|
+
try {
|
|
126
|
+
username = this.authService?.getUsernameFromRequest(req);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
username = undefined;
|
|
130
|
+
}
|
|
131
|
+
// the default auth service answers 'anonymous' when there is no username — that is not a username
|
|
132
|
+
if (!username || username === 'anonymous' || username === 'unknown') {
|
|
133
|
+
username = undefined;
|
|
134
|
+
}
|
|
135
|
+
return { accountId: accountId, username: username };
|
|
136
|
+
}
|
|
104
137
|
}
|
|
105
138
|
exports.DyNTS_Usage_Controller = DyNTS_Usage_Controller;
|
|
106
139
|
//# sourceMappingURL=usage.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.controller.js","sourceRoot":"","sources":["../../../src/_modules/usage/usage.controller.ts"],"names":[],"mappings":";;;AAGA,sDAAuF;AACvF,uDAEqC;AAErC,8GAEoE;AAEpE,wEAA0E;AAC1E,iFAA4E;
|
|
1
|
+
{"version":3,"file":"usage.controller.js","sourceRoot":"","sources":["../../../src/_modules/usage/usage.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Request } from 'express';
|
|
2
|
-
import { DyFM_RelativeDate } from '@futdevpro/fsm-dynamo';
|
|
2
|
+
import { DyFM_DBFilter, DyFM_RelativeDate } from '@futdevpro/fsm-dynamo';
|
|
3
3
|
import { DyFM_DailyUsageData, DyFM_UsageData, DyFM_UsageSession } from '@futdevpro/fsm-dynamo/usage';
|
|
4
4
|
import { DyNTS_DataService } from '../../_services/base/data.service';
|
|
5
|
+
import { DyNTS_UsageSession_AccountQuery } from './usage-session-account-query.interface';
|
|
5
6
|
export declare class DyNTS_Usage_DataService extends DyNTS_DataService<DyFM_UsageSession> {
|
|
6
7
|
usageData: DyFM_UsageData[];
|
|
7
8
|
simplifiedDailyUsage: DyFM_DailyUsageData[];
|
|
@@ -11,6 +12,45 @@ export declare class DyNTS_Usage_DataService extends DyNTS_DataService<DyFM_Usag
|
|
|
11
12
|
issuer: string;
|
|
12
13
|
});
|
|
13
14
|
getLocationDataFromRequest(req: Request): void;
|
|
15
|
+
/**
|
|
16
|
+
* Builds the filter that matches every session of one account (BFR-FUTDEVPRO-015, `L-24`):
|
|
17
|
+
* - `issuer === accountId` — sessions since 1.15.320;
|
|
18
|
+
* - `issuer === <username>` — legacy sessions (before 1.15.320 the username was the issuer);
|
|
19
|
+
* - `loggedInAs === <username>` — sessions carrying the username as bridge.
|
|
20
|
+
*
|
|
21
|
+
* FAIL-CLOSED: throws on a missing / placeholder `accountId`, and silently drops placeholder usernames —
|
|
22
|
+
* `'unknown'` / `'anonymous'` is shared by all anonymous sessions and must never become a match key.
|
|
23
|
+
*
|
|
24
|
+
* @param set the account and its known usernames
|
|
25
|
+
* @returns a DB filter (`$or`)
|
|
26
|
+
*/
|
|
27
|
+
static getAccountSessionFilter(set: DyNTS_UsageSession_AccountQuery): DyFM_DBFilter<DyFM_UsageSession>;
|
|
28
|
+
/**
|
|
29
|
+
* Lists every session of one account — including soft-deleted ones (data-subject access / export).
|
|
30
|
+
*
|
|
31
|
+
* @param set the account and its known usernames
|
|
32
|
+
* @returns the sessions (they contain the IP address and location)
|
|
33
|
+
*/
|
|
34
|
+
findSessionsOfAccount(set: DyNTS_UsageSession_AccountQuery): Promise<DyFM_UsageSession[]>;
|
|
35
|
+
/**
|
|
36
|
+
* HARD-deletes every session of one account (account erasure, `L-24`) — the sessions hold the IP
|
|
37
|
+
* address, so a soft delete is not enough.
|
|
38
|
+
*
|
|
39
|
+
* @param set the account and its known usernames
|
|
40
|
+
* @returns the number of deleted sessions
|
|
41
|
+
*/
|
|
42
|
+
deleteSessionsOfAccount(set: DyNTS_UsageSession_AccountQuery): Promise<number>;
|
|
43
|
+
/**
|
|
44
|
+
* One-off migration of legacy sessions (before 1.15.320) to the account id: every session whose `issuer`
|
|
45
|
+
* is the given username gets `issuer: accountId` and `loggedInAs: username`. Idempotent.
|
|
46
|
+
* Run it per account, from a source that maps username → accountId (e.g. the user collection).
|
|
47
|
+
*
|
|
48
|
+
* @param set the account id and the username it used to be recorded under
|
|
49
|
+
*/
|
|
50
|
+
relinkLegacySessions(set: {
|
|
51
|
+
accountId: string;
|
|
52
|
+
username: string;
|
|
53
|
+
}): Promise<void>;
|
|
14
54
|
getUsage(range?: DyFM_RelativeDate): Promise<void>;
|
|
15
55
|
updateUsageData(req: Request): Promise<void>;
|
|
16
56
|
closeSession(req: Request): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.data-service.d.ts","sourceRoot":"","sources":["../../../src/_modules/usage/usage.data-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAc,iBAAiB,EAAa,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.data-service.d.ts","sourceRoot":"","sources":["../../../src/_modules/usage/usage.data-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,aAAa,EAAc,iBAAiB,EAAa,MAAM,uBAAuB,CAAC;AAChG,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,+BAA+B,EAAE,MAAM,yCAAyC,CAAC;AAQ1F,qBAAa,uBAAwB,SAAQ,iBAAiB,CAAC,iBAAiB,CAAC;IAC/E,SAAS,EAAE,cAAc,EAAE,CAAM;IACjC,oBAAoB,EAAE,mBAAmB,EAAE,CAAM;gBAG/C,GAAG,EAAE;QACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;QACjC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC;KAChB;IAUH,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAgB9C;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE,+BAA+B,GAAG,aAAa,CAAC,iBAAiB,CAAC;IA6BtG;;;;;OAKG;IACG,qBAAqB,CAAC,GAAG,EAAE,+BAA+B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAe/F;;;;;;OAMG;IACG,uBAAuB,CAAC,GAAG,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBpF;;;;;;OAMG;IACG,oBAAoB,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCjF,QAAQ,CAAC,KAAK,GAAE,iBAA8C,GAAG,OAAO,CAAC,IAAI,CAAC;IA4D9E,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC5C,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAqChD"}
|
|
@@ -6,6 +6,11 @@ const usage_1 = require("@futdevpro/fsm-dynamo/usage");
|
|
|
6
6
|
const global_settings_const_1 = require("../../_collections/global-settings.const");
|
|
7
7
|
const data_service_1 = require("../../_services/base/data.service");
|
|
8
8
|
const shared_static_service_1 = require("../../_services/shared.static-service");
|
|
9
|
+
/**
|
|
10
|
+
* Placeholder owner values that must NEVER be used as a lookup key: they are shared by every anonymous
|
|
11
|
+
* session, so matching on them would reach (and erase / relink) OTHER visitors' sessions.
|
|
12
|
+
*/
|
|
13
|
+
const DyNTS_usageSession_placeholderOwners = ['', 'unknown', 'unknown-issuer', 'anonymous'];
|
|
9
14
|
class DyNTS_Usage_DataService extends data_service_1.DyNTS_DataService {
|
|
10
15
|
usageData = [];
|
|
11
16
|
simplifiedDailyUsage = [];
|
|
@@ -27,6 +32,113 @@ class DyNTS_Usage_DataService extends data_service_1.DyNTS_DataService {
|
|
|
27
32
|
});
|
|
28
33
|
}
|
|
29
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Builds the filter that matches every session of one account (BFR-FUTDEVPRO-015, `L-24`):
|
|
37
|
+
* - `issuer === accountId` — sessions since 1.15.320;
|
|
38
|
+
* - `issuer === <username>` — legacy sessions (before 1.15.320 the username was the issuer);
|
|
39
|
+
* - `loggedInAs === <username>` — sessions carrying the username as bridge.
|
|
40
|
+
*
|
|
41
|
+
* FAIL-CLOSED: throws on a missing / placeholder `accountId`, and silently drops placeholder usernames —
|
|
42
|
+
* `'unknown'` / `'anonymous'` is shared by all anonymous sessions and must never become a match key.
|
|
43
|
+
*
|
|
44
|
+
* @param set the account and its known usernames
|
|
45
|
+
* @returns a DB filter (`$or`)
|
|
46
|
+
*/
|
|
47
|
+
static getAccountSessionFilter(set) {
|
|
48
|
+
const accountId = set?.accountId?.trim();
|
|
49
|
+
if (!accountId || DyNTS_usageSession_placeholderOwners.includes(accountId)) {
|
|
50
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
51
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-US0-ASF0`,
|
|
52
|
+
message: `DyNTS_Usage_DataService.getAccountSessionFilter: a real accountId is required ` +
|
|
53
|
+
`(got "${set?.accountId}") — a placeholder would match every anonymous session.`,
|
|
54
|
+
userMessage: `The usage sessions of the account could not be identified.`,
|
|
55
|
+
status: 400,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const usernames = (set.legacyUsernames ?? [])
|
|
59
|
+
.map((username) => username?.trim())
|
|
60
|
+
.filter((username) => !!username && !DyNTS_usageSession_placeholderOwners.includes(username));
|
|
61
|
+
return {
|
|
62
|
+
$or: [
|
|
63
|
+
{ issuer: accountId },
|
|
64
|
+
...usernames.map((username) => ({ issuer: username })),
|
|
65
|
+
...usernames.map((username) => ({ loggedInAs: username })),
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Lists every session of one account — including soft-deleted ones (data-subject access / export).
|
|
71
|
+
*
|
|
72
|
+
* @param set the account and its known usernames
|
|
73
|
+
* @returns the sessions (they contain the IP address and location)
|
|
74
|
+
*/
|
|
75
|
+
async findSessionsOfAccount(set) {
|
|
76
|
+
const filter = DyNTS_Usage_DataService.getAccountSessionFilter(set);
|
|
77
|
+
try {
|
|
78
|
+
return await this.dataDBService.find(filter, true);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
82
|
+
...this.getDefaultErrorSettings('findSessionsOfAccount', error),
|
|
83
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-US0-FSA0`,
|
|
84
|
+
userMessage: `We were unable to collect the usage sessions of the account.`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* HARD-deletes every session of one account (account erasure, `L-24`) — the sessions hold the IP
|
|
90
|
+
* address, so a soft delete is not enough.
|
|
91
|
+
*
|
|
92
|
+
* @param set the account and its known usernames
|
|
93
|
+
* @returns the number of deleted sessions
|
|
94
|
+
*/
|
|
95
|
+
async deleteSessionsOfAccount(set) {
|
|
96
|
+
const sessions = await this.findSessionsOfAccount(set);
|
|
97
|
+
try {
|
|
98
|
+
for (const session of sessions) {
|
|
99
|
+
await this.dataDBService.trueDeleteDataById(session._id);
|
|
100
|
+
}
|
|
101
|
+
return sessions.length;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
105
|
+
...this.getDefaultErrorSettings('deleteSessionsOfAccount', error),
|
|
106
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-US0-DSA0`,
|
|
107
|
+
userMessage: `We were unable to delete the usage sessions of the account.`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* One-off migration of legacy sessions (before 1.15.320) to the account id: every session whose `issuer`
|
|
113
|
+
* is the given username gets `issuer: accountId` and `loggedInAs: username`. Idempotent.
|
|
114
|
+
* Run it per account, from a source that maps username → accountId (e.g. the user collection).
|
|
115
|
+
*
|
|
116
|
+
* @param set the account id and the username it used to be recorded under
|
|
117
|
+
*/
|
|
118
|
+
async relinkLegacySessions(set) {
|
|
119
|
+
const username = set?.username?.trim();
|
|
120
|
+
// the filter builder validates the accountId (fail-closed) — the username must be real, too
|
|
121
|
+
DyNTS_Usage_DataService.getAccountSessionFilter({ accountId: set?.accountId });
|
|
122
|
+
if (!username || DyNTS_usageSession_placeholderOwners.includes(username)) {
|
|
123
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
124
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-US0-RLS0`,
|
|
125
|
+
message: `DyNTS_Usage_DataService.relinkLegacySessions: a real username is required (got "${set?.username}") ` +
|
|
126
|
+
`— a placeholder would move every anonymous session onto this account.`,
|
|
127
|
+
userMessage: `The usage sessions of the account could not be relinked.`,
|
|
128
|
+
status: 400,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
await this.dataDBService.updateMany({ issuer: username }, { issuer: set.accountId.trim(), loggedInAs: username }, this.issuer);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
136
|
+
...this.getDefaultErrorSettings('relinkLegacySessions', error),
|
|
137
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName}|DyNTS-US0-RLS1`,
|
|
138
|
+
userMessage: `The usage sessions of the account could not be relinked.`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
30
142
|
async getUsage(range = fsm_dynamo_1.DyFM_RelativeDate.lastWeek) {
|
|
31
143
|
try {
|
|
32
144
|
await this.dataDBService.find({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.data-service.js","sourceRoot":"","sources":["../../../src/_modules/usage/usage.data-service.ts"],"names":[],"mappings":";;;AAGA,
|
|
1
|
+
{"version":3,"file":"usage.data-service.js","sourceRoot":"","sources":["../../../src/_modules/usage/usage.data-service.ts"],"names":[],"mappings":";;;AAGA,sDAAgG;AAChG,uDAIqC;AAErC,oFAAiF;AACjF,oEAAsE;AACtE,iFAAqE;AAGrE;;;GAGG;AACH,MAAM,oCAAoC,GAAa,CAAE,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,CAAE,CAAC;AAExG,MAAa,uBAAwB,SAAQ,gCAAoC;IAC/E,SAAS,GAAqB,EAAE,CAAC;IACjC,oBAAoB,GAA0B,EAAE,CAAC;IAEjD,YACE,GAIC;QAED,KAAK,CACH,IAAI,yBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,EACxC,oCAA4B,EAC5B,GAAG,CAAC,MAAM,CACX,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,0BAA0B,CAAC,GAAY;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,oCAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,oCAAY,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAEpE,uGAAuG;QACzG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAU,CAAC;gBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,4BAA4B,EAAE,KAAK,CAAC;gBAEpE,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,gBAAgB;gBACvE,WAAW,EAAE,8CAA8C;aAC5D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,uBAAuB,CAAC,GAAoC;QACjE,MAAM,SAAS,GAAW,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAEjD,IAAI,CAAC,SAAS,IAAI,oCAAoC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,uBAAU,CAAC;gBACnB,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,iBAAiB;gBACxE,OAAO,EACL,gFAAgF;oBAChF,SAAS,GAAG,EAAE,SAAS,yDAAyD;gBAClF,WAAW,EAAE,4DAA4D;gBACzE,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAa,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;aACpD,GAAG,CAAC,CAAC,QAAgB,EAAU,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;aACnD,MAAM,CAAC,CAAC,QAAgB,EAAW,EAAE,CACpC,CAAC,CAAC,QAAQ,IAAI,CAAC,oCAAoC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACvE,CAAC;QAEJ,OAAO;YACL,GAAG,EAAE;gBACH,EAAE,MAAM,EAAE,SAAS,EAAE;gBACrB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAoC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAgB,EAAoC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;aACrG;SACkC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,qBAAqB,CAAC,GAAoC;QAC9D,MAAM,MAAM,GAAqC,uBAAuB,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAEtG,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAU,CAAC;gBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,uBAAuB,EAAE,KAAK,CAAC;gBAE/D,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,iBAAiB;gBACxE,WAAW,EAAE,8DAA8D;aAC5E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,uBAAuB,CAAC,GAAoC;QAChE,MAAM,QAAQ,GAAwB,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3D,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAU,CAAC;gBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,yBAAyB,EAAE,KAAK,CAAC;gBAEjE,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,iBAAiB;gBACxE,WAAW,EAAE,6DAA6D;aAC3E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,oBAAoB,CAAC,GAA4C;QACrE,MAAM,QAAQ,GAAW,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE/C,4FAA4F;QAC5F,uBAAuB,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAE/E,IAAI,CAAC,QAAQ,IAAI,oCAAoC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,uBAAU,CAAC;gBACnB,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,iBAAiB;gBACxE,OAAO,EACL,mFAAmF,GAAG,EAAE,QAAQ,KAAK;oBACrG,uEAAuE;gBACzE,WAAW,EAAE,0DAA0D;gBACvE,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CACjC,EAAE,MAAM,EAAE,QAAQ,EAAsC,EACxD,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EACtD,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAU,CAAC;gBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,sBAAsB,EAAE,KAAK,CAAC;gBAE9D,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,iBAAiB;gBACxE,WAAW,EAAE,0DAA0D;aACxE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAA2B,8BAAiB,CAAC,QAAQ;QAClE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC5B,YAAY,EAAE,EAAE,IAAI,EAAE,sBAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE;aAC/D,CAAC,CAAC,IAAI,CAAC,CAAC,GAAwB,EAAQ,EAAE;gBACzC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACtB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAA0B,EAAQ,EAAE;gBACzD,IAAI,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CACjD,CAAC,SAA8B,EAAW,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAC7E,CAAC;gBAEF,IAAI,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjE,CAAC;qBAAM,CAAC;oBACN,MAAM,cAAc,GAAG,IAAI,2BAAmB,CAAC;wBAC7C,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,WAAW,EAAE,CAAE,OAAO,CAAE;qBACzB,CAAC,CAAC;oBAEH,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC/C,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnD,CAAC;gBAED,IAAI,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;oBACnC,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;wBAC1C,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,CAAC;oBACtD,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC;gBAChF,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAChE,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,cAAc;oBAClD,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CACjE,GAAG,GAAG,CAAC;YACV,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAC5B,CAAC,CAAsB,EAAE,CAAsB,EAAU,EAAE,CACzD,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CACxC,CAAC;YACF,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,KAA0B,EAAQ,EAAE;gBACrE,KAAK,CAAC,WAAW,CAAC,IAAI,CACpB,CAAC,CAAoB,EAAE,CAAoB,EAAU,EAAE,CACrD,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,YAAY,CACpC,CAAC;YACJ,CAAC,CAAC,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAU,CAAC;gBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,KAAK,CAAC;gBAE1D,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,gBAAgB;gBACvE,WAAW,EAAE,iDAAiD;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAY;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,GAAsB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAEzD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,uBAAU,CAAC;oBACnB,GAAG,IAAI,CAAC,uBAAuB,CAC7B,iBAAiB,EACjB,IAAI,KAAK,CAAC,0BAA0B,CAAC,CACtC;oBAED,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,gBAAgB;oBACvE,WAAW,EAAE,oDAAoD;iBAClE,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAChC,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAoB,EAAQ,EAAE;gBACpD,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAElC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAU,CAAC;gBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,EAAE,KAAK,CAAC;gBAEzD,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,gBAAgB;gBACvE,WAAW,EAAE,oDAAoD;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAY;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAsB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAEzD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,uBAAU,CAAC;oBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAEtF,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,gBAAgB;oBACvE,WAAW,EAAE,sDAAsD;iBACpE,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,mBAAmB,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YAElE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,eAAe;gBACvD,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAE9C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,CAAC,CAAiB,EAAE,CAAiB,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CACxE,CAAC;YACF,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAC;YAE5C,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAU,CAAC;gBACnB,GAAG,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,KAAK,CAAC;gBAEtD,SAAS,EAAE,GAAG,6CAAqB,CAAC,mBAAmB,gBAAgB;gBACvE,WAAW,EAAE,sDAAsD;aACpE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AA3SD,0DA2SC"}
|
|
@@ -62,7 +62,14 @@ export declare class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
62
62
|
keyIsUnique: boolean;
|
|
63
63
|
keyIsRequired: boolean;
|
|
64
64
|
}[];
|
|
65
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Dependency DB services, cached PER `dbServiceKey` (the `dependencyDataName`).
|
|
67
|
+
*
|
|
68
|
+
* ⚠️ Previously a single field cached the FIRST resolved service and every later call returned it WHATEVER key it
|
|
69
|
+
* asked for — with two required dependencies, `saveData()` looked up the SECOND dependency's id in the FIRST
|
|
70
|
+
* dependency's collection. The cache key must contain the parameter (same bug class as BFR-FDPAUTHSERVICE-007).
|
|
71
|
+
*/
|
|
72
|
+
private readonly depDataDBServices;
|
|
66
73
|
readonly defaultErrorUserMsg: string;
|
|
67
74
|
readonly defaultValidationErrorUserMsg: string;
|
|
68
75
|
constructor(
|
|
@@ -336,8 +343,13 @@ export declare class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
336
343
|
*/
|
|
337
344
|
private lookForDependencyDataSettings;
|
|
338
345
|
/**
|
|
346
|
+
* Returns the DB service of a dependency collection — cached per `dBServiceKey`.
|
|
347
|
+
*
|
|
348
|
+
* Without a key the model's ONLY dependency is used; with no dependency or with several ones a missing key is
|
|
349
|
+
* ambiguous and throws (`DyNTS-DS0-GDDB0`) instead of silently picking one.
|
|
339
350
|
*
|
|
340
|
-
* @
|
|
351
|
+
* @param dBServiceKey the `dependencyDataName` of the dependency collection
|
|
352
|
+
* @returns the DB service of that collection
|
|
341
353
|
*/
|
|
342
354
|
getDependencyDataDBService(dBServiceKey?: string): DyNTS_DBService<any>;
|
|
343
355
|
getProvidedData(data: T): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.service.d.ts","sourceRoot":"","sources":["../../../src/_services/base/data.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EAEb,uBAAuB,EACvB,qBAAqB,EAGrB,aAAa,EAIb,WAAW,EAEX,mBAAmB,EAGnB,aAAa,EAGb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAInB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,yDAAyD,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA4B/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,aAAa;
|
|
1
|
+
{"version":3,"file":"data.service.d.ts","sourceRoot":"","sources":["../../../src/_services/base/data.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,7 +76,14 @@ class DyNTS_DataService {
|
|
|
76
76
|
depDBServiceKeys: string[] = [];
|
|
77
77
|
depKeyIsUnique: boolean[] = [];
|
|
78
78
|
depKeyIsRequired: boolean[] = []; */
|
|
79
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Dependency DB services, cached PER `dbServiceKey` (the `dependencyDataName`).
|
|
81
|
+
*
|
|
82
|
+
* ⚠️ Previously a single field cached the FIRST resolved service and every later call returned it WHATEVER key it
|
|
83
|
+
* asked for — with two required dependencies, `saveData()` looked up the SECOND dependency's id in the FIRST
|
|
84
|
+
* dependency's collection. The cache key must contain the parameter (same bug class as BFR-FDPAUTHSERVICE-007).
|
|
85
|
+
*/
|
|
86
|
+
depDataDBServices = new Map();
|
|
80
87
|
/* dataParams: DyFM_DataModel_Params<T>; */
|
|
81
88
|
defaultErrorUserMsg = `We encountered an unhandled Data Service Error, ` +
|
|
82
89
|
`\nplease contact the responsible development team.`;
|
|
@@ -1929,31 +1936,39 @@ class DyNTS_DataService {
|
|
|
1929
1936
|
keyIsUnique: dependencyParams.unique,
|
|
1930
1937
|
keyIsRequired: dependencyParams.required,
|
|
1931
1938
|
})));
|
|
1939
|
+
// a single dependency is resolved eagerly (unchanged behaviour: a missing DB service fails at construction)
|
|
1932
1940
|
if (this.depSettings.length === 1) {
|
|
1933
|
-
this.
|
|
1941
|
+
this.getDependencyDataDBService(this.depSettings[0].dbServiceKey);
|
|
1934
1942
|
}
|
|
1935
1943
|
}
|
|
1936
1944
|
/**
|
|
1945
|
+
* Returns the DB service of a dependency collection — cached per `dBServiceKey`.
|
|
1937
1946
|
*
|
|
1938
|
-
*
|
|
1947
|
+
* Without a key the model's ONLY dependency is used; with no dependency or with several ones a missing key is
|
|
1948
|
+
* ambiguous and throws (`DyNTS-DS0-GDDB0`) instead of silently picking one.
|
|
1949
|
+
*
|
|
1950
|
+
* @param dBServiceKey the `dependencyDataName` of the dependency collection
|
|
1951
|
+
* @returns the DB service of that collection
|
|
1939
1952
|
*/
|
|
1940
1953
|
getDependencyDataDBService(dBServiceKey) {
|
|
1941
|
-
|
|
1954
|
+
const key = dBServiceKey
|
|
1955
|
+
|| (this.depSettings.length === 1 ? this.depSettings[0].dbServiceKey : undefined);
|
|
1956
|
+
if (!key) {
|
|
1942
1957
|
throw new fsm_dynamo_1.DyFM_Error({
|
|
1943
1958
|
...this._getDefaultErrorSettings('getDependencyDataDBService', new Error(`getDependencyDataDBService was unsuccessful, service key not setted up! ` +
|
|
1944
|
-
`(
|
|
1959
|
+
`(${this.depSettings.length} dependencies — with none or several, the dbServiceKey is required; ` +
|
|
1960
|
+
`key: ${this.depSettings.map((depSetting) => depSetting.key).join(', ')}, ` +
|
|
1945
1961
|
`(${this.dataParams.dataName})`)),
|
|
1946
1962
|
status: 500,
|
|
1947
1963
|
errorCode: `${this.ecBase}DyNTS-DS0-GDDB0`,
|
|
1948
1964
|
});
|
|
1949
1965
|
}
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
this.depDataDBService = global_service_1.DyNTS_GlobalService.getDBServiceByKey(dBServiceKey);
|
|
1955
|
-
return this.depDataDBService;
|
|
1966
|
+
let dependencyDBService = this.depDataDBServices.get(key);
|
|
1967
|
+
if (!dependencyDBService) {
|
|
1968
|
+
dependencyDBService = global_service_1.DyNTS_GlobalService.getDBServiceByKey(key);
|
|
1969
|
+
this.depDataDBServices.set(key, dependencyDBService);
|
|
1956
1970
|
}
|
|
1971
|
+
return dependencyDBService;
|
|
1957
1972
|
}
|
|
1958
1973
|
getProvidedData(data) {
|
|
1959
1974
|
return data;
|