-
-
Notifications
You must be signed in to change notification settings - Fork 38
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature/external application2 #186
base: main
Are you sure you want to change the base?
Changes from 18 commits
fd325b7
9cb2da0
4ec73c0
ebdf7d7
b3ad650
f2d2d2f
ae482a4
363a543
2bd0727
79fa4d3
e5857d4
dbea464
e382ed6
56d95c1
4461b13
9bfc59b
90507ab
9d48113
32efa36
c9009f8
00eee0b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,31 +1,98 @@ | ||
import { Controller, Get, Req, Res } from '@nestjs/common'; | ||
import { ApiOperation, ApiTags } from '@nestjs/swagger'; | ||
import { | ||
Controller, | ||
Get, | ||
Req, | ||
Res, | ||
Patch, | ||
Param, | ||
Body, | ||
HttpCode, | ||
UsePipes, | ||
ValidationPipe, | ||
} from '@nestjs/common'; | ||
import { ApiTags, ApiResponse, ApiParam, ApiBody } from '@nestjs/swagger'; | ||
import { AppService } from './app.service'; | ||
import { SwaggerHealthCheck } from './shared/Swagger/decorators/app/health-check.swagger.decorator'; | ||
|
||
import { Request, Response } from 'express'; | ||
import { UpdateStatusDto } from './modules/applications/dtos/update-status.dto'; | ||
import { CustomBadRequestException } from './modules/applications/exceptions/bad-request.exception'; | ||
import { CustomNotFoundException } from './modules/applications/exceptions/not-found.exception'; | ||
|
||
@ApiTags('Status') | ||
@Controller() | ||
export class AppController { | ||
constructor(private readonly appService: AppService) {} | ||
|
||
@Get() | ||
@ApiOperation({ | ||
summary: 'Show status of operation', | ||
@ApiResponse({ | ||
status: 200, | ||
description: 'Status of operation returned successfully.', | ||
}) | ||
getAppStatus(@Req() req: Request) { | ||
const baseUrl = req.protocol + '://' + req.get('host'); | ||
return this.appService.getAppStatus(baseUrl); | ||
const status = this.appService.getAppStatus(baseUrl); | ||
return { status: 'success', data: status }; | ||
} | ||
|
||
@Get('/health-check') | ||
@SwaggerHealthCheck() | ||
@ApiOperation({ | ||
summary: 'Retorna status dos serviços de email e banco de dados', | ||
@ApiResponse({ | ||
status: 200, | ||
description: | ||
'Health check status of email and database services returned successfully.', | ||
}) | ||
async getHealthCheck(@Res() res: Response) { | ||
const { status, data } = await this.appService.getHealthCheck(); | ||
return res.status(status).send({ status: 'success', data }); | ||
} | ||
|
||
@Patch(':userId/:applicationId') | ||
@HttpCode(200) | ||
@UsePipes(new ValidationPipe({ transform: true })) | ||
@ApiParam({ name: 'userId', required: true, description: 'ID do usuário' }) | ||
@ApiParam({ | ||
name: 'applicationId', | ||
required: true, | ||
description: 'ID da aplicação', | ||
}) | ||
@ApiBody({ type: UpdateStatusDto }) | ||
@ApiResponse({ | ||
status: 200, | ||
description: 'Status atualizado com sucesso.', | ||
}) | ||
@ApiResponse({ | ||
status: 400, | ||
description: 'Novo status é obrigatório.', | ||
}) | ||
async getHealthCheck(@Res() res: Response){ | ||
const {status, data} = await this.appService.getHealthCheck(); | ||
return res.status(status).send(data); | ||
@ApiResponse({ | ||
status: 404, | ||
description: 'Candidatura não encontrada ou não pertence ao usuário.', | ||
}) | ||
async updateStatus( | ||
@Param() params: UpdateStatusDto, | ||
@Body() body: UpdateStatusDto, | ||
) { | ||
const { userId, applicationId, status } = { ...params, ...body }; | ||
|
||
if (!status) { | ||
throw new CustomBadRequestException('Novo status é obrigatório'); | ||
} | ||
Comment on lines
+77
to
+79
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Melhore o tratamento de erro para status inválido A validação do status poderia ser feita no DTO usando o decorator export class UpdateStatusDto {
+ @IsEnum(ApplicationStatus, { message: 'Status inválido' })
status: ApplicationStatus;
}
|
||
|
||
const application = await this.appService.updateStatus( | ||
userId, | ||
applicationId, | ||
status, | ||
); | ||
|
||
if (!application) { | ||
throw new CustomNotFoundException( | ||
'Candidatura não encontrada ou não pertence ao usuário', | ||
); | ||
} | ||
|
||
return { | ||
status: 'success', | ||
data: { message: 'Status atualizado com sucesso', application }, | ||
}; | ||
} | ||
} |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Verifique se a resposta do getAppStatus é suficiente. getHealthCheck: Consulta eficiente seria verificar a conexão com o BD ou buscar um unico registro. Pq a consulta atual busca todos mas apenas verifica se o resultado é null ou indefinid. databaseStatus e mailerStatus: crie enums pra represetar os status "OK" e "DOWN", assim torna o código mais claro updateStatus: o user_id está sendo usado mas não está sendo validado. status: definir um enum Lançar exceções especificas quando não for encontrada candidatura ou até mesmo status for inválido. Verifique a possibilidade de criar serviços separados pra cada área, assim melhora a organização. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Olá, tentei fazer isso tudo, mas precisa de correção, principalmente na divisão de serviços e não fiz enums pra represetar os status "OK" e "DOWN", fiz diretamente no app pois achei que já tinha muit coisa separada. |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,70 +1,98 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Injectable } from '@nestjs/common'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { MailService } from './modules/mails/mail.service'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { UserRepository } from './modules/user/repository/user.repository'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { PageOptionsDto } from './shared/pagination'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Order } from './shared/pagination'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { PageOptionsDto, Order } from './shared/pagination'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { InjectRepository } from '@nestjs/typeorm'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ApplicationEntity, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ApplicationStatus, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} from './database/entities/applications.entity'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Repository } from 'typeorm'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { CustomBadRequestException } from './modules/applications/exceptions/bad-request.exception'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Injectable() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export class AppService { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
constructor( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private mailService: MailService, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private userRepository: UserRepository | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
){} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private userRepository: UserRepository, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@InjectRepository(ApplicationEntity) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private applicationRepository: Repository<ApplicationEntity>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
getAppStatus(baseUrl: string) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return `<div style=text-align:center><a target="_blank" href="https://www.linkedin.com/company/soujunior/"><svg font-family="Times New Roman" font-size="16" height="299.96" viewBox="0 0 854 300" width="854.56" xmlns="http://www.w3.org/2000/svg" style="width:854.56px; height:299.96px; font-family:'Times New Roman'; font-size:16px; position:relative; z-index:1" xmlns:xlink="http://www.w3.org/1999/xlink"><style>.text {font-size: 90px;font-weight: 700;font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;}.desc {font-size: 20px;font-weight: 500;font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;}.text, .desc {animation: fadeIn 1.2s ease-in-out forwards;}@keyframes fadeIn { from {opacity: 0; } to {opacity: 1; }};</style><g transform="translate(427, 150) scale(1, 1) translate(-427, -150)"><path d="" fill="#2088f2" opacity="0.4"><animate attributeName="d" begin="0s" calcmod="spline" dur="20s" keySplines="0.2 0 0.2 1;0.2 0 0.2 1;0.2 0 0.2 1" keyTimes="0;0.333;0.667;1" repeatCount="indefinite" values="M0 0L 0 220Q 213.5 260 427 230T 854 255L 854 0 Z;M0 0L 0 245Q 213.5 260 427 240T 854 230L 854 0 Z;M0 0L 0 265Q 213.5 235 427 265T 854 230L 854 0 Z;M0 0L 0 220Q 213.5 260 427 230T 854 255L 854 0 Z" /></path><path d="" fill="#2088f2" opacity="0.4"><animate attributeName="d" begin="-10s" calcmod="spline" dur="20s" keySplines="0.2 0 0.2 1;0.2 0 0.2 1;0.2 0 0.2 1" keyTimes="0;0.333;0.667;1" repeatCount="indefinite" values="M0 0L 0 235Q 213.5 280 427 250T 854 260L 854 0 Z;M0 0L 0 250Q 213.5 220 427 220T 854 240L 854 0 Z;M0 0L 0 245Q 213.5 225 427 250T 854 265L 854 0 Z;M0 0L 0 235Q 213.5 280 427 250T 854 260L 854 0 Z" /></path></g><text alignment-baseline="middle" class="text" stroke="#none" stroke-width="1" text-anchor="middle" x="50%" y="38%" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; font-size:90px; font-weight:700; alignment-baseline:middle; fill:#ffffff; stroke-width:1; text-anchor:middle">Sou Junior</text><text alignment-baseline="middle" class="desc" text-anchor="middle" x="52%" y="61%" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; font-size:20px; font-weight:500; alignment-baseline:middle; fill:#ffffff; text-anchor:middle">Projeto Opensource para melhorar o match entre os profissionais Juniors e Empresas!</text></svg></a></div>`; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async getHealthCheck(){ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async getHealthCheck() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const databaseStatus = await this.checkDatabase(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const mailerStatus = await this.checkEmail(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const data = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
databaseStatus, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mailerStatus | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mailerStatus, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
status: 201, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
data | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
data, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private async checkDatabase(){ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private async checkDatabase() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const options: PageOptionsDto = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
page: 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
take: 10, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
orderByColumn: 'id', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
order: Order.ASC | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
order: Order.ASC, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const allUsers = await this.userRepository.getAllUsers(options); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (allUsers == null || allUsers == undefined){ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "DOWN"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (allUsers == null || allUsers == undefined) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 'DOWN'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "OK"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
catch(error){ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "DOWN"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 'OK'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 'DOWN'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Otimize a verificação do banco de dados O método atual busca todos os usuários para verificar a saúde do banco de dados, o que pode ser ineficiente. Considere usar uma consulta mais leve. private async checkDatabase() {
try {
- const options: PageOptionsDto = {
- page: 1,
- take: 10,
- orderByColumn: 'id',
- order: Order.ASC,
- };
- const allUsers = await this.userRepository.getAllUsers(options);
+ const result = await this.userRepository
+ .createQueryBuilder()
+ .select('1')
+ .limit(1)
+ .getRawOne();
- if (allUsers == null || allUsers == undefined) {
+ if (!result) {
return 'DOWN';
}
return 'OK';
} catch (error) {
return 'DOWN';
}
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private async checkEmail(){ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private async checkEmail() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await this.mailService.sendMail({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
subject: 'HealthCheck', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template: './health', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
context: { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
arg1: "Argumento1", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
arg2: "Argumento2" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
arg1: 'Argumento1', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
arg2: 'Argumento2', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
email: '[email protected]' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
email: '[email protected]', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "OK"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 'OK'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 'DOWN'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
catch(error){ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "DOWN"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
async updateStatus( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
user_id: string, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
applicationId: string, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
status: string, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): Promise<ApplicationEntity | null> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const application = await this.applicationRepository.findOne({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
where: { id: applicationId, user_id }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!application) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const validStatus = Object.values(ApplicationStatus).includes( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
status as ApplicationStatus, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!validStatus) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new CustomBadRequestException('Status inválido'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
application.status = status as ApplicationStatus; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
await this.applicationRepository.save(application); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return application; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Verifique a separação das rotas.
Verifique no status, se precisa de enum.
Utilize decorators pra validar os parametros da rota.
Crie exceções personalizadas (tratamento de erros)
Verifique se o @ApiOperation não está sendo utilizada, utilize outra pra documentar melhor as rotas no swagger.
Padronize a respota pra seguir o mesmo formato das outras rotas, retornando assim o objeto como status e data.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Verifique a separação das rotas.
Feito!
Verifique no status, se precisa de enum.
IN_PROGRESS = 'em andamento',
CLOSED = 'encerrada',
NOT_INTERESTED = 'sem interesse',
Utilize decorators pra validar os parametros da rota.
Criado update-status.dto.ts
ءء
Crie exceções personalizadas (tratamento de erros)
Criados os arquivos de custom exception:
bad-request.exception.ts
not-found.exception.ts
Verifique se o @ApiOperation não está sendo utilizada, utilize outra pra documentar melhor as rotas no swagger.
Atualizado para utilizar os decorators:
e @ApiBody
Padronize a resposta pra seguir o mesmo formato das outras rotas, retornando assim o objeto como status e data.
Padronizado. Retornando um objeto com status e data.