Your IP : 216.73.216.43


Current Path : /home/deltalab/PMS/partner-manager-backend/rest/queries/
Upload File :
Current File : //home/deltalab/PMS/partner-manager-backend/rest/queries/product.js

const { productModel } = require('../../models/mongoose/product');
const ims = require('../../services/ims');
/**
 * Return a list of products given a partner ID
 * @param {string} partnerId
 * @returns products
 */
async function readMany(partnerId = undefined) {
  const query = {};
  if (partnerId) {
    query.partnerId = partnerId;
  }
  query.deleted = false;
  const products = await productModel.find(query);
  return products;
}

async function readManyLinked(productId) {
  const product = await productModel.findById({ _id: productId });
  if (product) {
    const recomms = [];
    if (product.linkedProducts) {
      for (let i = 0; i < product.linkedProducts.length; i++) {
        const recommendedProduct = await productModel.findById({ _id: product.linkedProducts[i].productId });
        if (recommendedProduct) {
          recomms.push(recommendedProduct);
        }
      }
      return recomms;
    }
  }

  return null;
}

async function readManyByChannel(partnerId = undefined, channelId = undefined) {
  let query;

  if (channelId) {
    query = { 'offers.channelId': channelId };
  } else {
    query = {};
  }

  if (partnerId) {
    query.partnerId = partnerId;
  }

  query.deleted = false;
  const products = await productModel.find(query);
  return products;
}

/**
 * Return a product given its ID
 * @param {string} productId
 * @returns product
 */
async function readOne(productId) {
  const products = await productModel.findById({ _id: productId });
  return products;
}

async function createOne(product) {
  const addedProduct = await productModel.create(product);
  return addedProduct;
}

async function updateOne(productId, product) {
  const updatedProduct = await productModel.findByIdAndUpdate(productId, product, { returnDocument: 'after' });
  return updatedProduct;
}

async function deleteOne(productSku) {
  await productModel.deleteOne({ sku: productSku });
}

async function addMedia(productId, media) {
  const updatedProduct = await productModel.findOneAndUpdate(
    { _id: productId },
    { $push: { media } },
    { returnDocument: 'after' },
  );
  return updatedProduct;
}

async function removeMedia(productId, mediaId) {
  const updatedProduct = await productModel.findOneAndUpdate(
    { _id: productId },
    { $pull: { media: { imsgid: mediaId } } },
    { returnDocument: 'after' },
  );
  return updatedProduct;
}

async function updateAll() {
  const list = await this.readMany();
  console.log('[UPDATE] Inizio aggiornamento');
  for (reference of list) {
    try {
      console.log(`[UPDATE] aggiornamento di ${reference.sku}`);
      await ims.referenceUpdate(reference, reference.sku);
    } catch {
      continue;
    }
  }
  return list;
}

module.exports = {
  readMany,
  readManyLinked,
  readManyByChannel,
  readOne,
  createOne,
  updateOne,
  deleteOne,
  addMedia,
  removeMedia,
  updateAll,
};