activity_notification 2.0.0 → 2.1.4

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +22 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  4. data/.github/pull_request_template.md +13 -0
  5. data/.gitignore +10 -3
  6. data/.travis.yml +6 -5
  7. data/CHANGELOG.md +60 -0
  8. data/Gemfile +8 -3
  9. data/Procfile +1 -1
  10. data/README.md +153 -1510
  11. data/activity_notification.gemspec +4 -1
  12. data/app/channels/activity_notification/notification_api_channel.rb +12 -0
  13. data/app/channels/activity_notification/notification_api_with_devise_channel.rb +46 -0
  14. data/app/channels/activity_notification/notification_channel.rb +2 -2
  15. data/app/channels/activity_notification/notification_with_devise_channel.rb +2 -2
  16. data/app/controllers/activity_notification/apidocs_controller.rb +75 -0
  17. data/app/controllers/activity_notification/notifications_api_controller.rb +143 -0
  18. data/app/controllers/activity_notification/notifications_api_with_devise_controller.rb +7 -0
  19. data/app/controllers/activity_notification/notifications_controller.rb +79 -53
  20. data/app/controllers/activity_notification/subscriptions_api_controller.rb +197 -0
  21. data/app/controllers/activity_notification/subscriptions_api_with_devise_controller.rb +7 -0
  22. data/app/controllers/activity_notification/subscriptions_controller.rb +78 -69
  23. data/app/views/activity_notification/notifications/default/_default.html.erb +18 -18
  24. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +14 -14
  25. data/app/views/activity_notification/notifications/default/index.html.erb +6 -6
  26. data/app/views/activity_notification/optional_targets/default/action_cable_channel/_default.html.erb +176 -0
  27. data/app/views/activity_notification/subscriptions/default/_form.html.erb +1 -1
  28. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +3 -31
  29. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +7 -7
  30. data/app/views/activity_notification/subscriptions/default/index.html.erb +11 -7
  31. data/bin/deploy_on_heroku.sh +3 -1
  32. data/docs/CODE_OF_CONDUCT.md +76 -0
  33. data/docs/CONTRIBUTING.md +36 -0
  34. data/docs/Functions.md +1130 -0
  35. data/docs/Setup.md +801 -0
  36. data/docs/Testing.md +148 -0
  37. data/gemfiles/Gemfile.rails-4.2 +5 -1
  38. data/gemfiles/Gemfile.rails-5.0 +6 -1
  39. data/gemfiles/Gemfile.rails-5.1 +6 -1
  40. data/gemfiles/Gemfile.rails-5.2 +6 -1
  41. data/gemfiles/{Gemfile.rails-6.0.rc → Gemfile.rails-6.0} +6 -5
  42. data/lib/activity_notification.rb +13 -0
  43. data/lib/activity_notification/apis/notification_api.rb +37 -93
  44. data/lib/activity_notification/apis/subscription_api.rb +20 -8
  45. data/lib/activity_notification/apis/swagger.rb +6 -0
  46. data/lib/activity_notification/common.rb +4 -1
  47. data/lib/activity_notification/config.rb +41 -21
  48. data/lib/activity_notification/controllers/common_api_controller.rb +30 -0
  49. data/lib/activity_notification/controllers/common_controller.rb +45 -21
  50. data/lib/activity_notification/controllers/concerns/swagger/error_responses.rb +55 -0
  51. data/lib/activity_notification/controllers/concerns/swagger/notifications_api.rb +273 -0
  52. data/lib/activity_notification/controllers/concerns/swagger/notifications_parameters.rb +92 -0
  53. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_api.rb +405 -0
  54. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_parameters.rb +50 -0
  55. data/lib/activity_notification/controllers/devise_authentication_controller.rb +7 -6
  56. data/lib/activity_notification/gem_version.rb +14 -0
  57. data/lib/activity_notification/helpers/errors.rb +2 -0
  58. data/lib/activity_notification/helpers/view_helpers.rb +4 -0
  59. data/lib/activity_notification/mailers/helpers.rb +17 -10
  60. data/lib/activity_notification/models/concerns/notifiable.rb +31 -15
  61. data/lib/activity_notification/models/concerns/subscriber.rb +12 -1
  62. data/lib/activity_notification/models/concerns/swagger/error_schema.rb +36 -0
  63. data/lib/activity_notification/models/concerns/swagger/notification_schema.rb +209 -0
  64. data/lib/activity_notification/models/concerns/swagger/subscription_schema.rb +162 -0
  65. data/lib/activity_notification/models/concerns/target.rb +36 -10
  66. data/lib/activity_notification/models/notification.rb +1 -0
  67. data/lib/activity_notification/models/subscription.rb +1 -0
  68. data/lib/activity_notification/optional_targets/action_cable_api_channel.rb +69 -0
  69. data/lib/activity_notification/optional_targets/action_cable_channel.rb +68 -0
  70. data/lib/activity_notification/optional_targets/base.rb +7 -13
  71. data/lib/activity_notification/orm/active_record/notification.rb +17 -1
  72. data/lib/activity_notification/orm/active_record/subscription.rb +1 -1
  73. data/lib/activity_notification/orm/dynamoid.rb +38 -3
  74. data/lib/activity_notification/orm/dynamoid/extension.rb +79 -1
  75. data/lib/activity_notification/orm/dynamoid/notification.rb +49 -14
  76. data/lib/activity_notification/orm/dynamoid/subscription.rb +2 -2
  77. data/lib/activity_notification/orm/mongoid.rb +32 -3
  78. data/lib/activity_notification/orm/mongoid/notification.rb +24 -6
  79. data/lib/activity_notification/orm/mongoid/subscription.rb +1 -1
  80. data/lib/activity_notification/rails/routes.rb +132 -48
  81. data/lib/activity_notification/renderable.rb +13 -2
  82. data/lib/activity_notification/roles/acts_as_notifiable.rb +39 -20
  83. data/lib/activity_notification/version.rb +1 -1
  84. data/lib/generators/activity_notification/controllers_generator.rb +2 -1
  85. data/lib/generators/templates/activity_notification.rb +8 -0
  86. data/lib/generators/templates/controllers/notifications_api_controller.rb +31 -0
  87. data/lib/generators/templates/controllers/notifications_api_with_devise_controller.rb +31 -0
  88. data/lib/generators/templates/controllers/notifications_controller.rb +1 -37
  89. data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +1 -45
  90. data/lib/generators/templates/controllers/subscriptions_api_controller.rb +61 -0
  91. data/lib/generators/templates/controllers/subscriptions_api_with_devise_controller.rb +61 -0
  92. data/lib/generators/templates/controllers/subscriptions_controller.rb +14 -37
  93. data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +14 -45
  94. data/lib/generators/templates/models/README +8 -4
  95. data/lib/generators/templates/models/notification.rb +1 -1
  96. data/lib/generators/templates/models/subscription.rb +1 -1
  97. data/package.json +8 -0
  98. data/spec/channels/notification_api_channel_shared_examples.rb +59 -0
  99. data/spec/channels/notification_api_channel_spec.rb +51 -0
  100. data/spec/channels/notification_api_with_devise_channel_spec.rb +78 -0
  101. data/spec/concerns/apis/notification_api_spec.rb +38 -3
  102. data/spec/concerns/models/notifiable_spec.rb +82 -18
  103. data/spec/concerns/models/subscriber_spec.rb +13 -16
  104. data/spec/concerns/models/target_spec.rb +32 -0
  105. data/spec/concerns/renderable_spec.rb +2 -2
  106. data/spec/config_spec.rb +26 -15
  107. data/spec/controllers/controller_spec_utility.rb +136 -0
  108. data/spec/controllers/notifications_api_controller_shared_examples.rb +506 -0
  109. data/spec/controllers/notifications_api_controller_spec.rb +19 -0
  110. data/spec/controllers/notifications_api_with_devise_controller_spec.rb +60 -0
  111. data/spec/controllers/notifications_controller_shared_examples.rb +54 -79
  112. data/spec/controllers/notifications_controller_spec.rb +1 -2
  113. data/spec/controllers/notifications_with_devise_controller_spec.rb +3 -12
  114. data/spec/controllers/subscriptions_api_controller_shared_examples.rb +750 -0
  115. data/spec/controllers/subscriptions_api_controller_spec.rb +19 -0
  116. data/spec/controllers/subscriptions_api_with_devise_controller_spec.rb +60 -0
  117. data/spec/controllers/subscriptions_controller_shared_examples.rb +94 -121
  118. data/spec/controllers/subscriptions_controller_spec.rb +1 -2
  119. data/spec/controllers/subscriptions_with_devise_controller_spec.rb +3 -12
  120. data/spec/helpers/view_helpers_spec.rb +4 -11
  121. data/spec/mailers/mailer_spec.rb +41 -0
  122. data/spec/models/notification_spec.rb +17 -0
  123. data/spec/models/subscription_spec.rb +8 -13
  124. data/spec/optional_targets/action_cable_api_channel_spec.rb +37 -0
  125. data/spec/optional_targets/action_cable_channel_spec.rb +44 -0
  126. data/spec/optional_targets/amazon_sns_spec.rb +0 -2
  127. data/spec/optional_targets/slack_spec.rb +0 -2
  128. data/spec/rails_app/Rakefile +9 -0
  129. data/spec/rails_app/app/assets/config/manifest.js +3 -0
  130. data/spec/rails_app/app/assets/images/.keep +0 -0
  131. data/spec/rails_app/app/controllers/admins_controller.rb +21 -0
  132. data/spec/rails_app/app/controllers/application_controller.rb +1 -1
  133. data/spec/rails_app/app/controllers/articles_controller.rb +6 -3
  134. data/spec/rails_app/app/controllers/spa_controller.rb +7 -0
  135. data/spec/rails_app/app/controllers/users/notifications_controller.rb +0 -65
  136. data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +0 -73
  137. data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +0 -77
  138. data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +0 -85
  139. data/spec/rails_app/app/controllers/users_controller.rb +26 -0
  140. data/spec/rails_app/app/javascript/App.vue +40 -0
  141. data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +82 -0
  142. data/spec/rails_app/app/javascript/components/Top.vue +98 -0
  143. data/spec/rails_app/app/javascript/components/notifications/Index.vue +200 -0
  144. data/spec/rails_app/app/javascript/components/notifications/Notification.vue +133 -0
  145. data/spec/rails_app/app/javascript/components/notifications/NotificationContent.vue +122 -0
  146. data/spec/rails_app/app/javascript/components/subscriptions/Index.vue +279 -0
  147. data/spec/rails_app/app/javascript/components/subscriptions/NewSubscription.vue +112 -0
  148. data/spec/rails_app/app/javascript/components/subscriptions/NotificationKey.vue +141 -0
  149. data/spec/rails_app/app/javascript/components/subscriptions/Subscription.vue +226 -0
  150. data/spec/rails_app/app/javascript/config/development.js +5 -0
  151. data/spec/rails_app/app/javascript/config/environment.js +7 -0
  152. data/spec/rails_app/app/javascript/config/production.js +5 -0
  153. data/spec/rails_app/app/javascript/config/test.js +5 -0
  154. data/spec/rails_app/app/javascript/packs/application.js +18 -0
  155. data/spec/rails_app/app/javascript/packs/spa.js +14 -0
  156. data/spec/rails_app/app/javascript/router/index.js +73 -0
  157. data/spec/rails_app/app/javascript/store/index.js +37 -0
  158. data/spec/rails_app/app/models/admin.rb +16 -15
  159. data/spec/rails_app/app/models/article.rb +26 -21
  160. data/spec/rails_app/app/models/comment.rb +24 -71
  161. data/spec/rails_app/app/models/dummy/dummy_group.rb +8 -0
  162. data/spec/rails_app/app/models/dummy/dummy_notifiable_target.rb +8 -0
  163. data/spec/rails_app/app/models/user.rb +44 -20
  164. data/spec/rails_app/app/views/activity_notification/notifications/default/article/_update.html.erb +146 -0
  165. data/spec/rails_app/app/views/articles/index.html.erb +51 -7
  166. data/spec/rails_app/app/views/articles/show.html.erb +1 -1
  167. data/spec/rails_app/app/views/layouts/_header.html.erb +8 -10
  168. data/spec/rails_app/app/views/spa/index.html.erb +2 -0
  169. data/spec/rails_app/babel.config.js +72 -0
  170. data/spec/rails_app/bin/webpack +18 -0
  171. data/spec/rails_app/bin/webpack-dev-server +18 -0
  172. data/spec/rails_app/config/application.rb +18 -2
  173. data/spec/rails_app/config/dynamoid.rb +11 -3
  174. data/spec/rails_app/config/environment.rb +2 -1
  175. data/spec/rails_app/config/environments/development.rb +5 -0
  176. data/spec/rails_app/config/environments/production.rb +6 -0
  177. data/spec/rails_app/config/environments/test.rb +5 -0
  178. data/spec/rails_app/config/initializers/activity_notification.rb +11 -3
  179. data/spec/rails_app/config/initializers/copy_it.aws.rb.template +6 -0
  180. data/spec/rails_app/config/initializers/devise_token_auth.rb +55 -0
  181. data/spec/rails_app/config/initializers/mysql.rb +9 -0
  182. data/spec/rails_app/config/locales/activity_notification.en.yml +2 -2
  183. data/spec/rails_app/config/routes.rb +37 -1
  184. data/spec/rails_app/config/webpack/development.js +5 -0
  185. data/spec/rails_app/config/webpack/environment.js +7 -0
  186. data/spec/rails_app/config/webpack/loaders/vue.js +6 -0
  187. data/spec/rails_app/config/webpack/production.js +5 -0
  188. data/spec/rails_app/config/webpack/test.js +5 -0
  189. data/spec/rails_app/config/webpacker.yml +97 -0
  190. data/spec/rails_app/db/migrate/20191201000000_add_tokens_to_users.rb +10 -0
  191. data/spec/rails_app/db/schema.rb +4 -1
  192. data/spec/rails_app/db/seeds.rb +10 -2
  193. data/spec/rails_app/lib/custom_optional_targets/raise_error.rb +14 -0
  194. data/spec/rails_app/package.json +23 -0
  195. data/spec/rails_app/postcss.config.js +12 -0
  196. data/spec/roles/acts_as_group_spec.rb +0 -2
  197. data/spec/roles/acts_as_notifiable_spec.rb +6 -8
  198. data/spec/roles/acts_as_notifier_spec.rb +0 -2
  199. data/spec/roles/acts_as_target_spec.rb +0 -4
  200. data/spec/spec_helper.rb +7 -15
  201. data/spec/version_spec.rb +31 -0
  202. metadata +191 -13
@@ -0,0 +1,197 @@
1
+ module ActivityNotification
2
+ # Controller to manage subscriptions API.
3
+ class SubscriptionsApiController < SubscriptionsController
4
+ # Include Swagger API reference
5
+ include Swagger::SubscriptionsApi
6
+ # Include CommonApiController to select target and define common methods
7
+ include CommonApiController
8
+ protect_from_forgery except: [:create]
9
+ before_action :set_subscription, except: [:index, :create, :find, :optional_target_names]
10
+ before_action ->{ validate_param(:key) }, only: [:find, :optional_target_names]
11
+
12
+ # Returns subscription index of the target.
13
+ #
14
+ # GET /:target_type/:target_id/subscriptions
15
+ # @overload index(params)
16
+ # @param [Hash] params Request parameter options for subscription index
17
+ # @option params [String] :filter (nil) Filter option to load subscription index by their configuration status (Nothing as all, 'configured' or 'unconfigured')
18
+ # @option params [String] :limit (nil) Limit to query for subscriptions
19
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
20
+ # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
21
+ # @return [JSON] configured_count: count of subscription index, subscriptions: subscription index, unconfigured_count: count of unconfigured notification keys, unconfigured_notification_keys: unconfigured notification keys
22
+ def index
23
+ super
24
+ json_response = { configured_count: @subscriptions.size, subscriptions: @subscriptions } if @subscriptions
25
+ json_response = (json_response || {}).merge(unconfigured_count: @notification_keys.size, unconfigured_notification_keys: @notification_keys) if @notification_keys
26
+ render json: json_response
27
+ end
28
+
29
+ # Creates new subscription.
30
+ #
31
+ # POST /:target_type/:target_id/subscriptions
32
+ # @overload create(params)
33
+ # @param [Hash] params Request parameters
34
+ # @option params [String] :subscription Subscription parameters
35
+ # @option params [String] :subscription[:key] Key of the subscription
36
+ # @option params [String] :subscription[:subscribing] (nil) Whether the target will subscribe to the notification
37
+ # @option params [String] :subscription[:subscribing_to_email] (nil) Whether the target will subscribe to the notification email
38
+ # @return [JSON] Created subscription
39
+ def create
40
+ render_invalid_parameter("Parameter is missing or the value is empty: subscription") and return if params[:subscription].blank?
41
+ optional_target_names = (params[:subscription][:optional_targets] || {}).keys.select { |key| !key.to_s.start_with?("subscribing_to_") }
42
+ optional_target_names.each do |optional_target_name|
43
+ subscribing_param = params[:subscription][:optional_targets][optional_target_name][:subscribing]
44
+ params[:subscription][:optional_targets]["subscribing_to_#{optional_target_name}"] = subscribing_param unless subscribing_param.nil?
45
+ end
46
+ super
47
+ render status: 201, json: subscription_json if @subscription
48
+ end
49
+
50
+ # Finds and shows a subscription from specified key.
51
+ #
52
+ # GET /:target_type/:target_id/subscriptions/find
53
+ # @overload index(params)
54
+ # @param [Hash] params Request parameter options for subscription index
55
+ # @option params [required, String] :key (nil) Key of the subscription
56
+ # @return [JSON] Found single subscription
57
+ def find
58
+ super
59
+ render json: subscription_json if @subscription
60
+ end
61
+
62
+ # Finds and returns configured optional_target names from specified key.
63
+ #
64
+ # GET /:target_type/:target_id/subscriptions/optional_target_names
65
+ # @overload index(params)
66
+ # @param [Hash] params Request parameter options for subscription index
67
+ # @option params [required, String] :key (nil) Key of the subscription
68
+ # @return [JSON] Configured optional_target names
69
+ def optional_target_names
70
+ latest_notification = @target.notifications.filtered_by_key(params[:key]).latest
71
+ latest_notification ?
72
+ render(json: { configured_count: latest_notification.optional_target_names.length, optional_target_names: latest_notification.optional_target_names }) :
73
+ render_resource_not_found("Couldn't find notification with this target and 'key'=#{params[:key]}")
74
+ end
75
+
76
+ # Shows a subscription.
77
+ #
78
+ # GET /:target_type/:target_id/subscriptions/:id
79
+ # @overload show(params)
80
+ # @param [Hash] params Request parameters
81
+ # @return [JSON] Found single subscription
82
+ def show
83
+ super
84
+ render json: subscription_json
85
+ end
86
+
87
+ # Deletes a subscription.
88
+ #
89
+ # DELETE /:target_type/:target_id/subscriptions/:id
90
+ #
91
+ # @overload destroy(params)
92
+ # @param [Hash] params Request parameters
93
+ # @return [JSON] 204 No Content
94
+ def destroy
95
+ super
96
+ head 204
97
+ end
98
+
99
+ # Updates a subscription to subscribe to the notifications.
100
+ #
101
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe
102
+ # @overload open(params)
103
+ # @param [Hash] params Request parameters
104
+ # @option params [String] :with_email_subscription ('true') Whether the subscriber also subscribes notification email
105
+ # @option params [String] :with_optional_targets ('true') Whether the subscriber also subscribes optional targets
106
+ # @return [JSON] Updated subscription
107
+ def subscribe
108
+ super
109
+ validate_and_render_subscription
110
+ end
111
+
112
+ # Updates a subscription to unsubscribe to the notifications.
113
+ #
114
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe
115
+ # @overload open(params)
116
+ # @param [Hash] params Request parameters
117
+ # @return [JSON] Updated subscription
118
+ def unsubscribe
119
+ super
120
+ validate_and_render_subscription
121
+ end
122
+
123
+ # Updates a subscription to subscribe to the notification email.
124
+ #
125
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_email
126
+ # @overload open(params)
127
+ # @param [Hash] params Request parameters
128
+ # @return [JSON] Updated subscription
129
+ def subscribe_to_email
130
+ super
131
+ validate_and_render_subscription
132
+ end
133
+
134
+ # Updates a subscription to unsubscribe to the notification email.
135
+ #
136
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_email
137
+ # @overload open(params)
138
+ # @param [Hash] params Request parameters
139
+ # @return [JSON] Updated subscription
140
+ def unsubscribe_to_email
141
+ super
142
+ validate_and_render_subscription
143
+ end
144
+
145
+ # Updates a subscription to subscribe to the specified optional target.
146
+ #
147
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
148
+ # @overload open(params)
149
+ # @param [Hash] params Request parameters
150
+ # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
151
+ # @return [JSON] Updated subscription
152
+ def subscribe_to_optional_target
153
+ super
154
+ validate_and_render_subscription
155
+ end
156
+
157
+ # Updates a subscription to unsubscribe to the specified optional target.
158
+ #
159
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
160
+ # @overload open(params)
161
+ # @param [Hash] params Request parameters
162
+ # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
163
+ # @return [JSON] Updated subscription
164
+ def unsubscribe_to_optional_target
165
+ super
166
+ validate_and_render_subscription
167
+ end
168
+
169
+ protected
170
+
171
+ # Returns include option for subscription JSON
172
+ # @api protected
173
+ def subscription_json_include_option
174
+ [:target].freeze
175
+ end
176
+
177
+ # Returns methods option for subscription JSON
178
+ # @api protected
179
+ def subscription_json_methods_option
180
+ [].freeze
181
+ end
182
+
183
+ # Returns JSON of @subscription
184
+ # @api protected
185
+ def subscription_json
186
+ @subscription.as_json(include: subscription_json_include_option, methods: subscription_json_methods_option)
187
+ end
188
+
189
+ # Validate @subscription and render JSON of @subscription
190
+ # @api protected
191
+ def validate_and_render_subscription
192
+ raise RecordInvalidError, @subscription.errors.full_messages.first if @subscription.invalid?
193
+ render json: subscription_json
194
+ end
195
+
196
+ end
197
+ end
@@ -0,0 +1,7 @@
1
+ module ActivityNotification
2
+ # Controller to manage subscriptions API with Devise authentication.
3
+ class SubscriptionsApiWithDeviseController < SubscriptionsApiController
4
+ include DeviseTokenAuth::Concerns::SetUserByToken if defined?(DeviseTokenAuth)
5
+ include DeviseAuthenticationController
6
+ end
7
+ end
@@ -3,54 +3,62 @@ module ActivityNotification
3
3
  class SubscriptionsController < ActivityNotification.config.parent_controller.constantize
4
4
  # Include CommonController to select target and define common methods
5
5
  include CommonController
6
- before_action :set_subscription, except: [:index, :create]
7
- before_action :validate_optional_target_param, only: [:subscribe_to_optional_target, :unsubscribe_to_optional_target]
6
+ before_action :set_subscription, except: [:index, :create, :find]
7
+ before_action ->{ validate_param(:key) }, only: [:find]
8
+ before_action ->{ validate_param(:optional_target_name) }, only: [:subscribe_to_optional_target, :unsubscribe_to_optional_target]
8
9
 
9
10
  # Shows subscription index of the target.
10
11
  #
11
12
  # GET /:target_type/:target_id/subscriptions
12
13
  # @overload index(params)
13
14
  # @param [Hash] params Request parameter options for subscription index
14
- # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
15
+ # @option params [String] :filter (nil) Filter option to load subscription index by their configuration status (Nothing as all, 'configured' or 'unconfigured')
15
16
  # @option params [String] :limit (nil) Limit to query for subscriptions
16
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
17
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
17
18
  # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
18
- # @return [Responce] HTML view as default or JSON of subscription index with json format parameter
19
+ # @return [Response] HTML view of subscription index
19
20
  def index
20
21
  set_index_options
21
22
  load_index if params[:reload].to_s.to_boolean(true)
22
- respond_to do |format|
23
- format.html # index.html.erb
24
- format.json { render json: { subscriptions: @subscriptions, unconfigured_notification_keys: @notification_keys } }
25
- end
26
23
  end
27
24
 
28
- # Creates a subscription.
29
- #
30
- # POST /:target_type/:target_id/subscriptions
25
+ # Creates new subscription.
31
26
  #
27
+ # PUT /:target_type/:target_id/subscriptions
32
28
  # @overload create(params)
33
29
  # @param [Hash] params Request parameters
34
30
  # @option params [String] :subscription Subscription parameters
35
31
  # @option params [String] :subscription[:key] Key of the subscription
36
- # @option params [String] :subscription[:subscribing] (nil) If the target will subscribe to the notification
37
- # @option params [String] :subscription[:subscribing_to_email] (nil) If the target will subscribe to the notification email
38
- # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
39
- # @option params [String] :limit (nil) Limit to query for subscriptions
40
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
41
- # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
42
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
32
+ # @option params [String] :subscription[:subscribing] (nil) Whether the target will subscribe to the notification
33
+ # @option params [String] :subscription[:subscribing_to_email] (nil) Whether the target will subscribe to the notification email
34
+ # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
35
+ # @option params [String] :limit (nil) Limit to query for subscriptions
36
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
37
+ # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
38
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
43
39
  def create
44
- @target.create_subscription(subscription_params)
40
+ @subscription = @target.create_subscription(subscription_params)
45
41
  return_back_or_ajax
46
42
  end
47
43
 
44
+ # Finds and shows a subscription from specified key.
45
+ #
46
+ # GET /:target_type/:target_id/subscriptions/find
47
+ # @overload index(params)
48
+ # @param [Hash] params Request parameter options for subscription index
49
+ # @option params [required, String] :key (nil) Key of the subscription
50
+ # @return [Response] HTML view as default or JSON of subscription index with json format parameter
51
+ def find
52
+ @subscription = @target.find_subscription(params[:key])
53
+ @subscription ? redirect_to_subscription_path : render_resource_not_found("Couldn't find subscription with this target and 'key'=#{params[:key]}")
54
+ end
55
+
48
56
  # Shows a subscription.
49
57
  #
50
58
  # GET /:target_type/:target_id/subscriptions/:id
51
59
  # @overload show(params)
52
60
  # @param [Hash] params Request parameters
53
- # @return [Responce] HTML view as default
61
+ # @return [Response] HTML view as default
54
62
  def show
55
63
  set_index_options
56
64
  end
@@ -58,109 +66,108 @@ module ActivityNotification
58
66
  # Deletes a subscription.
59
67
  #
60
68
  # DELETE /:target_type/:target_id/subscriptions/:id
61
- #
62
69
  # @overload destroy(params)
63
70
  # @param [Hash] params Request parameters
64
71
  # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
65
72
  # @option params [String] :limit (nil) Limit to query for subscriptions
66
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
73
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
67
74
  # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
68
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
75
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
69
76
  def destroy
70
77
  @subscription.destroy
71
78
  return_back_or_ajax
72
79
  end
73
80
 
74
- # Subscribes to the notification.
81
+ # Updates a subscription to subscribe to notifications.
75
82
  #
76
- # POST /:target_type/:target_id/subscriptions/:id/subscribe
83
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe
77
84
  # @overload open(params)
78
85
  # @param [Hash] params Request parameters
79
- # @option params [String] :with_email_subscription ('true') If the subscriber also subscribes notification email
80
- # @option params [String] :with_optional_targets ('true') If the subscriber also subscribes optional targets
86
+ # @option params [String] :with_email_subscription ('true') Whether the subscriber also subscribes notification email
87
+ # @option params [String] :with_optional_targets ('true') Whether the subscriber also subscribes optional targets
81
88
  # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
82
89
  # @option params [String] :limit (nil) Limit to query for subscriptions
83
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
90
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
84
91
  # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
85
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
92
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
86
93
  def subscribe
87
94
  @subscription.subscribe(with_email_subscription: params[:with_email_subscription].to_s.to_boolean(true),
88
95
  with_optional_targets: params[:with_optional_targets].to_s.to_boolean(true))
89
96
  return_back_or_ajax
90
97
  end
91
98
 
92
- # Unsubscribes to the notification.
99
+ # Updates a subscription to unsubscribe to the notifications.
93
100
  #
94
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe
101
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe
95
102
  # @overload open(params)
96
103
  # @param [Hash] params Request parameters
97
104
  # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
98
105
  # @option params [String] :limit (nil) Limit to query for subscriptions
99
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
106
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
100
107
  # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
101
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
108
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
102
109
  def unsubscribe
103
110
  @subscription.unsubscribe
104
111
  return_back_or_ajax
105
112
  end
106
113
 
107
- # Subscribes to the notification email.
114
+ # Updates a subscription to subscribe to the notification email.
108
115
  #
109
- # POST /:target_type/:target_id/subscriptions/:id/subscribe_email
116
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_email
110
117
  # @overload open(params)
111
118
  # @param [Hash] params Request parameters
112
119
  # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
113
120
  # @option params [String] :limit (nil) Limit to query for subscriptions
114
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
121
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
115
122
  # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
116
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
123
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
117
124
  def subscribe_to_email
118
125
  @subscription.subscribe_to_email
119
126
  return_back_or_ajax
120
127
  end
121
128
 
122
- # Unsubscribes to the notification email.
129
+ # Updates a subscription to unsubscribe to the notification email.
123
130
  #
124
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe_email
131
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_email
125
132
  # @overload open(params)
126
133
  # @param [Hash] params Request parameters
127
134
  # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
128
135
  # @option params [String] :limit (nil) Limit to query for subscriptions
129
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
136
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
130
137
  # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
131
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
138
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
132
139
  def unsubscribe_to_email
133
140
  @subscription.unsubscribe_to_email
134
141
  return_back_or_ajax
135
142
  end
136
143
 
137
- # Subscribes to the specified optional target.
144
+ # Updates a subscription to subscribe to the specified optional target.
138
145
  #
139
- # POST /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
146
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
140
147
  # @overload open(params)
141
148
  # @param [Hash] params Request parameters
142
- # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
143
- # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
144
- # @option params [String] :limit (nil) Limit to query for subscriptions
145
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
146
- # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
147
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
149
+ # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
150
+ # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
151
+ # @option params [String] :limit (nil) Limit to query for subscriptions
152
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
153
+ # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
154
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
148
155
  def subscribe_to_optional_target
149
156
  @subscription.subscribe_to_optional_target(params[:optional_target_name])
150
157
  return_back_or_ajax
151
158
  end
152
159
 
153
- # Unsubscribes to the specified optional target.
160
+ # Updates a subscription to unsubscribe to the specified optional target.
154
161
  #
155
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
162
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
156
163
  # @overload open(params)
157
164
  # @param [Hash] params Request parameters
158
- # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
159
- # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
160
- # @option params [String] :limit (nil) Limit to query for subscriptions
161
- # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
162
- # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
163
- # @return [Responce] JavaScript view for ajax request or redirects to back as default
165
+ # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
166
+ # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
167
+ # @option params [String] :limit (nil) Limit to query for subscriptions
168
+ # @option params [String] :reverse ('false') Whether subscription index and unconfigured notification keys will be ordered as earliest first
169
+ # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
170
+ # @return [Response] JavaScript view for ajax request or redirects to back as default
164
171
  def unsubscribe_to_optional_target
165
172
  @subscription.unsubscribe_to_optional_target(params[:optional_target_name])
166
173
  return_back_or_ajax
@@ -177,11 +184,14 @@ module ActivityNotification
177
184
 
178
185
  # Only allow a trusted parameter "white list" through.
179
186
  def subscription_params
180
- optional_targets = (params[:subscription][:optional_targets] || {}).keys.select { |key| key.to_s.start_with?("subscribing_to_") }
181
- optional_targets.each do |optional_target_key|
182
- params[:subscription][:optional_targets][optional_target_key] = params[:subscription][:optional_targets][optional_target_key].to_boolean
187
+ if params[:subscription].present?
188
+ optional_target_keys = (params[:subscription][:optional_targets] || {}).keys.select { |key| key.to_s.start_with?("subscribing_to_") }
189
+ optional_target_keys.each do |optional_target_key|
190
+ boolean_value = params[:subscription][:optional_targets][optional_target_key].respond_to?(:to_boolean) ? params[:subscription][:optional_targets][optional_target_key].to_boolean : !!params[:subscription][:optional_targets][optional_target_key]
191
+ params[:subscription][:optional_targets][optional_target_key] = boolean_value
192
+ end
183
193
  end
184
- params.require(:subscription).permit(:key, :subscribing, :subscribing_to_email, optional_targets: optional_targets)
194
+ params.require(:subscription).permit(:key, :subscribing, :subscribing_to_email, optional_targets: optional_target_keys)
185
195
  end
186
196
 
187
197
  # Sets options to load subscription index from request parameters.
@@ -212,6 +222,12 @@ module ActivityNotification
212
222
  end
213
223
  end
214
224
 
225
+ # Redirect to subscription path
226
+ # @api protected
227
+ def redirect_to_subscription_path
228
+ redirect_to action: :show, id: @subscription
229
+ end
230
+
215
231
  # Returns controller path.
216
232
  # This method is called from target_view_path method and can be overridden.
217
233
  # @api protected
@@ -220,12 +236,5 @@ module ActivityNotification
220
236
  "activity_notification/subscriptions"
221
237
  end
222
238
 
223
- # Validate optional_target_name param and return HTTP 400 unless it presents.
224
- def validate_optional_target_param
225
- if params[:optional_target_name].blank?
226
- render plain: "400 Bad Request: Missing parameter", status: 400
227
- end
228
- end
229
-
230
239
  end
231
240
  end