Commit 6a212996 authored by Ben Galloway's avatar Ben Galloway

Make object reduce method DRY

parent 24c62263
...@@ -14,29 +14,30 @@ var _xmlJs2 = _interopRequireDefault(_xmlJs); ...@@ -14,29 +14,30 @@ var _xmlJs2 = _interopRequireDefault(_xmlJs);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// UTILITY FUNCTIONS
const objectReduce = (callback, objectToReduce, methodSpecs = null) => {
return Object.keys(objectToReduce).reduce((distilledObject, key) => {
return _extends({}, distilledObject, callback({ fieldContents: objectToReduce[key], fieldKey: key, methodSpecs }));
}, {});
};
// INPUT WRAPPERS // INPUT WRAPPERS
const parseInputField = (fieldContents, fieldKey) => { const parseInputField = ({ fieldContents, fieldKey }) => {
if (fieldKey === "GammaInputType" || fieldKey === "GammaResponseType") return { _attributes: { "xsi:type": fieldContents } }; if (fieldKey === "GammaInputType" || fieldKey === "GammaResponseType") return { _attributes: { "xsi:type": fieldContents } };
if (fieldContents.constructor === Object) return { [fieldKey]: sanitise(fieldContents) }; if (fieldContents.constructor === Object) return { [fieldKey]: objectReduce(parseInputField, fieldContents) };
if (Array.isArray(fieldContents)) { if (Array.isArray(fieldContents)) {
const arrayOfParsedObjects = fieldContents.map(singleInputObject => { const arrayOfParsedObjects = fieldContents.map(singleInputObject => {
return sanitise(singleInputObject); return objectReduce(parseInputField, singleInputObject);
}); });
return { [fieldKey]: arrayOfParsedObjects }; return { [fieldKey]: arrayOfParsedObjects };
} }
return { [fieldKey]: fieldContents }; return { [fieldKey]: fieldContents };
}; };
const sanitise = callObject => {
const sanitised = Object.keys(callObject).reduce((distilledObject, key) => {
return _extends({}, distilledObject, parseInputField(callObject[key], key));
}, {});
return sanitised;
};
const getXml = exports.getXml = (callObject, method) => { const getXml = exports.getXml = (callObject, method) => {
const sanitisedCallObject = sanitise(callObject); const sanitisedCallObject = objectReduce(parseInputField, callObject);
const fullCall = { const fullCall = {
_declaration: { _attributes: { version: "1.0", encoding: "utf-8" } }, _declaration: { _attributes: { version: "1.0", encoding: "utf-8" } },
XMLRequest: { XMLRequest: {
...@@ -55,7 +56,7 @@ const getXml = exports.getXml = (callObject, method) => { ...@@ -55,7 +56,7 @@ const getXml = exports.getXml = (callObject, method) => {
// OUTPUT PARSERS // OUTPUT PARSERS
const parseResponseField = (fieldContents, fieldKey, methodSpecs) => { const parseResponseField = ({ fieldContents, fieldKey, methodSpecs }) => {
if (fieldContents.constructor === Object && Object.keys(fieldContents).length === 0) return { [fieldKey]: "" }; if (fieldContents.constructor === Object && Object.keys(fieldContents).length === 0) return { [fieldKey]: "" };
if (fieldKey === "xs:schema") return {}; if (fieldKey === "xs:schema") return {};
if (fieldKey === "mResults" && fieldContents.hasOwnProperty("diffgr:diffgram")) return { if (fieldKey === "mResults" && fieldContents.hasOwnProperty("diffgr:diffgram")) return {
...@@ -66,11 +67,9 @@ const parseResponseField = (fieldContents, fieldKey, methodSpecs) => { ...@@ -66,11 +67,9 @@ const parseResponseField = (fieldContents, fieldKey, methodSpecs) => {
if (fieldKey === "_attributes" && fieldContents.hasOwnProperty("diffgr:id") && fieldContents.hasOwnProperty("msdata:rowOrder")) return { GammaResponseType: "VisitorStatsDay" }; if (fieldKey === "_attributes" && fieldContents.hasOwnProperty("diffgr:id") && fieldContents.hasOwnProperty("msdata:rowOrder")) return { GammaResponseType: "VisitorStatsDay" };
if (fieldContents.hasOwnProperty("_text")) return { [fieldKey]: fieldContents["_text"] }; if (fieldContents.hasOwnProperty("_text")) return { [fieldKey]: fieldContents["_text"] };
if (fieldContents.hasOwnProperty("anyType")) return { [fieldKey]: processAnyType(fieldContents.anyType, methodSpecs) }; if (fieldContents.hasOwnProperty("anyType")) return { [fieldKey]: processAnyType(fieldContents.anyType, methodSpecs) };
if (fieldContents.hasOwnProperty(fieldKey)) return { [fieldKey]: parseResponseField(fieldContents[fieldKey], fieldKey, methodSpecs) }; if (fieldContents.hasOwnProperty(fieldKey)) return { [fieldKey]: parseResponseField({ fieldContents: fieldContents[fieldKey], fieldKey, methodSpecs }) };
if (fieldContents.constructor === Object && Object.keys(fieldContents).length !== 0) { if (fieldContents.constructor === Object && Object.keys(fieldContents).length !== 0) {
const formattedContents = Object.keys(fieldContents).reduce((distilledObject, key) => { const formattedContents = objectReduce(parseResponseField, fieldContents, methodSpecs);
return _extends({}, distilledObject, parseResponseField(fieldContents[key], key, methodSpecs));
}, {});
return { [fieldKey]: formattedContents }; return { [fieldKey]: formattedContents };
} }
return { [fieldKey]: fieldContents }; return { [fieldKey]: fieldContents };
...@@ -81,11 +80,7 @@ const processAnyType = (anyType, methodSpecs, internal = false) => { ...@@ -81,11 +80,7 @@ const processAnyType = (anyType, methodSpecs, internal = false) => {
const anyTypeArray = Array.isArray(anyType) ? anyType : new Array(anyType); const anyTypeArray = Array.isArray(anyType) ? anyType : new Array(anyType);
const reduced = anyTypeArray.map(verboseObject => { const reduced = anyTypeArray.map(verboseObject => {
const keys = Object.keys(verboseObject); return objectReduce(parseResponseField, verboseObject, methodSpecs);
const distilled = keys.reduce((distilledObject, key) => {
return _extends({}, distilledObject, parseResponseField(verboseObject[key], key, methodSpecs));
}, {});
return distilled;
}); });
const result = !internal && methodSpecs.returnType === false && reduced.length === 1 ? reduced[0] : reduced; // Only return an array if necessary const result = !internal && methodSpecs.returnType === false && reduced.length === 1 ? reduced[0] : reduced; // Only return an array if necessary
......
// Utility parsing and wrapping functions for calls to Gamma // Utility parsing and wrapping functions for calls to Gamma
import convert from "xml-js"; import convert from "xml-js";
// UTILITY FUNCTIONS
const objectReduce = (callback, objectToReduce, methodSpecs = null) => {
return Object.keys(objectToReduce).reduce((distilledObject, key) => {
return { ...distilledObject, ...callback({ fieldContents: objectToReduce[key], fieldKey: key, methodSpecs }) };
}, {});
};
// INPUT WRAPPERS // INPUT WRAPPERS
const parseInputField = (fieldContents, fieldKey) => { const parseInputField = ({ fieldContents, fieldKey }) => {
if (fieldKey === "GammaInputType" || fieldKey === "GammaResponseType") if (fieldKey === "GammaInputType" || fieldKey === "GammaResponseType")
return { _attributes: { "xsi:type": fieldContents } }; return { _attributes: { "xsi:type": fieldContents } };
if (fieldContents.constructor === Object) return { [fieldKey]: sanitise(fieldContents) }; if (fieldContents.constructor === Object) return { [fieldKey]: objectReduce(parseInputField, fieldContents) };
if (Array.isArray(fieldContents)) { if (Array.isArray(fieldContents)) {
const arrayOfParsedObjects = fieldContents.map((singleInputObject) => { const arrayOfParsedObjects = fieldContents.map((singleInputObject) => {
return sanitise(singleInputObject); return objectReduce(parseInputField, singleInputObject);
}); });
return { [fieldKey]: arrayOfParsedObjects }; return { [fieldKey]: arrayOfParsedObjects };
} }
return { [fieldKey]: fieldContents }; return { [fieldKey]: fieldContents };
}; };
const sanitise = (callObject) => {
const sanitised = Object.keys(callObject).reduce((distilledObject, key) => {
return { ...distilledObject, ...parseInputField(callObject[key], key) };
}, {});
return sanitised;
};
export const getXml = (callObject, method) => { export const getXml = (callObject, method) => {
const sanitisedCallObject = sanitise(callObject); const sanitisedCallObject = objectReduce(parseInputField, callObject);
const fullCall = { const fullCall = {
_declaration: { _attributes: { version: "1.0", encoding: "utf-8" } }, _declaration: { _attributes: { version: "1.0", encoding: "utf-8" } },
XMLRequest: { XMLRequest: {
...@@ -43,7 +44,7 @@ export const getXml = (callObject, method) => { ...@@ -43,7 +44,7 @@ export const getXml = (callObject, method) => {
// OUTPUT PARSERS // OUTPUT PARSERS
const parseResponseField = (fieldContents, fieldKey, methodSpecs) => { const parseResponseField = ({ fieldContents, fieldKey, methodSpecs }) => {
if (fieldContents.constructor === Object && Object.keys(fieldContents).length === 0) return { [fieldKey]: "" }; if (fieldContents.constructor === Object && Object.keys(fieldContents).length === 0) return { [fieldKey]: "" };
if (fieldKey === "xs:schema") return {}; if (fieldKey === "xs:schema") return {};
if (fieldKey === "mResults" && fieldContents.hasOwnProperty("diffgr:diffgram")) if (fieldKey === "mResults" && fieldContents.hasOwnProperty("diffgr:diffgram"))
...@@ -69,11 +70,9 @@ const parseResponseField = (fieldContents, fieldKey, methodSpecs) => { ...@@ -69,11 +70,9 @@ const parseResponseField = (fieldContents, fieldKey, methodSpecs) => {
if (fieldContents.hasOwnProperty("anyType")) if (fieldContents.hasOwnProperty("anyType"))
return { [fieldKey]: processAnyType(fieldContents.anyType, methodSpecs) }; return { [fieldKey]: processAnyType(fieldContents.anyType, methodSpecs) };
if (fieldContents.hasOwnProperty(fieldKey)) if (fieldContents.hasOwnProperty(fieldKey))
return { [fieldKey]: parseResponseField(fieldContents[fieldKey], fieldKey, methodSpecs) }; return { [fieldKey]: parseResponseField({ fieldContents: fieldContents[fieldKey], fieldKey, methodSpecs }) };
if (fieldContents.constructor === Object && Object.keys(fieldContents).length !== 0) { if (fieldContents.constructor === Object && Object.keys(fieldContents).length !== 0) {
const formattedContents = Object.keys(fieldContents).reduce((distilledObject, key) => { const formattedContents = objectReduce(parseResponseField, fieldContents, methodSpecs);
return { ...distilledObject, ...parseResponseField(fieldContents[key], key, methodSpecs) };
}, {});
return { [fieldKey]: formattedContents }; return { [fieldKey]: formattedContents };
} }
return { [fieldKey]: fieldContents }; return { [fieldKey]: fieldContents };
...@@ -84,11 +83,7 @@ const processAnyType = (anyType, methodSpecs, internal = false) => { ...@@ -84,11 +83,7 @@ const processAnyType = (anyType, methodSpecs, internal = false) => {
const anyTypeArray = Array.isArray(anyType) ? anyType : new Array(anyType); const anyTypeArray = Array.isArray(anyType) ? anyType : new Array(anyType);
const reduced = anyTypeArray.map((verboseObject) => { const reduced = anyTypeArray.map((verboseObject) => {
const keys = Object.keys(verboseObject); return objectReduce(parseResponseField, verboseObject, methodSpecs);
const distilled = keys.reduce((distilledObject, key) => {
return { ...distilledObject, ...parseResponseField(verboseObject[key], key, methodSpecs) };
}, {});
return distilled;
}); });
const result = !internal && methodSpecs.returnType === false && reduced.length === 1 ? reduced[0] : reduced; // Only return an array if necessary const result = !internal && methodSpecs.returnType === false && reduced.length === 1 ? reduced[0] : reduced; // Only return an array if necessary
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment