action_message_texter 0.0.8 → 0.0.9

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: d8b8133432b4a5a074595da923cd0a09da09ebd5d4674b33b404f01a4c1dd1f9
4
- data.tar.gz: 1f5a879189b1132f5a8a967eb07e5c86107c1e1506994e267a010ddde46add7c
3
+ metadata.gz: 52d4c99126aee66a02300b6615a12480d51f4c20681cf9c273b9ec020e2e0cf2
4
+ data.tar.gz: 9f88237c239af14edae7e6175434823e3bded0ff388425ca1b059257ee26c50d
5
5
  SHA512:
6
- metadata.gz: 908903bdf31ae658a80c09cbdd5f4f52ea21ae74b5c5cae6271cb7bcc9db00444796cfd5c19faefe73eb956dda493b1df3ec66af8a5fac6d9a73e5c112d9b415
7
- data.tar.gz: 9ca06bde4d8d764753ef36288b7cda4eaefba3f991065cdc5a90c5b443a30374fb8403f065b7b733f10bdca64f70debacf74c4a6e6a33f43b5b2624574786f0b
6
+ metadata.gz: a0f88ab4802086adbd69588b76659e0045fcc28ff6a0dfb0a923ffd94bdb2afe984252fc60d097922ba114b247eadb0b0ee8c13021b04250ffa1e6c91071724f
7
+ data.tar.gz: '09d0a2b7f4942bd4983f109aea575629b70b377c4838db9325829bf9c73f59297730d79ca91b940b3f306b284a7c161af2bf2b66679f01dcfbb5ecab5243da2a'
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ActionMessageTexter
2
2
 
3
- 仿造Rails ActionMailer 打造的簡訊寄送模組,提供與Mailer一致的開發體驗
3
+ Rails ActionMailer 為參考打造的簡訊寄送模組,提供與 ActionMailer 一致的開發體驗
4
4
 
5
5
  ## Installation
6
6
  Add this line to your application's Gemfile:
@@ -19,120 +19,126 @@ Or install it yourself as:
19
19
  $ gem install action_message_texter
20
20
  ```
21
21
 
22
- ## Configuration
23
-
24
- 1. 載入設定
25
- 先到`config/application.rb` 新增 `require action_message_texter/engine`
26
-
27
- 2. 簡訊寄送方式設定
22
+ ## Usage
28
23
 
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
24
 
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
+ 請先執行`generator`
65
26
 
66
27
  ```bash
67
28
  rails g action_message_texter:texter ModuleName action_name action_name ....
68
29
  ```
69
- 這會產生3個檔案,分別是 `app/texter/application_texter.rb` (若不存在)、`app/texter/{{name}}_texter.rb`、`config/locales/texter/{{name}}_texter.yaml`
70
- 若有給定`function_name` 會自動生成對應的 function 以及字典檔
30
+ 這將會產生以下文件
71
31
 
32
+ ```
33
+ root
34
+ ├─ app
35
+ │ └─ texters
36
+ │ ├─ application_texter.rb
37
+ │ └─ module_name_texter.rb
38
+
39
+ └─ config
40
+ └─ locales
41
+ └─ module_name.yml
42
+ ```
43
+
44
+ 使用上大致上跟Mailer差不多
72
45
 
73
46
  ```ruby
74
47
  # app/texter/my_texter.rb
75
48
  class MyTexter
76
- def action_name
77
- text(to: "+8860987654321")
49
+ def my_ubereats(phone)
50
+ @order = "林東芳的半筋半肉牛肉麵"
51
+ @notes = "不要牛肉不要麵"
52
+ text(to: phone)
78
53
  end
79
54
  end
80
55
  ```
56
+ 與Mailer不同的是 簡訊內容不從View Render出來,請使用I18n,或是直接給 `content`
57
+
81
58
  ```yaml
82
59
  # config/locales/texter/my_texter.yaml
83
60
  zh-TW:
84
61
  my_texter:
85
- action_name:
86
- action_name2:
62
+ my_action: 今晚我想來點%{order},%{note}
87
63
  ```
88
64
 
89
65
 
90
- ## Texter
91
-
92
- 與Mailer雷同,但因為簡訊是比較單純的文字,因此render view了,簡訊生成的部分將使用`I18n`,同時會自動帶入參數
93
-
94
- #### Example
95
- 假設要送出簡訊,並帶入訂單
96
66
  ```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
67
+ # app/texter/my_texter.rb
68
+ def my_ubereats(phone)
69
+ ...
70
+ # 也可以直接給文字,不走I18n
71
+ text(to: phone, content: "今晚我想來點#{order},#{note}")
103
72
  end
104
73
  ```
105
74
 
106
- ```yaml
107
- zh-TW:
108
- my_texter:
109
- uber_eat_order: "今晚,我想來%{order}"
110
- # 記得插值不要加 `@` 喔
111
- ```
112
-
113
- 若不同的`Texter`想使用不同的method 可以直接加入 `delivery_method = :method`
75
+ 跟 ActionMailer 一樣,提供 `deliver_now` 跟 `deliver_later` 兩種寄送方式,`deliver_now` 會直接寄出,`deliver_later`會調用Job做寄出。
114
76
 
115
77
  ```ruby
116
- class MyTexter
117
- delivery_method = :method
118
- ....
78
+ # 直接寄出,後續的動作需等待這個動作完成
79
+ MyTexter.my_ubereats("0987654321").deliver_now
80
+ # 調用Job,後續的動作繼續執行
81
+ MyTexter.my_ubereats("0987654321").deliver_latter
82
+
119
83
  ```
120
84
 
121
- ## Send Message
85
+ **於是 `0987654321` 就會收到這樣的簡訊**
86
+ > 今晚我想來點林東芳的半筋半肉牛肉麵,不要牛肉不要麵
122
87
 
123
- 跟 Mailer 一樣,提供 `deliver_now` 跟 `deliver_later` 兩種寄送方式,`deliver_now` 會直接寄出,`deliver_later`會調用Job做寄出。
124
88
 
125
- ```ruby
126
- # 直接寄出,後續的動作需等待這個動作完成
127
- MyTexter.uber_eat_order("0987654321", "林東芳牛肉麵").deliver_now
128
- # 調用Job,後續的動作繼續執行
129
- MyTexter.uber_eat_order("0987654321", "林東芳牛肉麵").deliver_latter
130
89
 
131
- ```
90
+ ## Configuration
91
+
92
+ ### 設定簡訊傳送方式: 三竹簡訊 API
93
+
94
+ 設定方式基本跟 `ActionMailer` 一模一樣
95
+
96
+ 預設內建三竹簡訊,首先請設定`網域`,`帳號`,`密碼`,如果有需要`Callback`的話,請準備一下`Callback Url`
97
+
98
+ > 有計劃提供一個介面讓大家可以自己包自己的簡訊Api模組
99
+ > 到時候只需使用 `add_delivery_method` 就可以加入自己的 Api 模組
100
+
101
+
102
+ * Require
103
+ 麻煩請先到`config/application.rb` 新增 `require action_message_texter/engine`
104
+
105
+ * 設定三竹API
106
+
107
+ ```ruby
108
+ # config/application.rb
109
+ config.action_message_texter.mitake_settings= {
110
+ url: "三竹發給你的網域名稱 ex: https://smsapi.mitake.com.tw",
111
+ username: "三竹的使用者名稱",
112
+ password: "三竹的密碼",
113
+ callback_url: "https://foo.bar.com/api/v1/callback" # 這行非必填
114
+ }
115
+ ```
116
+
117
+ * 設定預設寄送方式
118
+ 目前只有 `mitake` 一種寄送方式,因此預設就是這個,但若有需要的話
119
+
120
+ 在`app/application.rb`裡,可以預設所有簡訊要使用哪一個寄送方式
121
+ ``` ruby
122
+ # app/application.rb
123
+
124
+ #預設值為 :mitake
125
+ config.action_message_texter.delivery_method = :mitake
126
+ ```
127
+ 基本上的設定方式都與ActionMailer相同,如果有不知道如何設定的,可以依照設定Mailer的經驗試試看喔
128
+
129
+
130
+ ## Message Object
131
+
132
+ `Message` 物件相當於 `ActionMailer` 中的 `Message` 物件,是簡訊的本體,`Message` 物件包含了這些東西
133
+ - uuid: 簡訊的ID
134
+ - to: 收件者
135
+ - content: 簡訊內容
136
+ - response: 簡訊 Api 的回覆 (此部分可以參考[三竹簡訊API文件](https://sms.mitake.com.tw/common/header/download.jsp#))
137
+
132
138
 
133
139
  ## Callbacks
134
140
 
135
- 可以在Tester中加入 `before_action` 與 `after_action`,在這兩個funciton中可以取得`message`物件。
141
+ 可以在Tester中加入 `before_action` 與 `after_action`,在這兩個方法中可以取得 `message` 物件。
136
142
  ```ruby
137
143
  class MyTexter
138
144
  before_action :do_before
@@ -158,6 +164,10 @@ class MyTexter
158
164
  class TexterObserver
159
165
  def self.delivered_message(message)
160
166
  # 請實作此方法
167
+
168
+ # 如傳送後儲存傳送結果
169
+ message_history = MessageHistory.find_by(uuid: message.uuid)
170
+ message_history.update(response_message: message.response.response_message)
161
171
  end
162
172
  end
163
173
 
@@ -178,6 +188,9 @@ end
178
188
  class TexterInspection
179
189
  def self.delivering_message(message)
180
190
  # 請實作此方法
191
+
192
+ # 如測試站時加入測試站專屬訊息
193
+ message.content = "[test]#{message.content}" unless Rails.env.production
181
194
  end
182
195
  end
183
196
 
@@ -185,17 +198,15 @@ end
185
198
  class MyTexter
186
199
  self.register_inspection(TexterObserver)
187
200
 
188
- # 您也可以註冊多組Observer
201
+ # 您也可以註冊多組攔截器
189
202
  self.register_inspection(OtherObserver)
190
203
  end
191
204
  ```
192
- ## Test
193
205
 
194
- 尚未規劃Test的部分
206
+ ## Test
195
207
 
208
+ 小弟初次寫Gem 還不會寫測試 還請各位神人協助交流 感謝
196
209
 
197
- ## Contributing
198
- Contribution directions go here.
199
210
 
200
211
  ## License
201
212
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -1,4 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionMessageTexter
4
+ #
5
+ # 所有Texter的父類別
6
+ #
2
7
  class Base < AbstractController::Base
3
8
  include Rescuable
4
9
  include DeliveryMethods
@@ -15,28 +20,51 @@ module ActionMessageTexter
15
20
  }
16
21
 
17
22
  class << self
23
+ ##
24
+ # 註冊觀察者Observer
25
+ #
26
+ # +Observer+ 需要包含一個Class Method +delivered_message(message)+
27
+ # 此方法會在訊息傳送後被呼叫 並取得 +message+ instance
28
+ # @params [Class|Symbel|String] observer
18
29
  def register_observer(observer)
19
30
  Message.register_observer(observer_class_for(observer))
20
31
  end
21
32
 
33
+ ##
34
+ # 移除已被註冊的 Observer
35
+ # @params [Class|Symbel|String] observer
22
36
  def unregister_observer(observer)
23
37
  Message.unregister_observer(observer_class_for(observer))
24
38
  end
25
39
 
40
+ ##
41
+ # 註冊攔截器Interceptor
42
+ #
43
+ # +Interceptor+ 需要包含一個Class Method +delivering_message(message)+
44
+ # 此Interceptor被註冊後 將於簡訊寄出前觸發delivering_message並取得 +message+ instance
45
+ # @params [Class|Symbel|String] interceptor
26
46
  def register_interceptor(interceptor)
27
47
  Message.register_interceptor(observer_class_for(interceptor))
28
48
  end
29
49
 
50
+ ##
51
+ # 移除已被註冊的 Interceptor
52
+ # @params [Class|Symbel|String] observer
30
53
  def unregister_interceptor(interceptor)
31
54
  Message.unregister_observer(observer_class_for(interceptor))
32
55
  end
33
56
 
57
+ ##
58
+ # 可在 +Texter+ 中更改設定
59
+ #
60
+ # @param [Hash] value
34
61
  def default(value)
35
62
  self.default_params = default_params.merge(value).freeze if value
36
63
  default_params
37
64
  end
38
65
 
39
- # set default params by configuration
66
+ ##
67
+ # 提供初始化時的 Configruation 使用
40
68
  alias default_options= default
41
69
 
42
70
  def texter_name
@@ -44,8 +72,9 @@ module ActionMessageTexter
44
72
  end
45
73
  attr_writer :texter_name
46
74
 
75
+ ##
76
+ # 寄送訊息 發出Log Notification
47
77
  def deliver_message(message)
48
- # Notification
49
78
  ActiveSupport::Notifications.instrument('deliver.action_message_texter') do |payload|
50
79
  payload[:content] = message.content
51
80
  payload[:to] = message.to
@@ -57,7 +86,6 @@ module ActionMessageTexter
57
86
 
58
87
  private
59
88
 
60
- # connect to MessageDelivery through method_missing
61
89
  def method_missing(method_name, *args)
62
90
  if action_methods.include?(method_name.to_s)
63
91
  ActionMessageTexter::MessageDelivery.new(self, method_name, *args)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionMessageTexter
2
4
  module DeliveryMethods
3
5
  extend ActiveSupport::Concern
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionMessageTexter
2
4
  class LogSubscriber < ActiveSupport::LogSubscriber
3
5
  # delivery log
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionMessageTexter
2
4
  class Message
3
5
  class << self
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionMessageTexter
2
4
  # 分派工作
3
5
  class MessageDelivery < Delegator
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionMessageTexter
2
- VERSION = '0.0.8'
4
+ VERSION = '0.0.9'
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionMessageTexter
2
4
  module Generators
3
5
  class TexterGenerator < Rails::Generators::NamedBase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SMSProvider
2
4
  class Base
3
5
  def initialize(*setting)
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.8
4
+ version: 0.0.9
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-30 00:00:00.000000000 Z
11
+ date: 2022-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mitake_api