activity_notification 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +1 -1
  4. data/CHANGELOG.md +23 -11
  5. data/Gemfile.lock +52 -40
  6. data/README.md +177 -14
  7. data/activity_notification.gemspec +3 -1
  8. data/app/controllers/activity_notification/subscriptions_controller.rb +48 -2
  9. data/app/views/activity_notification/optional_targets/default/base/_default.text.erb +10 -0
  10. data/app/views/activity_notification/optional_targets/default/slack/_default.text.erb +6 -0
  11. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +19 -0
  12. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +32 -3
  13. data/app/views/activity_notification/subscriptions/default/index.html.erb +4 -0
  14. data/app/views/activity_notification/subscriptions/default/show.html.erb +5 -0
  15. data/app/views/activity_notification/subscriptions/default/subscribe_to_optional_target.js.erb +6 -0
  16. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_optional_target.js.erb +6 -0
  17. data/gemfiles/Gemfile.rails-4.2.lock +15 -3
  18. data/gemfiles/Gemfile.rails-5.0.lock +47 -35
  19. data/lib/activity_notification.rb +1 -0
  20. data/lib/activity_notification/apis/notification_api.rb +83 -26
  21. data/lib/activity_notification/apis/subscription_api.rb +93 -8
  22. data/lib/activity_notification/common.rb +6 -2
  23. data/lib/activity_notification/helpers/view_helpers.rb +43 -0
  24. data/lib/activity_notification/models/concerns/notifiable.rb +73 -28
  25. data/lib/activity_notification/models/concerns/subscriber.rb +34 -7
  26. data/lib/activity_notification/models/concerns/target.rb +25 -13
  27. data/lib/activity_notification/models/subscription.rb +13 -2
  28. data/lib/activity_notification/optional_targets/amazon_sns.rb +42 -0
  29. data/lib/activity_notification/optional_targets/base.rb +79 -0
  30. data/lib/activity_notification/optional_targets/slack.rb +33 -0
  31. data/lib/activity_notification/rails/routes.rb +30 -20
  32. data/lib/activity_notification/roles/acts_as_notifiable.rb +70 -11
  33. data/lib/activity_notification/version.rb +1 -1
  34. data/lib/generators/activity_notification/views_generator.rb +2 -2
  35. data/lib/generators/templates/migrations/migration.rb +2 -2
  36. data/spec/concerns/apis/notification_api_spec.rb +97 -0
  37. data/spec/concerns/apis/subscription_api_spec.rb +206 -41
  38. data/spec/concerns/common_spec.rb +7 -2
  39. data/spec/concerns/models/notifiable_spec.rb +88 -2
  40. data/spec/concerns/models/subscriber_spec.rb +114 -13
  41. data/spec/concerns/models/target_spec.rb +17 -0
  42. data/spec/controllers/subscriptions_controller_shared_examples.rb +251 -28
  43. data/spec/helpers/view_helpers_spec.rb +56 -0
  44. data/spec/optional_targets/amazon_sns_spec.rb +46 -0
  45. data/spec/optional_targets/base_spec.rb +43 -0
  46. data/spec/optional_targets/slack_spec.rb +46 -0
  47. data/spec/rails_app/app/controllers/comments_controller.rb +1 -0
  48. data/spec/rails_app/app/models/admin.rb +1 -2
  49. data/spec/rails_app/app/models/article.rb +2 -3
  50. data/spec/rails_app/app/models/comment.rb +19 -7
  51. data/spec/rails_app/app/views/activity_notification/optional_targets/admins/amazon_sns/comment/_default.text.erb +8 -0
  52. data/spec/rails_app/db/migrate/20160715050420_create_activity_notification_tables.rb +1 -1
  53. data/spec/rails_app/db/migrate/20160715050433_create_test_tables.rb +2 -0
  54. data/spec/rails_app/db/schema.rb +3 -1
  55. data/spec/rails_app/db/seeds.rb +1 -1
  56. data/spec/rails_app/lib/custom_optional_targets/console_output.rb +13 -0
  57. data/spec/rails_app/lib/custom_optional_targets/wrong_target.rb +10 -0
  58. data/spec/roles/acts_as_notifiable_spec.rb +124 -2
  59. metadata +49 -4
  60. data/spec/rails_app/app/models/notification.rb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f445f9087536e2804c2cf9dd89ec2ac20185b0dd
4
- data.tar.gz: c64170703f4b3b773b0a265d85a1d3bc730dd4b5
3
+ metadata.gz: 6a65b89d38b765fb3308dddba4204f205bfb67c2
4
+ data.tar.gz: b44aeebf83a7718a987e97b3bb62bf3011cd7b39
5
5
  SHA512:
6
- metadata.gz: d7e85d1ab411ef43c75fc0cc61e851aa62906f59393ca55e6ceeb59dbfc39303a2f40ad9a584c83aefa3b174f0310e52ee9c15394729ddd6f7486eb1a21a0d3a
7
- data.tar.gz: fe1c334b77ba7dcb69101e93c51198a1023c1b010f32c3a034dbf368e6def3680ed1ed0352c6830dbed9603cdc2392332fbaef4e98e394b461227f1e6973c3af
6
+ metadata.gz: af081cfffaf148d44c78e0fb3fddebfe213cebb970f585ac207c59fa62c96a2b5bd80b1dd720c7da148aa9e75a36556d6bb97ff4291a83bff4fd6905b96648ce
7
+ data.tar.gz: 815e00820bdf7d1f5f0486c00ee0e2d7eacd73b51d90b1f3ee1d6809cf875c1af3b24e9a44191c4e64f20cab04d1c179ff3814717a54b338e84c5af5dca0b27f
data/.gitignore CHANGED
@@ -56,3 +56,6 @@ build-iPhoneSimulator/
56
56
 
57
57
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
58
58
  .rvmrc
59
+
60
+ # Security files for testing
61
+ /spec/rails_app/config/initializers/aws.rb
@@ -229,7 +229,7 @@ Metrics/CyclomaticComplexity:
229
229
  A complexity metric that is strongly correlated to the number
230
230
  of test cases needed to validate a method.
231
231
  Enabled: true
232
- Max: 8
232
+ Max: 9
233
233
 
234
234
  Metrics/LineLength:
235
235
  Description: 'Limit lines to 80 characters.'
@@ -1,3 +1,15 @@
1
+ ## 1.2.0 / 2017-01-06
2
+ [Full Changelog](http://github.com/simukappu/activity_notification/compare/v1.1.0...v1.2.0)
3
+
4
+ Enhancements:
5
+
6
+ * Add optional target function
7
+ * Optional target development framework
8
+ * Subscription management for optional targets
9
+ * Amazon SNS client as default optional target implementation
10
+ * Slack client as default optional target implementation
11
+ * Add `:restrict_with_*` and `:update_group_and_*` options to `:dependent_notifications` of `acts_as_notifiable`
12
+
1
13
  ## 1.1.0 / 2016-12-18
2
14
  [Full Changelog](http://github.com/simukappu/activity_notification/compare/v1.0.2...v1.1.0)
3
15
 
@@ -5,18 +17,18 @@ Enhancements:
5
17
 
6
18
  * Add subscription management framework
7
19
  * Subscription management model and API
8
- * Default subscription management controllers, routing and views
9
- * Add Subscriber role configuration to Target role
10
- * Add as_latest_group_member option to batch mailer API
11
- * Add group_expiry_delay option to notification API
20
+ * Default subscription controllers, routing and views
21
+ * Add `Subscriber` role configuration to `Target` role
22
+ * Add `:as_latest_group_member` option to batch mailer API
23
+ * Add `:group_expiry_delay` option to notification API
12
24
 
13
25
  Bug Fixes:
14
26
 
15
- * Fix unserializable error in Target#send_batch_unopened_notification_email since unnecessary options are passed to mailer
27
+ * Fix unserializable error in `Target#send_batch_unopened_notification_email` since unnecessary options are passed to mailer
16
28
 
17
29
  Breaking Changes:
18
30
 
19
- * Remove notifiable_type from the argument of overriden method or configured lambda function for Target#batch_notification_email_allowed?
31
+ * Remove `notifiable_type` from the argument of overriden method or configured lambda function with `:batch_email_allowed` option in `acts_as_target` role
20
32
 
21
33
  ## 1.0.2 / 2016-11-14
22
34
  [Full Changelog](http://github.com/simukappu/activity_notification/compare/v1.0.1...v1.0.2)
@@ -33,15 +45,15 @@ Enhancements:
33
45
  * Add function to send batch email notification
34
46
  * Batch mailer API
35
47
  * Default batch notification email templates
36
- * Target role configuration for batch email notification
48
+ * `Target` role configuration for batch email notification
37
49
  * Improve target API
38
50
  * Add `:reverse`, `:with_group_members`, `:as_latest_group_member` and `:custom_filter` options to API loading notification index
39
- * Add methods to get notifications for specified target type grouped by targets like `notification_index_map`
51
+ * Add methods to get notifications for specified target type grouped by targets like `Target#notification_index_map`
40
52
  * Arrange default notification email view templates
41
53
 
42
54
  Breaking Changes:
43
55
 
44
- * Use instance variables @notification.target and @notification.notifiable instead of @target and @notifiable in notification email templates
56
+ * Use instance variable `@notification.notifiable` instead of `@notifiable` in notification email templates
45
57
 
46
58
  ## 1.0.0 / 2016-10-06
47
59
  [Full Changelog](http://github.com/simukappu/activity_notification/compare/v0.0.10...v1.0.0)
@@ -63,7 +75,7 @@ Enhancements:
63
75
 
64
76
  Breaking Changes:
65
77
 
66
- * Rename `opened_limit` configuration parameter to `opened_index_limit`
78
+ * Rename `config.opened_limit` configuration parameter to `config.opened_index_limit`
67
79
  * http://github.com/simukappu/activity_notification/commit/591e53cd8977220f819c11cd702503fc72dd1fd1
68
80
 
69
81
  ## 0.0.10 / 2016-09-11
@@ -72,7 +84,7 @@ Breaking Changes:
72
84
  Enhancements:
73
85
 
74
86
  * Improve controller action and notification API
75
- * Add filter options to `open_all` action and `open_all_of` method
87
+ * Add filter options to `NotificationsController#open_all` action and `Target#open_all_of` method
76
88
  * Add source documentation with YARD
77
89
  * Support rails 5.0 and update gem dependency
78
90
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- activity_notification (1.1.0)
4
+ activity_notification (1.2.0)
5
5
  activerecord (>= 4.2.0)
6
6
  i18n (>= 0.5.0)
7
7
  jquery-rails (>= 3.1.1)
@@ -10,39 +10,39 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- actioncable (5.0.0.1)
14
- actionpack (= 5.0.0.1)
13
+ actioncable (5.0.1)
14
+ actionpack (= 5.0.1)
15
15
  nio4r (~> 1.2)
16
16
  websocket-driver (~> 0.6.1)
17
- actionmailer (5.0.0.1)
18
- actionpack (= 5.0.0.1)
19
- actionview (= 5.0.0.1)
20
- activejob (= 5.0.0.1)
17
+ actionmailer (5.0.1)
18
+ actionpack (= 5.0.1)
19
+ actionview (= 5.0.1)
20
+ activejob (= 5.0.1)
21
21
  mail (~> 2.5, >= 2.5.4)
22
22
  rails-dom-testing (~> 2.0)
23
- actionpack (5.0.0.1)
24
- actionview (= 5.0.0.1)
25
- activesupport (= 5.0.0.1)
23
+ actionpack (5.0.1)
24
+ actionview (= 5.0.1)
25
+ activesupport (= 5.0.1)
26
26
  rack (~> 2.0)
27
27
  rack-test (~> 0.6.3)
28
28
  rails-dom-testing (~> 2.0)
29
29
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
30
- actionview (5.0.0.1)
31
- activesupport (= 5.0.0.1)
30
+ actionview (5.0.1)
31
+ activesupport (= 5.0.1)
32
32
  builder (~> 3.1)
33
33
  erubis (~> 2.7.0)
34
34
  rails-dom-testing (~> 2.0)
35
35
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
36
- activejob (5.0.0.1)
37
- activesupport (= 5.0.0.1)
36
+ activejob (5.0.1)
37
+ activesupport (= 5.0.1)
38
38
  globalid (>= 0.3.6)
39
- activemodel (5.0.0.1)
40
- activesupport (= 5.0.0.1)
41
- activerecord (5.0.0.1)
42
- activemodel (= 5.0.0.1)
43
- activesupport (= 5.0.0.1)
39
+ activemodel (5.0.1)
40
+ activesupport (= 5.0.1)
41
+ activerecord (5.0.1)
42
+ activemodel (= 5.0.1)
43
+ activesupport (= 5.0.1)
44
44
  arel (~> 7.0)
45
- activesupport (5.0.0.1)
45
+ activesupport (5.0.1)
46
46
  concurrent-ruby (~> 1.0, >= 1.0.2)
47
47
  i18n (~> 0.7)
48
48
  minitest (~> 5.1)
@@ -52,12 +52,20 @@ GEM
52
52
  railties (>= 3.0)
53
53
  rspec-rails (>= 2.2)
54
54
  arel (7.1.4)
55
+ aws-sdk (2.6.43)
56
+ aws-sdk-resources (= 2.6.43)
57
+ aws-sdk-core (2.6.43)
58
+ aws-sigv4 (~> 1.0)
59
+ jmespath (~> 1.0)
60
+ aws-sdk-resources (2.6.43)
61
+ aws-sdk-core (= 2.6.43)
62
+ aws-sigv4 (1.0.0)
55
63
  bcrypt (3.1.11)
56
64
  builder (3.2.2)
57
- bullet (5.4.3)
65
+ bullet (5.5.0)
58
66
  activesupport (>= 3.0.0)
59
67
  uniform_notifier (~> 1.10.0)
60
- concurrent-ruby (1.0.3)
68
+ concurrent-ruby (1.0.4)
61
69
  coveralls (0.8.17)
62
70
  json (>= 1.8, < 3)
63
71
  simplecov (~> 0.12.0)
@@ -81,7 +89,8 @@ GEM
81
89
  globalid (0.3.7)
82
90
  activesupport (>= 4.1.0)
83
91
  i18n (0.7.0)
84
- jquery-rails (4.2.1)
92
+ jmespath (1.3.1)
93
+ jquery-rails (4.2.2)
85
94
  rails-dom-testing (>= 1, < 3)
86
95
  railties (>= 4.2.0)
87
96
  thor (>= 0.14, < 2.0)
@@ -97,36 +106,36 @@ GEM
97
106
  mini_portile2 (2.1.0)
98
107
  minitest (5.10.1)
99
108
  nio4r (1.2.1)
100
- nokogiri (1.6.8.1)
109
+ nokogiri (1.7.0)
101
110
  mini_portile2 (~> 2.1.0)
102
111
  orm_adapter (0.5.0)
103
112
  rack (2.0.1)
104
113
  rack-test (0.6.3)
105
114
  rack (>= 1.0)
106
- rails (5.0.0.1)
107
- actioncable (= 5.0.0.1)
108
- actionmailer (= 5.0.0.1)
109
- actionpack (= 5.0.0.1)
110
- actionview (= 5.0.0.1)
111
- activejob (= 5.0.0.1)
112
- activemodel (= 5.0.0.1)
113
- activerecord (= 5.0.0.1)
114
- activesupport (= 5.0.0.1)
115
+ rails (5.0.1)
116
+ actioncable (= 5.0.1)
117
+ actionmailer (= 5.0.1)
118
+ actionpack (= 5.0.1)
119
+ actionview (= 5.0.1)
120
+ activejob (= 5.0.1)
121
+ activemodel (= 5.0.1)
122
+ activerecord (= 5.0.1)
123
+ activesupport (= 5.0.1)
115
124
  bundler (>= 1.3.0, < 2.0)
116
- railties (= 5.0.0.1)
125
+ railties (= 5.0.1)
117
126
  sprockets-rails (>= 2.0.0)
118
127
  rails-controller-testing (1.0.1)
119
128
  actionpack (~> 5.x)
120
129
  actionview (~> 5.x)
121
130
  activesupport (~> 5.x)
122
- rails-dom-testing (2.0.1)
131
+ rails-dom-testing (2.0.2)
123
132
  activesupport (>= 4.2.0, < 6.0)
124
- nokogiri (~> 1.6.0)
133
+ nokogiri (~> 1.6)
125
134
  rails-html-sanitizer (1.0.3)
126
135
  loofah (~> 2.0)
127
- railties (5.0.0.1)
128
- actionpack (= 5.0.0.1)
129
- activesupport (= 5.0.0.1)
136
+ railties (5.0.1)
137
+ actionpack (= 5.0.1)
138
+ activesupport (= 5.0.1)
130
139
  method_source
131
140
  rake (>= 0.8.7)
132
141
  thor (>= 0.18.1, < 2.0)
@@ -155,7 +164,8 @@ GEM
155
164
  json (>= 1.8, < 3)
156
165
  simplecov-html (~> 0.10.0)
157
166
  simplecov-html (0.10.0)
158
- sprockets (3.7.0)
167
+ slack-notifier (1.5.1)
168
+ sprockets (3.7.1)
159
169
  concurrent-ruby (~> 1.0)
160
170
  rack (> 1, < 3)
161
171
  sprockets-rails (3.2.0)
@@ -187,6 +197,7 @@ PLATFORMS
187
197
  DEPENDENCIES
188
198
  activity_notification!
189
199
  ammeter
200
+ aws-sdk (~> 2)
190
201
  bullet
191
202
  coveralls
192
203
  devise (~> 4.2.0)
@@ -195,6 +206,7 @@ DEPENDENCIES
195
206
  rails-controller-testing
196
207
  rspec-rails (~> 3.5.1)
197
208
  simplecov (~> 0.12.0)
209
+ slack-notifier (~> 1.5.1)
198
210
  sqlite3 (~> 1.3.12)
199
211
  timecop
200
212
  yard (~> 0.9.5)
data/README.md CHANGED
@@ -21,20 +21,24 @@
21
21
  * Notification views (presentation of notifications)
22
22
  * Grouping notifications (grouping like `"Kevin and 7 other users posted comments to this article"`)
23
23
  * Email notification
24
- * Batch email notification
25
- * Subscription management
24
+ * Batch email notification (event driven or periodical email notification, daily or weekly etc)
25
+ * Subscription management (opt-in or opt-out by each target and notification type)
26
26
  * Integration with [Devise](https://github.com/plataformatec/devise) authentication
27
+ * Optional notification targets (Configurable optional notification targets like Amazon SNS, Slack, SMS and so on)
27
28
 
28
- ### Notification index
29
- <kbd>![notification-index](https://raw.githubusercontent.com/simukappu/activity_notification/images/activity_notification_index.png)</kbd>
29
+ ### Notification index and plugin notifications
30
+ <kbd>![plugin-notifications-image](https://raw.githubusercontent.com/simukappu/activity_notification/images/activity_notification_plugin_focus_with_subscription.png)</kbd>
30
31
 
31
- ### Plugin notifications
32
- <kbd>![plugin-notifications](https://raw.githubusercontent.com/simukappu/activity_notification/images/activity_notification_plugin_focus_with_subscription.png)</kbd>
32
+ `activity_notification` deeply uses [PublicActivity](https://github.com/pokonski/public_activity) as reference in presentation layer.
33
33
 
34
- ### Subscription management
35
- <kbd>![subscription-management](https://raw.githubusercontent.com/simukappu/activity_notification/images/activity_notification_subscription_management.png)</kbd>
34
+ ### Subscription management of notifications
35
+ <kbd>![subscription-management-image](https://raw.githubusercontent.com/simukappu/activity_notification/images/activity_notification_subscription_management_with_optional_targets.png)</kbd>
36
36
 
37
- `activity_notification` deeply uses [PublicActivity](https://github.com/pokonski/public_activity) as reference in presentation layer.
37
+ ### Amazon SNS as optional notification target
38
+ <kbd>![optional-target-amazon-sns-email-image](https://raw.githubusercontent.com/simukappu/activity_notification/images/activity_notification_optional_target_amazon_sns_email.png)</kbd>
39
+
40
+ ### Slack as optional notification target
41
+ <kbd>![optional-target-slack-image](https://raw.githubusercontent.com/simukappu/activity_notification/images/activity_notification_optional_target_slack.png)</kbd>
38
42
 
39
43
 
40
44
  ## Table of contents
@@ -70,6 +74,12 @@
70
74
  2. [Manage subscriptions](#manage-subscriptions)
71
75
  3. [Customize Subscriptions](#customize-subscriptions)
72
76
  5. [Integration with Devise](#integration-with-devise)
77
+ 6. [Optional notification targets](#optional-notification-targets)
78
+ 1. [Setup optional targets](#setup-optional-targets)
79
+ 2. [Customizing message format](#Customizing-message-format)
80
+ 3. [Amazon SNS as optional target](#amazon-sns-as-optional-target)
81
+ 4. [Slack as optional target](#slack-as-optional-target)
82
+ 5. [Developing custom optional targets](#developing-custom-optional-targets)
73
83
  4. [Testing](#testing)
74
84
  5. [Documentation](#documentation)
75
85
  6. **[Common examples](#common-examples)**
@@ -337,7 +347,7 @@ Sometimes, it's desirable to pass additional local variables to partials. It can
337
347
 
338
348
  `activity_notification` looks for views in `app/views/activity_notification/notifications/:target`.
339
349
 
340
- For example, if you have an notification with `:key` set to `"notification.comment.reply"` and rendered it with `:target` set to `:users`, the gem will look for a partial in `app/views/activity_notification/notifications/users/comment/_reply.html.(|erb|haml|slim|something_else)`.
350
+ For example, if you have a notification with `:key` set to `"notification.comment.reply"` and rendered it with `:target` set to `:users`, the gem will look for a partial in `app/views/activity_notification/notifications/users/comment/_reply.html.(|erb|haml|slim|something_else)`.
341
351
 
342
352
  *Hint*: the `"notification."` prefix in `:key` is completely optional, you can skip it in your projects or use this prefix only to make namespace.
343
353
 
@@ -406,7 +416,7 @@ This structure is valid for notifications with keys `"notification.comment.reply
406
416
 
407
417
  #### Setup mailer
408
418
 
409
- First, you need to set up the default URL options for the `activity_notification` mailer in each environment. Here is a possible configuration for `config/environments/development.rb`:
419
+ Set up SMTP server configuration for `ActionMailer`. Then, you need to set up the default URL options for the `activity_notification` mailer in each environment. Here is a possible configuration for `config/environments/development.rb`:
410
420
 
411
421
  ```ruby
412
422
  config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
@@ -450,7 +460,7 @@ end
450
460
 
451
461
  #### Email templates
452
462
 
453
- `activity_notification` will look for email template in the same way as notification views. For example, if you have an notification with `:key` set to `"notification.comment.reply"` and target_type `users`, the gem will look for a partial in `app/views/activity_notification/mailer/users/comment/_reply.html.(|erb|haml|slim|something_else)`.
463
+ `activity_notification` will look for email template in the same way as notification views. For example, if you have a notification with `:key` set to `"notification.comment.reply"` and target_type `users`, the gem will look for a partial in `app/views/activity_notification/mailer/users/comment/_reply.html.(|erb|haml|slim|something_else)`.
454
464
 
455
465
  If this template is missing, the gem will look for a partial in `default` as the target type which means `activity_notification/mailer/default/_default.html.(|erb|haml|slim|something_else)`.
456
466
 
@@ -473,7 +483,7 @@ notification:
473
483
 
474
484
  #### Setup batch mailer
475
485
 
476
- First, you need to set up the default URL options for the `activity_notification` mailer in each environment.
486
+ Set up SMTP server configuration for `ActionMailer` and the default URL options for the `activity_notification` mailer in each environment.
477
487
 
478
488
  Batch email notification is disabled as default. You can configure to enable email notification in initializer `activity_notification.rb` like single email notification.
479
489
 
@@ -574,7 +584,7 @@ notification:
574
584
  mail_subject: 'New comment to your article'
575
585
  ```
576
586
 
577
- Then, you will see `Kevin and 7 other users replied 10 comments to your article"`.
587
+ Then, you will see `Kevin and 7 other users posted 10 comments to your article"`.
578
588
 
579
589
 
580
590
  ### Subscription management
@@ -738,6 +748,159 @@ end
738
748
  In this example `activity_notification` will confirm the `user` who `admin` belongs to with authenticated user by devise.
739
749
 
740
750
 
751
+ ### Optional notification targets
752
+
753
+ `activity_notification` supports configurable optional notification targets like Amazon SNS, Slack, SMS and so on.
754
+
755
+ #### Setup optional targets
756
+
757
+ `activity_notification` provides default optional target implementation for Amazon SNS and Slack.
758
+ You can develop any optional target classes which extends `ActivityNotification::OptionalTarget::Base`, and configure them to notifiable model by `acts_as_notifiable` like this.
759
+
760
+ ```ruby
761
+ class Comment < ActiveRecord::Base
762
+ belongs_to :article
763
+ belongs_to :user
764
+
765
+ require 'activity_notification/optional_targets/amazon_sns'
766
+ require 'activity_notification/optional_targets/slack'
767
+ require 'custom_optional_targets/console_output'
768
+ acts_as_notifiable :admins, targets: Admin.all,
769
+ notifiable_path: :article_notifiable_path,
770
+ # Set optional target implementation class and initializing parameters
771
+ optional_targets: {
772
+ ActivityNotification::OptionalTarget::AmazonSNS => { topic_arn: 'arn:aws:sns:XXXXX:XXXXXXXXXXXX:XXXXX' },
773
+ ActivityNotification::OptionalTarget::Slack => {
774
+ webhook_url: 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX',
775
+ slack_name: :slack_name, channel: 'activity_notification', username: 'ActivityNotification', icon_emoji: ":ghost:"
776
+ },
777
+ CustomOptionalTarget::ConsoleOutput => {}
778
+ }
779
+
780
+ def article_notifiable_path
781
+ article_path(article)
782
+ end
783
+ end
784
+ ```
785
+
786
+ Write `require` statement for optional target implementation classes and set them with initializing parameters to `acts_as_notifiable`.
787
+ `activity_notification` will publish all notifications of those targets and notifiables to optional targets.
788
+
789
+ #### Customizing message format
790
+
791
+ Optional targets prepare publishing messages from notification instance using view template like rendering notifications.
792
+ As default, all optional targets use `app/views/activity_notification/optional_targets/default/base/_default.text.erb`.
793
+ You can customize this template by creating `app/views/activity_notification/optional_targets/<target_class_name>/<optional_target_class_name>/<notification_key>.text.(|erb|haml|slim|something_else)`.
794
+ For example, if you have a notification for `:users` target with `:key` set to `"notification.comment.reply"` and `ActivityNotification::OptionalTarget::AmazonSNS` optional target is configured, the gem will look for a partial in `app/views/activity_notification/optional_targets/users/amazon_sns/comment/_reply.text.erb`.
795
+ The gem will also look for templates whose `<target_class_name>` is `default`, `<optional_target_class_name>` is `base` or `<notification_key>` is `default`, which means `app/views/activity_notification/optional_targets/users/amazon_sns/_default.text.erb`, `app/views/activity_notification/optional_targets/users/base/_default.text.erb`, `app/views/activity_notification/optional_targets/default/amazon_sns/_default.text.erb` and `app/views/activity_notification/optional_targets/default/base/_default.text.erb`.
796
+
797
+ #### Amazon SNS as optional target
798
+
799
+ `activity_notification` provides `ActivityNotification::OptionalTarget::AmazonSNS` as default optional target implementation for Amazon SNS.
800
+
801
+ First, add `aws-sdk` gem to your Gemfile and set AWS Credentials for SDK (See [Configuring the AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v2/developer-guide/setup-config.html)).
802
+
803
+ ```ruby
804
+ gem 'aws-sdk', '~> 2'
805
+ ```
806
+
807
+ ```ruby
808
+ require 'aws-sdk'
809
+ Aws.config.update(
810
+ region: 'your_region',
811
+ credentials: Aws::Credentials.new('your_access_key_id', 'your_secret_access_key')
812
+ )
813
+ ```
814
+
815
+ Then, write `require 'activity_notification/optional_targets/amazon_sns'` statement in your notifiable model and set `ActivityNotification::OptionalTarget::AmazonSNS` to `acts_as_notifiable` with `:topic_arn`, `:target_arn` or `:phone_number` initializing parameters.
816
+ Any other options for `Aws::SNS::Client.new` are available as initializing parameters. See [API Reference of Class: Aws::SNS::Client](http://docs.aws.amazon.com/sdkforruby/api/Aws/SNS/Client.html) for more details.
817
+
818
+ ```ruby
819
+ class Comment < ActiveRecord::Base
820
+ require 'activity_notification/optional_targets/amazon_sns'
821
+ acts_as_notifiable :admins, targets: Admin.all,
822
+ optional_targets: {
823
+ ActivityNotification::OptionalTarget::AmazonSNS => { topic_arn: 'arn:aws:sns:XXXXX:XXXXXXXXXXXX:XXXXX' }
824
+ }
825
+ end
826
+ ```
827
+
828
+ #### Slack as optional target
829
+
830
+ `activity_notification` provides `ActivityNotification::OptionalTarget::Slack` as default optional target implementation for Slack.
831
+
832
+ First, add `slack-notifier` gem to your Gemfile and create Incoming WebHooks in Slack (See [Incoming WebHooks](https://wemakejp.slack.com/apps/A0F7XDUAZ-incoming-webhooks)).
833
+
834
+ ```ruby
835
+ gem 'slack-notifier'
836
+ ```
837
+
838
+ Then, write `require 'activity_notification/optional_targets/slack'` statement in your notifiable model and set `ActivityNotification::OptionalTarget::Slack` to `acts_as_notifiable` with `:webhook_url` and `:slack_name` initializing parameters. `:webhook_url` is created WebHook URL and required, `:slack_name` is target's slack user name as String value, symbol method name or lambda function and is optional.
839
+ Any other options for `Slack::Notifier.new` are available as initializing parameters. See [Github slack-notifier](https://github.com/stevenosloan/slack-notifier) and [API Reference of Class: Slack::Notifier](http://www.rubydoc.info/gems/slack-notifier/1.5.1/Slack/Notifier) for more details.
840
+
841
+ ```ruby
842
+ class Comment < ActiveRecord::Base
843
+ require 'activity_notification/optional_targets/slack'
844
+ acts_as_notifiable :admins, targets: Admin.all,
845
+ optional_targets: {
846
+ ActivityNotification::OptionalTarget::Slack => {
847
+ webhook_url: 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX',
848
+ slack_name: :slack_name, channel: 'activity_notification', username: 'ActivityNotification', icon_emoji: ":ghost:"
849
+ }
850
+ }
851
+ end
852
+ ```
853
+
854
+ #### Developing custom optional targets
855
+
856
+ You can develop any custom optional targets.
857
+ Custom optional target class must extend `ActivityNotification::OptionalTarget::Base` and override `initialize_target` and `notify` method.
858
+ You can use `render_notification_message` method to prepare message from notification instance using view template.
859
+
860
+ For example, create `lib/custom_optional_targets/amazon_sns.rb` as follows:
861
+
862
+ ```ruby
863
+ module CustomOptionalTarget
864
+ # Custom optional target implementation for mobile push notification or SMS using Amazon SNS.
865
+ class AmazonSNS < ActivityNotification::OptionalTarget::Base
866
+ require 'aws-sdk'
867
+
868
+ # Initialize method to prepare Aws::SNS::Client
869
+ def initialize_target(options = {})
870
+ @topic_arn = options.delete(:topic_arn)
871
+ @target_arn = options.delete(:target_arn)
872
+ @phone_number = options.delete(:phone_number)
873
+ @sns_client = Aws::SNS::Client.new(options)
874
+ end
875
+
876
+ # Publishes notification message to Amazon SNS
877
+ def notify(notification, options = {})
878
+ @sns_client.publish(
879
+ topic_arn: notification.target.resolve_value(options.delete(:topic_arn) || @topic_arn),
880
+ target_arn: notification.target.resolve_value(options.delete(:target_arn) || @target_arn),
881
+ phone_number: notification.target.resolve_value(options.delete(:phone_number) || @phone_number),
882
+ message: render_notification_message(notification, options)
883
+ )
884
+ end
885
+ end
886
+ end
887
+ ```
888
+
889
+ Then, you can configure them to notifiable model by `acts_as_notifiable` like this.
890
+
891
+ ```ruby
892
+ class Comment < ActiveRecord::Base
893
+ require 'custom_optional_targets/amazon_sns'
894
+ acts_as_notifiable :admins, targets: Admin.all,
895
+ optional_targets: {
896
+ CustomOptionalTarget::AmazonSNS => { topic_arn: 'arn:aws:sns:XXXXX:XXXXXXXXXXXX:XXXXX' }
897
+ }
898
+ end
899
+ ```
900
+
901
+ `acts_as_notifiable` creates optional target instances and calls `initialize_target` method with initializing parameters.
902
+
903
+
741
904
  ## Testing
742
905
 
743
906
  ### Testing your application