@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.
- package/core/backgroud-services/cron-service/cron-job.d.ts +14 -0
- package/{common → core}/backgroud-services/cron-service/cron-job.js +18 -16
- package/core/backgroud-services/cron-service/cron-job.spec.d.ts +8 -0
- package/core/backgroud-services/cron-service/cron-job.spec.js +33 -0
- package/core/backgroud-services/event-service/event-class.d.ts +5 -0
- package/{common → core}/backgroud-services/event-service/event-class.js +3 -3
- package/core/backgroud-services/event-service/event-handler.d.ts +5 -0
- package/core/backgroud-services/event-service/event-job.d.ts +13 -0
- package/{common → core}/backgroud-services/event-service/event-job.js +4 -2
- package/{common → core}/backgroud-services/event-service/event-queue.js +9 -6
- package/core/backgroud-services/event-service/event-queue.spec.d.ts +1 -0
- package/core/backgroud-services/event-service/event-queue.spec.js +34 -0
- package/core/controllers/created-registre-response.base.d.ts +4 -0
- package/{common → core}/controllers/created-registre-response.base.js +5 -1
- package/{common → core}/controllers/list-response.base.js +5 -1
- package/core/controllers/schemas/boolean.schema.d.ts +2 -0
- package/core/controllers/schemas/boolean.schema.js +15 -0
- package/core/database/entity.base.d.ts +9 -0
- package/core/database/entity.base.js +39 -0
- package/{services/prisma → core/database}/prisma-transactional-client.d.ts +1 -2
- package/{services/prisma → core/database}/prisma.service.js +5 -1
- package/core/database/repository.base.d.ts +29 -13
- package/core/database/repository.base.js +142 -15
- package/core/koala-app.d.ts +10 -8
- package/core/koala-app.js +41 -8
- package/core/koala-global-vars.d.ts +7 -0
- package/core/koala-global-vars.js +9 -0
- package/core/koala-nest-database.module.d.ts +2 -2
- package/core/koala-nest-database.module.js +18 -18
- package/core/koala-nest-http.module.d.ts +5 -5
- package/core/koala-nest-http.module.js +8 -14
- package/core/koala-nest.module.d.ts +1 -3
- package/core/koala-nest.module.js +12 -18
- package/core/mapping/auto-mapping-class-context.d.ts +15 -0
- package/core/mapping/auto-mapping-class-context.js +18 -0
- package/core/mapping/auto-mapping-context.d.ts +11 -0
- package/core/mapping/auto-mapping-context.js +24 -0
- package/core/mapping/auto-mapping-list.d.ts +18 -0
- package/core/mapping/auto-mapping-list.js +46 -0
- package/core/mapping/auto-mapping-profile.d.ts +3 -0
- package/core/mapping/auto-mapping-profile.js +6 -0
- package/core/mapping/auto-mapping.decorator.d.ts +9 -0
- package/core/mapping/auto-mapping.decorator.js +27 -0
- package/core/mapping/auto-mapping.module.d.ts +5 -0
- package/core/mapping/auto-mapping.module.js +28 -0
- package/core/mapping/auto-mapping.service.d.ts +10 -0
- package/core/mapping/auto-mapping.service.js +93 -0
- package/core/mapping/create-map.d.ts +3 -0
- package/core/mapping/create-map.js +8 -0
- package/core/mapping/for-member.d.ts +5 -0
- package/core/mapping/for-member.js +9 -0
- package/{common → core}/models/pagination-params.d.ts +3 -0
- package/{common → core}/models/pagination-params.js +11 -4
- package/{common/mediator → core/request-overflow}/request-handler.base.d.ts +1 -1
- package/core/request-overflow/request-result.spec.d.ts +1 -0
- package/core/request-overflow/request-result.spec.js +21 -0
- package/{common/mediator → core/request-overflow}/request-validator.base.d.ts +1 -1
- package/{common/mediator → core/request-overflow}/request-validator.base.js +1 -1
- package/core/utils/assing-object.d.ts +2 -0
- package/core/utils/assing-object.js +7 -0
- package/core/utils/interfaces/icomparable.d.ts +1 -1
- package/core/utils/list.d.ts +17 -6
- package/core/utils/list.js +62 -15
- package/core/utils/list.spec.d.ts +1 -0
- package/core/utils/list.spec.js +42 -0
- package/{services/env → env}/env.d.ts +6 -6
- package/{services/env → env}/env.js +2 -2
- package/{services/env → env}/env.service.d.ts +2 -2
- package/{services/env → env}/env.service.js +6 -1
- package/filters/domain-errors.filter.d.ts +7 -7
- package/filters/domain-errors.filter.js +7 -7
- package/filters/global-exception.filter.js +5 -1
- package/package.json +10 -27
- package/services/redis/redis.service.d.ts +1 -1
- package/services/redis/redis.service.js +6 -1
- package/services/redlock/red-lock.service.js +6 -1
- package/test/koala-app-test-dependencies.d.ts +10 -0
- package/test/koala-app-test-dependencies.js +13 -0
- package/test/koala-app-test.d.ts +20 -0
- package/test/koala-app-test.js +66 -0
- package/test/repositories/in-memory-base.repository.d.ts +16 -0
- package/test/repositories/in-memory-base.repository.js +55 -0
- package/test/services/fake-logging.service.d.ts +4 -0
- package/test/services/fake-logging.service.js +9 -0
- package/test/services/fake-red-lock.service.d.ts +5 -0
- package/test/services/fake-red-lock.service.js +11 -0
- package/test/utils/create-e2e-database.d.ts +2 -0
- package/test/utils/create-e2e-database.js +27 -0
- package/test/utils/drop-e2e-database.d.ts +1 -0
- package/test/utils/drop-e2e-database.js +8 -0
- package/test/utils/wait-for.d.ts +1 -0
- package/test/utils/wait-for.js +22 -0
- package/tsconfig.lib.tsbuildinfo +1 -0
- package/common/backgroud-services/cron-service/cron-job.d.ts +0 -15
- package/common/backgroud-services/event-service/event-class.d.ts +0 -5
- package/common/backgroud-services/event-service/event-handler.d.ts +0 -5
- package/common/backgroud-services/event-service/event-job.d.ts +0 -10
- package/common/controllers/created-registre-response.base.d.ts +0 -4
- package/core/database/entity.d.ts +0 -8
- package/core/database/entity.js +0 -31
- package/decorators/is-cnpj.decorator.d.ts +0 -2
- package/decorators/is-cnpj.decorator.js +0 -71
- package/services/prisma/prisma.types.d.ts +0 -36
- package/services/prisma/prisma.types.js +0 -15
- /package/{common → core}/backgroud-services/event-service/event-handler.js +0 -0
- /package/{common → core}/backgroud-services/event-service/event-is-trigger.d.ts +0 -0
- /package/{common → core}/backgroud-services/event-service/event-is-trigger.js +0 -0
- /package/{common → core}/backgroud-services/event-service/event-queue.d.ts +0 -0
- /package/{common → core}/controllers/base.controller.d.ts +0 -0
- /package/{common → core}/controllers/base.controller.js +0 -0
- /package/{common → core}/controllers/list-response.base.d.ts +0 -0
- /package/{common → core}/controllers/router-config.base.d.ts +0 -0
- /package/{common → core}/controllers/router-config.base.js +0 -0
- /package/{common → core}/controllers/schemas/document-number.schema.d.ts +0 -0
- /package/{common → core}/controllers/schemas/document-number.schema.js +0 -0
- /package/{common → core}/controllers/schemas/email.schema.d.ts +0 -0
- /package/{common → core}/controllers/schemas/email.schema.js +0 -0
- /package/{common → core}/controllers/schemas/list-query.schema.d.ts +0 -0
- /package/{common → core}/controllers/schemas/list-query.schema.js +0 -0
- /package/{common → core}/controllers/schemas/native-enum.schema.d.ts +0 -0
- /package/{common → core}/controllers/schemas/native-enum.schema.js +0 -0
- /package/{services/prisma → core/database}/prisma-client-with-custom-transaction.interface.d.ts +0 -0
- /package/{services/prisma → core/database}/prisma-client-with-custom-transaction.interface.js +0 -0
- /package/{services/prisma → core/database}/prisma-transactional-client.js +0 -0
- /package/{services/prisma → core/database}/prisma.service.d.ts +0 -0
- /package/{common → core}/errors/bad-request.error.d.ts +0 -0
- /package/{common → core}/errors/bad-request.error.js +0 -0
- /package/{common → core}/errors/conflict.error.d.ts +0 -0
- /package/{common → core}/errors/conflict.error.js +0 -0
- /package/{common → core}/errors/no-content.error.d.ts +0 -0
- /package/{common → core}/errors/no-content.error.js +0 -0
- /package/{common → core}/errors/not-allowed.error.d.ts +0 -0
- /package/{common → core}/errors/not-allowed.error.js +0 -0
- /package/{common → core}/errors/resource-not-found.error.d.ts +0 -0
- /package/{common → core}/errors/resource-not-found.error.js +0 -0
- /package/{common → core}/errors/use-case-error.d.ts +0 -0
- /package/{common → core}/errors/use-case-error.js +0 -0
- /package/{common → core}/errors/user-already-exist.error.d.ts +0 -0
- /package/{common → core}/errors/user-already-exist.error.js +0 -0
- /package/{common → core}/errors/wrong-credentials.error.d.ts +0 -0
- /package/{common → core}/errors/wrong-credentials.error.js +0 -0
- /package/{common/mediator → core/request-overflow}/request-handler.base.js +0 -0
- /package/{common/mediator → core/request-overflow}/request-result.d.ts +0 -0
- /package/{common/mediator → core/request-overflow}/request-result.js +0 -0
- /package/{services/env → env}/env.module.d.ts +0 -0
- /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,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>>;
|
|
@@ -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 '
|
|
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
|
+
});
|
|
@@ -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
|
}
|
package/core/utils/list.d.ts
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
}
|
package/core/utils/list.js
CHANGED
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.List = void 0;
|
|
4
|
-
|
|
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(
|
|
11
|
-
this.
|
|
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
|
|
19
|
-
.find((item) => item.id === id) ??
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
|
119
|
+
if (item instanceof entity_base_1.EntityBase) {
|
|
82
120
|
return list
|
|
83
|
-
.filter((i) => i instanceof
|
|
84
|
-
.findIndex((i) => item.
|
|
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
|
|
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 '../
|
|
5
|
-
import { ConflictError } from '../
|
|
6
|
-
import { NoContentError } from '../
|
|
7
|
-
import { NotAllowedError } from '../
|
|
8
|
-
import { ResourceNotFoundError } from '../
|
|
9
|
-
import { UserAlreadyExist } from '../
|
|
10
|
-
import { WrongCredentialsError } from '../
|
|
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("../
|
|
13
|
-
const conflict_error_1 = require("../
|
|
14
|
-
const no_content_error_1 = require("../
|
|
15
|
-
const not_allowed_error_1 = require("../
|
|
16
|
-
const resource_not_found_error_1 = require("../
|
|
17
|
-
const user_already_exist_error_1 = require("../
|
|
18
|
-
const wrong_credentials_error_1 = require("../
|
|
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);
|