@botonic/plugin-flow-builder
Version:
Use Flow Builder to show your contents
172 lines • 9.09 kB
JavaScript
"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