@lenne.tech/nest-server 8.0.2 → 8.3.0
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/dist/config.env.js +3 -2
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +1 -1
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/restricted.decorator.d.ts +3 -0
- package/dist/core/common/decorators/restricted.decorator.js +14 -8
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/enums/role.enum.d.ts +3 -2
- package/dist/core/common/enums/role.enum.js +3 -2
- package/dist/core/common/enums/role.enum.js.map +1 -1
- package/dist/core/common/helpers/config.helper.d.ts +2 -1
- package/dist/core/common/helpers/config.helper.js +11 -7
- package/dist/core/common/helpers/config.helper.js.map +1 -1
- package/dist/core/common/helpers/context.helper.d.ts +7 -1
- package/dist/core/common/helpers/context.helper.js +33 -29
- package/dist/core/common/helpers/context.helper.js.map +1 -1
- package/dist/core/common/helpers/db.helper.d.ts +37 -0
- package/dist/core/common/helpers/db.helper.js +356 -0
- package/dist/core/common/helpers/db.helper.js.map +1 -0
- package/dist/core/common/helpers/file.helper.d.ts +8 -1
- package/dist/core/common/helpers/file.helper.js +43 -31
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +3 -0
- package/dist/core/common/helpers/filter.helper.js +93 -81
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
- package/dist/core/common/helpers/graphql.helper.js +144 -96
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.d.ts +42 -4
- package/dist/core/common/helpers/input.helper.js +256 -97
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.d.ts +11 -0
- package/dist/core/common/helpers/model.helper.js +41 -29
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.d.ts +21 -1
- package/dist/core/common/helpers/service.helper.js +80 -72
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +1 -1
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/core-input.input.js +1 -1
- package/dist/core/common/inputs/core-input.input.js.map +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
- package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
- package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
- package/dist/core/common/interfaces/service-options.interface.d.ts +36 -0
- package/dist/core/common/interfaces/service-options.interface.js +3 -0
- package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
- package/dist/core/common/models/core-model.model.d.ts +5 -1
- package/dist/core/common/models/core-model.model.js +1 -1
- package/dist/core/common/models/core-model.model.js.map +1 -1
- package/dist/core/common/pipes/check-input.pipe.js +2 -2
- package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
- package/dist/core/common/services/crud.service.d.ts +13 -0
- package/dist/core/common/services/crud.service.js +57 -0
- package/dist/core/common/services/crud.service.js.map +1 -0
- package/dist/core/common/services/email.service.js +8 -8
- package/dist/core/common/services/email.service.js.map +1 -1
- package/dist/core/common/services/module.service.d.ts +40 -0
- package/dist/core/common/services/module.service.js +80 -0
- package/dist/core/common/services/module.service.js.map +1 -0
- package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
- package/dist/core/common/types/core-model-constructor.type.js +3 -0
- package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
- package/dist/core/common/types/field-selection.type.d.ts +4 -0
- package/dist/core/common/types/field-selection.type.js +3 -0
- package/dist/core/common/types/field-selection.type.js.map +1 -0
- package/dist/core/common/types/ids.type.d.ts +8 -0
- package/dist/core/common/types/ids.type.js +3 -0
- package/dist/core/common/types/ids.type.js.map +1 -0
- package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
- package/dist/core/common/types/string-or-object-id.type.js +3 -0
- package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
- package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
- package/dist/core/modules/auth/core-auth.resolver.js +4 -3
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +1 -2
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
- package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
- package/dist/core/modules/auth/services/core-auth.service.js +6 -4
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/user/core-user.model.js +1 -1
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +16 -25
- package/dist/core/modules/user/core-user.service.js +69 -90
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core.module.js +1 -1
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
- package/dist/server/modules/auth/auth.resolver.js +4 -3
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +1 -1
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +2 -2
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +2 -1
- package/dist/server/modules/user/user.module.js +7 -3
- package/dist/server/modules/user/user.module.js.map +1 -1
- package/dist/server/modules/user/user.resolver.d.ts +8 -7
- package/dist/server/modules/user/user.resolver.js +85 -49
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.d.ts +9 -18
- package/dist/server/modules/user/user.service.js +23 -30
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/test/test.helper.d.ts +1 -2
- package/dist/test/test.helper.js +1 -16
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +58 -59
- package/src/config.env.ts +3 -2
- package/src/core/common/args/pagination.args.ts +2 -2
- package/src/core/common/decorators/restricted.decorator.ts +24 -12
- package/src/core/common/enums/role.enum.ts +23 -5
- package/src/core/common/helpers/config.helper.ts +26 -6
- package/src/core/common/helpers/context.helper.ts +42 -33
- package/src/core/common/helpers/db.helper.ts +595 -0
- package/src/core/common/helpers/file.helper.ts +76 -49
- package/src/core/common/helpers/filter.helper.ts +119 -96
- package/src/core/common/helpers/graphql.helper.ts +219 -117
- package/src/core/common/helpers/input.helper.ts +349 -108
- package/src/core/common/helpers/model.helper.ts +102 -57
- package/src/core/common/helpers/service.helper.ts +149 -117
- package/src/core/common/inputs/combined-filter.input.ts +2 -2
- package/src/core/common/inputs/core-input.input.ts +2 -2
- package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
- package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
- package/src/core/common/interfaces/service-options.interface.ts +71 -0
- package/src/core/common/models/core-model.model.ts +7 -3
- package/src/core/common/pipes/check-input.pipe.ts +4 -4
- package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
- package/src/core/common/services/crud.service.ts +100 -0
- package/src/core/common/services/email.service.ts +9 -9
- package/src/core/common/services/module.service.ts +188 -0
- package/src/core/common/types/core-model-constructor.type.ts +30 -0
- package/src/core/common/types/field-selection.type.ts +8 -0
- package/src/core/common/types/ids.type.ts +7 -0
- package/src/core/common/types/string-or-object-id.type.ts +3 -0
- package/src/core/modules/auth/core-auth.module.ts +1 -1
- package/src/core/modules/auth/core-auth.resolver.ts +8 -3
- package/src/core/modules/auth/guards/roles.guard.ts +5 -7
- package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
- package/src/core/modules/auth/services/core-auth.service.ts +14 -4
- package/src/core/modules/user/core-user.model.ts +2 -1
- package/src/core/modules/user/core-user.service.ts +115 -185
- package/src/core.module.ts +2 -2
- package/src/index.ts +9 -1
- package/src/main.ts +1 -1
- package/src/server/modules/auth/auth.resolver.ts +8 -3
- package/src/server/modules/file/file.controller.ts +2 -2
- package/src/server/modules/user/avatar.controller.ts +3 -3
- package/src/server/modules/user/user.module.ts +7 -3
- package/src/server/modules/user/user.resolver.ts +74 -43
- package/src/server/modules/user/user.service.ts +30 -53
- package/src/test/test.helper.ts +31 -30
- package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
- package/dist/core/modules/user/core-basic-user.service.js +0 -73
- package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
- package/src/core/modules/user/core-basic-user.service.ts +0 -138
|
@@ -4,39 +4,22 @@ import { extname } from 'path';
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Helper class for inputs
|
|
7
|
+
* @deprecated use functions directly
|
|
7
8
|
*/
|
|
8
|
-
export class FileHelper {
|
|
9
|
+
export default class FileHelper {
|
|
9
10
|
/**
|
|
10
11
|
* Get function to generate a random file name for multer with a certain
|
|
11
12
|
* number of digits
|
|
12
13
|
*/
|
|
13
14
|
public static multerRandomFileName(numberOfDigits = 32) {
|
|
14
|
-
return (
|
|
15
|
-
// Generating a random string
|
|
16
|
-
const randomName = Array(numberOfDigits)
|
|
17
|
-
.fill(null)
|
|
18
|
-
.map(() => Math.round(Math.random() * 16).toString(16))
|
|
19
|
-
.join('');
|
|
20
|
-
|
|
21
|
-
// Calling the callback passing the random name generated with the
|
|
22
|
-
// original extension name
|
|
23
|
-
cb(null, `${randomName}${extname(file.originalname)}`);
|
|
24
|
-
};
|
|
15
|
+
return multerRandomFileName(numberOfDigits);
|
|
25
16
|
}
|
|
26
17
|
|
|
27
18
|
/**
|
|
28
19
|
* Get function to filter files for multer with a certain mimetype & extname
|
|
29
20
|
*/
|
|
30
21
|
public static multerFileFilter(fileTypeRegex = /jpeg|jpg|png/) {
|
|
31
|
-
return (
|
|
32
|
-
const mimetype = fileTypeRegex.test(file.mimetype);
|
|
33
|
-
const extName = fileTypeRegex.test(extname(file.originalname).toLowerCase());
|
|
34
|
-
|
|
35
|
-
if (mimetype && extName) {
|
|
36
|
-
return cb(null, true);
|
|
37
|
-
}
|
|
38
|
-
cb('Error: File upload only supports the following filetypes - ' + fileTypeRegex);
|
|
39
|
-
};
|
|
22
|
+
return multerFileFilter(fileTypeRegex);
|
|
40
23
|
}
|
|
41
24
|
|
|
42
25
|
/**
|
|
@@ -47,36 +30,80 @@ export class FileHelper {
|
|
|
47
30
|
fileSize?: number;
|
|
48
31
|
fileTypeRegex?: RegExp;
|
|
49
32
|
}): MulterOptions {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
33
|
+
return multerOptionsForImageUpload(options);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get function to generate a random file name for multer with a certain
|
|
39
|
+
* number of digits
|
|
40
|
+
*/
|
|
41
|
+
export function multerRandomFileName(numberOfDigits = 32) {
|
|
42
|
+
return (req, file, cb) => {
|
|
43
|
+
// Generating a random string
|
|
44
|
+
const randomName = Array(numberOfDigits)
|
|
45
|
+
.fill(null)
|
|
46
|
+
.map(() => Math.round(Math.random() * 16).toString(16))
|
|
47
|
+
.join('');
|
|
48
|
+
|
|
49
|
+
// Calling the callback passing the random name generated with the
|
|
50
|
+
// original extension name
|
|
51
|
+
cb(null, `${randomName}${extname(file.originalname)}`);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
58
54
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Get function to filter files for multer with a certain mimetype & extname
|
|
57
|
+
*/
|
|
58
|
+
export function multerFileFilter(fileTypeRegex = /jpeg|jpg|png/) {
|
|
59
|
+
return (req, file, cb) => {
|
|
60
|
+
const mimetype = fileTypeRegex.test(file.mimetype);
|
|
61
|
+
const extName = fileTypeRegex.test(extname(file.originalname).toLowerCase());
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
if (mimetype && extName) {
|
|
64
|
+
return cb(null, true);
|
|
65
|
+
}
|
|
66
|
+
cb('Error: File upload only supports the following filetypes - ' + fileTypeRegex);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
68
69
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Get multer options for image upload
|
|
72
|
+
*/
|
|
73
|
+
export function multerOptionsForImageUpload(options: {
|
|
74
|
+
destination?: string;
|
|
75
|
+
fileSize?: number;
|
|
76
|
+
fileTypeRegex?: RegExp;
|
|
77
|
+
}): MulterOptions {
|
|
78
|
+
// Default options
|
|
79
|
+
options = Object.assign(
|
|
80
|
+
{
|
|
81
|
+
fileSize: 1024 * 1024, // 1MB
|
|
82
|
+
fileTypeRegex: /jpeg|jpg|png/, // Images only
|
|
83
|
+
},
|
|
84
|
+
options
|
|
85
|
+
);
|
|
76
86
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
87
|
+
return {
|
|
88
|
+
// File filter
|
|
89
|
+
fileFilter: options.fileTypeRegex ? multerFileFilter(options.fileTypeRegex) : undefined,
|
|
90
|
+
|
|
91
|
+
// Limits
|
|
92
|
+
limits: {
|
|
93
|
+
// Limit of file size
|
|
94
|
+
fileSize: options.fileSize ? options.fileSize : undefined,
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
// Automatic storage handling
|
|
98
|
+
// For configuration see https://github.com/expressjs/multer#storage
|
|
99
|
+
storage: diskStorage({
|
|
100
|
+
// Destination for uploaded file
|
|
101
|
+
// If destination is not set file will be buffered and can be processed
|
|
102
|
+
// in the method
|
|
103
|
+
destination: options.destination ? options.destination : undefined,
|
|
104
|
+
|
|
105
|
+
// Generated random file name
|
|
106
|
+
filename: multerRandomFileName(),
|
|
107
|
+
}),
|
|
108
|
+
};
|
|
82
109
|
}
|
|
@@ -7,6 +7,7 @@ import { SortInput } from '../inputs/sort.input';
|
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Helper for filter handling
|
|
10
|
+
* @deprecated use functions directly
|
|
10
11
|
*/
|
|
11
12
|
export class Filter {
|
|
12
13
|
/**
|
|
@@ -14,121 +15,143 @@ export class Filter {
|
|
|
14
15
|
* @param filterArgs
|
|
15
16
|
*/
|
|
16
17
|
public static convertFilterArgsToQuery<T = any>(filterArgs: Partial<FilterArgs>): [FilterQuery<T>, QueryOptions] {
|
|
17
|
-
return
|
|
18
|
+
return convertFilterArgsToQuery(filterArgs);
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Generate filter query
|
|
22
23
|
*/
|
|
23
24
|
public static generateFilterQuery<T = any>(filter?: Partial<FilterInput>): FilterQuery<T> | any {
|
|
24
|
-
|
|
25
|
-
if (!filter) {
|
|
26
|
-
return undefined;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Init result
|
|
30
|
-
const result: any = {};
|
|
31
|
-
|
|
32
|
-
// Process combined filters
|
|
33
|
-
if (filter.combinedFilter) {
|
|
34
|
-
switch (filter.combinedFilter.logicalOperator) {
|
|
35
|
-
case LogicalOperatorEnum.AND:
|
|
36
|
-
return {
|
|
37
|
-
$and: filter.combinedFilter.filters.map((item: FilterInput) => Filter.generateFilterQuery(item)),
|
|
38
|
-
};
|
|
39
|
-
case LogicalOperatorEnum.NOR:
|
|
40
|
-
return {
|
|
41
|
-
$nor: filter.combinedFilter.filters.map((item: FilterInput) => Filter.generateFilterQuery(item)),
|
|
42
|
-
};
|
|
43
|
-
case LogicalOperatorEnum.OR:
|
|
44
|
-
return {
|
|
45
|
-
$or: filter.combinedFilter.filters.map((item: FilterInput) => Filter.generateFilterQuery(item)),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Process single filter
|
|
51
|
-
if (filter.singleFilter) {
|
|
52
|
-
// Init variables
|
|
53
|
-
const { not, options, field, value } = filter.singleFilter;
|
|
54
|
-
|
|
55
|
-
// Convert filter
|
|
56
|
-
switch (filter.singleFilter.operator) {
|
|
57
|
-
case ComparisonOperatorEnum.EQ:
|
|
58
|
-
result[field] = not ? { $ne: value } : value;
|
|
59
|
-
break;
|
|
60
|
-
case ComparisonOperatorEnum.GT:
|
|
61
|
-
result[field] = not ? { $not: { $gt: value } } : { $gt: value };
|
|
62
|
-
break;
|
|
63
|
-
case ComparisonOperatorEnum.GTE:
|
|
64
|
-
result[field] = not ? { $not: { $gte: value } } : { $gte: value };
|
|
65
|
-
break;
|
|
66
|
-
case ComparisonOperatorEnum.IN:
|
|
67
|
-
result[field] = not ? { $nin: value } : { $in: value };
|
|
68
|
-
break;
|
|
69
|
-
case ComparisonOperatorEnum.LT:
|
|
70
|
-
result[field] = not ? { $not: { $lt: value } } : { $lt: value };
|
|
71
|
-
break;
|
|
72
|
-
case ComparisonOperatorEnum.LTE:
|
|
73
|
-
result[field] = not ? { $not: { $lte: value } } : { $lte: value };
|
|
74
|
-
break;
|
|
75
|
-
case ComparisonOperatorEnum.NE:
|
|
76
|
-
result[field] = not ? value : { $ne: value };
|
|
77
|
-
break;
|
|
78
|
-
case ComparisonOperatorEnum.NIN:
|
|
79
|
-
result[field] = not ? { $in: value } : { $nin: value };
|
|
80
|
-
break;
|
|
81
|
-
case ComparisonOperatorEnum.REGEX:
|
|
82
|
-
result[field] = not
|
|
83
|
-
? {
|
|
84
|
-
$not: {
|
|
85
|
-
$regex: new RegExp(value),
|
|
86
|
-
$options: options || '',
|
|
87
|
-
},
|
|
88
|
-
}
|
|
89
|
-
: { $regex: new RegExp(value), $options: options || '' };
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Return result
|
|
95
|
-
return result;
|
|
25
|
+
return generateFilterQuery(filter);
|
|
96
26
|
}
|
|
97
27
|
|
|
98
28
|
/**
|
|
99
29
|
* Generate find options
|
|
100
30
|
*/
|
|
101
31
|
public static generateFindOptions<T = any>(filterArgs: Partial<FilterArgs>): QueryOptions {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
32
|
+
return generateFindOptions(filterArgs);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
106
35
|
|
|
107
|
-
|
|
108
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Convert filter arguments to a query array
|
|
38
|
+
* @param filterArgs
|
|
39
|
+
*/
|
|
40
|
+
export function convertFilterArgsToQuery<T = any>(filterArgs: Partial<FilterArgs>): [FilterQuery<T>, QueryOptions] {
|
|
41
|
+
return [generateFilterQuery(filterArgs?.filter), generateFindOptions(filterArgs)];
|
|
42
|
+
}
|
|
109
43
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Generate filter query
|
|
46
|
+
*/
|
|
47
|
+
export function generateFilterQuery<T = any>(filter?: Partial<FilterInput>): FilterQuery<T> | any {
|
|
48
|
+
// Check filter
|
|
49
|
+
if (!filter) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
114
52
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
53
|
+
// Init result
|
|
54
|
+
const result: any = {};
|
|
118
55
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
56
|
+
// Process combined filters
|
|
57
|
+
if (filter.combinedFilter) {
|
|
58
|
+
switch (filter.combinedFilter.logicalOperator) {
|
|
59
|
+
case LogicalOperatorEnum.AND:
|
|
60
|
+
return {
|
|
61
|
+
$and: filter.combinedFilter.filters.map((item: FilterInput) => generateFilterQuery(item)),
|
|
62
|
+
};
|
|
63
|
+
case LogicalOperatorEnum.NOR:
|
|
64
|
+
return {
|
|
65
|
+
$nor: filter.combinedFilter.filters.map((item: FilterInput) => generateFilterQuery(item)),
|
|
66
|
+
};
|
|
67
|
+
case LogicalOperatorEnum.OR:
|
|
68
|
+
return {
|
|
69
|
+
$or: filter.combinedFilter.filters.map((item: FilterInput) => generateFilterQuery(item)),
|
|
70
|
+
};
|
|
122
71
|
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Process single filter
|
|
75
|
+
if (filter.singleFilter) {
|
|
76
|
+
// Init variables
|
|
77
|
+
const { not, options, field, value } = filter.singleFilter;
|
|
123
78
|
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
79
|
+
// Convert filter
|
|
80
|
+
switch (filter.singleFilter.operator) {
|
|
81
|
+
case ComparisonOperatorEnum.EQ:
|
|
82
|
+
result[field] = not ? { $ne: value } : value;
|
|
83
|
+
break;
|
|
84
|
+
case ComparisonOperatorEnum.GT:
|
|
85
|
+
result[field] = not ? { $not: { $gt: value } } : { $gt: value };
|
|
86
|
+
break;
|
|
87
|
+
case ComparisonOperatorEnum.GTE:
|
|
88
|
+
result[field] = not ? { $not: { $gte: value } } : { $gte: value };
|
|
89
|
+
break;
|
|
90
|
+
case ComparisonOperatorEnum.IN:
|
|
91
|
+
result[field] = not ? { $nin: value } : { $in: value };
|
|
92
|
+
break;
|
|
93
|
+
case ComparisonOperatorEnum.LT:
|
|
94
|
+
result[field] = not ? { $not: { $lt: value } } : { $lt: value };
|
|
95
|
+
break;
|
|
96
|
+
case ComparisonOperatorEnum.LTE:
|
|
97
|
+
result[field] = not ? { $not: { $lte: value } } : { $lte: value };
|
|
98
|
+
break;
|
|
99
|
+
case ComparisonOperatorEnum.NE:
|
|
100
|
+
result[field] = not ? value : { $ne: value };
|
|
101
|
+
break;
|
|
102
|
+
case ComparisonOperatorEnum.NIN:
|
|
103
|
+
result[field] = not ? { $in: value } : { $nin: value };
|
|
104
|
+
break;
|
|
105
|
+
case ComparisonOperatorEnum.REGEX:
|
|
106
|
+
result[field] = not
|
|
107
|
+
? {
|
|
108
|
+
$not: {
|
|
109
|
+
$regex: new RegExp(value),
|
|
110
|
+
$options: options || '',
|
|
111
|
+
},
|
|
112
|
+
}
|
|
113
|
+
: { $regex: new RegExp(value), $options: options || '' };
|
|
114
|
+
break;
|
|
130
115
|
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Return result
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Generate find options
|
|
124
|
+
*/
|
|
125
|
+
export function generateFindOptions<T = any>(filterArgs: Partial<FilterArgs>): QueryOptions {
|
|
126
|
+
// Check filterArgs
|
|
127
|
+
if (!filterArgs) {
|
|
128
|
+
return {};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Get values
|
|
132
|
+
const { limit, offset, skip, sort, take } = filterArgs;
|
|
133
|
+
|
|
134
|
+
// Init options
|
|
135
|
+
const options: QueryOptions = {
|
|
136
|
+
limit: limit ? limit : take,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
if (skip > 0 || offset > 0) {
|
|
140
|
+
options.skip = offset ? offset : skip;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Check take
|
|
144
|
+
if (!options.limit || options.limit > 100) {
|
|
145
|
+
options.limit = 25;
|
|
146
|
+
}
|
|
131
147
|
|
|
132
|
-
|
|
148
|
+
// Prepare order
|
|
149
|
+
if (sort) {
|
|
150
|
+
options.sort = {};
|
|
151
|
+
sort.forEach((item: SortInput) => {
|
|
152
|
+
options.sort[item.field] = item.order;
|
|
153
|
+
});
|
|
133
154
|
}
|
|
155
|
+
|
|
156
|
+
return options;
|
|
134
157
|
}
|