action_message_texter 0.0.2 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 418d237614df105fbe6d8db3eac9d55f39fa47df7af9f3d5e8d5005f13cd01ad
4
- data.tar.gz: 8dbb68f1a1c49ced73009e7048b80c5fae43ed549c5dc715b6708d75376a3032
3
+ metadata.gz: bf7829c083948096b321c41c97ec8fede2ee4f332d5963169bfc605c3fec2a6e
4
+ data.tar.gz: ae9e6e295ce5a8459211205ef664c21f3c75e211598f9a12831bef976658c502
5
5
  SHA512:
6
- metadata.gz: 8ad6272e3adfc820e9013a8b91eebd3b27a274b5166ef62d2bd0f517b3250425ce1b86a91080af2caf7b48be4fb7528cbbd8e287496f570fce42a79690f4231e
7
- data.tar.gz: d9be7429496074192beca768b918b323f8c78a1bc44a75b9fabae13855f6c7f00286d27ea476ae1e6cca655b6a714d36cedaccd72c5ffa294e7c0f83e13fdb11
6
+ metadata.gz: 274634a20bda1f6cfb42ba3ff5c94e9068ccb862506c139af02d292620c384b7712093088221d7f007fbd5f2d1c65ba8ff0bbcbbbf5da406821c866593a8b5d1
7
+ data.tar.gz: a87fc76804b84d42a17a125f667dbaeee2214671fbe2453eb192366ef2da1d84e1fd9084484767dcf21197681b92f6e4def55b7be85e05277c82ac54391c0b0a
data/README.md CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  仿造Rails ActionMailer 打造的簡訊寄送模組,提供與Mailer一致的開發體驗
4
4
 
5
-
6
-
7
5
  ## Installation
8
6
  Add this line to your application's Gemfile:
9
7
 
@@ -21,15 +19,179 @@ Or install it yourself as:
21
19
  $ gem install action_message_texter
22
20
  ```
23
21
 
24
- ## Usage
22
+ ## Configuration
23
+
24
+ 1. 載入設定
25
+ 先到`config/application.rb` 新增 `require action_message_texter/engine`
26
+
27
+ 2. 簡訊寄送方式設定
28
+
29
+ 由於簡訊沒有類似SMTP的標準寄送方式,全依照簡訊提供商的API,目前我有包一個基於**三竹簡訊**的API,未來有計畫開放大家自行建立自己的寄送方式
30
+
31
+ ```ruby
32
+ # config/application.rb
33
+ config.action_message_texter.mitake_settings= :mitake, MitakeApi::SMSProvider, url: "三竹發給你的網域名稱", username: "三竹的使用者名稱", password: "三竹的密碼"
34
+ ```
35
+
36
+ 3. 設定預設寄送方式
37
+ 在`app/application.rb`裡,可以預設所有簡訊要使用哪一個寄送方式
38
+ ``` ruby
39
+ # app/application.rb
40
+
41
+ #預設值為 :mitake
42
+ config.action_message_texter.delivery_method = :mitake
43
+ ```
44
+ 若要依照不同環境使用不同的簡訊寄送方式 請在不同環境的設定檔(如`config/environments/development.rb`)內覆蓋這個設定,也可以在Texter中使用`delivery_method = :method`直接指定
45
+
46
+ ### 完整設定如下
47
+ ```ruby
48
+ # config/applications.rb
49
+
50
+ # 引用ActionMessageTexter
51
+ require 'action_message_texter/engine'
52
+ ....
53
+
54
+ class Application < Rails::Application
55
+ ...
56
+ # 加入三竹科技登入方式
57
+ config.action_message_texter.mitake_settings(:url: ENV['URL'], username: ENV['USERNAME'], password: ENV['password'])
58
+ # 設定預設的寄送方式
59
+ config.action_message_texter.delivery_method = :mitake
60
+ ...
61
+ end
62
+ ```
63
+
64
+ ## Generator
25
65
 
26
- ### Texter Generator
27
- This generator will generate Texter at `app/texter`
28
66
  ```bash
29
- rails g action_message_texter:texter Devise sign_up_succeed
67
+ rails g action_message_texter:texter ModuleName action_name action_name ....
68
+ ```
69
+ 這會產生3個檔案,分別是 `app/texter/application_texter.rb` (若不存在)、`app/texter/{{name}}_texter.rb`、`config/locales/texter/{{name}}_texter.yaml`
70
+ 若有給定`function_name` 會自動生成對應的 function 以及字典檔
71
+
72
+
73
+ ```ruby
74
+ # app/texter/my_texter.rb
75
+ class MyTexter
76
+ def action_name
77
+ sms(to: "+8860987654321")
78
+ end
79
+ end
80
+ ```
81
+ ```yaml
82
+ # config/locales/texter/my_texter.yaml
83
+ zh-TW:
84
+ my_texter:
85
+ action_name:
86
+ action_name2:
87
+ ```
88
+
89
+
90
+ ## Texter
91
+
92
+ 與Mailer雷同,但因為簡訊是比較單純的文字,因此render view了,簡訊生成的部分將使用`I18n`,同時會自動帶入參數
93
+
94
+ #### Example
95
+ 假設要送出簡訊,並帶入訂單
96
+ ```ruby
97
+ class MyTexter
98
+ def uber_eat_order(phone_number, order)
99
+ # 記得設成全域變數 我會幫你自動插到I18n內,就像平常使用view 時會插入 `<%=@order>` 一樣
100
+ @order = order
101
+ sms(to: phone_number)
102
+ end
103
+ end
104
+ ```
105
+
106
+ ```yaml
107
+ zh-TW:
108
+ my_texter:
109
+ uber_eat_order: "今晚,我想來%{order}"
110
+ # 記得插值不要加 `@` 喔
111
+ ```
112
+
113
+ 若不同的`Texter`想使用不同的method 可以直接加入 `delivery_method = :method`
114
+
115
+ ```ruby
116
+ class MyTexter
117
+ delivery_method = :method
118
+ ....
119
+ ```
120
+
121
+ ## Send Message
122
+
123
+ 跟 Mailer 一樣,提供 `deliver_now` 跟 `deliver_later` 兩種寄送方式,`deliver_now` 會直接寄出,`deliver_later`會調用Job做寄出。
124
+
125
+ ```ruby
126
+ # 直接寄出,後續的動作需等待這個動作完成
127
+ MyTexter.uber_eat_order("0987654321", "林東芳牛肉麵").deliver_now
128
+ # 調用Job,後續的動作繼續執行
129
+ MyTexter.uber_eat_order("0987654321", "林東芳牛肉麵").deliver_latter
130
+
131
+ ```
132
+
133
+ ## Callbacks
134
+
135
+ 可以在Tester中加入 `before_action` 與 `after_action`,在這兩個funciton中可以取得`message`物件。
136
+ ```ruby
137
+ class MyTexter
138
+ before_action :do_before
139
+ after_action :do_after
140
+
141
+ def do_before
142
+ ...do_something
143
+ end
144
+
145
+ def do_after
146
+ ...do_something
147
+ end
148
+ ....
149
+ ```
150
+
151
+
152
+ ## Observer
153
+
154
+ 若需要再寄送後,查看寄送是否完成?儲存寄送方式結果...等
155
+ 可以註冊一個 `Observer` 或多個 `Observer`
156
+
157
+ ```ruby
158
+ class TexterObserver
159
+ def self.delivered_message(message)
160
+ # 請實作此方法
161
+ end
162
+ end
163
+
164
+
165
+ class MyTexter
166
+ self.register_observer(TexterObserver)
167
+
168
+ # 您也可以註冊多組Observer
169
+ self.register_observer(OtherObserver)
170
+ end
171
+ ```
172
+
173
+ ## Inspection
174
+
175
+ 如了`Observer` 您也可以註冊攔截器 `Inspection`
176
+
177
+ ```ruby
178
+ class TexterInspection
179
+ def self.delivering_message(message)
180
+ # 請實作此方法
181
+ end
182
+ end
183
+
184
+
185
+ class MyTexter
186
+ self.register_inspection(TexterObserver)
187
+
188
+ # 您也可以註冊多組Observer
189
+ self.register_inspection(OtherObserver)
190
+ end
30
191
  ```
192
+ ## Test
31
193
 
32
- ### Texter
194
+ 尚未規劃Test的部分
33
195
 
34
196
 
35
197
  ## Contributing
@@ -15,6 +15,22 @@ module ActionMessageTexter
15
15
  }
16
16
 
17
17
  class << self
18
+ def register_observer(observer)
19
+ Message.register_observer(observer_class_for(observer))
20
+ end
21
+
22
+ def unregister_observer(observer)
23
+ Message.unregister_observer(observer_class_for(observer))
24
+ end
25
+
26
+ def register_interceptor(interceptor)
27
+ Message.register_interceptor(observer_class_for(interceptor))
28
+ end
29
+
30
+ def unregister_interceptor(interceptor)
31
+ Message.unregister_observer(observer_class_for(interceptor))
32
+ end
33
+
18
34
  def default(value)
19
35
  self.default_params = default_params.merge(value).freeze if value
20
36
  default_params
@@ -49,6 +65,15 @@ module ActionMessageTexter
49
65
  super
50
66
  end
51
67
  end
68
+
69
+ def observer_class_for(value)
70
+ case value
71
+ when String, Symbol
72
+ value.to_s.camelize.constantize
73
+ else
74
+ value
75
+ end
76
+ end
52
77
  end
53
78
 
54
79
  attr_internal :message
@@ -90,8 +115,7 @@ module ActionMessageTexter
90
115
 
91
116
  message.other_options = headers
92
117
 
93
- # TODO: set provider dynamic
94
- wrap_delivery_behavior!(:base)
118
+ wrap_delivery_behavior!(self.class.delivery_method)
95
119
 
96
120
  message
97
121
  end
@@ -10,6 +10,7 @@ module ActionMessageTexter
10
10
  class_attribute :delivery_method, default: :base
11
11
 
12
12
  add_delivery_method(:base, SMSProvider::Base)
13
+ add_delivery_method(:mitake, ::MitakeApi::SMSProvider, {})
13
14
  end
14
15
 
15
16
  module ClassMethods
@@ -1,38 +1,75 @@
1
1
  module ActionMessageTexter
2
2
  class Message
3
+ class << self
4
+ @@delivery_notification_observers = []
5
+ @@delivery_interceptors = []
6
+ def register_observer(observer)
7
+ @@delivery_notification_observers << observer unless @@delivery_notification_observers.include?(observer)
8
+ end
9
+
10
+ def unregister_observer(observer)
11
+ @@delivery_notification_observers.delete(observer)
12
+ end
13
+
14
+ def register_interceptor(interceptor)
15
+ unless @@delivery_notification_interceptors.include?(interceptor)
16
+ @@delivery_notification_interceptors << interceptor
17
+ end
18
+ end
19
+
20
+ def unregister_interceptor(interceptor)
21
+ @@delivery_notification_interceptors.delete(interceptor)
22
+ end
23
+ end
3
24
  attr_accessor :content, :to, :deliver_at, :delivery_options, :delivery_handler, :other_options,
4
- :raise_delivery_errors
25
+ :raise_delivery_errors, :response
5
26
 
6
27
  attr_writer :delivery_method
7
28
 
29
+ attr_reader :uuid
30
+
8
31
  # TODO: create registred interceptor and observer
9
32
 
10
33
  def initialize
11
34
  @raise_delivery_errors = true
35
+ @uuid = SecureRandom.uuid
12
36
  end
13
37
 
14
38
  def deliver
15
- # inform_interceptors
39
+ inform_interceptors
16
40
  if delivery_handler
17
41
  delivery_handler.deliver_message(self) { do_delivery }
18
42
  else
19
43
  do_delivery
20
44
  end
21
- # inform_observers
22
- self
45
+ inform_observers
46
+ response
23
47
  end
24
48
 
25
- def delivery_method(method = nil, _settings = {})
26
- if method
49
+ def delivery_method(method_klass = nil, settings = {})
50
+ puts method_klass
51
+ if method_klass
27
52
  # TODO: get provider from configuration
28
- @delivery_method = SMSProvider::Base.new
53
+ @@delivery_method = method_klass.new(settings)
29
54
  else
30
- @delivery_method
55
+ @@delivery_method
31
56
  end
32
57
  end
33
58
 
34
59
  private
35
60
 
61
+ def inform_observers
62
+ @@delivery_notification_observers.each do |observer|
63
+ observer.delivered_message(self)
64
+ end
65
+ end
66
+
67
+ def inform_interceptors
68
+ @@delivery_interceptors.each do |observer|
69
+ observer.delivering_message(self)
70
+ end
71
+ end
72
+
36
73
  def do_delivery
37
74
  delivery_method.deliver!(self)
38
75
  rescue StandardError => e
@@ -1,3 +1,3 @@
1
1
  module ActionMessageTexter
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.5'
3
3
  end
@@ -6,6 +6,7 @@ require 'action_message_texter/message'
6
6
  require 'action_message_texter/rescuable'
7
7
  require 'action_message_texter/delivery_job'
8
8
  require 'sms_provider/base'
9
+ require 'mitake_api'
9
10
 
10
11
  module ActionMessageTexter
11
12
  extend ::ActiveSupport::Autoload
@@ -8,7 +8,13 @@ module ActionMessageTexter
8
8
 
9
9
  check_class_collision suffix: 'Texter'
10
10
 
11
- def create_message_file
11
+ def create_application_texter
12
+ unless File.exist?('app/texter/application_texter.rb')
13
+ template '../templetes/application_texter.rb', File.join('app/texter', 'application_texter.rb')
14
+ end
15
+ end
16
+
17
+ def create_texter
12
18
  template '../templates/texter.rb', File.join('app/texter', "#{file_name}_texter.rb")
13
19
  end
14
20
 
@@ -0,0 +1,2 @@
1
+ class ApplicationTexter < ActionMessageTexter::Base
2
+ end
@@ -1,5 +1,9 @@
1
1
  module SMSProvider
2
2
  class Base
3
+ def initialize(*setting)
4
+ puts setting
5
+ end
6
+
3
7
  def deliver!(message)
4
8
  puts message
5
9
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_message_texter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arthur Li
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-26 00:00:00.000000000 Z
11
+ date: 2022-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mitake_api
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.4
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -45,6 +59,7 @@ files:
45
59
  - lib/action_message_texter/rescuable.rb
46
60
  - lib/action_message_texter/version.rb
47
61
  - lib/generators/action_message_texter/texter_generator.rb
62
+ - lib/generators/templates/application_texter.rb
48
63
  - lib/generators/templates/i18n.yml.rb
49
64
  - lib/generators/templates/texter.rb
50
65
  - lib/sms_provider/base.rb