Untitled

 avatar
unknown
plain_text
17 days ago
6.6 kB
3
Indexable
exports.viewProduct = catchAsync(async (req, res, next) => {
  const productId = req.params.id;
  let data = {};
  let count = null;

  // buyer
  let buyer = null;
  if (req?.user.role == 'retailer') {
    buyer = await Retailer.findById({ _id: req?.user.profile });
  }else if (req?.user.role == 'distributeur') {
    buyer = await Distributeur.findById({ _id: req?.user.profile });  
  }
  // Validate the productId
  if (!isValidObjectId(productId)) {
    return res.status(400).json({ message: 'Invalid product ID' });
  }

  const pathsAndFields = [
    { path: 'subcategories', select: 'subcategory' },
    { path: 'categories', select: 'category' },
    { path: 'groups', select: 'group' },
    { path: 'brand', select: 'brand' },
    { path: 'offer', select: ['discount', 'status'] },
    { path: 'reviews.user', select:'name' }
  ];

  let product = await Product.findById(productId).populate(pathsAndFields);
  if (!product) {
    return next(new AppError('Product not found', 400));
  }
  if (!product.visibility) {
    return next(new AppError('product not visible', 400));
  }
  if (product.isvariant == true) {
    const attributes = await VariantAttribute.find({ product: product._id });
    if (attributes.length < 1) {
      return next(new AppError('Invalid visibility value', 400));
    }
    count = attributes.length;
    for (let prodvar_id of product.variants) {
      const prod = await ProductVariant.findById(prodvar_id).populate({
        path: 'attributevalues',
        populate: { path: 'attribute' }
      });
      let obj = data;
      for (let i = 0; i < attributes.length; i++) {
        for (let k = 0; k < prod.attributevalues.length; k++) {
          if (String(attributes[i]._id) == String(prod.attributevalues[k].attribute._id)) {
            if (obj.id) {
              if (!obj.values[prod.attributevalues[k].value.toString()]) {
                obj.values[prod.attributevalues[k].value.toString()] = {};
              }
            } else {
              obj.id = prod.attributevalues[k].attribute._id;
              obj.name = prod.attributevalues[k].attribute.attributeName;
              obj.values = {};
              obj.values[prod.attributevalues[k].value.toString()] = {};
            }

            if (i == attributes.length - 1) {
              obj.values[prod.attributevalues[k].value.toString()] = {};
              // prod variant
              let objVar = {}
              if (buyer) {
                if (req?.user.role == 'retailer') {
                  objVar.publicPrice = prod.pricing.retailerPrices[buyer.pricingType.toString()];
                } else if (req?.user.role == 'distributeur') {
                  objVar.publicPrice = Number.parseFloat(prod.pricing.distributeurPrices[buyer.pricingType.toString()]).toFixed(2);
                  Number.parseFloat(total).toFixed(2);
                }
              } else {
                objVar.publicPrice = prod.pricing.publicPrice;
              }
              objVar.quantity = prod.quantity;
              objVar.image = prod?.image;
              objVar.name = prod?.name;
              objVar.sku = prod?.sku;
              objVar._id = prod?._id;
              objVar.id = prod?.id;
              obj.values[prod.attributevalues[k].value.toString()] = objVar;
            } else {
              obj = obj.values[prod.attributevalues[k].value.toString()];
            }
          }
        }
      }
    }
  }else{
    if (buyer) {
      if (req?.user.role == 'retailer') {
        product.price = product.pricing.retailerPrices[buyer.pricingType.toString()] ;
      } else if (req?.user.role == 'distributeur') {
        product.price = Number.parseFloat(product.pricing.distributeurPrices[buyer.pricingType.toString()]).toFixed(2);
        Number.parseFloat(total).toFixed(2);
      }
    } else {
      product.price = product.pricing.publicPrice;
    }
  }
  // product objet
    let obj = {};
    obj._id = product?._id;
    obj.name = product?.name;
    obj.description = product?.description ;
    obj.image = product?.images[0];
    obj.visibility = product?.visibility;
    obj.categories = product?.categories;
    obj.isVariant = product.isvariant;
    obj.isNew = product.isNew;
    obj.offer = product.offer?.at(0)?.discount ?? null;
    if (!product.isvariant) {
      if (buyer) {
        if (req?.user.role == 'retailer') {
          obj.publicPrice = product.pricing.retailerPrices[buyer.pricingType.toString()];
        } else if (req?.user.role == 'distributeur') {
          obj.publicPrice = Number.parseFloat(product.pricing.distributeurPrices[buyer.pricingType.toString()]).toFixed(2);
          Number.parseFloat(total).toFixed(2);
        }
      } else {
        obj.publicPrice = product.pricing.publicPrice;
      }
      obj.quantity = product?.quantity;
    }
    obj.reviews = product?.reviews
  //product.offer = product.offer?.at(0)?.discount ?? null;
  const relatedProducts = await RelatedProducts(productId, next);
  relatedProducts.reduce((result, product) => {
    let obj = {};
    obj._id = product?._id;
    obj.name = product?.name;
    obj.description = product?.description ;
    obj.image = product?.images[0];
    obj.visibility = product?.visibility;
    obj.categories = product?.categories;
    obj.isVariant = product.isvariant;
    obj.isNew = product.isNew;
    obj.offer = product.offer?.at(0)?.discount ?? null;
    if (!product.isvariant) {
      if (buyer) {
        if (req?.user.role == 'retailer') {
          obj.publicPrice = product.pricing?.retailerPrices[buyer.pricingType.toString()];
        } else if (req?.user.role == 'distributeur') {
          obj.publicPrice = Number.parseFloat(product.pricing.distributeurPrices[buyer.pricingType.toString()]).toFixed(2);
          Number.parseFloat(total).toFixed(2);
        }
      } else {
        obj.publicPrice = product.pricing.publicPrice;
      }
      obj.quantity = product?.quantity;
    } else {
      obj.quantity = product?.variant[0]?.totalQuantity;
      obj.publicPrice = product?.variant[0]?.publicPrice;
    }
    result.push(obj);
    return result;
  }, []);
  const result = {};
  result.countReviews = product.reviews.length
  result.product = obj;
  result.relatedProducts = relatedProducts;
  if (product.isvariant == true) {
    result.variant = data;
    result.count = count;
  }

  res.status(200).json({ message: 'Product fetched successfully', data: result });
});
Leave a Comment