Commit 7fcee1a9 authored by Ben Galloway's avatar Ben Galloway

Initial full working version of library

parents
{
"presets": [
[
"env",
{
"targets": {
"node": "current"
}
}
]
],
"plugins": ["transform-object-rest-spread"]
}
# Project specifics
test*
# https://github.com/github/gitignore
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# next.js build output
.next
\ No newline at end of file
This diff is collapsed.
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _soapAsPromised = require("soap-as-promised");
var _soapAsPromised2 = _interopRequireDefault(_soapAsPromised);
var _util = require("./util");
var _config = require("./config");
var _config2 = _interopRequireDefault(_config);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const callGamma = async (methodSpecs, callParamsObject) => {
try {
const endpoint = _config2.default.endpoints[methodSpecs.endpoint];
const client = await _soapAsPromised2.default.createClient(endpoint);
const callDetails = (0, _util.getXml)(callParamsObject, methodSpecs);
_config2.default.debug(callDetails);
const rawResponse = await client.ReceiveData({ value: callDetails });
_config2.default.debug(rawResponse.ReceiveDataResult);
const response = (0, _util.parseResponse)(rawResponse, methodSpecs);
_config2.default.debug(JSON.stringify(response, null, 2));
if (response.hasOwnProperty("Message")) throw new ReferenceError(response.Message);
return response;
} catch (error) {
throw new Error(`The response from the Gamma server could not be parsed correctly. The error was "${error}"`);
}
};
exports.default = callGamma;
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _debug = require("debug");
var _debug2 = _interopRequireDefault(_debug);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const liveEndpoint = "https://gscticketserver.gsc.org.uk:5729/GDXMLWebService/GDXMLWebService.asmx?WSDL";
const testEndpoint = "https://gscticketserver.gsc.org.uk:5729/GDXMLWebServiceTEST/GDXMLWebService.asmx?WSDL";
const activeEndpoint = process.env.GAMMA_ENV === "live" ? liveEndpoint : testEndpoint;
const config = {
endpoints: {
reservation: activeEndpoint,
bookings: activeEndpoint,
availability: activeEndpoint,
membership: activeEndpoint
},
debug: (0, _debug2.default)("gammajs")
};
exports.default = config;
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.gammaModifiedMembers = exports.gammaMembershipSubscriptionsLoad = exports.gammaMembershipCancellation = exports.gammaMembershipPurchase = exports.gammaChangeMemberDetails = exports.gammaCancelSeats = exports.gammaReserveXTSeats = exports.gammaCancelBookAvailableSpaces = exports.gammaBookAvailableSpacesRequest = exports.gammaUpdateBookingStatus = exports.gammaUpdateBooking = exports.gammaSaveCustomerDetails = exports.gammaRemoveContactInterests = exports.gammaCancelBookingRequest = exports.gammaBookingAllSave = exports.gammaAmendBooking = exports.gammaVoucherListLoad = exports.gammaVoucherDiscountCheck = exports.gammaViewResourcesLoad = exports.gammaResourceViewListLoad = exports.gammaResourceListLoad = exports.gammaResourceListByViewLoad = exports.gammaResourceListByViewByDateLoad = exports.gammaResourceDatesListLoad = exports.gammaRedeemedBookings = exports.gammaProductMapListLoad = exports.gammaProductListLoad = exports.gammaGetTourList = exports.gammaGetBookingStatusList = exports.gammaGetBookingHistory = exports.gammaEventsOnlyListLoad = exports.gammaEventListLoad = exports.gammaEventEditList = exports.gammaCustomerLoad = exports.gammaContactInterests = exports.gammaBookingStatusUpdateCheck = exports.gammaBookingETicketExportRequest = exports.gammaAllContactInterests = undefined;
var _methods = require("./methods");
var _methods2 = _interopRequireDefault(_methods);
var _callGamma = require("./callGamma");
var _callGamma2 = _interopRequireDefault(_callGamma);
var _config = require("./config");
var _config2 = _interopRequireDefault(_config);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Individual exports
const create = methodName => {
const methodSpecArray = _methods2.default.filter(methodObject => methodObject.name === methodName);
if (methodSpecArray.length !== 1) {
throw new ReferenceError(`Cannot uniquely determine a Gamma method called ${methodName}`);
}
const methodSpecObject = methodSpecArray[0];
return (callParams = {}) => {
_config2.default.debug(`Method called: ${JSON.stringify(methodSpecObject)}`);
return (0, _callGamma2.default)(methodSpecObject, callParams);
};
};
// Availability methods
const gammaAllContactInterests = exports.gammaAllContactInterests = create("AllContactInterests");
const gammaBookingETicketExportRequest = exports.gammaBookingETicketExportRequest = create("BookingETicketExportRequest");
const gammaBookingStatusUpdateCheck = exports.gammaBookingStatusUpdateCheck = create("BookingStatusUpdateCheck");
const gammaContactInterests = exports.gammaContactInterests = create("ContactInterests");
const gammaCustomerLoad = exports.gammaCustomerLoad = create("CustomerLoad");
const gammaEventEditList = exports.gammaEventEditList = create("EventEditList");
const gammaEventListLoad = exports.gammaEventListLoad = create("EventListLoad");
const gammaEventsOnlyListLoad = exports.gammaEventsOnlyListLoad = create("EventsOnlyListLoad");
const gammaGetBookingHistory = exports.gammaGetBookingHistory = create("GetBookingHistory");
const gammaGetBookingStatusList = exports.gammaGetBookingStatusList = create("GetBookingStatusList");
const gammaGetTourList = exports.gammaGetTourList = create("GetTourList");
const gammaProductListLoad = exports.gammaProductListLoad = create("ProductListLoad");
const gammaProductMapListLoad = exports.gammaProductMapListLoad = create("ProductMapListLoad");
const gammaRedeemedBookings = exports.gammaRedeemedBookings = create("RedeemedBookings");
const gammaResourceDatesListLoad = exports.gammaResourceDatesListLoad = create("ResourceDatesListLoad");
const gammaResourceListByViewByDateLoad = exports.gammaResourceListByViewByDateLoad = create("ResourceListByViewByDateLoad");
const gammaResourceListByViewLoad = exports.gammaResourceListByViewLoad = create("ResourceListByViewLoad");
const gammaResourceListLoad = exports.gammaResourceListLoad = create("ResourceListLoad");
const gammaResourceViewListLoad = exports.gammaResourceViewListLoad = create("ResourceViewListLoad");
const gammaViewResourcesLoad = exports.gammaViewResourcesLoad = create("ViewResourcesLoad");
const gammaVoucherDiscountCheck = exports.gammaVoucherDiscountCheck = create("VoucherDiscountCheck");
const gammaVoucherListLoad = exports.gammaVoucherListLoad = create("VoucherListLoad");
// These methods seem to be unsupported by the Gamma API (based on testing in May 2018).
// They are not made available individually here, to discourage their use.
//export const gammaResourceDatesNotAvailable = create("ResourceDatesNotAvailable");
//export const gammaResourceListByViewByDateLoadLight = create("ResourceListByViewByDateLoadLight");
// Bookings methods
const gammaAmendBooking = exports.gammaAmendBooking = create("AmendBooking");
const gammaBookingAllSave = exports.gammaBookingAllSave = create("BookingAllSave");
const gammaCancelBookingRequest = exports.gammaCancelBookingRequest = create("CancelBookingRequest");
const gammaRemoveContactInterests = exports.gammaRemoveContactInterests = create("RemoveContactInterests");
const gammaSaveCustomerDetails = exports.gammaSaveCustomerDetails = create("SaveCustomerDetails");
const gammaUpdateBooking = exports.gammaUpdateBooking = create("UpdateBooking");
const gammaUpdateBookingStatus = exports.gammaUpdateBookingStatus = create("UpdateBookingStatus");
// Reservation methods
const gammaBookAvailableSpacesRequest = exports.gammaBookAvailableSpacesRequest = create("BookAvailableSpacesRequest");
const gammaCancelBookAvailableSpaces = exports.gammaCancelBookAvailableSpaces = create("CancelBookAvailableSpaces");
const gammaReserveXTSeats = exports.gammaReserveXTSeats = create("ReserveXTSeats");
const gammaCancelSeats = exports.gammaCancelSeats = create("CancelSeats");
// Membership methods
const gammaChangeMemberDetails = exports.gammaChangeMemberDetails = create("ChangeMemberDetails");
const gammaMembershipPurchase = exports.gammaMembershipPurchase = create("MembershipPurchase");
const gammaMembershipCancellation = exports.gammaMembershipCancellation = create("MembershipCancellation");
const gammaMembershipSubscriptionsLoad = exports.gammaMembershipSubscriptionsLoad = create("MembershipSubscriptionsLoad");
const gammaModifiedMembers = exports.gammaModifiedMembers = create("ModifiedMembers");
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
const availabilityMethods = [{
name: "AllContactInterests",
type: "XMLAllContactInterestRequest",
responseWrapper: "XMLAllContactInterestsResponse",
returnType: false,
endpoint: "availability",
inputFormat: {}
}, {
name: "BookingETicketExportRequest",
type: "XMLBookingETicketExportRequest",
responseWrapper: "BookingTicketExportList",
returnType: "BookingticketList",
endpoint: "availability",
inputFormat: {
BookedDate: "Mandatory"
}
}, {
name: "BookingStatusUpdateCheck",
type: "XMLBookingStatusUpdateCheckRequest",
responseWrapper: "XMLBookingStatusUpdateCheckResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
CheckDate: "Mandatory"
}
}, {
name: "ContactInterests",
type: "XMLContactInterestRequest",
responseWrapper: "XMLContactInterestsResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
myContactID: "Mandatory"
}
}, {
name: "CustomerLoad",
type: "XMLCustomerRequest",
responseWrapper: "XMLCustomer",
returnType: false,
endpoint: "availability",
inputFormat: {
ID: "Optional",
Email: "Recommended",
Postcode: "Recommended",
Lastname: "Recommended",
Password: "Optional",
MemberNumber: "Optional"
}
}, {
name: "EventEditList",
type: "XMLEventRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResView: "Mandatory",
RangeStartDate: "Recommended",
RangeEndDate: "Recommended"
}
}, {
name: "EventListLoad",
type: "XMLEventRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResViewID: "Mandatory",
RangeStartDate: "Recommended",
RangeEndDate: "Recommended"
}
}, {
name: "EventsOnlyListLoad",
type: "XMLEventsOnlyRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
RangeStartDate: "Recommended",
RangeEndDate: "Recommended",
ResView: "Recommended",
EventCode: "Optional",
ShowProductMap: "Optional"
}
}, {
name: "GetBookingHistory",
type: "XMLGetBookingHistoryRequest",
responseWrapper: "XMLGetBookingHistoryResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
CustomerCode: "Mandatory",
VisitStartDate: "Recommended",
VisitEndDate: "Recommended",
Source: "Optional",
Status: "Optional"
}
}, {
name: "GetBookingStatusList",
type: "XMLGetBookingStatusListRequest",
responseWrapper: "XMLGetBookingStatusListResponse",
returnType: false,
endpoint: "availability",
inputFormat: {}
}, {
name: "GetTourList",
type: "XMLTourListRequest",
responseWrapper: "XMLTourListResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
TourCode: "Mandatory"
}
}, {
name: "ProductListLoad",
type: "XMLProductRequest",
responseWrapper: "ProductList",
returnType: "ProductList",
endpoint: "availability",
inputFormat: {
CategoryCode: "Mandatory",
ProdCode: "Optional",
ProductTitle: "Optional",
VisitDate: "Optional",
RequestImages: "Optional",
CustomerCode: "Optional"
}
}, {
name: "ProductMapListLoad",
type: "XMLProductMapRequest",
responseWrapper: "XMLProductMaps",
returnType: "ProductMapList",
endpoint: "availability",
inputFormat: {
MapID: "Optional"
}
}, {
name: "RedeemedBookings",
type: "XMLRedeemedBookingsRequest",
responseWrapper: "XMLRedeemedBookingsResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
RangeStartDate: "Mandatory",
RangeEndDate: "Mandatory",
ResView: "Mandatory"
}
}, {
name: "ResourceDatesListLoad",
type: "XMLResourceDatesRequest",
responseWrapper: "XMLResourceDatesResponse",
returnType: "DateList",
endpoint: "availability",
inputFormat: {
RangeStartDate: "Mandatory",
RangeEndDate: "Mandatory",
EventCode: "Mandatory"
}
}, {
name: "ResourceDatesNotAvailable",
// UNSUPPORTED?
type: "XMLResourceDatesNotAvailableRequest",
responseWrapper: "DateList",
returnType: "DateList",
endpoint: "availability",
inputFormat: {
ResStartDate: "Mandatory",
ResEndDate: "Mandatory",
ResViewID: "Recommended",
EventCode: "Optional",
Visitors: "Optional"
}
}, {
name: "ResourceListByViewByDateLoad",
type: "XMLResourceByViewRangeRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResStartDate: "Mandatory",
ResEndDate: "Mandatory",
ResCode: "Optional",
ResView: "Mandatory",
EventCode: "Optional",
ShowProductMap: "Optional"
}
}, {
name: "ResourceListByViewByDateLoadLight",
// UNSUPPORTED?
type: "XMLResourceByViewLightRequest",
responseWrapper: "DateList",
returnType: "DateList",
endpoint: "availability",
inputFormat: {
ResSelectedDate: "Mandatory",
ResViewID: "Mandatory",
EventCode: "Optional",
Visitors: "Optional",
ShowProductMap: "Optional"
}
}, {
name: "ResourceListByViewLoad",
type: "XMLResourceByViewRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResDate: "Recommended",
ResCode: "Optional",
ResView: "Mandatory",
ShowProductMap: "Optional"
}
}, {
name: "ResourceListLoad",
type: "XMLResourceRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResDate: "Recommended",
ResCode: "Optional",
ShowProductMap: "Optional"
}
}, {
name: "ResourceViewListLoad",
type: "XMLResourceViewsRequest",
responseWrapper: "XMLResourceViews",
returnType: "ResourceViewList",
endpoint: "availability",
inputFormat: {
ResID: "Optional"
}
}, {
name: "ViewResourcesLoad",
type: "XMLViewResources",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResView: "Mandatory",
ShowProductMap: "Optional"
}
}, {
name: "VoucherDiscountCheck",
type: "XMLVoucherDiscountCheck",
responseWrapper: "XMLVoucherDiscountCheckResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
VoucherCode: "Mandatory",
Products: "SEE DOCS",
VoucherVisitDate: "Optional"
}
}, {
name: "VoucherListLoad",
type: "XMLVoucherListRequest",
responseWrapper: "VoucherList",
returnType: "VoucherList",
endpoint: "availability",
inputFormat: {
VouchCode: "Optional"
}
}];
exports.default = availabilityMethods;
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
const bookingsMethods = [{
name: "AmendBooking",
type: "XMLAmendBookingRequest",
responseWrapper: "XMLAmendBookingResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingList: {
Bookings: "SEE DOCS",
PaymentItem: "SEE DOCS"
}
}
}, {
name: "BookingAllSave",
type: "BookingList",
responseWrapper: "XMLSaveBookResponseList",
returnType: "SavedBookingList",
endpoint: "bookings",
inputFormat: {
Bookings: "SEE DOCS",
PaymentItem: "SEE DOCS"
}
}, {
name: "CancelBookingRequest",
type: "XMLCancelBookingRequest",
responseWrapper: "XMLCancelBookingResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingRef: "Mandatory",
mPayment: "SEE DOCS"
}
}, {
name: "RemoveContactInterests",
type: "XMLRemoveContactInterestRequest",
responseWrapper: "XMLRemoveContactInterestResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
ContactID: "Mandatory",
Interests: "SEE DOCS"
}
}, {
name: "SaveCustomerDetails",
type: "Customer",
responseWrapper: "XMLCustomer",
returnType: false,
endpoint: "bookings",
inputFormat: {
Email: "Mandatory",
CCODE: "Optional",
Title: "Recommended",
First: "Mandatory",
Middle: "Optional",
Last: "Mandatory",
HouseNo: "Recommended",
Add1: "Recommended",
Add2: "Optional",
Add3: "Optional",
Add4: "Optional",
City: "Recommended",
County: "Recommended",
PCode: "Recommended",
Country: "Recommended",
TelNo: "Recommended",
EvTelNo: "Optional",
MailingList: "Optional",
Password: "Recommended",
ConsentMail: "Mandatory",
ConsentPhone: "Mandatory",
ConsentSMS: "Mandatory",
ConsentEmail: "Mandatory"
}
}, {
name: "UpdateBooking",
type: "XMLUpdateBookingRequest",
responseWrapper: "XMLUpdateBookingResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingRef: "Mandatory",
Customer: "SEE DOCS",
Products: "SEE DOCS",
UDFList: "SEE DOCS",
PaymentItem: "SEE DOCS"
}
}, {
name: "UpdateBookingStatus",
type: "XMLUpdateBookingStatusRequest",
responseWrapper: "XMLUpdateBookingStatusResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingRef: "Mandatory",
BookingStatus: {
ID: "Mandatory",
BookingStatus: "Recommended"
}
}
}];
exports.default = bookingsMethods;
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _reservationMethods = require("./reservation-methods");
var _reservationMethods2 = _interopRequireDefault(_reservationMethods);
var _bookingsMethods = require("./bookings-methods");
var _bookingsMethods2 = _interopRequireDefault(_bookingsMethods);
var _availabilityMethods = require("./availability-methods");
var _availabilityMethods2 = _interopRequireDefault(_availabilityMethods);
var _membershipMethods = require("./membership-methods");
var _membershipMethods2 = _interopRequireDefault(_membershipMethods);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const gammaMethods = [..._reservationMethods2.default, ..._bookingsMethods2.default, ..._availabilityMethods2.default, ..._membershipMethods2.default];
exports.default = gammaMethods;
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
const membershipMethods = [{
// Change Member Details (Batch)
name: "ChangeMemberDetails",
type: "XMLChangeMemberDetailsRequest",
responseWrapper: "XMLChangeMemberDetailsResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
Members: "SEE DOCS"
}
}, {
// Create Membership / Update Membership
name: "MembershipPurchase",
type: "XMLMembershipPurchaseRequest",
responseWrapper: "XMLMembershipPurchaseResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
MemberNumber: "Mandatory",
GiftAid: "Mandatory",
Customer: "SEE DOCS",
Products: "SEE DOCS",
Joints: "SEE DOCS",
PaymentItem: "SEE DOCS"
}
}, {
name: "MembershipCancellation",
type: "XMLMembershipCancellationRequest",
responseWrapper: "XMLMembershipCancellationResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
MembershipNumber: "Recommended",
PersonRef: "Recommended",
MembershipType: "Recommended",
MemberName: "Optional",
Joints: "SEE DOCS"
}
}, {
// Membership Load
name: "MembershipSubscriptionsLoad",
type: "XMLMemberRequest",
responseWrapper: "MembershipList",
returnType: "MembershipList",
endpoint: "membership",
inputFormat: {
Email: "Recommended",
MemberNumber: "Recommended",
ID: "Recommended"
}
}, {
name: "ModifiedMembers",
type: "XMLModifiedMembersRequest",
responseWrapper: "XMLModifiedMembersResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
StartDate: "Mandatory",
EndDate: "Mandatory"
}
}];
exports.default = membershipMethods;
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
const reservationMethods = [{
name: "BookAvailableSpacesRequest",
type: "XMLBookAvailableSpacesRequest",
responseWrapper: "XMLBookAvailableSpacesResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
VisitDate: "Mandatory",
ResID: "Mandatory",
SessionID: "Mandatory",
VisitorQty: "Mandatory"
}
}, {
name: "CancelBookAvailableSpaces",
type: "XMLCancelBookAvailableSpacesRequest",
responseWrapper: "XMLItemSaveResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
ID: "Mandatory",
ResID: "Optional",
VisitDate: "Optional",
VisitorQty: "Optional"
}
}, {
name: "ReserveXTSeats",
type: "XMLXTSeatReserveRequest",
responseWrapper: "XMLXTSeatReserveResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
Seats: "SEE DOCS",
EventResID: "Mandatory"
}
}, {
name: "CancelSeats",
type: "XMLCancelSeatRequest",
responseWrapper: "XMLCancelSeatResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
Seats: "SEE DOCS"
}
}];
exports.default = reservationMethods;
\ No newline at end of file
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parseResponse = exports.getXml = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; // Utility parsing and wrapping functions for calls to Gamma
var _xmlJs = require("xml-js");
var _xmlJs2 = _interopRequireDefault(_xmlJs);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// INPUT WRAPPERS
const parseInputField = (fieldContents, fieldKey) => {
if (fieldKey === "GammaInputType" || fieldKey === "GammaResponseType") return { _attributes: { "xsi:type": fieldContents } };
if (fieldContents.constructor === Object) return { [fieldKey]: sanitise(fieldContents) };
if (Array.isArray(fieldContents)) {
const arrayOfParsedObjects = fieldContents.map(singleInputObject => {
return sanitise(singleInputObject);
});
return { [fieldKey]: arrayOfParsedObjects };
}
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 sanitisedCallObject = sanitise(callObject);
const fullCall = {
_declaration: { _attributes: { version: "1.0", encoding: "utf-8" } },
XMLRequest: {
_attributes: {
"xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance"
},
Description: { _text: method.name },
Item: _extends({ _attributes: { "xsi:type": method.type }, _text: "" }, sanitisedCallObject)
}
};
const xmlInner = _xmlJs2.default.js2xml(fullCall, { compact: true, spaces: 2, fullTagEmptyElement: true });
const xmlWrapped = _xmlJs2.default.js2xml({ _cdata: xmlInner }, { compact: true, spaces: 2, fullTagEmptyElement: true });
return xmlWrapped;
};
// OUTPUT PARSERS
const parseResponseField = (fieldContents, fieldKey, methodSpecs) => {
if (fieldContents.constructor === Object && Object.keys(fieldContents).length === 0) return { [fieldKey]: "" };
if (methodSpecs.returnType === false && fieldKey === "_attributes" && fieldContents.hasOwnProperty("xmlns:xsi") && fieldContents.hasOwnProperty("xmlns:xsd")) return { GammaResponseType: methodSpecs.responseWrapper };
if (fieldKey === "_attributes" && fieldContents.hasOwnProperty("xsi:type")) return { GammaResponseType: fieldContents["xsi:type"] };
if (fieldContents.hasOwnProperty("_text")) return { [fieldKey]: fieldContents["_text"] };
if (fieldContents.hasOwnProperty("anyType")) return { [fieldKey]: processAnyType(fieldContents.anyType, methodSpecs) };
if (fieldContents.hasOwnProperty(fieldKey)) return { [fieldKey]: parseResponseField(fieldContents[fieldKey], fieldKey) };
if (fieldContents.constructor === Object && Object.keys(fieldContents).length !== 0) {
const formattedContents = Object.keys(fieldContents).reduce((distilledObject, key) => {
return _extends({}, distilledObject, parseResponseField(fieldContents[key], key, methodSpecs));
}, {});
return { [fieldKey]: formattedContents };
}
return { [fieldKey]: fieldContents };
};
const processAnyType = (anyType, methodSpecs) => {
// A single <anyType></anyType> response needs converted for the array operations to work
const anyTypeArray = Array.isArray(anyType) ? anyType : new Array(anyType);
const reduced = anyTypeArray.map(verboseObject => {
const keys = Object.keys(verboseObject);
const distilled = keys.reduce((distilledObject, key) => {
return _extends({}, distilledObject, parseResponseField(verboseObject[key], key, methodSpecs));
}, {});
return distilled;
});
return reduced;
};
const parseResponse = exports.parseResponse = (rawResult, methodSpecs) => {
const jsResponse = _xmlJs2.default.xml2js(rawResult.ReceiveDataResult, { compact: true });
if (jsResponse.hasOwnProperty("LPUnsupported")) return { Message: `The Gamma server responded: ${jsResponse.LPUnsupported.MessageResponse._text}` };
const checkableExtraction = methodSpecs.returnType ? jsResponse[methodSpecs.responseWrapper][methodSpecs.returnType] : jsResponse[methodSpecs.responseWrapper];
if (Object.keys(checkableExtraction).length === 0 && checkableExtraction.constructor === Object) return {}; // Empty response from Gamma
const anyType = methodSpecs.returnType ? checkableExtraction.anyType : checkableExtraction;
return processAnyType(anyType, methodSpecs);
};
\ No newline at end of file
{
"name": "gamma-in-js",
"version": "1.0.0",
"description": "A JavaScript library for wrapping Gamma SOAP API calls",
"main": "dist/index.js",
"author": "Ben Galloway <ben.galloway@gsc.org.uk>",
"license": "MIT",
"private": true,
"files": [
"dist"
],
"scripts": {
"build": "babel src --out-dir dist"
},
"dependencies": {
"debug": "^3.1.0",
"soap-as-promised": "^1.23.0",
"xml-js": "^1.6.2"
},
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-preset-env": "^1.6.1"
}
}
import soap from "soap-as-promised";
import { getXml, parseResponse } from "./util";
import config from "./config";
const callGamma = async (methodSpecs, callParamsObject) => {
try {
const endpoint = config.endpoints[methodSpecs.endpoint];
const client = await soap.createClient(endpoint);
const callDetails = getXml(callParamsObject, methodSpecs);
config.debug(callDetails);
const rawResponse = await client.ReceiveData({ value: callDetails });
config.debug(rawResponse.ReceiveDataResult);
const response = parseResponse(rawResponse, methodSpecs);
config.debug(JSON.stringify(response, null, 2));
if (response.hasOwnProperty("Message")) throw new ReferenceError(response.Message);
return response;
} catch (error) {
throw new Error(`The response from the Gamma server could not be parsed correctly. The error was "${error}"`);
}
};
export default callGamma;
import debug from "debug";
const liveEndpoint = "https://gscticketserver.gsc.org.uk:5729/GDXMLWebService/GDXMLWebService.asmx?WSDL";
const testEndpoint = "https://gscticketserver.gsc.org.uk:5729/GDXMLWebServiceTEST/GDXMLWebService.asmx?WSDL";
const activeEndpoint = process.env.GAMMA_ENV === "live" ? liveEndpoint : testEndpoint;
const config = {
endpoints: {
reservation: activeEndpoint,
bookings: activeEndpoint,
availability: activeEndpoint,
membership: activeEndpoint,
},
debug: debug("gammajs"),
};
export default config;
import gammaMethods from "./methods";
import callGamma from "./callGamma";
import config from "./config";
// Individual exports
const create = (methodName) => {
const methodSpecArray = gammaMethods.filter((methodObject) => methodObject.name === methodName);
if (methodSpecArray.length !== 1) {
throw new ReferenceError(`Cannot uniquely determine a Gamma method called ${methodName}`);
}
const methodSpecObject = methodSpecArray[0];
return (callParams = {}) => {
config.debug(`Method called: ${JSON.stringify(methodSpecObject)}`);
return callGamma(methodSpecObject, callParams);
};
};
// Availability methods
export const gammaAllContactInterests = create("AllContactInterests");
export const gammaBookingETicketExportRequest = create("BookingETicketExportRequest");
export const gammaBookingStatusUpdateCheck = create("BookingStatusUpdateCheck");
export const gammaContactInterests = create("ContactInterests");
export const gammaCustomerLoad = create("CustomerLoad");
export const gammaEventEditList = create("EventEditList");
export const gammaEventListLoad = create("EventListLoad");
export const gammaEventsOnlyListLoad = create("EventsOnlyListLoad");
export const gammaGetBookingHistory = create("GetBookingHistory");
export const gammaGetBookingStatusList = create("GetBookingStatusList");
export const gammaGetTourList = create("GetTourList");
export const gammaProductListLoad = create("ProductListLoad");
export const gammaProductMapListLoad = create("ProductMapListLoad");
export const gammaRedeemedBookings = create("RedeemedBookings");
export const gammaResourceDatesListLoad = create("ResourceDatesListLoad");
export const gammaResourceListByViewByDateLoad = create("ResourceListByViewByDateLoad");
export const gammaResourceListByViewLoad = create("ResourceListByViewLoad");
export const gammaResourceListLoad = create("ResourceListLoad");
export const gammaResourceViewListLoad = create("ResourceViewListLoad");
export const gammaViewResourcesLoad = create("ViewResourcesLoad");
export const gammaVoucherDiscountCheck = create("VoucherDiscountCheck");
export const gammaVoucherListLoad = create("VoucherListLoad");
// These methods seem to be unsupported by the Gamma API (based on testing in May 2018).
// They are not made available individually here, to discourage their use.
//export const gammaResourceDatesNotAvailable = create("ResourceDatesNotAvailable");
//export const gammaResourceListByViewByDateLoadLight = create("ResourceListByViewByDateLoadLight");
// Bookings methods
export const gammaAmendBooking = create("AmendBooking");
export const gammaBookingAllSave = create("BookingAllSave");
export const gammaCancelBookingRequest = create("CancelBookingRequest");
export const gammaRemoveContactInterests = create("RemoveContactInterests");
export const gammaSaveCustomerDetails = create("SaveCustomerDetails");
export const gammaUpdateBooking = create("UpdateBooking");
export const gammaUpdateBookingStatus = create("UpdateBookingStatus");
// Reservation methods
export const gammaBookAvailableSpacesRequest = create("BookAvailableSpacesRequest");
export const gammaCancelBookAvailableSpaces = create("CancelBookAvailableSpaces");
export const gammaReserveXTSeats = create("ReserveXTSeats");
export const gammaCancelSeats = create("CancelSeats");
// Membership methods
export const gammaChangeMemberDetails = create("ChangeMemberDetails");
export const gammaMembershipPurchase = create("MembershipPurchase");
export const gammaMembershipCancellation = create("MembershipCancellation");
export const gammaMembershipSubscriptionsLoad = create("MembershipSubscriptionsLoad");
export const gammaModifiedMembers = create("ModifiedMembers");
const availabilityMethods = [
{
name: "AllContactInterests",
type: "XMLAllContactInterestRequest",
responseWrapper: "XMLAllContactInterestsResponse",
returnType: false,
endpoint: "availability",
inputFormat: {},
},
{
name: "BookingETicketExportRequest",
type: "XMLBookingETicketExportRequest",
responseWrapper: "BookingTicketExportList",
returnType: "BookingticketList",
endpoint: "availability",
inputFormat: {
BookedDate: "Mandatory",
},
},
{
name: "BookingStatusUpdateCheck",
type: "XMLBookingStatusUpdateCheckRequest",
responseWrapper: "XMLBookingStatusUpdateCheckResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
CheckDate: "Mandatory",
},
},
{
name: "ContactInterests",
type: "XMLContactInterestRequest",
responseWrapper: "XMLContactInterestsResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
myContactID: "Mandatory",
},
},
{
name: "CustomerLoad",
type: "XMLCustomerRequest",
responseWrapper: "XMLCustomer",
returnType: false,
endpoint: "availability",
inputFormat: {
ID: "Optional",
Email: "Recommended",
Postcode: "Recommended",
Lastname: "Recommended",
Password: "Optional",
MemberNumber: "Optional",
},
},
{
name: "EventEditList",
type: "XMLEventRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResView: "Mandatory",
RangeStartDate: "Recommended",
RangeEndDate: "Recommended",
},
},
{
name: "EventListLoad",
type: "XMLEventRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResViewID: "Mandatory",
RangeStartDate: "Recommended",
RangeEndDate: "Recommended",
},
},
{
name: "EventsOnlyListLoad",
type: "XMLEventsOnlyRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
RangeStartDate: "Recommended",
RangeEndDate: "Recommended",
ResView: "Recommended",
EventCode: "Optional",
ShowProductMap: "Optional",
},
},
{
name: "GetBookingHistory",
type: "XMLGetBookingHistoryRequest",
responseWrapper: "XMLGetBookingHistoryResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
CustomerCode: "Mandatory",
VisitStartDate: "Recommended",
VisitEndDate: "Recommended",
Source: "Optional",
Status: "Optional",
},
},
{
name: "GetBookingStatusList",
type: "XMLGetBookingStatusListRequest",
responseWrapper: "XMLGetBookingStatusListResponse",
returnType: false,
endpoint: "availability",
inputFormat: {},
},
{
name: "GetTourList",
type: "XMLTourListRequest",
responseWrapper: "XMLTourListResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
TourCode: "Mandatory",
},
},
{
name: "ProductListLoad",
type: "XMLProductRequest",
responseWrapper: "ProductList",
returnType: "ProductList",
endpoint: "availability",
inputFormat: {
CategoryCode: "Mandatory",
ProdCode: "Optional",
ProductTitle: "Optional",
VisitDate: "Optional",
RequestImages: "Optional",
CustomerCode: "Optional",
},
},
{
name: "ProductMapListLoad",
type: "XMLProductMapRequest",
responseWrapper: "XMLProductMaps",
returnType: "ProductMapList",
endpoint: "availability",
inputFormat: {
MapID: "Optional",
},
},
{
name: "RedeemedBookings",
type: "XMLRedeemedBookingsRequest",
responseWrapper: "XMLRedeemedBookingsResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
RangeStartDate: "Mandatory",
RangeEndDate: "Mandatory",
ResView: "Mandatory",
},
},
{
name: "ResourceDatesListLoad",
type: "XMLResourceDatesRequest",
responseWrapper: "XMLResourceDatesResponse",
returnType: "DateList",
endpoint: "availability",
inputFormat: {
RangeStartDate: "Mandatory",
RangeEndDate: "Mandatory",
EventCode: "Mandatory",
},
},
{
name: "ResourceDatesNotAvailable",
// UNSUPPORTED?
type: "XMLResourceDatesNotAvailableRequest",
responseWrapper: "DateList",
returnType: "DateList",
endpoint: "availability",
inputFormat: {
ResStartDate: "Mandatory",
ResEndDate: "Mandatory",
ResViewID: "Recommended",
EventCode: "Optional",
Visitors: "Optional",
},
},
{
name: "ResourceListByViewByDateLoad",
type: "XMLResourceByViewRangeRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResStartDate: "Mandatory",
ResEndDate: "Mandatory",
ResCode: "Optional",
ResView: "Mandatory",
EventCode: "Optional",
ShowProductMap: "Optional",
},
},
{
name: "ResourceListByViewByDateLoadLight",
// UNSUPPORTED?
type: "XMLResourceByViewLightRequest",
responseWrapper: "DateList",
returnType: "DateList",
endpoint: "availability",
inputFormat: {
ResSelectedDate: "Mandatory",
ResViewID: "Mandatory",
EventCode: "Optional",
Visitors: "Optional",
ShowProductMap: "Optional",
},
},
{
name: "ResourceListByViewLoad",
type: "XMLResourceByViewRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResDate: "Recommended",
ResCode: "Optional",
ResView: "Mandatory",
ShowProductMap: "Optional",
},
},
{
name: "ResourceListLoad",
type: "XMLResourceRequest",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResDate: "Recommended",
ResCode: "Optional",
ShowProductMap: "Optional",
},
},
{
name: "ResourceViewListLoad",
type: "XMLResourceViewsRequest",
responseWrapper: "XMLResourceViews",
returnType: "ResourceViewList",
endpoint: "availability",
inputFormat: {
ResID: "Optional",
},
},
{
name: "ViewResourcesLoad",
type: "XMLViewResources",
responseWrapper: "ResourceList",
returnType: "ResList",
endpoint: "availability",
inputFormat: {
ResView: "Mandatory",
ShowProductMap: "Optional",
},
},
{
name: "VoucherDiscountCheck",
type: "XMLVoucherDiscountCheck",
responseWrapper: "XMLVoucherDiscountCheckResponse",
returnType: false,
endpoint: "availability",
inputFormat: {
VoucherCode: "Mandatory",
Products: "SEE DOCS",
VoucherVisitDate: "Optional",
},
},
{
name: "VoucherListLoad",
type: "XMLVoucherListRequest",
responseWrapper: "VoucherList",
returnType: "VoucherList",
endpoint: "availability",
inputFormat: {
VouchCode: "Optional",
},
},
];
export default availabilityMethods;
const bookingsMethods = [
{
name: "AmendBooking",
type: "XMLAmendBookingRequest",
responseWrapper: "XMLAmendBookingResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingList: {
Bookings: "SEE DOCS",
PaymentItem: "SEE DOCS",
},
},
},
{
name: "BookingAllSave",
type: "BookingList",
responseWrapper: "XMLSaveBookResponseList",
returnType: "SavedBookingList",
endpoint: "bookings",
inputFormat: {
Bookings: "SEE DOCS",
PaymentItem: "SEE DOCS",
},
},
{
name: "CancelBookingRequest",
type: "XMLCancelBookingRequest",
responseWrapper: "XMLCancelBookingResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingRef: "Mandatory",
mPayment: "SEE DOCS",
},
},
{
name: "RemoveContactInterests",
type: "XMLRemoveContactInterestRequest",
responseWrapper: "XMLRemoveContactInterestResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
ContactID: "Mandatory",
Interests: "SEE DOCS",
},
},
{
name: "SaveCustomerDetails",
type: "Customer",
responseWrapper: "XMLCustomer",
returnType: false,
endpoint: "bookings",
inputFormat: {
Email: "Mandatory",
CCODE: "Optional",
Title: "Recommended",
First: "Mandatory",
Middle: "Optional",
Last: "Mandatory",
HouseNo: "Recommended",
Add1: "Recommended",
Add2: "Optional",
Add3: "Optional",
Add4: "Optional",
City: "Recommended",
County: "Recommended",
PCode: "Recommended",
Country: "Recommended",
TelNo: "Recommended",
EvTelNo: "Optional",
MailingList: "Optional",
Password: "Recommended",
ConsentMail: "Mandatory",
ConsentPhone: "Mandatory",
ConsentSMS: "Mandatory",
ConsentEmail: "Mandatory",
},
},
{
name: "UpdateBooking",
type: "XMLUpdateBookingRequest",
responseWrapper: "XMLUpdateBookingResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingRef: "Mandatory",
Customer: "SEE DOCS",
Products: "SEE DOCS",
UDFList: "SEE DOCS",
PaymentItem: "SEE DOCS",
},
},
{
name: "UpdateBookingStatus",
type: "XMLUpdateBookingStatusRequest",
responseWrapper: "XMLUpdateBookingStatusResponse",
returnType: false,
endpoint: "bookings",
inputFormat: {
BookingRef: "Mandatory",
BookingStatus: {
ID: "Mandatory",
BookingStatus: "Recommended",
},
},
},
];
export default bookingsMethods;
import reservationMethods from "./reservation-methods";
import bookingsMethods from "./bookings-methods";
import availabilityMethods from "./availability-methods";
import membershipMethods from "./membership-methods";
const gammaMethods = [...reservationMethods, ...bookingsMethods, ...availabilityMethods, ...membershipMethods];
export default gammaMethods;
const membershipMethods = [
{
// Change Member Details (Batch)
name: "ChangeMemberDetails",
type: "XMLChangeMemberDetailsRequest",
responseWrapper: "XMLChangeMemberDetailsResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
Members: "SEE DOCS",
},
},
{
// Create Membership / Update Membership
name: "MembershipPurchase",
type: "XMLMembershipPurchaseRequest",
responseWrapper: "XMLMembershipPurchaseResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
MemberNumber: "Mandatory",
GiftAid: "Mandatory",
Customer: "SEE DOCS",
Products: "SEE DOCS",
Joints: "SEE DOCS",
PaymentItem: "SEE DOCS",
},
},
{
name: "MembershipCancellation",
type: "XMLMembershipCancellationRequest",
responseWrapper: "XMLMembershipCancellationResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
MembershipNumber: "Recommended",
PersonRef: "Recommended",
MembershipType: "Recommended",
MemberName: "Optional",
Joints: "SEE DOCS",
},
},
{
// Membership Load
name: "MembershipSubscriptionsLoad",
type: "XMLMemberRequest",
responseWrapper: "MembershipList",
returnType: "MembershipList",
endpoint: "membership",
inputFormat: {
Email: "Recommended",
MemberNumber: "Recommended",
ID: "Recommended",
},
},
{
name: "ModifiedMembers",
type: "XMLModifiedMembersRequest",
responseWrapper: "XMLModifiedMembersResponse",
returnType: false,
endpoint: "membership",
inputFormat: {
StartDate: "Mandatory",
EndDate: "Mandatory",
},
},
/*
{
name: "CreateCustomer",
alias: "bookings.SaveCustomerDetails",
},
{
name: "CustomerLoad",
alias: "availability.CustomerLoad",
},
{
name: "ProductListLoad",
alias: "availability.ProductListLoad",
},
{
name: "UpdateCustomer",
alias: "bookings.SaveCustomerDetails",
},
{
name: "VoucherDiscountCheck",
alias: "availability.VoucherDiscountCheck",
},
*/
];
export default membershipMethods;
const reservationMethods = [
{
name: "BookAvailableSpacesRequest",
type: "XMLBookAvailableSpacesRequest",
responseWrapper: "XMLBookAvailableSpacesResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
VisitDate: "Mandatory",
ResID: "Mandatory",
SessionID: "Mandatory",
VisitorQty: "Mandatory",
},
},
{
name: "CancelBookAvailableSpaces",
type: "XMLCancelBookAvailableSpacesRequest",
responseWrapper: "XMLItemSaveResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
ID: "Mandatory",
ResID: "Optional",
VisitDate: "Optional",
VisitorQty: "Optional",
},
},
{
name: "ReserveXTSeats",
type: "XMLXTSeatReserveRequest",
responseWrapper: "XMLXTSeatReserveResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
Seats: "SEE DOCS",
EventResID: "Mandatory",
},
},
{
name: "CancelSeats",
type: "XMLCancelSeatRequest",
responseWrapper: "XMLCancelSeatResponse",
returnType: false,
endpoint: "reservation",
inputFormat: {
Seats: "SEE DOCS",
},
},
];
export default reservationMethods;
// Utility parsing and wrapping functions for calls to Gamma
import convert from "xml-js";
// INPUT WRAPPERS
const parseInputField = (fieldContents, fieldKey) => {
if (fieldKey === "GammaInputType" || fieldKey === "GammaResponseType")
return { _attributes: { "xsi:type": fieldContents } };
if (fieldContents.constructor === Object) return { [fieldKey]: sanitise(fieldContents) };
if (Array.isArray(fieldContents)) {
const arrayOfParsedObjects = fieldContents.map((singleInputObject) => {
return sanitise(singleInputObject);
});
return { [fieldKey]: arrayOfParsedObjects };
}
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) => {
const sanitisedCallObject = sanitise(callObject);
const fullCall = {
_declaration: { _attributes: { version: "1.0", encoding: "utf-8" } },
XMLRequest: {
_attributes: {
"xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
},
Description: { _text: method.name },
Item: { _attributes: { "xsi:type": method.type }, _text: "", ...sanitisedCallObject },
},
};
const xmlInner = convert.js2xml(fullCall, { compact: true, spaces: 2, fullTagEmptyElement: true });
const xmlWrapped = convert.js2xml({ _cdata: xmlInner }, { compact: true, spaces: 2, fullTagEmptyElement: true });
return xmlWrapped;
};
// OUTPUT PARSERS
const parseResponseField = (fieldContents, fieldKey, methodSpecs) => {
if (fieldContents.constructor === Object && Object.keys(fieldContents).length === 0) return { [fieldKey]: "" };
if (
methodSpecs.returnType === false &&
fieldKey === "_attributes" &&
fieldContents.hasOwnProperty("xmlns:xsi") &&
fieldContents.hasOwnProperty("xmlns:xsd")
)
return { GammaResponseType: methodSpecs.responseWrapper };
if (fieldKey === "_attributes" && fieldContents.hasOwnProperty("xsi:type"))
return { GammaResponseType: fieldContents["xsi:type"] };
if (fieldContents.hasOwnProperty("_text")) return { [fieldKey]: fieldContents["_text"] };
if (fieldContents.hasOwnProperty("anyType"))
return { [fieldKey]: processAnyType(fieldContents.anyType, methodSpecs) };
if (fieldContents.hasOwnProperty(fieldKey))
return { [fieldKey]: parseResponseField(fieldContents[fieldKey], fieldKey) };
if (fieldContents.constructor === Object && Object.keys(fieldContents).length !== 0) {
const formattedContents = Object.keys(fieldContents).reduce((distilledObject, key) => {
return { ...distilledObject, ...parseResponseField(fieldContents[key], key, methodSpecs) };
}, {});
return { [fieldKey]: formattedContents };
}
return { [fieldKey]: fieldContents };
};
const processAnyType = (anyType, methodSpecs) => {
// A single <anyType></anyType> response needs converted for the array operations to work
const anyTypeArray = Array.isArray(anyType) ? anyType : new Array(anyType);
const reduced = anyTypeArray.map((verboseObject) => {
const keys = Object.keys(verboseObject);
const distilled = keys.reduce((distilledObject, key) => {
return { ...distilledObject, ...parseResponseField(verboseObject[key], key, methodSpecs) };
}, {});
return distilled;
});
return reduced;
};
export const parseResponse = (rawResult, methodSpecs) => {
const jsResponse = convert.xml2js(rawResult.ReceiveDataResult, { compact: true });
if (jsResponse.hasOwnProperty("LPUnsupported"))
return { Message: `The Gamma server responded: ${jsResponse.LPUnsupported.MessageResponse._text}` };
const checkableExtraction = methodSpecs.returnType
? jsResponse[methodSpecs.responseWrapper][methodSpecs.returnType]
: jsResponse[methodSpecs.responseWrapper];
if (Object.keys(checkableExtraction).length === 0 && checkableExtraction.constructor === Object) return {}; // Empty response from Gamma
const anyType = methodSpecs.returnType ? checkableExtraction.anyType : checkableExtraction;
return processAnyType(anyType, methodSpecs);
};
This diff is collapsed.
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