@futdevpro/nts-dynamo 1.9.50 → 1.10.2

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 (165) hide show
  1. package/.eslintrc.json +1 -0
  2. package/.github/workflows/main.yml +57 -3
  3. package/build/_collections/archive.util.spec.d.ts +2 -0
  4. package/build/_collections/archive.util.spec.d.ts.map +1 -0
  5. package/build/_collections/archive.util.spec.js +21 -0
  6. package/build/_collections/archive.util.spec.js.map +1 -0
  7. package/build/_models/control-models/api-call-params.control-model.spec.d.ts +2 -0
  8. package/build/_models/control-models/api-call-params.control-model.spec.d.ts.map +1 -0
  9. package/build/_models/control-models/api-call-params.control-model.spec.js +82 -0
  10. package/build/_models/control-models/api-call-params.control-model.spec.js.map +1 -0
  11. package/build/_models/control-models/app-params.control-model.spec.d.ts +2 -0
  12. package/build/_models/control-models/app-params.control-model.spec.d.ts.map +1 -0
  13. package/build/_models/control-models/app-params.control-model.spec.js +59 -0
  14. package/build/_models/control-models/app-params.control-model.spec.js.map +1 -0
  15. package/build/_models/control-models/app-system-controls.control-model.spec.d.ts +2 -0
  16. package/build/_models/control-models/app-system-controls.control-model.spec.d.ts.map +1 -0
  17. package/build/_models/control-models/app-system-controls.control-model.spec.js +26 -0
  18. package/build/_models/control-models/app-system-controls.control-model.spec.js.map +1 -0
  19. package/build/_models/control-models/endpoint-params.control-model.d.ts +1 -1
  20. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  21. package/build/_models/control-models/endpoint-params.control-model.js +3 -3
  22. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  23. package/build/_models/control-models/http-settings.control-model.spec.d.ts +2 -0
  24. package/build/_models/control-models/http-settings.control-model.spec.d.ts.map +1 -0
  25. package/build/_models/control-models/http-settings.control-model.spec.js +62 -0
  26. package/build/_models/control-models/http-settings.control-model.spec.js.map +1 -0
  27. package/build/_models/control-models/system-control.control-model.spec.d.ts +2 -0
  28. package/build/_models/control-models/system-control.control-model.spec.d.ts.map +1 -0
  29. package/build/_models/control-models/system-control.control-model.spec.js +24 -0
  30. package/build/_models/control-models/system-control.control-model.spec.js.map +1 -0
  31. package/build/_modules/custom-data/custom-data.controller.d.ts.map +1 -1
  32. package/build/_modules/custom-data/custom-data.controller.js +3 -3
  33. package/build/_modules/custom-data/custom-data.controller.js.map +1 -1
  34. package/build/_modules/custom-data/custom-data.data-service.d.ts +1 -1
  35. package/build/_modules/custom-data/custom-data.data-service.d.ts.map +1 -1
  36. package/build/_modules/custom-data/custom-data.data-service.js +3 -3
  37. package/build/_modules/custom-data/custom-data.data-service.js.map +1 -1
  38. package/build/_modules/mock/app-params.mock.spec.d.ts +2 -0
  39. package/build/_modules/mock/app-params.mock.spec.d.ts.map +1 -0
  40. package/build/_modules/mock/app-params.mock.spec.js +19 -0
  41. package/build/_modules/mock/app-params.mock.spec.js.map +1 -0
  42. package/build/_modules/mock/auth-service.mock.spec.d.ts +2 -0
  43. package/build/_modules/mock/auth-service.mock.spec.d.ts.map +1 -0
  44. package/build/_modules/mock/auth-service.mock.spec.js +40 -0
  45. package/build/_modules/mock/auth-service.mock.spec.js.map +1 -0
  46. package/build/_modules/mock/controller.mock.spec.d.ts +2 -0
  47. package/build/_modules/mock/controller.mock.spec.d.ts.map +1 -0
  48. package/build/_modules/mock/controller.mock.spec.js +23 -0
  49. package/build/_modules/mock/controller.mock.spec.js.map +1 -0
  50. package/build/_modules/mock/data-model.mock.spec.d.ts +2 -0
  51. package/build/_modules/mock/data-model.mock.spec.d.ts.map +1 -0
  52. package/build/_modules/mock/data-model.mock.spec.js +99 -0
  53. package/build/_modules/mock/data-model.mock.spec.js.map +1 -0
  54. package/build/_modules/mock/email-service-collection.mock.spec.d.ts +2 -0
  55. package/build/_modules/mock/email-service-collection.mock.spec.d.ts.map +1 -0
  56. package/build/_modules/mock/email-service-collection.mock.spec.js +21 -0
  57. package/build/_modules/mock/email-service-collection.mock.spec.js.map +1 -0
  58. package/build/_modules/mock/email-service.mock.spec.d.ts +2 -0
  59. package/build/_modules/mock/email-service.mock.spec.d.ts.map +1 -0
  60. package/build/_modules/mock/email-service.mock.spec.js +14 -0
  61. package/build/_modules/mock/email-service.mock.spec.js.map +1 -0
  62. package/build/_modules/mock/socket-client.mock.js +2 -2
  63. package/build/_modules/mock/socket-client.mock.spec.d.ts +2 -0
  64. package/build/_modules/mock/socket-client.mock.spec.d.ts.map +1 -0
  65. package/build/_modules/mock/socket-client.mock.spec.js +32 -0
  66. package/build/_modules/mock/socket-client.mock.spec.js.map +1 -0
  67. package/build/_modules/mock/socket-server.mock.spec.d.ts +2 -0
  68. package/build/_modules/mock/socket-server.mock.spec.d.ts.map +1 -0
  69. package/build/_modules/mock/socket-server.mock.spec.js +36 -0
  70. package/build/_modules/mock/socket-server.mock.spec.js.map +1 -0
  71. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.d.ts +2 -0
  72. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.d.ts.map +1 -0
  73. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.js +22 -0
  74. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.js.map +1 -0
  75. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.d.ts +2 -0
  76. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.d.ts.map +1 -0
  77. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.js +29 -0
  78. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.js.map +1 -0
  79. package/build/_modules/socket/_services/socket-server.service.js +1 -1
  80. package/build/_modules/socket/_services/socket-server.service.js.map +1 -1
  81. package/build/_modules/usage/usage.controller.d.ts.map +1 -1
  82. package/build/_modules/usage/usage.controller.js +6 -4
  83. package/build/_modules/usage/usage.controller.js.map +1 -1
  84. package/build/_modules/usage/usage.data-service.d.ts +4 -4
  85. package/build/_modules/usage/usage.data-service.d.ts.map +1 -1
  86. package/build/_modules/usage/usage.data-service.js +2 -2
  87. package/build/_modules/usage/usage.data-service.js.map +1 -1
  88. package/build/_services/base/data.service.d.ts +7 -5
  89. package/build/_services/base/data.service.d.ts.map +1 -1
  90. package/build/_services/base/data.service.js +153 -13
  91. package/build/_services/base/data.service.js.map +1 -1
  92. package/build/_services/base/db.service.d.ts +2 -1
  93. package/build/_services/base/db.service.d.ts.map +1 -1
  94. package/build/_services/base/db.service.js +49 -19
  95. package/build/_services/base/db.service.js.map +1 -1
  96. package/build/_services/base/singleton.service-base.d.ts.map +1 -1
  97. package/build/_services/base/singleton.service-base.js.map +1 -1
  98. package/build/_services/core/api.service.d.ts +1 -1
  99. package/build/_services/core/api.service.js +2 -2
  100. package/build/_services/core/api.service.spec.d.ts +2 -0
  101. package/build/_services/core/api.service.spec.d.ts.map +1 -0
  102. package/build/_services/core/api.service.spec.js +75 -0
  103. package/build/_services/core/api.service.spec.js.map +1 -0
  104. package/build/_services/core/email.service.d.ts +6 -6
  105. package/build/_services/core/email.service.d.ts.map +1 -1
  106. package/build/_services/core/email.service.js.map +1 -1
  107. package/build/_services/core/email.service.spec.d.ts +2 -0
  108. package/build/_services/core/email.service.spec.d.ts.map +1 -0
  109. package/build/_services/core/email.service.spec.js +77 -0
  110. package/build/_services/core/email.service.spec.js.map +1 -0
  111. package/build/_services/core/global.service.d.ts.map +1 -1
  112. package/build/_services/core/global.service.js +2 -1
  113. package/build/_services/core/global.service.js.map +1 -1
  114. package/build/_services/route/controller.service.d.ts +3 -3
  115. package/build/_services/route/controller.service.js +2 -2
  116. package/build/_services/route/controller.service.spec.d.ts +2 -0
  117. package/build/_services/route/controller.service.spec.d.ts.map +1 -0
  118. package/build/_services/route/controller.service.spec.js +48 -0
  119. package/build/_services/route/controller.service.spec.js.map +1 -0
  120. package/build/_services/route/routing-module.service.spec.d.ts +2 -0
  121. package/build/_services/route/routing-module.service.spec.d.ts.map +1 -0
  122. package/build/_services/route/routing-module.service.spec.js +65 -0
  123. package/build/_services/route/routing-module.service.spec.js.map +1 -0
  124. package/build/_services/server/app.server.d.ts +5 -5
  125. package/build/_services/server/app.server.d.ts.map +1 -1
  126. package/build/_services/server/app.server.js +9 -7
  127. package/build/_services/server/app.server.js.map +1 -1
  128. package/package.json +8 -8
  129. package/spec/support/jasmine.json +8 -0
  130. package/src/_collections/archive.util.spec.ts +22 -0
  131. package/src/_models/control-models/api-call-params.control-model.spec.ts +94 -0
  132. package/src/_models/control-models/app-params.control-model.spec.ts +69 -0
  133. package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -0
  134. package/src/_models/control-models/endpoint-params.control-model.ts +7 -6
  135. package/src/_models/control-models/http-settings.control-model.spec.ts +66 -0
  136. package/src/_models/control-models/system-control.control-model.spec.ts +27 -0
  137. package/src/_modules/custom-data/custom-data.controller.ts +6 -6
  138. package/src/_modules/custom-data/custom-data.data-service.ts +4 -3
  139. package/src/_modules/mock/app-params.mock.spec.ts +21 -0
  140. package/src/_modules/mock/auth-service.mock.spec.ts +47 -0
  141. package/src/_modules/mock/controller.mock.spec.ts +26 -0
  142. package/src/_modules/mock/data-model.mock.spec.ts +109 -0
  143. package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -0
  144. package/src/_modules/mock/email-service.mock.spec.ts +17 -0
  145. package/src/_modules/mock/socket-client.mock.spec.ts +40 -0
  146. package/src/_modules/mock/socket-client.mock.ts +4 -4
  147. package/src/_modules/mock/socket-server.mock.spec.ts +44 -0
  148. package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +30 -0
  149. package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +33 -0
  150. package/src/_modules/socket/_services/socket-server.service.ts +1 -1
  151. package/src/_modules/test/get-test-routing-module.util.ts +2 -2
  152. package/src/_modules/usage/usage.controller.ts +10 -8
  153. package/src/_modules/usage/usage.data-service.ts +10 -7
  154. package/src/_services/base/data.service.ts +235 -17
  155. package/src/_services/base/db.service.ts +50 -12
  156. package/src/_services/base/singleton.service-base.ts +0 -2
  157. package/src/_services/core/api.service.spec.ts +96 -0
  158. package/src/_services/core/api.service.ts +2 -2
  159. package/src/_services/core/email.service.spec.ts +93 -0
  160. package/src/_services/core/email.service.ts +9 -11
  161. package/src/_services/core/global.service.ts +3 -2
  162. package/src/_services/route/controller.service.spec.ts +52 -0
  163. package/src/_services/route/controller.service.ts +3 -3
  164. package/src/_services/route/routing-module.service.spec.ts +81 -0
  165. package/src/_services/server/app.server.ts +26 -24
@@ -0,0 +1,33 @@
1
+
2
+ import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
3
+ import { DyNTS_SocketSecurity } from '../_enums/socket-security.enum';
4
+ import { DyNTS_SocketServerService_Params } from './socket-server-service-params.control-model';
5
+
6
+ describe('DyNTS_SocketServerService_Params', () => {
7
+ it('should create an instance with provided values', () => {
8
+ const params = {
9
+ name: 'TestSocket',
10
+ port: 8080,
11
+ security: DyNTS_SocketSecurity.secure,
12
+ };
13
+
14
+ const instance = new DyNTS_SocketServerService_Params(params);
15
+
16
+ expect(instance.name).toBe('TestSocket');
17
+ expect(instance.port).toBe(8080);
18
+ expect(instance.security).toBe(DyNTS_SocketSecurity.secure);
19
+ });
20
+
21
+ it('should use default security if not provided', () => {
22
+ const params = {
23
+ name: 'TestSocket',
24
+ port: 8080,
25
+ };
26
+
27
+ const instance = new DyNTS_SocketServerService_Params(params);
28
+
29
+ expect(instance.name).toBe('TestSocket');
30
+ expect(instance.port).toBe(8080);
31
+ expect(instance.security).toBe(DyNTS_global_settings.defaultSocketSecurity);
32
+ });
33
+ });
@@ -222,7 +222,7 @@ export abstract class DyNTS_SocketServerService<
222
222
  }));
223
223
  }
224
224
 
225
- this.subscriptionEvent.socketName = this.params.name;
225
+ this.subscriptionEvent.name = this.params.name;
226
226
  } else {
227
227
  DyFM_Log.error(
228
228
  'getPresenceFromSubscriptionEventContent is not set',
@@ -1,8 +1,8 @@
1
1
 
2
2
  import { DyFM_testModule_settings } from '@futdevpro/fsm-dynamo/test';
3
3
  import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
4
- import {
5
- DyNTS_RoutingModule_Settings
4
+ import {
5
+ DyNTS_RoutingModule_Settings
6
6
  } from '../../_models/interfaces/routing-module-settings.interface';
7
7
  import { DyNTS_RoutingModule } from '../../_services/route/routing-module.service';
8
8
  import { DyNTS_Test_Controller } from './test.controller';
@@ -2,17 +2,17 @@
2
2
  import { Request, Response } from 'express';
3
3
 
4
4
  import { DyFM_RelativeDate } from '@futdevpro/fsm-dynamo';
5
- import {
6
- DyFM_usageModule_settings, DyFM_UsageSession
5
+ import {
6
+ DyFM_usageModule_settings, DyFM_UsageSession
7
7
  } from '@futdevpro/fsm-dynamo/usage';
8
8
 
9
9
  import { DyNTS_HttpCallType } from '../../_enums/http/http-call-type.enum';
10
+ import {
11
+ DyNTS_Endpoint_Params
12
+ } from '../../_models/control-models/endpoint-params.control-model';
10
13
  import { DyNTS_AuthService } from '../../_services/core/auth.service';
11
- import { DyNTS_Controller } from '../../_services/route/controller.service';
12
14
  import { DyNTS_GlobalService } from '../../_services/core/global.service';
13
- import {
14
- DyNTS_Endpoint_Params
15
- } from '../../_models/control-models/endpoint-params.control-model';
15
+ import { DyNTS_Controller } from '../../_services/route/controller.service';
16
16
  import { DyNTS_Usage_DataService } from './usage.data-service';
17
17
 
18
18
  export class DyNTS_Usage_Controller extends DyNTS_Controller {
@@ -106,10 +106,12 @@ export class DyNTS_Usage_Controller extends DyNTS_Controller {
106
106
  endpoint: DyFM_usageModule_settings.endPoints.getUsageData,
107
107
  preProcesses: [ this.authService.authenticate_tokenPerm_accUsageData ],
108
108
  tasks: [
109
- async (req: Request, res: Response): Promise<void> => {
109
+ async (req: Request, res: Response, issuer: string): Promise<void> => {
110
110
  const range: DyFM_RelativeDate = req.params.range as DyFM_RelativeDate;
111
111
 
112
- const usageService = new DyNTS_Usage_DataService();
112
+ const usageService = new DyNTS_Usage_DataService({
113
+ issuer: issuer,
114
+ });
113
115
 
114
116
  await usageService.getUsage(range);
115
117
 
@@ -1,8 +1,11 @@
1
1
 
2
+ import { DyFM_Error, DyFM_RelativeDate, DyFM_Time } from '@futdevpro/fsm-dynamo';
3
+ import {
4
+ DyFM_DailyUsageData,
5
+ DyFM_UsageData,
6
+ DyFM_UsageSession, DyFM_usageSession_dataParams
7
+ } from '@futdevpro/fsm-dynamo/usage';
2
8
  import { Request } from 'express';
3
- import { DyFM_Error, DyFM_Time, DyFM_RelativeDate } from '@futdevpro/fsm-dynamo';
4
- import { DyFM_UsageSession, DyFM_usageSession_dataParams, DyFM_UsageData,
5
- DyFM_DailyUsageData } from '@futdevpro/fsm-dynamo/usage';
6
9
 
7
10
  import { DyNTS_DataService } from '../../_services/base/data.service';
8
11
  import { DyNTS_Shared } from '../../_services/shared.static-service';
@@ -12,18 +15,18 @@ export class DyNTS_Usage_DataService extends DyNTS_DataService<DyFM_UsageSession
12
15
  simplifiedDailyUsage: DyFM_DailyUsageData[] = [];
13
16
 
14
17
  constructor(
15
- set?: {
18
+ set: {
16
19
  usageSession?: DyFM_UsageSession,
17
20
  usageData?: DyFM_UsageData[],
18
- issuer?: string,
21
+ issuer: string,
19
22
  }
20
23
  ) {
21
24
  super(
22
25
  new DyFM_UsageSession(set?.usageSession),
23
26
  DyFM_usageSession_dataParams,
24
- set?.issuer
27
+ set.issuer
25
28
  );
26
- this.usageData = set?.usageData ? set?.usageData : [];
29
+ this.usageData = set?.usageData ?? [];
27
30
  }
28
31
 
29
32
  getLocationDataFromRequest(req: Request): void {
@@ -3,13 +3,18 @@ import {
3
3
  DyFM_AnyError,
4
4
  DyFM_Array,
5
5
  DyFM_Data_Params,
6
- DyFM_DataModel_Params, DyFM_DataProperty_Params,
6
+ DyFM_DataModel_Params,
7
+ DyFM_DataProperty_Params,
7
8
  DyFM_DBFilter,
9
+ DyFM_DBĐSort,
8
10
  DyFM_Error,
9
- DyFM_Error_Settings, DyFM_ErrorLevel,
11
+ DyFM_Error_Settings,
12
+ DyFM_ErrorLevel,
10
13
  DyFM_Log,
11
14
  DyFM_Metadata,
12
- DyFM_SearchQuery
15
+ DyFM_RangeValue,
16
+ DyFM_SearchQuery,
17
+ DyFM_SearchResult
13
18
  } from '@futdevpro/fsm-dynamo';
14
19
 
15
20
  import { DyNTS_getArchivedDBName } from '../../_collections/archive.util';
@@ -27,16 +32,16 @@ import { DyNTS_DBService } from './db.service';
27
32
  * @example
28
33
  * export class UserMatchStatisticsService extends DyNTS_DataService<UserMatchStatistics> {
29
34
  * constructor(
30
- * set?: {
35
+ * set: {
31
36
  * data?: UserMatchStatistics,
32
- * issuer?: string,
37
+ * issuer: string,
33
38
  * }
34
39
  * ) {
35
40
  * super(
36
41
  * new UserMatchStatistics(set?.data),
37
42
  * userMatchStatisticsModelParams
38
43
  * );
39
- * this.issuer = set?.issuer;
44
+ * this.issuer = set.issuer;
40
45
  * }
41
46
  * }
42
47
  */
@@ -1083,22 +1088,34 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1083
1088
  }
1084
1089
  }
1085
1090
 
1086
- async searchData(query?: DyFM_SearchQuery<T>): Promise<T[]> {
1091
+ async searchData(query?: DyFM_SearchQuery<T>): Promise<DyFM_SearchResult<T>> {
1087
1092
  try {
1088
- if (!query || Object.keys(query).length === 0) {
1089
- return await this.getAll();
1090
- }
1093
+ /* if (!query || Object.keys(query).length === 0) {
1094
+ console.log('T1');
1095
+ const allData: T[] = await this.getAll();
1096
+
1097
+ return {
1098
+ results: allData,
1099
+ totalItems: allData.length,
1100
+ };
1101
+ } */
1091
1102
 
1092
1103
  if (!query.filterBy) {
1093
1104
  query.filterBy = {};
1094
1105
  }
1095
1106
 
1096
- if (!query.page && !query.pageSize && !query.sortBy) {
1097
- return await this.dataDBService.find(query.filterBy);
1098
- }
1107
+ /* if (!query.page && !query.pageSize && !query.sortBy) {
1108
+ console.log('T2');
1109
+ const dataFindResult: T[] = await this.dataDBService.find(query.filterBy);
1110
+
1111
+ return {
1112
+ results: dataFindResult,
1113
+ totalItems: dataFindResult.length,
1114
+ };
1115
+ } */
1099
1116
 
1100
1117
  if (!query.page) {
1101
- query.page = 1;
1118
+ query.page = 0;
1102
1119
  }
1103
1120
 
1104
1121
  if (!query.pageSize) {
@@ -1106,16 +1123,43 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1106
1123
  query.pageSize = DyNTS_global_settings.defaultPageSize;
1107
1124
  }
1108
1125
 
1109
- if (!query.sortBy) {
1110
- query.sortBy = { __lastModified: -1 };
1126
+ if (!query.sortBy?.length) {
1127
+ query.sortBy = [{ key: '__lastModified', order: -1 }];
1111
1128
  }
1112
1129
 
1113
- return await this.dataDBService.findWithPaging(
1130
+ console.log('T3');
1131
+ /* const dataFindWithPagingResult: T[] = await this.dataDBService.findWithPaging(
1114
1132
  query.filterBy,
1115
1133
  query.page,
1116
1134
  query.pageSize,
1117
1135
  query.sortBy
1136
+ ); */
1137
+ query.sortBy.reverse();
1138
+
1139
+ let dataList: T[] = await this.getAll();
1140
+ const filterKeys = Object.keys(query.filterBy);
1141
+ const filterFunctionsByKey: { [key: string]: (dataProperty) => boolean } = {};
1142
+
1143
+ filterKeys.forEach((key: string): void => {
1144
+ filterFunctionsByKey[key] = this.getFilterFunctionForKey(
1145
+ key, query.filterBy[key]
1146
+ );
1147
+ });
1148
+
1149
+ query.sortBy.forEach((sort: DyFM_DBĐSort): void => {
1150
+ dataList.sort(this.getSortFunctionForKey(sort.key, sort.order));
1151
+ });
1152
+
1153
+ dataList = dataList.filter(
1154
+ (data: T): boolean => filterKeys.every(
1155
+ (key: string): boolean => filterFunctionsByKey[key](data[key])
1156
+ )
1118
1157
  );
1158
+
1159
+ return {
1160
+ results: dataList,
1161
+ totalItems: dataList.length,
1162
+ };
1119
1163
  } catch (error) {
1120
1164
  throw new DyFM_Error({
1121
1165
  ...this._getDefaultErrorSettings('searchData', error),
@@ -1125,6 +1169,180 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1125
1169
  }
1126
1170
  }
1127
1171
 
1172
+ private getFilterFunctionForKey<T>(
1173
+ key: string,
1174
+ searchValue: T | T[] | DyFM_RangeValue<T>,
1175
+ ): (dataProperty) => boolean {
1176
+ if (!this.dataParams.properties[key]) {
1177
+ throw new DyFM_Error({
1178
+ ...this._getDefaultErrorSettings(
1179
+ 'getFilterFunctionForKey',
1180
+ new Error(
1181
+ `getFilterFunctionForKey failed, key not found in dataParams ` +
1182
+ `(${this.dataParams.dataName})`
1183
+ )
1184
+ ),
1185
+
1186
+ errorCode: 'NTS-DS0-GFF1',
1187
+ });
1188
+ }
1189
+
1190
+ if (searchValue === undefined) {
1191
+ throw new DyFM_Error({
1192
+ ...this._getDefaultErrorSettings(
1193
+ 'getFilterFunctionForKey',
1194
+ new Error(
1195
+ `getFilterFunctionForKey failed, searchValue is missing! ` +
1196
+ `(${this.dataParams.dataName})`
1197
+ )
1198
+ ),
1199
+
1200
+ errorCode: 'NTS-DS0-GFF2',
1201
+ });
1202
+ }
1203
+
1204
+ switch (this.dataParams.properties[key].type) {
1205
+ case 'String':
1206
+ return (dataProperty): boolean => dataProperty.includes(searchValue);
1207
+
1208
+ case 'Date':
1209
+ if ((searchValue as DyFM_RangeValue).isRange) {
1210
+ const rangeAsNumber = new DyFM_RangeValue<number>(
1211
+ +new Date((searchValue as DyFM_RangeValue).from),
1212
+ +new Date((searchValue as DyFM_RangeValue).to)
1213
+ );
1214
+
1215
+ return (dataProperty): boolean => DyFM_RangeValue.isInRange(
1216
+ +new Date(dataProperty), rangeAsNumber
1217
+ );
1218
+ }
1219
+
1220
+ if (Array.isArray(searchValue)) {
1221
+ const searchValueAsDateArray = (searchValue as Date[]).map(
1222
+ (date: Date): Date => new Date(date)
1223
+ );
1224
+
1225
+ return (dataProperty): boolean => searchValueAsDateArray.includes(new Date(dataProperty));
1226
+ }
1227
+
1228
+ const searchValueAsDate: Date = new Date(searchValue as Date);
1229
+
1230
+ return (dataProperty): boolean => new Date(dataProperty) === searchValueAsDate;
1231
+
1232
+ case 'Number':
1233
+ if ((searchValue as DyFM_RangeValue).isRange) {
1234
+ return (dataProperty): boolean => DyFM_RangeValue.isInRange(
1235
+ dataProperty, searchValue as DyFM_RangeValue<number>
1236
+ );
1237
+ }
1238
+
1239
+ if (Array.isArray(searchValue)) {
1240
+ return (dataProperty): boolean => (searchValue as number[]).includes(dataProperty);
1241
+ }
1242
+
1243
+ return (dataProperty): boolean => dataProperty === searchValue;
1244
+
1245
+ case 'Boolean':
1246
+ return (dataProperty): boolean => dataProperty === searchValue;
1247
+
1248
+ default:
1249
+ if ((searchValue as DyFM_RangeValue).isRange) {
1250
+ throw new DyFM_Error({
1251
+ ...this._getDefaultErrorSettings(
1252
+ 'getFilterFunctionForKey',
1253
+ new Error(
1254
+ `getFilterFunctionForKey failed, range search not implemented for this type ` +
1255
+ `(${this.dataParams.dataName})`
1256
+ )
1257
+ ),
1258
+
1259
+ errorCode: 'NTS-DS0-GFF3',
1260
+ });
1261
+ }
1262
+
1263
+ if (Array.isArray(searchValue)) {
1264
+ return (dataProperty): boolean => (searchValue as number[]).includes(dataProperty);
1265
+ }
1266
+
1267
+ return (dataProperty): boolean => dataProperty === searchValue;
1268
+ }
1269
+ }
1270
+
1271
+ private getSortFunctionForKey<T>(
1272
+ key: string,
1273
+ sortDirection: 1 | -1 | 'asc' | 'desc' | 'ascending' | 'descending'
1274
+ ): (a: T, b: T) => number {
1275
+ if (!this.dataParams.properties[key]) {
1276
+ throw new DyFM_Error({
1277
+ ...this._getDefaultErrorSettings(
1278
+ 'getSortFunctionForKey',
1279
+ new Error(
1280
+ `getSortFunctionForKey failed, key not found in dataParams ` +
1281
+ `(${this.dataParams.dataName})`
1282
+ )
1283
+ ),
1284
+
1285
+ errorCode: 'NTS-DS0-GSF1',
1286
+ });
1287
+ }
1288
+
1289
+ const sortValue: 1 | -1 = (
1290
+ sortDirection === 1 || sortDirection === 'asc' || sortDirection === 'ascending'
1291
+ ) ? 1 : -1;
1292
+
1293
+ switch (this.dataParams.properties[key].type) {
1294
+ case 'String':
1295
+ return (a: T, b: T): number => (a as string).localeCompare(b as string) * sortValue;
1296
+
1297
+ case 'Date':
1298
+ return (a: T, b: T): number => {
1299
+ if (+new Date(a[key]) < +new Date(b[key])) {
1300
+ return -sortValue;
1301
+ } else if (+new Date(a[key]) > +new Date(b[key])) {
1302
+ return sortValue;
1303
+ } else {
1304
+ return 0;
1305
+ }
1306
+ };
1307
+
1308
+ case 'Number':
1309
+ return (a: T, b: T): number => {
1310
+ if (a[key] < b[key]) {
1311
+ return -sortValue;
1312
+ } else if (a[key] > b[key]) {
1313
+ return sortValue;
1314
+ } else {
1315
+ return 0;
1316
+ }
1317
+ };
1318
+
1319
+ case 'Boolean':
1320
+ return (a: T, b: T): number => {
1321
+ if (a[key] === b[key]) {
1322
+ return 0;
1323
+ }
1324
+
1325
+ if (a[key]) {
1326
+ return sortValue;
1327
+ }
1328
+
1329
+ return -sortValue;
1330
+ };
1331
+
1332
+ default:
1333
+ throw new DyFM_Error({
1334
+ ...this._getDefaultErrorSettings(
1335
+ 'getSortFunctionForKey',
1336
+ new Error(
1337
+ `getSortFunctionForKey failed, sorting not implemented for this type ` +
1338
+ `(${this.dataParams.dataName}, ${this.dataParams.properties[key].type})`
1339
+ )
1340
+ ),
1341
+
1342
+ errorCode: 'NTS-DS0-GSF2',
1343
+ });
1344
+ }
1345
+ }
1128
1346
 
1129
1347
  /**
1130
1348
  * setting up dependency dataHook by DynamoBEDataModelParams
@@ -104,7 +104,10 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
104
104
  throw new DyFM_Error({
105
105
  ...this._getDefaultErrorSettings('createData', error, issuer),
106
106
  errorCode: 'NTS-DBS-CD0',
107
- additionalContent: { data, dataModel },
107
+ additionalContent: {
108
+ data: data,
109
+ dataModel: this.dataModel,
110
+ },
108
111
  message:
109
112
  `createData failed, Create new "${this.dataParams.dbName}" was unsuccessful (NTS DB)`,
110
113
  issuer,
@@ -707,6 +710,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
707
710
  /**
708
711
  * #MONGOOSE FUNCTION
709
712
  * Find the data first by any of its parameters
713
+ * WARNING: This function will not gives you back the total number of data in the database!
710
714
  *
711
715
  * @param filterBy if you can, use unique parameters for find!
712
716
  *
@@ -743,9 +747,9 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
743
747
  pageSize: number,
744
748
  sort?: DyFM_DBSort<T>
745
749
  ): Promise<T[]> {
746
- if (filterBy['_deleted'] === undefined) {
750
+ /* if (filterBy['_deleted'] === undefined) {
747
751
  filterBy['_deleted'] = null;
748
- }
752
+ } */
749
753
 
750
754
  const dataList: T[] = await this.dataModel
751
755
  .find(filterBy)
@@ -1004,17 +1008,17 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1004
1008
  * @returns schema
1005
1009
  */
1006
1010
  private getSchema(): mongoose.Schema {
1007
- let schema: any = this.buildMongooseSchemaByModelParams();
1011
+ this.dataParams.properties = this.addMetadataToProperties(this.dataParams.properties);
1012
+
1013
+ let schema: any = this.buildMongooseSchemaByModelParams(this.dataParams.properties);
1008
1014
 
1009
- schema = this.addMetadataToSchema(schema);
1015
+ /* schema = this.addMetadataToSchema(schema); */
1010
1016
 
1011
1017
  if (this.dataParams.dataName.includes(DyNTS_archiveSuffix)) {
1012
1018
  schema = this.addArchiveMetadataToSchema(schema);
1013
1019
  }
1014
1020
 
1015
- // tslint:disable-next-line: no-string-literal
1016
1021
  if (schema['_id']) {
1017
- // tslint:disable-next-line: no-string-literal
1018
1022
  delete schema['_id'];
1019
1023
  }
1020
1024
 
@@ -1026,14 +1030,20 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1026
1030
  * @param properties DynamoBEDataPropertyParams
1027
1031
  * @returns mongoose schema object
1028
1032
  */
1029
- private buildMongooseSchemaByModelParams(properties?: DyFM_DataProperties<T>): any {
1033
+ private buildMongooseSchemaByModelParams(properties: DyFM_DataProperties<T>): any {
1030
1034
  const schemaSettingsObj = {};
1031
1035
 
1032
- if (!properties) {
1036
+ /* if (!properties) {
1033
1037
  properties = this.dataParams.properties;
1034
- }
1038
+ } */
1035
1039
 
1036
1040
  Object.values(properties).forEach((property: DyFM_DataProperty_Params<any>): void => {
1041
+ if (!property) {
1042
+ DyFM_Log.warn(`property is undefined on ${this.dataParams.dbName} (NTS DB)`);
1043
+
1044
+ return;
1045
+ }
1046
+
1037
1047
  const beType = this.getBEType(property.type);
1038
1048
 
1039
1049
  if (
@@ -1076,7 +1086,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1076
1086
 
1077
1087
  private getBEType(
1078
1088
  type: string
1079
- ): String | Number | Boolean | Object | Function | Array<any> | Date {
1089
+ ): string | number | boolean | object | Function | Array<any> | Date {
1080
1090
  switch (type.toLocaleLowerCase()) {
1081
1091
 
1082
1092
  case 'string':
@@ -1110,7 +1120,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1110
1120
  * @param schema schema to update
1111
1121
  * @returns updated schema
1112
1122
  */
1113
- private addMetadataToSchema(schema: any): any {
1123
+ /* private addMetadataToSchema(schema: any): any {
1114
1124
  schema.__created = { type: Date };
1115
1125
  schema.__createdBy = { type: String };
1116
1126
  schema.__lastModified = { type: Date };
@@ -1120,6 +1130,34 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1120
1130
  schema._deletedBy = { type: String };
1121
1131
 
1122
1132
  return schema;
1133
+ } */
1134
+
1135
+ private addMetadataToProperties(properties: DyFM_DataProperties<T>): DyFM_DataProperties<T> {
1136
+ if (!properties.__created) {
1137
+ properties.__created = { type: 'Date' };
1138
+ }
1139
+
1140
+ if (!properties.__createdBy) {
1141
+ properties.__createdBy = { type: 'String' };
1142
+ }
1143
+
1144
+ if (!properties.__lastModified) {
1145
+ properties.__lastModified = { type: 'Date' };
1146
+ }
1147
+
1148
+ if (!properties.__lastModifiedBy) {
1149
+ properties.__lastModifiedBy = { type: 'String' };
1150
+ }
1151
+
1152
+ if (!properties._deleted) {
1153
+ properties._deleted = { type: 'Date' };
1154
+ }
1155
+
1156
+ if (!properties._deletedBy) {
1157
+ properties._deletedBy = { type: 'String' };
1158
+ }
1159
+
1160
+ return properties;
1123
1161
  }
1124
1162
 
1125
1163
  private addArchiveMetadataToSchema(schema: any): any {
@@ -1,6 +1,4 @@
1
- import { DyFM_AnyError, DyFM_Error_Settings, DyFM_Error } from '@futdevpro/fsm-dynamo';
2
1
 
3
- import { DyNTS_global_settings } from '../../_collections/global-settings.const';
4
2
 
5
3
  /**
6
4
  *
@@ -0,0 +1,96 @@
1
+
2
+ import { DyNTS_ApiService, DyNTS_ApiCallInput_Params } from './api.service';
3
+ import { DyNTS_ApiCall_Params } from '../../_models/control-models/api-call-params.control-model';
4
+ import { DyNTS_HttpCallType } from '../../_enums/http/http-call-type.enum';
5
+ import { DyNTS_HttpResponseType } from '../../_enums/http/http-response-type.enum';
6
+ import { DyFM_Error } from '@futdevpro/fsm-dynamo';
7
+ import Axios from 'axios';
8
+
9
+ describe('DyNTS_ApiService', () => {
10
+ let callParams: DyNTS_ApiCall_Params;
11
+ let inputParams: DyNTS_ApiCallInput_Params;
12
+
13
+ beforeEach(() => {
14
+ callParams = {
15
+ baseUrl: 'http://example.com',
16
+ endPoint: '/api/test',
17
+ type: DyNTS_HttpCallType.get,
18
+ httpOptions: {
19
+ headers: {},
20
+ responseType: DyNTS_HttpResponseType.json,
21
+ },
22
+ name: 'Test API Call',
23
+ getFullResponse: false,
24
+ };
25
+
26
+ inputParams = {
27
+ pathParams: { id: '123' },
28
+ body: { key: 'value' },
29
+ };
30
+ });
31
+
32
+ it('should make a GET request successfully', async () => {
33
+ callParams.type = DyNTS_HttpCallType.get;
34
+ const response = { data: { success: true } };
35
+ spyOn(Axios, 'create').and.returnValue({
36
+ get: jasmine.createSpy().and.returnValue(Promise.resolve(response)),
37
+ } as any);
38
+
39
+ const result = await DyNTS_ApiService.startApiCall(callParams, inputParams);
40
+ expect(result).toEqual(response.data);
41
+ });
42
+
43
+ it('should handle a POST request successfully', async () => {
44
+ callParams.type = DyNTS_HttpCallType.post;
45
+ const response = { data: { success: true } };
46
+ spyOn(Axios, 'create').and.returnValue({
47
+ post: jasmine.createSpy().and.returnValue(Promise.resolve(response)),
48
+ } as any);
49
+
50
+ const result = await DyNTS_ApiService.startApiCall(callParams, inputParams);
51
+ expect(result).toEqual(response.data);
52
+ });
53
+
54
+ it('should throw an error for unsupported HTTP method', async () => {
55
+ callParams.type = 'unsupported' as DyNTS_HttpCallType;
56
+
57
+ await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
58
+ jasmine.any(DyFM_Error)
59
+ );
60
+ });
61
+
62
+ it('should handle error response with DYNAMO flag', async () => {
63
+ const errorResponse = {
64
+ response: { data: { flag: 'DYNAMO', message: 'Error' } },
65
+ };
66
+ spyOn(Axios, 'create').and.returnValue({
67
+ get: jasmine.createSpy().and.returnValue(Promise.reject(errorResponse)),
68
+ } as any);
69
+
70
+ await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
71
+ jasmine.any(DyFM_Error)
72
+ );
73
+ });
74
+
75
+ it('should handle DNS error', async () => {
76
+ const error = { code: 'ENOTFOUND' };
77
+ spyOn(Axios, 'create').and.returnValue({
78
+ get: jasmine.createSpy().and.returnValue(Promise.reject(error)),
79
+ } as any);
80
+
81
+ await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
82
+ jasmine.any(DyFM_Error)
83
+ );
84
+ });
85
+
86
+ it('should handle connection refused error', async () => {
87
+ const error = { code: 'ECONNREFUSED' };
88
+ spyOn(Axios, 'create').and.returnValue({
89
+ get: jasmine.createSpy().and.returnValue(Promise.reject(error)),
90
+ } as any);
91
+
92
+ await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
93
+ jasmine.any(DyFM_Error)
94
+ );
95
+ });
96
+ });