43 lines
1.4 KiB
Ruby
43 lines
1.4 KiB
Ruby
class Campaigns::CampaignConversationBuilder
|
|
pattr_initialize [:contact_inbox_id!, :campaign_display_id!, :conversation_additional_attributes, :custom_attributes]
|
|
|
|
def perform
|
|
@contact_inbox = ContactInbox.find(@contact_inbox_id)
|
|
@campaign = @contact_inbox.inbox.campaigns.find_by!(display_id: campaign_display_id)
|
|
|
|
ActiveRecord::Base.transaction do
|
|
@contact_inbox.lock!
|
|
|
|
# We won't send campaigns if a conversation is already present
|
|
raise 'Conversation alread present' if @contact_inbox.reload.conversations.present?
|
|
|
|
@conversation = ::Conversation.create!(conversation_params)
|
|
Messages::MessageBuilder.new(@campaign.sender, @conversation, message_params).perform
|
|
end
|
|
@conversation
|
|
rescue StandardError => e
|
|
Rails.logger.info(e.message)
|
|
nil
|
|
end
|
|
|
|
private
|
|
|
|
def message_params
|
|
ActionController::Parameters.new({
|
|
content: @campaign.message,
|
|
campaign_id: @campaign.id
|
|
})
|
|
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,
|
|
custom_attributes: custom_attributes || {}
|
|
}
|
|
end
|
|
end
|