remult 0.14.2 → 0.14.5
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/assign.js +1 -5
- package/classType.js +1 -2
- package/graphql.js +84 -146
- package/index.d.ts +13 -0
- package/index.js +25 -55
- package/inputTypes.js +9 -16
- package/package.json +6 -1
- package/postgres/index.js +1 -4
- package/postgres/postgres-data-provider.js +165 -364
- package/postgres/postgresColumnSyntax.js +4 -8
- package/remult-express.js +6 -10
- package/remult-knex/index.js +300 -720
- package/remult-middleware.js +24 -30
- package/remult-mongo.js +172 -406
- package/server/JsonEntityFileStorage.js +10 -15
- package/server/expressBridge.js +383 -569
- package/server/index.js +4 -11
- package/server/register-actions-on-server.js +12 -38
- package/server/register-entities-on-server.js +9 -13
- package/src/__EntityValueProvider.js +1 -2
- package/src/__RowsOfDataForTesting.js +1 -2
- package/src/backend-tests/backend-database-test-setup.backend-spec.js +72 -190
- package/src/backend-tests/my-test.backend-spec.js +45 -114
- package/src/column-interfaces.js +2 -6
- package/src/column.js +71 -113
- package/src/context.js +174 -330
- package/src/data-api.js +162 -326
- package/src/data-interfaces.js +7 -11
- package/src/data-providers/array-entity-data-provider.js +171 -286
- package/src/data-providers/in-memory-database.js +12 -27
- package/src/data-providers/json-data-provider.js +41 -77
- package/src/data-providers/rest-data-provider.js +102 -189
- package/src/data-providers/sql-database.js +223 -403
- package/src/data-providers/web-sql-data-provider.js +78 -139
- package/src/entity.js +1 -2
- package/src/filter/filter-consumer-bridge-to-sql-request.js +106 -248
- package/src/filter/filter-consumer-bridge-to-url-builder.js +1 -2
- package/src/filter/filter-interfaces.js +277 -440
- package/src/id-entity.js +8 -17
- package/src/remult3/RepositoryImplementation.js +1191 -2367
- package/src/remult3/index.js +2 -5
- package/src/remult3/remult3.js +1 -2
- package/src/server-action.js +294 -528
- package/src/shared-tests/db-tests-setup.js +49 -153
- package/src/shared-tests/db-tests.db-tests.js +660 -1566
- package/src/shared-tests/deleteAll.js +3 -20
- package/src/shared-tests/entityWithValidations.js +52 -79
- package/src/shared-tests/index.js +4 -6
- package/src/shared-tests/test-custom-id-column.spec.js +37 -85
- package/src/shared-tests/test-special-value.spec.js +64 -104
- package/src/shared-tests/test-update-with-null.spec.js +28 -49
- package/src/sort.js +38 -95
- package/src/sql-command.js +1 -2
- package/src/tests/Done.js +7 -13
- package/src/tests/TestDataApiResponse.js +15 -22
- package/src/tests/c.js +21 -27
- package/src/tests/createData.js +20 -48
- package/src/tests/d.js +19 -27
- package/src/tests/dWithPrefilter.js +31 -44
- package/src/tests/entityForCustomFilter.js +42 -66
- package/src/tests/entityWithValidationsOnColumn.js +21 -29
- package/src/tests/frontend-database-tests-setup.spec.js +35 -98
- package/src/tests/h.js +35 -44
- package/src/tests/remult-3-entities.js +71 -80
- package/src/tests/tasks.js +23 -29
- package/src/tests/testHelper.spec.js +170 -322
- package/src/tests/testModel/models.js +25 -33
- package/src/validators.js +32 -59
- package/urlBuilder.js +8 -14
- package/valueConverters.js +161 -160
|
@@ -1,76 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var remult3_1 = require("../remult3");
|
|
6
|
-
var Filter = /** @class */ (function () {
|
|
7
|
-
function Filter(apply) {
|
|
1
|
+
import { getEntityRef, getEntitySettings } from "../remult3";
|
|
2
|
+
export class Filter {
|
|
3
|
+
constructor(apply) {
|
|
8
4
|
this.apply = apply;
|
|
9
5
|
if (!this.apply) {
|
|
10
|
-
this.apply =
|
|
6
|
+
this.apply = () => { };
|
|
11
7
|
}
|
|
12
8
|
}
|
|
13
|
-
|
|
9
|
+
__applyToConsumer(add) {
|
|
14
10
|
this.apply(add);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
};
|
|
29
|
-
Filter.createCustom = function (customFilterTranslator, key) {
|
|
30
|
-
if (key === void 0) { key = ''; }
|
|
31
|
-
var customFilterInfo = { key: key, customFilterTranslator: customFilterTranslator };
|
|
32
|
-
return Object.assign(function (x) {
|
|
33
|
-
var _a;
|
|
34
|
-
var z = {};
|
|
11
|
+
}
|
|
12
|
+
static async resolve(filter) {
|
|
13
|
+
if (typeof filter === "function")
|
|
14
|
+
return await filter();
|
|
15
|
+
return filter;
|
|
16
|
+
}
|
|
17
|
+
static createCustom(customFilterTranslator, key = '') {
|
|
18
|
+
let customFilterInfo = { key: key, customFilterTranslator };
|
|
19
|
+
return Object.assign((x) => {
|
|
20
|
+
let z = {};
|
|
35
21
|
if (x == undefined)
|
|
36
22
|
x = {};
|
|
37
23
|
if (!customFilterInfo.key)
|
|
38
24
|
throw "Usage of custom filter before a key was assigned to it";
|
|
39
|
-
return
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}, { customFilterInfo
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
25
|
+
return {
|
|
26
|
+
[customUrlToken + customFilterInfo.key]: x
|
|
27
|
+
};
|
|
28
|
+
}, { customFilterInfo });
|
|
29
|
+
}
|
|
30
|
+
static fromEntityFilter(entity, whereItem) {
|
|
31
|
+
let result = [];
|
|
32
|
+
for (const key in whereItem) {
|
|
47
33
|
if (Object.prototype.hasOwnProperty.call(whereItem, key)) {
|
|
48
|
-
|
|
34
|
+
let fieldToFilter = whereItem[key];
|
|
49
35
|
{
|
|
50
36
|
if (key == "$or") {
|
|
51
|
-
result.push(new
|
|
37
|
+
result.push(new OrFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
|
|
52
38
|
}
|
|
53
39
|
else if (key == "$and") {
|
|
54
|
-
result.push(new
|
|
40
|
+
result.push(new AndFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
|
|
55
41
|
}
|
|
56
|
-
else if (key.startsWith(
|
|
57
|
-
result.push(new Filter(
|
|
58
|
-
x.custom(key.substring(
|
|
42
|
+
else if (key.startsWith(customUrlToken)) {
|
|
43
|
+
result.push(new Filter(x => {
|
|
44
|
+
x.custom(key.substring(customUrlToken.length), fieldToFilter);
|
|
59
45
|
}));
|
|
60
46
|
}
|
|
61
|
-
else if (key ==
|
|
62
|
-
result.push(new Filter(
|
|
47
|
+
else if (key == customDatabaseFilterToken) {
|
|
48
|
+
result.push(new Filter(x => x.databaseCustom(fieldToFilter)));
|
|
63
49
|
}
|
|
64
50
|
else {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
for (
|
|
71
|
-
if (Object.prototype.hasOwnProperty.call(
|
|
72
|
-
|
|
73
|
-
switch (
|
|
51
|
+
let fh = new filterHelper(entity.fields[key]);
|
|
52
|
+
let found = false;
|
|
53
|
+
if (fieldToFilter !== undefined && fieldToFilter != null) {
|
|
54
|
+
if (fieldToFilter.$id)
|
|
55
|
+
fieldToFilter = fieldToFilter.$id;
|
|
56
|
+
for (const key in fieldToFilter) {
|
|
57
|
+
if (Object.prototype.hasOwnProperty.call(fieldToFilter, key)) {
|
|
58
|
+
const element = fieldToFilter[key];
|
|
59
|
+
switch (key) {
|
|
74
60
|
case "$gte":
|
|
75
61
|
case ">=":
|
|
76
62
|
result.push(fh.isGreaterOrEqualTo(element));
|
|
@@ -107,328 +93,234 @@ var Filter = /** @class */ (function () {
|
|
|
107
93
|
}
|
|
108
94
|
}
|
|
109
95
|
}
|
|
110
|
-
if (Array.isArray(
|
|
96
|
+
if (Array.isArray(fieldToFilter)) {
|
|
111
97
|
found = true;
|
|
112
|
-
result.push(fh.isIn(
|
|
98
|
+
result.push(fh.isIn(fieldToFilter));
|
|
113
99
|
}
|
|
114
100
|
}
|
|
115
|
-
if (!found &&
|
|
116
|
-
result.push(fh.isEqualTo(
|
|
101
|
+
if (!found && fieldToFilter !== undefined) {
|
|
102
|
+
result.push(fh.isEqualTo(fieldToFilter));
|
|
117
103
|
}
|
|
118
104
|
}
|
|
119
105
|
}
|
|
120
106
|
}
|
|
121
|
-
};
|
|
122
|
-
for (var key in whereItem) {
|
|
123
|
-
_loop_1(key);
|
|
124
107
|
}
|
|
125
|
-
return new
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
108
|
+
return new AndFilter(...result);
|
|
109
|
+
}
|
|
110
|
+
toJson() {
|
|
111
|
+
let r = new FilterSerializer();
|
|
129
112
|
this.__applyToConsumer(r);
|
|
130
113
|
return r.result;
|
|
131
|
-
}
|
|
132
|
-
|
|
114
|
+
}
|
|
115
|
+
static entityFilterToJson(entityDefs, where) {
|
|
133
116
|
return Filter.fromEntityFilter(entityDefs, where).toJson();
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return buildFilterFromRequestParameters(entityDefs, { get:
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
return tslib_1.__generator(this, function (_h) {
|
|
148
|
-
switch (_h.label) {
|
|
149
|
-
case 0:
|
|
150
|
-
r = [];
|
|
151
|
-
_a = [];
|
|
152
|
-
for (_b in entity.entityType)
|
|
153
|
-
_a.push(_b);
|
|
154
|
-
_i = 0;
|
|
155
|
-
_h.label = 1;
|
|
156
|
-
case 1:
|
|
157
|
-
if (!(_i < _a.length)) return [3 /*break*/, 5];
|
|
158
|
-
key = _a[_i];
|
|
159
|
-
element = entity.entityType[key];
|
|
160
|
-
if (!(element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator)) return [3 /*break*/, 4];
|
|
161
|
-
if (!(element.customFilterInfo.key == filterKey)) return [3 /*break*/, 4];
|
|
162
|
-
_d = (_c = r).push;
|
|
163
|
-
_f = (_e = Filter).fromEntityFilter;
|
|
164
|
-
_g = [entity];
|
|
165
|
-
return [4 /*yield*/, element.customFilterInfo.customFilterTranslator(remult, custom)];
|
|
166
|
-
case 2: return [4 /*yield*/, _f.apply(_e, _g.concat([_h.sent()]))];
|
|
167
|
-
case 3:
|
|
168
|
-
_d.apply(_c, [_h.sent()]);
|
|
169
|
-
_h.label = 4;
|
|
170
|
-
case 4:
|
|
171
|
-
_i++;
|
|
172
|
-
return [3 /*break*/, 1];
|
|
173
|
-
case 5: return [2 /*return*/, r];
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}); });
|
|
177
|
-
r.__applyToConsumer(f);
|
|
178
|
-
return [4 /*yield*/, f.resolve()];
|
|
179
|
-
case 1:
|
|
180
|
-
_a.sent();
|
|
181
|
-
r = new Filter(function (x) { return f.applyTo(x); });
|
|
182
|
-
return [2 /*return*/, r];
|
|
117
|
+
}
|
|
118
|
+
static entityFilterFromJson(entityDefs, packed) {
|
|
119
|
+
return buildFilterFromRequestParameters(entityDefs, { get: (key) => packed[key] });
|
|
120
|
+
}
|
|
121
|
+
static async translateCustomWhere(r, entity, remult) {
|
|
122
|
+
let f = new customTranslator(async (filterKey, custom) => {
|
|
123
|
+
let r = [];
|
|
124
|
+
for (const key in entity.entityType) {
|
|
125
|
+
const element = entity.entityType[key];
|
|
126
|
+
if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
|
|
127
|
+
if (element.customFilterInfo.key == filterKey) {
|
|
128
|
+
r.push(await Filter.fromEntityFilter(entity, await element.customFilterInfo.customFilterTranslator(remult, custom)));
|
|
129
|
+
}
|
|
183
130
|
}
|
|
184
|
-
}
|
|
131
|
+
}
|
|
132
|
+
return r;
|
|
185
133
|
});
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
134
|
+
r.__applyToConsumer(f);
|
|
135
|
+
await f.resolve();
|
|
136
|
+
r = new Filter(x => f.applyTo(x));
|
|
137
|
+
return r;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export class filterHelper {
|
|
141
|
+
constructor(metadata) {
|
|
192
142
|
this.metadata = metadata;
|
|
193
143
|
}
|
|
194
|
-
|
|
195
|
-
|
|
144
|
+
processVal(val) {
|
|
145
|
+
let ei = getEntitySettings(this.metadata.valueType, false);
|
|
196
146
|
if (ei) {
|
|
197
147
|
if (!val)
|
|
198
148
|
return null;
|
|
199
149
|
if (typeof val === "string" || typeof val === "number")
|
|
200
150
|
return val;
|
|
201
|
-
return
|
|
151
|
+
return getEntityRef(val).getId();
|
|
202
152
|
}
|
|
203
153
|
return val;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
filterHelper.prototype.isLessThan = function (val) {
|
|
210
|
-
var _this = this;
|
|
154
|
+
}
|
|
155
|
+
contains(val) {
|
|
156
|
+
return new Filter(add => add.containsCaseInsensitive(this.metadata, val));
|
|
157
|
+
}
|
|
158
|
+
isLessThan(val) {
|
|
211
159
|
val = this.processVal(val);
|
|
212
|
-
return new Filter(
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
var _this = this;
|
|
160
|
+
return new Filter(add => add.isLessThan(this.metadata, val));
|
|
161
|
+
}
|
|
162
|
+
isGreaterOrEqualTo(val) {
|
|
216
163
|
val = this.processVal(val);
|
|
217
|
-
return new Filter(
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
try {
|
|
224
|
-
for (var values_1 = tslib_1.__values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
|
|
225
|
-
var v = values_1_1.value;
|
|
226
|
-
add.isDifferentFrom(_this.metadata, _this.processVal(v));
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
230
|
-
finally {
|
|
231
|
-
try {
|
|
232
|
-
if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
|
|
233
|
-
}
|
|
234
|
-
finally { if (e_1) throw e_1.error; }
|
|
164
|
+
return new Filter(add => add.isGreaterOrEqualTo(this.metadata, val));
|
|
165
|
+
}
|
|
166
|
+
isNotIn(values) {
|
|
167
|
+
return new Filter(add => {
|
|
168
|
+
for (const v of values) {
|
|
169
|
+
add.isDifferentFrom(this.metadata, this.processVal(v));
|
|
235
170
|
}
|
|
236
171
|
});
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
var _this = this;
|
|
172
|
+
}
|
|
173
|
+
isDifferentFrom(val) {
|
|
240
174
|
val = this.processVal(val);
|
|
241
175
|
if ((val === null || val === undefined) && this.metadata.allowNull)
|
|
242
|
-
return new Filter(
|
|
243
|
-
return new Filter(
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
var _this = this;
|
|
176
|
+
return new Filter(add => add.isNotNull(this.metadata));
|
|
177
|
+
return new Filter(add => add.isDifferentFrom(this.metadata, val));
|
|
178
|
+
}
|
|
179
|
+
isLessOrEqualTo(val) {
|
|
247
180
|
val = this.processVal(val);
|
|
248
|
-
return new Filter(
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
var _this = this;
|
|
181
|
+
return new Filter(add => add.isLessOrEqualTo(this.metadata, val));
|
|
182
|
+
}
|
|
183
|
+
isGreaterThan(val) {
|
|
252
184
|
val = this.processVal(val);
|
|
253
|
-
return new Filter(
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
var _this = this;
|
|
185
|
+
return new Filter(add => add.isGreaterThan(this.metadata, val));
|
|
186
|
+
}
|
|
187
|
+
isEqualTo(val) {
|
|
257
188
|
val = this.processVal(val);
|
|
258
189
|
if ((val === null || val === undefined) && this.metadata.allowNull)
|
|
259
|
-
return new Filter(
|
|
260
|
-
return new Filter(
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
var filters = [];
|
|
274
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
275
|
-
filters[_i] = arguments[_i];
|
|
276
|
-
}
|
|
277
|
-
var _this = _super.call(this, function (add) {
|
|
278
|
-
var e_2, _a;
|
|
279
|
-
try {
|
|
280
|
-
for (var _b = tslib_1.__values(_this.filters), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
281
|
-
var iterator = _c.value;
|
|
282
|
-
if (iterator)
|
|
283
|
-
iterator.__applyToConsumer(add);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
287
|
-
finally {
|
|
288
|
-
try {
|
|
289
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
290
|
-
}
|
|
291
|
-
finally { if (e_2) throw e_2.error; }
|
|
190
|
+
return new Filter(add => add.isNull(this.metadata));
|
|
191
|
+
return new Filter(add => add.isEqualTo(this.metadata, val));
|
|
192
|
+
}
|
|
193
|
+
isIn(val) {
|
|
194
|
+
val = val.map(x => this.processVal(x));
|
|
195
|
+
return new Filter(add => add.isIn(this.metadata, val));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export class AndFilter extends Filter {
|
|
199
|
+
constructor(...filters) {
|
|
200
|
+
super(add => {
|
|
201
|
+
for (const iterator of this.filters) {
|
|
202
|
+
if (iterator)
|
|
203
|
+
iterator.__applyToConsumer(add);
|
|
292
204
|
}
|
|
293
|
-
})
|
|
294
|
-
|
|
295
|
-
return _this;
|
|
205
|
+
});
|
|
206
|
+
this.filters = filters;
|
|
296
207
|
}
|
|
297
|
-
|
|
208
|
+
add(filter) {
|
|
298
209
|
this.filters.push(filter);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
function OrFilter() {
|
|
306
|
-
var filters = [];
|
|
307
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
308
|
-
filters[_i] = arguments[_i];
|
|
309
|
-
}
|
|
310
|
-
var _this = _super.call(this, function (add) {
|
|
311
|
-
var f = _this.filters.filter(function (x) { return x !== undefined; });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export class OrFilter extends Filter {
|
|
213
|
+
constructor(...filters) {
|
|
214
|
+
super(add => {
|
|
215
|
+
let f = this.filters.filter(x => x !== undefined);
|
|
312
216
|
if (f.length > 1) {
|
|
313
217
|
add.or(f);
|
|
314
218
|
}
|
|
315
219
|
else if (f.length == 1)
|
|
316
220
|
f[0].__applyToConsumer(add);
|
|
317
|
-
})
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
exports.customDatabaseFilterToken = "$db$";
|
|
326
|
-
var FilterSerializer = /** @class */ (function () {
|
|
327
|
-
function FilterSerializer() {
|
|
221
|
+
});
|
|
222
|
+
this.filters = filters;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
export const customUrlToken = "$custom$";
|
|
226
|
+
export const customDatabaseFilterToken = "$db$";
|
|
227
|
+
export class FilterSerializer {
|
|
228
|
+
constructor() {
|
|
328
229
|
this.result = {};
|
|
329
230
|
this.hasUndefined = false;
|
|
330
231
|
}
|
|
331
|
-
|
|
232
|
+
databaseCustom(databaseCustom) {
|
|
332
233
|
throw new Error("database custom is not allowed with api calls.");
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
this.add(
|
|
336
|
-
}
|
|
337
|
-
|
|
234
|
+
}
|
|
235
|
+
custom(key, customItem) {
|
|
236
|
+
this.add(customUrlToken + key, customItem);
|
|
237
|
+
}
|
|
238
|
+
add(key, val) {
|
|
338
239
|
if (val === undefined)
|
|
339
240
|
this.hasUndefined = true;
|
|
340
|
-
|
|
241
|
+
let r = this.result;
|
|
341
242
|
if (!r[key]) {
|
|
342
243
|
r[key] = val;
|
|
343
244
|
return;
|
|
344
245
|
}
|
|
345
|
-
|
|
246
|
+
let v = r[key];
|
|
346
247
|
if (v instanceof Array) {
|
|
347
248
|
v.push(val);
|
|
348
249
|
}
|
|
349
250
|
else
|
|
350
251
|
v = [v, val];
|
|
351
252
|
r[key] = v;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
this.add("OR", orElements.map(
|
|
355
|
-
|
|
253
|
+
}
|
|
254
|
+
or(orElements) {
|
|
255
|
+
this.add("OR", orElements.map(x => {
|
|
256
|
+
let f = new FilterSerializer();
|
|
356
257
|
x.__applyToConsumer(f);
|
|
357
258
|
return f.result;
|
|
358
259
|
}));
|
|
359
|
-
}
|
|
360
|
-
|
|
260
|
+
}
|
|
261
|
+
isNull(col) {
|
|
361
262
|
this.add(col.key + "_null", true);
|
|
362
|
-
}
|
|
363
|
-
|
|
263
|
+
}
|
|
264
|
+
isNotNull(col) {
|
|
364
265
|
this.add(col.key + "_null", false);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
this.add(col.key + "_in", val.map(
|
|
368
|
-
}
|
|
369
|
-
|
|
266
|
+
}
|
|
267
|
+
isIn(col, val) {
|
|
268
|
+
this.add(col.key + "_in", val.map(x => col.valueConverter.toJson(x)));
|
|
269
|
+
}
|
|
270
|
+
isEqualTo(col, val) {
|
|
370
271
|
this.add(col.key, col.valueConverter.toJson(val));
|
|
371
|
-
}
|
|
372
|
-
|
|
272
|
+
}
|
|
273
|
+
isDifferentFrom(col, val) {
|
|
373
274
|
this.add(col.key + '_ne', col.valueConverter.toJson(val));
|
|
374
|
-
}
|
|
375
|
-
|
|
275
|
+
}
|
|
276
|
+
isGreaterOrEqualTo(col, val) {
|
|
376
277
|
this.add(col.key + '_gte', col.valueConverter.toJson(val));
|
|
377
|
-
}
|
|
378
|
-
|
|
278
|
+
}
|
|
279
|
+
isGreaterThan(col, val) {
|
|
379
280
|
this.add(col.key + '_gt', col.valueConverter.toJson(val));
|
|
380
|
-
}
|
|
381
|
-
|
|
281
|
+
}
|
|
282
|
+
isLessOrEqualTo(col, val) {
|
|
382
283
|
this.add(col.key + '_lte', col.valueConverter.toJson(val));
|
|
383
|
-
}
|
|
384
|
-
|
|
284
|
+
}
|
|
285
|
+
isLessThan(col, val) {
|
|
385
286
|
this.add(col.key + '_lt', col.valueConverter.toJson(val));
|
|
386
|
-
}
|
|
387
|
-
|
|
287
|
+
}
|
|
288
|
+
containsCaseInsensitive(col, val) {
|
|
388
289
|
this.add(col.key + "_contains", val);
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
exports.FilterSerializer = FilterSerializer;
|
|
393
|
-
function entityFilterToJson(entityDefs, where) {
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
export function entityFilterToJson(entityDefs, where) {
|
|
394
293
|
if (!where)
|
|
395
294
|
return {};
|
|
396
295
|
return (Filter.fromEntityFilter(entityDefs, where)).toJson();
|
|
397
296
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
var _a, _b;
|
|
404
|
-
function addFilter(operation, theFilter, jsonArray, asString) {
|
|
405
|
-
var e_3, _a;
|
|
406
|
-
if (jsonArray === void 0) { jsonArray = false; }
|
|
407
|
-
if (asString === void 0) { asString = false; }
|
|
408
|
-
var val = filterInfo.get(col.key + operation);
|
|
297
|
+
export function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
298
|
+
let where = [];
|
|
299
|
+
[...entity.fields].forEach(col => {
|
|
300
|
+
function addFilter(operation, theFilter, jsonArray = false, asString = false) {
|
|
301
|
+
let val = filterInfo.get(col.key + operation);
|
|
409
302
|
if (val !== undefined) {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
var theVal = val;
|
|
303
|
+
let addFilter = (val) => {
|
|
304
|
+
let theVal = val;
|
|
413
305
|
if (jsonArray) {
|
|
414
|
-
|
|
306
|
+
let arr;
|
|
415
307
|
if (typeof val === 'string')
|
|
416
308
|
arr = JSON.parse(val);
|
|
417
309
|
else
|
|
418
310
|
arr = val;
|
|
419
|
-
theVal = arr.map(
|
|
311
|
+
theVal = arr.map(x => asString ? x : col.valueConverter.fromJson(x));
|
|
420
312
|
}
|
|
421
313
|
else {
|
|
422
314
|
theVal = asString ? theVal : col.valueConverter.fromJson(theVal);
|
|
423
315
|
}
|
|
424
|
-
|
|
316
|
+
let f = theFilter(theVal);
|
|
425
317
|
if (f !== undefined) {
|
|
426
|
-
where.push(
|
|
318
|
+
where.push({ [col.key]: f });
|
|
427
319
|
}
|
|
428
320
|
};
|
|
429
321
|
if (!jsonArray && val instanceof Array) {
|
|
430
|
-
val.forEach(
|
|
431
|
-
|
|
322
|
+
val.forEach(v => {
|
|
323
|
+
addFilter(v);
|
|
432
324
|
});
|
|
433
325
|
}
|
|
434
326
|
else {
|
|
@@ -436,31 +328,21 @@ function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
|
436
328
|
if (typeof val === 'string')
|
|
437
329
|
val = JSON.parse(val);
|
|
438
330
|
}
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
var x = array_1_1.value;
|
|
443
|
-
addFilter_1(x);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
447
|
-
finally {
|
|
448
|
-
try {
|
|
449
|
-
if (array_1_1 && !array_1_1.done && (_a = array_1.return)) _a.call(array_1);
|
|
450
|
-
}
|
|
451
|
-
finally { if (e_3) throw e_3.error; }
|
|
331
|
+
const array = separateArrayFromInnerArray(val);
|
|
332
|
+
for (const x of array) {
|
|
333
|
+
addFilter(x);
|
|
452
334
|
}
|
|
453
335
|
}
|
|
454
336
|
}
|
|
455
337
|
}
|
|
456
|
-
|
|
457
|
-
addFilter('',
|
|
458
|
-
addFilter('_gt',
|
|
459
|
-
addFilter('_gte',
|
|
460
|
-
addFilter('_lt',
|
|
461
|
-
addFilter('_lte',
|
|
462
|
-
addFilter('_ne',
|
|
463
|
-
addFilter('_in',
|
|
338
|
+
let c = new filterHelper(col);
|
|
339
|
+
addFilter('', val => val);
|
|
340
|
+
addFilter('_gt', val => ({ "$gt": val }));
|
|
341
|
+
addFilter('_gte', val => ({ "$gte": val }));
|
|
342
|
+
addFilter('_lt', val => ({ "$lt": val }));
|
|
343
|
+
addFilter('_lte', val => ({ "$lte": val }));
|
|
344
|
+
addFilter('_ne', val => ({ "$ne": val }));
|
|
345
|
+
addFilter('_in', val => val, true);
|
|
464
346
|
var nullFilter = filterInfo.get(col.key + "_null");
|
|
465
347
|
if (nullFilter) {
|
|
466
348
|
nullFilter = nullFilter.toString().trim().toLowerCase();
|
|
@@ -468,163 +350,118 @@ function buildFilterFromRequestParameters(entity, filterInfo) {
|
|
|
468
350
|
case "y":
|
|
469
351
|
case "true":
|
|
470
352
|
case "yes":
|
|
471
|
-
where.push(
|
|
353
|
+
where.push({ [col.key]: null });
|
|
472
354
|
break;
|
|
473
355
|
default:
|
|
474
|
-
where.push(
|
|
356
|
+
where.push({ [col.key]: { "$ne": null } });
|
|
475
357
|
break;
|
|
476
358
|
}
|
|
477
359
|
}
|
|
478
|
-
addFilter('_contains',
|
|
360
|
+
addFilter('_contains', val => ({ $contains: val }), false, true);
|
|
479
361
|
});
|
|
480
|
-
|
|
362
|
+
let val = filterInfo.get('OR');
|
|
481
363
|
if (val) {
|
|
482
|
-
|
|
364
|
+
const array = separateArrayFromInnerArray(val);
|
|
483
365
|
where.push({
|
|
484
|
-
$and: array.map(
|
|
485
|
-
$or: v.map(
|
|
486
|
-
|
|
487
|
-
})
|
|
488
|
-
}); })
|
|
366
|
+
$and: array.map(v => ({
|
|
367
|
+
$or: v.map(x => buildFilterFromRequestParameters(entity, { get: (key) => x[key] }))
|
|
368
|
+
}))
|
|
489
369
|
});
|
|
490
370
|
}
|
|
491
|
-
for (
|
|
492
|
-
|
|
371
|
+
for (const key in entity.entityType) {
|
|
372
|
+
const element = entity.entityType[key];
|
|
493
373
|
if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
|
|
494
|
-
|
|
374
|
+
let custom = filterInfo.get(customUrlToken + key);
|
|
495
375
|
if (custom !== undefined) {
|
|
496
|
-
where.push(
|
|
376
|
+
where.push({ [customUrlToken + key]: custom });
|
|
497
377
|
}
|
|
498
378
|
}
|
|
499
379
|
}
|
|
500
380
|
return { $and: where };
|
|
501
381
|
function separateArrayFromInnerArray(val) {
|
|
502
|
-
var e_4, _a;
|
|
503
382
|
if (!Array.isArray(val))
|
|
504
383
|
return [val];
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
if (Array.isArray(v)) {
|
|
510
|
-
array.push(v);
|
|
511
|
-
}
|
|
512
|
-
else
|
|
513
|
-
nonArray.push(v);
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
517
|
-
finally {
|
|
518
|
-
try {
|
|
519
|
-
if (val_1_1 && !val_1_1.done && (_a = val_1.return)) _a.call(val_1);
|
|
384
|
+
const nonArray = [], array = [];
|
|
385
|
+
for (const v of val) {
|
|
386
|
+
if (Array.isArray(v)) {
|
|
387
|
+
array.push(v);
|
|
520
388
|
}
|
|
521
|
-
|
|
389
|
+
else
|
|
390
|
+
nonArray.push(v);
|
|
522
391
|
}
|
|
523
392
|
array.push(nonArray);
|
|
524
393
|
return array;
|
|
525
394
|
}
|
|
526
395
|
}
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
function customTranslator(translateCustom) {
|
|
396
|
+
class customTranslator {
|
|
397
|
+
constructor(translateCustom) {
|
|
530
398
|
this.translateCustom = translateCustom;
|
|
531
399
|
this.commands = [];
|
|
532
400
|
this.promises = [];
|
|
533
401
|
}
|
|
534
|
-
|
|
535
|
-
this.commands.forEach(
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
c = new customTranslator(this.translateCustom);
|
|
546
|
-
element.__applyToConsumer(c);
|
|
547
|
-
return [4 /*yield*/, c.resolve()];
|
|
548
|
-
case 1:
|
|
549
|
-
_a.sent();
|
|
550
|
-
return [2 /*return*/, new Filter(function (x) { return c.applyTo(x); })];
|
|
551
|
-
}
|
|
552
|
-
});
|
|
553
|
-
}); })).then(function (x) {
|
|
402
|
+
applyTo(x) {
|
|
403
|
+
this.commands.forEach(y => y(x));
|
|
404
|
+
}
|
|
405
|
+
or(orElements) {
|
|
406
|
+
let newOrElements;
|
|
407
|
+
this.promises.push(Promise.all(orElements.map(async (element) => {
|
|
408
|
+
let c = new customTranslator(this.translateCustom);
|
|
409
|
+
element.__applyToConsumer(c);
|
|
410
|
+
await c.resolve();
|
|
411
|
+
return new Filter(x => c.applyTo(x));
|
|
412
|
+
})).then(x => {
|
|
554
413
|
newOrElements = x;
|
|
555
414
|
}));
|
|
556
|
-
this.commands.push(
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
this.commands.push(
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
this.commands.push(
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
this.commands.push(
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
this.commands.push(
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
this.commands.push(
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
this.commands.push(
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
this.commands.push(
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
this.commands.push(
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
this.commands.push(
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
this.commands.push(
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
this.commands.push(function (x) { return x.databaseCustom(custom); });
|
|
610
|
-
};
|
|
611
|
-
customTranslator.prototype.resolve = function () {
|
|
612
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
613
|
-
var p;
|
|
614
|
-
return tslib_1.__generator(this, function (_a) {
|
|
615
|
-
switch (_a.label) {
|
|
616
|
-
case 0:
|
|
617
|
-
if (!(this.promises.length > 0)) return [3 /*break*/, 2];
|
|
618
|
-
p = this.promises;
|
|
619
|
-
this.promises = [];
|
|
620
|
-
return [4 /*yield*/, Promise.all(p)];
|
|
621
|
-
case 1:
|
|
622
|
-
_a.sent();
|
|
623
|
-
return [3 /*break*/, 0];
|
|
624
|
-
case 2: return [2 /*return*/];
|
|
625
|
-
}
|
|
626
|
-
});
|
|
627
|
-
});
|
|
628
|
-
};
|
|
629
|
-
return customTranslator;
|
|
630
|
-
}());
|
|
415
|
+
this.commands.push(x => x.or(newOrElements));
|
|
416
|
+
}
|
|
417
|
+
isEqualTo(col, val) {
|
|
418
|
+
this.commands.push(x => x.isEqualTo(col, val));
|
|
419
|
+
}
|
|
420
|
+
isDifferentFrom(col, val) {
|
|
421
|
+
this.commands.push(x => x.isDifferentFrom(col, val));
|
|
422
|
+
}
|
|
423
|
+
isNull(col) {
|
|
424
|
+
this.commands.push(x => x.isNull(col));
|
|
425
|
+
}
|
|
426
|
+
isNotNull(col) {
|
|
427
|
+
this.commands.push(x => x.isNotNull(col));
|
|
428
|
+
}
|
|
429
|
+
isGreaterOrEqualTo(col, val) {
|
|
430
|
+
this.commands.push(x => x.isGreaterOrEqualTo(col, val));
|
|
431
|
+
}
|
|
432
|
+
isGreaterThan(col, val) {
|
|
433
|
+
this.commands.push(x => x.isGreaterThan(col, val));
|
|
434
|
+
}
|
|
435
|
+
isLessOrEqualTo(col, val) {
|
|
436
|
+
this.commands.push(x => x.isLessOrEqualTo(col, val));
|
|
437
|
+
}
|
|
438
|
+
isLessThan(col, val) {
|
|
439
|
+
this.commands.push(x => x.isLessThan(col, val));
|
|
440
|
+
}
|
|
441
|
+
containsCaseInsensitive(col, val) {
|
|
442
|
+
this.commands.push(x => x.containsCaseInsensitive(col, val));
|
|
443
|
+
}
|
|
444
|
+
isIn(col, val) {
|
|
445
|
+
this.commands.push(x => x.isIn(col, val));
|
|
446
|
+
}
|
|
447
|
+
custom(key, customItem) {
|
|
448
|
+
this.promises.push((async () => {
|
|
449
|
+
let r = await this.translateCustom(key, customItem);
|
|
450
|
+
if (r)
|
|
451
|
+
if (Array.isArray(r))
|
|
452
|
+
r.forEach(x => x.__applyToConsumer(this));
|
|
453
|
+
else
|
|
454
|
+
r.__applyToConsumer(this);
|
|
455
|
+
})());
|
|
456
|
+
}
|
|
457
|
+
databaseCustom(custom) {
|
|
458
|
+
this.commands.push(x => x.databaseCustom(custom));
|
|
459
|
+
}
|
|
460
|
+
async resolve() {
|
|
461
|
+
while (this.promises.length > 0) {
|
|
462
|
+
let p = this.promises;
|
|
463
|
+
this.promises = [];
|
|
464
|
+
await Promise.all(p);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|