UNPKG

@cxco/dcx-connector

Version:

A simple module to retrieve information from DigitalCX

136 lines (120 loc) 4.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = buildResponse; /** * Converts DigitalCX API response payload into a more useful format. * A response could be an answer, a dialog, a t-dialog, a faq * @param {Object} responsePayload */ function buildResponse(responsePayload) { // TODO: should the answer + related FAQs share the same answer or should they be separated? if (responsePayload.hasError) { return responsePayload; } return getAnswerResponse(responsePayload); } /** * Converts the DigitalCX API response payload into a normalized object containing `data` and `metadata`. * Each endpoint has a different payload, so there is a lot of custom code here. * @param {Object} responsePayload */ function getAnswerResponse(responsePayload) { var isTDialog = responsePayload.outputType === 'TDialog'; // could be a list of FAQs or a tree list of Categories. var isStructure = !Object.prototype.hasOwnProperty.call(responsePayload, 'outputType') && !Object.prototype.hasOwnProperty.call(responsePayload, 'outputs'); var output = isTDialog || isStructure ? responsePayload.result : responsePayload.outputs[0]; var isAutoComplete = Array.isArray(responsePayload); var type = 'answer'; var data = {}; var metadata = { sessionId: responsePayload.sessionId, interactionId: responsePayload.interactionId, culture: responsePayload.culture }; if (isAutoComplete) { data = responsePayload; } else if (isTDialog) { type = 'tdialog'; var answer = output.messageResult.text, images = output.images, videos = output.videos, outputAdditions = output.metadata, dialogOptions = output.dialogOptions, links = output.links; data = { type: type, answer: answer, images: images, videos: videos, outputAdditions: outputAdditions, dialogOptions: dialogOptions, links: links }; metadata.tDialogState = output.tDialogState; metadata.isDialogEnd = output.isEnd; metadata.quickReplies = output.quickReplies; metadata.okMessages = output.okMessages; metadata.slots = output.slots; metadata.returnEvent = output.returnEvent; metadata.id = output.dialogId; } else if (isStructure) { data = {}; // type: category || faq if (Array.isArray(output)) { if (output[0] !== undefined) { if (Object.prototype.hasOwnProperty.call(output[0], 'name')) { data.type = 'category'; } else { data.type = 'faq'; } data.result = output; } } // type: faqsearch if (output && Object.prototype.hasOwnProperty.call(output, 'matches') && Object.prototype.hasOwnProperty.call(output, 'related')) { data.type = 'faqsearch'; data.result = output; } } else { if (output) { // dialog metadata if (output.dialogPath) { metadata.dialogPath = output.dialogPath; metadata.isDialogStart = !/\//.test(output.dialogPath); metadata.isDialogEnd = /!$/.test(output.dialogPath); type = 'dialog'; } // no answers frequently return escalation_1x_noanswer if (/^(escalation|exception)/i.test(output.interactionValue)) { metadata.escalation = output.interactionValue; } if (output.faqQuestion) { metadata.faqQuestion = output.faqQuestion; } metadata.id = output.kbaId; output.outputParts.forEach(function (outputPart) { if (outputPart.type === 'relatedFAQs') { metadata.relatedFaqs = outputPart.faQs; } else { var _answer = outputPart.text, _images = outputPart.images, _videos = outputPart.videos, _outputAdditions = outputPart.metadata, _dialogOptions = outputPart.dialogOptions, _links = outputPart.links; data = { type: type, answer: _answer, images: _images, videos: _videos, outputAdditions: _outputAdditions, dialogOptions: _dialogOptions, links: _links }; } }); } } return { data: data, metadata: metadata }; }