From af680480008ccc65f9302ce5f44b8316c0e90fbf Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Fri, 3 Nov 2023 16:32:49 +0530 Subject: [PATCH 1/8] revert cherry pick --- packages/rule-engine/src/ActionExecutor.ts | 14 ++++++- packages/rule-engine/src/RuleProcessor.ts | 37 ++++++++++++---- packages/rule-engine/src/TimerRuleEngine.ts | 21 +++------- packages/rule-engine/src/Utils.ts | 20 ++++++++- packages/rule-engine/src/index.ts | 13 ++++++ .../rule-engine/src/models/error-codes.ts | 2 + .../rule-engine/src/models/rule-engine.ts | 1 + packages/rule-engine/src/models/rule.ts | 7 ++++ .../recommended/actions/assign-to-agent.ts | 7 +--- .../recommended/actions/assign-to-group.ts | 7 +--- .../actions/create-freshdesk-ticket.ts | 7 +--- .../src/recommended/actions/reopen.ts | 7 +--- .../src/recommended/actions/resolve.ts | 7 +--- .../recommended/actions/send-email-anyone.ts | 7 +--- .../recommended/actions/send-email-user.ts | 7 +--- .../src/recommended/actions/send-message.ts | 7 +--- .../recommended/actions/send-private-note.ts | 7 +--- .../recommended/actions/send-quickreply.ts | 7 +--- .../src/recommended/actions/trigger-api.ts | 42 ++++++++++++++++--- .../actions/unassign-then-reassign-group.ts | 7 +--- .../src/recommended/actions/update-status.ts | 7 +--- .../recommended/actions/update-user-email.ts | 7 +--- .../actions/update-user-first-name.ts | 7 +--- .../actions/update-user-last-name.ts | 7 +--- .../recommended/actions/update-user-phone.ts | 7 +--- .../actions/update-user-property.ts | 7 +--- .../src/recommended/conditions/email-body.ts | 23 ++++++++++ .../transcript-conv-entire-html.ts | 12 +++++- ...onv-entire-includes-private-system-html.ts | 12 +++++- ...onv-entire-includes-private-system-text.ts | 12 +++++- .../transcript-conv-entire-text.ts | 12 +++++- ...transcript-conv-since-last-resolve-html.ts | 12 +++++- ...st-resolve-includes-private-system-html.ts | 12 +++++- ...st-resolve-includes-private-system-text.ts | 12 +++++- ...transcript-conv-since-last-resolve-text.ts | 12 +++++- .../transcript-paytm-conv-entire-html.ts | 12 +++++- packages/rule-engine/src/recommended/index.ts | 2 + .../trigger-actions/first-sla-breach.ts | 2 +- .../trigger-actions/next-sla-breach.ts | 2 +- 39 files changed, 278 insertions(+), 135 deletions(-) create mode 100644 packages/rule-engine/src/recommended/conditions/email-body.ts diff --git a/packages/rule-engine/src/ActionExecutor.ts b/packages/rule-engine/src/ActionExecutor.ts index 371821a4..664babf9 100644 --- a/packages/rule-engine/src/ActionExecutor.ts +++ b/packages/rule-engine/src/ActionExecutor.ts @@ -11,11 +11,13 @@ import { LabelCategory, LabelSubcategory, } from '@freshworks-jaya/marketplace-models'; -import { Action, Api, CustomPlaceholdersMap } from './models/rule'; +import { Action, AnyJson, Api, CustomPlaceholdersMap } from './models/rule'; import { Integrations, RuleEngineOptions } from './models/rule-engine'; import ruleConfig from './RuleConfig'; import { isUsernameGenerated, PlaceholdersMap, capitalizeAll } from '@freshworks-jaya/utilities'; import { Utils } from './Utils'; +import { APITraceCodes } from './models/error-codes'; +import { LogSeverity } from './services/GoogleCloudLogging'; export class ActionExecutor { /** @@ -162,6 +164,16 @@ export class ActionExecutor { // Error while executing an action // Queietly suppressing it so that next action can be executed // So, doing nothing here + + if (options.enableLogger) { + Utils.log( + productEventPayload, + integrations, + APITraceCodes.ACTION_HANDLER_ERROR, + err as AnyJson, + LogSeverity.NOTICE, + ); + } } } diff --git a/packages/rule-engine/src/RuleProcessor.ts b/packages/rule-engine/src/RuleProcessor.ts index 261342d1..8c012654 100644 --- a/packages/rule-engine/src/RuleProcessor.ts +++ b/packages/rule-engine/src/RuleProcessor.ts @@ -1,10 +1,13 @@ // Simple library to process the rules -import { Event } from '@freshworks-jaya/marketplace-models'; +import { Event, ProductEventPayload } from '@freshworks-jaya/marketplace-models'; import { ProductEventData } from '@freshworks-jaya/marketplace-models'; -import { Block, Condition, MatchType, Rule, Trigger, TriggerAction, TriggerActor } from './models/rule'; +import { AnyJson, Block, Condition, MatchType, Rule, Trigger, TriggerAction, TriggerActor } from './models/rule'; import { Integrations, RuleEngineOptions } from './models/rule-engine'; import { Promise } from 'bluebird'; import ruleConfig from './RuleConfig'; +import { Utils } from './Utils'; +import { APITraceCodes } from './models/error-codes'; +import { LogSeverity } from './services/GoogleCloudLogging'; export class RuleProcessor { /** @@ -71,9 +74,14 @@ export class RuleProcessor { public static isTriggerActorMatch(actor: TriggerActor, productEventData: ProductEventData): boolean { const triggerActorFunc = ruleConfig.triggerActors && ruleConfig.triggerActors[actor.type]; - if (triggerActorFunc) { - return triggerActorFunc(productEventData, actor); + try { + if (triggerActorFunc) { + return triggerActorFunc(productEventData, actor); + } + } catch (error) { + throw new Error('Invalid trigger actor : ' + JSON.stringify(actor)); } + throw new Error('Invalid trigger actor'); } @@ -83,9 +91,14 @@ export class RuleProcessor { public static isTriggerActionMatch(action: TriggerAction, event: Event, productEventData: ProductEventData): boolean { const triggerActionFunc = ruleConfig.triggerActions && ruleConfig.triggerActions[action.type]; - if (triggerActionFunc) { - return triggerActionFunc(event, productEventData, action); + try { + if (triggerActionFunc) { + return triggerActionFunc(event, productEventData, action); + } + } catch (error) { + throw new Error('Invalid trigger action : ' + action.type); } + throw new Error('Invalid trigger action'); } @@ -196,7 +209,17 @@ export class RuleProcessor { await this.isRuleMatching(event, productEventData, currentRule, integrations, options); firstMatchingRule = currentRule; break; - } catch (err) {} + } catch (err) { + if (options.enableLogger) { + Utils.log( + productEventData as unknown as ProductEventPayload, + integrations, + APITraceCodes.FIRST_MATCHING_RULE, + err as AnyJson, + LogSeverity.NOTICE, + ); + } + } } } return firstMatchingRule ? Promise.resolve(firstMatchingRule) : Promise.reject('no matching rule'); diff --git a/packages/rule-engine/src/TimerRuleEngine.ts b/packages/rule-engine/src/TimerRuleEngine.ts index 530fd148..cc1ab3d3 100644 --- a/packages/rule-engine/src/TimerRuleEngine.ts +++ b/packages/rule-engine/src/TimerRuleEngine.ts @@ -2,6 +2,7 @@ import Kairos, { KairosSchedule, KairosScheduleOptions } from '@freshworks-jaya/ import { Event, ProductEventPayload, ProductEventData, ModelProperties } from '@freshworks-jaya/marketplace-models'; import { ActionExecutor } from './ActionExecutor'; import { + AnyJson, Api, CustomPlaceholdersMap, Rule, @@ -150,10 +151,7 @@ export class TimerRuleEngine { integrations, ErrorCodes.KairosError, { - error: { - data: err?.response?.data, - responseHeaders: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.KairosBulkCreateSchedules, jobIds: schedulesToCreate.map((schedule) => schedule.jobId), }, @@ -200,10 +198,7 @@ export class TimerRuleEngine { integrations, ErrorCodes.KairosError, { - error: { - data: err?.response?.data, - responseHeaders: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.KairosDeleteCompletedSchedule, jobId: externalEventPayload.data?.jobId, }, @@ -344,10 +339,7 @@ export class TimerRuleEngine { integrations, ErrorCodes.KairosError, { - error: { - data: err?.response?.data, - responseHeaders: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.KairosCreteScheduleToDelayInvalidation, jobId: createScheduleJobId, }, @@ -378,10 +370,7 @@ export class TimerRuleEngine { integrations, ErrorCodes.KairosError, { - error: { - data: err?.response?.data, - responseHeaders: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.KairosDeleteInvalidatedSchedules, jobIds: jobsToDelete, }, diff --git a/packages/rule-engine/src/Utils.ts b/packages/rule-engine/src/Utils.ts index 93e4a904..64fe97f6 100644 --- a/packages/rule-engine/src/Utils.ts +++ b/packages/rule-engine/src/Utils.ts @@ -135,6 +135,24 @@ export class Utils { return messageContent; } + /** + * Gets a concatenated string of messageParts with type 'email'. + */ + public static getMessagePartsEmailContent(messageParts: MessagePart[]): string { + let messageContent = ''; + + if (messageParts && messageParts.length) { + messageContent = messageParts + .filter((messagePart) => messagePart.email) + .map((messagePart) => { + return messagePart.email && messagePart.email.content; + }) + .join(' '); + } + + return messageContent; + } + public static processHanldebars(value: string, placeholders: PlaceholdersMap): string { let processedString = ''; let isError = false; @@ -195,7 +213,7 @@ export class Utils { } catch (err) { this.log(productEventPayload, integrations, ErrorCodes.DynamicPlaceholder, { dynamicPlaceholderKey, - error: err, + error: err as AnyJson, }); } } diff --git a/packages/rule-engine/src/index.ts b/packages/rule-engine/src/index.ts index 769ffcfe..d81fc676 100644 --- a/packages/rule-engine/src/index.ts +++ b/packages/rule-engine/src/index.ts @@ -5,6 +5,10 @@ import { RuleEngineExternalEventPayload, KairosCredentials, } from './models/rule-engine'; +import { AnyJson } from './models/rule'; +import { Utils } from './Utils'; +import { ErrorCodes } from './models/error-codes'; +import { LogSeverity } from './services/GoogleCloudLogging'; import { Api, CustomPlaceholdersMap, Rule } from './models/rule'; import { RulePlugin } from './models/plugin'; @@ -82,6 +86,15 @@ export class RuleEngine { ); } } catch (err) { + Utils.log( + payload, + integrations, + ErrorCodes.FreshchatAction, + { + error: err as AnyJson, + }, + LogSeverity.ALERT, + ); return Promise.reject(err); } diff --git a/packages/rule-engine/src/models/error-codes.ts b/packages/rule-engine/src/models/error-codes.ts index ca03886f..d9d41c0f 100644 --- a/packages/rule-engine/src/models/error-codes.ts +++ b/packages/rule-engine/src/models/error-codes.ts @@ -40,8 +40,10 @@ export enum ErrorTypes { } export enum APITraceCodes { + ACTION_HANDLER_ERROR = 'ACTION_HANDLER_ERROR', CREATE_SCHEDULE_SUCCESS = 'CREATE_SCHEDULE_SUCCESS', DELAY_SCHEDULE_CREATION = 'DELAY_SCHEDULE_CREATION', EXECUTE_SCHEDULE_SUCCESS = 'EXECUTE_SCHEDULE_SUCCESS', + FIRST_MATCHING_RULE = 'FIRST_MATCHING_RULE', INVALIDATE_SCHEDULE_SUCCESS = 'INVALIDATE_SCHEDULE_SUCCESS', } diff --git a/packages/rule-engine/src/models/rule-engine.ts b/packages/rule-engine/src/models/rule-engine.ts index 6b7abdaa..54bc3671 100644 --- a/packages/rule-engine/src/models/rule-engine.ts +++ b/packages/rule-engine/src/models/rule-engine.ts @@ -3,6 +3,7 @@ import { RequestProxy } from '@freshworks-jaya/marketplace-models/lib/services/r import { GoogleCloudLoggingConfig } from '../services/GoogleCloudLogging'; export interface RuleEngineOptions { + enableLogger?: boolean; // this is to be enabled only for debugging, should be disabled afterwards isSchedulerEnabled: boolean; isUseStaticIP: boolean; maxProductEventDelay: number; diff --git a/packages/rule-engine/src/models/rule.ts b/packages/rule-engine/src/models/rule.ts index 0aae0bcd..8dc8c406 100644 --- a/packages/rule-engine/src/models/rule.ts +++ b/packages/rule-engine/src/models/rule.ts @@ -63,6 +63,7 @@ export enum ConditionKey { CallStatus = 'CALL_STATUS', CallType = 'CALL_TYPE', Channel = 'CHANNEL', + EmailBody = 'EMAIL_BODY', LabelCategoryName = 'LABEL_CATEGORY_NAME', LabelSubcategoryName = 'LABEL_SUBCATEGORY_NAME', MessageText = 'MESSAGE_TEXT', @@ -165,6 +166,12 @@ export interface TriggerWebhookValue { password: string; username: string; }; + castArray?: [ + { + key: string; + type: string; + }, + ]; content?: string; contentType?: WebhookContentType; customHeaders?: string; diff --git a/packages/rule-engine/src/recommended/actions/assign-to-agent.ts b/packages/rule-engine/src/recommended/actions/assign-to-agent.ts index 47a70d44..db3ec324 100644 --- a/packages/rule-engine/src/recommended/actions/assign-to-agent.ts +++ b/packages/rule-engine/src/recommended/actions/assign-to-agent.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -63,10 +63,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatAssignAgent, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/assign-to-group.ts b/packages/rule-engine/src/recommended/actions/assign-to-group.ts index b03d0786..a1fbc05a 100644 --- a/packages/rule-engine/src/recommended/actions/assign-to-group.ts +++ b/packages/rule-engine/src/recommended/actions/assign-to-group.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -56,10 +56,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatAssignGroup, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/create-freshdesk-ticket.ts b/packages/rule-engine/src/recommended/actions/create-freshdesk-ticket.ts index a4ece81b..a049030a 100644 --- a/packages/rule-engine/src/recommended/actions/create-freshdesk-ticket.ts +++ b/packages/rule-engine/src/recommended/actions/create-freshdesk-ticket.ts @@ -6,7 +6,7 @@ import Freshchat, { User as FreshchatUser } from '@freshworks-jaya/freshchat-api import { Utils as FreshchatUtils } from '@freshworks-jaya/freshchat-api/lib/Utils'; import { isUsernameGenerated } from '@freshworks-jaya/utilities'; import { Utils } from '../../Utils'; -import { Api, WebhookRequestType } from '../../models/rule'; +import { AnyJson, Api, WebhookRequestType } from '../../models/rule'; import { ErrorCodes } from '../../models/error-codes'; import Constants from '../Constants'; @@ -193,10 +193,7 @@ export default async ( ); } catch (err) { Utils.log(productEventPayload, integrations, ErrorCodes.FreshdeskTicket, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, }); return Promise.reject('Error creating freshdesk ticket'); } diff --git a/packages/rule-engine/src/recommended/actions/reopen.ts b/packages/rule-engine/src/recommended/actions/reopen.ts index 18c8a15d..3aa7a904 100644 --- a/packages/rule-engine/src/recommended/actions/reopen.ts +++ b/packages/rule-engine/src/recommended/actions/reopen.ts @@ -2,7 +2,7 @@ import { ConversationStatus, ProductEventPayload } from '@freshworks-jaya/market import Freshchat from '@freshworks-jaya/freshchat-api'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { Utils } from '../../Utils'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -30,10 +30,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatReopenConversation, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/resolve.ts b/packages/rule-engine/src/recommended/actions/resolve.ts index 8c729515..6020dd21 100644 --- a/packages/rule-engine/src/recommended/actions/resolve.ts +++ b/packages/rule-engine/src/recommended/actions/resolve.ts @@ -2,7 +2,7 @@ import { ConversationStatus, ProductEventPayload } from '@freshworks-jaya/market import Freshchat from '@freshworks-jaya/freshchat-api'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { Utils } from '../../Utils'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -30,10 +30,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatResolveConversation, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/send-email-anyone.ts b/packages/rule-engine/src/recommended/actions/send-email-anyone.ts index 04b1f6a8..6d44b0c2 100644 --- a/packages/rule-engine/src/recommended/actions/send-email-anyone.ts +++ b/packages/rule-engine/src/recommended/actions/send-email-anyone.ts @@ -1,7 +1,7 @@ import { ProductEventPayload } from '@freshworks-jaya/marketplace-models'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import axios from 'axios'; -import { Api, SendEmailAnyoneValue } from '../../models/rule'; +import { AnyJson, Api, SendEmailAnyoneValue } from '../../models/rule'; import { Utils } from '../../Utils'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { ErrorCodes } from '../../models/error-codes'; @@ -87,10 +87,7 @@ export default async ( ); } catch (err) { Utils.log(productEventPayload, integrations, ErrorCodes.SendEmail, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, }); return Promise.reject('Failed to setup dynamic placeholders'); } diff --git a/packages/rule-engine/src/recommended/actions/send-email-user.ts b/packages/rule-engine/src/recommended/actions/send-email-user.ts index d6a888d0..9ab51f82 100644 --- a/packages/rule-engine/src/recommended/actions/send-email-user.ts +++ b/packages/rule-engine/src/recommended/actions/send-email-user.ts @@ -3,7 +3,7 @@ import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import Freshchat from '@freshworks-jaya/freshchat-api'; import axios from 'axios'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { Utils } from '../../Utils'; import { ErrorCodes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -88,10 +88,7 @@ export default async ( ); } catch (err) { Utils.log(productEventPayload, integrations, ErrorCodes.SendEmail, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, }); return Promise.reject('Error sending conversation as html via email'); } diff --git a/packages/rule-engine/src/recommended/actions/send-message.ts b/packages/rule-engine/src/recommended/actions/send-message.ts index 85f8787e..29ee0115 100644 --- a/packages/rule-engine/src/recommended/actions/send-message.ts +++ b/packages/rule-engine/src/recommended/actions/send-message.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -44,10 +44,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatSendMessage, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/send-private-note.ts b/packages/rule-engine/src/recommended/actions/send-private-note.ts index 91a6c27d..d423ee5e 100644 --- a/packages/rule-engine/src/recommended/actions/send-private-note.ts +++ b/packages/rule-engine/src/recommended/actions/send-private-note.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -48,10 +48,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatSendPrivateNote, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/send-quickreply.ts b/packages/rule-engine/src/recommended/actions/send-quickreply.ts index 97c3df1c..63f66bd2 100644 --- a/packages/rule-engine/src/recommended/actions/send-quickreply.ts +++ b/packages/rule-engine/src/recommended/actions/send-quickreply.ts @@ -1,7 +1,7 @@ import { ProductEventPayload } from '@freshworks-jaya/marketplace-models'; import Freshchat from '@freshworks-jaya/freshchat-api'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; -import { Api, QuickReplyValue } from '../../models/rule'; +import { AnyJson, Api, QuickReplyValue } from '../../models/rule'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Utils } from '../../Utils'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; @@ -63,10 +63,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatSendQuickReply, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/trigger-api.ts b/packages/rule-engine/src/recommended/actions/trigger-api.ts index ec5a6d5e..3b193de5 100644 --- a/packages/rule-engine/src/recommended/actions/trigger-api.ts +++ b/packages/rule-engine/src/recommended/actions/trigger-api.ts @@ -2,6 +2,7 @@ import { ProductEventPayload } from '@freshworks-jaya/marketplace-models'; import { requestAxiosWrapper } from '@freshworks-jaya/marketplace-models/lib/services/request'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { + AnyJson, Api, JsonArray, JsonMap, @@ -16,6 +17,7 @@ import { Utils } from '../../Utils'; import * as _ from 'lodash'; import { ErrorCodes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; +import { set, get } from 'lodash'; const contentTypeMap: { [key in WebhookContentType]: string; @@ -168,8 +170,34 @@ const handleContentTypeHeader = ( } return { data, headers }; +}; + +const handleFieldTypeCast = (config: TriggerWebhookValue, replacedData: string) => { + const data = replacedData ? JSON.parse(replacedData) : {}; + + if (config?.castArray?.length) { + const castArray = config?.castArray; + + for (let i = 0; i < castArray.length; ++i) { + const { key, type } = castArray[i]; + + switch (type) { + case 'boolean': + set(data, key, Boolean(get(data, key))); + break; + case 'number': + set(data, key, Number(get(data, key))); + break; + case 'string': + default: + set(data, key, String(get(data, key))); + break; + } + } + } -} + return JSON.stringify(data); +}; export default async ( integrations: Integrations, @@ -209,6 +237,13 @@ export default async ( const dateBeforeTrigger = new Date(); let webhookResponse; + // Cast API content to specific type + try { + axiosRequestConfig.data = handleFieldTypeCast(triggerApi.config, axiosRequestConfig.data); + } catch (err) { + return Promise.reject('Failed to type cast dynamic placeholders map'); + } + try { // Step 6: Make the API call webhookResponse = await requestAxiosWrapper(axiosRequestConfig, { @@ -234,10 +269,7 @@ export default async ( } catch (err) { Utils.log(productEventPayload, integrations, ErrorCodes.TriggerAPIError, { apiName: triggerApi.name, - error: { - code: err.code, - message: err.message, - }, + error: err as AnyJson, }); return Promise.reject('Trigger webhook failure'); } diff --git a/packages/rule-engine/src/recommended/actions/unassign-then-reassign-group.ts b/packages/rule-engine/src/recommended/actions/unassign-then-reassign-group.ts index 680150db..2e5de73b 100644 --- a/packages/rule-engine/src/recommended/actions/unassign-then-reassign-group.ts +++ b/packages/rule-engine/src/recommended/actions/unassign-then-reassign-group.ts @@ -2,7 +2,7 @@ import { ConversationStatus, ProductEventPayload } from '@freshworks-jaya/market import Freshchat from '@freshworks-jaya/freshchat-api'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { Utils } from '../../Utils'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -40,10 +40,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatUnassignThenReassign, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/update-status.ts b/packages/rule-engine/src/recommended/actions/update-status.ts index 011303b6..34dd15f3 100644 --- a/packages/rule-engine/src/recommended/actions/update-status.ts +++ b/packages/rule-engine/src/recommended/actions/update-status.ts @@ -2,7 +2,7 @@ import { ConversationStatus, ProductEventPayload } from '@freshworks-jaya/market import Freshchat from '@freshworks-jaya/freshchat-api'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { Utils } from '../../Utils'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -44,10 +44,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatReopenConversation, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/update-user-email.ts b/packages/rule-engine/src/recommended/actions/update-user-email.ts index 4592a6ac..72ddc795 100644 --- a/packages/rule-engine/src/recommended/actions/update-user-email.ts +++ b/packages/rule-engine/src/recommended/actions/update-user-email.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -44,10 +44,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatUpdateEmail, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/update-user-first-name.ts b/packages/rule-engine/src/recommended/actions/update-user-first-name.ts index bb2e14cf..6d33bfec 100644 --- a/packages/rule-engine/src/recommended/actions/update-user-first-name.ts +++ b/packages/rule-engine/src/recommended/actions/update-user-first-name.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -44,10 +44,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatUpdateFirstName, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/update-user-last-name.ts b/packages/rule-engine/src/recommended/actions/update-user-last-name.ts index ddd1f3a9..91f2e2c4 100644 --- a/packages/rule-engine/src/recommended/actions/update-user-last-name.ts +++ b/packages/rule-engine/src/recommended/actions/update-user-last-name.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -44,10 +44,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatUpdateLastName, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/update-user-phone.ts b/packages/rule-engine/src/recommended/actions/update-user-phone.ts index c6ef3ea3..a8298363 100644 --- a/packages/rule-engine/src/recommended/actions/update-user-phone.ts +++ b/packages/rule-engine/src/recommended/actions/update-user-phone.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { Utils } from '../../Utils'; -import { Api } from '../../models/rule'; +import { AnyJson, Api } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -44,10 +44,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatUpdatePhone, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/actions/update-user-property.ts b/packages/rule-engine/src/recommended/actions/update-user-property.ts index 130114b3..bf7c9f1f 100644 --- a/packages/rule-engine/src/recommended/actions/update-user-property.ts +++ b/packages/rule-engine/src/recommended/actions/update-user-property.ts @@ -3,7 +3,7 @@ import Freshchat from '@freshworks-jaya/freshchat-api'; import { PlaceholdersMap } from '@freshworks-jaya/utilities'; import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; import { Utils } from '../../Utils'; -import { Api, UserConditionValue } from '../../models/rule'; +import { AnyJson, Api, UserConditionValue } from '../../models/rule'; import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; @@ -52,10 +52,7 @@ export default async ( integrations, ErrorCodes.FreshchatAction, { - error: { - data: err?.response?.data, - headers: err?.response?.headers, - }, + error: err as AnyJson, errorType: ErrorTypes.FreshchatUpdateProperty, }, LogSeverity.ERROR, diff --git a/packages/rule-engine/src/recommended/conditions/email-body.ts b/packages/rule-engine/src/recommended/conditions/email-body.ts new file mode 100644 index 00000000..2646400e --- /dev/null +++ b/packages/rule-engine/src/recommended/conditions/email-body.ts @@ -0,0 +1,23 @@ +import { ProductEventData } from '@freshworks-jaya/marketplace-models'; +import { Condition } from '../../models/rule'; +import { Utils } from '../../Utils'; +import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; + +export default ( + condition: Condition, + productEventData: ProductEventData, + integrations: Integrations, + options: RuleEngineOptions, + ruleAlias: string, +): Promise => { + const modelProperties = productEventData.conversation || productEventData.message; + + return Utils.evaluateCondition( + condition.operator, + Utils.getMessagePartsEmailContent((modelProperties.messages && modelProperties.messages[0]?.message_parts) || []), + condition.value as string, + integrations, + options, + ruleAlias, + ); +}; diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-html.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-html.ts index 526f42b4..9c3678be 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-html.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-html.ts @@ -42,8 +42,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptEntireHtml, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-html.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-html.ts index 7c5d5aa3..ed8f378b 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-html.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-html.ts @@ -38,8 +38,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptEntirePrivateSystemHtml, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-text.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-text.ts index e986d046..befed41f 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-text.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-includes-private-system-text.ts @@ -39,8 +39,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptEntirePrivateSystemText, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-text.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-text.ts index 88824772..be2bc5c5 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-text.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-entire-text.ts @@ -43,8 +43,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptEntireText, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-html.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-html.ts index 498cd7e3..77093e13 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-html.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-html.ts @@ -43,8 +43,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptLastResolveHtml, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-html.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-html.ts index 44913ad1..12dfd15c 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-html.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-html.ts @@ -39,8 +39,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptLastResolvePrivateSystemHtml, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-text.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-text.ts index 94c040b1..85c04505 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-text.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-text.ts @@ -40,8 +40,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptLastResolvePrivateSystemText, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-text.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-text.ts index f4244a81..00bb4534 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-text.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-conv-since-last-resolve-text.ts @@ -44,8 +44,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptLastResolveText, }, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-entire-html.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-entire-html.ts index af5e3471..2020d092 100644 --- a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-entire-html.ts +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-entire-html.ts @@ -43,8 +43,16 @@ export default ( ErrorCodes.FreshchatPlaceholder, { error: { - data: err?.response?.data, - headers: err?.response?.headers, + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, }, errorType: ErrorTypes.TranscriptEntireHtml, }, diff --git a/packages/rule-engine/src/recommended/index.ts b/packages/rule-engine/src/recommended/index.ts index 99e5de93..4a21b7f7 100644 --- a/packages/rule-engine/src/recommended/index.ts +++ b/packages/rule-engine/src/recommended/index.ts @@ -74,6 +74,7 @@ import conditionLabelSubcategoryName from './conditions/label-subcategory-name'; import conditionSLAName from './conditions/sla-name'; import conditionCallStatus from './conditions/call-status'; import conditionCallType from './conditions/call-type'; +import conditionEmailBody from './conditions/email-body'; // Import all dynamic placeholders import dynamicPlaceholderAverageWaitTime from './dynamic-placeholders/average-wait-time'; @@ -129,6 +130,7 @@ const recommendedPlugins: RulePlugin[] = [ [ConditionKey.SLAName]: conditionSLAName, [ConditionKey.CallStatus]: conditionCallStatus, [ConditionKey.CallType]: conditionCallType, + [ConditionKey.EmailBody]: conditionEmailBody, }, dynamicPlaceholders: { 'conversation.url': dynamicPlaceholderConversationUrl, diff --git a/packages/rule-engine/src/recommended/trigger-actions/first-sla-breach.ts b/packages/rule-engine/src/recommended/trigger-actions/first-sla-breach.ts index 2fa5487d..130336f1 100644 --- a/packages/rule-engine/src/recommended/trigger-actions/first-sla-breach.ts +++ b/packages/rule-engine/src/recommended/trigger-actions/first-sla-breach.ts @@ -5,7 +5,7 @@ export default (productEvent: Event, productEventData: ProductEventData, trigger return ( productEvent === Event.ConversationUpdate && !!productEventData.changes.model_changes && - productEventData.changes.model_changes.sla_breach[1] && + !!productEventData.changes.model_changes?.sla_breach[1] && productEventData.conversation.response_due_type === 'FIRST_RESPONSE_DUE' ); }; diff --git a/packages/rule-engine/src/recommended/trigger-actions/next-sla-breach.ts b/packages/rule-engine/src/recommended/trigger-actions/next-sla-breach.ts index 95ff7493..7dc422b2 100644 --- a/packages/rule-engine/src/recommended/trigger-actions/next-sla-breach.ts +++ b/packages/rule-engine/src/recommended/trigger-actions/next-sla-breach.ts @@ -5,7 +5,7 @@ export default (productEvent: Event, productEventData: ProductEventData, trigger return ( productEvent === Event.ConversationUpdate && !!productEventData.changes.model_changes && - productEventData.changes.model_changes.sla_breach[1] && + !!productEventData.changes.model_changes?.sla_breach[1] && productEventData.conversation.response_due_type === 'RESPONSE_DUE' ); }; From a201829f215ed5ce2282c1213f0cb54bb4606525 Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Mon, 6 Nov 2023 10:14:51 +0530 Subject: [PATCH 2/8] version updates --- packages/rule-engine/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rule-engine/package.json b/packages/rule-engine/package.json index c3ca6669..bba0d516 100644 --- a/packages/rule-engine/package.json +++ b/packages/rule-engine/package.json @@ -1,6 +1,6 @@ { "name": "@freshworks-jaya/rule-engine", - "version": "0.17.21-beta-1", + "version": "0.17.21-beta-20", "description": "Provides methods to process rules in product events in marketplace app", "repository": "git@github.com:freshdesk/jaya-lib.git", "main": "lib/index.js", @@ -46,7 +46,7 @@ "dependencies": { "@freshworks-jaya/freshchat-api": "0.7.33-beta-1.0", "@freshworks-jaya/kairos-api": "^0.1.5", - "@freshworks-jaya/marketplace-models": "0.1.21", + "@freshworks-jaya/marketplace-models": "0.1.21-beta-10", "@freshworks-jaya/utilities": "^1.0.0", "@google-cloud/logging": "^9.3.1", "axios": "^0.21.4", From 893e61c9b273731d6cfbacd06a3bbc1930d91fe8 Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Mon, 6 Nov 2023 10:15:13 +0530 Subject: [PATCH 3/8] version updates --- packages/marketplace-models/package.json | 2 +- packages/marketplace-models/src/types/PayloadData.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/marketplace-models/package.json b/packages/marketplace-models/package.json index 4901bfad..8aa0cc08 100644 --- a/packages/marketplace-models/package.json +++ b/packages/marketplace-models/package.json @@ -1,6 +1,6 @@ { "name": "@freshworks-jaya/marketplace-models", - "version": "0.1.21", + "version": "0.1.22-beta-10", "description": "Provides type definitions for models in marketplace product events", "repository": "git@github.com:freshdesk/jaya-lib.git", "main": "lib/index.js", diff --git a/packages/marketplace-models/src/types/PayloadData.ts b/packages/marketplace-models/src/types/PayloadData.ts index c2481dcf..9194abb7 100644 --- a/packages/marketplace-models/src/types/PayloadData.ts +++ b/packages/marketplace-models/src/types/PayloadData.ts @@ -94,6 +94,7 @@ export interface Channel { export interface UserProperty { name: string; + oldName?: string; value: string; } @@ -121,6 +122,10 @@ export interface MessagePart { collection?: { sub_parts: MessagePart[]; }; + email?: { + content: string; + subject: string; + }; image?: { url: string }; quick_reply_button?: { custom_reply_text?: string; From 27ea596bcfe876c07fcb907d6cbc96c35dc886a2 Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Mon, 6 Nov 2023 11:15:10 +0530 Subject: [PATCH 4/8] version update --- packages/rule-engine/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/rule-engine/package.json b/packages/rule-engine/package.json index bba0d516..4e73b3e2 100644 --- a/packages/rule-engine/package.json +++ b/packages/rule-engine/package.json @@ -1,6 +1,6 @@ { "name": "@freshworks-jaya/rule-engine", - "version": "0.17.21-beta-20", + "version": "0.17.21-beta-21", "description": "Provides methods to process rules in product events in marketplace app", "repository": "git@github.com:freshdesk/jaya-lib.git", "main": "lib/index.js", @@ -46,7 +46,7 @@ "dependencies": { "@freshworks-jaya/freshchat-api": "0.7.33-beta-1.0", "@freshworks-jaya/kairos-api": "^0.1.5", - "@freshworks-jaya/marketplace-models": "0.1.21-beta-10", + "@freshworks-jaya/marketplace-models": "0.1.22-beta-10", "@freshworks-jaya/utilities": "^1.0.0", "@google-cloud/logging": "^9.3.1", "axios": "^0.21.4", From d1c08b97b05b86cf94c5004be1fa952061616a2d Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Mon, 13 Nov 2023 10:23:57 +0530 Subject: [PATCH 5/8] email message search --- packages/rule-engine/package.json | 2 +- packages/rule-engine/src/Utils.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/rule-engine/package.json b/packages/rule-engine/package.json index 4e73b3e2..ebe7cf33 100644 --- a/packages/rule-engine/package.json +++ b/packages/rule-engine/package.json @@ -1,6 +1,6 @@ { "name": "@freshworks-jaya/rule-engine", - "version": "0.17.21-beta-21", + "version": "0.17.21-beta-22", "description": "Provides methods to process rules in product events in marketplace app", "repository": "git@github.com:freshdesk/jaya-lib.git", "main": "lib/index.js", diff --git a/packages/rule-engine/src/Utils.ts b/packages/rule-engine/src/Utils.ts index 64fe97f6..6bc9c814 100644 --- a/packages/rule-engine/src/Utils.ts +++ b/packages/rule-engine/src/Utils.ts @@ -125,9 +125,9 @@ export class Utils { if (messageParts && messageParts.length) { messageContent = messageParts - .filter((messagePart) => messagePart.text) + .filter((messagePart) => messagePart.text || messagePart.email) .map((messagePart) => { - return messagePart.text && messagePart.text.content; + return (messagePart.text && messagePart.text.content) || (messagePart.email && messagePart.email.subject); }) .join(' '); } From 12ebfbba57eb7b27914934ae8666dfbb981a1e10 Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Thu, 16 Nov 2023 15:11:07 +0530 Subject: [PATCH 6/8] email name changes, paytm placeholder --- .../recommended/actions/send-email-anyone.ts | 2 +- .../recommended/actions/send-email-user.ts | 2 +- ...ript-paytm-conv-since-last-resolve-html.ts | 64 +++++++++++++++++++ packages/rule-engine/src/recommended/index.ts | 2 + 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-since-last-resolve-html.ts diff --git a/packages/rule-engine/src/recommended/actions/send-email-anyone.ts b/packages/rule-engine/src/recommended/actions/send-email-anyone.ts index 6d44b0c2..43577e24 100644 --- a/packages/rule-engine/src/recommended/actions/send-email-anyone.ts +++ b/packages/rule-engine/src/recommended/actions/send-email-anyone.ts @@ -62,7 +62,7 @@ export default async ( accountId: appId, from: { email: 'no-reply@freshchat.com', - name: 'Freshchat Automations', + name: 'Automated response', }, html: emailParams.body, subject: emailParams.subject, diff --git a/packages/rule-engine/src/recommended/actions/send-email-user.ts b/packages/rule-engine/src/recommended/actions/send-email-user.ts index 9ab51f82..1c995422 100644 --- a/packages/rule-engine/src/recommended/actions/send-email-user.ts +++ b/packages/rule-engine/src/recommended/actions/send-email-user.ts @@ -59,7 +59,7 @@ export default async ( accountId: appId, from: { email: 'no-reply@freshchat.com', - name: 'Freshchat Automations', + name: 'Automated response', }, html: conversationHtml, subject: emailSubject, diff --git a/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-since-last-resolve-html.ts b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-since-last-resolve-html.ts new file mode 100644 index 00000000..cad94b68 --- /dev/null +++ b/packages/rule-engine/src/recommended/dynamic-placeholders/transcript-paytm-conv-since-last-resolve-html.ts @@ -0,0 +1,64 @@ +import { ProductEventPayload } from '@freshworks-jaya/marketplace-models'; +import Freshchat from '@freshworks-jaya/freshchat-api'; +import { Integrations, RuleEngineOptions } from '../../models/rule-engine'; +import { Utils } from '../../Utils'; +import { ErrorCodes, ErrorTypes } from '../../models/error-codes'; +import { LogSeverity } from '../../services/GoogleCloudLogging'; +import Constants from '../Constants'; + +export default ( + productEventPayload: ProductEventPayload, + integrations: Integrations, + options: RuleEngineOptions, + ruleAlias: string, +): Promise => { + const freshchatApiUrl = integrations.freshchatv2.url; + const freshchatApiToken = integrations.freshchatv2.token; + const freshchat = new Freshchat(freshchatApiUrl, freshchatApiToken, ruleAlias); + const modelProperties = productEventPayload.data.conversation || productEventPayload.data.message; + + return freshchat + .getConversationTranscript( + `https://${productEventPayload.domain}`, + modelProperties.app_id, + modelProperties.conversation_id, + { + isFetchUntilLastResolve: true, + isIncludeFreshchatLink: false, + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + output: 'paytm_html', + timezoneOffset: integrations.timezoneOffset, + }, + { + isExcludePrivate: true, + isExcludeSystem: true, + }, + ) + .then((transcript) => Promise.resolve(transcript)) + .catch((err) => { + Utils.log( + productEventPayload, + integrations, + ErrorCodes.FreshchatPlaceholder, + { + error: { + err, + payload: { + freshchatApiToken, + options: { + messagesLimit: options.isUseStaticIP + ? Constants.MAX_MESSAGES_TRANSCRIPT_STATIC_IP + : Constants.MAX_MESSAGES_TRANSCRIPT, + timezoneOffset: integrations.timezoneOffset, + }, + }, + }, + errorType: ErrorTypes.TranscriptLastResolveHtml, + }, + LogSeverity.ERROR, + ); + return Promise.reject(); + }); +}; diff --git a/packages/rule-engine/src/recommended/index.ts b/packages/rule-engine/src/recommended/index.ts index 4a21b7f7..40134861 100644 --- a/packages/rule-engine/src/recommended/index.ts +++ b/packages/rule-engine/src/recommended/index.ts @@ -88,6 +88,7 @@ import dynamicPlaceholderTranscriptConvEntireText from './dynamic-placeholders/t import dynamicPlaceholderTranscriptConvEntireIncludesPrivateSystemText from './dynamic-placeholders/transcript-conv-entire-includes-private-system-text'; import dynamicPlaceholderTranscriptConvSinceLastResolveText from './dynamic-placeholders/transcript-conv-since-last-resolve-text'; import dynamicPlaceholderTranscriptConvSinceLastResolveIncludesPrivateSystemText from './dynamic-placeholders/transcript-conv-since-last-resolve-includes-private-system-text'; +import dynamicPlaceholderTranscriptPaytmConvSinceLastResolveHtml from './dynamic-placeholders/transcript-paytm-conv-since-last-resolve-html'; const recommendedPlugins: RulePlugin[] = [ { @@ -148,6 +149,7 @@ const recommendedPlugins: RulePlugin[] = [ dynamicPlaceholderTranscriptConvSinceLastResolveIncludesPrivateSystemText, 'transcript.conv_since_last_resolve.text': dynamicPlaceholderTranscriptConvSinceLastResolveText, 'transcript.paytm_conv_entire.html': dynamicPlaceholderTranscriptPaytmConvEntireHtml, + 'transcript.paytm_conv_since_last_resolve.html': dynamicPlaceholderTranscriptPaytmConvSinceLastResolveHtml, }, operators: { [ConditionOperator.StartsWith]: operatorStartsWith, From a9d364fb5195dcf0944032dab69b70c3e37a84f8 Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Thu, 16 Nov 2023 15:42:03 +0530 Subject: [PATCH 7/8] removed duplicated --- packages/rule-engine/src/index.ts | 4 ---- packages/rule-engine/src/recommended/actions/trigger-api.ts | 1 - 2 files changed, 5 deletions(-) diff --git a/packages/rule-engine/src/index.ts b/packages/rule-engine/src/index.ts index 84b55bd1..3f9154d2 100644 --- a/packages/rule-engine/src/index.ts +++ b/packages/rule-engine/src/index.ts @@ -5,10 +5,6 @@ import { RuleEngineExternalEventPayload, KairosCredentials, } from './models/rule-engine'; -import { AnyJson } from './models/rule'; -import { Utils } from './Utils'; -import { ErrorCodes } from './models/error-codes'; -import { LogSeverity } from './services/GoogleCloudLogging'; import { AnyJson, Api, CustomPlaceholdersMap, Rule } from './models/rule'; import { RulePlugin } from './models/plugin'; diff --git a/packages/rule-engine/src/recommended/actions/trigger-api.ts b/packages/rule-engine/src/recommended/actions/trigger-api.ts index 7a47b831..962edf33 100644 --- a/packages/rule-engine/src/recommended/actions/trigger-api.ts +++ b/packages/rule-engine/src/recommended/actions/trigger-api.ts @@ -18,7 +18,6 @@ import { Utils } from '../../Utils'; import * as _ from 'lodash'; import { ErrorCodes } from '../../models/error-codes'; import { LogSeverity } from '../../services/GoogleCloudLogging'; -import { set, get } from 'lodash'; const contentTypeMap: { [key in WebhookContentType]: string; From 6978b639dcf89d9b178c0663f875af6e9a5dd30b Mon Sep 17 00:00:00 2001 From: ShashaankKrishnatray Date: Thu, 16 Nov 2023 15:42:55 +0530 Subject: [PATCH 8/8] removed duplicates --- packages/rule-engine/src/Utils.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/packages/rule-engine/src/Utils.ts b/packages/rule-engine/src/Utils.ts index cb042752..ea71829d 100644 --- a/packages/rule-engine/src/Utils.ts +++ b/packages/rule-engine/src/Utils.ts @@ -153,24 +153,6 @@ export class Utils { return messageContent; } - /** - * Gets a concatenated string of messageParts with type 'text'. - */ - public static getMessagePartsEmailContent(messageParts: MessagePart[]): string { - let messageContent = ''; - - if (messageParts && messageParts.length) { - messageContent = messageParts - .filter((messagePart) => messagePart.email) - .map((messagePart) => { - return messagePart.email && messagePart.email.content; - }) - .join(' '); - } - - return messageContent; - } - public static processHanldebars(value: string, placeholders: PlaceholdersMap): string { let processedString = ''; let isError = false;