@koalarx/nest 3.0.3 → 3.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.
- package/core/backgroud-services/cron-service/cron-job.handler.base.d.ts +16 -0
- package/core/backgroud-services/cron-service/cron-job.handler.base.js +49 -0
- package/core/backgroud-services/event-service/event-class.d.ts +5 -0
- package/core/backgroud-services/event-service/event-class.js +11 -0
- package/core/backgroud-services/event-service/event-handler.base.d.ts +8 -0
- package/core/backgroud-services/event-service/event-handler.base.js +14 -0
- package/core/backgroud-services/event-service/event-is-trigger.d.ts +3 -0
- package/core/backgroud-services/event-service/event-is-trigger.js +7 -0
- package/core/backgroud-services/event-service/event-job.d.ts +13 -0
- package/core/backgroud-services/event-service/event-job.js +21 -0
- package/core/backgroud-services/event-service/event-queue.d.ts +17 -0
- package/core/backgroud-services/event-service/event-queue.js +62 -0
- package/core/constants/query-params.d.ts +6 -0
- package/core/constants/query-params.js +8 -0
- package/core/controllers/base.controller.d.ts +4 -0
- package/core/controllers/base.controller.js +6 -0
- package/core/controllers/controller.decorator.d.ts +2 -0
- package/core/controllers/controller.decorator.js +11 -0
- package/core/controllers/created-registre-response.base.d.ts +10 -0
- package/core/controllers/created-registre-response.base.js +35 -0
- package/core/controllers/list-response.base.d.ts +4 -0
- package/core/controllers/list-response.base.js +21 -0
- package/core/controllers/pagination.request.d.ts +10 -0
- package/core/controllers/pagination.request.js +56 -0
- package/core/controllers/router-config.base.d.ts +7 -0
- package/core/controllers/router-config.base.js +18 -0
- package/core/controllers/schemas/boolean.schema.d.ts +2 -0
- package/core/controllers/schemas/boolean.schema.js +12 -0
- package/core/controllers/schemas/document-number.schema.d.ts +1 -0
- package/core/controllers/schemas/document-number.schema.js +26 -0
- package/core/controllers/schemas/email.schema.d.ts +1 -0
- package/core/controllers/schemas/email.schema.js +13 -0
- package/core/controllers/schemas/list-query.schema.d.ts +17 -0
- package/core/controllers/schemas/list-query.schema.js +19 -0
- package/core/controllers/schemas/native-enum.schema.d.ts +7 -0
- package/core/controllers/schemas/native-enum.schema.js +28 -0
- package/core/controllers/schemas/set-mask-document-number.schema.d.ts +1 -0
- package/core/controllers/schemas/set-mask-document-number.schema.js +13 -0
- package/core/database/entity.base.d.ts +20 -0
- package/core/database/entity.base.js +71 -0
- package/core/database/entity.decorator.d.ts +13 -0
- package/core/database/entity.decorator.js +23 -0
- package/core/database/prisma-client-with-custom-transaction.interface.d.ts +8 -0
- package/core/database/prisma-client-with-custom-transaction.interface.js +2 -0
- package/core/database/prisma-resolver.d.ts +2 -0
- package/core/database/prisma-resolver.js +74 -0
- package/core/database/prisma-transactional-client.d.ts +11 -0
- package/core/database/prisma-transactional-client.js +25 -0
- package/core/database/prisma.service.d.ts +24 -0
- package/core/database/prisma.service.js +104 -0
- package/core/database/repository.base.d.ts +44 -0
- package/core/database/repository.base.js +360 -0
- package/core/dtos/pagination.dto.d.ts +9 -0
- package/core/dtos/pagination.dto.js +49 -0
- package/core/errors/bad-request.error.d.ts +5 -0
- package/core/errors/bad-request.error.js +10 -0
- package/core/errors/conflict.error.d.ts +4 -0
- package/core/errors/conflict.error.js +10 -0
- package/core/errors/error.base.d.ts +4 -0
- package/core/errors/error.base.js +11 -0
- package/core/errors/no-content.error.d.ts +5 -0
- package/core/errors/no-content.error.js +10 -0
- package/core/errors/not-allowed.error.d.ts +5 -0
- package/core/errors/not-allowed.error.js +10 -0
- package/core/errors/resource-not-found.error.d.ts +5 -0
- package/core/errors/resource-not-found.error.js +10 -0
- package/{src/core/errors/use-case-error.ts → core/errors/use-case-error.d.ts} +1 -1
- package/core/errors/use-case-error.js +2 -0
- package/core/errors/user-already-exist.error.d.ts +4 -0
- package/core/errors/user-already-exist.error.js +10 -0
- package/core/errors/wrong-credentials.error.d.ts +4 -0
- package/core/errors/wrong-credentials.error.js +10 -0
- package/core/health-check/health-check.controller.d.ts +5 -0
- package/core/health-check/health-check.controller.js +32 -0
- package/core/health-check/health-check.module.d.ts +2 -0
- package/core/health-check/health-check.module.js +19 -0
- package/core/index.d.ts +18 -0
- package/core/index.js +7 -0
- package/core/koala-app.d.ts +64 -0
- package/core/koala-app.js +252 -0
- 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 +16 -0
- package/core/koala-nest-database.module.js +52 -0
- package/core/koala-nest-http.module.d.ts +13 -0
- package/core/koala-nest-http.module.js +37 -0
- package/core/koala-nest.module.d.ts +17 -0
- package/core/koala-nest.module.js +66 -0
- package/core/mapping/auto-mapping-class-context.d.ts +16 -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 +27 -0
- package/core/mapping/auto-mapping-list.js +94 -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 +29 -0
- package/core/mapping/auto-mapping.service.d.ts +14 -0
- package/core/mapping/auto-mapping.service.js +140 -0
- package/core/mapping/create-map.d.ts +3 -0
- package/core/mapping/create-map.js +7 -0
- package/core/mapping/for-member.d.ts +5 -0
- package/core/mapping/for-member.js +8 -0
- package/core/request-overflow/request-handler.base.d.ts +4 -0
- package/core/request-overflow/request-handler.base.js +6 -0
- package/core/request-overflow/request-result.d.ts +15 -0
- package/core/request-overflow/request-result.js +37 -0
- package/core/request-overflow/request-validator.base.d.ts +7 -0
- package/core/request-overflow/request-validator.base.js +26 -0
- package/core/security/strategies/api-key.strategy.d.ts +16 -0
- package/core/security/strategies/api-key.strategy.js +31 -0
- package/core/utils/assing-object.d.ts +5 -0
- package/core/utils/assing-object.js +6 -0
- package/core/utils/env.config.d.ts +6 -0
- package/core/utils/env.config.js +18 -0
- package/core/utils/filter-request-params.d.ts +13 -0
- package/core/utils/filter-request-params.js +22 -0
- package/core/utils/find-on-list.d.ts +2 -0
- package/core/utils/find-on-list.js +13 -0
- package/core/utils/get-type-by-prop.d.ts +2 -0
- package/core/utils/get-type-by-prop.js +11 -0
- package/core/utils/instanciate-class-with-dependencies-injection.d.ts +2 -0
- package/core/utils/instanciate-class-with-dependencies-injection.js +10 -0
- package/core/utils/interfaces/icomparable.d.ts +5 -0
- package/core/utils/interfaces/icomparable.js +6 -0
- package/core/utils/list.d.ts +39 -0
- package/core/utils/list.js +168 -0
- package/core/utils/promise-all.d.ts +7 -0
- package/core/utils/promise-all.js +19 -0
- package/core/utils/set-mask-document-number.d.ts +1 -0
- package/core/utils/set-mask-document-number.js +13 -0
- package/core/validators/file-validator.d.ts +27 -0
- package/core/validators/file-validator.js +94 -0
- package/decorators/api-exclude-endpoint-diff-develop.decorator.d.ts +1 -0
- package/decorators/api-exclude-endpoint-diff-develop.decorator.js +9 -0
- package/decorators/api-property-enum.decorator.d.ts +8 -0
- package/decorators/api-property-enum.decorator.js +21 -0
- package/decorators/api-property-only-develop.decorator.d.ts +2 -0
- package/decorators/api-property-only-develop.decorator.js +9 -0
- package/decorators/cookies.decorator.d.ts +1 -0
- package/decorators/cookies.decorator.js +8 -0
- package/decorators/is-public.decorator.d.ts +2 -0
- package/decorators/is-public.decorator.js +7 -0
- package/decorators/upload.decorator.d.ts +1 -0
- package/decorators/upload.decorator.js +18 -0
- package/env/env.d.ts +25 -0
- package/env/env.js +14 -0
- package/env/env.module.d.ts +2 -0
- package/env/env.module.js +20 -0
- package/env/env.service.d.ts +7 -0
- package/env/env.service.js +28 -0
- package/filters/domain-errors.filter.d.ts +18 -0
- package/filters/domain-errors.filter.js +92 -0
- package/filters/global-exception.filter.d.ts +8 -0
- package/filters/global-exception.filter.js +68 -0
- package/filters/prisma-validation-exception.filter.d.ts +10 -0
- package/filters/prisma-validation-exception.filter.js +82 -0
- package/filters/zod-errors.filter.d.ts +9 -0
- package/filters/zod-errors.filter.js +60 -0
- package/package.json +4 -1
- package/services/logging/ilogging.service.d.ts +16 -0
- package/services/logging/ilogging.service.js +6 -0
- package/services/logging/logging.service.d.ts +4 -0
- package/services/logging/logging.service.js +20 -0
- package/services/redis/iredis.service.d.ts +6 -0
- package/services/redis/iredis.service.js +6 -0
- package/services/redis/redis.service.d.ts +14 -0
- package/services/redis/redis.service.js +65 -0
- package/services/redlock/ired-lock.service.d.ts +4 -0
- package/services/redlock/ired-lock.service.js +6 -0
- package/services/redlock/red-lock.service.d.ts +9 -0
- package/services/redlock/red-lock.service.js +46 -0
- 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 +22 -0
- package/test/koala-app-test.js +77 -0
- package/test/repositories/in-memory-base.repository.d.ts +17 -0
- package/test/repositories/in-memory-base.repository.js +65 -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 +47 -0
- package/test/utils/drop-e2e-database.d.ts +2 -0
- package/test/utils/drop-e2e-database.js +33 -0
- package/test/utils/wait-for.d.ts +1 -0
- package/test/utils/wait-for.js +21 -0
- package/tsconfig.lib.tsbuildinfo +1 -0
- package/CHANGELOG.md +0 -27
- package/src/core/backgroud-services/cron-service/cron-job.handler.base.ts +0 -66
- package/src/core/backgroud-services/cron-service/cron-job.handler.spec.ts +0 -38
- package/src/core/backgroud-services/event-service/event-class.ts +0 -5
- package/src/core/backgroud-services/event-service/event-handler.base.ts +0 -17
- package/src/core/backgroud-services/event-service/event-is-trigger.ts +0 -3
- package/src/core/backgroud-services/event-service/event-job.ts +0 -28
- package/src/core/backgroud-services/event-service/event-queue.spec.ts +0 -47
- package/src/core/backgroud-services/event-service/event-queue.ts +0 -107
- package/src/core/constants/query-params.ts +0 -7
- package/src/core/controllers/base.controller.ts +0 -9
- package/src/core/controllers/controller.decorator.ts +0 -10
- package/src/core/controllers/created-registre-response.base.ts +0 -17
- package/src/core/controllers/list-response.base.ts +0 -8
- package/src/core/controllers/pagination.request.ts +0 -41
- package/src/core/controllers/router-config.base.ts +0 -14
- package/src/core/controllers/schemas/boolean.schema.ts +0 -10
- package/src/core/controllers/schemas/document-number.schema.ts +0 -23
- package/src/core/controllers/schemas/email.schema.ts +0 -13
- package/src/core/controllers/schemas/list-query.schema.ts +0 -17
- package/src/core/controllers/schemas/native-enum.schema.ts +0 -34
- package/src/core/controllers/schemas/set-mask-document-number.schema.ts +0 -13
- package/src/core/database/entity.base.ts +0 -95
- package/src/core/database/entity.decorator.spec.ts +0 -71
- package/src/core/database/entity.decorator.ts +0 -39
- package/src/core/database/prisma-client-with-custom-transaction.interface.ts +0 -13
- package/src/core/database/prisma-resolver.ts +0 -99
- package/src/core/database/prisma-transactional-client.ts +0 -43
- package/src/core/database/prisma.service.ts +0 -136
- package/src/core/database/repository.base.ts +0 -548
- package/src/core/dtos/pagination.dto.ts +0 -35
- package/src/core/errors/bad-request.error.ts +0 -8
- package/src/core/errors/conflict.error.ts +0 -7
- package/src/core/errors/error.base.ts +0 -5
- package/src/core/errors/no-content.error.ts +0 -8
- package/src/core/errors/not-allowed.error.ts +0 -8
- package/src/core/errors/resource-not-found.error.ts +0 -8
- package/src/core/errors/user-already-exist.error.ts +0 -7
- package/src/core/errors/wrong-credentials.error.ts +0 -7
- package/src/core/health-check/health-check.controller.ts +0 -13
- package/src/core/health-check/health-check.module.ts +0 -7
- package/src/core/index.ts +0 -56
- package/src/core/koala-app.ts +0 -379
- package/src/core/koala-global-vars.ts +0 -8
- package/src/core/koala-nest-database.module.ts +0 -65
- package/src/core/koala-nest-http.module.ts +0 -44
- package/src/core/koala-nest.module.ts +0 -67
- package/src/core/mapping/auto-mapping-class-context.ts +0 -28
- package/src/core/mapping/auto-mapping-context.ts +0 -26
- package/src/core/mapping/auto-mapping-list.ts +0 -154
- package/src/core/mapping/auto-mapping-profile.ts +0 -3
- package/src/core/mapping/auto-mapping.decorator.ts +0 -54
- package/src/core/mapping/auto-mapping.module.ts +0 -17
- package/src/core/mapping/auto-mapping.service.ts +0 -187
- package/src/core/mapping/create-map.ts +0 -11
- package/src/core/mapping/for-member.ts +0 -16
- package/src/core/request-overflow/request-handler.base.ts +0 -8
- package/src/core/request-overflow/request-result.spec.ts +0 -23
- package/src/core/request-overflow/request-result.ts +0 -41
- package/src/core/request-overflow/request-validator.base.ts +0 -33
- package/src/core/security/strategies/api-key.strategy.ts +0 -45
- package/src/core/utils/assing-object.ts +0 -9
- package/src/core/utils/env.config.ts +0 -17
- package/src/core/utils/filter-request-params.ts +0 -23
- package/src/core/utils/find-on-list.ts +0 -18
- package/src/core/utils/get-type-by-prop.ts +0 -9
- package/src/core/utils/instanciate-class-with-dependencies-injection.ts +0 -12
- package/src/core/utils/interfaces/icomparable.ts +0 -6
- package/src/core/utils/list.spec.ts +0 -81
- package/src/core/utils/list.ts +0 -223
- package/src/core/utils/promise-all.ts +0 -24
- package/src/core/utils/set-mask-document-number.ts +0 -13
- package/src/core/validators/file-validator.ts +0 -113
- package/src/decorators/api-exclude-endpoint-diff-develop.decorator.ts +0 -15
- package/src/decorators/api-property-enum.decorator.ts +0 -58
- package/src/decorators/api-property-only-develop.decorator.ts +0 -6
- package/src/decorators/cookies.decorator.ts +0 -8
- package/src/decorators/is-public.decorator.ts +0 -5
- package/src/decorators/upload.decorator.ts +0 -31
- package/src/env/env.module.ts +0 -8
- package/src/env/env.service.ts +0 -12
- package/src/env/env.ts +0 -14
- package/src/filters/domain-errors.filter.ts +0 -97
- package/src/filters/global-exception.filter.ts +0 -60
- package/src/filters/prisma-validation-exception.filter.ts +0 -73
- package/src/filters/zod-errors.filter.ts +0 -48
- package/src/services/logging/ilogging.service.ts +0 -17
- package/src/services/logging/logging.service.ts +0 -10
- package/src/services/redis/iredis.service.ts +0 -11
- package/src/services/redis/redis.service.ts +0 -70
- package/src/services/redlock/ired-lock.service.ts +0 -4
- package/src/services/redlock/red-lock.service.ts +0 -36
- package/src/test/koala-app-test-dependencies.ts +0 -15
- package/src/test/koala-app-test.ts +0 -103
- package/src/test/repositories/in-memory-base.repository.ts +0 -90
- package/src/test/services/fake-logging.service.ts +0 -7
- package/src/test/services/fake-red-lock.service.ts +0 -11
- package/src/test/utils/create-e2e-database.ts +0 -55
- package/src/test/utils/drop-e2e-database.ts +0 -36
- package/src/test/utils/wait-for.ts +0 -31
- package/tsconfig.lib.json +0 -11
package/CHANGELOG.md
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# @koalarx/nest
|
|
2
|
-
|
|
3
|
-
## 3.0.3
|
|
4
|
-
|
|
5
|
-
### Patch Changes
|
|
6
|
-
|
|
7
|
-
- c87bce1: Ajuste no README ao realizar o build do KoalaNest
|
|
8
|
-
|
|
9
|
-
## 3.0.2
|
|
10
|
-
|
|
11
|
-
### Patch Changes
|
|
12
|
-
|
|
13
|
-
- a446e40: Incluindo README.md
|
|
14
|
-
|
|
15
|
-
## 3.0.1
|
|
16
|
-
|
|
17
|
-
### Patch Changes
|
|
18
|
-
|
|
19
|
-
- 3532e0d: Nova tentativa de publish
|
|
20
|
-
- 276bc25: Teste de publicação do koala-nest
|
|
21
|
-
- 9f4d18c: Adicionado link da dock no README inicial
|
|
22
|
-
|
|
23
|
-
## 3.0.0
|
|
24
|
-
|
|
25
|
-
### Major Changes
|
|
26
|
-
|
|
27
|
-
- 9c3cdf1: CLI migrada para este repositório em estrutura de monorepo, atualizações de eslint e ajustes na documentação
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { delay } from '@koalarx/utils/KlDelay'
|
|
2
|
-
import { ILoggingService } from '../../../services/logging/ilogging.service'
|
|
3
|
-
import { IRedLockService } from '../../../services/redlock/ired-lock.service'
|
|
4
|
-
import { KoalaGlobalVars } from '../../koala-global-vars'
|
|
5
|
-
import { RequestResult } from '../../request-overflow/request-result'
|
|
6
|
-
|
|
7
|
-
export type CronJobResponse = RequestResult<Error, null>
|
|
8
|
-
export interface CronJobSettings {
|
|
9
|
-
isActive: boolean
|
|
10
|
-
timeInMinutes: number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export abstract class CronJobHandlerBase {
|
|
14
|
-
constructor(
|
|
15
|
-
private readonly redlockService: IRedLockService,
|
|
16
|
-
private readonly loggingService: ILoggingService,
|
|
17
|
-
) {}
|
|
18
|
-
|
|
19
|
-
protected abstract run(): Promise<CronJobResponse>
|
|
20
|
-
|
|
21
|
-
protected abstract settings(): Promise<CronJobSettings>
|
|
22
|
-
|
|
23
|
-
async start(): Promise<void> {
|
|
24
|
-
const name = this.constructor.name
|
|
25
|
-
|
|
26
|
-
while (true) {
|
|
27
|
-
const settings = await this.settings()
|
|
28
|
-
const timeout = settings.timeInMinutes * 60 * 1000
|
|
29
|
-
|
|
30
|
-
if (settings.isActive) {
|
|
31
|
-
const ttlSecondsLock = timeout / 1000
|
|
32
|
-
const acquiredLock = await this.redlockService.acquiredLock(
|
|
33
|
-
name,
|
|
34
|
-
ttlSecondsLock,
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
if (acquiredLock) {
|
|
38
|
-
const error = await this.run()
|
|
39
|
-
.then((result) => {
|
|
40
|
-
if (result.isFailure()) {
|
|
41
|
-
return result.value
|
|
42
|
-
}
|
|
43
|
-
return null
|
|
44
|
-
})
|
|
45
|
-
.catch((error) => error)
|
|
46
|
-
|
|
47
|
-
if (error) {
|
|
48
|
-
try {
|
|
49
|
-
await this.loggingService.report({
|
|
50
|
-
error,
|
|
51
|
-
packageName: KoalaGlobalVars.appName,
|
|
52
|
-
loggedUsername: KoalaGlobalVars.internalUserName,
|
|
53
|
-
})
|
|
54
|
-
} catch {
|
|
55
|
-
console.error(error)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
await delay(timeout)
|
|
62
|
-
|
|
63
|
-
await this.redlockService.releaseLock(name)
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { delay } from '@koalarx/utils/KlDelay'
|
|
2
|
-
import { expect, spyOn, test } from 'bun:test'
|
|
3
|
-
import { FakeLoggingService } from '../../../test/services/fake-logging.service'
|
|
4
|
-
import { FakeRedLockService } from '../../../test/services/fake-red-lock.service'
|
|
5
|
-
import { ok } from '../../request-overflow/request-result'
|
|
6
|
-
import {
|
|
7
|
-
CronJobHandlerBase,
|
|
8
|
-
CronJobResponse,
|
|
9
|
-
CronJobSettings,
|
|
10
|
-
} from './cron-job.handler.base'
|
|
11
|
-
|
|
12
|
-
export class CronJobTest extends CronJobHandlerBase {
|
|
13
|
-
constructor() {
|
|
14
|
-
super(new FakeRedLockService(), new FakeLoggingService())
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
protected async settings(): Promise<CronJobSettings> {
|
|
18
|
-
return { isActive: true, timeInMinutes: 0.01 }
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
static async isCalled(): Promise<CronJobResponse> {
|
|
22
|
-
return ok(null)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
protected run(): Promise<CronJobResponse> {
|
|
26
|
-
return CronJobTest.isCalled()
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
test('cron job', async () => {
|
|
31
|
-
const callbackSpy = spyOn(CronJobTest, 'isCalled')
|
|
32
|
-
|
|
33
|
-
new CronJobTest().start()
|
|
34
|
-
|
|
35
|
-
await delay(100)
|
|
36
|
-
|
|
37
|
-
expect(callbackSpy).toHaveBeenCalled()
|
|
38
|
-
})
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Type } from '@nestjs/common'
|
|
2
|
-
import { EventClass } from './event-class'
|
|
3
|
-
import { EventQueue } from './event-queue'
|
|
4
|
-
|
|
5
|
-
export abstract class EventHandlerBase {
|
|
6
|
-
constructor(public readonly event: Type<EventClass>) {}
|
|
7
|
-
|
|
8
|
-
setupSubscriptions() {
|
|
9
|
-
EventQueue.register(
|
|
10
|
-
this.handleEvent.bind(this),
|
|
11
|
-
this.constructor.name,
|
|
12
|
-
this.event.name,
|
|
13
|
-
)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
abstract handleEvent(event: InstanceType<this['event']>): Promise<void>
|
|
17
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Type } from '@nestjs/common'
|
|
2
|
-
import { EventClass } from './event-class'
|
|
3
|
-
import { EventHandlerBase } from './event-handler.base'
|
|
4
|
-
import { EventQueue } from './event-queue'
|
|
5
|
-
import { randomUUID } from 'node:crypto'
|
|
6
|
-
|
|
7
|
-
export abstract class EventJob<TEntity> {
|
|
8
|
-
_id = randomUUID()
|
|
9
|
-
|
|
10
|
-
private _eventQueue: EventQueue[] = []
|
|
11
|
-
|
|
12
|
-
constructor() {}
|
|
13
|
-
|
|
14
|
-
abstract defineHandlers(): Array<Type<EventHandlerBase>>
|
|
15
|
-
|
|
16
|
-
get eventQueue(): EventQueue[] {
|
|
17
|
-
return this._eventQueue
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public clearQueue() {
|
|
21
|
-
this._eventQueue = []
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public addEvent(event: EventClass<TEntity>): void {
|
|
25
|
-
this.eventQueue.push(event)
|
|
26
|
-
EventQueue.markAggregateForDispatch(this)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Type } from '@nestjs/common'
|
|
2
|
-
import { describe, expect, it, spyOn } from 'bun:test'
|
|
3
|
-
import { EventClass } from './event-class'
|
|
4
|
-
import { EventHandlerBase } from './event-handler.base'
|
|
5
|
-
import { EventJob } from './event-job'
|
|
6
|
-
import { EventQueue } from './event-queue'
|
|
7
|
-
|
|
8
|
-
class CustomEvent extends EventClass {}
|
|
9
|
-
|
|
10
|
-
class CustomEventHandler extends EventHandlerBase {
|
|
11
|
-
constructor() {
|
|
12
|
-
super(CustomEvent)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
static async isCalled(): Promise<null> {
|
|
16
|
-
return null
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
20
|
-
async handleEvent(event: CustomEvent): Promise<void> {
|
|
21
|
-
await CustomEventHandler.isCalled()
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
class CustomEventJob extends EventJob<any> {
|
|
26
|
-
defineHandlers(): Array<Type<EventHandlerBase>> {
|
|
27
|
-
return [CustomEventHandler]
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
describe('event queue', () => {
|
|
32
|
-
it('should be able to dispatch and listen to events', () => {
|
|
33
|
-
const callbackSpy = spyOn(CustomEventHandler, 'isCalled')
|
|
34
|
-
|
|
35
|
-
new CustomEventHandler().setupSubscriptions()
|
|
36
|
-
|
|
37
|
-
const jobs = new CustomEventJob()
|
|
38
|
-
jobs.addEvent(new CustomEvent())
|
|
39
|
-
|
|
40
|
-
expect(jobs.eventQueue).toHaveLength(1)
|
|
41
|
-
|
|
42
|
-
EventQueue.dispatchEventsForAggregate(jobs._id)
|
|
43
|
-
|
|
44
|
-
expect(callbackSpy).toHaveBeenCalled()
|
|
45
|
-
expect(jobs.eventQueue).toHaveLength(0)
|
|
46
|
-
})
|
|
47
|
-
})
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { IComparableId } from '../../../core/utils/interfaces/icomparable'
|
|
2
|
-
import { EventClass } from './event-class'
|
|
3
|
-
import { EventJob } from './event-job'
|
|
4
|
-
|
|
5
|
-
type EventJobCallback = (event: any) => void
|
|
6
|
-
interface EventQueueJobItem {
|
|
7
|
-
eventClassName: string
|
|
8
|
-
callback: EventJobCallback
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class EventQueue {
|
|
12
|
-
private static handlersMap: Record<string, EventQueueJobItem[]> = {}
|
|
13
|
-
|
|
14
|
-
private static markedAggregates: EventJob<any>[] = []
|
|
15
|
-
|
|
16
|
-
public static markAggregateForDispatch(aggregate: EventJob<any>) {
|
|
17
|
-
const aggregateFound = !!this.findMarkedAggregateByID(aggregate._id)
|
|
18
|
-
|
|
19
|
-
if (!aggregateFound) {
|
|
20
|
-
this.markedAggregates.push(aggregate)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
public static dispatchEventsForAggregate(id: IComparableId) {
|
|
25
|
-
const aggregate = this.findMarkedAggregateByID(id)
|
|
26
|
-
|
|
27
|
-
if (aggregate) {
|
|
28
|
-
this.dispatchAggregateEvents(aggregate)
|
|
29
|
-
aggregate.clearQueue()
|
|
30
|
-
this.removeAggregateFromMarkedDispatchList(aggregate)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
public static register(
|
|
35
|
-
callback: EventJobCallback,
|
|
36
|
-
handlerClassName: string,
|
|
37
|
-
eventClassName: string,
|
|
38
|
-
) {
|
|
39
|
-
const wasEventRegisteredBefore = handlerClassName in this.handlersMap
|
|
40
|
-
|
|
41
|
-
if (!wasEventRegisteredBefore) {
|
|
42
|
-
this.handlersMap[handlerClassName] = []
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
this.handlersMap[handlerClassName].push({
|
|
46
|
-
eventClassName,
|
|
47
|
-
callback,
|
|
48
|
-
})
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
public static clearHandlers() {
|
|
52
|
-
this.handlersMap = {}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
public static clearMarkedAggregates() {
|
|
56
|
-
this.markedAggregates = []
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
private static dispatchAggregateEvents(aggregate: EventJob<any>) {
|
|
60
|
-
aggregate.eventQueue.forEach((event: EventClass<any>) =>
|
|
61
|
-
this.dispatch(event),
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
private static removeAggregateFromMarkedDispatchList(
|
|
66
|
-
aggregate: EventJob<any>,
|
|
67
|
-
) {
|
|
68
|
-
const index = this.markedAggregates.findIndex(
|
|
69
|
-
(a) => a._id === aggregate._id,
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
this.markedAggregates.splice(index, 1)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
private static findMarkedAggregateByID(
|
|
76
|
-
id: IComparableId,
|
|
77
|
-
): EventJob<any> | undefined {
|
|
78
|
-
return this.markedAggregates.find((aggregate) => aggregate._id === id)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
private static dispatch(event: EventClass<any>) {
|
|
82
|
-
const eventJobHandlers = this.markedAggregates.find((a) =>
|
|
83
|
-
a.eventQueue.find((e) => e === event),
|
|
84
|
-
)
|
|
85
|
-
const eventHandler = Object.keys(this.handlersMap).find((handlerName) =>
|
|
86
|
-
eventJobHandlers
|
|
87
|
-
?.defineHandlers()
|
|
88
|
-
.find(
|
|
89
|
-
(handler) =>
|
|
90
|
-
handler.name === handlerName &&
|
|
91
|
-
this.handlersMap[handler.name].some(
|
|
92
|
-
(job) => job.eventClassName === event.constructor.name,
|
|
93
|
-
),
|
|
94
|
-
),
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
const isEventRegistered = !!eventHandler
|
|
98
|
-
|
|
99
|
-
if (isEventRegistered) {
|
|
100
|
-
const jobs = this.handlersMap[eventHandler]
|
|
101
|
-
|
|
102
|
-
for (const job of jobs) {
|
|
103
|
-
job.callback(event)
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { RouterConfigBase } from './router-config.base'
|
|
2
|
-
import { Controller as NestController } from '@nestjs/common'
|
|
3
|
-
import { ApiTags } from '@nestjs/swagger'
|
|
4
|
-
|
|
5
|
-
export function Controller(config: RouterConfigBase) {
|
|
6
|
-
return function (target: any) {
|
|
7
|
-
NestController(config.group)(target)
|
|
8
|
-
ApiTags(config.tag)(target)
|
|
9
|
-
}
|
|
10
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { ApiProperty } from '@nestjs/swagger'
|
|
2
|
-
import { IComparableId } from '../../core/utils/interfaces/icomparable'
|
|
3
|
-
|
|
4
|
-
export abstract class CreatedRegistreResponseBase<TId = IComparableId> {
|
|
5
|
-
@ApiProperty()
|
|
6
|
-
id: TId
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export abstract class CreatedRegistreWithUUIDResponse extends CreatedRegistreResponseBase<string> {
|
|
10
|
-
@ApiProperty({ type: 'string', format: 'uuid' })
|
|
11
|
-
declare id: string
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export abstract class CreatedRegistreWithIdResponse extends CreatedRegistreResponseBase<number> {
|
|
15
|
-
@ApiProperty({ type: 'integer', format: 'int32' })
|
|
16
|
-
declare id: number
|
|
17
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { ApiProperty } from '@nestjs/swagger'
|
|
2
|
-
import { AutoMap } from '../mapping/auto-mapping.decorator'
|
|
3
|
-
import { QUERY_FILTER_PARAMS } from '../constants/query-params'
|
|
4
|
-
import type { QueryDirectionType } from '..'
|
|
5
|
-
|
|
6
|
-
export type PaginatedRequestProps<T extends PaginationRequest> = Omit<
|
|
7
|
-
{ [K in keyof T as T[K] extends Function ? never : K]: T[K] },
|
|
8
|
-
'_id'
|
|
9
|
-
>
|
|
10
|
-
|
|
11
|
-
export class PaginationRequest {
|
|
12
|
-
@ApiProperty({
|
|
13
|
-
required: false,
|
|
14
|
-
format: 'int32',
|
|
15
|
-
default: QUERY_FILTER_PARAMS.page,
|
|
16
|
-
})
|
|
17
|
-
@AutoMap()
|
|
18
|
-
page?: number = QUERY_FILTER_PARAMS.page
|
|
19
|
-
|
|
20
|
-
@ApiProperty({
|
|
21
|
-
required: false,
|
|
22
|
-
format: 'int32',
|
|
23
|
-
default: QUERY_FILTER_PARAMS.limit,
|
|
24
|
-
})
|
|
25
|
-
@AutoMap()
|
|
26
|
-
limit?: number = QUERY_FILTER_PARAMS.limit
|
|
27
|
-
|
|
28
|
-
@ApiProperty({
|
|
29
|
-
required: false,
|
|
30
|
-
})
|
|
31
|
-
@AutoMap()
|
|
32
|
-
orderBy?: string
|
|
33
|
-
|
|
34
|
-
@ApiProperty({
|
|
35
|
-
required: false,
|
|
36
|
-
enum: ['asc', 'desc'],
|
|
37
|
-
default: QUERY_FILTER_PARAMS.direction,
|
|
38
|
-
})
|
|
39
|
-
@AutoMap()
|
|
40
|
-
direction?: QueryDirectionType = QUERY_FILTER_PARAMS.direction
|
|
41
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { validateCnpj, validateCpf } from '@koalarx/utils/KlString'
|
|
2
|
-
|
|
3
|
-
export function documentNumberSchema(value: string) {
|
|
4
|
-
if (value !== '' && value !== 'undefined' && value !== 'null') {
|
|
5
|
-
if (value.includes('.')) {
|
|
6
|
-
if (value.length === 14) {
|
|
7
|
-
return validateCpf(value)
|
|
8
|
-
} else if (value.length === 18) {
|
|
9
|
-
return validateCnpj(value)
|
|
10
|
-
}
|
|
11
|
-
} else {
|
|
12
|
-
if (value.length === 11) {
|
|
13
|
-
return validateCpf(value)
|
|
14
|
-
} else if (value.length === 14) {
|
|
15
|
-
return validateCnpj(value)
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return false
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return true
|
|
23
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
import { QUERY_FILTER_PARAMS } from '../../constants/query-params'
|
|
3
|
-
|
|
4
|
-
export const LIST_QUERY_SCHEMA = z.object({
|
|
5
|
-
page: z.coerce
|
|
6
|
-
.number()
|
|
7
|
-
.transform((value) => {
|
|
8
|
-
if (value) {
|
|
9
|
-
return value - 1
|
|
10
|
-
}
|
|
11
|
-
return QUERY_FILTER_PARAMS.page
|
|
12
|
-
})
|
|
13
|
-
.optional(),
|
|
14
|
-
limit: z.coerce.number().default(QUERY_FILTER_PARAMS.limit).optional(),
|
|
15
|
-
orderBy: z.string().optional(),
|
|
16
|
-
direction: z.enum(['asc', 'desc']).default('asc').optional(),
|
|
17
|
-
})
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
|
|
3
|
-
interface NativeEnumInterface<TEnum> {
|
|
4
|
-
isOptional: (value: string) => TEnum[keyof TEnum] | undefined
|
|
5
|
-
isRequired: (value: string) => TEnum[keyof TEnum]
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function nativeEnumSchema<TEnum extends z.EnumLike>(
|
|
9
|
-
nativeEnum: TEnum,
|
|
10
|
-
): NativeEnumInterface<TEnum> {
|
|
11
|
-
return {
|
|
12
|
-
isOptional: (value: string) => {
|
|
13
|
-
if (value === 'null' || value === '') {
|
|
14
|
-
return undefined
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return z.coerce
|
|
18
|
-
.number()
|
|
19
|
-
.transform((value) => {
|
|
20
|
-
if (value !== undefined) {
|
|
21
|
-
return z.nativeEnum(nativeEnum).parse(value)
|
|
22
|
-
}
|
|
23
|
-
return undefined
|
|
24
|
-
})
|
|
25
|
-
.parse(value)
|
|
26
|
-
},
|
|
27
|
-
isRequired: (value: string) => {
|
|
28
|
-
return z.coerce
|
|
29
|
-
.number()
|
|
30
|
-
.transform((value) => z.nativeEnum(nativeEnum).parse(value))
|
|
31
|
-
.parse(value)
|
|
32
|
-
},
|
|
33
|
-
}
|
|
34
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { maskCnpj, maskCpf } from '@koalarx/utils'
|
|
2
|
-
|
|
3
|
-
export function setMaskDocumentNumber(document?: string) {
|
|
4
|
-
if (!document) {
|
|
5
|
-
return ''
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const documentWithoutMask = document.replace(/[^0-9]/g, '')
|
|
9
|
-
|
|
10
|
-
return documentWithoutMask.length === 11
|
|
11
|
-
? maskCpf(documentWithoutMask)
|
|
12
|
-
: maskCnpj(documentWithoutMask)
|
|
13
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { KlArray, KlDate, KlTime } from '@koalarx/utils'
|
|
2
|
-
import { Type } from '@nestjs/common'
|
|
3
|
-
import { Overwrite } from '..'
|
|
4
|
-
import { AutoMappingList } from '../mapping/auto-mapping-list'
|
|
5
|
-
import { IComparable, IComparableId } from '../utils/interfaces/icomparable'
|
|
6
|
-
import { List } from '../utils/list'
|
|
7
|
-
|
|
8
|
-
export enum EntityActionType {
|
|
9
|
-
create = 1,
|
|
10
|
-
update,
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type EntityProps<T extends IComparable<T>> = Overwrite<
|
|
14
|
-
Omit<
|
|
15
|
-
{
|
|
16
|
-
[K in keyof T as T[K] extends Function ? never : K]: T[K]
|
|
17
|
-
},
|
|
18
|
-
'_id' | '_action'
|
|
19
|
-
>,
|
|
20
|
-
{ id?: T extends { id: infer U } ? U : never }
|
|
21
|
-
>
|
|
22
|
-
|
|
23
|
-
export abstract class EntityBase<T extends IComparable<T>>
|
|
24
|
-
implements IComparable<T>
|
|
25
|
-
{
|
|
26
|
-
_id: IComparableId
|
|
27
|
-
_action: EntityActionType = EntityActionType.create
|
|
28
|
-
|
|
29
|
-
constructor(props?: EntityProps<T>) {
|
|
30
|
-
if (props) {
|
|
31
|
-
this.automap(props)
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
automap(props?: EntityProps<T>) {
|
|
36
|
-
if (props) {
|
|
37
|
-
for (const key of Object.keys(props)) {
|
|
38
|
-
if (props[key] === undefined) {
|
|
39
|
-
continue
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const propDefinitions = AutoMappingList.getPropDefinitions(
|
|
43
|
-
this.constructor.prototype.constructor,
|
|
44
|
-
key,
|
|
45
|
-
)
|
|
46
|
-
const EntityOnPropKey = AutoMappingList.getSourceByName(
|
|
47
|
-
propDefinitions?.type ?? '',
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
if (Array.isArray(props[key]) && this[key] instanceof List) {
|
|
51
|
-
let value: any = props[key]
|
|
52
|
-
|
|
53
|
-
if (this[key].entityType) {
|
|
54
|
-
value = value.map((item) => {
|
|
55
|
-
const entity = new (this[key].entityType as Type<any>)()
|
|
56
|
-
entity._action = this._action
|
|
57
|
-
entity.automap(item)
|
|
58
|
-
|
|
59
|
-
return entity
|
|
60
|
-
})
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
this[key].setList(value)
|
|
64
|
-
} else if (
|
|
65
|
-
propDefinitions?.type === 'KlArray' &&
|
|
66
|
-
(props[key] instanceof Array || Array.isArray(props[key]))
|
|
67
|
-
) {
|
|
68
|
-
this[key] = new KlArray(props[key])
|
|
69
|
-
} else if (propDefinitions?.type === 'KlDate' && props[key] instanceof Date) {
|
|
70
|
-
this[key] = new KlDate(props[key])
|
|
71
|
-
} else if (propDefinitions?.type === 'KlTime' && props[key] instanceof Date) {
|
|
72
|
-
this[key] = new KlTime(props[key].getHours(), props[key].getMinutes(), props[key].getSeconds(), props[key].getMilliseconds())
|
|
73
|
-
} else if (EntityOnPropKey) {
|
|
74
|
-
if (props[key]) {
|
|
75
|
-
const entity = new EntityOnPropKey()
|
|
76
|
-
entity._action = this._action
|
|
77
|
-
entity.automap(props[key])
|
|
78
|
-
|
|
79
|
-
this[key] = entity
|
|
80
|
-
}
|
|
81
|
-
} else if (propDefinitions) {
|
|
82
|
-
if (key === 'id') {
|
|
83
|
-
this._id = props[key] as IComparableId
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
this[key] = props[key]
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
public equals(obj: EntityBase<T>): boolean {
|
|
93
|
-
return obj._id === this._id
|
|
94
|
-
}
|
|
95
|
-
}
|