@futdevpro/nts-dynamo 1.2.90

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 (179) hide show
  1. package/BuildPackage.bat +1 -0
  2. package/LICENSE +21 -0
  3. package/README.md +17 -0
  4. package/lib/_constants/dynamobe-global.settings.d.ts +2 -0
  5. package/lib/_constants/dynamobe-global.settings.d.ts.map +1 -0
  6. package/lib/_constants/dynamobe-global.settings.js +11 -0
  7. package/lib/_enum/data-model-types.enum.d.ts +5 -0
  8. package/lib/_enum/data-model-types.enum.d.ts.map +1 -0
  9. package/lib/_enum/data-model-types.enum.js +9 -0
  10. package/lib/_enum/dynamobe-data-service-function.enum.d.ts +7 -0
  11. package/lib/_enum/dynamobe-data-service-function.enum.d.ts.map +1 -0
  12. package/lib/_enum/dynamobe-data-service-function.enum.js +14 -0
  13. package/lib/_enum/dynamobe-route-security.enum.d.ts +5 -0
  14. package/lib/_enum/dynamobe-route-security.enum.d.ts.map +1 -0
  15. package/lib/_enum/dynamobe-route-security.enum.js +9 -0
  16. package/lib/_enum/http/http-call-type.enum.d.ts +7 -0
  17. package/lib/_enum/http/http-call-type.enum.d.ts.map +1 -0
  18. package/lib/_enum/http/http-call-type.enum.js +11 -0
  19. package/lib/_enum/http/http-response-type.enum.d.ts +6 -0
  20. package/lib/_enum/http/http-response-type.enum.d.ts.map +1 -0
  21. package/lib/_enum/http/http-response-type.enum.js +10 -0
  22. package/lib/_enum/log-style.enum.d.ts +25 -0
  23. package/lib/_enum/log-style.enum.d.ts.map +1 -0
  24. package/lib/_enum/log-style.enum.js +29 -0
  25. package/lib/_enum/predefined-data-types.enum.d.ts +7 -0
  26. package/lib/_enum/predefined-data-types.enum.d.ts.map +1 -0
  27. package/lib/_enum/predefined-data-types.enum.js +11 -0
  28. package/lib/_models/dynamobe-api-call-params.d.ts +34 -0
  29. package/lib/_models/dynamobe-api-call-params.d.ts.map +1 -0
  30. package/lib/_models/dynamobe-api-call-params.js +24 -0
  31. package/lib/_models/dynamobe-app-params.d.ts +14 -0
  32. package/lib/_models/dynamobe-app-params.d.ts.map +1 -0
  33. package/lib/_models/dynamobe-app-params.js +13 -0
  34. package/lib/_models/dynamobe-data-model-params.d.ts +12 -0
  35. package/lib/_models/dynamobe-data-model-params.d.ts.map +1 -0
  36. package/lib/_models/dynamobe-data-model-params.js +14 -0
  37. package/lib/_models/dynamobe-endpoint-control.d.ts +28 -0
  38. package/lib/_models/dynamobe-endpoint-control.d.ts.map +1 -0
  39. package/lib/_models/dynamobe-endpoint-control.js +85 -0
  40. package/lib/_models/dynamobe-global-settings.d.ts +8 -0
  41. package/lib/_models/dynamobe-global-settings.d.ts.map +1 -0
  42. package/lib/_models/dynamobe-global-settings.js +6 -0
  43. package/lib/_models/fullstack-models/control-models/daily-usage-data.d.ts +17 -0
  44. package/lib/_models/fullstack-models/control-models/daily-usage-data.d.ts.map +1 -0
  45. package/lib/_models/fullstack-models/control-models/daily-usage-data.js +21 -0
  46. package/lib/_models/fullstack-models/control-models/dynamobe-data-property-params.d.ts +27 -0
  47. package/lib/_models/fullstack-models/control-models/dynamobe-data-property-params.d.ts.map +1 -0
  48. package/lib/_models/fullstack-models/control-models/dynamobe-data-property-params.js +66 -0
  49. package/lib/_models/fullstack-models/control-models/dynamobe-error.d.ts +17 -0
  50. package/lib/_models/fullstack-models/control-models/dynamobe-error.d.ts.map +1 -0
  51. package/lib/_models/fullstack-models/control-models/dynamobe-error.js +195 -0
  52. package/lib/_models/fullstack-models/control-models/geo-ip-location.d.ts +25 -0
  53. package/lib/_models/fullstack-models/control-models/geo-ip-location.d.ts.map +1 -0
  54. package/lib/_models/fullstack-models/control-models/geo-ip-location.js +2 -0
  55. package/lib/_models/fullstack-models/control-models/usage-action.d.ts +8 -0
  56. package/lib/_models/fullstack-models/control-models/usage-action.d.ts.map +1 -0
  57. package/lib/_models/fullstack-models/control-models/usage-action.js +12 -0
  58. package/lib/_models/fullstack-models/control-models/usage-data.d.ts +13 -0
  59. package/lib/_models/fullstack-models/control-models/usage-data.d.ts.map +1 -0
  60. package/lib/_models/fullstack-models/control-models/usage-data.js +15 -0
  61. package/lib/_models/fullstack-models/data-models/custom-data.d.ts +15 -0
  62. package/lib/_models/fullstack-models/data-models/custom-data.d.ts.map +1 -0
  63. package/lib/_models/fullstack-models/data-models/custom-data.js +23 -0
  64. package/lib/_models/fullstack-models/data-models/metadata.d.ts +16 -0
  65. package/lib/_models/fullstack-models/data-models/metadata.d.ts.map +1 -0
  66. package/lib/_models/fullstack-models/data-models/metadata.js +16 -0
  67. package/lib/_models/fullstack-models/data-models/usage-session.d.ts +33 -0
  68. package/lib/_models/fullstack-models/data-models/usage-session.d.ts.map +1 -0
  69. package/lib/_models/fullstack-models/data-models/usage-session.js +48 -0
  70. package/lib/_modules/test-route/custom-data.service.d.ts +5 -0
  71. package/lib/_modules/test-route/custom-data.service.d.ts.map +1 -0
  72. package/lib/_modules/test-route/custom-data.service.js +12 -0
  73. package/lib/_modules/test-route/test-controller.d.ts +5 -0
  74. package/lib/_modules/test-route/test-controller.d.ts.map +1 -0
  75. package/lib/_modules/test-route/test-controller.js +125 -0
  76. package/lib/_modules/usage-route/usage-controller.d.ts +6 -0
  77. package/lib/_modules/usage-route/usage-controller.d.ts.map +1 -0
  78. package/lib/_modules/usage-route/usage-controller.js +88 -0
  79. package/lib/_modules/usage-route/usage.service.d.ts +18 -0
  80. package/lib/_modules/usage-route/usage.service.d.ts.map +1 -0
  81. package/lib/_modules/usage-route/usage.service.js +110 -0
  82. package/lib/_services/dynamobe-api.service.d.ts +9 -0
  83. package/lib/_services/dynamobe-api.service.d.ts.map +1 -0
  84. package/lib/_services/dynamobe-api.service.js +130 -0
  85. package/lib/_services/dynamobe-app.d.ts +11 -0
  86. package/lib/_services/dynamobe-app.d.ts.map +1 -0
  87. package/lib/_services/dynamobe-app.js +38 -0
  88. package/lib/_services/dynamobe-auth.service.d.ts +25 -0
  89. package/lib/_services/dynamobe-auth.service.d.ts.map +1 -0
  90. package/lib/_services/dynamobe-auth.service.js +24 -0
  91. package/lib/_services/dynamobe-controller.service.d.ts +10 -0
  92. package/lib/_services/dynamobe-controller.service.d.ts.map +1 -0
  93. package/lib/_services/dynamobe-controller.service.js +11 -0
  94. package/lib/_services/dynamobe-data.service.d.ts +51 -0
  95. package/lib/_services/dynamobe-data.service.d.ts.map +1 -0
  96. package/lib/_services/dynamobe-data.service.js +224 -0
  97. package/lib/_services/dynamobe-db-service-collection.service.d.ts +5 -0
  98. package/lib/_services/dynamobe-db-service-collection.service.d.ts.map +1 -0
  99. package/lib/_services/dynamobe-db-service-collection.service.js +7 -0
  100. package/lib/_services/dynamobe-db.service.d.ts +150 -0
  101. package/lib/_services/dynamobe-db.service.d.ts.map +1 -0
  102. package/lib/_services/dynamobe-db.service.js +577 -0
  103. package/lib/_services/dynamobe-email-service-collection.service.d.ts +5 -0
  104. package/lib/_services/dynamobe-email-service-collection.service.d.ts.map +1 -0
  105. package/lib/_services/dynamobe-email-service-collection.service.js +7 -0
  106. package/lib/_services/dynamobe-email.service.d.ts +32 -0
  107. package/lib/_services/dynamobe-email.service.d.ts.map +1 -0
  108. package/lib/_services/dynamobe-email.service.js +144 -0
  109. package/lib/_services/dynamobe-global.service.d.ts +22 -0
  110. package/lib/_services/dynamobe-global.service.d.ts.map +1 -0
  111. package/lib/_services/dynamobe-global.service.js +84 -0
  112. package/lib/_services/dynamobe-routing-module.service.d.ts +25 -0
  113. package/lib/_services/dynamobe-routing-module.service.d.ts.map +1 -0
  114. package/lib/_services/dynamobe-routing-module.service.js +112 -0
  115. package/lib/_services/dynamobe-server.d.ts +31 -0
  116. package/lib/_services/dynamobe-server.d.ts.map +1 -0
  117. package/lib/_services/dynamobe-server.js +179 -0
  118. package/lib/_services/dynamobe-shared.service.d.ts +100 -0
  119. package/lib/_services/dynamobe-shared.service.d.ts.map +1 -0
  120. package/lib/_services/dynamobe-shared.service.js +294 -0
  121. package/lib/_services/dynamobe-singleton.service.d.ts +5 -0
  122. package/lib/_services/dynamobe-singleton.service.d.ts.map +1 -0
  123. package/lib/_services/dynamobe-singleton.service.js +15 -0
  124. package/lib/index-newo.d.ts +0 -0
  125. package/lib/index-newo.d.ts.map +1 -0
  126. package/lib/index-newo.js +71 -0
  127. package/lib/index-old.d.ts +39 -0
  128. package/lib/index-old.js +49 -0
  129. package/lib/index.d.ts +39 -0
  130. package/lib/index.d.ts.map +1 -0
  131. package/lib/index.js +49 -0
  132. package/lib/tsconfig.tsbuildinfo +2080 -0
  133. package/nodemon.json +6 -0
  134. package/package.json +52 -0
  135. package/src/_constants/dynamobe-global.settings.ts +11 -0
  136. package/src/_enum/data-model-types.enum.ts +6 -0
  137. package/src/_enum/dynamobe-data-service-function.enum.ts +11 -0
  138. package/src/_enum/dynamobe-route-security.enum.ts +6 -0
  139. package/src/_enum/http/http-call-type.enum.ts +8 -0
  140. package/src/_enum/http/http-response-type.enum.ts +7 -0
  141. package/src/_enum/log-style.enum.ts +30 -0
  142. package/src/_enum/predefined-data-types.enum.ts +8 -0
  143. package/src/_models/dynamobe-api-call-params.ts +62 -0
  144. package/src/_models/dynamobe-app-params.ts +24 -0
  145. package/src/_models/dynamobe-data-model-params.ts +23 -0
  146. package/src/_models/dynamobe-endpoint-control.ts +127 -0
  147. package/src/_models/dynamobe-global-settings.ts +9 -0
  148. package/src/_models/fullstack-models/control-models/daily-usage-data.ts +34 -0
  149. package/src/_models/fullstack-models/control-models/dynamobe-data-property-params.ts +98 -0
  150. package/src/_models/fullstack-models/control-models/dynamobe-error.ts +207 -0
  151. package/src/_models/fullstack-models/control-models/geo-ip-location.ts +26 -0
  152. package/src/_models/fullstack-models/control-models/usage-action.ts +18 -0
  153. package/src/_models/fullstack-models/control-models/usage-data.ts +26 -0
  154. package/src/_models/fullstack-models/data-models/custom-data.ts +37 -0
  155. package/src/_models/fullstack-models/data-models/metadata.ts +28 -0
  156. package/src/_models/fullstack-models/data-models/usage-session.ts +82 -0
  157. package/src/_modules/test-route/custom-data.service.ts +21 -0
  158. package/src/_modules/test-route/test-controller.ts +136 -0
  159. package/src/_modules/usage-route/usage-controller.ts +114 -0
  160. package/src/_modules/usage-route/usage.service.ts +125 -0
  161. package/src/_services/dynamobe-api.service.ts +135 -0
  162. package/src/_services/dynamobe-app.ts +49 -0
  163. package/src/_services/dynamobe-auth.service.ts +42 -0
  164. package/src/_services/dynamobe-controller.service.ts +20 -0
  165. package/src/_services/dynamobe-data.service.ts +215 -0
  166. package/src/_services/dynamobe-db-service-collection.service.ts +9 -0
  167. package/src/_services/dynamobe-db.service.ts +556 -0
  168. package/src/_services/dynamobe-email-service-collection.service.ts +9 -0
  169. package/src/_services/dynamobe-email.service.ts +169 -0
  170. package/src/_services/dynamobe-global.service.ts +99 -0
  171. package/src/_services/dynamobe-routing-module.service.ts +141 -0
  172. package/src/_services/dynamobe-server.ts +225 -0
  173. package/src/_services/dynamobe-shared.service.ts +320 -0
  174. package/src/_services/dynamobe-singleton.service.ts +16 -0
  175. package/src/index-newo.ts +71 -0
  176. package/src/index.ts +50 -0
  177. package/src/version.json +2 -0
  178. package/tsconfig.app.json +12 -0
  179. package/tsconfig.json +72 -0
@@ -0,0 +1,556 @@
1
+
2
+ import * as mongoose from 'mongoose';
3
+ import { Schema } from 'mongoose';
4
+ import { DynamoBEError } from '../_models/fullstack-models/control-models/dynamobe-error';
5
+ import { Metadata } from '../_models/fullstack-models/data-models/metadata';
6
+ import { DynamoBEDataPropertyParams } from '../_models/fullstack-models/control-models/dynamobe-data-property-params';
7
+
8
+ export class DynamoBEDBService<T extends Metadata> {
9
+ dataModel = mongoose.model(this.dataName, this.getSchema());
10
+
11
+ private depDataKey: string;
12
+
13
+ /**
14
+ * @param dataName name the model
15
+ * @param typeSample sample data for scheme creation (dont include Metadata!)
16
+ * @param schemaSettings additional settings for specific parameters as unique, required, minlength or maxlength
17
+ * schemaSettings also MUST contain specific types that differs from the listed above (Array, Date)
18
+ */
19
+ constructor(
20
+ private dataName: string,
21
+ private dataModelParams: DynamoBEDataPropertyParams[]
22
+ ){
23
+ this.lookForDependencyDataSettings();
24
+ }
25
+
26
+ /**
27
+ * save new data
28
+ * @param data data
29
+ * @returns data
30
+ */
31
+ async createData(data: T, creator: string): Promise<T> {
32
+ data.__created = new Date();
33
+ data.__lastModified = new Date();
34
+ data.__createdBy = creator;
35
+ data.__lastModifiedBy = creator;
36
+ const dataModel = new this.dataModel(data);
37
+ let newData: T;
38
+ await dataModel.save().then(res => {
39
+ if (res) {
40
+ newData = res.toObject() as T;
41
+ } else {
42
+ throw new DynamoBEError({ status: 204, message: `${this.dataName} not found! (BD)` });
43
+ }
44
+ }).catch(error => {
45
+ throw new DynamoBEError({ status: 422, message: `Create new ${this.dataName} was unsuccessful (BD)`, error });
46
+ });
47
+ if (typeof newData._id === 'object') {
48
+ newData._id = `${newData._id}`;
49
+ }
50
+ data._id = newData._id;
51
+ data.__v = newData.__v;
52
+ return data;
53
+ }
54
+
55
+ /**
56
+ * Find data by _id and update
57
+ * @param data data
58
+ * @returns data
59
+ */
60
+ async modifyData(data: T, modifier: string): Promise<T> {
61
+ data.__lastModified = new Date();
62
+ data.__lastModifiedBy = modifier;
63
+ const dataModel = new this.dataModel(data);
64
+ let newData: T;
65
+ await this.dataModel.findByIdAndUpdate(data._id, dataModel).then(res => {
66
+ if (res) {
67
+ newData = res.toObject() as T;
68
+ } else {
69
+ throw new DynamoBEError({ status: 204, message: `${this.dataName} not found! (BD)` });
70
+ }
71
+ }).catch(error => {
72
+ throw new DynamoBEError({ status: 417, message: `modify ${this.dataName} was unsuccessful (DB)`, error });
73
+ });
74
+ data.__v = newData.__v;
75
+ return data;
76
+ }
77
+
78
+ /**
79
+ * get data by _id, throws error if not found
80
+ * @param id id
81
+ * @returns data
82
+ */
83
+ async getDataById(id: string): Promise<T> {
84
+ let data: T;
85
+ await this.dataModel.findById(id).then(res => {
86
+ if (res) {
87
+ data = res.toObject() as T;
88
+ } else {
89
+ data = null;
90
+ }
91
+ }).catch(error => {
92
+ throw new DynamoBEError({ status: 417, message: `get ${this.dataName} by ID was unsuccessful (DB)`, error });
93
+ });
94
+ if (data && typeof data._id === 'object') {
95
+ data._id = `${data._id}`;
96
+ }
97
+ return data;
98
+ }
99
+
100
+ /**
101
+ * get data by dependency data id, throws error if not found
102
+ * @param dependencyId id
103
+ * @returns data
104
+ */
105
+ async getDataByDependencyId(dependencyId: string): Promise<T> {
106
+ if (this.depDataKey) {
107
+ let data: T;
108
+ await this.dataModel.findOne({ [this.depDataKey]: dependencyId }).then(res => {
109
+ if (res) {
110
+ data = res.toObject() as T;
111
+ } else {
112
+ data = null;
113
+ }
114
+ }).catch(error => {
115
+ throw new DynamoBEError({ status: 417, message: `get ${this.dataName} by ${this.depDataKey} was unsuccessful (DB)`, error });
116
+ });
117
+ if (data && typeof data._id === 'object') {
118
+ data._id = `${data._id}`;
119
+ }
120
+ return data;
121
+ } else {
122
+ throw new DynamoBEError({ status: 501, message: `dependencyDataIdKey not setted up for this db-service (${this.dataName}) (BD)` });
123
+ }
124
+ }
125
+
126
+ /**
127
+ * get data by dependency data id, throws error if not found
128
+ * @param dependencyId id
129
+ * @returns dataList
130
+ */
131
+ async getDataListByDependencyId(dependencyId: string): Promise<T[]> {
132
+ if (this.depDataKey) {
133
+ let dataList = [];
134
+ await this.dataModel.find({ [this.depDataKey]: dependencyId }).then(res => {
135
+ if (res) {
136
+ dataList = res;
137
+ }
138
+ }).catch(error => {
139
+ throw new DynamoBEError({ status: 417, message: `get ${this.dataName} by ${this.depDataKey} was unsuccessful (DB)`, error });
140
+ });
141
+ if (0 < dataList.length && typeof dataList[0]._id === 'object') {
142
+ dataList.forEach((data: T) => {
143
+ data._id = `˙${data._id}`;
144
+ });
145
+ }
146
+ return dataList;
147
+ } else {
148
+ throw new DynamoBEError({ status: 501, message: `dependencyDataIdKey not setted up for this db-service (${this.dataName}) (BD)` });
149
+ }
150
+ }
151
+
152
+ /**
153
+ * get multiple data objects by a list of DependencyIDs, throws error if not found
154
+ * @param ids ids
155
+ * @returns dataList
156
+ */
157
+ async getDataListByDependencyIds(ids: string[]): Promise<T[]> {
158
+ if (this.depDataKey) {
159
+ let dataList = [];
160
+ await this.dataModel.find({ [this.depDataKey]: { $in: ids }}).then(res => {
161
+ if (res) {
162
+ dataList = res;
163
+ }
164
+ }).catch(error => {
165
+ throw new DynamoBEError({ status: 417, message: `get ${this.dataName}s by ${this.depDataKey}s was unsuccessful (DB)`, error });
166
+ });
167
+ return dataList;
168
+ } else {
169
+ throw new DynamoBEError({ status: 501, message: `dependencyDataIdKey not setted up for this db-service (${this.dataName}) (BD)` });
170
+ }
171
+ }
172
+
173
+ /**
174
+ * returns search result for searchBy object params
175
+ * can use lists or xRange values for searchBy obj properties
176
+ * @param searchBy filter
177
+ * @param narrowByDependencyIds id
178
+ * @returns dataList
179
+ */
180
+ async searchData(searchBy: object, narrowByDependencyIds?: string[]): Promise<T[]> {
181
+ const filter = {};
182
+
183
+ if (narrowByDependencyIds.length > 0) {
184
+ if (this.depDataKey) {
185
+ filter[this.depDataKey] = { $in: narrowByDependencyIds };
186
+ } else {
187
+ throw new DynamoBEError({ status: 501, message: `dependencyDataIdKey not setted up for this db-service (${this.dataName}) (BD)` });
188
+ }
189
+ }
190
+ await this.dataModelParams.forEach((modelParam: DynamoBEDataPropertyParams) => {
191
+ if ((searchBy[modelParam.key] !== null && searchBy[modelParam.key] !== undefined) || searchBy[modelParam.key + 'Range']) {
192
+ if (modelParam.key.includes('Range') || modelParam.type.includes('[]')) {
193
+ // inverz search filter (for Range and Array functions)
194
+ if (modelParam.key.includes('Range')) {
195
+ const searchParamKeyWithoutRange = modelParam.key.split('Range')[0];
196
+ if (searchBy[searchParamKeyWithoutRange] !== null && searchBy[searchParamKeyWithoutRange] !== undefined) {
197
+ filter[modelParam.key] = {
198
+ from: { $lte: searchBy[searchParamKeyWithoutRange] },
199
+ to: { $gte: searchBy[searchParamKeyWithoutRange] }
200
+ };
201
+ }
202
+ } else {
203
+ if (searchBy[modelParam.key] !== null && searchBy[modelParam.key] !== undefined) {
204
+ filter[modelParam.key] = { $in: searchBy[modelParam.key] };
205
+ }
206
+ }
207
+ } else {
208
+ // basic search filter
209
+ if (searchBy[modelParam.key + 'Range']) {
210
+ if (searchBy[modelParam.key + 'Range'].from || searchBy[modelParam.key + 'Range'].to) {
211
+ filter[modelParam.key] = {};
212
+ if (searchBy[modelParam.key + 'Range'].from) {
213
+ filter[modelParam.key].$gte = searchBy[modelParam.key + 'Range'].from;
214
+ }
215
+ if (searchBy[modelParam.key + 'Range'].to) {
216
+ filter[modelParam.key].$lte = searchBy[modelParam.key + 'Range'].to;
217
+ }
218
+ }
219
+ } else if (searchBy[modelParam.key] !== null && searchBy[modelParam.key] !== undefined) {
220
+ if (searchBy[modelParam.key].lenght > 0) {
221
+ filter[modelParam.key] = { $in: searchBy[modelParam.key] };
222
+ }
223
+ }
224
+ }
225
+ }
226
+ });
227
+
228
+ let dataList = [];
229
+ await this.dataModel.find(filter).then(res => {
230
+ if (res) {
231
+ dataList = res;
232
+ }
233
+ }).catch(error => {
234
+ throw new DynamoBEError({ status: 417, message: `search ${this.dataName} was unsuccessful (DB)`, error });
235
+ });
236
+ if (0 < dataList.length && typeof dataList[0]._id === 'object') {
237
+ dataList.forEach((data: T) => {
238
+ data._id = `˙${data._id}`;
239
+ });
240
+ }
241
+ return dataList as T[];
242
+ }
243
+
244
+ /**
245
+ * find data by any of its parameters, throws error if not found
246
+ * @param data etc.: by email: { email: email }
247
+ * { userIds: { $in: this.userId } }
248
+ * @returns data
249
+ */
250
+ async findData(data: T): Promise<T> {
251
+ await this.dataModel.findOne(data).then(res => {
252
+ if (res) {
253
+ data = res.toObject() as T;
254
+ } else {
255
+ data = null;
256
+ }
257
+ }).catch(error => {
258
+ throw new DynamoBEError({ status: 417, message: `find ${this.dataName} was unsuccessful (DB)`, error });
259
+ });
260
+ if (data && typeof data._id === 'object') {
261
+ data._id = `${data._id}`;
262
+ }
263
+ return data;
264
+ }
265
+
266
+ /**
267
+ * returns all data from database, throws error if not found
268
+ * @returns dataList
269
+ */
270
+ async getAll(): Promise<T[]> {
271
+ let dataList = [];
272
+ await this.dataModel.find({}).then(res => {
273
+ if (res) {
274
+ dataList = res;
275
+ }
276
+ }).catch(error => {
277
+ throw new DynamoBEError({ status: 417, message: `get all ${this.dataName} was unsuccessful (DB)`, error });
278
+ });
279
+ if (0 < dataList.length && typeof dataList[0]._id === 'object') {
280
+ dataList.forEach((data: T) => {
281
+ data._id = `˙${data._id}`;
282
+ });
283
+ }
284
+ return dataList as T[];
285
+ }
286
+
287
+ /**
288
+ * update one parameter by a specific
289
+ * { _id: pictureId }, { approved: true }
290
+ * @param updateBy etc.: { email: email } (always use unique parameters for find!)
291
+ * @param update etc.: { $inc: { popularity: this.newVote.amount }, emailVerified: true }
292
+ */
293
+ /* async updateOneParameter(updateBy: any, update: any, modifier: string): Promise<void> {
294
+ update.__lastModified = new Date();
295
+ update.__lastModifiedBy = modifier;
296
+ await this.dataModel.updateOne(updateBy, update).catch(error => {
297
+ throw new DynamoBEError({ status: 417, message: `update one parameter on ${this.dataName} was unsuccessful (DB)`, error });
298
+ });
299
+ } */
300
+
301
+ /**
302
+ * deleted data by id
303
+ * @param id id
304
+ */
305
+ async deleteDataById(id: string): Promise<void> {
306
+ await this.dataModel.findByIdAndDelete(id).catch(error => {
307
+ throw new DynamoBEError({ status: 417, message: `delete ${this.dataName} was unsuccessful (DB)`, error });
308
+ });
309
+ }
310
+
311
+ /**
312
+ * deleted data by id
313
+ * @param dependencyId id
314
+ */
315
+ async deleteDataByDependencyId(dependencyId: string): Promise<void> {
316
+ if (this.depDataKey) {
317
+ await this.dataModel.deleteMany({ [this.depDataKey]: dependencyId }).catch(error => {
318
+ throw new DynamoBEError({ status: 417, message: `delete ${this.dataName} by ${this.depDataKey} was unsuccessful (DB)`, error });
319
+ });
320
+ } else {
321
+ throw new DynamoBEError({ status: 501, message: `dependencyDataIdKey not setted up for this db-service (${this.dataName}) (BD)` });
322
+ }
323
+ }
324
+
325
+ // ----------------------------------------------------------------------------------
326
+ // ----------------------------------------------------------------------------------
327
+ // ----------------------------------------------------------------------------------
328
+ // DIRECT MONGOOSE CALLS (with error handlings)
329
+
330
+ /**
331
+ * find the data first by any of its parameters, throws error if not found
332
+ * @param filter etc. by email: { email: email }
333
+ * @returns data
334
+ */
335
+ async findOne(filter: any): Promise<T> {
336
+ let data: T;
337
+ await this.dataModel.findOne(filter).then(res => {
338
+ if (res) {
339
+ data = res.toObject() as T;
340
+ } else {
341
+ data = null;
342
+ }
343
+ }).catch(error => {
344
+ throw new DynamoBEError({ status: 417, message: `findOne ${this.dataName} was unsuccessful (DB)`, error });
345
+ });
346
+ if (data && typeof data._id === 'object') {
347
+ data._id = `${data._id}`;
348
+ }
349
+ return data;
350
+ }
351
+
352
+ /**
353
+ * find all data by any of its parameters, throws error if not found
354
+ * @param filter etc. by email: { email: email, points: { $gte: 2, $lte: 12 }, userIds: { $in: this.userId } }
355
+ * @returns dataList
356
+ */
357
+ async find(filter: any): Promise<T[]> {
358
+ let dataList = [];
359
+ await this.dataModel.find(filter).then(res => {
360
+ if (res) {
361
+ dataList = res;
362
+ }
363
+ }).catch(error => {
364
+ throw new DynamoBEError({ status: 417, message: `find ${this.dataName} was unsuccessful (DB)`, error });
365
+ });
366
+ if (0 < dataList.length && typeof dataList[0]._id === 'object') {
367
+ dataList.forEach((data: T) => {
368
+ data._id = `˙${data._id}`;
369
+ });
370
+ }
371
+ return dataList as T[];
372
+ }
373
+
374
+ /**
375
+ * find all data by any of its parameters, throws error if not found
376
+ * @param filter etc. by email: { email: email, points: { $gte: 2, $lte: 12 }, userIds: { $in: this.userId } }
377
+ * @param page page
378
+ * @param pageSize pageSize
379
+ * @param sort etc. by dateTime: { dateTime: -1 }
380
+ * @returns dataList
381
+ */
382
+ async findWithPaging(filter: any, page: number, pageSize: number, sort?: any): Promise<T[]> {
383
+ let dataList = [];
384
+ await this.dataModel.find(filter)
385
+ .sort(sort)
386
+ .skip(page * pageSize)
387
+ .limit(pageSize)
388
+ .then(res => {
389
+ if (res) {
390
+ dataList = res;
391
+ }
392
+ }).catch(error => {
393
+ throw new DynamoBEError({ status: 417, message: `findWithPaging ${this.dataName} was unsuccessful (DB)`, error });
394
+ });
395
+ if (0 < dataList.length && typeof dataList[0]._id === 'object') {
396
+ dataList.forEach((data: T) => {
397
+ data._id = `˙${data._id}`;
398
+ });
399
+ }
400
+ return dataList;
401
+ }
402
+
403
+ /**
404
+ * Find data by _id and update
405
+ * @param id id
406
+ * @param update update
407
+ * @returns data
408
+ */
409
+ async findByIdAndUpdate(id: string, update: any, modifier: string): Promise<T> {
410
+ let data: T;
411
+ update.__lastModified = new Date();
412
+ update.__lastModifiedBy = modifier;
413
+ await this.dataModel.findByIdAndUpdate(id, update).then(res => {
414
+ if (res) {
415
+ data = res.toObject() as T;
416
+ } else {
417
+ throw new DynamoBEError({ status: 204, message: `${this.dataName} not found! (BD)` });
418
+ }
419
+ }).catch(error => {
420
+ throw new DynamoBEError({ status: 417, message: `findByIdAndUpdate ${this.dataName} was unsuccessful (DB)`, error });
421
+ });
422
+ update.__v = data.__v;
423
+ return update;
424
+ }
425
+
426
+ /**
427
+ * update one parameter by a specific
428
+ * @param updateBy etc.: by email: { email: email, points: { $gte: 2, $lte: 12 }, userIds: { $in: this.userId } } (always use unique parameters for find!)
429
+ * @param update etc.: { $inc: { popularity: this.newVote.amount }, emailVerified: true }
430
+ */
431
+ async updateOne(updateBy: any, update: any, modifier: string): Promise<void> {
432
+ update.__lastModified = new Date();
433
+ update.__lastModifiedBy = modifier;
434
+ await this.dataModel.updateOne(updateBy, update).catch(error => {
435
+ throw new DynamoBEError({ status: 417, message: `updateOne ${this.dataName} was unsuccessful (DB)`, error });
436
+ });
437
+ }
438
+
439
+ /**
440
+ * update one parameter by a specific
441
+ * @param updateBy etc.: by email: { email: email, points: { $gte: 2, $lte: 12 }, userIds: { $in: this.userId } } (always use unique parameters for find!)
442
+ * @param update etc.: { $inc: { popularity: this.newVote.amount }, emailVerified: true, reactions: { $push: this.newReaction } }
443
+ */
444
+ async updateMany(updateBy: any, update: any, modifier: string): Promise<void> {
445
+ update.__lastModified = new Date();
446
+ update.__lastModifiedBy = modifier;
447
+ await this.dataModel.updateMany(updateBy, update).catch(error => {
448
+ throw new DynamoBEError({ status: 417, message: `updateMany ${this.dataName} was unsuccessful (DB)`, error });
449
+ });
450
+ }
451
+
452
+ // ----------------------------------------------------------------------------------
453
+ // ----------------------------------------------------------------------------------
454
+ // ----------------------------------------------------------------------------------
455
+ // PRIVATE BUILD FUNCTIONS
456
+
457
+ /**
458
+ * builds and returns mongoose schema
459
+ * @returns schema
460
+ */
461
+ private getSchema(): mongoose.Schema {
462
+ let schema: any = this.buildMongooseSchemaByModelParams();
463
+ schema = this.addMetadataToSchema(schema);
464
+ // tslint:disable-next-line: no-string-literal
465
+ if (schema['_id']) {
466
+ // tslint:disable-next-line: no-string-literal
467
+ delete schema['_id'];
468
+ }
469
+ return new Schema(schema);
470
+ }
471
+
472
+ /**
473
+ * builds mongoose schema building settings object by dynamoDataModelParamsList
474
+ * @param params DynamoBEDataPropertyParams
475
+ * @returns mongoose schema object
476
+ */
477
+ private buildMongooseSchemaByModelParams(params?: DynamoBEDataPropertyParams[]): any {
478
+ const schemaSettingsObj = {};
479
+ if (!params) {
480
+ params = this.dataModelParams;
481
+ }
482
+ params.forEach((property: DynamoBEDataPropertyParams) => {
483
+ const beType = this.getBEType(property.type);
484
+ if (beType !== Object || !property.subObjectParams) {
485
+ schemaSettingsObj[property.key] = {
486
+ type: beType
487
+ };
488
+ if (property.index) {
489
+ schemaSettingsObj[property.key].index = true;
490
+ }
491
+ if (property.unique) {
492
+ schemaSettingsObj[property.key].unique = true;
493
+ }
494
+ if (property.required) {
495
+ schemaSettingsObj[property.key].required = true;
496
+ }
497
+ if (property.minlength) {
498
+ schemaSettingsObj[property.key].minlength = property.minlength;
499
+ }
500
+ if (property.maxlength) {
501
+ schemaSettingsObj[property.key].maxlength = property.maxlength;
502
+ }
503
+ } else {
504
+ schemaSettingsObj[property.key] = this.buildMongooseSchemaByModelParams(property.subObjectParams);
505
+ }
506
+ });
507
+ return schemaSettingsObj;
508
+ }
509
+
510
+ private getBEType(type: string): String | Number | Boolean | Object | Function | Array<any> | Date {
511
+ switch (type) {
512
+ case 'string':
513
+ return String;
514
+ case 'number':
515
+ return Number;
516
+ case 'boolean':
517
+ return Boolean;
518
+ case 'Date':
519
+ return Date;
520
+ case 'object':
521
+ return Object;
522
+ default:
523
+ if (type.includes('[]')) {
524
+ return Array;
525
+ } else if (type.includes('=>') || type.includes('function')) {
526
+ return Function;
527
+ } else {
528
+ return Object;
529
+ }
530
+ }
531
+ }
532
+
533
+ /**
534
+ * adds dynamo metadata settings to any mongoose schema building settings object
535
+ * @param schema schema to update
536
+ * @returns updated schema
537
+ */
538
+ private addMetadataToSchema(schema: any): any {
539
+ schema.__created = { type: Date };
540
+ schema.__createdBy = { type: String };
541
+ schema.__lastModified = { type: Date };
542
+ schema.__lastModifiedBy = { type: String };
543
+ return schema;
544
+ }
545
+
546
+ /**
547
+ * sets depDataKey
548
+ */
549
+ private lookForDependencyDataSettings(): void {
550
+ const dependencyParam: DynamoBEDataPropertyParams = this.dataModelParams.find(
551
+ (modelParams: DynamoBEDataPropertyParams) => modelParams.isDependencyHook);
552
+ if (dependencyParam) {
553
+ this.depDataKey = dependencyParam.key;
554
+ }
555
+ }
556
+ }
@@ -0,0 +1,9 @@
1
+
2
+ import { DynamoBEEmailService } from './dynamobe-email.service';
3
+ import { DynamoBESingletonService } from './dynamobe-singleton.service';
4
+
5
+ export class DynamoBEEmailServiceCollection extends DynamoBESingletonService {
6
+
7
+ [service: string]: DynamoBEEmailService;
8
+
9
+ }