From d5be803b5d1705c31de4b6e0f7e3d0acb4a7a04a Mon Sep 17 00:00:00 2001 From: Renick Date: Wed, 3 May 2023 20:09:58 -0300 Subject: [PATCH] =?UTF-8?q?cria=C3=A7=C3=A3o=20das=20classes=20de=20entida?= =?UTF-8?q?des,=20reposit=C3=B3rios=20e=20casos=20de=20uso;=20entidade=20u?= =?UTF-8?q?tilizada=20j=C3=A1=20existente:=20Raffle.entity;=20cria=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20um=20reposit=C3=B3rio=20para=20edi=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20rifa;=20cria=C3=A7=C3=A3o=20de=20um=20caso=20de=20uso?= =?UTF-8?q?=20para=20edi=C3=A7=C3=A3o=20de=20rifa;=20cria=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20um=20servi=C3=A7o=20para=20edi=C3=A7=C3=A3o=20de=20rifa;=20?= =?UTF-8?q?cria=C3=A7=C3=A3o=20de=20um=20controller=20para=20edi=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20rifa;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 8 +++- .prettierrc | 10 ++++- .../raffle/edit-raffle.repository.ts | 10 +++++ .../services/raffle/edit-raffle.service.ts | 29 ++++++++++++++ src/domain/errors/edit-raffle.error.ts | 6 +++ .../usecases/raffle/edit-raffle.usecase.ts | 18 +++++++++ src/domain/usecases/raffle/index.ts | 1 + .../raffle/edit-raffle.controller.ts | 19 ++++++++++ src/presenter/dtos/raffle/edit-raffle.dto.ts | 38 +++++++++++++++++++ 9 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 src/application/contracts/repositories/raffle/edit-raffle.repository.ts create mode 100644 src/application/services/raffle/edit-raffle.service.ts create mode 100644 src/domain/errors/edit-raffle.error.ts create mode 100644 src/domain/usecases/raffle/edit-raffle.usecase.ts create mode 100644 src/presenter/controllers/raffle/edit-raffle.controller.ts create mode 100644 src/presenter/dtos/raffle/edit-raffle.dto.ts diff --git a/.eslintrc.js b/.eslintrc.js index de08f29..c31048e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,6 +18,12 @@ module.exports = { '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-semi': 'off' + '@typescript-eslint/no-semi': 'off', + 'prettier/prettier': [ + 'error', + { + endOfLine: 'auto' + } + ] } } diff --git a/.prettierrc b/.prettierrc index aed9a9f..cfeee39 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,5 +2,11 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 120, - "semi": false -} \ No newline at end of file + "semi": false, + "prettier/prettier": [ + "error", + { + "endOfLine": "auto" + } + ] +} diff --git a/src/application/contracts/repositories/raffle/edit-raffle.repository.ts b/src/application/contracts/repositories/raffle/edit-raffle.repository.ts new file mode 100644 index 0000000..e6a6f4a --- /dev/null +++ b/src/application/contracts/repositories/raffle/edit-raffle.repository.ts @@ -0,0 +1,10 @@ +import { RaffleEntity } from '@/domain/entities' +import { EditRaffleUseCaseParams, EditRaffleUseCaseResult } from '@/domain/usecases/raffle/edit-raffle.usecase' + +export interface EditRaffleRepository { + updateRaffle: (id: string, data: EditRaffleUseCaseParams) => Promise +} + +export type EditRaffleRepositoryParams = EditRaffleUseCaseParams + +export type EditRaffleRepositoryResult = RaffleEntity | Error diff --git a/src/application/services/raffle/edit-raffle.service.ts b/src/application/services/raffle/edit-raffle.service.ts new file mode 100644 index 0000000..ad8c081 --- /dev/null +++ b/src/application/services/raffle/edit-raffle.service.ts @@ -0,0 +1,29 @@ +import { EditRaffleRepository } from '@/application/contracts/repositories/raffle/edit-raffle.repository' +import { EditRaffleError } from '@/domain/errors/edit-raffle.error' +import { EditRaffleUseCase, EditRaffleUseCaseParams, EditRaffleUseCaseResult } from '@/domain/usecases/raffle' +import { Inject, Injectable } from '@nestjs/common' + +@Injectable() +export class EditRaffleService implements EditRaffleUseCase { + constructor(@Inject('EditRaffleRepository') private readonly raffleRepository: EditRaffleRepository) {} + + public async execute(id: string, params: EditRaffleUseCaseParams): Promise { + try { + const raffle = await this.raffleRepository.updateRaffle(id, params) + + if (!raffle) { + return new EditRaffleError() + } + + const updatedRaffle = await this.raffleRepository.updateRaffle(id, params) + + if (updatedRaffle instanceof Error) { + return updatedRaffle + } + + return updatedRaffle + } catch (error) { + return new EditRaffleError() + } + } +} diff --git a/src/domain/errors/edit-raffle.error.ts b/src/domain/errors/edit-raffle.error.ts new file mode 100644 index 0000000..079c668 --- /dev/null +++ b/src/domain/errors/edit-raffle.error.ts @@ -0,0 +1,6 @@ +export class EditRaffleError extends Error { + constructor() { + super('Error edit Raffle') + this.name = 'EditRaffleError' + } +} diff --git a/src/domain/usecases/raffle/edit-raffle.usecase.ts b/src/domain/usecases/raffle/edit-raffle.usecase.ts new file mode 100644 index 0000000..7f01c65 --- /dev/null +++ b/src/domain/usecases/raffle/edit-raffle.usecase.ts @@ -0,0 +1,18 @@ +import { RaffleEntity } from '@/domain/entities' + +export interface EditRaffleUseCase { + execute(id: string, params: EditRaffleUseCaseParams): Promise +} + +export type EditRaffleUseCaseParams = { + providerUserId: string + title: string + priceProduct: number + amountNumber: number + priceNumber: number + drawDate: string + description?: string + winningNumber?: number +} + +export type EditRaffleUseCaseResult = RaffleEntity | Error diff --git a/src/domain/usecases/raffle/index.ts b/src/domain/usecases/raffle/index.ts index 6229729..fa3aea7 100644 --- a/src/domain/usecases/raffle/index.ts +++ b/src/domain/usecases/raffle/index.ts @@ -1 +1,2 @@ export * from './create-raffle.usecase' +export * from './edit-raffle.usecase' diff --git a/src/presenter/controllers/raffle/edit-raffle.controller.ts b/src/presenter/controllers/raffle/edit-raffle.controller.ts new file mode 100644 index 0000000..29ee195 --- /dev/null +++ b/src/presenter/controllers/raffle/edit-raffle.controller.ts @@ -0,0 +1,19 @@ +import { EditRaffleDto } from '@/presenter/dtos/raffle/edit-raffle.dto' +import { EditRaffleUseCase } from '@/domain/usecases/raffle/edit-raffle.usecase' +import { Body, Controller, Inject, Put, Res, Param } from '@nestjs/common' + +@Controller('raffles') +export class EditRaffleController { + constructor(@Inject('EditRaffleUseCase') private readonly editRaffleService: EditRaffleUseCase) {} + + @Put(':id') + async handle(@Body() body: EditRaffleDto, @Res() res: any, @Param('id') id: string): Promise { + const raffle = await this.editRaffleService.execute(id, body) + + if (raffle instanceof Error) { + return raffle.name === 'NotFoundError' ? res.status(404).json(raffle) : res.status(500).json(raffle) + } + + return res.status(200).json(raffle) + } +} diff --git a/src/presenter/dtos/raffle/edit-raffle.dto.ts b/src/presenter/dtos/raffle/edit-raffle.dto.ts new file mode 100644 index 0000000..46e164d --- /dev/null +++ b/src/presenter/dtos/raffle/edit-raffle.dto.ts @@ -0,0 +1,38 @@ +import { IsNotEmpty, IsNumber, IsOptional, IsString, Matches } from 'class-validator' + +export class EditRaffleDto { + @IsString() + @IsNotEmpty() + 'providerUserId': string + + @IsString() + @IsNotEmpty() + 'title': string + + @IsString() + @IsOptional() + 'description': string + + @IsNumber() + @IsNotEmpty() + 'amountNumber': number + + @IsNumber() + @IsOptional() + 'winningNumber': number + + @IsNumber() + @IsOptional() + 'priceProduct': number + + @IsNumber() + @IsNotEmpty() + 'priceNumber': number + + @IsString() + @IsNotEmpty() + @Matches(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/, { + message: "Date format must be 'YYYY-MM-DD HH:mm:ss'" + }) + 'drawDate': string +}