@koalarx/nest-cli 1.0.14 → 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.
Files changed (38) hide show
  1. package/code-base/startup-project/.eslintignore +2 -0
  2. package/code-base/startup-project/.eslintrc.js +20 -0
  3. package/code-base/startup-project/package.json +9 -10
  4. package/code-base/startup-project/prisma/migrations/{20250326014047_init → 20250326220607_init}/migration.sql +12 -0
  5. package/code-base/startup-project/prisma/schema.prisma +15 -4
  6. package/code-base/startup-project/src/application/mapping/person.mapping.ts +25 -9
  7. package/code-base/startup-project/src/application/person/create/create-person.handler.spec.ts +6 -6
  8. package/code-base/startup-project/src/application/person/create/create-person.request.ts +10 -0
  9. package/code-base/startup-project/src/application/person/create/create-person.validator.ts +3 -0
  10. package/code-base/startup-project/src/application/person/create-person-job/create-person-job.ts +2 -1
  11. package/code-base/startup-project/src/application/person/delete/delete-person.handler.spec.ts +6 -6
  12. package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-handler.ts +2 -3
  13. package/code-base/startup-project/src/application/person/read/read-person.handler.spec.ts +7 -7
  14. package/code-base/startup-project/src/application/person/read/read-person.response.ts +15 -1
  15. package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.spec.ts +38 -34
  16. package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.ts +2 -2
  17. package/code-base/startup-project/src/application/person/read-many/read-many-person.request.ts +5 -2
  18. package/code-base/startup-project/src/application/person/update/update-person.handler.spec.ts +20 -18
  19. package/code-base/startup-project/src/application/person/update/update-person.handler.ts +1 -0
  20. package/code-base/startup-project/src/application/person/update/update-person.request.ts +15 -1
  21. package/code-base/startup-project/src/application/person/update/update-person.validator.ts +4 -0
  22. package/code-base/startup-project/src/core/env.ts +6 -0
  23. package/code-base/startup-project/src/domain/entities/person/person-address.ts +10 -0
  24. package/code-base/startup-project/src/domain/entities/person/person.ts +4 -0
  25. package/code-base/startup-project/src/host/app.module.ts +4 -3
  26. package/code-base/startup-project/src/host/controllers/controllers.module.ts +1 -4
  27. package/code-base/startup-project/src/host/controllers/person/person.controller.e2e-spec.ts +78 -44
  28. package/code-base/startup-project/src/infra/database/db-transaction-context.ts +7 -0
  29. package/code-base/startup-project/src/infra/database/repositories/person.repository.ts +4 -1
  30. package/code-base/startup-project/src/test/create-e2e-test-app.ts +7 -7
  31. package/code-base/startup-project/src/test/create-unit-test-app.ts +4 -4
  32. package/code-base/startup-project/src/test/mockup/person/create-person-request.mockup.ts +6 -5
  33. package/code-base/startup-project/src/test/repositories/person.repository.ts +16 -11
  34. package/code-base/startup-project/src/test/setup-e2e.ts +3 -3
  35. package/index.js +1 -1
  36. package/package.json +1 -1
  37. package/code-base/startup-project/eslint.config.mjs +0 -22
  38. package/code-base/startup-project/src/core/.gitkeep +0 -0
@@ -0,0 +1,2 @@
1
+ node_modules
2
+ dist
@@ -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
+ }
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@koalarx/utils": "3.1.3",
25
- "@koalarx/nest": "^1.1.0",
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": "^9.6.0",
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": "9.23.0",
60
- "eslint-config-prettier": "10.1.1",
61
- "eslint-plugin-prettier": "5.2.3",
62
- "eslint-plugin-vitest": "0.5.4",
63
- "eslint-plugin-vitest-globals": "1.5.0",
64
- "globals": "16.0.0",
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 Int @id @default(autoincrement())
14
- name String
15
- active Boolean @default(true)
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 PersonPhone[]
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
+ }
@@ -1,18 +1,33 @@
1
- import { ReadManyPersonDto } from "@/domain/dtos/read-many-person.dto"
2
- import { Person } from "@/domain/entities/person/person"
3
- import { PersonPhone } from "@/domain/entities/person/person-phone"
4
- import { createMap } from "@koalarx/nest/core/mapping/create-map"
5
- import { forMember } from "@koalarx/nest/core/mapping/for-member"
6
- import { CreatePersonPhoneRequest, CreatePersonRequest } from "../person/create/create-person.request"
7
- import { ReadManyPersonRequest } from "../person/read-many/read-many-person.request"
8
- import { ReadPersonPhoneResponse, ReadPersonResponse } from "../person/read/read-person.response"
9
- import { UpdatePersonPhoneRequest, UpdatePersonRequest } from "../person/update/update-person.request"
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'
10
23
 
11
24
  export class PersonMapping {
12
25
  static createMap() {
26
+ createMap(CreatePersonAddressRequest, PersonAddress)
13
27
  createMap(CreatePersonPhoneRequest, PersonPhone)
14
28
  createMap(CreatePersonRequest, Person)
15
29
 
30
+ createMap(PersonAddress, ReadPersonAddressResponse)
16
31
  createMap(PersonPhone, ReadPersonPhoneResponse)
17
32
  createMap(
18
33
  Person,
@@ -22,6 +37,7 @@ export class PersonMapping {
22
37
 
23
38
  createMap(ReadManyPersonRequest, ReadManyPersonDto)
24
39
 
40
+ createMap(UpdatePersonAddressRequest, PersonAddress)
25
41
  createMap(UpdatePersonPhoneRequest, PersonPhone)
26
42
  createMap(UpdatePersonRequest, Person)
27
43
  }
@@ -1,6 +1,6 @@
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"
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
  }
@@ -11,6 +11,9 @@ export class CreatePersonValidator extends RequestValidatorBase<CreatePersonRequ
11
11
  phone: z.string(),
12
12
  }),
13
13
  ),
14
+ address: z.object({
15
+ address: z.string(),
16
+ }),
14
17
  })
15
18
  }
16
19
  }
@@ -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()) {
@@ -1,7 +1,7 @@
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"
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
+ })
@@ -1,9 +1,8 @@
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
- import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
7
6
 
8
7
  @Injectable()
9
8
  export class InactivePersonHandler extends EventHandler<InactivePersonEvent> {
@@ -18,7 +17,7 @@ export class InactivePersonHandler extends EventHandler<InactivePersonEvent> {
18
17
 
19
18
  for (const person of result.items) {
20
19
  person.active = false
21
- await this.repository.save(person)
20
+ await this.repository.update(person)
22
21
  }
23
22
 
24
23
  console.log(
@@ -1,7 +1,7 @@
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"
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
@@ -1,10 +1,10 @@
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"
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
- ...person,
36
- id: personId,
37
- status: 'inactive'
38
- }],
39
- count: 1
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
- .get(ReadManyPersonHandler)
46
- .handle(new ReadManyPersonRequest({
47
- name: person.name
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
- ...person,
53
- id: personId,
54
- status: 'inactive'
55
- }],
56
- count: 1
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
- .get(ReadManyPersonHandler)
63
- .handle(new ReadManyPersonRequest({
64
- active: true
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
+ })
@@ -33,7 +33,7 @@ export class ReadManyPersonHandler extends RequestHandlerBase<
33
33
  this.mapper.map(
34
34
  new ReadManyPersonValidator(query).validate(),
35
35
  ReadManyPersonRequest,
36
- ReadManyPersonDto
36
+ ReadManyPersonDto,
37
37
  ),
38
38
  )
39
39
 
@@ -41,7 +41,7 @@ export class ReadManyPersonHandler extends RequestHandlerBase<
41
41
  ...listOfPerson,
42
42
  items: listOfPerson.items.map((person) =>
43
43
  this.mapper.map(person, Person, ReadPersonResponse),
44
- )
44
+ ),
45
45
  })
46
46
  }
47
47
  }
@@ -1,4 +1,7 @@
1
- import { PaginatedRequestProps, PaginationRequest } from '@koalarx/nest/core/controllers/pagination.request'
1
+ import {
2
+ PaginatedRequestProps,
3
+ PaginationRequest,
4
+ } from '@koalarx/nest/core/controllers/pagination.request'
2
5
  import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
3
6
  import { ApiProperty } from '@nestjs/swagger'
4
7
 
@@ -10,7 +13,7 @@ export class ReadManyPersonRequest extends PaginationRequest {
10
13
  @ApiProperty({ required: false })
11
14
  @AutoMap()
12
15
  active?: boolean
13
-
16
+
14
17
  constructor(props?: PaginatedRequestProps<ReadManyPersonRequest>) {
15
18
  super()
16
19
  Object.assign(this, props)
@@ -1,8 +1,8 @@
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"
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
- .get(UpdatePersonHandler)
21
- .handle({
22
- id: createResult.value.id,
23
- data: {
24
- ...person,
25
- active: true
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,6 +47,7 @@ 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
53
  await this.repository.update(personInBd)
@@ -1,8 +1,18 @@
1
1
  import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
2
2
  import { ApiProperty } from '@nestjs/swagger'
3
3
 
4
+ export class UpdatePersonAddressRequest {
5
+ @ApiProperty()
6
+ @AutoMap()
7
+ id: number
8
+
9
+ @ApiProperty()
10
+ @AutoMap()
11
+ address: string
12
+ }
13
+
4
14
  export class UpdatePersonPhoneRequest {
5
- @ApiProperty({required: false})
15
+ @ApiProperty({ required: false })
6
16
  @AutoMap()
7
17
  id?: number
8
18
 
@@ -23,4 +33,8 @@ export class UpdatePersonRequest {
23
33
  @ApiProperty({ type: [UpdatePersonPhoneRequest] })
24
34
  @AutoMap({ type: UpdatePersonPhoneRequest, isArray: true })
25
35
  phones: Array<UpdatePersonPhoneRequest>
36
+
37
+ @ApiProperty({ type: UpdatePersonAddressRequest })
38
+ @AutoMap({ type: UpdatePersonAddressRequest })
39
+ address: UpdatePersonAddressRequest
26
40
  }
@@ -12,6 +12,10 @@ export class UpdatePersonValidator extends RequestValidatorBase<UpdatePersonRequ
12
12
  phone: z.string(),
13
13
  }),
14
14
  ),
15
+ address: z.object({
16
+ id: z.number(),
17
+ address: z.string(),
18
+ }),
15
19
  })
16
20
  }
17
21
  }
@@ -0,0 +1,6 @@
1
+ import { envSchema } from '@koalarx/nest/env/env'
2
+ import { z } from 'zod'
3
+
4
+ export const env = envSchema.merge(z.object({}))
5
+
6
+ export type EnvType = z.infer<typeof env>
@@ -0,0 +1,10 @@
1
+ import { EntityBase } from '@koalarx/nest/core/database/entity.base'
2
+ import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
3
+
4
+ export class PersonAddress extends EntityBase<PersonAddress> {
5
+ @AutoMap()
6
+ id: number
7
+
8
+ @AutoMap()
9
+ address: string
10
+ }
@@ -2,6 +2,7 @@ import { EntityBase } from '@koalarx/nest/core/database/entity.base'
2
2
  import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
3
3
  import { List } from '@koalarx/nest/core/utils/list'
4
4
  import { PersonPhone } from './person-phone'
5
+ import { PersonAddress } from './person-address'
5
6
 
6
7
  export class Person extends EntityBase<Person> {
7
8
  @AutoMap()
@@ -13,6 +14,9 @@ export class Person extends EntityBase<Person> {
13
14
  @AutoMap({ type: List })
14
15
  phones = new List(PersonPhone)
15
16
 
17
+ @AutoMap({ type: PersonAddress })
18
+ address: PersonAddress
19
+
16
20
  @AutoMap()
17
21
  active: boolean
18
22
  }
@@ -8,12 +8,13 @@ import { RepositoriesModule } from '@/infra/database/repositories/repositories.m
8
8
  import { KoalaNestModule } from '@koalarx/nest/core/koala-nest.module'
9
9
  import { Module } from '@nestjs/common'
10
10
  import { ControllersModule } from './controllers/controllers.module'
11
+ import { env } from '@/core/env'
11
12
 
12
13
  @Module({
13
14
  imports: [
14
- KoalaNestModule.register(),
15
- RepositoriesModule,
16
- ControllersModule
15
+ KoalaNestModule.register({ env }),
16
+ RepositoriesModule,
17
+ ControllersModule,
17
18
  ],
18
19
  providers: [
19
20
  CreatePersonHandler,
@@ -3,10 +3,7 @@ import { ControllerModule } from './controller.module'
3
3
  import { PersonModule } from './person/person.module'
4
4
 
5
5
  @Module({
6
- imports: [
7
- ControllerModule,
8
- PersonModule,
9
- ],
6
+ imports: [ControllerModule, PersonModule],
10
7
  exports: [ControllerModule],
11
8
  })
12
9
  export class ControllersModule {}
@@ -16,70 +16,93 @@ describe(`CRUD OF PERSON`, () => {
16
16
  .post(PERSON_ROUTER_CONFIG.group)
17
17
  .send({
18
18
  name: 'John Doe',
19
- phones: []
19
+ phones: [],
20
+ address: {
21
+ address: 'Streat 1',
22
+ },
20
23
  })
21
-
24
+
22
25
  personId = response.body.id
23
26
 
24
27
  expect(response.statusCode).toBe(201)
25
28
  expect(response.body).toStrictEqual({
26
- id: expect.any(Number)
29
+ id: expect.any(Number),
27
30
  })
28
31
  })
29
32
 
30
33
  it('should get the created person', async () => {
31
- const response = await request(app.getHttpServer())
32
- .get(`${PERSON_ROUTER_CONFIG.group}/${personId}`)
33
-
34
+ const response = await request(app.getHttpServer()).get(
35
+ `${PERSON_ROUTER_CONFIG.group}/${personId}`,
36
+ )
37
+
34
38
  expect(response.statusCode).toBe(200)
35
39
  expect(response.body).toStrictEqual({
36
40
  id: personId,
37
41
  name: 'John Doe',
38
42
  phones: [],
39
- status: 'active'
43
+ address: {
44
+ id: 1,
45
+ address: 'Streat 1',
46
+ },
47
+ status: 'active',
40
48
  })
41
49
  })
42
50
 
43
51
  it('should get all persons', async () => {
44
- const response = await request(app.getHttpServer())
45
- .get(PERSON_ROUTER_CONFIG.group)
46
-
52
+ const response = await request(app.getHttpServer()).get(
53
+ PERSON_ROUTER_CONFIG.group,
54
+ )
55
+
47
56
  expect(response.statusCode).toBe(200)
48
57
  expect(response.body).toStrictEqual({
49
- items: [{
50
- id: personId,
51
- name: 'John Doe',
52
- phones: [],
53
- status: 'active'
54
- }],
55
- count: 1
58
+ items: [
59
+ {
60
+ id: personId,
61
+ name: 'John Doe',
62
+ phones: [],
63
+ address: {
64
+ id: 1,
65
+ address: 'Streat 1',
66
+ },
67
+ status: 'active',
68
+ },
69
+ ],
70
+ count: 1,
56
71
  })
57
72
  })
58
73
 
59
74
  it('should get all inactive persons', async () => {
60
- const response = await request(app.getHttpServer())
61
- .get(`${PERSON_ROUTER_CONFIG.group}?active=false`)
62
-
75
+ const response = await request(app.getHttpServer()).get(
76
+ `${PERSON_ROUTER_CONFIG.group}?active=false`,
77
+ )
78
+
63
79
  expect(response.statusCode).toBe(200)
64
80
  expect(response.body).toStrictEqual({
65
81
  items: [],
66
- count: 0
82
+ count: 0,
67
83
  })
68
84
  })
69
85
 
70
86
  it('should get persons by name', async () => {
71
- const response = await request(app.getHttpServer())
72
- .get(`${PERSON_ROUTER_CONFIG.group}?name=John`)
73
-
87
+ const response = await request(app.getHttpServer()).get(
88
+ `${PERSON_ROUTER_CONFIG.group}?name=John`,
89
+ )
90
+
74
91
  expect(response.statusCode).toBe(200)
75
92
  expect(response.body).toStrictEqual({
76
- items: [{
77
- id: personId,
78
- name: 'John Doe',
79
- phones: [],
80
- status: 'active'
81
- }],
82
- count: 1
93
+ items: [
94
+ {
95
+ id: personId,
96
+ name: 'John Doe',
97
+ phones: [],
98
+ address: {
99
+ id: 1,
100
+ address: 'Streat 1',
101
+ },
102
+ status: 'active',
103
+ },
104
+ ],
105
+ count: 1,
83
106
  })
84
107
  })
85
108
 
@@ -89,32 +112,43 @@ describe(`CRUD OF PERSON`, () => {
89
112
  .send({
90
113
  name: 'John Doe Updated',
91
114
  phones: [],
92
- status: 'active'
115
+ address: {
116
+ id: 1,
117
+ address: 'Streat 2',
118
+ },
119
+ status: 'active',
93
120
  })
94
-
121
+
95
122
  expect(updateResponse.statusCode).toBe(200)
96
123
 
97
- const response = await request(app.getHttpServer())
98
- .get(`${PERSON_ROUTER_CONFIG.group}/${personId}`)
99
-
124
+ const response = await request(app.getHttpServer()).get(
125
+ `${PERSON_ROUTER_CONFIG.group}/${personId}`,
126
+ )
127
+
100
128
  expect(response.body).toStrictEqual({
101
129
  id: personId,
102
130
  name: 'John Doe Updated',
103
131
  phones: [],
104
- status: 'active'
132
+ address: {
133
+ id: 1,
134
+ address: 'Streat 2',
135
+ },
136
+ status: 'active',
105
137
  })
106
138
  })
107
139
 
108
140
  it('should delete the created person', async () => {
109
- const deleteResponse = await request(app.getHttpServer())
110
- .delete(`${PERSON_ROUTER_CONFIG.group}/${personId}`)
111
-
141
+ const deleteResponse = await request(app.getHttpServer()).delete(
142
+ `${PERSON_ROUTER_CONFIG.group}/${personId}`,
143
+ )
144
+
112
145
  expect(deleteResponse).toBeTruthy()
113
146
  expect(deleteResponse.statusCode).toBe(204)
114
147
 
115
- const response = await request(app.getHttpServer())
116
- .get(`${PERSON_ROUTER_CONFIG.group}/${personId}`)
117
-
148
+ const response = await request(app.getHttpServer()).get(
149
+ `${PERSON_ROUTER_CONFIG.group}/${personId}`,
150
+ )
151
+
118
152
  expect(response.statusCode).toBe(404)
119
153
  })
120
- })
154
+ })
@@ -15,4 +15,11 @@ export class DbTransactionContext
15
15
  get personPhone(): Prisma.PersonPhoneDelegate<DefaultArgs> {
16
16
  return this.transactionalClient.personPhone
17
17
  }
18
+
19
+ get personAddress(): Prisma.PersonAddressDelegate<
20
+ DefaultArgs,
21
+ Prisma.PrismaClientOptions
22
+ > {
23
+ return this.transactionalClient.personAddress
24
+ }
18
25
  }
@@ -21,7 +21,10 @@ export class PersonRepository
21
21
  super({
22
22
  modelName: Person,
23
23
  context: prisma,
24
- include: { phones: true },
24
+ include: {
25
+ phones: true,
26
+ address: true,
27
+ },
25
28
  })
26
29
  }
27
30
 
@@ -4,14 +4,14 @@ import { KoalaAppTest } from '@koalarx/nest/test/koala-app-test'
4
4
  import { Test } from '@nestjs/testing'
5
5
 
6
6
  export async function createE2ETestApp() {
7
- return Test
8
- .createTestingModule({ imports: [AppModule] })
7
+ return Test.createTestingModule({ imports: [AppModule] })
9
8
  .compile()
10
9
  .then((moduleRef) => moduleRef.createNestApplication())
11
- .then((app) => new KoalaAppTest(app)
12
- .setDbTransactionContext(DbTransactionContext)
13
- .enableCors()
14
- .build()
10
+ .then((app) =>
11
+ new KoalaAppTest(app)
12
+ .setDbTransactionContext(DbTransactionContext)
13
+ .enableCors()
14
+ .build(),
15
15
  )
16
16
  .then((app) => app.init())
17
- }
17
+ }
@@ -13,12 +13,12 @@ export function createUnitTestApp() {
13
13
  const personRepository = new PersonRepository()
14
14
 
15
15
  return new KoalaAppTestDependencies({
16
- dependencies: [
16
+ dependencies: [
17
17
  new CreatePersonHandler(automapService, personRepository),
18
18
  new ReadPersonHandler(automapService, personRepository),
19
19
  new ReadManyPersonHandler(automapService, personRepository),
20
20
  new UpdatePersonHandler(automapService, personRepository),
21
- new DeletePersonHandler(personRepository)
22
- ]
21
+ new DeletePersonHandler(personRepository),
22
+ ],
23
23
  })
24
- }
24
+ }
@@ -1,8 +1,9 @@
1
- import { CreatePersonRequest } from "@/application/person/create/create-person.request";
2
- import { assignObject } from "@koalarx/nest/core/utils/assing-object";
3
- import { faker } from "@faker-js/faker";
1
+ import { CreatePersonRequest } from '@/application/person/create/create-person.request'
2
+ import { faker } from '@faker-js/faker'
3
+ import { assignObject } from '@koalarx/nest/core/utils/assing-object'
4
4
 
5
5
  export const createPersonRequestMockup = assignObject(CreatePersonRequest, {
6
6
  name: faker.person.fullName(),
7
- phones: [{phone: faker.phone.number()}]
8
- })
7
+ phones: [{ phone: faker.phone.number() }],
8
+ address: { address: faker.location.streetAddress() },
9
+ })
@@ -1,11 +1,14 @@
1
- import { ReadManyPersonDto } from "@/domain/dtos/read-many-person.dto";
2
- import { Person } from "@/domain/entities/person/person";
3
- import { IPersonRepository } from "@/domain/repositories/iperson.repository";
4
- import { CreatedRegistreResponseBase } from "@koalarx/nest/core/controllers/created-registre-response.base";
5
- import { ListResponseBase } from "@koalarx/nest/core/controllers/list-response.base";
6
- import { InMemoryBaseRepository } from "@koalarx/nest/test/repositories/in-memory-base.repository";
1
+ import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
2
+ import { Person } from '@/domain/entities/person/person'
3
+ import { IPersonRepository } from '@/domain/repositories/iperson.repository'
4
+ import { CreatedRegistreResponseBase } from '@koalarx/nest/core/controllers/created-registre-response.base'
5
+ import { ListResponseBase } from '@koalarx/nest/core/controllers/list-response.base'
6
+ import { InMemoryBaseRepository } from '@koalarx/nest/test/repositories/in-memory-base.repository'
7
7
 
8
- export class PersonRepository extends InMemoryBaseRepository<Person> implements IPersonRepository {
8
+ export class PersonRepository
9
+ extends InMemoryBaseRepository<Person>
10
+ implements IPersonRepository
11
+ {
9
12
  create(person: Person): Promise<CreatedRegistreResponseBase<number>> {
10
13
  return this.insert(person)
11
14
  }
@@ -19,13 +22,15 @@ export class PersonRepository extends InMemoryBaseRepository<Person> implements
19
22
  }
20
23
 
21
24
  readMany(query: ReadManyPersonDto): Promise<ListResponseBase<Person>> {
22
- return this.findManyAndCount<ReadManyPersonDto>(query, (person) =>
23
- (!query.name || person.name.includes(query.name)) &&
24
- (query.active === undefined || person.active === query.active)
25
+ return this.findManyAndCount<ReadManyPersonDto>(
26
+ query,
27
+ (person) =>
28
+ (!query.name || person.name.includes(query.name)) &&
29
+ (query.active === undefined || person.active === query.active),
25
30
  )
26
31
  }
27
32
 
28
33
  delete(id: number): Promise<void> {
29
34
  return this.remove((person) => person.id === id)
30
35
  }
31
- }
36
+ }
@@ -1,7 +1,7 @@
1
- import { createE2EDatabase } from '@koalarx/nest/test/utils/create-e2e-database';
2
- import { dropE2EDatabase } from '@koalarx/nest/test/utils/drop-e2e-database';
1
+ import { createE2EDatabase } from '@koalarx/nest/test/utils/create-e2e-database'
2
+ import { dropE2EDatabase } from '@koalarx/nest/test/utils/drop-e2e-database'
3
3
 
4
4
  let schemaId: string
5
5
 
6
- beforeAll(() => schemaId = createE2EDatabase(), 40000)
6
+ beforeAll(() => (schemaId = createE2EDatabase()), 40000)
7
7
  afterAll(async () => dropE2EDatabase(schemaId))
package/index.js CHANGED
@@ -30,7 +30,7 @@ var import_inquirer = __toESM(require("inquirer"));
30
30
  // package.json
31
31
  var package_default = {
32
32
  name: "@koalarx/nest-cli",
33
- version: "1.0.14",
33
+ version: "1.0.15",
34
34
  description: "Biblioteca de CLI para cria\xE7\xE3o de projetos utilizando Koala Nest",
35
35
  scripts: {
36
36
  test: "vitest run",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koalarx/nest-cli",
3
- "version": "1.0.14",
3
+ "version": "1.0.15",
4
4
  "description": "Biblioteca de CLI para criação de projetos utilizando Koala Nest",
5
5
  "scripts": {
6
6
  "test": "vitest run",
@@ -1,22 +0,0 @@
1
- import js from "@eslint/js";
2
- import { defineConfig } from "eslint/config";
3
- import globals from "globals";
4
- import tseslint from "typescript-eslint";
5
-
6
- export default defineConfig([
7
- { files: ["**/*.{js,mjs,cjs,ts}"] },
8
- { files: ["**/*.{js,mjs,cjs,ts}"], languageOptions: { globals: globals.node } },
9
- { files: ["**/*.{js,mjs,cjs,ts}"], plugins: { js }, extends: ["js/recommended"] },
10
- tseslint.configs.recommended,
11
- { ignores: ["node_modules", "dist"] },
12
- {
13
- rules: {
14
- "@typescript-eslint/ban-ts-comment": "off",
15
- "@typescript-eslint/no-unused-vars": "off",
16
- "@typescript-eslint/no-unsafe-function-type": "off",
17
- "@typescript-eslint/no-useless-constructor": "off",
18
- "@typescript-eslint/no-new": "off",
19
- "@typescript-eslint/no-explicit-any": "off"
20
- }
21
- }
22
- ]);
File without changes