@futdevpro/nts-dynamo 1.9.45 → 1.10.1

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 (189) hide show
  1. package/.github/workflows/main.yml +57 -3
  2. package/build/_collections/archive.util.spec.d.ts +2 -0
  3. package/build/_collections/archive.util.spec.d.ts.map +1 -0
  4. package/build/_collections/archive.util.spec.js +21 -0
  5. package/build/_collections/archive.util.spec.js.map +1 -0
  6. package/build/_models/control-models/api-call-params.control-model.spec.d.ts +2 -0
  7. package/build/_models/control-models/api-call-params.control-model.spec.d.ts.map +1 -0
  8. package/build/_models/control-models/api-call-params.control-model.spec.js +82 -0
  9. package/build/_models/control-models/api-call-params.control-model.spec.js.map +1 -0
  10. package/build/_models/control-models/app-params.control-model.spec.d.ts +2 -0
  11. package/build/_models/control-models/app-params.control-model.spec.d.ts.map +1 -0
  12. package/build/_models/control-models/app-params.control-model.spec.js +59 -0
  13. package/build/_models/control-models/app-params.control-model.spec.js.map +1 -0
  14. package/build/_models/control-models/app-system-controls.control-model.spec.d.ts +2 -0
  15. package/build/_models/control-models/app-system-controls.control-model.spec.d.ts.map +1 -0
  16. package/build/_models/control-models/app-system-controls.control-model.spec.js +26 -0
  17. package/build/_models/control-models/app-system-controls.control-model.spec.js.map +1 -0
  18. package/build/_models/control-models/endpoint-params.control-model.d.ts +1 -1
  19. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  20. package/build/_models/control-models/endpoint-params.control-model.js +3 -3
  21. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  22. package/build/_models/control-models/http-settings.control-model.spec.d.ts +2 -0
  23. package/build/_models/control-models/http-settings.control-model.spec.d.ts.map +1 -0
  24. package/build/_models/control-models/http-settings.control-model.spec.js +62 -0
  25. package/build/_models/control-models/http-settings.control-model.spec.js.map +1 -0
  26. package/build/_models/control-models/system-control.control-model.spec.d.ts +2 -0
  27. package/build/_models/control-models/system-control.control-model.spec.d.ts.map +1 -0
  28. package/build/_models/control-models/system-control.control-model.spec.js +24 -0
  29. package/build/_models/control-models/system-control.control-model.spec.js.map +1 -0
  30. package/build/_models/interfaces/global-service-settings.interface.d.ts +3 -3
  31. package/build/_models/interfaces/global-service-settings.interface.d.ts.map +1 -1
  32. package/build/_modules/custom-data/custom-data.controller.d.ts.map +1 -1
  33. package/build/_modules/custom-data/custom-data.controller.js +3 -3
  34. package/build/_modules/custom-data/custom-data.controller.js.map +1 -1
  35. package/build/_modules/custom-data/custom-data.data-service.d.ts +1 -1
  36. package/build/_modules/custom-data/custom-data.data-service.d.ts.map +1 -1
  37. package/build/_modules/custom-data/custom-data.data-service.js +3 -3
  38. package/build/_modules/custom-data/custom-data.data-service.js.map +1 -1
  39. package/build/_modules/mock/app-params.mock.spec.d.ts +2 -0
  40. package/build/_modules/mock/app-params.mock.spec.d.ts.map +1 -0
  41. package/build/_modules/mock/app-params.mock.spec.js +19 -0
  42. package/build/_modules/mock/app-params.mock.spec.js.map +1 -0
  43. package/build/_modules/mock/auth-service.mock.spec.d.ts +2 -0
  44. package/build/_modules/mock/auth-service.mock.spec.d.ts.map +1 -0
  45. package/build/_modules/mock/auth-service.mock.spec.js +40 -0
  46. package/build/_modules/mock/auth-service.mock.spec.js.map +1 -0
  47. package/build/_modules/mock/controller.mock.spec.d.ts +2 -0
  48. package/build/_modules/mock/controller.mock.spec.d.ts.map +1 -0
  49. package/build/_modules/mock/controller.mock.spec.js +23 -0
  50. package/build/_modules/mock/controller.mock.spec.js.map +1 -0
  51. package/build/_modules/mock/data-model.mock.d.ts +2 -2
  52. package/build/_modules/mock/data-model.mock.d.ts.map +1 -1
  53. package/build/_modules/mock/data-model.mock.js +21 -21
  54. package/build/_modules/mock/data-model.mock.js.map +1 -1
  55. package/build/_modules/mock/data-model.mock.spec.d.ts +2 -0
  56. package/build/_modules/mock/data-model.mock.spec.d.ts.map +1 -0
  57. package/build/_modules/mock/data-model.mock.spec.js +99 -0
  58. package/build/_modules/mock/data-model.mock.spec.js.map +1 -0
  59. package/build/_modules/mock/email-service-collection.mock.spec.d.ts +2 -0
  60. package/build/_modules/mock/email-service-collection.mock.spec.d.ts.map +1 -0
  61. package/build/_modules/mock/email-service-collection.mock.spec.js +21 -0
  62. package/build/_modules/mock/email-service-collection.mock.spec.js.map +1 -0
  63. package/build/_modules/mock/email-service.mock.spec.d.ts +2 -0
  64. package/build/_modules/mock/email-service.mock.spec.d.ts.map +1 -0
  65. package/build/_modules/mock/email-service.mock.spec.js +14 -0
  66. package/build/_modules/mock/email-service.mock.spec.js.map +1 -0
  67. package/build/_modules/mock/socket-client.mock.js +2 -2
  68. package/build/_modules/mock/socket-client.mock.spec.d.ts +2 -0
  69. package/build/_modules/mock/socket-client.mock.spec.d.ts.map +1 -0
  70. package/build/_modules/mock/socket-client.mock.spec.js +32 -0
  71. package/build/_modules/mock/socket-client.mock.spec.js.map +1 -0
  72. package/build/_modules/mock/socket-server.mock.d.ts +1 -1
  73. package/build/_modules/mock/socket-server.mock.d.ts.map +1 -1
  74. package/build/_modules/mock/socket-server.mock.spec.d.ts +2 -0
  75. package/build/_modules/mock/socket-server.mock.spec.d.ts.map +1 -0
  76. package/build/_modules/mock/socket-server.mock.spec.js +36 -0
  77. package/build/_modules/mock/socket-server.mock.spec.js.map +1 -0
  78. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.d.ts +2 -0
  79. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.d.ts.map +1 -0
  80. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.js +22 -0
  81. package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.js.map +1 -0
  82. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.d.ts +2 -0
  83. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.d.ts.map +1 -0
  84. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.js +29 -0
  85. package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.js.map +1 -0
  86. package/build/_modules/socket/_services/socket-server.service.d.ts +1 -1
  87. package/build/_modules/socket/_services/socket-server.service.d.ts.map +1 -1
  88. package/build/_modules/socket/_services/socket-server.service.js +1 -1
  89. package/build/_modules/socket/_services/socket-server.service.js.map +1 -1
  90. package/build/_modules/socket/_services/socket-server.service.spec.js +1 -1
  91. package/build/_modules/socket/_services/socket-server.service.spec.js.map +1 -1
  92. package/build/_modules/usage/usage.controller.d.ts.map +1 -1
  93. package/build/_modules/usage/usage.controller.js +6 -4
  94. package/build/_modules/usage/usage.controller.js.map +1 -1
  95. package/build/_modules/usage/usage.data-service.d.ts +4 -4
  96. package/build/_modules/usage/usage.data-service.d.ts.map +1 -1
  97. package/build/_modules/usage/usage.data-service.js +2 -2
  98. package/build/_modules/usage/usage.data-service.js.map +1 -1
  99. package/build/_services/base/archive-data.service.d.ts +1 -1
  100. package/build/_services/base/archive-data.service.d.ts.map +1 -1
  101. package/build/_services/base/archive-data.service.js.map +1 -1
  102. package/build/_services/base/data.service.d.ts +7 -7
  103. package/build/_services/base/data.service.d.ts.map +1 -1
  104. package/build/_services/base/data.service.js +22 -9
  105. package/build/_services/base/data.service.js.map +1 -1
  106. package/build/_services/base/db.service.d.ts +3 -3
  107. package/build/_services/base/db.service.d.ts.map +1 -1
  108. package/build/_services/base/db.service.js +23 -14
  109. package/build/_services/base/db.service.js.map +1 -1
  110. package/build/_services/base/singleton.service-base.d.ts.map +1 -1
  111. package/build/_services/base/singleton.service-base.js.map +1 -1
  112. package/build/_services/core/api.service.d.ts +1 -1
  113. package/build/_services/core/api.service.d.ts.map +1 -1
  114. package/build/_services/core/api.service.js +5 -5
  115. package/build/_services/core/api.service.js.map +1 -1
  116. package/build/_services/core/api.service.spec.d.ts +2 -0
  117. package/build/_services/core/api.service.spec.d.ts.map +1 -0
  118. package/build/_services/core/api.service.spec.js +75 -0
  119. package/build/_services/core/api.service.spec.js.map +1 -0
  120. package/build/_services/core/email.service.d.ts +6 -6
  121. package/build/_services/core/email.service.d.ts.map +1 -1
  122. package/build/_services/core/email.service.js.map +1 -1
  123. package/build/_services/core/email.service.spec.d.ts +2 -0
  124. package/build/_services/core/email.service.spec.d.ts.map +1 -0
  125. package/build/_services/core/email.service.spec.js +77 -0
  126. package/build/_services/core/email.service.spec.js.map +1 -0
  127. package/build/_services/core/global.service.d.ts +2 -2
  128. package/build/_services/core/global.service.d.ts.map +1 -1
  129. package/build/_services/core/global.service.js +3 -2
  130. package/build/_services/core/global.service.js.map +1 -1
  131. package/build/_services/route/controller.service.d.ts +3 -3
  132. package/build/_services/route/controller.service.d.ts.map +1 -1
  133. package/build/_services/route/controller.service.js +2 -2
  134. package/build/_services/route/controller.service.js.map +1 -1
  135. package/build/_services/route/controller.service.spec.d.ts +2 -0
  136. package/build/_services/route/controller.service.spec.d.ts.map +1 -0
  137. package/build/_services/route/controller.service.spec.js +48 -0
  138. package/build/_services/route/controller.service.spec.js.map +1 -0
  139. package/build/_services/route/routing-module.service.spec.d.ts +2 -0
  140. package/build/_services/route/routing-module.service.spec.d.ts.map +1 -0
  141. package/build/_services/route/routing-module.service.spec.js +65 -0
  142. package/build/_services/route/routing-module.service.spec.js.map +1 -0
  143. package/build/_services/server/app.server.d.ts +5 -5
  144. package/build/_services/server/app.server.d.ts.map +1 -1
  145. package/build/_services/server/app.server.js +9 -7
  146. package/build/_services/server/app.server.js.map +1 -1
  147. package/package.json +8 -8
  148. package/spec/support/jasmine.json +8 -0
  149. package/src/_collections/archive.util.spec.ts +22 -0
  150. package/src/_models/control-models/api-call-params.control-model.spec.ts +94 -0
  151. package/src/_models/control-models/app-params.control-model.spec.ts +69 -0
  152. package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -0
  153. package/src/_models/control-models/endpoint-params.control-model.ts +7 -6
  154. package/src/_models/control-models/http-settings.control-model.spec.ts +66 -0
  155. package/src/_models/control-models/system-control.control-model.spec.ts +27 -0
  156. package/src/_models/interfaces/global-service-settings.interface.ts +3 -3
  157. package/src/_modules/custom-data/custom-data.controller.ts +6 -6
  158. package/src/_modules/custom-data/custom-data.data-service.ts +4 -3
  159. package/src/_modules/mock/app-params.mock.spec.ts +21 -0
  160. package/src/_modules/mock/auth-service.mock.spec.ts +47 -0
  161. package/src/_modules/mock/controller.mock.spec.ts +26 -0
  162. package/src/_modules/mock/data-model.mock.spec.ts +109 -0
  163. package/src/_modules/mock/data-model.mock.ts +23 -23
  164. package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -0
  165. package/src/_modules/mock/email-service.mock.spec.ts +17 -0
  166. package/src/_modules/mock/socket-client.mock.spec.ts +40 -0
  167. package/src/_modules/mock/socket-client.mock.ts +4 -4
  168. package/src/_modules/mock/socket-server.mock.spec.ts +44 -0
  169. package/src/_modules/mock/socket-server.mock.ts +5 -5
  170. package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +30 -0
  171. package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +33 -0
  172. package/src/_modules/socket/_services/socket-server.service.spec.ts +1 -1
  173. package/src/_modules/socket/_services/socket-server.service.ts +2 -2
  174. package/src/_modules/test/get-test-routing-module.util.ts +2 -2
  175. package/src/_modules/usage/usage.controller.ts +10 -8
  176. package/src/_modules/usage/usage.data-service.ts +10 -7
  177. package/src/_services/base/archive-data.service.ts +2 -2
  178. package/src/_services/base/data.service.ts +100 -76
  179. package/src/_services/base/db.service.ts +77 -55
  180. package/src/_services/base/singleton.service-base.ts +0 -2
  181. package/src/_services/core/api.service.spec.ts +96 -0
  182. package/src/_services/core/api.service.ts +7 -7
  183. package/src/_services/core/email.service.spec.ts +93 -0
  184. package/src/_services/core/email.service.ts +9 -11
  185. package/src/_services/core/global.service.ts +19 -16
  186. package/src/_services/route/controller.service.spec.ts +52 -0
  187. package/src/_services/route/controller.service.ts +5 -6
  188. package/src/_services/route/routing-module.service.spec.ts +81 -0
  189. package/src/_services/server/app.server.ts +26 -24
@@ -2,13 +2,17 @@
2
2
  import {
3
3
  DyFM_AnyError,
4
4
  DyFM_Array,
5
- DyFM_DataModel_Params, DyFM_DataProperty_Params,
5
+ DyFM_Data_Params,
6
+ DyFM_DataModel_Params,
7
+ DyFM_DataProperty_Params,
6
8
  DyFM_DBFilter,
7
9
  DyFM_Error,
8
- DyFM_Error_Settings, DyFM_ErrorLevel,
10
+ DyFM_Error_Settings,
11
+ DyFM_ErrorLevel,
9
12
  DyFM_Log,
10
13
  DyFM_Metadata,
11
- DyFM_SearchQuery
14
+ DyFM_SearchQuery,
15
+ DyFM_SearchResult
12
16
  } from '@futdevpro/fsm-dynamo';
13
17
 
14
18
  import { DyNTS_getArchivedDBName } from '../../_collections/archive.util';
@@ -26,16 +30,16 @@ import { DyNTS_DBService } from './db.service';
26
30
  * @example
27
31
  * export class UserMatchStatisticsService extends DyNTS_DataService<UserMatchStatistics> {
28
32
  * constructor(
29
- * set?: {
33
+ * set: {
30
34
  * data?: UserMatchStatistics,
31
- * issuer?: string,
35
+ * issuer: string,
32
36
  * }
33
37
  * ) {
34
38
  * super(
35
39
  * new UserMatchStatistics(set?.data),
36
40
  * userMatchStatisticsModelParams
37
41
  * );
38
- * this.issuer = set?.issuer;
42
+ * this.issuer = set.issuer;
39
43
  * }
40
44
  * }
41
45
  */
@@ -56,7 +60,7 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
56
60
  depKeyIsRequired?: boolean;
57
61
  private depDataDBService: DyNTS_DBService<any>;
58
62
 
59
- dataParams: DyFM_DataModel_Params;
63
+ dataParams: DyFM_DataModel_Params<T>;
60
64
 
61
65
  readonly defaultErrorUserMsg: string =
62
66
  `We encountered an unhandled Data Service Error, ` +
@@ -73,7 +77,8 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
73
77
  /**
74
78
  * DB data prams will be used to connect to usable dbService on GlobalService
75
79
  */
76
- dataParams: DyFM_DataModel_Params,
80
+ /* dataParams: DyFM_DataModel_Params, */
81
+ dataParams: DyFM_Data_Params<T>,
77
82
  /**
78
83
  * Initial set for issuer to be able to follow the issuer's activity
79
84
  */
@@ -1005,66 +1010,68 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1005
1010
  try {
1006
1011
  data = this.ensureData(data);
1007
1012
 
1008
- for (const element of this.dataParams.properties) {
1009
- // basic required validations
1010
- if (
1011
- (
1012
- element.required ||
1013
- element.index
1014
- ) && (
1015
- data[element.key] === null ||
1016
- data[element.key] === undefined
1017
- )
1018
- ) {
1019
- throw new DyFM_Error({
1020
- ...this._getDefaultErrorSettings(
1021
- 'validateForSave',
1022
- new Error(
1023
- `validateForSave failed, "${element.key}" is missing! ` +
1024
- `(${this.dataParams.dataName})`
1025
- )
1026
- ),
1027
-
1028
- status: 522,
1029
- errorCode: 'NTS-DS0-VD1',
1030
- userMessage: this.defaultValidationErrorUserMsg,
1031
- additionalContent: {
1032
- data: data,
1033
- },
1034
- });
1035
- }
1036
-
1037
- // specific Date validation
1038
- if (element.type === 'Date' &&
1039
- !(new Date(data[element.key]) instanceof Date)
1040
- ) {
1041
- throw new DyFM_Error({
1042
- ...this._getDefaultErrorSettings(
1043
- 'validateForSave',
1044
- new Error(
1045
- `validateForSave failed, "${element.key}" is not a date! ` +
1046
- `(${this.dataParams.dataName})`
1047
- )
1048
- ),
1013
+ Object.values(this.dataParams.properties).forEach(
1014
+ (element: DyFM_DataProperty_Params<any>) => {
1015
+ // basic required validations
1016
+ if (
1017
+ (
1018
+ element.required ||
1019
+ element.index
1020
+ ) && (
1021
+ data[element.key] === null ||
1022
+ data[element.key] === undefined
1023
+ )
1024
+ ) {
1025
+ throw new DyFM_Error({
1026
+ ...this._getDefaultErrorSettings(
1027
+ 'validateForSave',
1028
+ new Error(
1029
+ `validateForSave failed, "${element.key}" is missing! ` +
1030
+ `(${this.dataParams.dataName})`
1031
+ )
1032
+ ),
1033
+
1034
+ status: 522,
1035
+ errorCode: 'NTS-DS0-VD1',
1036
+ userMessage: this.defaultValidationErrorUserMsg,
1037
+ additionalContent: {
1038
+ data: data,
1039
+ },
1040
+ });
1041
+ }
1049
1042
 
1050
- status: 522,
1051
- errorCode: 'NTS-DS0-VD2',
1052
- userMessage: this.defaultValidationErrorUserMsg,
1053
- additionalContent: {
1054
- data: data,
1055
- },
1056
- });
1057
- }
1043
+ // specific Date validation
1044
+ if (element.type === 'Date' &&
1045
+ !(new Date(data[element.key]) instanceof Date)
1046
+ ) {
1047
+ throw new DyFM_Error({
1048
+ ...this._getDefaultErrorSettings(
1049
+ 'validateForSave',
1050
+ new Error(
1051
+ `validateForSave failed, "${element.key}" is not a date! ` +
1052
+ `(${this.dataParams.dataName})`
1053
+ )
1054
+ ),
1055
+
1056
+ status: 522,
1057
+ errorCode: 'NTS-DS0-VD2',
1058
+ userMessage: this.defaultValidationErrorUserMsg,
1059
+ additionalContent: {
1060
+ data: data,
1061
+ },
1062
+ });
1063
+ }
1058
1064
 
1059
- // call additional validators
1060
- if (element.additionalValidators) {
1061
- for (let j = 0; j < element.additionalValidators.length; j++) {
1062
- element.additionalValidators[j](
1063
- data[element.key]
1064
- );
1065
+ // call additional validators
1066
+ if (element.additionalValidators) {
1067
+ for (let j = 0; j < element.additionalValidators.length; j++) {
1068
+ element.additionalValidators[j](
1069
+ data[element.key]
1070
+ );
1071
+ }
1065
1072
  }
1066
1073
  }
1067
- }
1074
+ );
1068
1075
  } catch (error) {
1069
1076
  if ([ 'NTS-DS0-VD1', 'NTS-DS0-VD2' ].includes(error?.errorCode)) {
1070
1077
  throw error;
@@ -1079,10 +1086,15 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1079
1086
  }
1080
1087
  }
1081
1088
 
1082
- async searchData(query?: DyFM_SearchQuery<T>): Promise<T[]> {
1089
+ async searchData(query?: DyFM_SearchQuery<T>): Promise<DyFM_SearchResult<T>> {
1083
1090
  try {
1084
1091
  if (!query || Object.keys(query).length === 0) {
1085
- return await this.getAll();
1092
+ const allData: T[] = await this.getAll();
1093
+
1094
+ return {
1095
+ results: allData,
1096
+ total: allData.length,
1097
+ };
1086
1098
  }
1087
1099
 
1088
1100
  if (!query.filterBy) {
@@ -1090,7 +1102,12 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1090
1102
  }
1091
1103
 
1092
1104
  if (!query.page && !query.pageSize && !query.sortBy) {
1093
- return await this.dataDBService.find(query.filterBy);
1105
+ const dataFindResult: T[] = await this.dataDBService.find(query.filterBy);
1106
+
1107
+ return {
1108
+ results: dataFindResult,
1109
+ total: dataFindResult.length,
1110
+ };
1094
1111
  }
1095
1112
 
1096
1113
  if (!query.page) {
@@ -1106,12 +1123,18 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1106
1123
  query.sortBy = { __lastModified: -1 };
1107
1124
  }
1108
1125
 
1109
- return await this.dataDBService.findWithPaging(
1110
- query.filterBy,
1111
- query.page,
1112
- query.pageSize,
1113
- query.sortBy
1114
- );
1126
+ const dataFindWithPagingResult: T[] =
1127
+ await this.dataDBService.findWithPaging(
1128
+ query.filterBy,
1129
+ query.page,
1130
+ query.pageSize,
1131
+ query.sortBy
1132
+ );
1133
+
1134
+ return {
1135
+ results: dataFindWithPagingResult,
1136
+ total: dataFindWithPagingResult.length,
1137
+ };
1115
1138
  } catch (error) {
1116
1139
  throw new DyFM_Error({
1117
1140
  ...this._getDefaultErrorSettings('searchData', error),
@@ -1126,9 +1149,10 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
1126
1149
  * setting up dependency dataHook by DynamoBEDataModelParams
1127
1150
  */
1128
1151
  private lookForDependencyDataSettings(): void {
1129
- const dependencyParam: DyFM_DataProperty_Params = this.dataParams.properties.find(
1130
- (modelParams: DyFM_DataProperty_Params): boolean => modelParams.isDependencyHook
1131
- );
1152
+ const dependencyParam: DyFM_DataProperty_Params<any> =
1153
+ Object.values(this.dataParams.properties).find(
1154
+ (modelParams: DyFM_DataProperty_Params<any>): boolean => modelParams.isDependencyHook
1155
+ );
1132
1156
 
1133
1157
  if (dependencyParam) {
1134
1158
  this.depKey = dependencyParam.key;
@@ -4,7 +4,9 @@ import { Schema } from 'mongoose';
4
4
 
5
5
  import {
6
6
  DyFM_AnyError,
7
- DyFM_DataModel_Params, DyFM_DataProperty_Params,
7
+ DyFM_DataModel_Params,
8
+ DyFM_DataProperties,
9
+ DyFM_DataProperty_Params,
8
10
  DyFM_DBFilter, DyFM_DBFilterSimple, DyFM_DBSort,
9
11
  DyFM_Error,
10
12
  DyFM_Error_Settings, DyFM_ErrorLevel,
@@ -36,7 +38,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
36
38
  * schemaSettings also MUST contain specific types that differs from the listed above (Array, Date)
37
39
  */
38
40
  constructor(
39
- public dataParams: DyFM_DataModel_Params
41
+ public dataParams: DyFM_DataModel_Params<T>
40
42
  ){
41
43
  try {
42
44
  this.serviceName = this.constructor?.name;
@@ -102,7 +104,10 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
102
104
  throw new DyFM_Error({
103
105
  ...this._getDefaultErrorSettings('createData', error, issuer),
104
106
  errorCode: 'NTS-DBS-CD0',
105
- additionalContent: { data, dataModel },
107
+ additionalContent: {
108
+ data: data,
109
+ dataModel: this.dataModel,
110
+ },
106
111
  message:
107
112
  `createData failed, Create new "${this.dataParams.dbName}" was unsuccessful (NTS DB)`,
108
113
  issuer,
@@ -349,7 +354,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
349
354
  _deleted: new Date(),
350
355
  _deletedBy: issuer,
351
356
  },
352
- issuer
357
+ /* issuer */
353
358
  ).catch(
354
359
  (error): void => {
355
360
  throw new DyFM_Error({
@@ -392,7 +397,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
392
397
  __lastModified: new Date(),
393
398
  __lastModifiedBy: issuer,
394
399
  },
395
- issuer
400
+ /* issuer */
396
401
  ).catch((error): void => {
397
402
  throw new DyFM_Error({
398
403
  ...this._getDefaultErrorSettings('restoreDeletedById', error, issuer),
@@ -531,55 +536,63 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
531
536
  filter[this.depDataName] = { $in: narrowByDependencyIds };
532
537
  }
533
538
 
534
- this.dataParams.properties.forEach((modelParam: DyFM_DataProperty_Params): void => {
535
- if (
536
- (filterBy[modelParam.key] !== null && filterBy[modelParam.key] !== undefined) ||
537
- filterBy[modelParam.key + 'Range']
538
- ) {
539
- if (modelParam.key.includes('Range') || modelParam.type.includes('[]')) {
540
- // inverz search filter (for Range and Array functions)
541
- if (modelParam.key.includes('Range')) {
542
- const searchParamKeyWithoutRange = modelParam.key.split('Range')[0];
543
-
544
- if (
545
- filterBy[searchParamKeyWithoutRange] !== null &&
546
- filterBy[searchParamKeyWithoutRange] !== undefined
547
- ) {
548
- filter[modelParam.key] = {
549
- from: { $lte: filterBy[searchParamKeyWithoutRange] },
550
- to: { $gte: filterBy[searchParamKeyWithoutRange] },
551
- };
539
+ Object.values(this.dataParams.properties).forEach(
540
+ (modelParam: DyFM_DataProperty_Params<any>): void => {
541
+ if (
542
+ (filterBy[modelParam.key] !== null && filterBy[modelParam.key] !== undefined) ||
543
+ filterBy[modelParam.key + 'Range']
544
+ ) {
545
+ if (modelParam.key.includes('Range') || modelParam.type.includes('[]')) {
546
+ // inverz search filter (for Range and Array functions)
547
+ if (modelParam.key.includes('Range')) {
548
+ const searchParamKeyWithoutRange = modelParam.key.split('Range')[0];
549
+
550
+ if (
551
+ filterBy[searchParamKeyWithoutRange] !== null &&
552
+ filterBy[searchParamKeyWithoutRange] !== undefined
553
+ ) {
554
+ filter[modelParam.key] = {
555
+ from: { $lte: filterBy[searchParamKeyWithoutRange] },
556
+ to: { $gte: filterBy[searchParamKeyWithoutRange] },
557
+ };
558
+ }
559
+ } else {
560
+ if (
561
+ filterBy[modelParam.key] !== null &&
562
+ filterBy[modelParam.key] !== undefined
563
+ ) {
564
+ filter[modelParam.key] = { $in: filterBy[modelParam.key] };
565
+ }
552
566
  }
553
567
  } else {
554
- if (
568
+ // basic search filter
569
+ if (filterBy[modelParam.key + 'Range']) {
570
+ if (
571
+ filterBy[modelParam.key + 'Range'].from ||
572
+ filterBy[modelParam.key + 'Range'].to
573
+ ) {
574
+ filter[modelParam.key] = {};
575
+
576
+ if (filterBy[modelParam.key + 'Range'].from) {
577
+ filter[modelParam.key].$gte = filterBy[modelParam.key + 'Range'].from;
578
+ }
579
+
580
+ if (filterBy[modelParam.key + 'Range'].to) {
581
+ filter[modelParam.key].$lte = filterBy[modelParam.key + 'Range'].to;
582
+ }
583
+ }
584
+ } else if (
555
585
  filterBy[modelParam.key] !== null &&
556
586
  filterBy[modelParam.key] !== undefined
557
587
  ) {
558
- filter[modelParam.key] = { $in: filterBy[modelParam.key] };
559
- }
560
- }
561
- } else {
562
- // basic search filter
563
- if (filterBy[modelParam.key + 'Range']) {
564
- if (filterBy[modelParam.key + 'Range'].from || filterBy[modelParam.key + 'Range'].to) {
565
- filter[modelParam.key] = {};
566
-
567
- if (filterBy[modelParam.key + 'Range'].from) {
568
- filter[modelParam.key].$gte = filterBy[modelParam.key + 'Range'].from;
588
+ if (filterBy[modelParam.key].lenght > 0) {
589
+ filter[modelParam.key] = { $in: filterBy[modelParam.key] };
569
590
  }
570
-
571
- if (filterBy[modelParam.key + 'Range'].to) {
572
- filter[modelParam.key].$lte = filterBy[modelParam.key + 'Range'].to;
573
- }
574
- }
575
- } else if (filterBy[modelParam.key] !== null && filterBy[modelParam.key] !== undefined) {
576
- if (filterBy[modelParam.key].lenght > 0) {
577
- filter[modelParam.key] = { $in: filterBy[modelParam.key] };
578
591
  }
579
592
  }
580
593
  }
581
594
  }
582
- });
595
+ );
583
596
 
584
597
  let dataList: T[] = await this.dataModel
585
598
  .find(filter)
@@ -1013,23 +1026,29 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1013
1026
 
1014
1027
  /**
1015
1028
  * builds mongoose schema building settings object by dynamoDataModelParamsList
1016
- * @param params DynamoBEDataPropertyParams
1029
+ * @param properties DynamoBEDataPropertyParams
1017
1030
  * @returns mongoose schema object
1018
1031
  */
1019
- private buildMongooseSchemaByModelParams(params?: DyFM_DataProperty_Params[]): any {
1032
+ private buildMongooseSchemaByModelParams(properties?: DyFM_DataProperties<T>): any {
1020
1033
  const schemaSettingsObj = {};
1021
1034
 
1022
- if (!params) {
1023
- params = this.dataParams.properties;
1035
+ if (!properties) {
1036
+ properties = this.dataParams.properties;
1024
1037
  }
1025
1038
 
1026
- params.forEach((property: DyFM_DataProperty_Params): void => {
1039
+ Object.values(properties).forEach((property: DyFM_DataProperty_Params<any>): void => {
1040
+ if (!property) {
1041
+ DyFM_Log.warn(`property is undefined on ${this.dataParams.dbName} (NTS DB)`);
1042
+
1043
+ return;
1044
+ }
1045
+
1027
1046
  const beType = this.getBEType(property.type);
1028
1047
 
1029
1048
  if (
1030
1049
  beType !== Object ||
1031
1050
  !property?.subObjectParams ||
1032
- property?.subObjectParams?.length == 0
1051
+ (property?.subObjectParams && Object.keys(property.subObjectParams).length == 0)
1033
1052
  ) {
1034
1053
  schemaSettingsObj[property.key] = {
1035
1054
  type: beType,
@@ -1123,12 +1142,15 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1123
1142
  * sets depDataKey
1124
1143
  */
1125
1144
  private lookForDependencyDataSettings(): void {
1126
- const dependencyParam: DyFM_DataProperty_Params = this.dataParams.properties.find(
1127
- (modelParams: DyFM_DataProperty_Params): boolean => modelParams.isDependencyHook
1128
- );
1145
+ const dependencyParam: DyFM_DataProperty_Params<any> =
1146
+ Object.values(this.dataParams.properties).find(
1147
+ (modelParams: DyFM_DataProperty_Params<any>): boolean => modelParams.isDependencyHook
1148
+ );
1129
1149
 
1130
- if (this.dataParams.properties.filter(
1131
- (modelParams: DyFM_DataProperty_Params): boolean => modelParams.isDependencyHook).length > 1
1150
+ if (
1151
+ Object.values(this.dataParams.properties).filter(
1152
+ (modelParams: DyFM_DataProperty_Params<any>): boolean => modelParams.isDependencyHook
1153
+ ).length > 1
1132
1154
  ) {
1133
1155
  throw new DyFM_Error({
1134
1156
  ...this._getDefaultErrorSettings(
@@ -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
+ });
@@ -1,15 +1,15 @@
1
1
 
2
- import * as Axios from 'axios';
3
- import {
4
- DyFM_AnyError, DyFM_Error, DyFM_Error_Settings, DyFM_Log
2
+ import {
3
+ DyFM_AnyError, DyFM_Error, DyFM_Error_Settings, DyFM_Log
5
4
  } from '@futdevpro/fsm-dynamo';
5
+ import * as Axios from 'axios';
6
6
 
7
+ import { DyNTS_global_settings } from '../../_collections/global-settings.const';
7
8
  import { DyNTS_HttpCallType } from '../../_enums/http/http-call-type.enum';
8
9
  import { DyNTS_HttpResponseType } from '../../_enums/http/http-response-type.enum';
9
10
  import {
10
11
  DyNTS_ApiCall_Params
11
12
  } from '../../_models/control-models/api-call-params.control-model';
12
- import { DyNTS_global_settings } from '../../_collections/global-settings.const';
13
13
 
14
14
  export interface DyNTS_ApiCallInput_Params<T_Body = any> {
15
15
  pathParams?: {
@@ -45,7 +45,7 @@ export class DyNTS_ApiService {
45
45
  public static async startApiCall<T_Response, T_Body = any>(
46
46
  /**
47
47
  * you must setup the basic api call params with this.
48
- * follow the instructions in the constructor: new DyNTS_ApiCallParams({ ... })
48
+ * follow the instructions in the constructor: new DyNTS_ApiCall_Params({ ... })
49
49
  */
50
50
  callParams: DyNTS_ApiCall_Params,
51
51
  /**
@@ -77,7 +77,7 @@ export class DyNTS_ApiService {
77
77
  switch (callParams.type) {
78
78
  case DyNTS_HttpCallType.get:
79
79
  if (inputParams?.body) {
80
- DyFM_Log.warn('WARNING you cant send body in get calls');
80
+ DyFM_Log.warn(`WARNING you cant send body in get calls (${callParams.name})`);
81
81
  }
82
82
 
83
83
  a = await this.get<T_Response>(axios, url, callParams);
@@ -133,7 +133,7 @@ export class DyNTS_ApiService {
133
133
  }
134
134
 
135
135
  /* private static setupQueryParams<T_Body = any>(
136
- inputParams: DyNTS_ApiCallInputParams<T_Body>, callParams: DyNTS_ApiCallParams) {
136
+ inputParams: DyNTS_ApiCallInputParams<T_Body>, callParams: DyNTS_ApiCall_Params) {
137
137
  const httpParams = new HttpParams();
138
138
 
139
139
  for (const queryParamKey in inputParams.queryParams) {