@koalarx/nest-cli 1.0.12 → 1.0.15
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/code-base/startup-project/.eslintignore +2 -0
- package/code-base/startup-project/.eslintrc.js +20 -0
- package/code-base/startup-project/nest-cli.json +1 -1
- package/code-base/startup-project/package.json +10 -11
- package/code-base/startup-project/prisma/migrations/{20250326014047_init → 20250326220607_init}/migration.sql +12 -0
- package/code-base/startup-project/prisma/schema.prisma +15 -4
- package/code-base/startup-project/src/application/mapping/person.mapping.ts +44 -0
- package/code-base/startup-project/src/application/person/create/create-person.handler.spec.ts +6 -6
- package/code-base/startup-project/src/application/person/create/create-person.handler.ts +1 -1
- package/code-base/startup-project/src/application/person/create/create-person.request.ts +10 -0
- package/code-base/startup-project/src/application/person/create/create-person.validator.ts +3 -0
- package/code-base/startup-project/src/application/person/create-person-job/create-person-job.ts +2 -1
- package/code-base/startup-project/src/application/person/delete/delete-person.handler.spec.ts +6 -6
- package/code-base/startup-project/src/application/person/delete-inative-job/delete-inactive-job.ts +2 -2
- package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-handler.ts +3 -3
- package/code-base/startup-project/src/application/person/read/read-person.handler.spec.ts +7 -7
- package/code-base/startup-project/src/application/person/read/read-person.response.ts +15 -1
- package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.spec.ts +38 -34
- package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.ts +7 -2
- package/code-base/startup-project/src/application/person/read-many/read-many-person.request.ts +8 -2
- package/code-base/startup-project/src/application/person/read-many/read-many-person.response.ts +1 -1
- package/code-base/startup-project/src/application/person/update/update-person.handler.spec.ts +20 -18
- package/code-base/startup-project/src/application/person/update/update-person.handler.ts +2 -1
- package/code-base/startup-project/src/application/person/update/update-person.request.ts +15 -1
- package/code-base/startup-project/src/application/person/update/update-person.validator.ts +4 -0
- package/code-base/startup-project/src/core/env.ts +6 -0
- package/code-base/startup-project/src/domain/dtos/read-many-person.dto.ts +16 -0
- package/code-base/startup-project/src/domain/entities/person/person-address.ts +10 -0
- package/code-base/startup-project/src/domain/entities/person/person.ts +4 -0
- package/code-base/startup-project/src/domain/repositories/iperson.repository.ts +4 -6
- package/code-base/startup-project/src/domain/services/.gitkeep +0 -0
- package/code-base/startup-project/src/{infra → host}/app.module.ts +5 -4
- package/code-base/startup-project/src/{infra → host}/controllers/controller.module.ts +2 -2
- package/code-base/startup-project/src/{infra → host}/controllers/controllers.module.ts +1 -4
- package/code-base/startup-project/src/{infra → host}/controllers/person/person.controller.e2e-spec.ts +78 -44
- package/code-base/startup-project/src/{infra → host}/main.ts +1 -1
- package/code-base/startup-project/src/infra/database/db-transaction-context.ts +7 -0
- package/code-base/startup-project/src/infra/database/repositories/person.repository.ts +13 -6
- package/code-base/startup-project/src/infra/services/.gitkeep +0 -0
- package/code-base/startup-project/src/test/create-e2e-test-app.ts +8 -8
- package/code-base/startup-project/src/test/create-unit-test-app.ts +5 -5
- package/code-base/startup-project/src/test/mockup/person/create-person-request.mockup.ts +6 -5
- package/code-base/startup-project/src/test/repositories/person.repository.ts +24 -15
- package/code-base/startup-project/src/test/setup-e2e.ts +3 -3
- package/index.js +1 -1
- package/package.json +1 -1
- package/code-base/startup-project/eslint.config.mjs +0 -22
- package/code-base/startup-project/src/domain/mapping/person.mapping.ts +0 -24
- /package/code-base/startup-project/src/{domain → application}/mapping/mapping.profile.ts +0 -0
- /package/code-base/startup-project/src/{infra → host}/controllers/person/create-person.controller.ts +0 -0
- /package/code-base/startup-project/src/{infra → host}/controllers/person/delete-person.controller.ts +0 -0
- /package/code-base/startup-project/src/{infra → host}/controllers/person/person.module.ts +0 -0
- /package/code-base/startup-project/src/{infra → host}/controllers/person/read-many-person.controller.ts +0 -0
- /package/code-base/startup-project/src/{infra → host}/controllers/person/read-person.controller.ts +0 -0
- /package/code-base/startup-project/src/{infra → host}/controllers/person/router.config.ts +0 -0
- /package/code-base/startup-project/src/{infra → host}/controllers/person/update-person.controller.ts +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
globals: {
|
|
3
|
+
NodeJS: true,
|
|
4
|
+
},
|
|
5
|
+
extends: [
|
|
6
|
+
'@rocketseat/eslint-config/node',
|
|
7
|
+
'plugin:vitest-globals/recommended',
|
|
8
|
+
],
|
|
9
|
+
env: {
|
|
10
|
+
'vitest-globals/env': true,
|
|
11
|
+
},
|
|
12
|
+
ignorePatterns: ['*.json'],
|
|
13
|
+
rules: {
|
|
14
|
+
'no-unused-vars': 'off',
|
|
15
|
+
'no-useless-constructor': 'off',
|
|
16
|
+
'no-new': 'off',
|
|
17
|
+
'no-use-before-define': 'off',
|
|
18
|
+
'@typescript-eslint/no-explicit-any': 'off',
|
|
19
|
+
},
|
|
20
|
+
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"start": "nest start",
|
|
12
12
|
"start:dev": "npm run swc:copy-files && nest start --watch",
|
|
13
13
|
"start:debug": "npm run swc:copy-files && nest start --debug --watch",
|
|
14
|
-
"start:prod": "node dist/
|
|
14
|
+
"start:prod": "node dist/host/main",
|
|
15
15
|
"lint": "prettier --end-of-line lf --write . && npx eslint --fix src/**/* && npx eslint --fix .eslintrc.js",
|
|
16
16
|
"test": "vitest run",
|
|
17
17
|
"test:watch": "vitest",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@koalarx/utils": "3.1.3",
|
|
25
|
-
"@koalarx/nest": "
|
|
25
|
+
"@koalarx/nest": "1.2.0",
|
|
26
26
|
"@nestjs/common": "11.0.12",
|
|
27
27
|
"@nestjs/config": "4.0.1",
|
|
28
28
|
"@nestjs/core": "11.0.12",
|
|
@@ -42,10 +42,11 @@
|
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@eslint/js": "9.23.0",
|
|
45
|
-
"@faker-js/faker": "
|
|
45
|
+
"@faker-js/faker": "9.6.0",
|
|
46
46
|
"@nestjs/cli": "11.0.5",
|
|
47
47
|
"@nestjs/schematics": "10.0.2",
|
|
48
48
|
"@nestjs/testing": "11.0.12",
|
|
49
|
+
"@rocketseat/eslint-config": "1.2.0",
|
|
49
50
|
"@swc/cli": "0.1.62",
|
|
50
51
|
"@swc/core": "1.3.81",
|
|
51
52
|
"@types/cookie-parser": "1.4.8",
|
|
@@ -56,19 +57,17 @@
|
|
|
56
57
|
"@typescript-eslint/eslint-plugin": "8.27.0",
|
|
57
58
|
"@typescript-eslint/parser": "8.27.0",
|
|
58
59
|
"@vitest/coverage-v8": "3.0.9",
|
|
59
|
-
"eslint": "
|
|
60
|
-
"eslint-config-prettier": "
|
|
61
|
-
"eslint-plugin-prettier": "
|
|
62
|
-
"eslint-plugin-vitest": "0.
|
|
63
|
-
"eslint-plugin-vitest-globals": "1.
|
|
64
|
-
"
|
|
65
|
-
"prettier": "3.5.3",
|
|
60
|
+
"eslint": "8.57.0",
|
|
61
|
+
"eslint-config-prettier": "8.3.0",
|
|
62
|
+
"eslint-plugin-prettier": "4.0.0",
|
|
63
|
+
"eslint-plugin-vitest": "0.2.8",
|
|
64
|
+
"eslint-plugin-vitest-globals": "1.4.0",
|
|
65
|
+
"prettier": "2.3.2",
|
|
66
66
|
"prisma": "6.5.0",
|
|
67
67
|
"source-map-support": "0.5.20",
|
|
68
68
|
"supertest": "7.1.0",
|
|
69
69
|
"tsconfig-paths": "4.2.0",
|
|
70
70
|
"typescript": "5.1.3",
|
|
71
|
-
"typescript-eslint": "8.27.0",
|
|
72
71
|
"unplugin-swc": "1.5.1",
|
|
73
72
|
"vite-tsconfig-paths": "5.1.4",
|
|
74
73
|
"vitest": "3.0.9"
|
|
@@ -3,6 +3,7 @@ CREATE TABLE "person" (
|
|
|
3
3
|
"id" SERIAL NOT NULL,
|
|
4
4
|
"name" TEXT NOT NULL,
|
|
5
5
|
"active" BOOLEAN NOT NULL DEFAULT true,
|
|
6
|
+
"person_address_id" INTEGER NOT NULL,
|
|
6
7
|
|
|
7
8
|
CONSTRAINT "person_pkey" PRIMARY KEY ("id")
|
|
8
9
|
);
|
|
@@ -16,5 +17,16 @@ CREATE TABLE "person_phone" (
|
|
|
16
17
|
CONSTRAINT "person_phone_pkey" PRIMARY KEY ("id")
|
|
17
18
|
);
|
|
18
19
|
|
|
20
|
+
-- CreateTable
|
|
21
|
+
CREATE TABLE "person_address" (
|
|
22
|
+
"id" SERIAL NOT NULL,
|
|
23
|
+
"address" TEXT NOT NULL,
|
|
24
|
+
|
|
25
|
+
CONSTRAINT "person_address_pkey" PRIMARY KEY ("id")
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
-- AddForeignKey
|
|
29
|
+
ALTER TABLE "person" ADD CONSTRAINT "person_person_address_id_fkey" FOREIGN KEY ("person_address_id") REFERENCES "person_address"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
30
|
+
|
|
19
31
|
-- AddForeignKey
|
|
20
32
|
ALTER TABLE "person_phone" ADD CONSTRAINT "person_phone_person_id_fkey" FOREIGN KEY ("person_id") REFERENCES "person"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -10,11 +10,13 @@ datasource db {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
model Person {
|
|
13
|
-
id
|
|
14
|
-
name
|
|
15
|
-
active
|
|
13
|
+
id Int @id @default(autoincrement())
|
|
14
|
+
name String
|
|
15
|
+
active Boolean @default(true)
|
|
16
|
+
personAddressId Int @map("person_address_id")
|
|
16
17
|
|
|
17
|
-
phones
|
|
18
|
+
phones PersonPhone[]
|
|
19
|
+
address PersonAddress @relation(fields: [personAddressId], references: [id])
|
|
18
20
|
|
|
19
21
|
@@map("person")
|
|
20
22
|
}
|
|
@@ -28,3 +30,12 @@ model PersonPhone {
|
|
|
28
30
|
|
|
29
31
|
@@map("person_phone")
|
|
30
32
|
}
|
|
33
|
+
|
|
34
|
+
model PersonAddress {
|
|
35
|
+
id Int @id @default(autoincrement())
|
|
36
|
+
address String
|
|
37
|
+
|
|
38
|
+
people Person[]
|
|
39
|
+
|
|
40
|
+
@@map("person_address")
|
|
41
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
|
|
2
|
+
import { Person } from '@/domain/entities/person/person'
|
|
3
|
+
import { PersonAddress } from '@/domain/entities/person/person-address'
|
|
4
|
+
import { PersonPhone } from '@/domain/entities/person/person-phone'
|
|
5
|
+
import { createMap } from '@koalarx/nest/core/mapping/create-map'
|
|
6
|
+
import { forMember } from '@koalarx/nest/core/mapping/for-member'
|
|
7
|
+
import {
|
|
8
|
+
CreatePersonAddressRequest,
|
|
9
|
+
CreatePersonPhoneRequest,
|
|
10
|
+
CreatePersonRequest,
|
|
11
|
+
} from '../person/create/create-person.request'
|
|
12
|
+
import { ReadManyPersonRequest } from '../person/read-many/read-many-person.request'
|
|
13
|
+
import {
|
|
14
|
+
ReadPersonAddressResponse,
|
|
15
|
+
ReadPersonPhoneResponse,
|
|
16
|
+
ReadPersonResponse,
|
|
17
|
+
} from '../person/read/read-person.response'
|
|
18
|
+
import {
|
|
19
|
+
UpdatePersonAddressRequest,
|
|
20
|
+
UpdatePersonPhoneRequest,
|
|
21
|
+
UpdatePersonRequest,
|
|
22
|
+
} from '../person/update/update-person.request'
|
|
23
|
+
|
|
24
|
+
export class PersonMapping {
|
|
25
|
+
static createMap() {
|
|
26
|
+
createMap(CreatePersonAddressRequest, PersonAddress)
|
|
27
|
+
createMap(CreatePersonPhoneRequest, PersonPhone)
|
|
28
|
+
createMap(CreatePersonRequest, Person)
|
|
29
|
+
|
|
30
|
+
createMap(PersonAddress, ReadPersonAddressResponse)
|
|
31
|
+
createMap(PersonPhone, ReadPersonPhoneResponse)
|
|
32
|
+
createMap(
|
|
33
|
+
Person,
|
|
34
|
+
ReadPersonResponse,
|
|
35
|
+
forMember('status', (s) => (s.active === true ? 'active' : 'inactive')),
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
createMap(ReadManyPersonRequest, ReadManyPersonDto)
|
|
39
|
+
|
|
40
|
+
createMap(UpdatePersonAddressRequest, PersonAddress)
|
|
41
|
+
createMap(UpdatePersonPhoneRequest, PersonPhone)
|
|
42
|
+
createMap(UpdatePersonRequest, Person)
|
|
43
|
+
}
|
|
44
|
+
}
|
package/code-base/startup-project/src/application/person/create/create-person.handler.spec.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createUnitTestApp } from
|
|
2
|
-
import { createPersonRequestMockup } from
|
|
3
|
-
import { CreatePersonHandler } from
|
|
1
|
+
import { createUnitTestApp } from '@/test/create-unit-test-app'
|
|
2
|
+
import { createPersonRequestMockup } from '@/test/mockup/person/create-person-request.mockup'
|
|
3
|
+
import { CreatePersonHandler } from './create-person.handler'
|
|
4
4
|
|
|
5
5
|
describe('CreatePersonHandler', () => {
|
|
6
6
|
const app = createUnitTestApp()
|
|
@@ -10,13 +10,13 @@ describe('CreatePersonHandler', () => {
|
|
|
10
10
|
const request = createPersonRequestMockup
|
|
11
11
|
|
|
12
12
|
const result = await handler.handle(request)
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
expect(result.isOk()).toBeTruthy()
|
|
15
15
|
|
|
16
16
|
if (result.isOk()) {
|
|
17
17
|
expect(result.value).toEqual({
|
|
18
|
-
id: expect.any(Number)
|
|
18
|
+
id: expect.any(Number),
|
|
19
19
|
})
|
|
20
20
|
}
|
|
21
21
|
})
|
|
22
|
-
})
|
|
22
|
+
})
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
2
2
|
import { ApiProperty } from '@nestjs/swagger'
|
|
3
3
|
|
|
4
|
+
export class CreatePersonAddressRequest {
|
|
5
|
+
@ApiProperty()
|
|
6
|
+
@AutoMap()
|
|
7
|
+
address: string
|
|
8
|
+
}
|
|
9
|
+
|
|
4
10
|
export class CreatePersonPhoneRequest {
|
|
5
11
|
@ApiProperty()
|
|
6
12
|
@AutoMap()
|
|
@@ -15,4 +21,8 @@ export class CreatePersonRequest {
|
|
|
15
21
|
@ApiProperty({ type: [CreatePersonPhoneRequest] })
|
|
16
22
|
@AutoMap({ type: CreatePersonPhoneRequest, isArray: { addTo: true } })
|
|
17
23
|
phones: Array<CreatePersonPhoneRequest>
|
|
24
|
+
|
|
25
|
+
@ApiProperty({ type: CreatePersonAddressRequest })
|
|
26
|
+
@AutoMap({ type: CreatePersonAddressRequest })
|
|
27
|
+
address: CreatePersonAddressRequest
|
|
18
28
|
}
|
package/code-base/startup-project/src/application/person/create-person-job/create-person-job.ts
CHANGED
|
@@ -26,7 +26,8 @@ export class CreatePersonJob extends CronJob {
|
|
|
26
26
|
protected async run(): Promise<CronJobResponse> {
|
|
27
27
|
const result = await this.createPerson.handle({
|
|
28
28
|
name: 'John Doe',
|
|
29
|
-
phones: [{phone: '22999999999'}],
|
|
29
|
+
phones: [{ phone: '22999999999' }],
|
|
30
|
+
address: { address: 'Street 1' },
|
|
30
31
|
})
|
|
31
32
|
|
|
32
33
|
if (result.isOk()) {
|
package/code-base/startup-project/src/application/person/delete/delete-person.handler.spec.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { createUnitTestApp } from
|
|
2
|
-
import { createPersonRequestMockup } from
|
|
3
|
-
import { CreatePersonHandler } from
|
|
4
|
-
import { DeletePersonHandler } from
|
|
1
|
+
import { createUnitTestApp } from '@/test/create-unit-test-app'
|
|
2
|
+
import { createPersonRequestMockup } from '@/test/mockup/person/create-person-request.mockup'
|
|
3
|
+
import { CreatePersonHandler } from '../create/create-person.handler'
|
|
4
|
+
import { DeletePersonHandler } from './delete-person.handler'
|
|
5
5
|
|
|
6
6
|
describe('DeletePersonHandler', () => {
|
|
7
7
|
const app = createUnitTestApp()
|
|
@@ -10,7 +10,7 @@ describe('DeletePersonHandler', () => {
|
|
|
10
10
|
const createResult = await app
|
|
11
11
|
.get(CreatePersonHandler)
|
|
12
12
|
.handle(createPersonRequestMockup)
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
expect(createResult.isOk()).toBeTruthy()
|
|
15
15
|
|
|
16
16
|
if (createResult.isOk()) {
|
|
@@ -21,4 +21,4 @@ describe('DeletePersonHandler', () => {
|
|
|
21
21
|
expect(result.isOk()).toBeTruthy()
|
|
22
22
|
}
|
|
23
23
|
})
|
|
24
|
-
})
|
|
24
|
+
})
|
package/code-base/startup-project/src/application/person/delete-inative-job/delete-inactive-job.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
|
|
1
2
|
import {
|
|
2
3
|
CronJob,
|
|
3
4
|
CronJobResponse,
|
|
@@ -8,7 +9,6 @@ import { IRedLockService } from '@koalarx/nest/services/redlock/ired-lock.servic
|
|
|
8
9
|
import { Injectable } from '@nestjs/common'
|
|
9
10
|
import { DeletePersonHandler } from '../delete/delete-person.handler'
|
|
10
11
|
import { ReadManyPersonHandler } from '../read-many/read-many-person.handler'
|
|
11
|
-
import { ReadManyPersonRequest } from '../read-many/read-many-person.request'
|
|
12
12
|
|
|
13
13
|
@Injectable()
|
|
14
14
|
export class DeleteInactiveJob extends CronJob {
|
|
@@ -23,7 +23,7 @@ export class DeleteInactiveJob extends CronJob {
|
|
|
23
23
|
|
|
24
24
|
protected async run(): Promise<CronJobResponse> {
|
|
25
25
|
const result = await this.readManyPerson.handle(
|
|
26
|
-
new
|
|
26
|
+
new ReadManyPersonDto({ active: false }),
|
|
27
27
|
)
|
|
28
28
|
|
|
29
29
|
if (result.isOk()) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
|
|
1
2
|
import { IPersonRepository } from '@/domain/repositories/iperson.repository'
|
|
2
3
|
import { EventHandler } from '@koalarx/nest/core/backgroud-services/event-service/event-handler'
|
|
3
4
|
import { Injectable } from '@nestjs/common'
|
|
4
|
-
import { ReadManyPersonRequest } from '../../read-many/read-many-person.request'
|
|
5
5
|
import { InactivePersonEvent } from './inactive-person-event'
|
|
6
6
|
|
|
7
7
|
@Injectable()
|
|
@@ -12,12 +12,12 @@ export class InactivePersonHandler extends EventHandler<InactivePersonEvent> {
|
|
|
12
12
|
|
|
13
13
|
async handleEvent(): Promise<void> {
|
|
14
14
|
const result = await this.repository.readMany(
|
|
15
|
-
new
|
|
15
|
+
new ReadManyPersonDto({ active: true }),
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
for (const person of result.items) {
|
|
19
19
|
person.active = false
|
|
20
|
-
await this.repository.
|
|
20
|
+
await this.repository.update(person)
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
console.log(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { createUnitTestApp } from
|
|
2
|
-
import { createPersonRequestMockup } from
|
|
3
|
-
import { CreatePersonHandler } from
|
|
4
|
-
import { ReadPersonHandler } from
|
|
1
|
+
import { createUnitTestApp } from '@/test/create-unit-test-app'
|
|
2
|
+
import { createPersonRequestMockup } from '@/test/mockup/person/create-person-request.mockup'
|
|
3
|
+
import { CreatePersonHandler } from '../create/create-person.handler'
|
|
4
|
+
import { ReadPersonHandler } from './read-person.handler'
|
|
5
5
|
|
|
6
6
|
describe('ReadPersonHandler', () => {
|
|
7
7
|
const app = createUnitTestApp()
|
|
@@ -11,7 +11,7 @@ describe('ReadPersonHandler', () => {
|
|
|
11
11
|
const createResult = await app
|
|
12
12
|
.get(CreatePersonHandler)
|
|
13
13
|
.handle(createPersonRequestMockup)
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
expect(createResult.isOk()).toBeTruthy()
|
|
16
16
|
|
|
17
17
|
if (createResult.isOk()) {
|
|
@@ -22,8 +22,8 @@ describe('ReadPersonHandler', () => {
|
|
|
22
22
|
expect(result.value).toEqual({
|
|
23
23
|
...person,
|
|
24
24
|
id: createResult.value.id,
|
|
25
|
-
status: 'inactive'
|
|
25
|
+
status: 'inactive',
|
|
26
26
|
})
|
|
27
27
|
}
|
|
28
28
|
})
|
|
29
|
-
})
|
|
29
|
+
})
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
2
2
|
import { ApiProperty } from '@nestjs/swagger'
|
|
3
3
|
|
|
4
|
+
export class ReadPersonAddressResponse {
|
|
5
|
+
@ApiProperty()
|
|
6
|
+
@AutoMap()
|
|
7
|
+
id: number
|
|
8
|
+
|
|
9
|
+
@ApiProperty()
|
|
10
|
+
@AutoMap()
|
|
11
|
+
address: string
|
|
12
|
+
}
|
|
13
|
+
|
|
4
14
|
export class ReadPersonPhoneResponse {
|
|
5
15
|
@ApiProperty()
|
|
6
16
|
@AutoMap()
|
|
@@ -21,9 +31,13 @@ export class ReadPersonResponse {
|
|
|
21
31
|
name: string
|
|
22
32
|
|
|
23
33
|
@ApiProperty({ type: [ReadPersonPhoneResponse] })
|
|
24
|
-
@AutoMap({ type: ReadPersonPhoneResponse, isArray: true})
|
|
34
|
+
@AutoMap({ type: ReadPersonPhoneResponse, isArray: true })
|
|
25
35
|
phones: Array<ReadPersonPhoneResponse>
|
|
26
36
|
|
|
37
|
+
@ApiProperty({ type: ReadPersonAddressResponse })
|
|
38
|
+
@AutoMap({ type: ReadPersonAddressResponse })
|
|
39
|
+
address: ReadPersonAddressResponse
|
|
40
|
+
|
|
27
41
|
@ApiProperty()
|
|
28
42
|
@AutoMap()
|
|
29
43
|
status: string
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.spec.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { createUnitTestApp } from
|
|
2
|
-
import { createPersonRequestMockup } from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import { createUnitTestApp } from '@/test/create-unit-test-app'
|
|
2
|
+
import { createPersonRequestMockup } from '@/test/mockup/person/create-person-request.mockup'
|
|
3
|
+
import { RequestResult } from '@koalarx/nest/core/request-overflow/request-result'
|
|
4
|
+
import { CreatePersonHandler } from '../create/create-person.handler'
|
|
5
|
+
import { CreatePersonResponse } from '../create/create-person.response'
|
|
6
|
+
import { ReadManyPersonHandler } from './read-many-person.handler'
|
|
7
|
+
import { ReadManyPersonRequest } from './read-many-person.request'
|
|
8
8
|
|
|
9
9
|
describe('ReadManyPersonHandler', () => {
|
|
10
10
|
const app = createUnitTestApp()
|
|
@@ -13,11 +13,11 @@ describe('ReadManyPersonHandler', () => {
|
|
|
13
13
|
let personId: number
|
|
14
14
|
let createResult: RequestResult<Error, CreatePersonResponse>
|
|
15
15
|
|
|
16
|
-
beforeAll(async () => {
|
|
16
|
+
beforeAll(async () => {
|
|
17
17
|
createResult = await app
|
|
18
18
|
.get(CreatePersonHandler)
|
|
19
19
|
.handle(createPersonRequestMockup)
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
expect(createResult.isOk()).toBeTruthy()
|
|
22
22
|
|
|
23
23
|
if (createResult.isOk()) {
|
|
@@ -31,42 +31,46 @@ describe('ReadManyPersonHandler', () => {
|
|
|
31
31
|
.handle(new ReadManyPersonRequest())
|
|
32
32
|
|
|
33
33
|
expect(result.value).toEqual({
|
|
34
|
-
items: [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
items: [
|
|
35
|
+
{
|
|
36
|
+
...person,
|
|
37
|
+
id: personId,
|
|
38
|
+
status: 'inactive',
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
count: 1,
|
|
40
42
|
})
|
|
41
43
|
})
|
|
42
44
|
|
|
43
45
|
it('should get persons by name', async () => {
|
|
44
|
-
const result = await app
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
const result = await app.get(ReadManyPersonHandler).handle(
|
|
47
|
+
new ReadManyPersonRequest({
|
|
48
|
+
name: person.name,
|
|
49
|
+
}),
|
|
50
|
+
)
|
|
49
51
|
|
|
50
52
|
expect(result.value).toEqual({
|
|
51
|
-
items: [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
items: [
|
|
54
|
+
{
|
|
55
|
+
...person,
|
|
56
|
+
id: personId,
|
|
57
|
+
status: 'inactive',
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
count: 1,
|
|
57
61
|
})
|
|
58
|
-
})
|
|
62
|
+
})
|
|
59
63
|
|
|
60
64
|
it('should get persons by status', async () => {
|
|
61
|
-
const result = await app
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
const result = await app.get(ReadManyPersonHandler).handle(
|
|
66
|
+
new ReadManyPersonRequest({
|
|
67
|
+
active: true,
|
|
68
|
+
}),
|
|
69
|
+
)
|
|
66
70
|
|
|
67
71
|
expect(result.value).toEqual({
|
|
68
72
|
items: [],
|
|
69
|
-
count: 0
|
|
73
|
+
count: 0,
|
|
70
74
|
})
|
|
71
75
|
})
|
|
72
|
-
})
|
|
76
|
+
})
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
|
|
1
2
|
import { Person } from '@/domain/entities/person/person'
|
|
2
3
|
import { IPersonRepository } from '@/domain/repositories/iperson.repository'
|
|
3
4
|
import { ResourceNotFoundError } from '@koalarx/nest/core/errors/resource-not-found.error'
|
|
@@ -29,14 +30,18 @@ export class ReadManyPersonHandler extends RequestHandlerBase<
|
|
|
29
30
|
query: ReadManyPersonRequest,
|
|
30
31
|
): Promise<RequestResult<ResourceNotFoundError, ReadManyPersonResponse>> {
|
|
31
32
|
const listOfPerson = await this.repository.readMany(
|
|
32
|
-
|
|
33
|
+
this.mapper.map(
|
|
34
|
+
new ReadManyPersonValidator(query).validate(),
|
|
35
|
+
ReadManyPersonRequest,
|
|
36
|
+
ReadManyPersonDto,
|
|
37
|
+
),
|
|
33
38
|
)
|
|
34
39
|
|
|
35
40
|
return ok({
|
|
36
41
|
...listOfPerson,
|
|
37
42
|
items: listOfPerson.items.map((person) =>
|
|
38
43
|
this.mapper.map(person, Person, ReadPersonResponse),
|
|
39
|
-
)
|
|
44
|
+
),
|
|
40
45
|
})
|
|
41
46
|
}
|
|
42
47
|
}
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.request.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
PaginatedRequestProps,
|
|
3
|
+
PaginationRequest,
|
|
4
|
+
} from '@koalarx/nest/core/controllers/pagination.request'
|
|
5
|
+
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
2
6
|
import { ApiProperty } from '@nestjs/swagger'
|
|
3
7
|
|
|
4
|
-
export class ReadManyPersonRequest extends
|
|
8
|
+
export class ReadManyPersonRequest extends PaginationRequest {
|
|
5
9
|
@ApiProperty({ required: false })
|
|
10
|
+
@AutoMap()
|
|
6
11
|
name?: string
|
|
7
12
|
|
|
8
13
|
@ApiProperty({ required: false })
|
|
14
|
+
@AutoMap()
|
|
9
15
|
active?: boolean
|
|
10
16
|
|
|
11
17
|
constructor(props?: PaginatedRequestProps<ReadManyPersonRequest>) {
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.response.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ListResponse } from '@koalarx/nest/core
|
|
1
|
+
import { ListResponse } from '@koalarx/nest/core'
|
|
2
2
|
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
3
3
|
import { ApiProperty } from '@nestjs/swagger'
|
|
4
4
|
import { ReadPersonResponse } from '../read/read-person.response'
|
package/code-base/startup-project/src/application/person/update/update-person.handler.spec.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createUnitTestApp } from
|
|
2
|
-
import { createPersonRequestMockup } from
|
|
3
|
-
import { CreatePersonHandler } from
|
|
4
|
-
import { ReadPersonHandler } from
|
|
5
|
-
import { UpdatePersonHandler } from
|
|
1
|
+
import { createUnitTestApp } from '@/test/create-unit-test-app'
|
|
2
|
+
import { createPersonRequestMockup } from '@/test/mockup/person/create-person-request.mockup'
|
|
3
|
+
import { CreatePersonHandler } from '../create/create-person.handler'
|
|
4
|
+
import { ReadPersonHandler } from '../read/read-person.handler'
|
|
5
|
+
import { UpdatePersonHandler } from './update-person.handler'
|
|
6
6
|
|
|
7
7
|
describe('UpdatePersonHandler', () => {
|
|
8
8
|
const app = createUnitTestApp()
|
|
@@ -12,20 +12,22 @@ describe('UpdatePersonHandler', () => {
|
|
|
12
12
|
const createResult = await app
|
|
13
13
|
.get(CreatePersonHandler)
|
|
14
14
|
.handle(createPersonRequestMockup)
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
expect(createResult.isOk()).toBeTruthy()
|
|
17
17
|
|
|
18
18
|
if (createResult.isOk()) {
|
|
19
|
-
const updateResult = await app
|
|
20
|
-
.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
const updateResult = await app.get(UpdatePersonHandler).handle({
|
|
20
|
+
id: createResult.value.id,
|
|
21
|
+
data: {
|
|
22
|
+
...person,
|
|
23
|
+
address: {
|
|
24
|
+
id: 1,
|
|
25
|
+
...person.address,
|
|
26
|
+
},
|
|
27
|
+
active: true,
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
|
|
29
31
|
expect(updateResult.isOk()).toBeTruthy()
|
|
30
32
|
|
|
31
33
|
const result = await app
|
|
@@ -35,8 +37,8 @@ describe('UpdatePersonHandler', () => {
|
|
|
35
37
|
expect(result.value).toEqual({
|
|
36
38
|
...person,
|
|
37
39
|
id: createResult.value.id,
|
|
38
|
-
status: 'active'
|
|
40
|
+
status: 'active',
|
|
39
41
|
})
|
|
40
42
|
}
|
|
41
43
|
})
|
|
42
|
-
})
|
|
44
|
+
})
|
|
@@ -47,9 +47,10 @@ export class UpdatePersonHandler extends RequestHandlerBase<
|
|
|
47
47
|
|
|
48
48
|
personInBd.name = person.name
|
|
49
49
|
personInBd.active = person.active
|
|
50
|
+
personInBd.address.address = person.address.address
|
|
50
51
|
personInBd.phones.update(person.phones.toArray())
|
|
51
52
|
|
|
52
|
-
await this.repository.
|
|
53
|
+
await this.repository.update(personInBd)
|
|
53
54
|
|
|
54
55
|
return ok(null)
|
|
55
56
|
}
|