@futdevpro/nts-dynamo 1.9.39 → 1.9.41

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 (72) 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/_collections/global-settings.const.d.ts.map +1 -1
  6. package/build/_collections/global-settings.const.js +1 -0
  7. package/build/_collections/global-settings.const.js.map +1 -1
  8. package/build/_models/control-models/endpoint-params.control-model.d.ts +13 -8
  9. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  10. package/build/_models/control-models/endpoint-params.control-model.js +60 -10
  11. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  12. package/build/_models/interfaces/global-settings.interface.d.ts +4 -0
  13. package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
  14. package/build/_modules/socket/_models/socket-client-service-params.control-model.d.ts.map +1 -1
  15. package/build/_modules/socket/_models/socket-client-service-params.control-model.js +1 -1
  16. package/build/_modules/socket/_models/socket-client-service-params.control-model.js.map +1 -1
  17. package/build/_modules/socket/_models/socket-presence.control-model.js +1 -1
  18. package/build/_modules/socket/_models/socket-presence.control-model.js.map +1 -1
  19. package/build/_modules/socket/_services/app-extended.server.d.ts +3 -3
  20. package/build/_modules/socket/_services/app-extended.server.d.ts.map +1 -1
  21. package/build/_modules/socket/_services/app-extended.server.js +33 -21
  22. package/build/_modules/socket/_services/app-extended.server.js.map +1 -1
  23. package/build/_modules/socket/_services/socket-server.service.js +3 -3
  24. package/build/_modules/socket/_services/socket-server.service.js.map +1 -1
  25. package/build/_services/base/archive-data.service.d.ts +24 -0
  26. package/build/_services/base/archive-data.service.d.ts.map +1 -0
  27. package/build/_services/base/archive-data.service.js +135 -0
  28. package/build/_services/base/archive-data.service.js.map +1 -0
  29. package/build/_services/base/data.service.d.ts +3 -2
  30. package/build/_services/base/data.service.d.ts.map +1 -1
  31. package/build/_services/base/data.service.js +28 -30
  32. package/build/_services/base/data.service.js.map +1 -1
  33. package/build/_services/base/db.service.d.ts +6 -5
  34. package/build/_services/base/db.service.d.ts.map +1 -1
  35. package/build/_services/base/db.service.js +31 -14
  36. package/build/_services/base/db.service.js.map +1 -1
  37. package/build/_services/base/singleton.service-base.d.ts +1 -1
  38. package/build/_services/base/singleton.service-base.d.ts.map +1 -1
  39. package/build/_services/base/singleton.service-base.js +1 -0
  40. package/build/_services/base/singleton.service-base.js.map +1 -1
  41. package/build/_services/core/global.service.d.ts.map +1 -1
  42. package/build/_services/core/global.service.js +46 -23
  43. package/build/_services/core/global.service.js.map +1 -1
  44. package/build/_services/route/routing-module.service.d.ts +1 -1
  45. package/build/_services/route/routing-module.service.d.ts.map +1 -1
  46. package/build/_services/route/routing-module.service.js +19 -2
  47. package/build/_services/route/routing-module.service.js.map +1 -1
  48. package/build/_services/server/app.server.d.ts +2 -2
  49. package/build/_services/server/app.server.d.ts.map +1 -1
  50. package/build/_services/server/app.server.js +18 -10
  51. package/build/_services/server/app.server.js.map +1 -1
  52. package/build/index.d.ts +7 -6
  53. package/build/index.d.ts.map +1 -1
  54. package/build/index.js +12 -6
  55. package/build/index.js.map +1 -1
  56. package/package.json +3 -3
  57. package/src/_collections/archive.util.ts +9 -0
  58. package/src/_collections/global-settings.const.ts +1 -0
  59. package/src/_models/control-models/endpoint-params.control-model.ts +98 -21
  60. package/src/_models/interfaces/global-settings.interface.ts +5 -0
  61. package/src/_modules/socket/_models/socket-client-service-params.control-model.ts +2 -1
  62. package/src/_modules/socket/_models/socket-presence.control-model.ts +1 -1
  63. package/src/_modules/socket/_services/app-extended.server.ts +10 -8
  64. package/src/_modules/socket/_services/socket-server.service.ts +3 -3
  65. package/src/_services/base/archive-data.service.ts +207 -0
  66. package/src/_services/base/data.service.ts +50 -45
  67. package/src/_services/base/db.service.ts +41 -14
  68. package/src/_services/base/singleton.service-base.ts +2 -1
  69. package/src/_services/core/global.service.ts +66 -34
  70. package/src/_services/route/routing-module.service.ts +23 -4
  71. package/src/_services/server/app.server.ts +42 -29
  72. package/src/index.ts +16 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,sCAAsC,CAAC;AAIrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AAGpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AAKtD,cAAc,wDAAwD,CAAC;AACvE,cAAc,uDAAuD,CAAC;AACtE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wDAAwD,CAAC;AAGvE,cAAc,wDAAwD,CAAC;AACvE,cAAc,mDAAmD,CAAC;AAClE,cAAc,sDAAsD,CAAC;AACrE,cAAc,wDAAwD,CAAC;AAGvE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAI/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AACzD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,sCAAsC,CAAC;AAIrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AAGpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AAKtD,cAAc,wDAAwD,CAAC;AACvE,cAAc,uDAAuD,CAAC;AACtE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wDAAwD,CAAC;AAGvE,cAAc,wDAAwD,CAAC;AACvE,cAAc,mDAAmD,CAAC;AAClE,cAAc,sDAAsD,CAAC;AACrE,cAAc,wDAAwD,CAAC;AAGvE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAK/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6CAA6C,CAAC;AAG5D,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AAGnD,cAAc,+BAA+B,CAAC;AAG9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,mCAAmC,CAAC"}
package/build/index.js CHANGED
@@ -26,17 +26,23 @@ tslib_1.__exportStar(require("./_models/control-models/endpoint-params.control-m
26
26
  tslib_1.__exportStar(require("./_models/types/db-filter.type"), exports);
27
27
  tslib_1.__exportStar(require("./_models/types/db-update.type"), exports);
28
28
  // SERVICES
29
+ // services/CORE
29
30
  tslib_1.__exportStar(require("./_services/core/api.service"), exports);
30
- tslib_1.__exportStar(require("./_services/server/app.server"), exports);
31
31
  tslib_1.__exportStar(require("./_services/core/auth.service"), exports);
32
- tslib_1.__exportStar(require("./_services/route/controller.service"), exports);
33
- tslib_1.__exportStar(require("./_services/base/data.service"), exports);
34
- tslib_1.__exportStar(require("./_services/base/db.service"), exports);
35
32
  tslib_1.__exportStar(require("./_services/core/email.service"), exports);
36
33
  tslib_1.__exportStar(require("./_services/core/global.service"), exports);
34
+ tslib_1.__exportStar(require("./_services/core/service-collection.service"), exports);
35
+ // services/BASE
36
+ tslib_1.__exportStar(require("./_services/base/archive-data.service"), exports);
37
+ tslib_1.__exportStar(require("./_services/base/data.service"), exports);
38
+ tslib_1.__exportStar(require("./_services/base/db.service"), exports);
39
+ tslib_1.__exportStar(require("./_services/base/singleton.service"), exports);
40
+ // services/SERVER
41
+ tslib_1.__exportStar(require("./_services/server/app.server"), exports);
42
+ // services/ROUTE
43
+ tslib_1.__exportStar(require("./_services/route/controller.service"), exports);
37
44
  tslib_1.__exportStar(require("./_services/route/controller.service"), exports);
38
45
  tslib_1.__exportStar(require("./_services/route/routing-module.service"), exports);
39
- tslib_1.__exportStar(require("./_services/core/service-collection.service"), exports);
46
+ // services/SHARED
40
47
  tslib_1.__exportStar(require("./_services/shared.static-service"), exports);
41
- tslib_1.__exportStar(require("./_services/base/singleton.service"), exports);
42
48
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,+EAAqD;AAGrD,QAAQ;AACR,wEAA8C;AAC9C,8EAAoD;AACpD,uEAA6C;AAC7C,8EAAoD;AAEpD,aAAa;AACb,4EAAkD;AAClD,gFAAsD;AAGtD,6CAA6C;AAC7C,oBAAoB;AACpB,iGAAuE;AACvE,gGAAsE;AACtE,yFAA+D;AAC/D,iGAAuE;AAEvE,wBAAwB;AACxB,iGAAuE;AACvE,4FAAkE;AAClE,+FAAqE;AACrE,iGAAuE;AAEvE,eAAe;AACf,yEAA+C;AAC/C,yEAA+C;AAG/C,WAAW;AACX,uEAA6C;AAC7C,wEAA8C;AAC9C,wEAA8C;AAC9C,+EAAqD;AACrD,wEAA8C;AAC9C,sEAA4C;AAC5C,yEAA+C;AAC/C,0EAAgD;AAChD,+EAAqD;AACrD,mFAAyD;AACzD,sFAA4D;AAC5D,4EAAkD;AAClD,6EAAmD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,+EAAqD;AAGrD,QAAQ;AACR,wEAA8C;AAC9C,8EAAoD;AACpD,uEAA6C;AAC7C,8EAAoD;AAEpD,aAAa;AACb,4EAAkD;AAClD,gFAAsD;AAGtD,6CAA6C;AAC7C,oBAAoB;AACpB,iGAAuE;AACvE,gGAAsE;AACtE,yFAA+D;AAC/D,iGAAuE;AAEvE,wBAAwB;AACxB,iGAAuE;AACvE,4FAAkE;AAClE,+FAAqE;AACrE,iGAAuE;AAEvE,eAAe;AACf,yEAA+C;AAC/C,yEAA+C;AAG/C,WAAW;AACX,gBAAgB;AAChB,uEAA6C;AAC7C,wEAA8C;AAC9C,yEAA+C;AAC/C,0EAAgD;AAChD,sFAA4D;AAE5D,gBAAgB;AAChB,gFAAsD;AACtD,wEAA8C;AAC9C,sEAA4C;AAC5C,6EAAmD;AAEnD,kBAAkB;AAClB,wEAA8C;AAE9C,iBAAiB;AACjB,+EAAqD;AACrD,+EAAqD;AACrD,mFAAyD;AAEzD,kBAAkB;AAClB,4EAAkD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/nts-dynamo",
3
- "version": "01.09.39",
3
+ "version": "01.09.41",
4
4
  "description": "Dynamic NodeTS (NodeJS-Typescript), MongoDB Backend System Framework by Future Development Program Ltd.",
5
5
  "scripts": {
6
6
  "prep": "npm i rimraf nodemon -g",
@@ -90,11 +90,11 @@
90
90
  },
91
91
  "homepage": "https:/futdevpro.hu/projects/dynamo",
92
92
  "DISABLED": {
93
- "@futdevpro/fsm-dynamo": "file:../tgz-collection/dynamo-fsm/futdevpro-fsm-dynamo-01.09.21.tgz",
93
+ "@futdevpro/fsm-dynamo": "file:../tgz-collection/dynamo-fsm/futdevpro-fsm-dynamo-01.09.38.tgz",
94
94
  "empty": ""
95
95
  },
96
96
  "peerDependencies": {
97
- "@futdevpro/fsm-dynamo": "~1.9.32",
97
+ "@futdevpro/fsm-dynamo": "~1.9.38",
98
98
 
99
99
  "@types/express": "~4.17.17",
100
100
  "@types/geoip-lite": "~1.4.1",
@@ -0,0 +1,9 @@
1
+
2
+
3
+
4
+ export const DyNTS_archiveSuffix = 'Archived';
5
+
6
+ export function DyNTS_getArchivedDBName(dbName: string): string {
7
+ return `${dbName}${DyNTS_archiveSuffix}`;
8
+ }
9
+
@@ -7,6 +7,7 @@ export const DyNTS_global_settings: DyNTS_Global_Settings = {
7
7
  baseUrl: '/api',
8
8
  defaultRouteSecurity: DyNTS_RouteSecurity.open,
9
9
  defaultSocketSecurity: DyNTS_SocketSecurity.open,
10
+ autoResolveEndpointCirculationErrors: true,
10
11
 
11
12
  log_settings: {
12
13
  highDetailedLogs: false,
@@ -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';
@@ -23,16 +23,17 @@ export class DyNTS_Endpoint_Params {
23
23
  /* TODO: ENCRYPTION !!EZTET
24
24
  useEncryptionKey?: string; */
25
25
 
26
- private pathParams: string[];
26
+ private readonly pathParams: string[];
27
27
 
28
- private preProcesses: ((req: Request, res: Response) => Promise<void>)[];
29
- private tasks: ((req: Request, res: Response, issuer?: string) => Promise<void>)[];
28
+ private readonly preProcesses: ((req: Request, res: Response) => Promise<void>)[];
29
+ private readonly tasks: ((req: Request, res: Response, issuer?: string) => Promise<void>)[];
30
30
 
31
- private logRequest: boolean;
32
- private logRequestsParams: boolean;
33
- private logRequestsContent: boolean;
34
- private logResponseContent: boolean;
35
- private stack: string;
31
+ private readonly logRequest: boolean;
32
+ private readonly logRequestsParams: boolean;
33
+ private readonly logRequestsContent: boolean;
34
+ private readonly logResponseContent: boolean;
35
+ private readonly stack: string;
36
+ private readonly autoResolveCirculation: boolean;
36
37
 
37
38
  constructor(
38
39
  set: {
@@ -85,6 +86,10 @@ export class DyNTS_Endpoint_Params {
85
86
  * log settings for response content
86
87
  */
87
88
  logResponseContent?: boolean,
89
+ /**
90
+ * auto resolve circulation errors
91
+ */
92
+ autoResolveCirculation?: boolean,
88
93
  }
89
94
  ) {
90
95
  try {
@@ -101,6 +106,8 @@ export class DyNTS_Endpoint_Params {
101
106
  set.logRequestsContent ?? DyNTS_global_settings.log_settings.requestsContent;
102
107
  this.logResponseContent =
103
108
  set.logResponseContent ?? DyNTS_global_settings.log_settings.responseContent;
109
+ this.autoResolveCirculation =
110
+ set.autoResolveCirculation ?? DyNTS_global_settings.autoResolveEndpointCirculationErrors;
104
111
 
105
112
  if (!this.endpoint) {
106
113
  throw new DyFM_Error({
@@ -233,7 +240,8 @@ export class DyNTS_Endpoint_Params {
233
240
  req: Request,
234
241
  res: Response,
235
242
  error: Error | DyFM_Error,
236
- issuer: string
243
+ issuer: string,
244
+ autoSecondTry?: boolean
237
245
  ): Promise<void> {
238
246
  try {
239
247
  let msg: string = `Endpoint caught an error. '${this.name}' (${this.endpoint})`;
@@ -284,10 +292,27 @@ export class DyNTS_Endpoint_Params {
284
292
 
285
293
  try {
286
294
  JSON.stringify(error);
287
- } catch (error) {
288
- DyFM_Log.H_error(
289
- 'DyNTS_Endpoint_Params: error object is not serializable!', error
290
- );
295
+ } catch (stringifyError) {
296
+ if (this.autoResolveCirculation) {
297
+ try {
298
+ error = DyFM_Shared.resolveCirculation(error);
299
+ JSON.stringify(error);
300
+ } catch (resolveError) {
301
+ DyFM_Log.H_error(
302
+ 'DyNTS_Endpoint_Params: error object is not serializable, and not resolvable!'
303
+ );
304
+
305
+ error = new DyFM_Error({
306
+ error: new Error('UNRESOLVABLE UNSERIALIZABLE ERROR'),
307
+ });
308
+ }
309
+ } else {
310
+ DyFM_Log.H_error('DyNTS_Endpoint_Params: error object is not serializable!');
311
+
312
+ error = new DyFM_Error({
313
+ error: new Error('UNSERIALIZABLE ERROR'),
314
+ });
315
+ }
291
316
  }
292
317
 
293
318
  res.status((error as DyFM_Error)?.___status ?? 501);
@@ -310,19 +335,37 @@ export class DyNTS_Endpoint_Params {
310
335
 
311
336
  DyFM_Log.error('');
312
337
 
313
- } catch (error) {
314
- this.multiLevelError(error);
338
+ } catch (errorLvl2) {
339
+ this.multiLevelError(
340
+ errorLvl2,
341
+ {
342
+ req: req,
343
+ res: res,
344
+ error: error,
345
+ issuer: issuer,
346
+ autoSecondTry: autoSecondTry,
347
+ }
348
+ );
315
349
  }
316
350
  }
317
351
 
318
- private multiLevelError(error: any): void {
352
+ private multiLevelError(
353
+ errorLvl2: any,
354
+ errorInputs: {
355
+ req: Request,
356
+ res: Response,
357
+ error: Error | DyFM_Error,
358
+ issuer: string,
359
+ autoSecondTry: boolean
360
+ }
361
+ ): void {
319
362
  if (DyNTS_global_settings.log_settings.highDetailedLogs) {
320
363
  DyFM_Log.H_error(
321
364
  `\n\nDYNAMO MULTILEVEL ERROR:DyNTS_EndpointParams: error: ` +
322
365
  `(${this.name}, ${this.endpoint})` +
323
366
  `\n(DYNAMO MULTILEVEL ERROR means, that the ERROR HANDLING is ALSO FAILED, ` +
324
367
  `and the error message was not sent.)` +
325
- `\nERROR:`, error,
368
+ `\nERROR:`, errorLvl2,
326
369
  '\n'
327
370
  );
328
371
  } else {
@@ -334,16 +377,50 @@ export class DyNTS_Endpoint_Params {
334
377
  );
335
378
  }
336
379
 
380
+ try {
381
+ JSON.stringify(errorInputs.error);
382
+ } catch (errorLvl2Replication) {
383
+ DyFM_Log.error(' ...response object is not serializable!');
384
+ let resolvedError: any;
385
+
386
+ try {
387
+ resolvedError = DyFM_Shared.resolveCirculation(errorInputs.error);
388
+ } catch (errorLvl3) {
389
+ DyFM_Log.error(' ...response object is not resolvable!');
390
+ DyFM_Log.error(' ...', errorLvl3);
391
+ }
392
+
393
+ if (resolvedError) {
394
+ if (this.autoResolveCirculation && !errorInputs.autoSecondTry) {
395
+ this.error(
396
+ errorInputs.req,
397
+ errorInputs.res,
398
+ resolvedError,
399
+ errorInputs.issuer,
400
+ true
401
+ );
402
+
403
+ DyFM_Log.warn(' ...automatic circulation error resolution was successful!');
404
+
405
+ return;
406
+ } else {
407
+ DyFM_Log.error(
408
+ ' ...response object is resolvable! (use DyFM_Shared.resolveCirculation)'
409
+ );
410
+ }
411
+ }
412
+ }
413
+
337
414
  if (
338
415
  DyNTS_global_settings.log_settings.highDetailedLogs ||
339
- !(error instanceof DyFM_Error)
416
+ !(errorLvl2 instanceof DyFM_Error)
340
417
  ) {
341
418
  DyFM_Log.H_error(
342
419
  `Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`,
343
- '\n ERROR:', error
420
+ '\n ERROR:', errorLvl2
344
421
  );
345
422
  } else {
346
- error.logSimple(
423
+ errorLvl2.logSimple(
347
424
  `Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`
348
425
  );
349
426
  }
@@ -30,6 +30,11 @@ export interface DyNTS_Global_Settings {
30
30
  */
31
31
  systemShortCodeName?: string;
32
32
 
33
+ /**
34
+ *
35
+ */
36
+ autoResolveEndpointCirculationErrors: boolean;
37
+
33
38
  /**
34
39
  * this setting will set which logs will be shown
35
40
  */
@@ -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(
@@ -119,7 +119,7 @@ import { DyNTS_global_settings } from '../../../_collections/global-settings.con
119
119
  */
120
120
  export abstract class DyNTS_AppExtended extends DyNTS_App {
121
121
 
122
- private systemControlsExt: DyNTS_AppExtSysControls = new DyNTS_AppExtSysControls();
122
+ private readonly systemControlsExt: DyNTS_AppExtSysControls = new DyNTS_AppExtSysControls();
123
123
  override get started(): boolean { return this.systemControlsExt.appExtended.started; }
124
124
  private httpsSocketSettingUpCount: number = 0;
125
125
  private httpSocketSettingUpCount: number = 0;
@@ -138,12 +138,12 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
138
138
  * ];
139
139
  */
140
140
  protected socketServices: DyNTS_SocketServerService<any>[];
141
- private allSocketServers: SocketIO.Server[] = [];
141
+ private readonly allSocketServers: SocketIO.Server[] = [];
142
142
 
143
143
  constructor(){
144
- super(true);
144
+ super(/* true */);
145
145
 
146
- this.asyncConstructExt().catch((error: DyFM_AnyError): void => {
146
+ /* this.asyncConstructExt().catch((error: DyFM_AnyError): void => {
147
147
  if (
148
148
  DyNTS_global_settings.log_settings.highDetailedLogs ||
149
149
  !(error instanceof DyFM_Error)
@@ -159,13 +159,15 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
159
159
  `(DyNTS_AppExtended constructor catch)`
160
160
  );
161
161
  }
162
- });
162
+ }); */
163
163
  }
164
164
 
165
- private async asyncConstructExt(): Promise<void> {
165
+ protected override async asyncConstruct(extended = true): Promise<void> {
166
166
  if (this.fnLogs && this.deepLog) console.log('\nfn:. asyncConstruct-extended');
167
167
 
168
168
  try {
169
+ await super.asyncConstruct(true);
170
+
169
171
  this.systemControlsExt.appExtended.init = true;
170
172
 
171
173
  this.socketServices = this.getSocketServices();
@@ -194,7 +196,7 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
194
196
  DyFM_Log.H_success(`"${this.params.name}" started successfully.`);
195
197
 
196
198
  } catch (error) {
197
- if (
199
+ /* if (
198
200
  DyNTS_global_settings.log_settings.highDetailedLogs ||
199
201
  !(error instanceof DyFM_Error)
200
202
  ) {
@@ -206,7 +208,7 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
206
208
  error.logSimple(
207
209
  `Extended Application: "${this.params?.name}" start failed. (asyncConstructExt catch)`
208
210
  );
209
- }
211
+ } */
210
212
 
211
213
  throw new DyFM_Error({
212
214
  errorCode: 'NTS-AES-001',
@@ -678,13 +678,13 @@ export abstract class DyNTS_SocketServerService<
678
678
  if (DyNTS_global_settings.log_settings.socket_eventContent) {
679
679
  DyFM_Log.success(
680
680
  ` <--= emitted socket(${this.params.name}) event: "${event}", ` +
681
- `\n presenceId: "${id}", sockets: ${presence.sockets.length}` +
682
- `\n content:`, content
681
+ `\n presenceId: "${id}", sockets: ${presence.sockets.length}` +
682
+ `\n content:`, content
683
683
  );
684
684
  } else {
685
685
  DyFM_Log.success(
686
686
  ` <--= emitted socket(${this.params.name}) event: "${event}", ` +
687
- `\n presenceId: ${id}, sockets: ${presence.sockets.length}`
687
+ `\n presenceId: ${id}, sockets: ${presence.sockets.length}`
688
688
  );
689
689
  }
690
690
  } catch (error) {
@@ -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
+ }