app/models/sms_message_attempt.rb
# == Schema Information
#
# Table name: sms_message_attempts
#
# id :integer not null, primary key
# attempted :datetime
# successful :boolean default("false"), not null
# to_number :string not null
# from_number :string not null
# body :string not null
# sms_message_id :integer not null
# created_at :datetime not null
# updated_at :datetime not null
#
class SmsMessageAttempt < ActiveRecord::Base
class << self
# not really a good place for this ...
attr_accessor :from_number
end
belongs_to :sms_message
before_validation :set_defaults
validates_presence_of :from_number, :to_number, :body, :sms_message
def attempt_send
self.attempted = DateTime.now
self.save!
begin
Rails.logger.info "Sending SMS Message: #{self.inspect}"
send_message
self.successful = true
self.save
sms_message.succeeded!
Rails.logger.info "Successfully sent SMS Message: #{self.inspect}"
rescue => e
# I don't know what exceptions are possible yet
Rails.logger.error "Unsuccessful send attmpet SMS Message: #{self.inspect}"
ErrorLogger.log_error(e)
sms_message.failed!
end
end
# protected
def set_defaults
self.from_number ||= SmsMessageAttempt.from_number
self.to_number ||= sms_message.user.phone_number
self.body ||= sms_message.notification.short_message
end
def client
# is the Twilio client threadsafe? who knows these things?
@client ||= Twilio::REST::Client.new
end
def send_message
client.messages.create(
to: to_number,
body: body,
from: SmsMessageAttempt.from_number
)
end
end