JSFiddle - React, Tailwind, and code Playground
by aninaslyan
JavaScript
const productsOrderedWith = {
type: GraphQLList(ProductType),
args: {
product_id: { type: GraphQLString },
},
async resolve(parentValue, args, context) {
const { admin } = context;
let { product_id } = args;
try {
product_id = mongoose.Types.ObjectId(product_id);
} catch (e) {
return null;
}
const findQ = { _id: product_id };
if (!admin) {
findQ.isActive = true;
}
const product = await Product.findOne({ ...findQ });
if (!product) return [];
console.log(product, "product");
const orders = await ShopOrder.find({ 'products._id': product._id });
let productsIdCount = {};
orders.map(order => order.products.map(p => {
const pid = p._id.toString();
if (pid === product._id.toString()) return;
if (!productsIdCount[pid]) {
productsIdCount[pid] = 1;
return;
}
productsIdCount[pid] += 1;
// console.log(productsIdCount, "count");
}));
let productsIdCountArray = Object.keys(productsIdCount).map(key => {
return [key, productsIdCount[key]];
});
// console.log(productsIdCountArray, "productsIdCountArray");
productsIdCountArray.sort((first, second) => {
return second[1] - first[1];
});
// console.log(productsIdCountArray, "productsIdCountArraySorted");
productsIdCountArray = productsIdCountArray.slice(0, 10);
let productsIdCountObject = {};
for (let i = 0; i < productsIdCountArray.length; i++) {
productsIdCountObject[productsIdCountArray[i][0]] = productsIdCountArray[i][1];
}
// console.log(productsIdCountObject, "productsIdCountObject");
const relatedProducts = await Product.find({ _id: { $in: Object.keys(productsIdCountObject) }, isActive: findQ.isActive}).populate('category');
// console.log(relatedProducts, "p");
return relatedProducts.sort((p1, p2) => productsIdCountObject[p2._id.toString()] - productsIdCountObject[p1._id.toString()]);
}
};