@futdevpro/nts-dynamo 1.9.39 → 1.9.40
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/archive.util.d.ts +3 -0
- package/build/_collections/archive.util.d.ts.map +1 -0
- package/build/_collections/archive.util.js +9 -0
- package/build/_collections/archive.util.js.map +1 -0
- package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/endpoint-params.control-model.js +19 -2
- package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
- package/build/_modules/socket/_models/socket-client-service-params.control-model.d.ts.map +1 -1
- package/build/_modules/socket/_models/socket-client-service-params.control-model.js +1 -1
- package/build/_modules/socket/_models/socket-client-service-params.control-model.js.map +1 -1
- package/build/_modules/socket/_models/socket-presence.control-model.js +1 -1
- package/build/_modules/socket/_models/socket-presence.control-model.js.map +1 -1
- package/build/_services/base/archive-data.service.d.ts +24 -0
- package/build/_services/base/archive-data.service.d.ts.map +1 -0
- package/build/_services/base/archive-data.service.js +135 -0
- package/build/_services/base/archive-data.service.js.map +1 -0
- package/build/_services/base/data.service.d.ts +3 -2
- package/build/_services/base/data.service.d.ts.map +1 -1
- package/build/_services/base/data.service.js +27 -29
- package/build/_services/base/data.service.js.map +1 -1
- package/build/_services/base/db.service.d.ts +6 -5
- package/build/_services/base/db.service.d.ts.map +1 -1
- package/build/_services/base/db.service.js +31 -14
- package/build/_services/base/db.service.js.map +1 -1
- package/build/_services/core/global.service.d.ts.map +1 -1
- package/build/_services/core/global.service.js +11 -0
- package/build/_services/core/global.service.js.map +1 -1
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +8 -6
- package/build/_services/server/app.server.js.map +1 -1
- package/build/index.d.ts +7 -6
- package/build/index.d.ts.map +1 -1
- package/build/index.js +12 -6
- package/build/index.js.map +1 -1
- package/package.json +3 -3
- package/src/_collections/archive.util.ts +9 -0
- package/src/_models/control-models/endpoint-params.control-model.ts +32 -3
- package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +2 -1
- package/src/_modules/socket/_models/socket-presence.control-model.ts +1 -1
- package/src/_services/base/archive-data.service.ts +207 -0
- package/src/_services/base/data.service.ts +50 -45
- package/src/_services/base/db.service.ts +41 -14
- package/src/_services/core/global.service.ts +14 -0
- package/src/_services/server/app.server.ts +28 -24
- package/src/index.ts +16 -6
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { Request, Response } from 'express';
|
|
4
4
|
|
|
5
|
-
import { DyFM_Array, DyFM_Error, DyFM_errorFlag, DyFM_Log } from '@futdevpro/fsm-dynamo';
|
|
5
|
+
import { DyFM_Array, DyFM_Error, DyFM_errorFlag, DyFM_Log, DyFM_Shared } from '@futdevpro/fsm-dynamo';
|
|
6
6
|
import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
|
|
7
7
|
import { DyNTS_HttpCallType } from '../../_enums/http/http-call-type.enum';
|
|
8
8
|
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
|
|
@@ -311,11 +311,22 @@ export class DyNTS_Endpoint_Params {
|
|
|
311
311
|
DyFM_Log.error('');
|
|
312
312
|
|
|
313
313
|
} catch (error) {
|
|
314
|
-
this.multiLevelError(
|
|
314
|
+
this.multiLevelError(
|
|
315
|
+
error,
|
|
316
|
+
{ req, res, error, issuer }
|
|
317
|
+
);
|
|
315
318
|
}
|
|
316
319
|
}
|
|
317
320
|
|
|
318
|
-
private multiLevelError(
|
|
321
|
+
private multiLevelError(
|
|
322
|
+
error: any,
|
|
323
|
+
errorInputs: {
|
|
324
|
+
req: Request,
|
|
325
|
+
res: Response,
|
|
326
|
+
error: Error | DyFM_Error,
|
|
327
|
+
issuer: string
|
|
328
|
+
}
|
|
329
|
+
): void {
|
|
319
330
|
if (DyNTS_global_settings.log_settings.highDetailedLogs) {
|
|
320
331
|
DyFM_Log.H_error(
|
|
321
332
|
`\n\nDYNAMO MULTILEVEL ERROR:DyNTS_EndpointParams: error: ` +
|
|
@@ -334,6 +345,24 @@ export class DyNTS_Endpoint_Params {
|
|
|
334
345
|
);
|
|
335
346
|
}
|
|
336
347
|
|
|
348
|
+
try {
|
|
349
|
+
JSON.stringify(errorInputs.error);
|
|
350
|
+
} catch (error) {
|
|
351
|
+
DyFM_Log.error('error object is not serializable!');
|
|
352
|
+
let unresolvable;
|
|
353
|
+
|
|
354
|
+
try {
|
|
355
|
+
DyFM_Shared.resolveCirculation(errorInputs.error);
|
|
356
|
+
} catch (error) {
|
|
357
|
+
unresolvable = true;
|
|
358
|
+
DyFM_Log.error('error object is not resolvable!');
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (!unresolvable) {
|
|
362
|
+
DyFM_Log.error('error object is resolvable! (use DyFM_Shared.resolveCirculation)');
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
337
366
|
if (
|
|
338
367
|
DyNTS_global_settings.log_settings.highDetailedLogs ||
|
|
339
368
|
!(error instanceof DyFM_Error)
|
|
@@ -15,6 +15,7 @@ export class DyNTS_SocketClientService_Params extends DyFM_SocketClient_Params {
|
|
|
15
15
|
) {
|
|
16
16
|
super(set);
|
|
17
17
|
|
|
18
|
-
DyFM_Log.H_info(
|
|
18
|
+
DyFM_Log.H_info(
|
|
19
|
+
'DyNTS_SocketClientService_Params (test this with custom address!)', this.address);
|
|
19
20
|
}
|
|
20
21
|
}
|
|
@@ -105,7 +105,7 @@ export class DyNTS_SocketPresence {
|
|
|
105
105
|
if (!socket.connected) {
|
|
106
106
|
DyFM_Log.warn(
|
|
107
107
|
`Emitting event '${event}' on socket(${this.serviceName})-(${index}) failed!` +
|
|
108
|
-
`\
|
|
108
|
+
`\n ERROR: socket[${socket.id}] is not connected! (it will be removed...)`
|
|
109
109
|
);
|
|
110
110
|
|
|
111
111
|
/* errors.push(
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
|
|
2
|
+
import {
|
|
3
|
+
DyFM_Metadata, DyFM_DataModel_Params, DyFM_Error
|
|
4
|
+
} from '@futdevpro/fsm-dynamo';
|
|
5
|
+
|
|
6
|
+
import { DyNTS_DataService } from './data.service';
|
|
7
|
+
import { DyNTS_getArchivedDBName } from '../../_collections/archive.util';
|
|
8
|
+
import { DyNTS_GlobalService } from '../core/global.service';
|
|
9
|
+
import { DyNTS_DBService } from './db.service';
|
|
10
|
+
import { DyNTS_DBFilterSimple } from '../../_models/types/db-filter.type';
|
|
11
|
+
|
|
12
|
+
// TODO: 3 type of archiving service system:
|
|
13
|
+
// 1.: within list (data have a list that have elements to archive)
|
|
14
|
+
// 2.: separate db elements needs to be archived
|
|
15
|
+
// 3.: from separate db elements to archive list elements
|
|
16
|
+
|
|
17
|
+
export class DyNTS_ArchiveDataService<T extends DyFM_Metadata> extends DyNTS_DataService<T> {
|
|
18
|
+
|
|
19
|
+
originalDBService: DyNTS_DBService<T>;
|
|
20
|
+
|
|
21
|
+
constructor(
|
|
22
|
+
/**
|
|
23
|
+
* Initial data, this will be used by functions on default
|
|
24
|
+
*/
|
|
25
|
+
data: T,
|
|
26
|
+
/**
|
|
27
|
+
* DB data prams will be used to connect to usable dbService on GlobalService
|
|
28
|
+
*/
|
|
29
|
+
dataParams: DyFM_DataModel_Params,
|
|
30
|
+
/**
|
|
31
|
+
* Initial set for issuer to be able to follow the issuer's activity
|
|
32
|
+
*/
|
|
33
|
+
issuer: string
|
|
34
|
+
) {
|
|
35
|
+
const originalDataParams = { ...dataParams };
|
|
36
|
+
|
|
37
|
+
dataParams = {
|
|
38
|
+
...dataParams,
|
|
39
|
+
dataName: DyNTS_getArchivedDBName(dataParams.dataName),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
super(data, dataParams, issuer);
|
|
43
|
+
|
|
44
|
+
this.originalDBService = DyNTS_GlobalService.getDBService<T>(originalDataParams);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async archiveDataById(id: string): Promise<T> {
|
|
48
|
+
try {
|
|
49
|
+
if (!id) {
|
|
50
|
+
throw new DyFM_Error({
|
|
51
|
+
...this.getDefaultErrorSettings(
|
|
52
|
+
'archiveDataById',
|
|
53
|
+
new Error('archiveDataById failed, id is missing!')
|
|
54
|
+
),
|
|
55
|
+
|
|
56
|
+
errorCode: 'NTS-ADS-ADI1',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const data = await this.originalDBService.getDataById(id);
|
|
61
|
+
|
|
62
|
+
if (!data) {
|
|
63
|
+
throw new DyFM_Error({
|
|
64
|
+
...this.getDefaultErrorSettings(
|
|
65
|
+
'archiveDataById',
|
|
66
|
+
new Error('archiveDataById failed, data not found!')
|
|
67
|
+
),
|
|
68
|
+
|
|
69
|
+
errorCode: 'NTS-ADS-ADI2',
|
|
70
|
+
additionalContent: {
|
|
71
|
+
id: id,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return await this.archiveData(data);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
throw new DyFM_Error({
|
|
79
|
+
...this.getDefaultErrorSettings(
|
|
80
|
+
'archiveDataById',
|
|
81
|
+
error
|
|
82
|
+
),
|
|
83
|
+
|
|
84
|
+
errorCode: 'NTS-ADS-ADI0',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async getDataByOriginalId(originalId: string, dontSetToService?: boolean): Promise<T> {
|
|
90
|
+
try {
|
|
91
|
+
return await this.findData(
|
|
92
|
+
{
|
|
93
|
+
_originalId: originalId,
|
|
94
|
+
} as DyNTS_DBFilterSimple<T>,
|
|
95
|
+
dontSetToService
|
|
96
|
+
);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
throw new DyFM_Error({
|
|
99
|
+
...this.getDefaultErrorSettings(
|
|
100
|
+
'getDataByOriginalId',
|
|
101
|
+
error
|
|
102
|
+
),
|
|
103
|
+
|
|
104
|
+
errorCode: 'NTS-ADS-GDOI0',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async archiveData(data?: T, dontSetToService?: boolean): Promise<T> {
|
|
110
|
+
try {
|
|
111
|
+
data = this.ensureData(data);
|
|
112
|
+
|
|
113
|
+
if (data?._originalId) {
|
|
114
|
+
throw new DyFM_Error({
|
|
115
|
+
...this.getDefaultErrorSettings(
|
|
116
|
+
'archiveData',
|
|
117
|
+
new Error(
|
|
118
|
+
`archiveData failed, originalId is already exists! (${this.dataParams.dataName})`
|
|
119
|
+
)
|
|
120
|
+
),
|
|
121
|
+
|
|
122
|
+
errorCode: 'NTS-ADS-AD1',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (data?._archived) {
|
|
127
|
+
throw new DyFM_Error({
|
|
128
|
+
...this.getDefaultErrorSettings(
|
|
129
|
+
'archiveData',
|
|
130
|
+
new Error(
|
|
131
|
+
`archiveData failed, data is already archived! (${this.dataParams.dataName})`
|
|
132
|
+
)
|
|
133
|
+
),
|
|
134
|
+
|
|
135
|
+
errorCode: 'NTS-ADS-AD2',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (!data?._id) {
|
|
140
|
+
throw new DyFM_Error({
|
|
141
|
+
...this.getDefaultErrorSettings(
|
|
142
|
+
'archiveData',
|
|
143
|
+
new Error(`archiveData failed, id is missing! (${this.dataParams.dataName})`)
|
|
144
|
+
),
|
|
145
|
+
|
|
146
|
+
errorCode: 'NTS-ADS-AD3',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
await this.originalDBService.deleteDataById(data._id);
|
|
151
|
+
|
|
152
|
+
data._originalId = data._id;
|
|
153
|
+
data._archived = new Date();
|
|
154
|
+
delete data._id;
|
|
155
|
+
|
|
156
|
+
return await this.saveData(data, dontSetToService);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
throw new DyFM_Error({
|
|
159
|
+
...this.getDefaultErrorSettings(
|
|
160
|
+
'archiveData',
|
|
161
|
+
error
|
|
162
|
+
),
|
|
163
|
+
|
|
164
|
+
errorCode: 'NTS-ADS-AD0',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
override async saveData(data?: T, dontSetToService?: boolean): Promise<T> {
|
|
170
|
+
try {
|
|
171
|
+
data = this.ensureData(data);
|
|
172
|
+
|
|
173
|
+
if (!data?._originalId) {
|
|
174
|
+
throw new DyFM_Error({
|
|
175
|
+
...this.getDefaultErrorSettings(
|
|
176
|
+
'saveData',
|
|
177
|
+
new Error(`saveData failed, originalId is missing! (${this.dataParams.dataName})`)
|
|
178
|
+
),
|
|
179
|
+
|
|
180
|
+
errorCode: 'NTS-ADS-SD1',
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (!data?._archived) {
|
|
185
|
+
throw new DyFM_Error({
|
|
186
|
+
...this.getDefaultErrorSettings(
|
|
187
|
+
'saveData',
|
|
188
|
+
new Error(`saveData failed, data is not archived! (${this.dataParams.dataName})`)
|
|
189
|
+
),
|
|
190
|
+
|
|
191
|
+
errorCode: 'NTS-ADS-SD2',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return await super.saveData(data, dontSetToService);
|
|
196
|
+
} catch (error) {
|
|
197
|
+
throw new DyFM_Error({
|
|
198
|
+
...this.getDefaultErrorSettings(
|
|
199
|
+
'saveData',
|
|
200
|
+
error
|
|
201
|
+
),
|
|
202
|
+
|
|
203
|
+
errorCode: 'NTS-ADS-SD0',
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
DyFM_Metadata, DyFM_DataModel_Params, DyFM_DataProperty_Params, DyFM_Error,
|
|
4
4
|
DyFM_Log, DyFM_AnyError, DyFM_Error_Settings, DyFM_ErrorLevel
|
|
5
5
|
} from '@futdevpro/fsm-dynamo';
|
|
6
|
+
|
|
6
7
|
import { DyNTS_DBFilter } from '../../_models/types/db-filter.type';
|
|
7
8
|
import { DyNTS_DBUpdate } from '../../_models/types/db-update.type';
|
|
8
|
-
|
|
9
|
-
import { DyNTS_DBService } from './db.service';
|
|
10
|
-
import { DyNTS_GlobalService } from '../core/global.service';
|
|
11
9
|
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
|
|
10
|
+
import { DyNTS_GlobalService } from '../core/global.service';
|
|
11
|
+
import { DyNTS_DBService } from './db.service';
|
|
12
12
|
|
|
13
13
|
// TODO: 2 type of archiving service system: within list, or separate db elements
|
|
14
14
|
|
|
@@ -79,12 +79,13 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
79
79
|
} catch (error) {
|
|
80
80
|
throw new DyFM_Error({
|
|
81
81
|
...this._getDefaultErrorSettings('constructor', error),
|
|
82
|
-
message: `The dataService construction failed for "${dataParams?.dataName}". ` +
|
|
83
|
-
`at "${this.serviceName}" (${this.constructor.name})` +
|
|
84
|
-
`\nMaybe you forgot to add the dbService to the GlobalService?\n\n`,
|
|
85
|
-
level: DyFM_ErrorLevel.critical,
|
|
86
82
|
|
|
87
83
|
errorCode: 'NTS-DS0-C00',
|
|
84
|
+
message:
|
|
85
|
+
`The dataService construction failed for "${dataParams?.dataName}". ` +
|
|
86
|
+
`at "${this.serviceName}" (${this.constructor.name})` +
|
|
87
|
+
`\nMaybe you forgot to add the dbService to the GlobalService?\n\n`,
|
|
88
|
+
level: DyFM_ErrorLevel.critical,
|
|
88
89
|
});
|
|
89
90
|
/* DyFM_Log.error(
|
|
90
91
|
`\nDyNTS_DataService ERROR: ` +
|
|
@@ -371,7 +372,7 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
371
372
|
|
|
372
373
|
errorCode: 'NTS-DS0-GLD2',
|
|
373
374
|
additionalContent: {
|
|
374
|
-
data: this.data
|
|
375
|
+
data: this.data,
|
|
375
376
|
},
|
|
376
377
|
});
|
|
377
378
|
}
|
|
@@ -579,24 +580,32 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
579
580
|
* //
|
|
580
581
|
*/
|
|
581
582
|
async updateData(
|
|
582
|
-
set: { filterBy?: DyNTS_DBFilter<T>, update: DyNTS_DBUpdate<T> }
|
|
583
|
+
set: { filterBy?: DyNTS_DBFilter<T>, update: DyNTS_DBUpdate<T> },
|
|
584
|
+
dontUpdateModified?: boolean
|
|
583
585
|
): Promise<void> {
|
|
584
586
|
try {
|
|
585
587
|
if (set.filterBy) {
|
|
586
|
-
await this.dataDBService.updateOne(
|
|
588
|
+
await this.dataDBService.updateOne(
|
|
589
|
+
set.filterBy,
|
|
590
|
+
set.update,
|
|
591
|
+
this.issuer,
|
|
592
|
+
dontUpdateModified
|
|
593
|
+
);
|
|
587
594
|
|
|
588
595
|
} else if (this.data._id) {
|
|
589
596
|
await this.dataDBService.updateOne(
|
|
590
597
|
{ _id: this.data._id } as DyNTS_DBFilter<T>,
|
|
591
598
|
set.update,
|
|
592
|
-
this.issuer
|
|
599
|
+
this.issuer,
|
|
600
|
+
dontUpdateModified
|
|
593
601
|
);
|
|
594
602
|
|
|
595
603
|
} else if (this.depKey && this.data[this.depKey]) {
|
|
596
604
|
await this.dataDBService.updateOne(
|
|
597
605
|
{ [this.depKey]: this.data[this.depKey] } as DyNTS_DBFilter<T>,
|
|
598
606
|
set.update,
|
|
599
|
-
this.issuer
|
|
607
|
+
this.issuer,
|
|
608
|
+
dontUpdateModified
|
|
600
609
|
);
|
|
601
610
|
|
|
602
611
|
} else {
|
|
@@ -629,6 +638,25 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
629
638
|
}
|
|
630
639
|
}
|
|
631
640
|
|
|
641
|
+
protected ensureData(data?: T): T {
|
|
642
|
+
if (!data && this.data) {
|
|
643
|
+
data = this.data;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
if (!data) {
|
|
647
|
+
throw new DyFM_Error({
|
|
648
|
+
...this._getDefaultErrorSettings(
|
|
649
|
+
'saveData',
|
|
650
|
+
new Error(`no data to save! (${this.dataParams.dataName})`)
|
|
651
|
+
),
|
|
652
|
+
|
|
653
|
+
errorCode: 'NTS-DS0-ED0',
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
return data;
|
|
658
|
+
}
|
|
659
|
+
|
|
632
660
|
/**
|
|
633
661
|
* modifies data if the data have ID and already exists in the DB,
|
|
634
662
|
* creates new if the ID is not present or cant find in DB,
|
|
@@ -640,22 +668,9 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
640
668
|
* (when you simultaneously trying to change the same data's
|
|
641
669
|
* different values from different flows)
|
|
642
670
|
*/
|
|
643
|
-
async saveData(data?: T, dontSetToService?: boolean): Promise<T> {
|
|
671
|
+
async saveData(data?: T, dontSetToService?: boolean, dontUpdateModified?: boolean): Promise<T> {
|
|
644
672
|
try {
|
|
645
|
-
|
|
646
|
-
data = this.data;
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
if (!data) {
|
|
650
|
-
throw new DyFM_Error({
|
|
651
|
-
...this._getDefaultErrorSettings(
|
|
652
|
-
'saveData',
|
|
653
|
-
new Error(`no data to save! (${this.dataParams.dataName})`)
|
|
654
|
-
),
|
|
655
|
-
|
|
656
|
-
errorCode: 'NTS-DS0-SD4',
|
|
657
|
-
});
|
|
658
|
-
}
|
|
673
|
+
data = this.ensureData(data);
|
|
659
674
|
|
|
660
675
|
await this.validateForSave(data);
|
|
661
676
|
|
|
@@ -694,7 +709,7 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
694
709
|
}
|
|
695
710
|
|
|
696
711
|
// if data exists do modify
|
|
697
|
-
data = await this.dataDBService.modifyData(data, this.issuer);
|
|
712
|
+
data = await this.dataDBService.modifyData(data, this.issuer, dontUpdateModified);
|
|
698
713
|
|
|
699
714
|
if (!dontSetToService) {
|
|
700
715
|
this.data = data;
|
|
@@ -726,7 +741,7 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
726
741
|
|
|
727
742
|
if (dataExists) {
|
|
728
743
|
// if data exists do modify
|
|
729
|
-
data = await this.dataDBService.modifyData(data, this.issuer);
|
|
744
|
+
data = await this.dataDBService.modifyData(data, this.issuer, dontUpdateModified);
|
|
730
745
|
|
|
731
746
|
if (!dontSetToService) {
|
|
732
747
|
this.data = data;
|
|
@@ -800,8 +815,12 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
800
815
|
errorCode: 'NTS-DS0-DD1',
|
|
801
816
|
});
|
|
802
817
|
}
|
|
803
|
-
|
|
818
|
+
|
|
804
819
|
await this.dataDBService.deleteDataById(id);
|
|
820
|
+
|
|
821
|
+
if (this.data._id === id) {
|
|
822
|
+
delete this.data._id;
|
|
823
|
+
}
|
|
805
824
|
} catch (error) {
|
|
806
825
|
if (error?.errorCode == 'NTS-DS0-DD1') {
|
|
807
826
|
throw error;
|
|
@@ -820,21 +839,7 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
820
839
|
*/
|
|
821
840
|
async validateForSave(data?: T): Promise<void> {
|
|
822
841
|
try {
|
|
823
|
-
|
|
824
|
-
data = this.data;
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
if (!data) {
|
|
828
|
-
throw new DyFM_Error({
|
|
829
|
-
...this._getDefaultErrorSettings(
|
|
830
|
-
'validateForSave',
|
|
831
|
-
new Error(`validateForSave failed, no data provided! (${this.dataParams.dataName})`)
|
|
832
|
-
),
|
|
833
|
-
|
|
834
|
-
status: 522,
|
|
835
|
-
errorCode: 'NTS-DS0-VD4',
|
|
836
|
-
});
|
|
837
|
-
}
|
|
842
|
+
data = this.ensureData(data);
|
|
838
843
|
|
|
839
844
|
for (const element of this.dataParams.properties) {
|
|
840
845
|
// basic required validations
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from '@futdevpro/fsm-dynamo';
|
|
9
9
|
import { DyNTS_DBFilter } from '../../_models/types/db-filter.type';
|
|
10
10
|
import { DyNTS_DBUpdate } from '../../_models/types/db-update.type';
|
|
11
|
+
import { DyNTS_archiveSuffix } from '../../_collections/archive.util';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* DB Service for MongoDB
|
|
@@ -125,9 +126,11 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
125
126
|
* @param data data
|
|
126
127
|
* @returns data
|
|
127
128
|
*/
|
|
128
|
-
async modifyData(data: T, issuer: string): Promise<T> {
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
async modifyData(data: T, issuer: string, dontUpdateModified?: boolean): Promise<T> {
|
|
130
|
+
if (!dontUpdateModified) {
|
|
131
|
+
data.__lastModified = new Date();
|
|
132
|
+
data.__lastModifiedBy = issuer;
|
|
133
|
+
}
|
|
131
134
|
|
|
132
135
|
/**
|
|
133
136
|
* EZ A SZAR TELJESEN SZAR, nem friss, nem a db-be mentett adatokat ad vissza,
|
|
@@ -718,9 +721,16 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
718
721
|
* @param update update
|
|
719
722
|
* @returns data
|
|
720
723
|
*/
|
|
721
|
-
async findByIdAndUpdate(
|
|
722
|
-
|
|
723
|
-
update
|
|
724
|
+
async findByIdAndUpdate(
|
|
725
|
+
id: string,
|
|
726
|
+
update: DyNTS_DBUpdate<T>,
|
|
727
|
+
issuer: string,
|
|
728
|
+
dontUpdateModified?: boolean
|
|
729
|
+
): Promise<T> {
|
|
730
|
+
if (!dontUpdateModified) {
|
|
731
|
+
update.__lastModified = new Date();
|
|
732
|
+
update.__lastModifiedBy = issuer;
|
|
733
|
+
}
|
|
724
734
|
|
|
725
735
|
let newData: T = await this.dataModel
|
|
726
736
|
.findByIdAndUpdate(id, update)
|
|
@@ -796,10 +806,13 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
796
806
|
async updateOne(
|
|
797
807
|
filterBy: DyNTS_DBFilter<T>,
|
|
798
808
|
update: DyNTS_DBUpdate<T>,
|
|
799
|
-
issuer: string
|
|
809
|
+
issuer: string,
|
|
810
|
+
dontUpdateModified?: boolean
|
|
800
811
|
): Promise<void> {
|
|
801
|
-
|
|
802
|
-
|
|
812
|
+
if (!dontUpdateModified) {
|
|
813
|
+
update.__lastModified = new Date();
|
|
814
|
+
update.__lastModifiedBy = issuer;
|
|
815
|
+
}
|
|
803
816
|
|
|
804
817
|
await this.dataModel
|
|
805
818
|
.updateOne(filterBy, update)
|
|
@@ -869,10 +882,13 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
869
882
|
async updateMany(
|
|
870
883
|
filterBy: DyNTS_DBFilter<T>,
|
|
871
884
|
update: DyNTS_DBUpdate<T>,
|
|
872
|
-
issuer: string
|
|
885
|
+
issuer: string,
|
|
886
|
+
dontUpdateModified?: boolean
|
|
873
887
|
): Promise<void> {
|
|
874
|
-
|
|
875
|
-
|
|
888
|
+
if (!dontUpdateModified) {
|
|
889
|
+
update.__lastModified = new Date();
|
|
890
|
+
update.__lastModifiedBy = issuer;
|
|
891
|
+
}
|
|
876
892
|
|
|
877
893
|
await this.dataModel
|
|
878
894
|
.updateMany(filterBy, update)
|
|
@@ -939,7 +955,11 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
939
955
|
private getSchema(): mongoose.Schema {
|
|
940
956
|
let schema: any = this.buildMongooseSchemaByModelParams();
|
|
941
957
|
|
|
942
|
-
schema = this.
|
|
958
|
+
schema = this.addMetadataToSchema(schema);
|
|
959
|
+
|
|
960
|
+
if (this.dataParams.dataName.includes(DyNTS_archiveSuffix)) {
|
|
961
|
+
schema = this.addArchiveMetadataToSchema(schema);
|
|
962
|
+
}
|
|
943
963
|
|
|
944
964
|
// tslint:disable-next-line: no-string-literal
|
|
945
965
|
if (schema['_id']) {
|
|
@@ -1039,7 +1059,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
1039
1059
|
* @param schema schema to update
|
|
1040
1060
|
* @returns updated schema
|
|
1041
1061
|
*/
|
|
1042
|
-
private
|
|
1062
|
+
private addMetadataToSchema(schema: any): any {
|
|
1043
1063
|
schema.__created = { type: Date };
|
|
1044
1064
|
schema.__createdBy = { type: String };
|
|
1045
1065
|
schema.__lastModified = { type: Date };
|
|
@@ -1048,6 +1068,13 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
1048
1068
|
return schema;
|
|
1049
1069
|
}
|
|
1050
1070
|
|
|
1071
|
+
private addArchiveMetadataToSchema(schema: any): any {
|
|
1072
|
+
schema._originalId = { type: String, required: true, index: true, unique: true };
|
|
1073
|
+
schema._archived = { type: Date, required: true };
|
|
1074
|
+
|
|
1075
|
+
return schema;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1051
1078
|
/**
|
|
1052
1079
|
* sets depDataKey
|
|
1053
1080
|
*/
|
|
@@ -23,6 +23,8 @@ import { DyNTS_Service_Collection } from './service-collection.service';
|
|
|
23
23
|
/* import { DyNTS_EmailServiceCollection } from './email-service-collection.service'; */
|
|
24
24
|
import { DyNTS_SingletonService } from '../base/singleton.service';
|
|
25
25
|
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
|
|
26
|
+
/* import { DyNTS_archiveFlag } from '../../_collections/archive-flag.const'; */
|
|
27
|
+
import { DyNTS_getArchivedDBName } from '../../_collections/archive.util';
|
|
26
28
|
|
|
27
29
|
/**
|
|
28
30
|
* This is the main Global/Core Service Collection used by DynamoBE,
|
|
@@ -84,6 +86,18 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
|
|
|
84
86
|
private static async setDBServices(dbModels?: DyFM_DataModel_Params[]): Promise<void> {
|
|
85
87
|
try {
|
|
86
88
|
this.instance.dbServiceCollection = {};
|
|
89
|
+
|
|
90
|
+
dbModels?.forEach((dbModel: DyFM_DataModel_Params): void => {
|
|
91
|
+
if (dbModel.addArchive) {
|
|
92
|
+
const archiveModel: DyFM_DataModel_Params = new DyFM_DataModel_Params({
|
|
93
|
+
...dbModel,
|
|
94
|
+
dataName: DyNTS_getArchivedDBName(dbModel.dataName),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
dbModels.push(archiveModel);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
87
101
|
dbModels?.forEach((dbModel: DyFM_DataModel_Params): void => {
|
|
88
102
|
if (!dbModel.constructed) {
|
|
89
103
|
throw new DyFM_Error({
|
|
@@ -271,32 +271,36 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
|
|
|
271
271
|
constructor(extended?: boolean){
|
|
272
272
|
super();
|
|
273
273
|
|
|
274
|
-
process.on(
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
DyNTS_GlobalService.globalErrorHandler?.(
|
|
284
|
-
new DyFM_Error({
|
|
285
|
-
errorCode: 'NTS-AS0-BASE-UR',
|
|
286
|
-
message: 'Unhandled Rejection!',
|
|
287
|
-
error: new Error(p_passWhatIsThis),
|
|
288
|
-
additionalContent: {
|
|
289
|
-
reason: reason,
|
|
290
|
-
p_noIdeaWhatIsThisFromProcessRejection: p_passWhatIsThis,
|
|
291
|
-
},
|
|
292
|
-
level: DyFM_ErrorLevel.critical,
|
|
293
|
-
})
|
|
274
|
+
process.on(
|
|
275
|
+
'unhandledRejection',
|
|
276
|
+
(reason_theError: object, p_passWhatIsThis_maybeThePromise: any): void => {
|
|
277
|
+
DyFM_Log.H_error(
|
|
278
|
+
'Unhandled Rejection: ', (p_passWhatIsThis_maybeThePromise as Promise<any>)?.toString(),
|
|
279
|
+
'\n Rejection reason:', (reason_theError as Error)?.stack?.split('at')?.[0],
|
|
280
|
+
/* '\n ErrorCode:', (reason as any)?.code, */
|
|
281
|
+
'\n\n Stack:',
|
|
282
|
+
(reason_theError as Error)?.stack?.replaceAll?.('\n at', '\n at'),
|
|
294
283
|
);
|
|
295
284
|
|
|
296
|
-
|
|
297
|
-
|
|
285
|
+
try {
|
|
286
|
+
DyNTS_GlobalService.globalErrorHandler?.(
|
|
287
|
+
new DyFM_Error({
|
|
288
|
+
errorCode: 'NTS-AS0-BASE-UR',
|
|
289
|
+
message: 'Unhandled Rejection!',
|
|
290
|
+
error: reason_theError as Error,
|
|
291
|
+
additionalContent: {
|
|
292
|
+
reason: reason_theError,
|
|
293
|
+
rejectedPromise: p_passWhatIsThis_maybeThePromise,
|
|
294
|
+
},
|
|
295
|
+
level: DyFM_ErrorLevel.critical,
|
|
296
|
+
})
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
} catch (error) {
|
|
300
|
+
DyFM_Log.error('globalErrorHandler (MULTILEVEL) ERROR:', error);
|
|
301
|
+
}
|
|
298
302
|
}
|
|
299
|
-
|
|
303
|
+
);
|
|
300
304
|
|
|
301
305
|
this.asyncConstruct(extended).catch((error: any): void => {
|
|
302
306
|
if (
|
|
@@ -313,7 +317,7 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
|
|
|
313
317
|
);
|
|
314
318
|
}
|
|
315
319
|
|
|
316
|
-
DyFM_Log.H_warn('
|
|
320
|
+
DyFM_Log.H_warn('asyncConstruct error\n', error?.additionalContent);
|
|
317
321
|
});
|
|
318
322
|
}
|
|
319
323
|
|