gary (owner)

Revisions

gist: 192962 Download_button fork
public
Public Clone URL: git://gist.github.com/192962.git
Embed All Files: show embed
outgoing_text_message.rb #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# -*- 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"