Your IP : 216.73.216.220


Current Path : /home/deltalab/PMS/partner-manager-backend/graphql/schema/
Upload File :
Current File : //home/deltalab/PMS/partner-manager-backend/graphql/schema/listing.schema.js

/* eslint-disable no-restricted-syntax */
/* eslint-disable no-await-in-loop */
const auth = require('../../services/auth');
const ims = require('../../services/ims');
const mail = require('../../services/mail');
const { listingModel } = require('../../models/mongoose/listing');
const { productModel } = require('../../models/mongoose/product');
const { listingTC, listingEntryProductTC } = require('../types/listing.type');
const { productTC } = require('../types/product.type');
const { partnerTC } = require('../types/partner.type');

/**
 * Listing products
 * Find products that belong to a listing
 */
listingTC.addResolver({
  kind: 'mutation',
  name: 'removeProductsFromListing',
  type: [listingTC],
  args: {
    listingIds: '[MongoID]',
    productId: 'MongoID',
  },
  resolve: async ({ args }) => {
    const product = await productModel.findById(args.productId);
    if (product) {
      for (const listing of args.listingIds) {
        let found = false;
        let index = -1;
        const listingObject = await listingModel.findById(listing);
        if (listingObject) {
          for (const productEntry of listingObject.entries) {
            if (productEntry.productId.equals(args.productId)) {
              found = true;
              index = listingObject.entries.indexOf(productEntry);
              break;
            }
          }
          if (found && index !== -1) {
            // await ims.removeProductFromIMSListing(product.imsgid, args.listingIds); not needed in magento environment
            listingObject.entries.splice(index, 1);
            await listingObject.save();
          }
        }
      }
    }
    return [];
  },

});

listingTC.addResolver({
  kind: 'mutation',
  name: 'addProductToListings',
  type: [listingTC],
  args: {
    listingIds: '[MongoID]',
    productId: 'MongoID',
  },
  resolve: async ({ args }) => {
    const product = await productModel.findById(args.productId);
    if (product) {
      for (const listing of args.listingIds) {
        let found = false;
        const listingObject = await listingModel.findById(listing);
        if (listingObject) {
          for (const productEntry of listingObject.entries) {
            if (productEntry.productId.equals(args.productId)) {
              found = true;
              break;
            }
          }
          if (!found) {
            // await ims.addProductToIMSListing(product.imsgid, args.listingIds); //not needed in magento environment
            listingObject.entries.push({ productId: product.id, price: 0.00 });
            await listingObject.save();
          }
        }
      }
    }
    return [];
  },

});

/**
 * Listing products
 * Find products that belong to a listing
 */
listingTC.addResolver({
  kind: 'mutation',
  name: 'updateListingProducts',
  type: [productTC],
  args: {
    entries: '[ListingEntryProductInput]',
    isDiscount: 'Boolean',
  },
  resolve: async ({ args }) => {
    const products = [];
    for (const entry of args.entries) {
      const product = await productModel.findById(entry.product._id);
      if (product) {
        product.originalPrice = args.isDiscount ? product.price : 0;
        product.price = entry.price;
        await product.save();
        const response = ims.referenceUpdate(product, product.sku);
        products.push(product);
      }
    }
    return products;
  },

});

listingTC.addResolver({
  kind: 'query',
  name: 'getListingProducts',
  type: [listingEntryProductTC],
  args: {
    listingId: 'MongoID',
  },
  resolve: async ({ args }) => {
    const entries = new Array();
    const listing = await listingModel.findById(args.listingId);
    if (listing) {
      for (const productEntry of listing.entries) {
        const product = productModel.findById(productEntry.productId);
        if (product) {
          entries.push({ product, price: productEntry.price });
        }
      }
      return entries;
    }
  },
});

// RELATIONS =========================================

/**
* User's Partner relation
* This relation univocally connects a partner to a user
*/
listingTC.addRelation(
  'partner',
  {
    resolver: () => partnerTC.mongooseResolvers.findById(),
    prepareArgs: {
      _id: (source) => source.partnerId,
    },
    projection: { partnerId: true },
  },
);

// QUERIES ===========================================
const listingQuery = {
  ...auth.authenticationRequired({
    listingById: listingTC.mongooseResolvers.findById(),
    listingMany: listingTC.mongooseResolvers.findMany(),
    listingCount: listingTC.mongooseResolvers.count(),
    getListingProducts: listingTC.getResolver('getListingProducts'),
  }),
};

// MUTATIONS =========================================
const listingMutation = {
  ...auth.authenticationRequired({
    listingCreateOne: ims.listingCreateOneWrapper(listingTC.mongooseResolvers.createOne()),
    listingUpdateById: ims.listingUpdateByIdWrapper(listingTC.mongooseResolvers.updateById()),
    listingRemoveById: ims.listingRemoveByIdWrapper(listingTC.mongooseResolvers.removeById()),
    removeProductsFromListing: listingTC.getResolver('removeProductsFromListing'),
    addProductToListings: listingTC.getResolver('addProductToListings'),
    updateListingProducts: listingTC.getResolver('updateListingProducts'),
  }),
};

// EXPORTS ===========================================
module.exports = {
  listingQuery,
  listingMutation,
};