I have two functions that are mostly similar in different files and I want to combine them into one file but as can be seen in the code, some product properties are different from each other and I want to handle this dynamically. What is the correct way to do this?
File-1:
function run(args) {
try {
var sitePreferences = require("sitePreferences");
var pinterestHelpers = require("~/cartridge/scripts/helpers/pinterestHelpers");
var maxRowLength = sitePreferences.get("pinterestProductFeedMaxRow");
var hostName = require("dw/system/Site").current.httpsHostName;
var products = pinterestHelpers.onBeforeStep(args);
var fileNumber = 1;
var lineCount = 1;
pinterestHelpers.removeFiles(args);
var csvObject = pinterestHelpers.createCsvFile(fileNumber, args);
var csv = csvObject.csv;
var fileCreationResponse;
var fileWriter = csvObject.fileWriter;
while (products.hasNext()) {
var currentProductObject = products.next();
var priceObject = pinterestHelpers.getPrice(currentProductObject);
var product = {};
if (pinterestHelpers.shouldBeExported(currentProductObject)) {
if (maxRowLength !== lineCount) {
product.id = pinterestHelpers.getId(currentProductObject);
product.title = pinterestHelpers.getTitle(currentProductObject);
product.description = pinterestHelpers.getDescription(currentProductObject);
product.link = pinterestHelpers.getLink(currentProductObject, hostName);
product.image_link = pinterestHelpers.getImageLink(currentProductObject);
product.price = priceObject && priceObject.list ? priceObject.list : "";
product.availability = pinterestHelpers.getAvailability(currentProductObject);
product.item_group_id = pinterestHelpers.getItemGroupID(currentProductObject);
product.additional_image_link = pinterestHelpers.getAdditionalImageLink(currentProductObject);
product.brand = pinterestHelpers.getBrand(currentProductObject);
product.google_product_category = pinterestHelpers.getGoogleCategoryByProduct(currentProductObject);
product.sale_price = priceObject && priceObject.sale ? priceObject.sale : "";
product.color = pinterestHelpers.getColor(currentProductObject);
product.age_group = pinterestHelpers.getCustomAttribute(currentProductObject, "age_group", "Adult");
product.gender = pinterestHelpers.getCustomAttribute(currentProductObject, "gender", "unisex");
product.condition = pinterestHelpers.getCustomAttribute(currentProductObject, "condition", "new");
product.variant_names = pinterestHelpers.getSize(currentProductObject);
product.variant_values = pinterestHelpers.getColor(currentProductObject);
product.product_type = pinterestHelpers.getProductType(currentProductObject);
product.material = pinterestHelpers.getCustomAttribute(currentProductObject, "material");
product.pattern = pinterestHelpers.getCustomAttribute(currentProductObject, "pattern");
product.shipping = pinterestHelpers.getShipping(currentProductObject, priceObject).group;
product.adult = pinterestHelpers.getCustomAttribute(currentProductObject, "adult", "FALSE");
csv.writeNext([
product.id,
product.title,
product.description,
product.link,
product.image_link,
product.price,
product.availability,
product.item_group_id,
product.variant_names,
product.variant_values,
product.additional_image_link,
product.brand,
product.product_type,
product.sale_price,
product.age_group,
product.color,
product.gender,
product.material,
product.pattern,
product.shipping,
product.adult,
product.condition,
product.google_product_category
]);
lineCount++;
} else {
fileNumber++;
lineCount = 1;
fileCreationResponse = pinterestHelpers.createCsvFile(fileNumber, args);
csv = fileCreationResponse.csv;
}
}
}
products.close();
csv.close();
fileWriter.close();
Logger.info("Pinterest feed exported at {0}", pinterestHelpers.getFeedURL(args, fileCreationResponse.fileName));
return new Status(Status.OK, 'OK', 'Export successful');
} catch (e) {
return new Status(Status.ERROR, 'ERROR', 'Failed to export the feed: ' + e);
}
}
exports.Run = run;
File-2:
function run(args) {
try {
var snapchatHelpers = require("~/cartridge/scripts/helpers/snapchatHelpers");
var maxRowLength = sitePreferences.get("snapchatProductFeedMaxRow");
var hostName = require("dw/system/Site").current.httpsHostName;
var products = snapchatHelpers.onBeforeStep(args);
var fileNumber = 1;
var lineCount = 1;
snapchatHelpers.removeFiles(args);
var csvObject = snapchatHelpers.createCsvFile(fileNumber, args);
var csv = csvObject.csv;
var fileCreationResponse;
var fileWriter = csvObject.fileWriter;
while (products.hasNext()) {
var currentProductObject = products.next();
var priceObject = snapchatHelpers.getPrice(currentProductObject);
var product = {};
if (snapchatHelpers.shouldBeExported(currentProductObject)) {
if (maxRowLength !== lineCount) {
//Required Product Metadata
product.id = snapchatHelpers.getId(currentProductObject);
product.title = snapchatHelpers.getTitle(currentProductObject);
product.description = snapchatHelpers.getDescription(currentProductObject);
product.link = snapchatHelpers.getLink(currentProductObject, hostName);
product.imageLink = snapchatHelpers.getImageLink(currentProductObject);
product.price = priceObject && priceObject.list ? priceObject.list : "";
product.availability = snapchatHelpers.getAvailability(currentProductObject);
product.item_group_id = snapchatHelpers.getItemGroupID(currentProductObject);
product.additional_image_link = snapchatHelpers.getAdditionalImageLink(currentProductObject);
product.brand = snapchatHelpers.getBrand(currentProductObject);
product.google_product_category = snapchatHelpers.getGoogleCategoryByProduct(currentProductObject);
product.sale_price = priceObject && priceObject.sale ? priceObject.sale : "";
product.color = snapchatHelpers.getColor(currentProductObject);
product.age_group = snapchatHelpers.getCustomAttribute(currentProductObject, "age_group", "Adult");
product.gender = snapchatHelpers.getCustomAttribute(currentProductObject, "gender", "Unisex");
product.condition = snapchatHelpers.getCustomAttribute(currentProductObject, "condition", "New");
//Optional Product Metadata
product.product_type = snapchatHelpers.getProductType(currentProductObject);
product.adult = snapchatHelpers.getCustomAttribute(currentProductObject, "adult", "No");
product.size = snapchatHelpers.getSize(currentProductObject);
product.sale_price_effective_date = priceObject && priceObject.startDate ? StringUtils.format("{0}/{1}", priceObject.startDate, priceObject.endDate) : "";
csv.writeNext([
product.id,
product.title,
product.description,
product.link,
product.imageLink,
product.availability,
product.price,
product.brand,
product.age_group,
product.color,
product.condition,
product.gender,
product.item_group_id,
product.google_product_category,
product.product_type,
product.adult,
product.size,
product.additional_image_link,
product.sale_price,
product.sale_price_effective_date
]);
lineCount++;
} else {
fileNumber++;
lineCount = 1;
fileCreationResponse = snapchatHelpers.createCsvFile(fileNumber, args);
csv = fileCreationResponse.csv;
}
}
}
products.close();
csv.close();
fileWriter.close();
Logger.info("Facebook feed exported at {0}", snapchatHelpers.getFeedURL(args, fileCreationResponse.fileName));
return new Status(Status.OK, 'OK', 'Export successful');
} catch (e) {
return new Status(Status.ERROR, 'ERROR', 'Failed to export the feed: ' + e);
}
}
exports.Run = run;
Using inheritance with an Object oriented structure seems logical at first, but since we are working with javascript, I would like to implement it if there is a simpler way by sacrificing object oriented.