@koalarx/nest 0.0.9 → 1.0.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 (146) hide show
  1. package/core/backgroud-services/cron-service/cron-job.d.ts +14 -0
  2. package/{common → core}/backgroud-services/cron-service/cron-job.js +18 -16
  3. package/core/backgroud-services/cron-service/cron-job.spec.d.ts +8 -0
  4. package/core/backgroud-services/cron-service/cron-job.spec.js +33 -0
  5. package/core/backgroud-services/event-service/event-class.d.ts +5 -0
  6. package/{common → core}/backgroud-services/event-service/event-class.js +3 -3
  7. package/core/backgroud-services/event-service/event-handler.d.ts +5 -0
  8. package/core/backgroud-services/event-service/event-job.d.ts +13 -0
  9. package/{common → core}/backgroud-services/event-service/event-job.js +4 -2
  10. package/{common → core}/backgroud-services/event-service/event-queue.js +9 -6
  11. package/core/backgroud-services/event-service/event-queue.spec.d.ts +1 -0
  12. package/core/backgroud-services/event-service/event-queue.spec.js +34 -0
  13. package/core/controllers/created-registre-response.base.d.ts +4 -0
  14. package/{common → core}/controllers/created-registre-response.base.js +5 -1
  15. package/{common → core}/controllers/list-response.base.js +5 -1
  16. package/core/controllers/schemas/boolean.schema.d.ts +2 -0
  17. package/core/controllers/schemas/boolean.schema.js +15 -0
  18. package/core/database/entity.base.d.ts +9 -0
  19. package/core/database/entity.base.js +39 -0
  20. package/{services/prisma → core/database}/prisma-transactional-client.d.ts +1 -2
  21. package/{services/prisma → core/database}/prisma.service.js +5 -1
  22. package/core/database/repository.base.d.ts +29 -13
  23. package/core/database/repository.base.js +142 -15
  24. package/core/koala-app.d.ts +10 -8
  25. package/core/koala-app.js +41 -8
  26. package/core/koala-global-vars.d.ts +7 -0
  27. package/core/koala-global-vars.js +9 -0
  28. package/core/koala-nest-database.module.d.ts +2 -2
  29. package/core/koala-nest-database.module.js +18 -18
  30. package/core/koala-nest-http.module.d.ts +5 -5
  31. package/core/koala-nest-http.module.js +8 -14
  32. package/core/koala-nest.module.d.ts +1 -3
  33. package/core/koala-nest.module.js +12 -18
  34. package/core/mapping/auto-mapping-class-context.d.ts +15 -0
  35. package/core/mapping/auto-mapping-class-context.js +18 -0
  36. package/core/mapping/auto-mapping-context.d.ts +11 -0
  37. package/core/mapping/auto-mapping-context.js +24 -0
  38. package/core/mapping/auto-mapping-list.d.ts +18 -0
  39. package/core/mapping/auto-mapping-list.js +46 -0
  40. package/core/mapping/auto-mapping-profile.d.ts +3 -0
  41. package/core/mapping/auto-mapping-profile.js +6 -0
  42. package/core/mapping/auto-mapping.decorator.d.ts +9 -0
  43. package/core/mapping/auto-mapping.decorator.js +27 -0
  44. package/core/mapping/auto-mapping.module.d.ts +5 -0
  45. package/core/mapping/auto-mapping.module.js +28 -0
  46. package/core/mapping/auto-mapping.service.d.ts +10 -0
  47. package/core/mapping/auto-mapping.service.js +93 -0
  48. package/core/mapping/create-map.d.ts +3 -0
  49. package/core/mapping/create-map.js +8 -0
  50. package/core/mapping/for-member.d.ts +5 -0
  51. package/core/mapping/for-member.js +9 -0
  52. package/{common → core}/models/pagination-params.d.ts +3 -0
  53. package/{common → core}/models/pagination-params.js +11 -4
  54. package/{common/mediator → core/request-overflow}/request-handler.base.d.ts +1 -1
  55. package/core/request-overflow/request-result.spec.d.ts +1 -0
  56. package/core/request-overflow/request-result.spec.js +21 -0
  57. package/{common/mediator → core/request-overflow}/request-validator.base.d.ts +1 -1
  58. package/{common/mediator → core/request-overflow}/request-validator.base.js +1 -1
  59. package/core/utils/assing-object.d.ts +2 -0
  60. package/core/utils/assing-object.js +7 -0
  61. package/core/utils/interfaces/icomparable.d.ts +1 -1
  62. package/core/utils/list.d.ts +17 -6
  63. package/core/utils/list.js +62 -15
  64. package/core/utils/list.spec.d.ts +1 -0
  65. package/core/utils/list.spec.js +42 -0
  66. package/{services/env → env}/env.d.ts +6 -6
  67. package/{services/env → env}/env.js +2 -2
  68. package/{services/env → env}/env.service.d.ts +2 -2
  69. package/{services/env → env}/env.service.js +6 -1
  70. package/filters/domain-errors.filter.d.ts +7 -7
  71. package/filters/domain-errors.filter.js +7 -7
  72. package/filters/global-exception.filter.js +5 -1
  73. package/package.json +10 -27
  74. package/services/redis/redis.service.d.ts +1 -1
  75. package/services/redis/redis.service.js +6 -1
  76. package/services/redlock/red-lock.service.js +6 -1
  77. package/test/koala-app-test-dependencies.d.ts +10 -0
  78. package/test/koala-app-test-dependencies.js +13 -0
  79. package/test/koala-app-test.d.ts +20 -0
  80. package/test/koala-app-test.js +66 -0
  81. package/test/repositories/in-memory-base.repository.d.ts +16 -0
  82. package/test/repositories/in-memory-base.repository.js +55 -0
  83. package/test/services/fake-logging.service.d.ts +4 -0
  84. package/test/services/fake-logging.service.js +9 -0
  85. package/test/services/fake-red-lock.service.d.ts +5 -0
  86. package/test/services/fake-red-lock.service.js +11 -0
  87. package/test/utils/create-e2e-database.d.ts +2 -0
  88. package/test/utils/create-e2e-database.js +27 -0
  89. package/test/utils/drop-e2e-database.d.ts +1 -0
  90. package/test/utils/drop-e2e-database.js +8 -0
  91. package/test/utils/wait-for.d.ts +1 -0
  92. package/test/utils/wait-for.js +22 -0
  93. package/tsconfig.lib.tsbuildinfo +1 -0
  94. package/common/backgroud-services/cron-service/cron-job.d.ts +0 -15
  95. package/common/backgroud-services/event-service/event-class.d.ts +0 -5
  96. package/common/backgroud-services/event-service/event-handler.d.ts +0 -5
  97. package/common/backgroud-services/event-service/event-job.d.ts +0 -10
  98. package/common/controllers/created-registre-response.base.d.ts +0 -4
  99. package/core/database/entity.d.ts +0 -8
  100. package/core/database/entity.js +0 -31
  101. package/decorators/is-cnpj.decorator.d.ts +0 -2
  102. package/decorators/is-cnpj.decorator.js +0 -71
  103. package/services/prisma/prisma.types.d.ts +0 -36
  104. package/services/prisma/prisma.types.js +0 -15
  105. /package/{common → core}/backgroud-services/event-service/event-handler.js +0 -0
  106. /package/{common → core}/backgroud-services/event-service/event-is-trigger.d.ts +0 -0
  107. /package/{common → core}/backgroud-services/event-service/event-is-trigger.js +0 -0
  108. /package/{common → core}/backgroud-services/event-service/event-queue.d.ts +0 -0
  109. /package/{common → core}/controllers/base.controller.d.ts +0 -0
  110. /package/{common → core}/controllers/base.controller.js +0 -0
  111. /package/{common → core}/controllers/list-response.base.d.ts +0 -0
  112. /package/{common → core}/controllers/router-config.base.d.ts +0 -0
  113. /package/{common → core}/controllers/router-config.base.js +0 -0
  114. /package/{common → core}/controllers/schemas/document-number.schema.d.ts +0 -0
  115. /package/{common → core}/controllers/schemas/document-number.schema.js +0 -0
  116. /package/{common → core}/controllers/schemas/email.schema.d.ts +0 -0
  117. /package/{common → core}/controllers/schemas/email.schema.js +0 -0
  118. /package/{common → core}/controllers/schemas/list-query.schema.d.ts +0 -0
  119. /package/{common → core}/controllers/schemas/list-query.schema.js +0 -0
  120. /package/{common → core}/controllers/schemas/native-enum.schema.d.ts +0 -0
  121. /package/{common → core}/controllers/schemas/native-enum.schema.js +0 -0
  122. /package/{services/prisma → core/database}/prisma-client-with-custom-transaction.interface.d.ts +0 -0
  123. /package/{services/prisma → core/database}/prisma-client-with-custom-transaction.interface.js +0 -0
  124. /package/{services/prisma → core/database}/prisma-transactional-client.js +0 -0
  125. /package/{services/prisma → core/database}/prisma.service.d.ts +0 -0
  126. /package/{common → core}/errors/bad-request.error.d.ts +0 -0
  127. /package/{common → core}/errors/bad-request.error.js +0 -0
  128. /package/{common → core}/errors/conflict.error.d.ts +0 -0
  129. /package/{common → core}/errors/conflict.error.js +0 -0
  130. /package/{common → core}/errors/no-content.error.d.ts +0 -0
  131. /package/{common → core}/errors/no-content.error.js +0 -0
  132. /package/{common → core}/errors/not-allowed.error.d.ts +0 -0
  133. /package/{common → core}/errors/not-allowed.error.js +0 -0
  134. /package/{common → core}/errors/resource-not-found.error.d.ts +0 -0
  135. /package/{common → core}/errors/resource-not-found.error.js +0 -0
  136. /package/{common → core}/errors/use-case-error.d.ts +0 -0
  137. /package/{common → core}/errors/use-case-error.js +0 -0
  138. /package/{common → core}/errors/user-already-exist.error.d.ts +0 -0
  139. /package/{common → core}/errors/user-already-exist.error.js +0 -0
  140. /package/{common → core}/errors/wrong-credentials.error.d.ts +0 -0
  141. /package/{common → core}/errors/wrong-credentials.error.js +0 -0
  142. /package/{common/mediator → core/request-overflow}/request-handler.base.js +0 -0
  143. /package/{common/mediator → core/request-overflow}/request-result.d.ts +0 -0
  144. /package/{common/mediator → core/request-overflow}/request-result.js +0 -0
  145. /package/{services/env → env}/env.module.d.ts +0 -0
  146. /package/{services/env → env}/env.module.js +0 -0
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AutoMappingService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const list_1 = require("../utils/list");
15
+ const auto_mapping_list_1 = require("./auto-mapping-list");
16
+ const auto_mapping_profile_1 = require("./auto-mapping-profile");
17
+ let AutoMappingService = exports.AutoMappingService = class AutoMappingService {
18
+ _contextList = auto_mapping_list_1.AutoMappingList;
19
+ constructor(automappingProfile) {
20
+ automappingProfile.profile();
21
+ }
22
+ map(data, source, target) {
23
+ const { mapContext, propSourceContext, propTargetContext } = this._contextList.get(source, target);
24
+ if (!mapContext) {
25
+ throw new Error(`No mapping context found for ${source.name} to ${target.name}`);
26
+ }
27
+ const mappedTarget = new target.prototype.constructor();
28
+ propSourceContext?.props.forEach((propSource) => {
29
+ const value = data[propSource.name];
30
+ const compositionType = propSource.compositionType;
31
+ const compositionAction = propSource.compositionAction;
32
+ if (value) {
33
+ const targetProp = propTargetContext?.props.find((tp) => tp.name === propSource.name);
34
+ if (targetProp) {
35
+ const listToArray = propSource.type === list_1.List.name &&
36
+ targetProp.type === Array.name &&
37
+ value instanceof list_1.List;
38
+ const arrayToList = propSource.type === Array.name &&
39
+ targetProp.type === list_1.List.name &&
40
+ value instanceof Array &&
41
+ !!compositionType;
42
+ let mappedValue = value;
43
+ if (listToArray) {
44
+ mappedValue = this.mapListToArray(value);
45
+ }
46
+ else if (arrayToList) {
47
+ mappedValue = this.mapArrayToList(value, compositionType, compositionAction === 'onlySet');
48
+ }
49
+ mappedTarget[targetProp.name] = mappedValue;
50
+ }
51
+ }
52
+ });
53
+ Object.keys(mappedTarget).forEach((key) => {
54
+ const formMemberDefinition = mapContext.forMemberDifinitions?.find((def) => def[key])?.[key];
55
+ if (formMemberDefinition) {
56
+ mappedTarget[key] = formMemberDefinition(data);
57
+ }
58
+ });
59
+ return mappedTarget;
60
+ }
61
+ mapNestedProp(data, source) {
62
+ const targets = this._contextList.getTargets(source.prototype.constructor);
63
+ if (targets.length >= 1) {
64
+ return this.map(data, source.prototype.constructor, targets[0]);
65
+ }
66
+ }
67
+ mapListToArray(value) {
68
+ return value
69
+ .toArray()
70
+ .map((item) => {
71
+ const entityOnList = value.entityType?.prototype.constructor;
72
+ if (entityOnList) {
73
+ return this.mapNestedProp(item, entityOnList) ?? {};
74
+ }
75
+ return {};
76
+ });
77
+ }
78
+ mapArrayToList(value, compositionType, onlySet = true) {
79
+ const list = new list_1.List(compositionType.prototype.constructor);
80
+ const mappedValue = value.map((item) => this.mapNestedProp(item, compositionType.prototype.constructor) ?? {});
81
+ if (onlySet) {
82
+ list.setList(mappedValue);
83
+ }
84
+ else {
85
+ list.update(mappedValue);
86
+ }
87
+ return list;
88
+ }
89
+ };
90
+ exports.AutoMappingService = AutoMappingService = __decorate([
91
+ (0, common_1.Injectable)(),
92
+ __metadata("design:paramtypes", [auto_mapping_profile_1.AutoMappingProfile])
93
+ ], AutoMappingService);
@@ -0,0 +1,3 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { ForMemberDefinition } from './for-member';
3
+ export declare function createMap<TSource, TTarget>(source: Type<TSource>, target: Type<TTarget>, ...formMember: ForMemberDefinition<TTarget, TSource>): void;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMap = void 0;
4
+ const auto_mapping_list_1 = require("./auto-mapping-list");
5
+ function createMap(source, target, ...formMember) {
6
+ auto_mapping_list_1.AutoMappingList.add(source, target, ...formMember);
7
+ }
8
+ exports.createMap = createMap;
@@ -0,0 +1,5 @@
1
+ export type ForMemberResult<TTarget, TSource> = {
2
+ [Key in keyof TTarget]: (source: TSource) => TTarget[Key];
3
+ };
4
+ export type ForMemberDefinition<TTarget, TSource> = Array<Partial<ForMemberResult<TTarget, TSource>>>;
5
+ export declare function forMember<TTarget, TSource>(targetProp: keyof TTarget, map: (source: TSource) => TTarget[keyof TTarget]): Partial<ForMemberResult<TTarget, TSource>>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.forMember = void 0;
4
+ function forMember(targetProp, map) {
5
+ return {
6
+ [targetProp]: map,
7
+ };
8
+ }
9
+ exports.forMember = forMember;
@@ -4,6 +4,9 @@ export declare const QueryFilterParams: {
4
4
  page: number;
5
5
  limit: number;
6
6
  };
7
+ export type PaginatedRequestProps<T extends PaginationParams> = Omit<{
8
+ [K in keyof T as T[K] extends Function ? never : K]: T[K];
9
+ }, '_id'>;
7
10
  export declare class PaginationParams {
8
11
  page?: number;
9
12
  limit?: number;
@@ -5,6 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.PaginationParams = exports.QueryFilterParams = void 0;
10
13
  const swagger_1 = require("@nestjs/swagger");
@@ -37,24 +40,28 @@ __decorate([
37
40
  required: false,
38
41
  format: 'int32',
39
42
  default: exports.QueryFilterParams.page,
40
- })
43
+ }),
44
+ __metadata("design:type", Number)
41
45
  ], PaginationParams.prototype, "page", void 0);
42
46
  __decorate([
43
47
  (0, swagger_1.ApiProperty)({
44
48
  required: false,
45
49
  format: 'int32',
46
50
  default: exports.QueryFilterParams.limit,
47
- })
51
+ }),
52
+ __metadata("design:type", Number)
48
53
  ], PaginationParams.prototype, "limit", void 0);
49
54
  __decorate([
50
55
  (0, swagger_1.ApiProperty)({
51
56
  required: false,
52
- })
57
+ }),
58
+ __metadata("design:type", String)
53
59
  ], PaginationParams.prototype, "orderBy", void 0);
54
60
  __decorate([
55
61
  (0, swagger_1.ApiProperty)({
56
62
  required: false,
57
63
  enum: ['asc', 'desc'],
58
64
  default: exports.QueryFilterParams.direction,
59
- })
65
+ }),
66
+ __metadata("design:type", String)
60
67
  ], PaginationParams.prototype, "direction", void 0);
@@ -1,4 +1,4 @@
1
- import { RequestResult } from '../../common/mediator/request-result';
1
+ import { RequestResult } from './request-result';
2
2
  export declare abstract class RequestHandlerBase<TRequest, TResponse extends RequestResult<Error, any>> {
3
3
  abstract handle(req: TRequest): Promise<TResponse>;
4
4
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const request_result_1 = require("./request-result");
4
+ function doSometing(shouldSuccess) {
5
+ if (shouldSuccess) {
6
+ return (0, request_result_1.ok)(10);
7
+ }
8
+ else {
9
+ return (0, request_result_1.failure)('error');
10
+ }
11
+ }
12
+ test('success result', () => {
13
+ const result = doSometing(true);
14
+ expect(result.isOk()).toBe(true);
15
+ expect(result.isFailure()).toBe(false);
16
+ });
17
+ test('error result', () => {
18
+ const result = doSometing(false);
19
+ expect(result.isFailure()).toBe(true);
20
+ expect(result.isOk()).toBe(false);
21
+ });
@@ -2,6 +2,6 @@ import { ZodType } from 'zod';
2
2
  export declare abstract class RequestValidatorBase<TRequest> {
3
3
  private _request;
4
4
  constructor(_request: TRequest);
5
- validate(): any;
5
+ validate(): TRequest;
6
6
  protected abstract get schema(): ZodType;
7
7
  }
@@ -9,7 +9,7 @@ class RequestValidatorBase {
9
9
  validate() {
10
10
  const requestParsed = this.schema.safeParse(this._request);
11
11
  if (requestParsed.success) {
12
- return requestParsed.data;
12
+ return Object.assign(this._request, requestParsed.data);
13
13
  }
14
14
  throw requestParsed.error;
15
15
  }
@@ -0,0 +1,2 @@
1
+ import { Type } from "@nestjs/common";
2
+ export declare function assignObject<T>(target: Type<T>, source: T): T;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assignObject = void 0;
4
+ function assignObject(target, source) {
5
+ return Object.assign(new target(), source);
6
+ }
7
+ exports.assignObject = assignObject;
@@ -1,5 +1,5 @@
1
1
  export type IComparableId = string | number;
2
2
  export declare abstract class IComparable<T = any> {
3
- abstract id: IComparableId;
3
+ abstract _id: IComparableId;
4
4
  abstract equals(obj: IComparable<T>): boolean;
5
5
  }
@@ -1,24 +1,35 @@
1
+ import { Type } from '@nestjs/common';
2
+ import 'reflect-metadata';
1
3
  import { IComparableId } from './interfaces/icomparable';
2
4
  export type ListActionType = 'added' | 'updated' | 'removed';
5
+ export interface ListProps<T> {
6
+ list?: T[];
7
+ entityType?: Type<T>;
8
+ }
3
9
  export declare class List<T> {
10
+ readonly entityType?: Type<T> | undefined;
4
11
  private _list;
5
12
  private _addedItemsList;
6
13
  private _updatedItemsList;
7
14
  private _removedItemsList;
8
- constructor(list?: T[]);
15
+ constructor(entityType?: Type<T> | undefined);
9
16
  get length(): number;
10
17
  findById(id: IComparableId): T | null;
11
18
  findByValue(value: any): T | null;
12
- add(item: T): void;
13
- remove(item: T): void;
14
- clear(): void;
15
- forEach(callback: (item: T, index: number) => void): void;
16
- forEachAsync(callback: (item: T, index: number) => Promise<void>): Promise<void[]>;
19
+ setList(list: T[]): this;
20
+ add(item: T): this | undefined;
21
+ remove(item: T): this;
22
+ update(items: T[]): this;
23
+ clear(): this;
24
+ forEach(callback: (item: T, index: number) => void): this;
25
+ forEachAsync(callback: (item: T, index: number) => Promise<void>): Promise<this>;
17
26
  map<U>(callback: (item: T, index: number) => U): List<U>;
18
27
  mapAsync<U>(callback: (item: T, index: number) => Promise<U>): Promise<List<U>>;
19
28
  filter(callback: (item: T, index: number) => boolean): List<T>;
20
29
  filterAsync(callback: (item: T, index: number) => Promise<boolean>): Promise<List<T>>;
30
+ find(callback: (item: T, index: number) => boolean): T | null;
21
31
  toArray(type?: ListActionType): T[];
22
32
  private indexOf;
23
33
  private contains;
34
+ private mapInternalIdIfIsEmpty;
24
35
  }
@@ -1,26 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.List = void 0;
4
- const entity_1 = require("../database/entity");
4
+ require("reflect-metadata");
5
+ const entity_base_1 = require("../database/entity.base");
5
6
  class List {
7
+ entityType;
6
8
  _list = [];
7
9
  _addedItemsList = [];
8
10
  _updatedItemsList = [];
9
11
  _removedItemsList = [];
10
- constructor(list = []) {
11
- this._list = list;
12
+ constructor(entityType) {
13
+ this.entityType = entityType;
12
14
  }
13
15
  get length() {
14
16
  return this._list.length;
15
17
  }
16
18
  findById(id) {
17
19
  return (this._list
18
- .filter((item) => item instanceof entity_1.Entity)
19
- .find((item) => item.id === id) ?? null);
20
+ .filter((item) => item instanceof entity_base_1.EntityBase)
21
+ .find((item) => item._id === id || item.id === id) ??
22
+ null);
20
23
  }
21
24
  findByValue(value) {
22
25
  return this._list.find((item) => item === value) ?? null;
23
26
  }
27
+ setList(list) {
28
+ this._list = this.mapInternalIdIfIsEmpty(list);
29
+ return this;
30
+ }
24
31
  add(item) {
25
32
  if (this.contains(item)) {
26
33
  this._list[this.indexOf(item)] = item;
@@ -31,6 +38,7 @@ class List {
31
38
  }
32
39
  this._list.push(item);
33
40
  this._addedItemsList.push(item);
41
+ return this;
34
42
  }
35
43
  remove(item) {
36
44
  const index = this.indexOf(item);
@@ -40,30 +48,60 @@ class List {
40
48
  this._removedItemsList.push(item);
41
49
  }
42
50
  }
51
+ return this;
52
+ }
53
+ update(items) {
54
+ items = this.mapInternalIdIfIsEmpty(items);
55
+ items.forEach((item) => this.add(item));
56
+ this._list
57
+ .filter((item) => !this.contains(item, items))
58
+ .forEach((item) => this.remove(item));
59
+ return this;
43
60
  }
44
61
  clear() {
62
+ this._addedItemsList = [];
63
+ this._updatedItemsList = [];
45
64
  this._removedItemsList = this._list;
46
65
  this._list = [];
66
+ return this;
47
67
  }
48
68
  forEach(callback) {
49
69
  this._list.forEach(callback);
70
+ return this;
50
71
  }
51
- forEachAsync(callback) {
52
- return Promise.all(this._list.map(callback));
72
+ async forEachAsync(callback) {
73
+ return Promise.all(this._list.map(callback)).then(() => this);
53
74
  }
54
75
  map(callback) {
55
- return new List(this._list.map(callback));
76
+ const mappedItems = this._list.map(callback);
77
+ const list = new List();
78
+ list.setList(mappedItems);
79
+ return list;
56
80
  }
57
81
  async mapAsync(callback) {
58
- return Promise.all(this._list.map(callback)).then((list) => new List(list));
82
+ return Promise.all(this._list.map(callback)).then((mappedItems) => {
83
+ const mappedList = new List();
84
+ mappedList.setList(mappedItems);
85
+ return mappedList;
86
+ });
59
87
  }
60
88
  filter(callback) {
61
- return new List(this._list.filter(callback));
89
+ const filteredItems = this._list.filter(callback);
90
+ const list = new List();
91
+ list.setList(filteredItems);
92
+ return list;
62
93
  }
63
94
  async filterAsync(callback) {
64
95
  return Promise.all(this._list.filter(callback))
65
96
  .then((list) => list.filter((item) => item))
66
- .then((list) => new List(list));
97
+ .then((filteredItems) => {
98
+ const list = new List();
99
+ list.setList(filteredItems);
100
+ return list;
101
+ });
102
+ }
103
+ find(callback) {
104
+ return this._list.find(callback) ?? null;
67
105
  }
68
106
  toArray(type) {
69
107
  switch (type) {
@@ -78,17 +116,26 @@ class List {
78
116
  }
79
117
  }
80
118
  indexOf(item, list = this._list) {
81
- if (item instanceof entity_1.Entity) {
119
+ if (item instanceof entity_base_1.EntityBase) {
82
120
  return list
83
- .filter((i) => i instanceof entity_1.Entity)
84
- .findIndex((i) => item.id === i.id);
121
+ .filter((i) => i instanceof entity_base_1.EntityBase)
122
+ .findIndex((i) => item._id === i._id ||
123
+ item.id === i.id);
85
124
  }
86
125
  return list
87
- .filter((i) => !(i instanceof entity_1.Entity))
126
+ .filter((i) => !(i instanceof entity_base_1.EntityBase))
88
127
  .findIndex((i) => item === i);
89
128
  }
90
129
  contains(item, list = this._list) {
91
130
  return this.indexOf(item, list) > -1;
92
131
  }
132
+ mapInternalIdIfIsEmpty(list) {
133
+ return list.map((item) => {
134
+ if (item instanceof entity_base_1.EntityBase && !item._id) {
135
+ item._id = item.id;
136
+ }
137
+ return item;
138
+ });
139
+ }
93
140
  }
94
141
  exports.List = List;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const entity_base_1 = require("../database/entity.base");
4
+ const list_1 = require("./list");
5
+ class EntityTest extends entity_base_1.EntityBase {
6
+ id;
7
+ value;
8
+ constructor(props) {
9
+ super();
10
+ this.automap(props);
11
+ }
12
+ }
13
+ describe('List test', () => {
14
+ let entity;
15
+ beforeEach(() => {
16
+ entity = new EntityTest({ id: 1, value: 1 });
17
+ });
18
+ it('should add item on list', () => {
19
+ const list = new list_1.List();
20
+ list.add(1);
21
+ expect(list.toArray('added').length).toBe(1);
22
+ expect(list.toArray('added')[0]).toEqual(1);
23
+ });
24
+ it('should update item on list', () => {
25
+ const list = new list_1.List(EntityTest).setList([entity]);
26
+ entity.value = 2;
27
+ list.add(entity);
28
+ expect(list.toArray('updated').length).toBe(1);
29
+ expect(list.toArray('updated')[0].value).toEqual(2);
30
+ });
31
+ it('should remove item on list', () => {
32
+ const list = new list_1.List(EntityTest).setList([entity]);
33
+ list.remove(entity);
34
+ expect(list.toArray().length).toBe(0);
35
+ expect(list.toArray('removed').length).toBe(1);
36
+ expect(list.toArray('removed')[0].value).toEqual(1);
37
+ });
38
+ it('should get item by id', () => {
39
+ const list = new list_1.List(EntityTest).setList([entity]);
40
+ expect(list.findById(entity.id)).toEqual(entity);
41
+ });
42
+ });
@@ -4,22 +4,22 @@ export declare const envSchema: z.ZodObject<{
4
4
  PORT: z.ZodDefault<z.ZodNumber>;
5
5
  NODE_ENV: z.ZodEnum<["test", "develop", "staging", "production"]>;
6
6
  PRISMA_QUERY_LOG: z.ZodBoolean;
7
- SWAGGER_USERNAME: z.ZodString;
8
- SWAGGER_PASSWORD: z.ZodString;
7
+ SWAGGER_USERNAME: z.ZodOptional<z.ZodString>;
8
+ SWAGGER_PASSWORD: z.ZodOptional<z.ZodString>;
9
9
  REDIS_CONNECTION_STRING: z.ZodString;
10
10
  }, "strip", z.ZodTypeAny, {
11
11
  NODE_ENV: "test" | "develop" | "staging" | "production";
12
12
  PORT: number;
13
13
  PRISMA_QUERY_LOG: boolean;
14
- SWAGGER_USERNAME: string;
15
- SWAGGER_PASSWORD: string;
16
14
  REDIS_CONNECTION_STRING: string;
15
+ SWAGGER_USERNAME?: string | undefined;
16
+ SWAGGER_PASSWORD?: string | undefined;
17
17
  }, {
18
18
  NODE_ENV: "test" | "develop" | "staging" | "production";
19
19
  PRISMA_QUERY_LOG: boolean;
20
- SWAGGER_USERNAME: string;
21
- SWAGGER_PASSWORD: string;
22
20
  REDIS_CONNECTION_STRING: string;
23
21
  PORT?: number | undefined;
22
+ SWAGGER_USERNAME?: string | undefined;
23
+ SWAGGER_PASSWORD?: string | undefined;
24
24
  }>;
25
25
  export type Env = z.infer<typeof envSchema>;
@@ -7,7 +7,7 @@ exports.envSchema = zod_1.z.object({
7
7
  PORT: zod_1.z.coerce.number().default(3000),
8
8
  NODE_ENV: zod_1.z.enum(['test', 'develop', 'staging', 'production']),
9
9
  PRISMA_QUERY_LOG: zod_1.z.coerce.boolean(),
10
- SWAGGER_USERNAME: zod_1.z.string(),
11
- SWAGGER_PASSWORD: zod_1.z.string(),
10
+ SWAGGER_USERNAME: zod_1.z.string().optional(),
11
+ SWAGGER_PASSWORD: zod_1.z.string().optional(),
12
12
  REDIS_CONNECTION_STRING: zod_1.z.string(),
13
13
  });
@@ -7,8 +7,8 @@ export declare class EnvService {
7
7
  NODE_ENV: "test" | "develop" | "staging" | "production";
8
8
  PORT: number;
9
9
  PRISMA_QUERY_LOG: boolean;
10
- SWAGGER_USERNAME: string;
11
- SWAGGER_PASSWORD: string;
12
10
  REDIS_CONNECTION_STRING: string;
11
+ SWAGGER_USERNAME?: string | undefined;
12
+ SWAGGER_PASSWORD?: string | undefined;
13
13
  }, T>;
14
14
  }
@@ -5,9 +5,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.EnvService = void 0;
10
13
  const common_1 = require("@nestjs/common");
14
+ const config_1 = require("@nestjs/config");
11
15
  let EnvService = exports.EnvService = class EnvService {
12
16
  configService;
13
17
  constructor(configService) {
@@ -18,5 +22,6 @@ let EnvService = exports.EnvService = class EnvService {
18
22
  }
19
23
  };
20
24
  exports.EnvService = EnvService = __decorate([
21
- (0, common_1.Injectable)()
25
+ (0, common_1.Injectable)(),
26
+ __metadata("design:paramtypes", [config_1.ConfigService])
22
27
  ], EnvService);
@@ -1,13 +1,13 @@
1
1
  /// <reference types="express" />
2
2
  import { ArgumentsHost } from '@nestjs/common';
3
3
  import { BaseExceptionFilter } from '@nestjs/core';
4
- import { BadRequestError } from '../common/errors/bad-request.error';
5
- import { ConflictError } from '../common/errors/conflict.error';
6
- import { NoContentError } from '../common/errors/no-content.error';
7
- import { NotAllowedError } from '../common/errors/not-allowed.error';
8
- import { ResourceNotFoundError } from '../common/errors/resource-not-found.error';
9
- import { UserAlreadyExist } from '../common/errors/user-already-exist.error';
10
- import { WrongCredentialsError } from '../common/errors/wrong-credentials.error';
4
+ import { BadRequestError } from '../core/errors/bad-request.error';
5
+ import { ConflictError } from '../core/errors/conflict.error';
6
+ import { NoContentError } from '../core/errors/no-content.error';
7
+ import { NotAllowedError } from '../core/errors/not-allowed.error';
8
+ import { ResourceNotFoundError } from '../core/errors/resource-not-found.error';
9
+ import { UserAlreadyExist } from '../core/errors/user-already-exist.error';
10
+ import { WrongCredentialsError } from '../core/errors/wrong-credentials.error';
11
11
  type DomainErrors = NotAllowedError | ResourceNotFoundError | UserAlreadyExist | WrongCredentialsError | ConflictError | BadRequestError | NoContentError;
12
12
  export declare class DomainErrorsFilter extends BaseExceptionFilter {
13
13
  catch(exception: DomainErrors, host: ArgumentsHost): import("express").Response<any, Record<string, any>>;
@@ -9,13 +9,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.DomainErrorsFilter = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
11
  const core_1 = require("@nestjs/core");
12
- const bad_request_error_1 = require("../common/errors/bad-request.error");
13
- const conflict_error_1 = require("../common/errors/conflict.error");
14
- const no_content_error_1 = require("../common/errors/no-content.error");
15
- const not_allowed_error_1 = require("../common/errors/not-allowed.error");
16
- const resource_not_found_error_1 = require("../common/errors/resource-not-found.error");
17
- const user_already_exist_error_1 = require("../common/errors/user-already-exist.error");
18
- const wrong_credentials_error_1 = require("../common/errors/wrong-credentials.error");
12
+ const bad_request_error_1 = require("../core/errors/bad-request.error");
13
+ const conflict_error_1 = require("../core/errors/conflict.error");
14
+ const no_content_error_1 = require("../core/errors/no-content.error");
15
+ const not_allowed_error_1 = require("../core/errors/not-allowed.error");
16
+ const resource_not_found_error_1 = require("../core/errors/resource-not-found.error");
17
+ const user_already_exist_error_1 = require("../core/errors/user-already-exist.error");
18
+ const wrong_credentials_error_1 = require("../core/errors/wrong-credentials.error");
19
19
  const filter_request_params_1 = require("../core/utils/filter-request-params");
20
20
  let DomainErrorsFilter = exports.DomainErrorsFilter = class DomainErrorsFilter extends core_1.BaseExceptionFilter {
21
21
  catch(exception, host) {
@@ -5,6 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.GlobalExceptionsFilter = void 0;
10
13
  const common_1 = require("@nestjs/common");
@@ -35,5 +38,6 @@ let GlobalExceptionsFilter = exports.GlobalExceptionsFilter = class GlobalExcept
35
38
  }
36
39
  };
37
40
  exports.GlobalExceptionsFilter = GlobalExceptionsFilter = __decorate([
38
- (0, common_1.Catch)()
41
+ (0, common_1.Catch)(),
42
+ __metadata("design:paramtypes", [core_1.AbstractHttpAdapter])
39
43
  ], GlobalExceptionsFilter);