chore: one off SMS campaign APIs (#2589)
This commit is contained in:
40
app/services/twilio/oneoff_sms_campaign_service.rb
Normal file
40
app/services/twilio/oneoff_sms_campaign_service.rb
Normal file
@@ -0,0 +1,40 @@
|
||||
class Twilio::OneoffSmsCampaignService
|
||||
pattr_initialize [:campaign!]
|
||||
|
||||
def perform
|
||||
raise "Invalid campaign #{campaign.id}" if campaign.inbox.inbox_type != 'Twilio SMS' || !campaign.one_off?
|
||||
raise 'Completed Campaign' if campaign.completed?
|
||||
|
||||
# marks campaign completed so that other jobs won't pick it up
|
||||
campaign.completed!
|
||||
|
||||
audience_label_ids = campaign.audience.select { |audience| audience['type'] == 'Label' }.pluck('id')
|
||||
audience_labels = campaign.account.labels.where(id: audience_label_ids).pluck(:title)
|
||||
process_audience(audience_labels)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
delegate :inbox, to: :campaign
|
||||
delegate :channel, to: :inbox
|
||||
|
||||
def process_audience(audience_labels)
|
||||
campaign.account.contacts.tagged_with(audience_labels, any: true).each do |contact|
|
||||
next if contact.phone_number.blank?
|
||||
|
||||
send_message(to: contact.phone_number, from: channel.phone_number, content: campaign.message)
|
||||
end
|
||||
end
|
||||
|
||||
def send_message(to:, from:, content:)
|
||||
client.messages.create({
|
||||
body: content,
|
||||
from: from,
|
||||
to: to
|
||||
})
|
||||
end
|
||||
|
||||
def client
|
||||
::Twilio::REST::Client.new(channel.account_sid, channel.auth_token)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user