Creating a common file by combining two similar functions

Viewed 41

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.

0 Answers
Related