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()]);
  }
};