@koalarx/nest-cli 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +43 -48
- package/package.json +11 -38
- package/src/commands/new-project/index.ts +99 -0
- package/src/commands/new-project/new-project.ts +91 -0
- package/{index.ts → src/index.ts} +12 -3
- package/templates/root-files-folders/.dockerignore +7 -0
- package/{code-base/startup-project → templates/root-files-folders}/.vscode/launch.json +7 -5
- package/templates/root-files-folders/.vscode/mcp.json +11 -0
- package/{code-base/startup-project → templates/root-files-folders}/.vscode/settings.json +23 -9
- package/{code-base/startup-project → templates/root-files-folders}/Dockerfile +3 -1
- package/templates/root-files-folders/README.md +33 -0
- package/templates/root-files-folders/bunfig.toml +10 -0
- package/templates/root-files-folders/nest-cli.json +35 -0
- package/{code-base/startup-project → templates/root-files-folders}/package.json +21 -19
- package/templates/root-files-folders/tsconfig.build.json +9 -0
- package/{code-base/startup-project → templates/root-files-folders}/tsconfig.json +8 -6
- package/templates/root-files-folders/tsconfig.prisma.json +16 -0
- package/tsconfig.json +14 -0
- package/LICENSE +0 -21
- package/code-base/startup-project/.eslintignore +0 -2
- package/code-base/startup-project/.eslintrc.js +0 -22
- package/code-base/startup-project/.swcrc +0 -23
- package/code-base/startup-project/LICENSE +0 -21
- package/code-base/startup-project/README.md +0 -5
- package/code-base/startup-project/nest-cli.json +0 -19
- package/code-base/startup-project/prisma/migrations/20250326220607_init/migration.sql +0 -32
- package/code-base/startup-project/prisma/migrations/migration_lock.toml +0 -3
- package/code-base/startup-project/prisma/schema.prisma +0 -39
- package/code-base/startup-project/prisma/scripts/fix-extensions.mjs +0 -31
- package/code-base/startup-project/prisma.config.ts +0 -8
- package/code-base/startup-project/src/application/mapping/mapping.profile.ts +0 -10
- package/code-base/startup-project/src/application/mapping/person.mapping.ts +0 -39
- package/code-base/startup-project/src/application/person/common/persist-person.request.ts +0 -28
- package/code-base/startup-project/src/application/person/create/create-person.handler.spec.ts +0 -22
- package/code-base/startup-project/src/application/person/create/create-person.handler.ts +0 -39
- package/code-base/startup-project/src/application/person/create/create-person.request.ts +0 -11
- package/code-base/startup-project/src/application/person/create/create-person.response.ts +0 -3
- package/code-base/startup-project/src/application/person/create/create-person.validator.ts +0 -19
- package/code-base/startup-project/src/application/person/create-person-job/create-person-job.ts +0 -58
- package/code-base/startup-project/src/application/person/delete/delete-person.handler.spec.ts +0 -24
- package/code-base/startup-project/src/application/person/delete/delete-person.handler.ts +0 -33
- package/code-base/startup-project/src/application/person/delete-inative-job/delete-inactive-job.ts +0 -49
- package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-event.ts +0 -3
- package/code-base/startup-project/src/application/person/events/inactive-person/inactive-person-handler.ts +0 -27
- package/code-base/startup-project/src/application/person/events/person-event.job.ts +0 -11
- package/code-base/startup-project/src/application/person/read/read-person.handler.spec.ts +0 -28
- package/code-base/startup-project/src/application/person/read/read-person.handler.ts +0 -37
- package/code-base/startup-project/src/application/person/read/read-person.response.ts +0 -44
- package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.spec.ts +0 -67
- package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.ts +0 -47
- package/code-base/startup-project/src/application/person/read-many/read-many-person.request.ts +0 -21
- package/code-base/startup-project/src/application/person/read-many/read-many-person.response.ts +0 -16
- package/code-base/startup-project/src/application/person/read-many/read-many.validator.ts +0 -16
- package/code-base/startup-project/src/application/person/update/update-person.handler.spec.ts +0 -47
- package/code-base/startup-project/src/application/person/update/update-person.handler.ts +0 -57
- package/code-base/startup-project/src/application/person/update/update-person.request.ts +0 -36
- package/code-base/startup-project/src/application/person/update/update-person.validator.ts +0 -21
- package/code-base/startup-project/src/core/env.ts +0 -6
- package/code-base/startup-project/src/domain/dtos/read-many-person.dto.ts +0 -16
- package/code-base/startup-project/src/domain/entities/person/person-address.ts +0 -12
- package/code-base/startup-project/src/domain/entities/person/person-phone.ts +0 -12
- package/code-base/startup-project/src/domain/entities/person/person.ts +0 -24
- package/code-base/startup-project/src/domain/repositories/iperson.repository.ts +0 -10
- package/code-base/startup-project/src/domain/services/.gitkeep +0 -0
- package/code-base/startup-project/src/host/app.module.ts +0 -19
- package/code-base/startup-project/src/host/controllers/controller.module.ts +0 -16
- package/code-base/startup-project/src/host/controllers/person/create-person.controller.ts +0 -30
- package/code-base/startup-project/src/host/controllers/person/delete-person.controller.ts +0 -22
- package/code-base/startup-project/src/host/controllers/person/person.controller.e2e-spec.ts +0 -158
- package/code-base/startup-project/src/host/controllers/person/person.module.ts +0 -37
- package/code-base/startup-project/src/host/controllers/person/read-many-person.controller.ts +0 -29
- package/code-base/startup-project/src/host/controllers/person/read-person.controller.ts +0 -26
- package/code-base/startup-project/src/host/controllers/person/router.config.ts +0 -9
- package/code-base/startup-project/src/host/controllers/person/update-person.controller.ts +0 -30
- package/code-base/startup-project/src/host/main.ts +0 -38
- package/code-base/startup-project/src/infra/database/db-transaction-context.ts +0 -25
- package/code-base/startup-project/src/infra/database/repositories/person.repository.ts +0 -54
- package/code-base/startup-project/src/infra/database/repositories/repositories.module.ts +0 -15
- package/code-base/startup-project/src/infra/infra.module.ts +0 -8
- package/code-base/startup-project/src/infra/services/.gitkeep +0 -0
- package/code-base/startup-project/src/test/create-e2e-test-app.ts +0 -27
- package/code-base/startup-project/src/test/create-unit-test-app.ts +0 -24
- package/code-base/startup-project/src/test/mockup/person/create-person-request.mockup.ts +0 -9
- package/code-base/startup-project/src/test/repositories/person.repository.ts +0 -36
- package/code-base/startup-project/src/test/setup-e2e.ts +0 -12
- package/code-base/startup-project/tsconfig.build-prisma.json +0 -21
- package/code-base/startup-project/tsconfig.build.json +0 -9
- package/commands/new-project/index.ts +0 -34
- package/index.js +0 -30715
- package/utils/copy-folder.ts +0 -25
- /package/{code-base → templates}/env/config.txt +0 -0
- /package/{code-base → templates}/gitignore/config.txt +0 -0
- /package/{code-base/startup-project → templates/root-files-folders}/.gitattributes +0 -0
- /package/{code-base/startup-project → templates/root-files-folders}/.vscode/tasks.json +0 -0
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { IPersonRepository } from '@/domain/repositories/iperson.repository'
|
|
2
|
-
import { ResourceNotFoundError } from '@koalarx/nest/core/errors/resource-not-found.error'
|
|
3
|
-
import { RequestHandlerBase } from '@koalarx/nest/core/request-overflow/request-handler.base'
|
|
4
|
-
import {
|
|
5
|
-
failure,
|
|
6
|
-
ok,
|
|
7
|
-
RequestResult,
|
|
8
|
-
} from '@koalarx/nest/core/request-overflow/request-result'
|
|
9
|
-
import { Injectable } from '@nestjs/common'
|
|
10
|
-
|
|
11
|
-
@Injectable()
|
|
12
|
-
export class DeletePersonHandler extends RequestHandlerBase<
|
|
13
|
-
number,
|
|
14
|
-
RequestResult<ResourceNotFoundError, null>
|
|
15
|
-
> {
|
|
16
|
-
constructor(private readonly repository: IPersonRepository) {
|
|
17
|
-
super()
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async handle(
|
|
21
|
-
id: number,
|
|
22
|
-
): Promise<RequestResult<ResourceNotFoundError, null>> {
|
|
23
|
-
const person = await this.repository.read(id)
|
|
24
|
-
|
|
25
|
-
if (!person) {
|
|
26
|
-
return failure(new ResourceNotFoundError('Pessoa'))
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
await this.repository.delete(id)
|
|
30
|
-
|
|
31
|
-
return ok(null)
|
|
32
|
-
}
|
|
33
|
-
}
|
package/code-base/startup-project/src/application/person/delete-inative-job/delete-inactive-job.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
|
|
2
|
-
import {
|
|
3
|
-
CronJobHandlerBase,
|
|
4
|
-
CronJobResponse,
|
|
5
|
-
CronJobSettings,
|
|
6
|
-
} from '@koalarx/nest/core/backgroud-services/cron-service/cron-job.handler.base'
|
|
7
|
-
import { ok } from '@koalarx/nest/core/request-overflow/request-result'
|
|
8
|
-
import { ILoggingService } from '@koalarx/nest/services/logging/ilogging.service'
|
|
9
|
-
import { IRedLockService } from '@koalarx/nest/services/redlock/ired-lock.service'
|
|
10
|
-
import { Injectable } from '@nestjs/common'
|
|
11
|
-
import { DeletePersonHandler } from '../delete/delete-person.handler'
|
|
12
|
-
import { ReadManyPersonHandler } from '../read-many/read-many-person.handler'
|
|
13
|
-
|
|
14
|
-
@Injectable()
|
|
15
|
-
export class DeleteInactiveJob extends CronJobHandlerBase {
|
|
16
|
-
constructor(
|
|
17
|
-
redlockService: IRedLockService,
|
|
18
|
-
loggingService: ILoggingService,
|
|
19
|
-
private readonly readManyPerson: ReadManyPersonHandler,
|
|
20
|
-
private readonly deletePerson: DeletePersonHandler,
|
|
21
|
-
) {
|
|
22
|
-
super(redlockService, loggingService)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
protected async settings(): Promise<CronJobSettings> {
|
|
26
|
-
return {
|
|
27
|
-
isActive: true,
|
|
28
|
-
timeInMinutes: 1,
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
protected async run(): Promise<CronJobResponse> {
|
|
33
|
-
const result = await this.readManyPerson.handle(
|
|
34
|
-
new ReadManyPersonDto({ active: false }),
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
if (result.isOk()) {
|
|
38
|
-
for (const person of result.value.items) {
|
|
39
|
-
await this.deletePerson.handle(person.id)
|
|
40
|
-
|
|
41
|
-
console.log('Person with id was deleted:', person.id)
|
|
42
|
-
}
|
|
43
|
-
} else {
|
|
44
|
-
console.error('Error to search inactive people:', result.value)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return ok(null)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { ReadManyPersonDto } from '@/domain/dtos/read-many-person.dto'
|
|
2
|
-
import { IPersonRepository } from '@/domain/repositories/iperson.repository'
|
|
3
|
-
import { EventHandlerBase } from '@koalarx/nest/core/backgroud-services/event-service/event-handler.base'
|
|
4
|
-
import { Injectable } from '@nestjs/common'
|
|
5
|
-
import { InactivePersonEvent } from './inactive-person-event'
|
|
6
|
-
|
|
7
|
-
@Injectable()
|
|
8
|
-
export class InactivePersonHandler extends EventHandlerBase {
|
|
9
|
-
constructor(private readonly repository: IPersonRepository) {
|
|
10
|
-
super(InactivePersonEvent)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
async handleEvent(): Promise<void> {
|
|
14
|
-
const result = await this.repository.readMany(
|
|
15
|
-
new ReadManyPersonDto({ active: true }),
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
for (const person of result.items) {
|
|
19
|
-
person.active = false
|
|
20
|
-
await this.repository.save(person)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
console.log(
|
|
24
|
-
'InactivePersonHandler: Registros ativos inativados com sucesso!',
|
|
25
|
-
)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Person } from '@/domain/entities/person/person'
|
|
2
|
-
import { EventHandlerBase } from '@koalarx/nest/core/backgroud-services/event-service/event-handler.base'
|
|
3
|
-
import { EventJob } from '@koalarx/nest/core/backgroud-services/event-service/event-job'
|
|
4
|
-
import { Type } from '@nestjs/common'
|
|
5
|
-
import { InactivePersonHandler } from './inactive-person/inactive-person-handler'
|
|
6
|
-
|
|
7
|
-
export class PersonEventJob extends EventJob<Person> {
|
|
8
|
-
defineHandlers(): Type<EventHandlerBase>[] {
|
|
9
|
-
return [InactivePersonHandler]
|
|
10
|
-
}
|
|
11
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
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
|
-
|
|
6
|
-
describe('ReadPersonHandler', () => {
|
|
7
|
-
const app = createUnitTestApp()
|
|
8
|
-
|
|
9
|
-
it('should get a person by id', async () => {
|
|
10
|
-
const createResult = await app
|
|
11
|
-
.get(CreatePersonHandler)
|
|
12
|
-
.handle(createPersonRequestMockup)
|
|
13
|
-
|
|
14
|
-
expect(createResult.isOk()).toBeTruthy()
|
|
15
|
-
|
|
16
|
-
if (createResult.isOk()) {
|
|
17
|
-
const result = await app
|
|
18
|
-
.get(ReadPersonHandler)
|
|
19
|
-
.handle(createResult.value.id)
|
|
20
|
-
|
|
21
|
-
expect(result.isOk()).toBeTruthy()
|
|
22
|
-
|
|
23
|
-
if (result.isOk()) {
|
|
24
|
-
expect(result.value.id).toBe(createResult.value.id)
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
-
})
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Person } from '@/domain/entities/person/person'
|
|
2
|
-
import { IPersonRepository } from '@/domain/repositories/iperson.repository'
|
|
3
|
-
import { ResourceNotFoundError } from '@koalarx/nest/core/errors/resource-not-found.error'
|
|
4
|
-
import { AutoMappingService } from '@koalarx/nest/core/mapping/auto-mapping.service'
|
|
5
|
-
import { RequestHandlerBase } from '@koalarx/nest/core/request-overflow/request-handler.base'
|
|
6
|
-
import {
|
|
7
|
-
failure,
|
|
8
|
-
ok,
|
|
9
|
-
RequestResult,
|
|
10
|
-
} from '@koalarx/nest/core/request-overflow/request-result'
|
|
11
|
-
import { Injectable } from '@nestjs/common'
|
|
12
|
-
import { ReadPersonResponse } from './read-person.response'
|
|
13
|
-
|
|
14
|
-
@Injectable()
|
|
15
|
-
export class ReadPersonHandler extends RequestHandlerBase<
|
|
16
|
-
number,
|
|
17
|
-
RequestResult<ResourceNotFoundError, ReadPersonResponse>
|
|
18
|
-
> {
|
|
19
|
-
constructor(
|
|
20
|
-
private readonly mapper: AutoMappingService,
|
|
21
|
-
private readonly repository: IPersonRepository,
|
|
22
|
-
) {
|
|
23
|
-
super()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async handle(
|
|
27
|
-
id: number,
|
|
28
|
-
): Promise<RequestResult<ResourceNotFoundError, ReadPersonResponse>> {
|
|
29
|
-
const person = await this.repository.read(id)
|
|
30
|
-
|
|
31
|
-
if (!person) {
|
|
32
|
-
return failure(new ResourceNotFoundError('Pessoa'))
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return ok(this.mapper.map(person, Person, ReadPersonResponse))
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
2
|
-
import { ApiProperty } from '@nestjs/swagger'
|
|
3
|
-
|
|
4
|
-
export class ReadPersonAddressResponse {
|
|
5
|
-
@ApiProperty()
|
|
6
|
-
@AutoMap()
|
|
7
|
-
id: number
|
|
8
|
-
|
|
9
|
-
@ApiProperty({ example: 'Street 1' })
|
|
10
|
-
@AutoMap()
|
|
11
|
-
address: string
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export class ReadPersonPhoneResponse {
|
|
15
|
-
@ApiProperty()
|
|
16
|
-
@AutoMap()
|
|
17
|
-
id: number
|
|
18
|
-
|
|
19
|
-
@ApiProperty({ example: '22999999999' })
|
|
20
|
-
@AutoMap()
|
|
21
|
-
phone: string
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export class ReadPersonResponse {
|
|
25
|
-
@ApiProperty()
|
|
26
|
-
@AutoMap()
|
|
27
|
-
id: number
|
|
28
|
-
|
|
29
|
-
@ApiProperty({ example: 'John Doe' })
|
|
30
|
-
@AutoMap()
|
|
31
|
-
name: string
|
|
32
|
-
|
|
33
|
-
@ApiProperty({ type: [ReadPersonPhoneResponse] })
|
|
34
|
-
@AutoMap({ type: ReadPersonPhoneResponse, isArray: true })
|
|
35
|
-
phones: Array<ReadPersonPhoneResponse>
|
|
36
|
-
|
|
37
|
-
@ApiProperty({ type: ReadPersonAddressResponse })
|
|
38
|
-
@AutoMap({ type: ReadPersonAddressResponse })
|
|
39
|
-
address: ReadPersonAddressResponse
|
|
40
|
-
|
|
41
|
-
@ApiProperty()
|
|
42
|
-
@AutoMap()
|
|
43
|
-
active: boolean
|
|
44
|
-
}
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.spec.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
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
|
-
|
|
9
|
-
describe('ReadManyPersonHandler', () => {
|
|
10
|
-
const app = createUnitTestApp()
|
|
11
|
-
const person = createPersonRequestMockup
|
|
12
|
-
|
|
13
|
-
let personId: number
|
|
14
|
-
let createResult: RequestResult<Error, CreatePersonResponse>
|
|
15
|
-
|
|
16
|
-
beforeAll(async () => {
|
|
17
|
-
createResult = await app
|
|
18
|
-
.get(CreatePersonHandler)
|
|
19
|
-
.handle(createPersonRequestMockup)
|
|
20
|
-
|
|
21
|
-
expect(createResult.isOk()).toBeTruthy()
|
|
22
|
-
|
|
23
|
-
if (createResult.isOk()) {
|
|
24
|
-
personId = createResult.value.id
|
|
25
|
-
}
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('should get all persons', async () => {
|
|
29
|
-
const result = await app
|
|
30
|
-
.get(ReadManyPersonHandler)
|
|
31
|
-
.handle(new ReadManyPersonRequest())
|
|
32
|
-
|
|
33
|
-
expect(result.isOk()).toBeTruthy()
|
|
34
|
-
|
|
35
|
-
if (result.isOk()) {
|
|
36
|
-
expect(result.value.items).toHaveLength(1)
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it('should get persons by name', async () => {
|
|
41
|
-
const result = await app.get(ReadManyPersonHandler).handle(
|
|
42
|
-
new ReadManyPersonRequest({
|
|
43
|
-
name: person.name,
|
|
44
|
-
}),
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
expect(result.isOk()).toBeTruthy()
|
|
48
|
-
|
|
49
|
-
if (result.isOk()) {
|
|
50
|
-
expect(result.value.items[0].name).toBe(person.name)
|
|
51
|
-
expect(result.value.items).toHaveLength(1)
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('should get persons by status', async () => {
|
|
56
|
-
const result = await app.get(ReadManyPersonHandler).handle(
|
|
57
|
-
new ReadManyPersonRequest({
|
|
58
|
-
active: true,
|
|
59
|
-
}),
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
expect(result.value).toEqual({
|
|
63
|
-
items: [],
|
|
64
|
-
count: 0,
|
|
65
|
-
})
|
|
66
|
-
})
|
|
67
|
-
})
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.handler.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
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 { ResourceNotFoundError } from '@koalarx/nest/core/errors/resource-not-found.error'
|
|
5
|
-
import { AutoMappingService } from '@koalarx/nest/core/mapping/auto-mapping.service'
|
|
6
|
-
import { RequestHandlerBase } from '@koalarx/nest/core/request-overflow/request-handler.base'
|
|
7
|
-
import {
|
|
8
|
-
ok,
|
|
9
|
-
RequestResult,
|
|
10
|
-
} from '@koalarx/nest/core/request-overflow/request-result'
|
|
11
|
-
import { Injectable } from '@nestjs/common'
|
|
12
|
-
import { ReadPersonResponse } from '../read/read-person.response'
|
|
13
|
-
import { ReadManyPersonRequest } from './read-many-person.request'
|
|
14
|
-
import { ReadManyPersonResponse } from './read-many-person.response'
|
|
15
|
-
import { ReadManyPersonValidator } from './read-many.validator'
|
|
16
|
-
|
|
17
|
-
@Injectable()
|
|
18
|
-
export class ReadManyPersonHandler extends RequestHandlerBase<
|
|
19
|
-
ReadManyPersonRequest,
|
|
20
|
-
RequestResult<ResourceNotFoundError, ReadManyPersonResponse>
|
|
21
|
-
> {
|
|
22
|
-
constructor(
|
|
23
|
-
private readonly mapper: AutoMappingService,
|
|
24
|
-
private readonly repository: IPersonRepository,
|
|
25
|
-
) {
|
|
26
|
-
super()
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async handle(
|
|
30
|
-
query: ReadManyPersonRequest,
|
|
31
|
-
): Promise<RequestResult<ResourceNotFoundError, ReadManyPersonResponse>> {
|
|
32
|
-
const listOfPerson = await this.repository.readMany(
|
|
33
|
-
this.mapper.map(
|
|
34
|
-
new ReadManyPersonValidator(query).validate(),
|
|
35
|
-
ReadManyPersonRequest,
|
|
36
|
-
ReadManyPersonDto,
|
|
37
|
-
),
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
return ok({
|
|
41
|
-
...listOfPerson,
|
|
42
|
-
items: listOfPerson.items.map((person) =>
|
|
43
|
-
this.mapper.map(person, Person, ReadPersonResponse),
|
|
44
|
-
),
|
|
45
|
-
})
|
|
46
|
-
}
|
|
47
|
-
}
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.request.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
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'
|
|
6
|
-
import { ApiProperty } from '@nestjs/swagger'
|
|
7
|
-
|
|
8
|
-
export class ReadManyPersonRequest extends PaginationRequest {
|
|
9
|
-
@ApiProperty({ required: false })
|
|
10
|
-
@AutoMap()
|
|
11
|
-
name?: string
|
|
12
|
-
|
|
13
|
-
@ApiProperty({ required: false })
|
|
14
|
-
@AutoMap()
|
|
15
|
-
active?: boolean
|
|
16
|
-
|
|
17
|
-
constructor(props?: PaginatedRequestProps<ReadManyPersonRequest>) {
|
|
18
|
-
super()
|
|
19
|
-
Object.assign(this, props)
|
|
20
|
-
}
|
|
21
|
-
}
|
package/code-base/startup-project/src/application/person/read-many/read-many-person.response.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ListResponse } from '@koalarx/nest/core'
|
|
2
|
-
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
3
|
-
import { ApiProperty } from '@nestjs/swagger'
|
|
4
|
-
import { ReadPersonResponse } from '../read/read-person.response'
|
|
5
|
-
|
|
6
|
-
export class ReadManyPersonResponse
|
|
7
|
-
implements ListResponse<ReadPersonResponse>
|
|
8
|
-
{
|
|
9
|
-
@ApiProperty({ type: [ReadPersonResponse] })
|
|
10
|
-
@AutoMap()
|
|
11
|
-
items: ReadPersonResponse[]
|
|
12
|
-
|
|
13
|
-
@ApiProperty()
|
|
14
|
-
@AutoMap()
|
|
15
|
-
count: number
|
|
16
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { booleanSchema } from '@koalarx/nest/core/controllers/schemas/boolean.schema'
|
|
2
|
-
import { LIST_QUERY_SCHEMA } from '@koalarx/nest/core/controllers/schemas/list-query.schema'
|
|
3
|
-
import { RequestValidatorBase } from '@koalarx/nest/core/request-overflow/request-validator.base'
|
|
4
|
-
import { z, ZodType, ZodTypeDef } from 'zod'
|
|
5
|
-
import { ReadManyPersonRequest } from './read-many-person.request'
|
|
6
|
-
|
|
7
|
-
export class ReadManyPersonValidator extends RequestValidatorBase<ReadManyPersonRequest> {
|
|
8
|
-
protected get schema(): ZodType<any, ZodTypeDef, any> {
|
|
9
|
-
return LIST_QUERY_SCHEMA.merge(
|
|
10
|
-
z.object({
|
|
11
|
-
name: z.string().optional().nullable(),
|
|
12
|
-
active: booleanSchema().optional().nullable(),
|
|
13
|
-
}),
|
|
14
|
-
)
|
|
15
|
-
}
|
|
16
|
-
}
|
package/code-base/startup-project/src/application/person/update/update-person.handler.spec.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
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
|
-
|
|
7
|
-
describe('UpdatePersonHandler', () => {
|
|
8
|
-
const app = createUnitTestApp()
|
|
9
|
-
|
|
10
|
-
it('should update a person by id', async () => {
|
|
11
|
-
const person = createPersonRequestMockup
|
|
12
|
-
const createResult = await app
|
|
13
|
-
.get(CreatePersonHandler)
|
|
14
|
-
.handle(createPersonRequestMockup)
|
|
15
|
-
|
|
16
|
-
expect(createResult.isOk()).toBeTruthy()
|
|
17
|
-
|
|
18
|
-
if (createResult.isOk()) {
|
|
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
|
-
|
|
31
|
-
expect(updateResult.isOk()).toBeTruthy()
|
|
32
|
-
|
|
33
|
-
const result = await app
|
|
34
|
-
.get(ReadPersonHandler)
|
|
35
|
-
.handle(createResult.value.id)
|
|
36
|
-
|
|
37
|
-
expect(result.isOk()).toBeTruthy()
|
|
38
|
-
|
|
39
|
-
if (result.isOk()) {
|
|
40
|
-
expect(result.value.name).toEqual(person.name)
|
|
41
|
-
expect(result.value.active).toEqual(true)
|
|
42
|
-
expect(result.value.address.address).toEqual(person.address.address)
|
|
43
|
-
expect(result.value.phones[0].phone).toEqual(person.phones[0].phone)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
})
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Person } from '@/domain/entities/person/person'
|
|
2
|
-
import { IPersonRepository } from '@/domain/repositories/iperson.repository'
|
|
3
|
-
import { ResourceNotFoundError } from '@koalarx/nest/core/errors/resource-not-found.error'
|
|
4
|
-
import { AutoMappingService } from '@koalarx/nest/core/mapping/auto-mapping.service'
|
|
5
|
-
import { RequestHandlerBase } from '@koalarx/nest/core/request-overflow/request-handler.base'
|
|
6
|
-
import {
|
|
7
|
-
failure,
|
|
8
|
-
ok,
|
|
9
|
-
RequestResult,
|
|
10
|
-
} from '@koalarx/nest/core/request-overflow/request-result'
|
|
11
|
-
import { Injectable } from '@nestjs/common'
|
|
12
|
-
import { UpdatePersonRequest } from './update-person.request'
|
|
13
|
-
import { UpdatePersonValidator } from './update-person.validator'
|
|
14
|
-
|
|
15
|
-
type UpdatePersonHandleRequest = {
|
|
16
|
-
id: number
|
|
17
|
-
data: UpdatePersonRequest
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
@Injectable()
|
|
21
|
-
export class UpdatePersonHandler extends RequestHandlerBase<
|
|
22
|
-
UpdatePersonHandleRequest,
|
|
23
|
-
RequestResult<ResourceNotFoundError, null>
|
|
24
|
-
> {
|
|
25
|
-
constructor(
|
|
26
|
-
private readonly mapper: AutoMappingService,
|
|
27
|
-
private readonly repository: IPersonRepository,
|
|
28
|
-
) {
|
|
29
|
-
super()
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async handle({
|
|
33
|
-
id,
|
|
34
|
-
data,
|
|
35
|
-
}: UpdatePersonHandleRequest): Promise<RequestResult<Error, null>> {
|
|
36
|
-
const personInBd = await this.repository.read(id)
|
|
37
|
-
|
|
38
|
-
if (!personInBd) {
|
|
39
|
-
return failure(new ResourceNotFoundError('Person'))
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const person = this.mapper.map(
|
|
43
|
-
new UpdatePersonValidator(data).validate(),
|
|
44
|
-
UpdatePersonRequest,
|
|
45
|
-
Person,
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
personInBd.name = person.name
|
|
49
|
-
personInBd.active = person.active
|
|
50
|
-
personInBd.address.address = person.address.address
|
|
51
|
-
personInBd.phones.update(person.phones.toArray())
|
|
52
|
-
|
|
53
|
-
await this.repository.save(personInBd)
|
|
54
|
-
|
|
55
|
-
return ok(null)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
2
|
-
import { ApiProperty } from '@nestjs/swagger'
|
|
3
|
-
import {
|
|
4
|
-
PersistPersonAddressRequest,
|
|
5
|
-
PersistPersonPhoneRequest,
|
|
6
|
-
} from '../common/persist-person.request'
|
|
7
|
-
|
|
8
|
-
export class UpdatePersonAddressRequest extends PersistPersonAddressRequest {
|
|
9
|
-
@ApiProperty()
|
|
10
|
-
@AutoMap()
|
|
11
|
-
id: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export class UpdatePersonPhoneRequest extends PersistPersonPhoneRequest {
|
|
15
|
-
@ApiProperty({ required: false })
|
|
16
|
-
@AutoMap()
|
|
17
|
-
id?: number
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class UpdatePersonRequest {
|
|
21
|
-
@ApiProperty({ example: 'Mark Willians' })
|
|
22
|
-
@AutoMap()
|
|
23
|
-
name: string
|
|
24
|
-
|
|
25
|
-
@ApiProperty({ example: false })
|
|
26
|
-
@AutoMap()
|
|
27
|
-
active: boolean
|
|
28
|
-
|
|
29
|
-
@ApiProperty({ type: [UpdatePersonPhoneRequest] })
|
|
30
|
-
@AutoMap({ type: UpdatePersonPhoneRequest, isArray: true })
|
|
31
|
-
phones: Array<UpdatePersonPhoneRequest>
|
|
32
|
-
|
|
33
|
-
@ApiProperty({ type: UpdatePersonAddressRequest })
|
|
34
|
-
@AutoMap({ type: UpdatePersonAddressRequest })
|
|
35
|
-
address: UpdatePersonAddressRequest
|
|
36
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { RequestValidatorBase } from '@koalarx/nest/core/request-overflow/request-validator.base'
|
|
2
|
-
import { z, ZodType, ZodTypeDef } from 'zod'
|
|
3
|
-
import { UpdatePersonRequest } from './update-person.request'
|
|
4
|
-
|
|
5
|
-
export class UpdatePersonValidator extends RequestValidatorBase<UpdatePersonRequest> {
|
|
6
|
-
protected get schema(): ZodType<any, ZodTypeDef, any> {
|
|
7
|
-
return z.object({
|
|
8
|
-
name: z.string(),
|
|
9
|
-
phones: z.array(
|
|
10
|
-
z.object({
|
|
11
|
-
id: z.number().nullable().optional(),
|
|
12
|
-
phone: z.string(),
|
|
13
|
-
}),
|
|
14
|
-
),
|
|
15
|
-
address: z.object({
|
|
16
|
-
id: z.number(),
|
|
17
|
-
address: z.string(),
|
|
18
|
-
}),
|
|
19
|
-
})
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { PaginatedRequestProps } from '@koalarx/nest/core/controllers/pagination.request'
|
|
2
|
-
import { PaginationDto } from '@koalarx/nest/core/dtos/pagination.dto'
|
|
3
|
-
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
4
|
-
|
|
5
|
-
export class ReadManyPersonDto extends PaginationDto {
|
|
6
|
-
@AutoMap()
|
|
7
|
-
name?: string
|
|
8
|
-
|
|
9
|
-
@AutoMap()
|
|
10
|
-
active?: boolean
|
|
11
|
-
|
|
12
|
-
constructor(props?: PaginatedRequestProps<ReadManyPersonDto>) {
|
|
13
|
-
super()
|
|
14
|
-
Object.assign(this, props)
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { EntityBase } from '@koalarx/nest/core/database/entity.base'
|
|
2
|
-
import { Entity } from '@koalarx/nest/core/database/entity.decorator'
|
|
3
|
-
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
4
|
-
|
|
5
|
-
@Entity()
|
|
6
|
-
export class PersonAddress extends EntityBase<PersonAddress> {
|
|
7
|
-
@AutoMap()
|
|
8
|
-
id: number
|
|
9
|
-
|
|
10
|
-
@AutoMap()
|
|
11
|
-
address: string
|
|
12
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { EntityBase } from '@koalarx/nest/core/database/entity.base'
|
|
2
|
-
import { Entity } from '@koalarx/nest/core/database/entity.decorator'
|
|
3
|
-
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
4
|
-
|
|
5
|
-
@Entity()
|
|
6
|
-
export class PersonPhone extends EntityBase<PersonPhone> {
|
|
7
|
-
@AutoMap()
|
|
8
|
-
id: number
|
|
9
|
-
|
|
10
|
-
@AutoMap()
|
|
11
|
-
phone: string
|
|
12
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { EntityBase } from '@koalarx/nest/core/database/entity.base'
|
|
2
|
-
import { Entity } from '@koalarx/nest/core/database/entity.decorator'
|
|
3
|
-
import { AutoMap } from '@koalarx/nest/core/mapping/auto-mapping.decorator'
|
|
4
|
-
import { List } from '@koalarx/nest/core/utils/list'
|
|
5
|
-
import { PersonAddress } from './person-address'
|
|
6
|
-
import { PersonPhone } from './person-phone'
|
|
7
|
-
|
|
8
|
-
@Entity()
|
|
9
|
-
export class Person extends EntityBase<Person> {
|
|
10
|
-
@AutoMap()
|
|
11
|
-
id: number
|
|
12
|
-
|
|
13
|
-
@AutoMap()
|
|
14
|
-
name: string
|
|
15
|
-
|
|
16
|
-
@AutoMap({ type: List })
|
|
17
|
-
phones = new List(PersonPhone)
|
|
18
|
-
|
|
19
|
-
@AutoMap({ type: PersonAddress })
|
|
20
|
-
address: PersonAddress
|
|
21
|
-
|
|
22
|
-
@AutoMap()
|
|
23
|
-
active: boolean
|
|
24
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { ListResponseBase } from '@koalarx/nest/core/controllers/list-response.base'
|
|
2
|
-
import { ReadManyPersonDto } from '../dtos/read-many-person.dto'
|
|
3
|
-
import { Person } from '../entities/person/person'
|
|
4
|
-
|
|
5
|
-
export abstract class IPersonRepository {
|
|
6
|
-
abstract save(person: Person): Promise<any>
|
|
7
|
-
abstract read(id: number): Promise<Person | null>
|
|
8
|
-
abstract readMany(query: ReadManyPersonDto): Promise<ListResponseBase<Person>>
|
|
9
|
-
abstract delete(id: number): Promise<void>
|
|
10
|
-
}
|
|
File without changes
|