Untitled
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