action_message_texter 0.0.1 → 0.0.4

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: e0b1e9948866086af99648cfa73f11aa1d005511665b2994498ec9d5c4712ae6
4
- data.tar.gz: daf2f869aadbaf8c0b88d60993e08bcb7d8054cb614453e15f8f1dad6725096d
3
+ metadata.gz: bfa1e0bae8d03c42e775fa78af9bb21309f02c073ecadae12f62330285dc7343
4
+ data.tar.gz: bf5a2e62fc9341a13737bd46529c97b498ed8b6e8c1e1ed41df1bb4db91f9def
5
5
  SHA512:
6
- metadata.gz: f1578f69ee484d7b6b8744724320b0a7a5a80582056ced7317dd14d4e0c77d97bbade833dfb014f693d4f05728f7edcd3a86735ba20f78150b93a3d461e073b7
7
- data.tar.gz: 526a2b6307bab0833b18b9978eae1fff1b571cb779992180ed773396a9ec42a67efb7ad1c406870ee8d590677d91614ae5c6967bbeb75be3a8d2e82b60872147
6
+ metadata.gz: da388aacea57f21c6d0b27cf3e601351a369d871473dd7c2c63d1a443e1271881f16030ff2960ee169dc192252f2676b9495ecba17d48a26682d755ac18699ce
7
+ data.tar.gz: 0d3fb35b1e9bd665eee577779bfe04500ebc3cfb91f99665a6e9e8c77cb5cf9749efa9dbb45c5de97cba6ffab107f564b1f1dc5068c60d33cc80a36b87e6feb1
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
@@ -78,7 +103,6 @@ module ActionMessageTexter
78
103
 
79
104
  # return Message instance
80
105
  def sms(headers = {})
81
- puts headers
82
106
  @_message_was_called = true
83
107
 
84
108
  headers = self.class.default_params.merge(headers)
@@ -91,8 +115,7 @@ module ActionMessageTexter
91
115
 
92
116
  message.other_options = headers
93
117
 
94
- # TODO: set provider dynamic
95
- wrap_delivery_behavior!(:base)
118
+ wrap_delivery_behavior!(self.class.delivery_method)
96
119
 
97
120
  message
98
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
@@ -3,15 +3,18 @@ require 'action_message_texter'
3
3
  module ActionMessageTexter
4
4
  class Engine < ::Rails::Engine
5
5
  isolate_namespace ActionMessageTexter
6
- config.eager_load_namespaces << ActionMessageTexter
6
+ config.action_message_texter = ActiveSupport::OrderedOptions.new
7
+ # config.eager_load_namespaces << ActionMessageTexter
7
8
 
9
+ # Set default logger for ActionMessageTexter
8
10
  initializer 'action_message_texter.logger' do
9
11
  ActiveSupport.on_load(:action_message_texter) { self.logger ||= Rails.logger }
10
12
  end
11
13
 
14
+ # Set all configuration for ActionMessageTexter
12
15
  config.after_initialize do |app|
13
- ActiveSupport.on_load(:action_message_txter) do
14
- options = app.config.action_short_message
16
+ ActiveSupport.on_load(:action_message_texter) do
17
+ options = app.config.action_message_texter
15
18
  options.each { |k, v| send("#{k}=", v) }
16
19
  end
17
20
  end
@@ -21,7 +21,7 @@ module ActionMessageTexter
21
21
  end
22
22
 
23
23
  def logger
24
- ActionMessageTexter::Base.logger || Rails.logger
24
+ ActionMessageTexter::Base.logger
25
25
  end
26
26
  end
27
27
  end
@@ -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_notification_observers.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.1'
2
+ VERSION = '0.0.4'
3
3
  end
@@ -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,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_message_texter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.4
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
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -45,6 +45,7 @@ files:
45
45
  - lib/action_message_texter/rescuable.rb
46
46
  - lib/action_message_texter/version.rb
47
47
  - lib/generators/action_message_texter/texter_generator.rb
48
+ - lib/generators/templates/application_texter.rb
48
49
  - lib/generators/templates/i18n.yml.rb
49
50
  - lib/generators/templates/texter.rb
50
51
  - lib/sms_provider/base.rb