@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.
Files changed (45) hide show
  1. package/build/_collections/archive.util.d.ts +3 -0
  2. package/build/_collections/archive.util.d.ts.map +1 -0
  3. package/build/_collections/archive.util.js +9 -0
  4. package/build/_collections/archive.util.js.map +1 -0
  5. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  6. package/build/_models/control-models/endpoint-params.control-model.js +19 -2
  7. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  8. package/build/_modules/socket/_models/socket-client-service-params.control-model.d.ts.map +1 -1
  9. package/build/_modules/socket/_models/socket-client-service-params.control-model.js +1 -1
  10. package/build/_modules/socket/_models/socket-client-service-params.control-model.js.map +1 -1
  11. package/build/_modules/socket/_models/socket-presence.control-model.js +1 -1
  12. package/build/_modules/socket/_models/socket-presence.control-model.js.map +1 -1
  13. package/build/_services/base/archive-data.service.d.ts +24 -0
  14. package/build/_services/base/archive-data.service.d.ts.map +1 -0
  15. package/build/_services/base/archive-data.service.js +135 -0
  16. package/build/_services/base/archive-data.service.js.map +1 -0
  17. package/build/_services/base/data.service.d.ts +3 -2
  18. package/build/_services/base/data.service.d.ts.map +1 -1
  19. package/build/_services/base/data.service.js +27 -29
  20. package/build/_services/base/data.service.js.map +1 -1
  21. package/build/_services/base/db.service.d.ts +6 -5
  22. package/build/_services/base/db.service.d.ts.map +1 -1
  23. package/build/_services/base/db.service.js +31 -14
  24. package/build/_services/base/db.service.js.map +1 -1
  25. package/build/_services/core/global.service.d.ts.map +1 -1
  26. package/build/_services/core/global.service.js +11 -0
  27. package/build/_services/core/global.service.js.map +1 -1
  28. package/build/_services/server/app.server.d.ts.map +1 -1
  29. package/build/_services/server/app.server.js +8 -6
  30. package/build/_services/server/app.server.js.map +1 -1
  31. package/build/index.d.ts +7 -6
  32. package/build/index.d.ts.map +1 -1
  33. package/build/index.js +12 -6
  34. package/build/index.js.map +1 -1
  35. package/package.json +3 -3
  36. package/src/_collections/archive.util.ts +9 -0
  37. package/src/_models/control-models/endpoint-params.control-model.ts +32 -3
  38. package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +2 -1
  39. package/src/_modules/socket/_models/socket-presence.control-model.ts +1 -1
  40. package/src/_services/base/archive-data.service.ts +207 -0
  41. package/src/_services/base/data.service.ts +50 -45
  42. package/src/_services/base/db.service.ts +41 -14
  43. package/src/_services/core/global.service.ts +14 -0
  44. package/src/_services/server/app.server.ts +28 -24
  45. 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(error);
314
+ this.multiLevelError(
315
+ error,
316
+ { req, res, error, issuer }
317
+ );
315
318
  }
316
319
  }
317
320
 
318
- private multiLevelError(error: any): void {
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('T1000 (test this with custom address!)', this.address);
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
- `\nERROR: socket[${socket.id}] is not connected! (it will be removed...)`
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(set.filterBy, set.update, this.issuer);
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
- if (!data && this.data) {
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
- if (!data) {
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
- data.__lastModified = new Date();
130
- data.__lastModifiedBy = issuer;
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(id: string, update: DyNTS_DBUpdate<T>, issuer: string): Promise<T> {
722
- update.__lastModified = new Date();
723
- update.__lastModifiedBy = issuer;
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
- update.__lastModified = new Date();
802
- update.__lastModifiedBy = issuer;
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
- update.__lastModified = new Date();
875
- update.__lastModifiedBy = issuer;
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.addDyFM_MetadataToSchema(schema);
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 addDyFM_MetadataToSchema(schema: any): any {
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('unhandledRejection', (reason: object, p_passWhatIsThis: any): void => {
275
- DyFM_Log.H_error(
276
- 'Unhandled Rejection: ', p_passWhatIsThis?.toString()?.split('at')?.[0],
277
- '\n Rejection reason:', reason?.toString()?.split('at')?.[0],
278
- '\n\n Stack:',
279
- (reason as any)?.stack?.replaceAll?.('\n at', '\n at'),
280
- );
281
-
282
- try {
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
- } catch (error) {
297
- DyFM_Log.error('globalErrorHandler (MULTILEVEL) ERROR:', error);
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('T1000\n', error?.additionalContent);
320
+ DyFM_Log.H_warn('asyncConstruct error\n', error?.additionalContent);
317
321
  });
318
322
  }
319
323