activity_notification 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +33 -0
- data/.rubocop.yml +1157 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile.lock +15 -17
- data/README.md +154 -27
- data/activity_notification.gemspec +1 -1
- data/app/controllers/activity_notification/notifications_controller.rb +30 -104
- data/app/controllers/activity_notification/notifications_with_devise_controller.rb +1 -33
- data/app/controllers/activity_notification/subscriptions_controller.rb +184 -0
- data/app/controllers/activity_notification/subscriptions_with_devise_controller.rb +6 -0
- data/app/mailers/activity_notification/mailer.rb +3 -3
- data/app/views/activity_notification/notifications/default/_index.html.erb +3 -0
- data/app/views/activity_notification/notifications/default/index.html.erb +8 -10
- data/app/views/activity_notification/notifications/default/show.html.erb +24 -2
- data/app/views/activity_notification/subscriptions/default/_form.html.erb +52 -0
- data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +89 -0
- data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +73 -0
- data/app/views/activity_notification/subscriptions/default/_subscriptions.html.erb +13 -0
- data/app/views/activity_notification/subscriptions/default/create.js.erb +5 -0
- data/app/views/activity_notification/subscriptions/default/destroy.js.erb +5 -0
- data/app/views/activity_notification/subscriptions/default/index.html.erb +197 -0
- data/app/views/activity_notification/subscriptions/default/show.html.erb +177 -0
- data/app/views/activity_notification/subscriptions/default/subscribe.js.erb +8 -0
- data/app/views/activity_notification/subscriptions/default/subscribe_to_email.js.erb +6 -0
- data/app/views/activity_notification/subscriptions/default/unsubscribe.js.erb +8 -0
- data/app/views/activity_notification/subscriptions/default/unsubscribe_to_email.js.erb +6 -0
- data/gemfiles/Gemfile.rails-4.2.lock +18 -20
- data/gemfiles/Gemfile.rails-5.0.lock +18 -20
- data/lib/activity_notification.rb +7 -3
- data/lib/activity_notification/apis/notification_api.rb +95 -61
- data/lib/activity_notification/apis/subscription_api.rb +51 -0
- data/lib/activity_notification/common.rb +1 -1
- data/lib/activity_notification/config.rb +65 -17
- data/lib/activity_notification/controllers/common_controller.rb +118 -0
- data/lib/activity_notification/controllers/devise_authentication_controller.rb +41 -0
- data/lib/activity_notification/helpers/view_helpers.rb +131 -3
- data/lib/activity_notification/mailers/helpers.rb +6 -8
- data/lib/activity_notification/models/concerns/notifiable.rb +45 -27
- data/lib/activity_notification/models/concerns/subscriber.rb +149 -0
- data/lib/activity_notification/models/concerns/target.rb +100 -66
- data/lib/activity_notification/models/notification.rb +7 -5
- data/lib/activity_notification/models/subscription.rb +93 -0
- data/lib/activity_notification/rails/routes.rb +148 -33
- data/lib/activity_notification/renderable.rb +3 -4
- data/lib/activity_notification/roles/acts_as_notifiable.rb +14 -1
- data/lib/activity_notification/roles/acts_as_target.rb +11 -8
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/activity_notification/controllers_generator.rb +2 -2
- data/lib/generators/activity_notification/install_generator.rb +0 -1
- data/lib/generators/activity_notification/migration/migration_generator.rb +8 -2
- data/lib/generators/activity_notification/models_generator.rb +53 -0
- data/lib/generators/activity_notification/views_generator.rb +7 -7
- data/lib/generators/templates/activity_notification.rb +17 -3
- data/lib/generators/templates/controllers/notifications_controller.rb +18 -17
- data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +18 -17
- data/lib/generators/templates/controllers/subscriptions_controller.rb +79 -0
- data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +87 -0
- data/lib/generators/templates/migrations/migration.rb +57 -0
- data/lib/generators/templates/models/README +10 -0
- data/lib/generators/templates/{notification → models}/notification.rb +1 -3
- data/lib/generators/templates/models/subscription.rb +4 -0
- data/spec/concerns/apis/notification_api_spec.rb +48 -11
- data/spec/concerns/apis/subscription_api_spec.rb +167 -0
- data/spec/concerns/models/notifiable_spec.rb +60 -0
- data/spec/concerns/models/subscriber_spec.rb +525 -0
- data/spec/concerns/models/target_spec.rb +271 -42
- data/spec/controllers/common_controller_spec.rb +25 -0
- data/spec/controllers/dummy_common_controller.rb +5 -0
- data/spec/controllers/notifications_controller_shared_examples.rb +2 -6
- data/spec/controllers/subscriptions_controller_shared_examples.rb +735 -0
- data/spec/controllers/subscriptions_controller_spec.rb +12 -0
- data/spec/controllers/subscriptions_with_devise_controller_spec.rb +91 -0
- data/spec/factories/dummy/dummy_subscriber.rb +4 -0
- data/spec/factories/subscriptions.rb +8 -0
- data/spec/generators/controllers_generator_spec.rb +25 -2
- data/spec/generators/migration/migration_generator_spec.rb +3 -3
- data/spec/generators/models_generator_spec.rb +96 -0
- data/spec/generators/views_generator_spec.rb +84 -0
- data/spec/helpers/view_helpers_spec.rb +143 -0
- data/spec/mailers/mailer_spec.rb +5 -4
- data/spec/models/dummy/dummy_subscriber_spec.rb +5 -0
- data/spec/models/notification_spec.rb +7 -7
- data/spec/models/subscription_spec.rb +158 -0
- data/spec/rails_app/app/controllers/users/notifications_controller.rb +67 -0
- data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +75 -0
- data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +79 -0
- data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +87 -0
- data/spec/rails_app/app/models/admin.rb +1 -0
- data/spec/rails_app/app/models/dummy/dummy_subscriber.rb +4 -0
- data/spec/rails_app/app/models/user.rb +2 -1
- data/spec/rails_app/app/views/activity_notification/mailer/dummy_subscribers/test_key.text.erb +1 -0
- data/spec/rails_app/app/views/articles/index.html.erb +6 -0
- data/spec/rails_app/config/initializers/activity_notification.rb +17 -3
- data/spec/rails_app/config/routes.rb +2 -2
- data/spec/rails_app/db/migrate/20160715050420_create_activity_notification_tables.rb +33 -0
- data/spec/rails_app/db/schema.rb +18 -0
- data/spec/roles/acts_as_notifiable_spec.rb +1 -1
- data/spec/roles/acts_as_target_spec.rb +1 -1
- metadata +70 -11
- data/lib/generators/activity_notification/notification/notification_generator.rb +0 -20
- data/lib/generators/templates/active_record/migration.rb +0 -18
- data/spec/generators/notification/notification_generator_spec.rb +0 -41
- data/spec/rails_app/db/migrate/20160715050420_create_notifications.rb +0 -18
@@ -0,0 +1,118 @@
|
|
1
|
+
module ActivityNotification
|
2
|
+
# Module included in controllers to select target
|
3
|
+
module CommonController
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
# Include StoreController to allow ActivityNotification access to controller instance
|
8
|
+
include StoreController
|
9
|
+
# Include PolymorphicHelpers to resolve string extentions
|
10
|
+
include PolymorphicHelpers
|
11
|
+
|
12
|
+
prepend_before_action :set_target
|
13
|
+
before_action :set_view_prefixes
|
14
|
+
end
|
15
|
+
|
16
|
+
DEFAULT_VIEW_DIRECTORY = "default"
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
# Sets @target instance variable from request parameters.
|
21
|
+
# @api protected
|
22
|
+
# @return [Object] Target instance (Returns HTTP 400 when request parameters are not enough)
|
23
|
+
def set_target
|
24
|
+
if (target_type = params[:target_type]).present?
|
25
|
+
target_class = target_type.to_model_class
|
26
|
+
@target = params[:target_id].present? ?
|
27
|
+
target_class.find_by_id!(params[:target_id]) :
|
28
|
+
target_class.find_by_id!(params["#{target_type.to_resource_name}_id"])
|
29
|
+
else
|
30
|
+
render plain: "400 Bad Request: Missing parameter", status: 400
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Validate target with belonging model (e.g. Notification and Subscription)
|
35
|
+
# @api protected
|
36
|
+
# @param [Object] belonging_model belonging model (e.g. Notification and Subscription)
|
37
|
+
# @return Nil or render HTTP 403 status
|
38
|
+
def validate_target(belonging_model)
|
39
|
+
if @target.present? && belonging_model.target != @target
|
40
|
+
render plain: "403 Forbidden: Wrong target", status: 403
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Sets options to load resource index from request parameters.
|
45
|
+
# This method is to be overriden.
|
46
|
+
# @api protected
|
47
|
+
# @return [Hash] options to load resource index
|
48
|
+
def set_index_options
|
49
|
+
raise NotImplementedError, "You have to implement #{self.class}##{__method__}"
|
50
|
+
end
|
51
|
+
|
52
|
+
# Loads resource index with request parameters.
|
53
|
+
# This method is to be overriden.
|
54
|
+
# @api protected
|
55
|
+
# @return [Array] Array of resource index
|
56
|
+
def load_index
|
57
|
+
raise NotImplementedError, "You have to implement #{self.class}##{__method__}"
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns controller path.
|
61
|
+
# This method is called from target_view_path method and can be overriden.
|
62
|
+
# @api protected
|
63
|
+
# @return [String] "activity_notification" as controller path
|
64
|
+
def controller_path
|
65
|
+
raise NotImplementedError, "You have to implement #{self.class}##{__method__}"
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns path of the target view templates.
|
69
|
+
# Do not make this method public unless Rendarable module calls controller's target_view_path method to render resources.
|
70
|
+
# @api protected
|
71
|
+
def target_view_path
|
72
|
+
target_type = @target.to_resources_name
|
73
|
+
view_path = [controller_path, target_type].join('/')
|
74
|
+
lookup_context.exists?(action_name, view_path) ?
|
75
|
+
view_path :
|
76
|
+
[controller_path, DEFAULT_VIEW_DIRECTORY].join('/')
|
77
|
+
end
|
78
|
+
|
79
|
+
# Sets view prefixes for target view path.
|
80
|
+
# @api protected
|
81
|
+
def set_view_prefixes
|
82
|
+
lookup_context.prefixes.prepend(target_view_path)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns JavaScript view for ajax request or redirects to back as default.
|
86
|
+
# @api protected
|
87
|
+
# @return [Responce] JavaScript view for ajax request or redirects to back as default
|
88
|
+
def return_back_or_ajax
|
89
|
+
set_index_options
|
90
|
+
respond_to do |format|
|
91
|
+
if request.xhr?
|
92
|
+
load_index if params[:reload].to_s.to_boolean(true)
|
93
|
+
format.js
|
94
|
+
else
|
95
|
+
compatibly_redirect_back(@index_options) and return
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Redirect to back.
|
101
|
+
# @api protected
|
102
|
+
# @return [Boolean] True
|
103
|
+
def compatibly_redirect_back(request_params = {})
|
104
|
+
# :skip-rails4:
|
105
|
+
if Rails::VERSION::MAJOR >= 5
|
106
|
+
redirect_back fallback_location: { action: :index }, **request_params
|
107
|
+
# :skip-rails4:
|
108
|
+
# :skip-rails5:
|
109
|
+
elsif request.referer
|
110
|
+
redirect_to :back, **request_params
|
111
|
+
else
|
112
|
+
redirect_to action: :index, **request_params
|
113
|
+
end
|
114
|
+
# :skip-rails5:
|
115
|
+
true
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ActivityNotification
|
2
|
+
# Module included in controllers to authenticate with Devise module
|
3
|
+
module DeviceAuthenticationController
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
prepend_before_action :authenticate_devise_resource!
|
8
|
+
before_action :authenticate_target!
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
# Authenticate devise resource by Devise (e.g. calling authenticate_user! method).
|
14
|
+
# @api protected
|
15
|
+
# @todo Needs to call authenticate method by more secure way
|
16
|
+
# @return [Responce] Redirects for unsigned in target by Devise, returns HTTP 403 without neccesary target method or returns 400 when request parameters are not enough
|
17
|
+
def authenticate_devise_resource!
|
18
|
+
if params[:devise_type].present?
|
19
|
+
authenticate_method_name = "authenticate_#{params[:devise_type].to_resource_name}!"
|
20
|
+
if respond_to?(authenticate_method_name)
|
21
|
+
send(authenticate_method_name)
|
22
|
+
else
|
23
|
+
render plain: "403 Forbidden: Unauthenticated", status: 403
|
24
|
+
end
|
25
|
+
else
|
26
|
+
render plain: "400 Bad Request: Missing parameter", status: 400
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Authenticate the target of requested notification with authenticated devise resource.
|
31
|
+
# @api protected
|
32
|
+
# @todo Needs to call authenticate method by more secure way
|
33
|
+
# @return [Responce] Returns HTTP 403 for unauthorized target
|
34
|
+
def authenticate_target!
|
35
|
+
current_resource_method_name = "current_#{params[:devise_type].to_resource_name}"
|
36
|
+
unless @target.authenticated_with_devise?(send(current_resource_method_name))
|
37
|
+
render plain: "403 Forbidden: Unauthorized target", status: 403
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -5,7 +5,7 @@ module ActivityNotification
|
|
5
5
|
# View helper for rendering an notification, calls {Notification#render} internally.
|
6
6
|
# @see Notification#render
|
7
7
|
#
|
8
|
-
# @param [Notification, Array<Notificaion>] Array or single instance of notifications to render
|
8
|
+
# @param [Notification, Array<Notificaion>] notifications Array or single instance of notifications to render
|
9
9
|
# @param [Hash] options Options for rendering notifications
|
10
10
|
# @option options [String, Symbol] :target (nil) Target type name to find template or i18n text
|
11
11
|
# @option options [String] :partial ("activity_notification/notifications/#{target}", controller.target_view_path, 'activity_notification/notifications/default') Partial template name
|
@@ -170,7 +170,7 @@ module ActivityNotification
|
|
170
170
|
|
171
171
|
# Returns open_all_notifications_url for the target of specified notification
|
172
172
|
#
|
173
|
-
# @param [
|
173
|
+
# @param [Target] target Target instance
|
174
174
|
# @param [Hash] params Request parameters
|
175
175
|
# @return [String] open_all_notifications_url for the target
|
176
176
|
# @todo Needs any other better implementation
|
@@ -179,6 +179,134 @@ module ActivityNotification
|
|
179
179
|
send("open_all_#{target.to_resource_name}_notifications_url", target, params)
|
180
180
|
end
|
181
181
|
|
182
|
+
# Returns subscriptions_path for the target
|
183
|
+
#
|
184
|
+
# @param [Object] target Target instance
|
185
|
+
# @param [Hash] params Request parameters
|
186
|
+
# @return [String] subscriptions_path for the target
|
187
|
+
# @todo Needs any other better implementation
|
188
|
+
def subscriptions_path_for(target, params = {})
|
189
|
+
send("#{target.to_resource_name}_subscriptions_path", target, params)
|
190
|
+
end
|
191
|
+
|
192
|
+
# Returns subscription_path for the subscription
|
193
|
+
#
|
194
|
+
# @param [Subscription] subscription Subscription instance
|
195
|
+
# @param [Hash] params Request parameters
|
196
|
+
# @return [String] subscription_path for the subscription
|
197
|
+
# @todo Needs any other better implementation
|
198
|
+
def subscription_path_for(subscription, params = {})
|
199
|
+
send("#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
|
200
|
+
end
|
201
|
+
|
202
|
+
# Returns subscribe_subscription_path for the target of specified subscription
|
203
|
+
#
|
204
|
+
# @param [Subscription] subscription Subscription instance
|
205
|
+
# @param [Hash] params Request parameters
|
206
|
+
# @return [String] subscription_path for the subscription
|
207
|
+
# @todo Needs any other better implementation
|
208
|
+
def subscribe_subscription_path_for(subscription, params = {})
|
209
|
+
send("subscribe_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
|
210
|
+
end
|
211
|
+
alias_method :subscribe_path_for, :subscribe_subscription_path_for
|
212
|
+
|
213
|
+
# Returns unsubscribe_subscription_path for the target of specified subscription
|
214
|
+
#
|
215
|
+
# @param [Subscription] subscription Subscription instance
|
216
|
+
# @param [Hash] params Request parameters
|
217
|
+
# @return [String] subscription_path for the subscription
|
218
|
+
# @todo Needs any other better implementation
|
219
|
+
def unsubscribe_subscription_path_for(subscription, params = {})
|
220
|
+
send("unsubscribe_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
|
221
|
+
end
|
222
|
+
alias_method :unsubscribe_path_for, :unsubscribe_subscription_path_for
|
223
|
+
|
224
|
+
# Returns subscribe_to_email_subscription_path for the target of specified subscription
|
225
|
+
#
|
226
|
+
# @param [Subscription] subscription Subscription instance
|
227
|
+
# @param [Hash] params Request parameters
|
228
|
+
# @return [String] subscription_path for the subscription
|
229
|
+
# @todo Needs any other better implementation
|
230
|
+
def subscribe_to_email_subscription_path_for(subscription, params = {})
|
231
|
+
send("subscribe_to_email_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
|
232
|
+
end
|
233
|
+
alias_method :subscribe_to_email_path_for, :subscribe_to_email_subscription_path_for
|
234
|
+
|
235
|
+
# Returns unsubscribe_to_email_subscription_path for the target of specified subscription
|
236
|
+
#
|
237
|
+
# @param [Subscription] subscription Subscription instance
|
238
|
+
# @param [Hash] params Request parameters
|
239
|
+
# @return [String] subscription_path for the subscription
|
240
|
+
# @todo Needs any other better implementation
|
241
|
+
def unsubscribe_to_email_subscription_path_for(subscription, params = {})
|
242
|
+
send("unsubscribe_to_email_#{subscription.target.to_resource_name}_subscription_path", subscription.target, subscription, params)
|
243
|
+
end
|
244
|
+
alias_method :unsubscribe_to_email_path_for, :unsubscribe_to_email_subscription_path_for
|
245
|
+
|
246
|
+
# Returns subscriptions_url for the target
|
247
|
+
#
|
248
|
+
# @param [Object] target Target instance
|
249
|
+
# @param [Hash] params Request parameters
|
250
|
+
# @return [String] subscriptions_url for the target
|
251
|
+
# @todo Needs any other better implementation
|
252
|
+
def subscriptions_url_for(target, params = {})
|
253
|
+
send("#{target.to_resource_name}_subscriptions_url", target, params)
|
254
|
+
end
|
255
|
+
|
256
|
+
# Returns subscription_url for the subscription
|
257
|
+
#
|
258
|
+
# @param [Subscription] subscription Subscription instance
|
259
|
+
# @param [Hash] params Request parameters
|
260
|
+
# @return [String] subscription_url for the subscription
|
261
|
+
# @todo Needs any other better implementation
|
262
|
+
def subscription_url_for(subscription, params = {})
|
263
|
+
send("#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
|
264
|
+
end
|
265
|
+
|
266
|
+
# Returns subscribe_subscription_url for the target of specified subscription
|
267
|
+
#
|
268
|
+
# @param [Subscription] subscription Subscription instance
|
269
|
+
# @param [Hash] params Request parameters
|
270
|
+
# @return [String] subscription_url for the subscription
|
271
|
+
# @todo Needs any other better implementation
|
272
|
+
def subscribe_subscription_url_for(subscription, params = {})
|
273
|
+
send("subscribe_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
|
274
|
+
end
|
275
|
+
alias_method :subscribe_url_for, :subscribe_subscription_url_for
|
276
|
+
|
277
|
+
# Returns unsubscribe_subscription_url for the target of specified subscription
|
278
|
+
#
|
279
|
+
# @param [Subscription] subscription Subscription instance
|
280
|
+
# @param [Hash] params Request parameters
|
281
|
+
# @return [String] subscription_url for the subscription
|
282
|
+
# @todo Needs any other better implementation
|
283
|
+
def unsubscribe_subscription_url_for(subscription, params = {})
|
284
|
+
send("unsubscribe_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
|
285
|
+
end
|
286
|
+
alias_method :unsubscribe_url_for, :unsubscribe_subscription_url_for
|
287
|
+
|
288
|
+
# Returns subscribe_to_email_subscription_url for the target of specified subscription
|
289
|
+
#
|
290
|
+
# @param [Subscription] subscription Subscription instance
|
291
|
+
# @param [Hash] params Request parameters
|
292
|
+
# @return [String] subscription_url for the subscription
|
293
|
+
# @todo Needs any other better implementation
|
294
|
+
def subscribe_to_email_subscription_url_for(subscription, params = {})
|
295
|
+
send("subscribe_to_email_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
|
296
|
+
end
|
297
|
+
alias_method :subscribe_to_email_url_for, :subscribe_to_email_subscription_url_for
|
298
|
+
|
299
|
+
# Returns unsubscribe_to_email_subscription_url for the target of specified subscription
|
300
|
+
#
|
301
|
+
# @param [Subscription] subscription Subscription instance
|
302
|
+
# @param [Hash] params Request parameters
|
303
|
+
# @return [String] subscription_url for the subscription
|
304
|
+
# @todo Needs any other better implementation
|
305
|
+
def unsubscribe_to_email_subscription_url_for(subscription, params = {})
|
306
|
+
send("unsubscribe_to_email_#{subscription.target.to_resource_name}_subscription_url", subscription.target, subscription, params)
|
307
|
+
end
|
308
|
+
alias_method :unsubscribe_to_email_url_for, :unsubscribe_to_email_subscription_url_for
|
309
|
+
|
182
310
|
|
183
311
|
private
|
184
312
|
|
@@ -187,7 +315,7 @@ module ActivityNotification
|
|
187
315
|
#
|
188
316
|
# @param [Object] target Notification target instance
|
189
317
|
# @param [Symbol] index_content Method to load target notification index, [:simple, :unopened_simple, :opened_simple, :with_attributes, :unopened_with_attributes, :opened_with_attributes, :none] are available
|
190
|
-
# @param [Hash]
|
318
|
+
# @param [Hash] options Option parameter to load notification index
|
191
319
|
# @return [Array<Notification>] Array of notification index
|
192
320
|
def load_notification_index(target, index_content, options = {})
|
193
321
|
case index_content
|
@@ -23,13 +23,11 @@ module ActivityNotification
|
|
23
23
|
#
|
24
24
|
# @param [Object] target Target of batch notification email
|
25
25
|
# @param [Array<Notification>] notifications Target notifications to send batch notification email
|
26
|
+
# @param [String] batch_key Key of the batch notification email
|
26
27
|
# @param [Hash] options Options for notification email
|
27
|
-
# @option options [String, Symbol] :fallback
|
28
|
-
|
29
|
-
def batch_notification_mail(target, notifications, options = {})
|
28
|
+
# @option options [String, Symbol] :fallback (:batch_default) Fallback template to use when MissingTemplate is raised
|
29
|
+
def batch_notification_mail(target, notifications, batch_key, options = {})
|
30
30
|
initialize_from_notifications(target, notifications)
|
31
|
-
batch_key = options.delete(:batch_key)
|
32
|
-
batch_key ||= @notification.key
|
33
31
|
headers = headers_for(batch_key, options)
|
34
32
|
@notification = nil
|
35
33
|
send_mail(headers, options[:fallback])
|
@@ -55,8 +53,8 @@ module ActivityNotification
|
|
55
53
|
# @param [String] key Key of the notification
|
56
54
|
# @param [Hash] options Options for email notification
|
57
55
|
def headers_for(key, options)
|
58
|
-
if !@batch_email
|
59
|
-
@notification.notifiable.respond_to?(:overriding_notification_email_key)
|
56
|
+
if !@batch_email &&
|
57
|
+
@notification.notifiable.respond_to?(:overriding_notification_email_key) &&
|
60
58
|
@notification.notifiable.overriding_notification_email_key(@target, key).present?
|
61
59
|
key = @notification.notifiable.overriding_notification_email_key(@target, key)
|
62
60
|
end
|
@@ -126,7 +124,7 @@ module ActivityNotification
|
|
126
124
|
# @param [String] key Key of the notification
|
127
125
|
# @return [String] Template name
|
128
126
|
def template_name(key)
|
129
|
-
key.
|
127
|
+
key.tr('.', '/')
|
130
128
|
end
|
131
129
|
|
132
130
|
|
@@ -20,6 +20,7 @@ module ActivityNotification
|
|
20
20
|
|
21
21
|
class_attribute :_notification_targets,
|
22
22
|
:_notification_group,
|
23
|
+
:_notification_group_expiry_delay,
|
23
24
|
:_notifier,
|
24
25
|
:_notification_parameters,
|
25
26
|
:_notification_email_allowed,
|
@@ -44,13 +45,14 @@ module ActivityNotification
|
|
44
45
|
# Sets default values to notifiable class fields.
|
45
46
|
# @return [NilClass] nil
|
46
47
|
def set_notifiable_class_defaults
|
47
|
-
self._notification_targets
|
48
|
-
self._notification_group
|
49
|
-
self.
|
50
|
-
self.
|
51
|
-
self.
|
52
|
-
self.
|
53
|
-
self.
|
48
|
+
self._notification_targets = {}
|
49
|
+
self._notification_group = {}
|
50
|
+
self._notification_group_expiry_delay = {}
|
51
|
+
self._notifier = {}
|
52
|
+
self._notification_parameters = {}
|
53
|
+
self._notification_email_allowed = {}
|
54
|
+
self._notifiable_path = {}
|
55
|
+
self._printable_notifiable_name = {}
|
54
56
|
nil
|
55
57
|
end
|
56
58
|
end
|
@@ -74,12 +76,12 @@ module ActivityNotification
|
|
74
76
|
resolved_parameter
|
75
77
|
end
|
76
78
|
|
77
|
-
# Returns group
|
79
|
+
# Returns group unit of the notifications from configured field or overriden method.
|
78
80
|
# This method is able to be overriden.
|
79
81
|
#
|
80
82
|
# @param [String] target_type Target type to notify
|
81
83
|
# @param [String] key Key of the notification
|
82
|
-
# @return [Object] Group
|
84
|
+
# @return [Object] Group unit of the notifications
|
83
85
|
def notification_group(target_type, key = nil)
|
84
86
|
resolve_parameter(
|
85
87
|
"notification_group_for_#{cast_to_resources_name(target_type)}",
|
@@ -87,6 +89,19 @@ module ActivityNotification
|
|
87
89
|
nil, key)
|
88
90
|
end
|
89
91
|
|
92
|
+
# Returns group expiry period of the notifications from configured field or overriden method.
|
93
|
+
# This method is able to be overriden.
|
94
|
+
#
|
95
|
+
# @param [String] target_type Target type to notify
|
96
|
+
# @param [String] key Key of the notification
|
97
|
+
# @return [Object] Group expiry period of the notifications
|
98
|
+
def notification_group_expiry_delay(target_type, key = nil)
|
99
|
+
resolve_parameter(
|
100
|
+
"notification_group_expiry_delay_for_#{cast_to_resources_name(target_type)}",
|
101
|
+
_notification_group_expiry_delay[cast_to_resources_sym(target_type)],
|
102
|
+
nil, key)
|
103
|
+
end
|
104
|
+
|
90
105
|
# Returns additional notification parameters from configured field or overriden method.
|
91
106
|
# This method is able to be overriden.
|
92
107
|
#
|
@@ -173,12 +188,13 @@ module ActivityNotification
|
|
173
188
|
#
|
174
189
|
# @param [Symbol, String, Class] target_type Type of target
|
175
190
|
# @param [Hash] options Options for notifications
|
176
|
-
# @option options [String]
|
177
|
-
# @option options [Object]
|
178
|
-
# @option options [
|
179
|
-
# @option options [
|
180
|
-
# @option options [
|
181
|
-
# @option options [Boolean]
|
191
|
+
# @option options [String] :key (notifiable.default_notification_key) Key of the notification
|
192
|
+
# @option options [Object] :group (nil) Group unit of the notifications
|
193
|
+
# @option options [ActiveSupport::Duration] :group_expiry_delay (nil) Expiry period of a notification group
|
194
|
+
# @option options [Object] :notifier (nil) Notifier of the notifications
|
195
|
+
# @option options [Hash] :parameters ({}) Additional parameters of the notifications
|
196
|
+
# @option options [Boolean] :send_email (true) Whether it sends notification email
|
197
|
+
# @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
|
182
198
|
# @return [Array<Notificaion>] Array of generated notifications
|
183
199
|
def notify(target_type, options = {})
|
184
200
|
Notification.notify(target_type, self, options)
|
@@ -190,12 +206,13 @@ module ActivityNotification
|
|
190
206
|
#
|
191
207
|
# @param [Array<Object>] targets Targets to send notifications
|
192
208
|
# @param [Hash] options Options for notifications
|
193
|
-
# @option options [String]
|
194
|
-
# @option options [Object]
|
195
|
-
# @option options [
|
196
|
-
# @option options [
|
197
|
-
# @option options [
|
198
|
-
# @option options [Boolean]
|
209
|
+
# @option options [String] :key (notifiable.default_notification_key) Key of the notification
|
210
|
+
# @option options [Object] :group (nil) Group unit of the notifications
|
211
|
+
# @option options [ActiveSupport::Duration] :group_expiry_delay (nil) Expiry period of a notification group
|
212
|
+
# @option options [Object] :notifier (nil) Notifier of the notifications
|
213
|
+
# @option options [Hash] :parameters ({}) Additional parameters of the notifications
|
214
|
+
# @option options [Boolean] :send_email (true) Whether it sends notification email
|
215
|
+
# @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
|
199
216
|
# @return [Array<Notificaion>] Array of generated notifications
|
200
217
|
def notify_all(targets, options = {})
|
201
218
|
Notification.notify_all(targets, self, options)
|
@@ -207,12 +224,13 @@ module ActivityNotification
|
|
207
224
|
#
|
208
225
|
# @param [Object] target Target to send notifications
|
209
226
|
# @param [Hash] options Options for notifications
|
210
|
-
# @option options [String]
|
211
|
-
# @option options [Object]
|
212
|
-
# @option options [
|
213
|
-
# @option options [
|
214
|
-
# @option options [
|
215
|
-
# @option options [Boolean]
|
227
|
+
# @option options [String] :key (notifiable.default_notification_key) Key of the notification
|
228
|
+
# @option options [Object] :group (nil) Group unit of the notifications
|
229
|
+
# @option options [ActiveSupport::Duration] :group_expiry_delay (nil) Expiry period of a notification group
|
230
|
+
# @option options [Object] :notifier (nil) Notifier of the notifications
|
231
|
+
# @option options [Hash] :parameters ({}) Additional parameters of the notifications
|
232
|
+
# @option options [Boolean] :send_email (true) Whether it sends notification email
|
233
|
+
# @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
|
216
234
|
# @return [Notification] Generated notification instance
|
217
235
|
def notify_to(target, options = {})
|
218
236
|
Notification.notify_to(target, self, options)
|