Validações com ZOD e NestJS
Bom, primeiramente deixa eu me apresentar, sou o Mike e atualmente sou Back em uma software house, além de tech lead, gerente de projeto, enfim, cidade pequena...
Basicamente fazendo 1 projeto me deparei com zod no nest + swagger e achei genial, faz alguns meses que só trabalho com os 3 juntos, o zod facilita muito a vida com as validações mais complexas, visto q o transform() pode ser usado para diversas coisas e aí entra a dúvida, também temos acesso a fazer chamadas async com isso usando o refine(). Seria viavél fazer validações como "email já cadastrado" e retornar um 422 diretamente do zod ou ainda vale a pena validar pela service no nest?
Relativo a sua pergunta, eu também uso o zod
para validar o formato de dados no back- end. Eu custumo usar o seguinte formato:
// Autenticação do controller
const authenticateBodySchema = z.object({
email: z.string().email(),
password: z.string().min(6),
});
const { email, password } = authenticateBodySchema.parse(req.body);
try {
... // Return status 200 to success
} catch (err) {
if (err instanceof InvalidCredentialsError) {
// return status 400 with invalid credentials (email or password)
}
throw err;
}
Nesse caso eu apenas valido com o zod se o formato dos dados está certo. Se o parse
der erro eu intercepto esse erro e trato isso como em um handler em uma camada acima:
if (error instanceof ZodError) {
// return status 400 with Validation Error and zod message (error.format())
Outra coisa é que se o usuário errou o email ou a senha, eu não comento onde ele errou. Eu retorno apenas um 400
com InvalidCredentials
. Dessa forma, caso alguém estiver tentando invadir a conta de um usuário ele não vai saber onde está o erro, se foi no email ou na senha.
Além disso, eu começaria a usar o status code 422
depois que o usuário estivesse logado para outros recursos do sistema que o usuário tentasse acessar.