# -*- mode:ruby -*-
#properties involved...
property :smsid, String
property :last_attempt, DateTime
property :last_error, Text
property :attempts, Integer, :default => 0
is :state_machine, :initial => :pending do
state :pending
state :attempting
state :processed
state :undeliverable
state :failed, :enter => :reset_state
event :ensure_deliverable do
transition :from => :pending, :to => :attempting
end
event :completed do
transition :from => :attempting, :to => :processed
end
event :undeliverable do
transition :from => :pending, :to => :undeliverable
end
event :failed do
transition :from => :attempting, :to => :failed
end
event :retry_message do
transition :from => :undeliverable, :to => :pending
transition :from => :failed, :to => :pending
end
def reset_state
update_attributes(:attempts => 0)
end
end
# revised to force the error cycle
def process
carrier = Carrier.first(:network_name => network)
undeliverable! if not carrier
ensure_deliverable! # statemachine enforcer
sms_http_gateway = message_uri(carrier)
begin
self.attempts = attempts + 1
self.last_attempt = Time.now
# self.smsid = # case rand(100)
# when (1..95) then Faker.numerify('##########')
# else
raise StandardError
# end
completed!
rescue StandardError => e
self.last_error = "#{e.class} : #{e.message} : #{sms_http_gateway}"
Merb.logger.error("There was an error connecting to MX Telecom: '#{e}'")
attempts < @@max_retries ? retry : failed!
end
rescue DataMapper::Is::StateMachine::InvalidEvent
if state == 'undeliverable'
self.last_error = "no Carrier found for unsupported network #{network}"
end
ensure
puts dirty_attributes # => #<DataMapper::Property:0x2721a08>failed
save
end
alias :deliver :process
# trace
o.deliver
~ (0.059717) SELECT `id`, `internal_name`, `smtp_suffix`, `created_at`, `updated_at`, `network_name`, `user_name`, `short_code_id` FROM `carriers` WHERE (`network_name` = 'SPRINTUS') ORDER BY `id` LIMIT 1
~ (0.000217) SELECT `id`, `number`, `username`, `created_at`, `updated_at` FROM `short_codes` WHERE (`id` IN (7)) ORDER BY `id`
~ (0.000207) SELECT `last_error`, `id` FROM `outgoing_text_messages` WHERE (`id` = 21015) ORDER BY `id`
~ There was an error connecting to MX Telecom: 'StandardError'
~ There was an error connecting to MX Telecom: 'StandardError'
~ There was an error connecting to MX Telecom: 'StandardError'
~ There was an error connecting to MX Telecom: 'StandardError'
~ There was an error connecting to MX Telecom: 'StandardError'
~ (0.048961) UPDATE `outgoing_text_messages` SET `state` = 'attempting', `last_attempt` = '2009-09-24 15:43:51', `updated_at` = '2009-09-24 15:43:51' WHERE (`id` = 21015)
#<DataMapper::Property:0x2721a08>failed
~ (0.000704) UPDATE `outgoing_text_messages` SET `state` = 'failed' WHERE (`id` = 21015)
=> "failed"