Untitled
unknown
plain_text
a year ago
6.6 kB
8
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 });
});Editor is loading...
Leave a Comment