Skip to content
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

feat: preparando o review #17

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open

feat: preparando o review #17

wants to merge 1 commit into from

Conversation

driven-tutores
Copy link

Fala ai, beleza?
Só avisando que esse é o PR do feedback de código desse projeto.
Por favor, não fecha nem recuse esse pull request até a gente liberar o restante dos comentários, combinado?
Fica no aguardo que em breve mostro os principais pontos de melhoria no seu código.

Copy link
Author

@driven-tutores driven-tutores left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fala ai Carlos, Galdino passando aqui pra mandar mais um review de código.
Gostei bastante da execução do seu projeto, você aplicou bem os conceitos de interface e fez e usou bem a tipagem do typescript, parabéns!


return res.status(httpStatusCode.OK).send(question);
} catch (error) {
if (error instanceof Invalid) return res.status(httpStatusCode.BAD_REQUEST).send(error.message);
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ao invés de fazer essa série de ifs seria mais fácil definir o código de erro dentro do construtor da classe de erro, dessa forma você poderia facilmente ler e retornar esse código de erro como resposta da requisição.
O interessante de fazer dessa forma é que evitamos criar um novo if sempre que um novo tipo de erro customizado for adicionado, lembra que o código tem que permitir que seja fácil expandir e melhorar o projeto.

// na classe
class Invalid extends Error {
  constructor(message?: string) {
    super(message);
    this.name = 'UnauthorizedError';
    this.statusCode = httpStatusCode.BAD_REQUEST;
  }
}


// no bloco catch
if('statusCode' in t){     // checando se o erro tem statusCode, pra saber se é um erro customizado 
  return res.status(err.statusCode).send(err.message);
}
return next();

Outra dica, você poderia levar esse ifo que checa se o erro é um erro customizado lá pra sua middleware, dessa forma você não precisa repetir esse if em todos os blocos try/catch da sua aplicação.

Comment on lines -58 to -87
export async function postQuestionAnswer(req: RequestAuthentication, res: Response, next: NextFunction) {
try {
const questionId = Number(req.params.id);

if (!Number.isInteger(questionId) || questionId < 1) {
throw new Invalid('Invalid Question Id');
}

const { error: invalidBody } = createAnswerSchema.validate(req.body);
if (invalidBody) {
throw new Invalid(invalidBody.message);
}

const answer: Answer = {
userId: req.userId,
questionId,
answer: req.body.answer,
};

const answerId = await questionsService.createAnswer(answer);

return res.status(httpStatusCode.CREATED).send({
message: `Successfully Answered - Answer Id: ${answerId}.`,
});
} catch (error) {
if (error instanceof Invalid) return res.status(httpStatusCode.BAD_REQUEST).send(error.message);
if (error instanceof NotFound) return res.status(httpStatusCode.NOT_FOUND).send(error.message);
return next();
}
}
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Essas controllers estão ficando um pouco grandes. Acho que você poderia criar um service se validação pra extrair parte dessa lógica, tirando aqueles dois ifs do começo e deixando a controller mais simples.
A recomendação é que a controller seja o mais simples e o menor possível, apenas chamando as funções necessárias e retornando a resposta para o usuário.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant