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 +}