| Current Path : /home/deltalab/PMS/partner-manager-backend/graphql/schema/ |
| 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,
};