@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.
- package/BuildPackage.bat +1 -0
- package/LICENSE +21 -0
- package/README.md +17 -0
- package/lib/_constants/dynamobe-global.settings.d.ts +2 -0
- package/lib/_constants/dynamobe-global.settings.d.ts.map +1 -0
- package/lib/_constants/dynamobe-global.settings.js +11 -0
- package/lib/_enum/data-model-types.enum.d.ts +5 -0
- package/lib/_enum/data-model-types.enum.d.ts.map +1 -0
- package/lib/_enum/data-model-types.enum.js +9 -0
- package/lib/_enum/dynamobe-data-service-function.enum.d.ts +7 -0
- package/lib/_enum/dynamobe-data-service-function.enum.d.ts.map +1 -0
- package/lib/_enum/dynamobe-data-service-function.enum.js +14 -0
- package/lib/_enum/dynamobe-route-security.enum.d.ts +5 -0
- package/lib/_enum/dynamobe-route-security.enum.d.ts.map +1 -0
- package/lib/_enum/dynamobe-route-security.enum.js +9 -0
- package/lib/_enum/http/http-call-type.enum.d.ts +7 -0
- package/lib/_enum/http/http-call-type.enum.d.ts.map +1 -0
- package/lib/_enum/http/http-call-type.enum.js +11 -0
- package/lib/_enum/http/http-response-type.enum.d.ts +6 -0
- package/lib/_enum/http/http-response-type.enum.d.ts.map +1 -0
- package/lib/_enum/http/http-response-type.enum.js +10 -0
- package/lib/_enum/log-style.enum.d.ts +25 -0
- package/lib/_enum/log-style.enum.d.ts.map +1 -0
- package/lib/_enum/log-style.enum.js +29 -0
- package/lib/_enum/predefined-data-types.enum.d.ts +7 -0
- package/lib/_enum/predefined-data-types.enum.d.ts.map +1 -0
- package/lib/_enum/predefined-data-types.enum.js +11 -0
- package/lib/_models/dynamobe-api-call-params.d.ts +34 -0
- package/lib/_models/dynamobe-api-call-params.d.ts.map +1 -0
- package/lib/_models/dynamobe-api-call-params.js +24 -0
- package/lib/_models/dynamobe-app-params.d.ts +14 -0
- package/lib/_models/dynamobe-app-params.d.ts.map +1 -0
- package/lib/_models/dynamobe-app-params.js +13 -0
- package/lib/_models/dynamobe-data-model-params.d.ts +12 -0
- package/lib/_models/dynamobe-data-model-params.d.ts.map +1 -0
- package/lib/_models/dynamobe-data-model-params.js +14 -0
- package/lib/_models/dynamobe-endpoint-control.d.ts +28 -0
- package/lib/_models/dynamobe-endpoint-control.d.ts.map +1 -0
- package/lib/_models/dynamobe-endpoint-control.js +85 -0
- package/lib/_models/dynamobe-global-settings.d.ts +8 -0
- package/lib/_models/dynamobe-global-settings.d.ts.map +1 -0
- package/lib/_models/dynamobe-global-settings.js +6 -0
- package/lib/_models/fullstack-models/control-models/daily-usage-data.d.ts +17 -0
- package/lib/_models/fullstack-models/control-models/daily-usage-data.d.ts.map +1 -0
- package/lib/_models/fullstack-models/control-models/daily-usage-data.js +21 -0
- package/lib/_models/fullstack-models/control-models/dynamobe-data-property-params.d.ts +27 -0
- package/lib/_models/fullstack-models/control-models/dynamobe-data-property-params.d.ts.map +1 -0
- package/lib/_models/fullstack-models/control-models/dynamobe-data-property-params.js +66 -0
- package/lib/_models/fullstack-models/control-models/dynamobe-error.d.ts +17 -0
- package/lib/_models/fullstack-models/control-models/dynamobe-error.d.ts.map +1 -0
- package/lib/_models/fullstack-models/control-models/dynamobe-error.js +195 -0
- package/lib/_models/fullstack-models/control-models/geo-ip-location.d.ts +25 -0
- package/lib/_models/fullstack-models/control-models/geo-ip-location.d.ts.map +1 -0
- package/lib/_models/fullstack-models/control-models/geo-ip-location.js +2 -0
- package/lib/_models/fullstack-models/control-models/usage-action.d.ts +8 -0
- package/lib/_models/fullstack-models/control-models/usage-action.d.ts.map +1 -0
- package/lib/_models/fullstack-models/control-models/usage-action.js +12 -0
- package/lib/_models/fullstack-models/control-models/usage-data.d.ts +13 -0
- package/lib/_models/fullstack-models/control-models/usage-data.d.ts.map +1 -0
- package/lib/_models/fullstack-models/control-models/usage-data.js +15 -0
- package/lib/_models/fullstack-models/data-models/custom-data.d.ts +15 -0
- package/lib/_models/fullstack-models/data-models/custom-data.d.ts.map +1 -0
- package/lib/_models/fullstack-models/data-models/custom-data.js +23 -0
- package/lib/_models/fullstack-models/data-models/metadata.d.ts +16 -0
- package/lib/_models/fullstack-models/data-models/metadata.d.ts.map +1 -0
- package/lib/_models/fullstack-models/data-models/metadata.js +16 -0
- package/lib/_models/fullstack-models/data-models/usage-session.d.ts +33 -0
- package/lib/_models/fullstack-models/data-models/usage-session.d.ts.map +1 -0
- package/lib/_models/fullstack-models/data-models/usage-session.js +48 -0
- package/lib/_modules/test-route/custom-data.service.d.ts +5 -0
- package/lib/_modules/test-route/custom-data.service.d.ts.map +1 -0
- package/lib/_modules/test-route/custom-data.service.js +12 -0
- package/lib/_modules/test-route/test-controller.d.ts +5 -0
- package/lib/_modules/test-route/test-controller.d.ts.map +1 -0
- package/lib/_modules/test-route/test-controller.js +125 -0
- package/lib/_modules/usage-route/usage-controller.d.ts +6 -0
- package/lib/_modules/usage-route/usage-controller.d.ts.map +1 -0
- package/lib/_modules/usage-route/usage-controller.js +88 -0
- package/lib/_modules/usage-route/usage.service.d.ts +18 -0
- package/lib/_modules/usage-route/usage.service.d.ts.map +1 -0
- package/lib/_modules/usage-route/usage.service.js +110 -0
- package/lib/_services/dynamobe-api.service.d.ts +9 -0
- package/lib/_services/dynamobe-api.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-api.service.js +130 -0
- package/lib/_services/dynamobe-app.d.ts +11 -0
- package/lib/_services/dynamobe-app.d.ts.map +1 -0
- package/lib/_services/dynamobe-app.js +38 -0
- package/lib/_services/dynamobe-auth.service.d.ts +25 -0
- package/lib/_services/dynamobe-auth.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-auth.service.js +24 -0
- package/lib/_services/dynamobe-controller.service.d.ts +10 -0
- package/lib/_services/dynamobe-controller.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-controller.service.js +11 -0
- package/lib/_services/dynamobe-data.service.d.ts +51 -0
- package/lib/_services/dynamobe-data.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-data.service.js +224 -0
- package/lib/_services/dynamobe-db-service-collection.service.d.ts +5 -0
- package/lib/_services/dynamobe-db-service-collection.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-db-service-collection.service.js +7 -0
- package/lib/_services/dynamobe-db.service.d.ts +150 -0
- package/lib/_services/dynamobe-db.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-db.service.js +577 -0
- package/lib/_services/dynamobe-email-service-collection.service.d.ts +5 -0
- package/lib/_services/dynamobe-email-service-collection.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-email-service-collection.service.js +7 -0
- package/lib/_services/dynamobe-email.service.d.ts +32 -0
- package/lib/_services/dynamobe-email.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-email.service.js +144 -0
- package/lib/_services/dynamobe-global.service.d.ts +22 -0
- package/lib/_services/dynamobe-global.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-global.service.js +84 -0
- package/lib/_services/dynamobe-routing-module.service.d.ts +25 -0
- package/lib/_services/dynamobe-routing-module.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-routing-module.service.js +112 -0
- package/lib/_services/dynamobe-server.d.ts +31 -0
- package/lib/_services/dynamobe-server.d.ts.map +1 -0
- package/lib/_services/dynamobe-server.js +179 -0
- package/lib/_services/dynamobe-shared.service.d.ts +100 -0
- package/lib/_services/dynamobe-shared.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-shared.service.js +294 -0
- package/lib/_services/dynamobe-singleton.service.d.ts +5 -0
- package/lib/_services/dynamobe-singleton.service.d.ts.map +1 -0
- package/lib/_services/dynamobe-singleton.service.js +15 -0
- package/lib/index-newo.d.ts +0 -0
- package/lib/index-newo.d.ts.map +1 -0
- package/lib/index-newo.js +71 -0
- package/lib/index-old.d.ts +39 -0
- package/lib/index-old.js +49 -0
- package/lib/index.d.ts +39 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +49 -0
- package/lib/tsconfig.tsbuildinfo +2080 -0
- package/nodemon.json +6 -0
- package/package.json +52 -0
- package/src/_constants/dynamobe-global.settings.ts +11 -0
- package/src/_enum/data-model-types.enum.ts +6 -0
- package/src/_enum/dynamobe-data-service-function.enum.ts +11 -0
- package/src/_enum/dynamobe-route-security.enum.ts +6 -0
- package/src/_enum/http/http-call-type.enum.ts +8 -0
- package/src/_enum/http/http-response-type.enum.ts +7 -0
- package/src/_enum/log-style.enum.ts +30 -0
- package/src/_enum/predefined-data-types.enum.ts +8 -0
- package/src/_models/dynamobe-api-call-params.ts +62 -0
- package/src/_models/dynamobe-app-params.ts +24 -0
- package/src/_models/dynamobe-data-model-params.ts +23 -0
- package/src/_models/dynamobe-endpoint-control.ts +127 -0
- package/src/_models/dynamobe-global-settings.ts +9 -0
- package/src/_models/fullstack-models/control-models/daily-usage-data.ts +34 -0
- package/src/_models/fullstack-models/control-models/dynamobe-data-property-params.ts +98 -0
- package/src/_models/fullstack-models/control-models/dynamobe-error.ts +207 -0
- package/src/_models/fullstack-models/control-models/geo-ip-location.ts +26 -0
- package/src/_models/fullstack-models/control-models/usage-action.ts +18 -0
- package/src/_models/fullstack-models/control-models/usage-data.ts +26 -0
- package/src/_models/fullstack-models/data-models/custom-data.ts +37 -0
- package/src/_models/fullstack-models/data-models/metadata.ts +28 -0
- package/src/_models/fullstack-models/data-models/usage-session.ts +82 -0
- package/src/_modules/test-route/custom-data.service.ts +21 -0
- package/src/_modules/test-route/test-controller.ts +136 -0
- package/src/_modules/usage-route/usage-controller.ts +114 -0
- package/src/_modules/usage-route/usage.service.ts +125 -0
- package/src/_services/dynamobe-api.service.ts +135 -0
- package/src/_services/dynamobe-app.ts +49 -0
- package/src/_services/dynamobe-auth.service.ts +42 -0
- package/src/_services/dynamobe-controller.service.ts +20 -0
- package/src/_services/dynamobe-data.service.ts +215 -0
- package/src/_services/dynamobe-db-service-collection.service.ts +9 -0
- package/src/_services/dynamobe-db.service.ts +556 -0
- package/src/_services/dynamobe-email-service-collection.service.ts +9 -0
- package/src/_services/dynamobe-email.service.ts +169 -0
- package/src/_services/dynamobe-global.service.ts +99 -0
- package/src/_services/dynamobe-routing-module.service.ts +141 -0
- package/src/_services/dynamobe-server.ts +225 -0
- package/src/_services/dynamobe-shared.service.ts +320 -0
- package/src/_services/dynamobe-singleton.service.ts +16 -0
- package/src/index-newo.ts +71 -0
- package/src/index.ts +50 -0
- package/src/version.json +2 -0
- package/tsconfig.app.json +12 -0
- 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
|
+
}
|