Your IP : 216.73.217.95


Current Path : /home/deltalab/PMS/ims-connector/graphql/schema/
Upload File :
Current File : //home/deltalab/PMS/ims-connector/graphql/schema/product.schema.js

const productAdapter = require('../../logic/shopify/product');

const { productIdTC, ProductAvailability, productAvailabilityTC } = require('../types/product.type');
const { ProductId } = require('../types/product.type');
const { productInputType } = require('../types/product.type');
const { productTC } = require('../types/product.type');

productTC.addResolver(
  {
    kind: 'query',
    name: 'productById',
    type: productTC,
    args: {
      id: 'ID!',
    },
    resolve: async (_, { args }) => {
      const { id } = args;
      const product = await productAdapter.getProduct(id);
      return product;
    },
  },
);

productTC.addResolver(
  {
    kind: 'mutation',
    name: 'productUpdateOne',
    type: productIdTC,
    args: {
      input: productInputType,
    },
    resolve: async ({ args }) => {
      const { input } = args;
      const productId = new ProductId();
      productId.imsgid = await productAdapter.updateProduct(input);
      return productId;
    },
  },
);

productTC.addResolver(
  {
    kind: 'mutation',
    name: 'productCreateOne',
    type: productTC,
    args: {
      input: productInputType,
    },
    resolve: async ({ args }) => {
      const { input } = args;
      const productId = new ProductId();
      productId.imsgid = await productAdapter.createProduct(input);
      return productId;
    },
  },
);

/**
 * Remove a product
 */
productTC.addResolver(
  {
    kind: 'mutation',
    name: 'productDeleteById',
    type: productIdTC,
    args: {
      id: 'ID!',
    },
    resolve: async ({ args }) => {
      const { id } = args;
      const productId = new ProductId();
      productId.imsgid = await productAdapter.deleteProduct(id);
      return productId;
    },
  },
);

/**
 * Remove a product
 */
productTC.addResolver(
  {
    kind: 'mutation',
    name: 'productAdjustQuantity',
    type: productAvailabilityTC,
    args: {
      imsgid: 'ID!',
      quantity: 'Float!',
    },
    resolve: async ({ args }) => {
      const product = await productAdapter.getProductRawData(args.imsgid);
      const variant = product.variants.edges[0].node;
      const inventoryLevel = variant.inventoryItem.inventoryLevels.edges[0].node;
      const availability = await productAdapter.inventoryAdjustQuantity(inventoryLevel.id, args.quantity);
      const productAvailability = new ProductAvailability();
      productAvailability.imsgid = product.id;
      productAvailability.availability = availability
      return productAvailability;
    },
  },
);

// QUERIES ===========================================
const productQuery = {
  productById: productTC.getResolver('productById'),
};

const productMutation = {
  productCreateOne: productTC.getResolver('productCreateOne'),
  productDeleteById: productTC.getResolver('productDeleteById'),
  productUpdateOne: productTC.getResolver('productUpdateOne'),
  productAdjustQuantity: productTC.getResolver('productAdjustQuantity'),
};

// EXPORTS ===========================================
module.exports = {
  productQuery,
  productMutation,
};