feat: Builder for creating Campaign conversations (#2192)

- Builder for creating Campaign conversations
- Widget endpoint to fetch the campaigns
This commit is contained in:
Sojan Jose
2021-05-03 20:23:09 +05:30
committed by GitHub
parent b649516fbb
commit 98e2a9b8b5
13 changed files with 182 additions and 6 deletions

View File

@@ -0,0 +1,36 @@
class Campaigns::CampaignConversationBuilder
pattr_initialize [:contact_inbox_id!, :campaign_display_id!, :conversation_additional_attributes]
def perform
@contact_inbox = ContactInbox.find(@contact_inbox_id)
@campaign = @contact_inbox.inbox.campaigns.find_by!(display_id: campaign_display_id)
# We won't send campaigns if a conversation is already present
return if @contact_inbox.conversations.present?
ActiveRecord::Base.transaction do
@conversation = ::Conversation.create!(conversation_params)
Messages::MessageBuilder.new(@campaign.sender, @conversation, message_params).perform
end
@conversation
end
private
def message_params
ActionController::Parameters.new({
content: @campaign.message
})
end
def conversation_params
{
account_id: @campaign.account_id,
inbox_id: @contact_inbox.inbox_id,
contact_id: @contact_inbox.contact_id,
contact_inbox_id: @contact_inbox.id,
campaign_id: @campaign.id,
additional_attributes: conversation_additional_attributes
}
end
end

View File

@@ -0,0 +1,13 @@
class Api::V1::Widget::CampaignsController < Api::V1::Widget::BaseController
skip_before_action :set_contact
def index
@campaigns = @web_widget.inbox.campaigns.where(enabled: true)
end
private
def permitted_params
params.permit(:website_token)
end
end

View File

@@ -2,7 +2,8 @@ class Api::V1::Widget::EventsController < Api::V1::Widget::BaseController
include Events::Types
def create
Rails.configuration.dispatcher.dispatch(permitted_params[:name], Time.zone.now, contact_inbox: @contact_inbox, event_info: event_info)
Rails.configuration.dispatcher.dispatch(permitted_params[:name], Time.zone.now, contact_inbox: @contact_inbox,
event_info: permitted_params[:event_info].to_h.merge(event_info))
head :no_content
end
@@ -17,6 +18,6 @@ class Api::V1::Widget::EventsController < Api::V1::Widget::BaseController
end
def permitted_params
params.permit(:name, :website_token)
params.permit(:name, :website_token, event_info: {})
end
end

View File

@@ -12,7 +12,8 @@ class AsyncDispatcher < BaseDispatcher
[
EventListener.instance,
WebhookListener.instance,
InstallationWebhookListener.instance, HookListener.instance
InstallationWebhookListener.instance, HookListener.instance,
CampaignListener.instance
]
end
end

View File

@@ -0,0 +1,14 @@
class CampaignListener < BaseListener
def campaign_triggered(event)
contact_inbox = event.data[:contact_inbox]
campaign_display_id = event.data[:event_info][:campaign_id]
return if campaign_display_id.blank?
::Campaigns::CampaignConversationBuilder.new(
contact_inbox: contact_inbox.id,
campaign_display_id: campaign_display_id,
conversation_additional_attributes: event.data[:event_info].except(:campaign_id)
).perform
end
end

View File

@@ -0,0 +1,4 @@
json.array! @campaigns do |campaign|
json.id campaign.display_id
json.trigger_rules campaign.trigger_rules
end