@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.
Files changed (166) hide show
  1. package/dist/config.env.js +3 -2
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/args/pagination.args.js +1 -1
  4. package/dist/core/common/args/pagination.args.js.map +1 -1
  5. package/dist/core/common/decorators/restricted.decorator.d.ts +3 -0
  6. package/dist/core/common/decorators/restricted.decorator.js +14 -8
  7. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  8. package/dist/core/common/enums/role.enum.d.ts +3 -2
  9. package/dist/core/common/enums/role.enum.js +3 -2
  10. package/dist/core/common/enums/role.enum.js.map +1 -1
  11. package/dist/core/common/helpers/config.helper.d.ts +2 -1
  12. package/dist/core/common/helpers/config.helper.js +11 -7
  13. package/dist/core/common/helpers/config.helper.js.map +1 -1
  14. package/dist/core/common/helpers/context.helper.d.ts +7 -1
  15. package/dist/core/common/helpers/context.helper.js +33 -29
  16. package/dist/core/common/helpers/context.helper.js.map +1 -1
  17. package/dist/core/common/helpers/db.helper.d.ts +37 -0
  18. package/dist/core/common/helpers/db.helper.js +356 -0
  19. package/dist/core/common/helpers/db.helper.js.map +1 -0
  20. package/dist/core/common/helpers/file.helper.d.ts +8 -1
  21. package/dist/core/common/helpers/file.helper.js +43 -31
  22. package/dist/core/common/helpers/file.helper.js.map +1 -1
  23. package/dist/core/common/helpers/filter.helper.d.ts +3 -0
  24. package/dist/core/common/helpers/filter.helper.js +93 -81
  25. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  26. package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
  27. package/dist/core/common/helpers/graphql.helper.js +144 -96
  28. package/dist/core/common/helpers/graphql.helper.js.map +1 -1
  29. package/dist/core/common/helpers/input.helper.d.ts +42 -4
  30. package/dist/core/common/helpers/input.helper.js +256 -97
  31. package/dist/core/common/helpers/input.helper.js.map +1 -1
  32. package/dist/core/common/helpers/model.helper.d.ts +11 -0
  33. package/dist/core/common/helpers/model.helper.js +41 -29
  34. package/dist/core/common/helpers/model.helper.js.map +1 -1
  35. package/dist/core/common/helpers/service.helper.d.ts +21 -1
  36. package/dist/core/common/helpers/service.helper.js +80 -72
  37. package/dist/core/common/helpers/service.helper.js.map +1 -1
  38. package/dist/core/common/inputs/combined-filter.input.js +1 -1
  39. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  40. package/dist/core/common/inputs/core-input.input.js +1 -1
  41. package/dist/core/common/inputs/core-input.input.js.map +1 -1
  42. package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
  43. package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
  44. package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
  45. package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
  46. package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
  47. package/dist/core/common/interfaces/service-options.interface.d.ts +36 -0
  48. package/dist/core/common/interfaces/service-options.interface.js +3 -0
  49. package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
  50. package/dist/core/common/models/core-model.model.d.ts +5 -1
  51. package/dist/core/common/models/core-model.model.js +1 -1
  52. package/dist/core/common/models/core-model.model.js.map +1 -1
  53. package/dist/core/common/pipes/check-input.pipe.js +2 -2
  54. package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
  55. package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
  56. package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
  57. package/dist/core/common/services/crud.service.d.ts +13 -0
  58. package/dist/core/common/services/crud.service.js +57 -0
  59. package/dist/core/common/services/crud.service.js.map +1 -0
  60. package/dist/core/common/services/email.service.js +8 -8
  61. package/dist/core/common/services/email.service.js.map +1 -1
  62. package/dist/core/common/services/module.service.d.ts +40 -0
  63. package/dist/core/common/services/module.service.js +80 -0
  64. package/dist/core/common/services/module.service.js.map +1 -0
  65. package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
  66. package/dist/core/common/types/core-model-constructor.type.js +3 -0
  67. package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
  68. package/dist/core/common/types/field-selection.type.d.ts +4 -0
  69. package/dist/core/common/types/field-selection.type.js +3 -0
  70. package/dist/core/common/types/field-selection.type.js.map +1 -0
  71. package/dist/core/common/types/ids.type.d.ts +8 -0
  72. package/dist/core/common/types/ids.type.js +3 -0
  73. package/dist/core/common/types/ids.type.js.map +1 -0
  74. package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
  75. package/dist/core/common/types/string-or-object-id.type.js +3 -0
  76. package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
  77. package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
  78. package/dist/core/modules/auth/core-auth.resolver.js +4 -3
  79. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  80. package/dist/core/modules/auth/guards/roles.guard.js +1 -2
  81. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  82. package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
  83. package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
  84. package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
  85. package/dist/core/modules/auth/services/core-auth.service.js +6 -4
  86. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  87. package/dist/core/modules/user/core-user.model.js +1 -1
  88. package/dist/core/modules/user/core-user.model.js.map +1 -1
  89. package/dist/core/modules/user/core-user.service.d.ts +16 -25
  90. package/dist/core/modules/user/core-user.service.js +69 -90
  91. package/dist/core/modules/user/core-user.service.js.map +1 -1
  92. package/dist/core.module.js +1 -1
  93. package/dist/core.module.js.map +1 -1
  94. package/dist/index.d.ts +9 -1
  95. package/dist/index.js +9 -1
  96. package/dist/index.js.map +1 -1
  97. package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
  98. package/dist/server/modules/auth/auth.resolver.js +4 -3
  99. package/dist/server/modules/auth/auth.resolver.js.map +1 -1
  100. package/dist/server/modules/file/file.controller.js +1 -1
  101. package/dist/server/modules/file/file.controller.js.map +1 -1
  102. package/dist/server/modules/user/avatar.controller.js +2 -2
  103. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  104. package/dist/server/modules/user/user.model.d.ts +2 -1
  105. package/dist/server/modules/user/user.module.js +7 -3
  106. package/dist/server/modules/user/user.module.js.map +1 -1
  107. package/dist/server/modules/user/user.resolver.d.ts +8 -7
  108. package/dist/server/modules/user/user.resolver.js +85 -49
  109. package/dist/server/modules/user/user.resolver.js.map +1 -1
  110. package/dist/server/modules/user/user.service.d.ts +9 -18
  111. package/dist/server/modules/user/user.service.js +23 -30
  112. package/dist/server/modules/user/user.service.js.map +1 -1
  113. package/dist/test/test.helper.d.ts +1 -2
  114. package/dist/test/test.helper.js +1 -16
  115. package/dist/test/test.helper.js.map +1 -1
  116. package/dist/tsconfig.build.tsbuildinfo +1 -1
  117. package/package.json +58 -59
  118. package/src/config.env.ts +3 -2
  119. package/src/core/common/args/pagination.args.ts +2 -2
  120. package/src/core/common/decorators/restricted.decorator.ts +24 -12
  121. package/src/core/common/enums/role.enum.ts +23 -5
  122. package/src/core/common/helpers/config.helper.ts +26 -6
  123. package/src/core/common/helpers/context.helper.ts +42 -33
  124. package/src/core/common/helpers/db.helper.ts +595 -0
  125. package/src/core/common/helpers/file.helper.ts +76 -49
  126. package/src/core/common/helpers/filter.helper.ts +119 -96
  127. package/src/core/common/helpers/graphql.helper.ts +219 -117
  128. package/src/core/common/helpers/input.helper.ts +349 -108
  129. package/src/core/common/helpers/model.helper.ts +102 -57
  130. package/src/core/common/helpers/service.helper.ts +149 -117
  131. package/src/core/common/inputs/combined-filter.input.ts +2 -2
  132. package/src/core/common/inputs/core-input.input.ts +2 -2
  133. package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
  134. package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
  135. package/src/core/common/interfaces/service-options.interface.ts +71 -0
  136. package/src/core/common/models/core-model.model.ts +7 -3
  137. package/src/core/common/pipes/check-input.pipe.ts +4 -4
  138. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  139. package/src/core/common/services/crud.service.ts +100 -0
  140. package/src/core/common/services/email.service.ts +9 -9
  141. package/src/core/common/services/module.service.ts +188 -0
  142. package/src/core/common/types/core-model-constructor.type.ts +30 -0
  143. package/src/core/common/types/field-selection.type.ts +8 -0
  144. package/src/core/common/types/ids.type.ts +7 -0
  145. package/src/core/common/types/string-or-object-id.type.ts +3 -0
  146. package/src/core/modules/auth/core-auth.module.ts +1 -1
  147. package/src/core/modules/auth/core-auth.resolver.ts +8 -3
  148. package/src/core/modules/auth/guards/roles.guard.ts +5 -7
  149. package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
  150. package/src/core/modules/auth/services/core-auth.service.ts +14 -4
  151. package/src/core/modules/user/core-user.model.ts +2 -1
  152. package/src/core/modules/user/core-user.service.ts +115 -185
  153. package/src/core.module.ts +2 -2
  154. package/src/index.ts +9 -1
  155. package/src/main.ts +1 -1
  156. package/src/server/modules/auth/auth.resolver.ts +8 -3
  157. package/src/server/modules/file/file.controller.ts +2 -2
  158. package/src/server/modules/user/avatar.controller.ts +3 -3
  159. package/src/server/modules/user/user.module.ts +7 -3
  160. package/src/server/modules/user/user.resolver.ts +74 -43
  161. package/src/server/modules/user/user.service.ts +30 -53
  162. package/src/test/test.helper.ts +31 -30
  163. package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
  164. package/dist/core/modules/user/core-basic-user.service.js +0 -73
  165. package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
  166. 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 (req, file, cb) => {
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 (req, file, cb) => {
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
- // Default options
51
- options = Object.assign(
52
- {
53
- fileSize: 1024 * 1024, // 1MB
54
- fileTypeRegex: /jpeg|jpg|png/, // Images only
55
- },
56
- options
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
- return {
60
- // File filter
61
- fileFilter: options.fileTypeRegex ? FileHelper.multerFileFilter(options.fileTypeRegex) : undefined,
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
- // Limits
64
- limits: {
65
- // Limit of file size
66
- fileSize: options.fileSize ? options.fileSize : undefined,
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
- // Automatic storage handling
70
- // For configuration see https://github.com/expressjs/multer#storage
71
- storage: diskStorage({
72
- // Destination for uploaded file
73
- // If destination is not set file will be buffered and can be processed
74
- // in the method
75
- destination: options.destination ? options.destination : undefined,
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
- // Generated random file name
78
- filename: FileHelper.multerRandomFileName(),
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 [Filter.generateFilterQuery(filterArgs.filter), Filter.generateFindOptions(filterArgs)];
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
- // Check filter
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
- // Check filterArgs
103
- if (!filterArgs) {
104
- return {};
105
- }
32
+ return generateFindOptions(filterArgs);
33
+ }
34
+ }
106
35
 
107
- // Get values
108
- const { limit, offset, skip, sort, take } = filterArgs;
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
- // Init options
111
- const options: QueryOptions = {
112
- limit: limit ? limit : take,
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
- if (skip > 0 || offset > 0) {
116
- options.skip = offset ? offset : skip;
117
- }
53
+ // Init result
54
+ const result: any = {};
118
55
 
119
- // Check take
120
- if (!options.limit || options.limit > 100) {
121
- options.limit = 25;
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
- // Prepare order
125
- if (sort) {
126
- options.sort = {};
127
- sort.forEach((item: SortInput) => {
128
- options.sort[item.field] = item.order;
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
- return options;
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
  }