Untitled
unknown
plain_text
2 years ago
4.5 kB
5
Indexable
const Joi = require('joi');
const productsModel = require('../models/products.models');
// não ia fazer middleware para validação das vendas mas como estava ultrapassando o limite de linhas o lint estava reclamendo.
// nao fiz para products, ja resolvi o problema de linhas.
// esquema de validação: productId(id) e quantity (minima 1 unidade) são obrigatórios
const schema = Joi.object({
productId: Joi.number().required(),
quantity: Joi.number().min(1).required(),
});
// verifica se o produto existe, se nao, retorna erro com messagem produto nao encontrado
const verificaProdutoExistente = async (productId, res) => {
const product = await productsModel.buscaId(productId);
if (!product) {
return res.constatus(404).json({ message: 'Product not found' });
}
};
// Verifica se há erro relacionado ao productId ou quantity
const verificaErro = (errorMessage, res) => {
// includes verifica se a mensagem de erro contém a string passada como argumento, sempre retorna um valor boleano
const productError = errorMessage.includes('"productId" is required');
const quantityError = errorMessage.includes('"quantity" is required');
// Trata erros relacionados a productId ou quantity
if (productError || quantityError) {
return res.status(400).json({ message: errorMessage });
}
// Trata erros relacionados a quantidade mínima,
// verifica se a mensagem de erro contém a string passada, retorna um valor boleano
if (errorMessage.includes('"quantity" must be greater than or equal to 1')) {
return res.status(422).json({ message: errorMessage });
}
};
// valida um item (produto) usando o esquema, verifica se o produto existe.
const validarItem = async (item, res) => {
const { error } = schema.validate(item);
if (error) {
const errorMessage = error.details[0].message;
const errorResponse = verificaErro(errorMessage, res);
if (errorResponse) return errorResponse;
}
const productResponse = await verificaProdutoExistente(item.productId, res);
if (productResponse) return productResponse;
};
// Valida a venda, verificando se os produtos existem e se a quantidade é válida. Se tudo estiver correto, chama a próxima função middleware.
const validacaoVenda = async (req, res, next) => {
const itemsSold = req.body;
// Mapeia os itens para um array de promessas utilizando a função validarItem
const promises = itemsSold.map((item) => validarItem(item, res));
// Aguarda a conclusão de todas as promessas utilizando Promise.all
const results = await Promise.all(promises);
// Procura por um resultado (resposta de erro) dentro do array de resultados
const errorResponse = results.find((result) => result);
// Se houver uma resposta de erro, retorna a resposta
if (errorResponse) return errorResponse;
// Se não houver erros, chama o próximo middleware
next();
// poderia ter usado o try/catch como em sales.controller.js e products.controller.js, como não testei estava sem tempo so completei o copilot.
};
// esquema defina que a cquantidade obrigatoria é maior ou igual a 1
const quantidadeSchema = Joi.object({
quantity: Joi.number().min(1).required(),
});
// Extrai a quantidade do corpo da requisição, valida conforme o quantidadeSchema e trata erros relacionados à quantidade. Se tudo estiver correto, chama a próxima função middleware.
const validacaoVendasProductQuantity = async (req, res, next) => {
const { quantity } = req.body;
const { error } = quantidadeSchema.validate({ quantity });
// Verifica se existem erros na validação
if (error) {
// Extrai a mensagem de erro
const errorMessage = error.details[0].message;
// Verifica se a mensagem de erro indica a quantidade obrigatória.
if (errorMessage.includes('"quantity" is required')) {
// Se sim, retorna um erro 400 com a mensagem de erro
return res.status(400).json({ message: errorMessage });
}
// Verifica se a mensagem de erro indica que a quantidade deve ser maior ou igual a 1
if (errorMessage.includes('"quantity" must be greater than or equal to 1')) {
return res.status(422).json({ message: errorMessage });
}
// Se a mensagem de erro não corresponde a nenhum dos casos acima, retorna um erro 400 com a mensagem de erro
return res.status(400).json({ message: errorMessage });
}
// Se não houver erros na validação, chama o próximo middleware na cadeia
next();
};
module.exports = { validacaoVenda, validacaoVendasProductQuantity };Editor is loading...
Leave a Comment