@mondart/nestjs-common-module 1.0.3 → 1.0.4

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 (186) hide show
  1. package/dist/caching/caching.module.js.map +1 -1
  2. package/dist/caching/caching.service.js.map +1 -1
  3. package/dist/caching/index.js.map +1 -1
  4. package/dist/constants/index.js.map +1 -1
  5. package/dist/constants/validation-constraints.const.js.map +1 -1
  6. package/dist/controllers/core-crud.controller.d.ts +4 -4
  7. package/dist/controllers/core-crud.controller.js +6 -6
  8. package/dist/controllers/core-crud.controller.js.map +1 -1
  9. package/dist/controllers/index.js.map +1 -1
  10. package/dist/decorators/entity-order.decorator.js.map +1 -1
  11. package/dist/decorators/index.js.map +1 -1
  12. package/dist/decorators/swagger-api-response.decorator.js.map +1 -1
  13. package/dist/decorators/validations/default/array-max-size.decorator.js.map +1 -1
  14. package/dist/decorators/validations/default/array-min-size.decorator.js.map +1 -1
  15. package/dist/decorators/validations/default/array-not-empty.decorator.js.map +1 -1
  16. package/dist/decorators/validations/default/index.js.map +1 -1
  17. package/dist/decorators/validations/default/is-array.decorator.js.map +1 -1
  18. package/dist/decorators/validations/default/is-boolean.decorator.js.map +1 -1
  19. package/dist/decorators/validations/default/is-date.decorator.js.map +1 -1
  20. package/dist/decorators/validations/default/is-enum.decorator.js.map +1 -1
  21. package/dist/decorators/validations/default/is-int.decorator.js.map +1 -1
  22. package/dist/decorators/validations/default/is-not-empty-object.decorator.js.map +1 -1
  23. package/dist/decorators/validations/default/is-not-empty.decorator.js.map +1 -1
  24. package/dist/decorators/validations/default/is-number-string.decorator.js.map +1 -1
  25. package/dist/decorators/validations/default/is-object.decorator.js.map +1 -1
  26. package/dist/decorators/validations/default/is-positive.decorator.js.map +1 -1
  27. package/dist/decorators/validations/default/is-string.decorator.js.map +1 -1
  28. package/dist/decorators/validations/default/is-uuid.decorator.js.map +1 -1
  29. package/dist/decorators/validations/default/matches.decorator.js.map +1 -1
  30. package/dist/decorators/validations/default/max-length.decorator.js.map +1 -1
  31. package/dist/decorators/validations/default/max.decorator.js.map +1 -1
  32. package/dist/decorators/validations/default/min-length.decorator.js.map +1 -1
  33. package/dist/decorators/validations/default/min.decorator.js.map +1 -1
  34. package/dist/decorators/validations/index.js.map +1 -1
  35. package/dist/decorators/validations/is-id.decorator.js.map +1 -1
  36. package/dist/decorators/validations/is-not-empty-string.decorator.js.map +1 -1
  37. package/dist/dto/index.js.map +1 -1
  38. package/dist/dto/request/base-request.dto.js.map +1 -1
  39. package/dist/dto/request/event.dto.js.map +1 -1
  40. package/dist/dto/request/id.dto.js.map +1 -1
  41. package/dist/dto/request/ids.dto.js.map +1 -1
  42. package/dist/dto/request/index.js.map +1 -1
  43. package/dist/dto/response/base-response-with-action-dates.dto.js.map +1 -1
  44. package/dist/dto/response/base-response.dto.js.map +1 -1
  45. package/dist/dto/response/error-response.dto.js.map +1 -1
  46. package/dist/dto/response/index.js.map +1 -1
  47. package/dist/dto/response/kafka-success-response.dto.js.map +1 -1
  48. package/dist/dto/response/success-response.dto.js.map +1 -1
  49. package/dist/dto/response/validation.dto.js.map +1 -1
  50. package/dist/entities/action-dates.entity.js.map +1 -1
  51. package/dist/entities/base.entity.js.map +1 -1
  52. package/dist/entities/index.js.map +1 -1
  53. package/dist/entities/parent.entity.js.map +1 -1
  54. package/dist/enums/environments.enum.js.map +1 -1
  55. package/dist/enums/index.js.map +1 -1
  56. package/dist/enums/shared-messages.enum.js.map +1 -1
  57. package/dist/filters/http-exception.filter.js.map +1 -1
  58. package/dist/filters/index.js.map +1 -1
  59. package/dist/filters/rpc-exception.filter.js.map +1 -1
  60. package/dist/helper/get-env.helper.js.map +1 -1
  61. package/dist/helper/get-env.js.map +1 -1
  62. package/dist/helper/index.js.map +1 -1
  63. package/dist/helper/message-formatter.helper.js.map +1 -1
  64. package/dist/helper/multi-inheritance.helper.js.map +1 -1
  65. package/dist/helper/multi-inheritance.util.js.map +1 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/interface/core-crud-service.option.js.map +1 -1
  68. package/dist/interface/custom-validation-arguments.interface.js.map +1 -1
  69. package/dist/interface/index.js.map +1 -1
  70. package/dist/interface/kafka-success-response.interfase.js.map +1 -1
  71. package/dist/interface/pagination-query.js.map +1 -1
  72. package/dist/lib/index.js.map +1 -1
  73. package/dist/lib/kafka/constant/consumer.const.js.map +1 -1
  74. package/dist/lib/kafka/constant/kafka.const.js.map +1 -1
  75. package/dist/lib/kafka/index.js.map +1 -1
  76. package/dist/lib/kafka/kafka-admin.service.js.map +1 -1
  77. package/dist/lib/kafka/kafka-consumer.service.js.map +1 -1
  78. package/dist/lib/kafka/kafka-instance.const.js.map +1 -1
  79. package/dist/lib/kafka/kafka-logger.js.map +1 -1
  80. package/dist/lib/kafka/kafka-producer.service.js.map +1 -1
  81. package/dist/lib/kafka/kafka.interface.js.map +1 -1
  82. package/dist/lib/kafka/kafka.module.js.map +1 -1
  83. package/dist/lib/kafka/kafka.provider.js.map +1 -1
  84. package/dist/lib/kafka/kafka.service.js.map +1 -1
  85. package/dist/services/core-crud.service.js.map +1 -1
  86. package/dist/services/index.js.map +1 -1
  87. package/dist/strategy/index.js.map +1 -1
  88. package/dist/strategy/type-orm-naming.strategy.js.map +1 -1
  89. package/dist/tsconfig.tsbuildinfo +1 -1
  90. package/dist/validators/does-exist.validator.js.map +1 -1
  91. package/dist/validators/env.validator.js.map +1 -1
  92. package/dist/validators/index.js.map +1 -1
  93. package/dist/validators/is-unique.validator.js.map +1 -1
  94. package/dist/validators/validation-options.js.map +1 -1
  95. package/package.json +2 -2
  96. package/common/caching/caching.module.ts +0 -28
  97. package/common/caching/caching.service.ts +0 -34
  98. package/common/caching/index.ts +0 -2
  99. package/common/constants/index.ts +0 -1
  100. package/common/constants/validation-constraints.const.ts +0 -14
  101. package/common/controllers/core-crud.controller.ts +0 -106
  102. package/common/controllers/index.ts +0 -1
  103. package/common/decorators/entity-order.decorator.ts +0 -19
  104. package/common/decorators/index.ts +0 -2
  105. package/common/decorators/swagger-api-response.decorator.ts +0 -30
  106. package/common/decorators/validations/default/array-max-size.decorator.ts +0 -9
  107. package/common/decorators/validations/default/array-min-size.decorator.ts +0 -9
  108. package/common/decorators/validations/default/array-not-empty.decorator.ts +0 -7
  109. package/common/decorators/validations/default/index.ts +0 -20
  110. package/common/decorators/validations/default/is-array.decorator.ts +0 -7
  111. package/common/decorators/validations/default/is-boolean.decorator.ts +0 -10
  112. package/common/decorators/validations/default/is-date.decorator.ts +0 -10
  113. package/common/decorators/validations/default/is-enum.decorator.ts +0 -9
  114. package/common/decorators/validations/default/is-int.decorator.ts +0 -10
  115. package/common/decorators/validations/default/is-not-empty-object.decorator.ts +0 -15
  116. package/common/decorators/validations/default/is-not-empty.decorator.ts +0 -7
  117. package/common/decorators/validations/default/is-number-string.decorator.ts +0 -12
  118. package/common/decorators/validations/default/is-object.decorator.ts +0 -7
  119. package/common/decorators/validations/default/is-positive.decorator.ts +0 -10
  120. package/common/decorators/validations/default/is-string.decorator.ts +0 -8
  121. package/common/decorators/validations/default/is-uuid.decorator.ts +0 -7
  122. package/common/decorators/validations/default/matches.decorator.ts +0 -13
  123. package/common/decorators/validations/default/max-length.decorator.ts +0 -9
  124. package/common/decorators/validations/default/max.decorator.ts +0 -13
  125. package/common/decorators/validations/default/min-length.decorator.ts +0 -9
  126. package/common/decorators/validations/default/min.decorator.ts +0 -13
  127. package/common/decorators/validations/index.ts +0 -3
  128. package/common/decorators/validations/is-id.decorator.ts +0 -20
  129. package/common/decorators/validations/is-not-empty-string.decorator.ts +0 -14
  130. package/common/dto/index.ts +0 -2
  131. package/common/dto/request/base-request.dto.ts +0 -11
  132. package/common/dto/request/event.dto.ts +0 -25
  133. package/common/dto/request/id.dto.ts +0 -10
  134. package/common/dto/request/ids.dto.ts +0 -13
  135. package/common/dto/request/index.ts +0 -4
  136. package/common/dto/response/base-response-with-action-dates.dto.ts +0 -19
  137. package/common/dto/response/base-response.dto.ts +0 -10
  138. package/common/dto/response/error-response.dto.ts +0 -22
  139. package/common/dto/response/index.ts +0 -5
  140. package/common/dto/response/kafka-success-response.dto.ts +0 -56
  141. package/common/dto/response/success-response.dto.ts +0 -32
  142. package/common/dto/response/validation.dto.ts +0 -80
  143. package/common/entities/action-dates.entity.ts +0 -30
  144. package/common/entities/base.entity.ts +0 -7
  145. package/common/entities/index.ts +0 -2
  146. package/common/entities/parent.entity.ts +0 -35
  147. package/common/enums/environments.enum.ts +0 -6
  148. package/common/enums/index.ts +0 -2
  149. package/common/enums/shared-messages.enum.ts +0 -40
  150. package/common/filters/http-exception.filter.ts +0 -74
  151. package/common/filters/index.ts +0 -1
  152. package/common/filters/rpc-exception.filter.ts +0 -40
  153. package/common/helper/get-env.helper.ts +0 -3
  154. package/common/helper/get-env.ts +0 -3
  155. package/common/helper/index.ts +0 -2
  156. package/common/helper/message-formatter.helper.ts +0 -30
  157. package/common/helper/multi-inheritance.helper.ts +0 -12
  158. package/common/helper/multi-inheritance.util.ts +0 -12
  159. package/common/index.ts +0 -14
  160. package/common/interface/core-crud-service.option.ts +0 -8
  161. package/common/interface/custom-validation-arguments.interface.ts +0 -20
  162. package/common/interface/index.ts +0 -2
  163. package/common/interface/kafka-success-response.interfase.ts +0 -9
  164. package/common/interface/pagination-query.ts +0 -39
  165. package/common/lib/index.ts +0 -1
  166. package/common/lib/kafka/constant/consumer.const.ts +0 -13
  167. package/common/lib/kafka/constant/kafka.const.ts +0 -9
  168. package/common/lib/kafka/index.ts +0 -5
  169. package/common/lib/kafka/kafka-admin.service.ts +0 -51
  170. package/common/lib/kafka/kafka-consumer.service.ts +0 -59
  171. package/common/lib/kafka/kafka-instance.const.ts +0 -9
  172. package/common/lib/kafka/kafka-logger.ts +0 -25
  173. package/common/lib/kafka/kafka-producer.service.ts +0 -97
  174. package/common/lib/kafka/kafka.interface.ts +0 -22
  175. package/common/lib/kafka/kafka.module.ts +0 -80
  176. package/common/lib/kafka/kafka.provider.ts +0 -10
  177. package/common/lib/kafka/kafka.service.ts +0 -224
  178. package/common/services/core-crud.service.ts +0 -457
  179. package/common/services/index.ts +0 -1
  180. package/common/strategy/index.ts +0 -1
  181. package/common/strategy/type-orm-naming.strategy.ts +0 -17
  182. package/common/validators/does-exist.validator.ts +0 -42
  183. package/common/validators/env.validator.ts +0 -28
  184. package/common/validators/index.ts +0 -4
  185. package/common/validators/is-unique.validator.ts +0 -70
  186. package/common/validators/validation-options.ts +0 -38
@@ -1,457 +0,0 @@
1
- import {
2
- DeepPartial,
3
- DeleteResult,
4
- FindManyOptions,
5
- FindOptionsWhere,
6
- Repository,
7
- UpdateResult,
8
- } from 'typeorm';
9
- import {
10
- BadRequestException,
11
- Injectable,
12
- NotFoundException,
13
- } from '@nestjs/common';
14
- import { ParentEntity } from '../entities/parent.entity';
15
- import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity';
16
- import { paginate, Paginated } from 'nestjs-paginate';
17
- import { PaginateConfig } from 'nestjs-paginate/lib/paginate';
18
- import { ObjectId } from 'typeorm/driver/mongodb/typings';
19
- import { PaginationQueryCustom } from '../interface/pagination-query';
20
- import { SharedMessages } from '../enums/shared-messages.enum';
21
- import { InsertResult } from 'typeorm/query-builder/result/InsertResult';
22
- import { CoreCrudServiceOption } from '../interface';
23
- import { UpsertOptions } from 'typeorm/repository/UpsertOptions';
24
- import { MessageFormatter } from '../helper/message-formatter.helper';
25
-
26
- @Injectable()
27
- export abstract class CoreCrudService<
28
- T extends ParentEntity,
29
- CreateDto,
30
- UpdateDto,
31
- > {
32
- private readonly relationsPath: string[];
33
-
34
- protected constructor(protected readonly repository: Repository<T>) {
35
- const metadata = this.repository.metadata;
36
- this.relationsPath = metadata.relations.map(
37
- (relation) => relation.propertyPath,
38
- );
39
- }
40
-
41
- async create(
42
- createDto: CreateDto,
43
- options?: CoreCrudServiceOption<T>,
44
- ): Promise<T> {
45
- const relationEntityName = Object.keys(createDto).filter(
46
- (item) => this.relationsPath.includes(item) && createDto[item],
47
- );
48
-
49
- relationEntityName.map((item) => {
50
- createDto[item] = createDto[item].map((id: number) => {
51
- return { id };
52
- });
53
- });
54
-
55
- const entity = this.repository.create(createDto as DeepPartial<T>);
56
-
57
- if (options?.entityManager) {
58
- return await options.entityManager.save(entity);
59
- } else {
60
- return await this.repository.save(entity);
61
- }
62
- }
63
-
64
- async findAllWithPagination(
65
- query: PaginationQueryCustom,
66
- paginateConfig: PaginateConfig<T>,
67
- options?: CoreCrudServiceOption<T>,
68
- ): Promise<Paginated<T>> {
69
- return await paginate<T>(query, this.repository, {
70
- ...paginateConfig,
71
- relations: options?.relations ? options?.relations : this.relationsPath,
72
- });
73
- }
74
-
75
- async findAll(
76
- query: FindManyOptions<T>,
77
- options?: CoreCrudServiceOption<T>,
78
- ): Promise<T[]> {
79
- let result: T[] | PromiseLike<T[]>;
80
- if (!options?.entityManager)
81
- result = await this.repository.find({
82
- relations: this.relationsPath,
83
- ...query,
84
- });
85
- else
86
- result = await options.entityManager.find(this.repository.target, {
87
- relations: this.relationsPath,
88
- ...query,
89
- });
90
- if (options?.existsCheck && !result) {
91
- throw new NotFoundException(SharedMessages.RESOURCE_NOT_FOUND);
92
- }
93
- return result;
94
- }
95
-
96
- async findOneById(
97
- id: number,
98
- options?: CoreCrudServiceOption<T>,
99
- ): Promise<T> {
100
- let result: T;
101
-
102
- if (options?.entityManager) {
103
- result = await options.entityManager.findOne<T>(this.repository.target, {
104
- where: {
105
- id,
106
- } as FindOptionsWhere<T>,
107
- relations: options?.relations ? options?.relations : this.relationsPath,
108
- });
109
- } else {
110
- result = await this.repository.findOne({
111
- where: {
112
- id,
113
- } as FindOptionsWhere<T>,
114
- relations: options?.relations ? options?.relations : this.relationsPath,
115
- });
116
- }
117
- if (options?.existsCheck && !result) {
118
- throw new NotFoundException(SharedMessages.RESOURCE_NOT_FOUND);
119
- }
120
- return result;
121
- }
122
-
123
- async findOne(
124
- query: FindManyOptions<T>,
125
- options?: CoreCrudServiceOption<T>,
126
- ): Promise<T> {
127
- const whereQuery = this.validateWhereQuery(query.where);
128
- if (!whereQuery) {
129
- return undefined;
130
- }
131
- query.where = whereQuery;
132
- let result: T;
133
-
134
- if (options?.entityManager) {
135
- result = await options?.entityManager.findOne<T>(this.repository.target, {
136
- relations: this.relationsPath,
137
- ...query,
138
- });
139
- } else {
140
- result = await this.repository.findOne({
141
- ...query,
142
- relations: query?.relations ? query?.relations : this.relationsPath,
143
- });
144
- }
145
-
146
- if (options?.existsCheck && !result) {
147
- throw new NotFoundException(SharedMessages.RESOURCE_NOT_FOUND);
148
- }
149
- return result;
150
- }
151
-
152
- async isExists(
153
- query: FindManyOptions<T>,
154
- options?: CoreCrudServiceOption<T>,
155
- ): Promise<boolean> {
156
- // const whereQuery = this.validateWhereQuery(query.where);
157
- // if (!whereQuery) {
158
- // return undefined;
159
- // }
160
- // query.where = whereQuery;
161
- let result: boolean;
162
-
163
- if (options?.entityManager) {
164
- result = await options?.entityManager.exists<T>(this.repository.target, {
165
- relations: query?.relations ? query?.relations : this.relationsPath,
166
- ...query,
167
- });
168
- } else {
169
- result = await this.repository.exists({
170
- ...query,
171
- relations: query?.relations ? query?.relations : this.relationsPath,
172
- });
173
- }
174
-
175
- return result;
176
- }
177
-
178
- async count(
179
- query: FindManyOptions<T>,
180
- options?: CoreCrudServiceOption<T>,
181
- ): Promise<number> {
182
- const whereQuery = this.validateWhereQuery(query.where);
183
- if (!whereQuery) {
184
- return undefined;
185
- }
186
- query.where = whereQuery;
187
- let result: number;
188
-
189
- if (options?.entityManager) {
190
- result = await options?.entityManager.count<T>(this.repository.target, {
191
- relations: query?.relations ? query?.relations : this.relationsPath,
192
- ...query,
193
- });
194
- } else {
195
- result = await this.repository.count({
196
- ...query,
197
- relations: query?.relations ? query?.relations : this.relationsPath,
198
- });
199
- }
200
-
201
- return result;
202
- }
203
-
204
- async upsert(
205
- upsertDto: QueryDeepPartialEntity<T>,
206
- upsertOptions: UpsertOptions<T>,
207
- options?: CoreCrudServiceOption<T>,
208
- ): Promise<InsertResult> {
209
- try {
210
- let conflictPaths: string[] = [];
211
-
212
- let findWhereQuery: FindOptionsWhere<T> = {};
213
- if (this.isArray(upsertOptions.conflictPaths)) {
214
- conflictPaths = (upsertOptions.conflictPaths as string[]) ?? [];
215
- } else {
216
- conflictPaths = Object.keys(
217
- upsertOptions.conflictPaths as { [P in keyof T]?: true },
218
- );
219
- }
220
- conflictPaths.map((path) => {
221
- findWhereQuery = {
222
- ...findWhereQuery,
223
- [path]: upsertDto[path],
224
- };
225
- });
226
- if (!options?.entityManager) {
227
- const existEntity = await this.repository.findOne({
228
- where: findWhereQuery,
229
- select: ['id'],
230
- });
231
-
232
- return await this.repository.upsert(
233
- { id: existEntity.id, ...upsertDto },
234
- upsertOptions,
235
- );
236
- } else {
237
- const existEntity = await options?.entityManager.findOne<T>(
238
- this.repository.target,
239
- {
240
- where: findWhereQuery,
241
- select: ['id'],
242
- },
243
- );
244
- return await options?.entityManager.upsert(
245
- this.repository.target,
246
- { id: existEntity.id, ...upsertDto },
247
- upsertOptions,
248
- );
249
- }
250
- // Delete Cache
251
- } catch (error) {
252
- throw new BadRequestException(
253
- MessageFormatter.replace(SharedMessages.UPSERT_FAILED, error),
254
- );
255
- }
256
- }
257
-
258
- async update(
259
- id: number,
260
- updateDto: Partial<UpdateDto> | DeepPartial<T> | QueryDeepPartialEntity<T>,
261
- options?: CoreCrudServiceOption<T>,
262
- ): Promise<UpdateResult> {
263
- if (!options?.entityManager) {
264
- const fetchedItem = await this.repository.findOne({
265
- where: { id } as FindOptionsWhere<T>,
266
- relations: this.relationsPath,
267
- });
268
-
269
- if (!fetchedItem)
270
- throw new NotFoundException(SharedMessages.RESOURCE_NOT_FOUND);
271
-
272
- const relationEntityName = Object.keys(updateDto).filter(
273
- (item) => this.relationsPath.includes(item) && updateDto[item],
274
- );
275
- relationEntityName.map((item) => {
276
- delete fetchedItem[item];
277
- updateDto[item] = updateDto[item].map((id: number) => {
278
- return { id };
279
- });
280
- });
281
- const merged = this.repository.merge(
282
- fetchedItem,
283
- updateDto as unknown as DeepPartial<T>,
284
- );
285
- await this.repository.save(merged);
286
-
287
- return {
288
- generatedMaps: [],
289
- raw: merged,
290
- affected: 1,
291
- } as UpdateResult;
292
- } else {
293
- // Transaction context: use the provided EntityManager
294
- const fetchedItem = await options?.entityManager.findOne<T>(
295
- this.repository.target,
296
- {
297
- where: { id } as FindOptionsWhere<T>,
298
- relations: this.relationsPath,
299
- },
300
- );
301
- if (!fetchedItem)
302
- throw new NotFoundException(SharedMessages.RESOURCE_NOT_FOUND);
303
-
304
- const relationEntityName = Object.keys(updateDto).filter(
305
- (item) => this.relationsPath.includes(item) && updateDto[item],
306
- );
307
- relationEntityName.map((item) => {
308
- delete fetchedItem[item];
309
- updateDto[item] = updateDto[item].map((id: number) => {
310
- return { id };
311
- });
312
- });
313
-
314
- const merged = options?.entityManager.merge(
315
- this.repository.target,
316
- fetchedItem,
317
- updateDto as unknown as DeepPartial<T>,
318
- );
319
- await options?.entityManager.save(merged);
320
- // Delete Cache
321
- return {
322
- generatedMaps: [],
323
- raw: merged,
324
- affected: 1,
325
- } as UpdateResult;
326
- }
327
- }
328
-
329
- async softDelete(
330
- criteria:
331
- | string
332
- | string[]
333
- | number
334
- | number[]
335
- | Date
336
- | Date[]
337
- | ObjectId
338
- | ObjectId[]
339
- | FindOptionsWhere<T>,
340
- options?: CoreCrudServiceOption<T>,
341
- ): Promise<UpdateResult> {
342
- if (options?.entityManager) {
343
- return await options?.entityManager.softDelete(
344
- this.repository.target,
345
- criteria,
346
- );
347
- } else {
348
- return await this.repository.softDelete(criteria);
349
- }
350
- }
351
-
352
- async softDeleteById(
353
- id: number,
354
- options?: CoreCrudServiceOption<T>,
355
- ): Promise<UpdateResult> {
356
- if (options?.entityManager) {
357
- return await options?.entityManager.softDelete(
358
- this.repository.target,
359
- id,
360
- );
361
- } else {
362
- return await this.repository.softDelete(id);
363
- }
364
- }
365
-
366
- async delete(
367
- criteria:
368
- | string
369
- | string[]
370
- | number
371
- | number[]
372
- | Date
373
- | Date[]
374
- | ObjectId
375
- | ObjectId[]
376
- | FindOptionsWhere<T>,
377
- options?: CoreCrudServiceOption<T>,
378
- ): Promise<DeleteResult> {
379
- if (options?.entityManager) {
380
- return await options?.entityManager.delete(
381
- this.repository.target,
382
- criteria,
383
- );
384
- } else {
385
- return await this.repository.delete(criteria);
386
- }
387
- }
388
-
389
- async deleteById(
390
- id: number,
391
- options?: CoreCrudServiceOption<T>,
392
- ): Promise<DeleteResult> {
393
- if (options?.entityManager) {
394
- return await options?.entityManager.delete(this.repository.target, id);
395
- } else {
396
- return await this.repository.delete(id);
397
- }
398
- }
399
-
400
- private validateWhereQuery(
401
- query: FindOptionsWhere<T> | FindOptionsWhere<T>[],
402
- ) {
403
- if (this.isArray(query)) {
404
- const newArrayQuery: FindOptionsWhere<T>[] = [];
405
-
406
- query = query as FindOptionsWhere<T>[];
407
- if (query.length !== 0) {
408
- query.map((key, index) => {
409
- if (this.isArray(query[index])) {
410
- return query[index].map((item) => this.validateWhereQuery(item));
411
- }
412
- if (this.isObject(query[index])) {
413
- this.validateWhereQuery(query[index]);
414
- }
415
- if (query[index] !== undefined) {
416
- newArrayQuery.push({
417
- [index]: query[index],
418
- } as FindOptionsWhere<T>);
419
- }
420
- });
421
- }
422
- if (Object.keys(newArrayQuery).length === 0) return undefined;
423
- return newArrayQuery;
424
- } else {
425
- let newQuery: FindOptionsWhere<T> = {};
426
-
427
- const queryKeys = Object.keys(query);
428
-
429
- if (queryKeys.length !== 0) {
430
- queryKeys.map((key) => {
431
- if (this.isArray(query[key])) {
432
- return query[key].map((item) => this.validateWhereQuery(item));
433
- }
434
- if (this.isObject(query[key])) {
435
- this.validateWhereQuery(query[key]);
436
- }
437
- if (query[key] !== undefined) {
438
- newQuery = {
439
- ...newQuery,
440
- [key]: query[key],
441
- } as FindOptionsWhere<T>;
442
- }
443
- });
444
- }
445
- if (Object.keys(newQuery).length === 0) return undefined;
446
- return newQuery;
447
- }
448
- }
449
-
450
- private isObject(value: any): boolean {
451
- return value !== null && typeof value === 'object' && !Array.isArray(value);
452
- }
453
-
454
- private isArray(value: any): boolean {
455
- return value !== null && typeof value === 'object' && Array.isArray(value);
456
- }
457
- }
@@ -1 +0,0 @@
1
- export * from './core-crud.service';
@@ -1 +0,0 @@
1
- export * from './type-orm-naming.strategy';
@@ -1,17 +0,0 @@
1
- import { DefaultNamingStrategy, NamingStrategyInterface } from 'typeorm';
2
- import { snakeCase } from 'typeorm/util/StringUtils';
3
-
4
- export class SnakeNamingStrategy
5
- extends DefaultNamingStrategy
6
- implements NamingStrategyInterface
7
- {
8
- columnName(
9
- propertyName: string,
10
- customName: string,
11
- embeddedPrefixes: string[],
12
- ): string {
13
- return snakeCase(
14
- embeddedPrefixes.concat(customName || propertyName).join('_'),
15
- );
16
- }
17
- }
@@ -1,42 +0,0 @@
1
- import {
2
- ValidatorConstraint,
3
- ValidatorConstraintInterface,
4
- } from 'class-validator';
5
- import { DataSource } from 'typeorm';
6
- import { ValidationArguments } from 'class-validator/types/validation/ValidationArguments';
7
- import { Injectable } from '@nestjs/common';
8
- import { InjectDataSource } from '@nestjs/typeorm';
9
-
10
- type ValidationEntity =
11
- | {
12
- id?: number | string;
13
- }
14
- | undefined;
15
-
16
- @Injectable()
17
- @ValidatorConstraint({ name: 'DoesExist', async: true })
18
- export class DoesExist implements ValidatorConstraintInterface {
19
- constructor(
20
- @InjectDataSource()
21
- private dataSource: DataSource,
22
- ) {}
23
-
24
- async validate(value: string, validationArguments: ValidationArguments) {
25
- const repository = validationArguments.constraints[0] as string;
26
- const pathToProperty = validationArguments.constraints[1];
27
- const targetRepository = this.dataSource.getRepository(repository);
28
- const entity = (await targetRepository.findOne({
29
- where: {
30
- [pathToProperty ? pathToProperty : validationArguments.property]: value
31
- ? value
32
- : value?.[pathToProperty],
33
- },
34
- })) as ValidationEntity;
35
-
36
- if (entity?.id === value) {
37
- return true;
38
- }
39
-
40
- return false;
41
- }
42
- }
@@ -1,28 +0,0 @@
1
- import { plainToClass } from 'class-transformer';
2
- import { validateSync } from 'class-validator';
3
-
4
- export function envValidator(configuration: Record<string, unknown>, EnvironmentSchema: any) {
5
- const finalConfig: string = plainToClass(EnvironmentSchema, configuration, {
6
- enableImplicitConversion: true,
7
- });
8
-
9
- const errors = validateSync(finalConfig, { skipMissingProperties: false });
10
- if (errors.length > 0) {
11
- throw new Error(errors.toString());
12
- }
13
-
14
- return finalConfig;
15
- }
16
-
17
- export function testEnvValidator(configuration: Record<string, unknown>, EnvironmentTestSchema: any) {
18
- const finalConfig: string = plainToClass(EnvironmentTestSchema, configuration, {
19
- enableImplicitConversion: true,
20
- });
21
-
22
- const errors = validateSync(finalConfig, { skipMissingProperties: false });
23
- if (errors.length > 0) {
24
- throw new Error(errors.toString());
25
- }
26
-
27
- return finalConfig;
28
- }
@@ -1,4 +0,0 @@
1
- export * from './does-exist.validator';
2
- export * from './env.validator';
3
- export * from './is-unique.validator';
4
- export * from './validation-options';
@@ -1,70 +0,0 @@
1
- import {
2
- IsNotIn,
3
- ValidatorConstraint,
4
- ValidatorConstraintInterface,
5
- } from 'class-validator';
6
- import { DataSource, FindOptionsWhere } from 'typeorm';
7
- import { ValidationArguments } from 'class-validator/types/validation/ValidationArguments';
8
- import { Injectable } from '@nestjs/common';
9
- import { InjectDataSource } from '@nestjs/typeorm';
10
- import {
11
- CustomConstraintsInterface,
12
- CustomValidationArguments,
13
- CustomValidatorConstraintInterface,
14
- } from '../interface/custom-validation-arguments.interface';
15
-
16
- type ValidationEntity =
17
- | {
18
- id?: number | string;
19
- }
20
- | undefined;
21
-
22
- @Injectable()
23
- @ValidatorConstraint({ name: 'IsUnique', async: true })
24
- export class IsUnique implements CustomValidatorConstraintInterface {
25
- constructor(
26
- @InjectDataSource()
27
- private dataSource: DataSource,
28
- ) {}
29
-
30
- async validate(
31
- value: string,
32
- validationArguments: CustomValidationArguments,
33
- ) {
34
- const repository = validationArguments.constraints[0]?.repository;
35
- const targetRepository = this.dataSource.getRepository(repository);
36
-
37
- const pathToProperty =
38
- validationArguments.constraints[0]?.pathToProperty ??
39
- validationArguments.property;
40
- const whereQuery =
41
- (validationArguments?.constraints[0]?.whereQuery as FindOptionsWhere<
42
- typeof targetRepository
43
- >) ?? [];
44
-
45
- let combineQuery = {};
46
-
47
- validationArguments?.constraints[0]?.stringPropertyQuery?.map(
48
- (condition: string) => {
49
- combineQuery = {
50
- ...combineQuery,
51
- [condition]: validationArguments.object?.[condition],
52
- };
53
- },
54
- );
55
- const entity = (await targetRepository.findOne({
56
- where: {
57
- [pathToProperty ? pathToProperty : validationArguments.property]: value
58
- ? value
59
- : value?.[pathToProperty],
60
- ...whereQuery,
61
- },
62
- })) as ValidationEntity;
63
-
64
- if (entity?.id) {
65
- return false;
66
- }
67
-
68
- return true;
69
- }
70
- }
@@ -1,38 +0,0 @@
1
- import {
2
- HttpException,
3
- HttpStatus,
4
- ValidationError,
5
- ValidationPipeOptions,
6
- } from '@nestjs/common';
7
- import { MessageFormatter } from '../helper/message-formatter.helper';
8
-
9
- function mapValidationErrors(errors: ValidationError[]): any {
10
- return errors.reduce((result, error) => {
11
- const constraints = error.constraints
12
- ? Object.values(error.constraints)
13
- .map((message) => MessageFormatter.replace(message, error.property))
14
- .join(', ')
15
- : null;
16
-
17
- result[error.property] =
18
- constraints || mapValidationErrors(error.children || []);
19
- return result;
20
- }, {});
21
- }
22
-
23
- const validationOptions: ValidationPipeOptions = {
24
- transform: true,
25
- whitelist: true,
26
- errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY,
27
- exceptionFactory: (errors: ValidationError[]) =>
28
- new HttpException(
29
- {
30
- status: HttpStatus.UNPROCESSABLE_ENTITY,
31
- message: `Validation failed: ${errors.length} errors found`,
32
- details: mapValidationErrors(errors),
33
- },
34
- HttpStatus.UNPROCESSABLE_ENTITY,
35
- ),
36
- };
37
-
38
- export default validationOptions;