UNPKG

@botonic/plugin-flow-builder

Version:

Use Flow Builder to show your contents

172 lines 9.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FlowBuilderJSONVersion = exports.trackFlowContent = exports.AGENT_RATING_PAYLOAD = void 0; const tslib_1 = require("tslib"); const core_1 = require("@botonic/core"); const uuid_1 = require("uuid"); const api_1 = require("./api"); const constants_1 = require("./constants"); const hubtype_fields_1 = require("./content-fields/hubtype-fields"); const flow_factory_1 = require("./flow-factory"); const functions_1 = require("./functions"); const types_1 = require("./types"); const user_input_1 = require("./user-input"); const utils_1 = require("./utils"); // TODO: Create a proper service to wrap all calls and allow api versioning class BotonicPluginFlowBuilder { constructor(options) { var _a, _b, _c; this.apiUrl = options.apiUrl || constants_1.FLOW_BUILDER_API_URL_PROD; this.jsonVersion = options.jsonVersion || types_1.FlowBuilderJSONVersion.LATEST; this.flow = options.flow; this.getAccessToken = (0, utils_1.resolveGetAccessToken)(options.getAccessToken); this.trackEvent = options.trackEvent; this.getKnowledgeBaseResponse = options.getKnowledgeBaseResponse; this.getAiAgentResponse = options.getAiAgentResponse; this.smartIntentsConfig = Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.smartIntentsConfig), { useLatest: this.jsonVersion === types_1.FlowBuilderJSONVersion.LATEST }); const customFunctions = options.customFunctions || {}; this.functions = customFunctions; this.inShadowing = { allowKeywords: ((_a = options.inShadowing) === null || _a === void 0 ? void 0 : _a.allowKeywords) || false, allowSmartIntents: ((_b = options.inShadowing) === null || _b === void 0 ? void 0 : _b.allowSmartIntents) || false, allowKnowledgeBases: ((_c = options.inShadowing) === null || _c === void 0 ? void 0 : _c.allowKnowledgeBases) || false, }; this.contentFilters = options.contentFilters || []; this.customRatingMessageEnabled = options.customRatingMessageEnabled || false; } resolveFlowUrl(request) { if (request.session.is_test_integration) { return `${this.apiUrl}/v1/bot_flows/{bot_id}/versions/${types_1.FlowBuilderJSONVersion.DRAFT}/`; } return `${this.apiUrl}/v1/bot_flows/{bot_id}/versions/${this.jsonVersion}/`; } pre(request) { return tslib_1.__awaiter(this, void 0, void 0, function* () { // When AI Agent is executed in Whatsapp, button payloads come as referral and must be converted to text being processed by the agent. this.convertWhatsappAiAgentEmptyPayloads(request); this.currentRequest = request; this.cmsApi = yield api_1.FlowBuilderApi.create({ flowUrl: this.resolveFlowUrl(request), url: this.apiUrl, flow: this.flow, accessToken: this.getAccessToken(request.session), request: this.currentRequest, }); const checkUserTextInput = (0, utils_1.inputHasTextData)(request.input) && !request.input.payload; if (checkUserTextInput) { const resolvedLocale = this.cmsApi.getResolvedLocale(); const nodeByUserInput = yield (0, user_input_1.getNodeByUserInput)(this.cmsApi, resolvedLocale, request, this.smartIntentsConfig); request.input.payload = this.cmsApi.getPayload(nodeByUserInput === null || nodeByUserInput === void 0 ? void 0 : nodeByUserInput.target); } this.updateRequestBeforeRoutes(request); }); } convertWhatsappAiAgentEmptyPayloads(request) { var _a; if (request.session.user.provider === core_1.PROVIDER.WHATSAPP) { const shouldUseReferral = request.input.referral && ((_a = request.input.payload) === null || _a === void 0 ? void 0 : _a.startsWith(constants_1.EMPTY_PAYLOAD)); if (shouldUseReferral) { request.input.type = core_1.INPUT.TEXT; request.input.data = request.input.referral; } } } updateRequestBeforeRoutes(request) { if (request.input.payload) { request.input.payload = this.removeSourceSuffix(request.input.payload); if (this.cmsApi.isBotAction(request.input.payload)) { const cmsBotAction = this.cmsApi.getNodeById(request.input.payload); request.input.payload = this.cmsApi.createPayloadWithParams(cmsBotAction); } } } removeSourceSuffix(payload) { return payload.split(constants_1.SOURCE_INFO_SEPARATOR)[0]; } post(request) { request.input.nluResolution = undefined; } getContentsByContentID(contentID, prevContents) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const node = this.cmsApi.getNodeByContentID(contentID); return yield this.getContentsByNode(node, prevContents); }); } getUUIDByContentID(contentID) { const node = this.cmsApi.getNodeByContentID(contentID); return node.id; } getContentsById(id, prevContents) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const node = this.cmsApi.getNodeById(id); return yield this.getContentsByNode(node, prevContents); }); } getStartContents() { return tslib_1.__awaiter(this, void 0, void 0, function* () { const startNode = this.cmsApi.getStartNode(); this.currentRequest.session.flow_thread_id = (0, uuid_1.v7)(); return yield this.getContentsByNode(startNode); }); } getContentsByNode(node, prevContents) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const contents = prevContents || []; const resolvedLocale = this.cmsApi.getResolvedLocale(); if (node.type === hubtype_fields_1.HtNodeWithContentType.FUNCTION && !functions_1.DEFAULT_FUNCTION_NAMES.includes(node.content.action)) { const customFunctionResolver = new functions_1.CustomFunction(this.functions, this.currentRequest, resolvedLocale); const targetId = yield customFunctionResolver.call(node); return this.getContentsById(targetId, contents); } const flowFactory = new flow_factory_1.FlowFactory(this.currentRequest, this.cmsApi, resolvedLocale); const content = yield flowFactory.getFlowContent(node); if (content) { contents.push(content); } // If node is BOT_ACTION not add more contents to render, next nodes render after execute action if (node.type === hubtype_fields_1.HtNodeWithContentType.BOT_ACTION) { return contents; } // TODO: prevent infinite recursive calls if (content && content.followUp) { return this.getContentsById(content.followUp.id, contents); } else if (node.follow_up) { console.log('FOLLOWUP FROM NODE-------> OLD SYSTEM'); return this.getContentsById(node.follow_up.id, contents); } return contents; }); } getPayloadParams(payload) { const payloadParams = JSON.parse(payload.split(constants_1.SEPARATOR)[1] || '{}'); return payloadParams; } getFlowName(flowId) { return this.cmsApi.getFlowName(flowId); } getRatingSubmittedInfo(payload) { const buttonId = payload === null || payload === void 0 ? void 0 : payload.split(constants_1.SEPARATOR)[1]; const ratingNode = this.cmsApi.getRatingNodeByButtonId(buttonId); const ratingButton = this.cmsApi.getRatingButtonById(ratingNode, buttonId); const possibleOptions = ratingNode.content.buttons.map(button => button.text); const possibleValues = ratingNode.content.buttons.map(button => button.value); return Object.assign(Object.assign({}, ratingButton), { possibleOptions, possibleValues }); } } exports.default = BotonicPluginFlowBuilder; tslib_1.__exportStar(require("./action"), exports); var constants_2 = require("./constants"); Object.defineProperty(exports, "AGENT_RATING_PAYLOAD", { enumerable: true, get: function () { return constants_2.AGENT_RATING_PAYLOAD; } }); tslib_1.__exportStar(require("./content-fields"), exports); var tracking_1 = require("./tracking"); Object.defineProperty(exports, "trackFlowContent", { enumerable: true, get: function () { return tracking_1.trackFlowContent; } }); var types_2 = require("./types"); Object.defineProperty(exports, "FlowBuilderJSONVersion", { enumerable: true, get: function () { return types_2.FlowBuilderJSONVersion; } }); tslib_1.__exportStar(require("./webview"), exports); //# sourceMappingURL=index.js.map