Untitled

 avatar
unknown
plain_text
a year ago
4.5 kB
3
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