From 8bf2081affc25b2ff3a92f5aea1b201603e54693 Mon Sep 17 00:00:00 2001 From: Pranav Date: Wed, 2 Apr 2025 20:26:55 -0700 Subject: [PATCH] feat: Add webhook event support for macros (#11235) Fixes https://github.com/chatwoot/chatwoot/issues/5968 We will not support custom payload in V1. --- app/javascript/dashboard/i18n/locale/en/macros.json | 3 ++- .../dashboard/conversation/Macros/MacroPreview.vue | 2 +- .../routes/dashboard/settings/macros/constants.js | 5 +++++ app/models/macro.rb | 3 ++- app/services/macros/execution_service.rb | 5 +++++ spec/services/macros/execution_service_spec.rb | 10 +++++++++- 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/en/macros.json b/app/javascript/dashboard/i18n/locale/en/macros.json index ed68d2798..d22744190 100644 --- a/app/javascript/dashboard/i18n/locale/en/macros.json +++ b/app/javascript/dashboard/i18n/locale/en/macros.json @@ -97,7 +97,8 @@ "SEND_ATTACHMENT": "Send Attachment", "SEND_MESSAGE": "Send a Message", "CHANGE_PRIORITY": "Change Priority", - "ADD_PRIVATE_NOTE": "Add a Private Note" + "ADD_PRIVATE_NOTE": "Add a Private Note", + "SEND_WEBHOOK_EVENT": "Send Webhook Event" } } } diff --git a/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue b/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue index ac0feadd1..299531df2 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue @@ -65,7 +65,7 @@ const resolvedMacro = computed(() => { class="absolute -left-[0.21875rem] top-[0.2734375rem] w-2 h-2 rounded-full bg-n-solid-1 border-2 border-solid border-n-weak dark:border-slate-600" />

- {{ action.actionName }} + {{ $t(`MACROS.ACTIONS.${action.actionName}`) }}

{{ action.actionValue }}

diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js b/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js index 6178065ec..e8ee4fdef 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js @@ -64,4 +64,9 @@ export const MACRO_ACTION_TYPES = [ label: 'CHANGE_PRIORITY', inputType: 'search_select', }, + { + key: 'send_webhook_event', + label: 'SEND_WEBHOOK_EVENT', + inputType: 'url', + }, ]; diff --git a/app/models/macro.rb b/app/models/macro.rb index 9e359ec8d..1fe8192dc 100644 --- a/app/models/macro.rb +++ b/app/models/macro.rb @@ -31,7 +31,8 @@ class Macro < ApplicationRecord validate :json_actions_format ACTIONS_ATTRS = %w[send_message add_label assign_team assign_agent mute_conversation change_status remove_label remove_assigned_team - resolve_conversation snooze_conversation change_priority send_email_transcript send_attachment add_private_note].freeze + resolve_conversation snooze_conversation change_priority send_email_transcript send_attachment + add_private_note send_webhook_event].freeze def set_visibility(user, params) self.visibility = params[:visibility] diff --git a/app/services/macros/execution_service.rb b/app/services/macros/execution_service.rb index 81da53fca..df82d4c6f 100644 --- a/app/services/macros/execution_service.rb +++ b/app/services/macros/execution_service.rb @@ -62,4 +62,9 @@ class Macros::ExecutionService < ActionService mb = Messages::MessageBuilder.new(@user, @conversation.reload, params) mb.perform end + + def send_webhook_event(webhook_url) + payload = @conversation.webhook_data.merge(event: 'macro.executed') + WebhookJob.perform_later(webhook_url.first, payload) + end end diff --git a/spec/services/macros/execution_service_spec.rb b/spec/services/macros/execution_service_spec.rb index 446b47fbc..b5bf13044 100644 --- a/spec/services/macros/execution_service_spec.rb +++ b/spec/services/macros/execution_service_spec.rb @@ -18,7 +18,8 @@ RSpec.describe Macros::ExecutionService, type: :service do { action_name: 'assign_agent', action_params: ['self'] }, { action_name: 'add_private_note', action_params: ['Test note'] }, { action_name: 'send_message', action_params: ['Test message'] }, - { action_name: 'send_attachment', action_params: [1, 2] } + { action_name: 'send_attachment', action_params: [1, 2] }, + { action_name: 'send_webhook_event', action_params: ['https://example.com/webhook'] } ]) end @@ -147,4 +148,11 @@ RSpec.describe Macros::ExecutionService, type: :service do end end end + + describe '#send_webhook_event' do + it 'sends a webhook event' do + expect(WebhookJob).to receive(:perform_later) + service.send(:send_webhook_event, ['https://example.com/webhook']) + end + end end