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,149 @@
|
|
1
|
+
module ActivityNotification
|
2
|
+
# Subscriber implementation included in target model to manage subscriptions, like users or administrators.
|
3
|
+
module Subscriber
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
included do
|
6
|
+
# Has many subscription instances of this target.
|
7
|
+
# @scope instance
|
8
|
+
# @return [Array<Notificaion>] Array or database query of subscriptions of this target
|
9
|
+
has_many :subscriptions,
|
10
|
+
class_name: "::ActivityNotification::Subscription",
|
11
|
+
as: :target,
|
12
|
+
dependent: :delete_all
|
13
|
+
end
|
14
|
+
|
15
|
+
class_methods do
|
16
|
+
# Checks if the model includes subscriber and subscriber methods are available.
|
17
|
+
# Also checks if the model includes target and target methods are available, then return true.
|
18
|
+
# @return [Boolean] If the model includes target and subscriber are available
|
19
|
+
def available_as_subscriber?
|
20
|
+
available_as_target?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# Gets subscription of the target and notification key.
|
26
|
+
#
|
27
|
+
# @param [Hash] key Key of the notification for subscription
|
28
|
+
# @return [Subscription] Configured subscription instance
|
29
|
+
def find_subscription(key)
|
30
|
+
subscriptions.find_by_key(key)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Gets subscription of the target and notification key.
|
34
|
+
#
|
35
|
+
# @param [Hash] key Key of the notification for subscription
|
36
|
+
# @param [Hash] subscription_params Parameters to create subscription record
|
37
|
+
# @return [Subscription] Found or created subscription instance
|
38
|
+
def find_or_create_subscription(key, subscription_params = {})
|
39
|
+
subscription = find_subscription(key)
|
40
|
+
subscription || create_subscription(subscription_params.merge(key: key))
|
41
|
+
end
|
42
|
+
|
43
|
+
# Creates new subscription of the target.
|
44
|
+
#
|
45
|
+
# @param [Hash] subscription_params Parameters to create subscription record
|
46
|
+
# @return [Subscription] Created subscription instance
|
47
|
+
def create_subscription(subscription_params = {})
|
48
|
+
created_at = Time.current
|
49
|
+
if subscription_params[:subscribing] == false && subscription_params[:subscribing_to_email].nil?
|
50
|
+
subscription_params[:subscribing_to_email] = subscription_params[:subscribing]
|
51
|
+
end
|
52
|
+
subscription = subscriptions.new(subscription_params)
|
53
|
+
subscription.subscribing ?
|
54
|
+
subscription.assign_attributes(subscribing: true, subscribed_at: created_at) :
|
55
|
+
subscription.assign_attributes(subscribing: false, unsubscribed_at: created_at)
|
56
|
+
subscription.subscribing_to_email ?
|
57
|
+
subscription.assign_attributes(subscribing_to_email: true, subscribed_to_email_at: created_at) :
|
58
|
+
subscription.assign_attributes(subscribing_to_email: false, unsubscribed_to_email_at: created_at)
|
59
|
+
subscription.save ? subscription : nil
|
60
|
+
end
|
61
|
+
|
62
|
+
# Gets configured subscription index of the target.
|
63
|
+
#
|
64
|
+
# @example Get configured subscription index of the @user
|
65
|
+
# @subscriptions = @user.subscription_index
|
66
|
+
#
|
67
|
+
# @param [Hash] options Options for subscription index
|
68
|
+
# @option options [Integer] :limit (nil) Limit to query for subscriptions
|
69
|
+
# @option options [Boolean] :reverse (false) If subscription index will be ordered as earliest first
|
70
|
+
# @option options [String] :filtered_by_key (nil) Key of the notification for filter
|
71
|
+
# @option options [Array|Hash] :custom_filter (nil) Custom subscription filter (e.g. ["created_at >= ?", time.hour.ago])
|
72
|
+
# @option options [Boolean] :with_target (false) If it includes target with subscriptions
|
73
|
+
# @return [Array<Notificaion>] Configured subscription index of the target
|
74
|
+
def subscription_index(options = {})
|
75
|
+
target_index = subscriptions.filtered_by_options(options)
|
76
|
+
target_index = options[:reverse] ? target_index.earliest_order : target_index.latest_order
|
77
|
+
target_index = target_index.includes(:target) if options[:with_target]
|
78
|
+
options[:limit].present? ? target_index.limit(options[:limit]) : target_index
|
79
|
+
end
|
80
|
+
|
81
|
+
# Gets received notification keys of the target.
|
82
|
+
#
|
83
|
+
# @example Get unconfigured notification keys of the @user
|
84
|
+
# @notification_keys = @user.notification_keys(filter: :unconfigured)
|
85
|
+
#
|
86
|
+
# @param [Hash] options Options for unconfigured notification keys
|
87
|
+
# @option options [Integer] :limit (nil) Limit to query for subscriptions
|
88
|
+
# @option options [Boolean] :reverse (false) If notification keys will be ordered as earliest first
|
89
|
+
# @option options [Symbol|String] :filter (nil) Filter option to load notification keys (Nothing as all, 'configured' with configured subscriptions or 'unconfigured' without subscriptions)
|
90
|
+
# @option options [String] :filtered_by_key (nil) Key of the notification for filter
|
91
|
+
# @option options [Array|Hash] :custom_filter (nil) Custom subscription filter (e.g. ["created_at >= ?", time.hour.ago])
|
92
|
+
# @return [Array<Notificaion>] Unconfigured notification keys of the target
|
93
|
+
def notification_keys(options = {})
|
94
|
+
subscription_keys = subscriptions.select(:key).distinct.pluck(:key)
|
95
|
+
target_notifications = notifications.filtered_by_options(options.select { |k, _| [:filtered_by_key, :custom_filter].include?(k) })
|
96
|
+
target_notifications = options[:reverse] ? target_notifications.earliest_order : target_notifications.latest_order
|
97
|
+
target_notifications = options[:limit].present? ? target_notifications.limit(options[:limit] + subscription_keys.size) : target_notifications
|
98
|
+
notification_keys = target_notifications.select(:key).distinct.pluck(:key)
|
99
|
+
notification_keys =
|
100
|
+
case options[:filter]
|
101
|
+
when :configured, 'configured'
|
102
|
+
notification_keys & subscription_keys
|
103
|
+
when :unconfigured, 'unconfigured'
|
104
|
+
notification_keys - subscription_keys
|
105
|
+
else
|
106
|
+
notification_keys
|
107
|
+
end
|
108
|
+
options[:limit].present? ? notification_keys.take(options[:limit]) : notification_keys
|
109
|
+
end
|
110
|
+
|
111
|
+
protected
|
112
|
+
|
113
|
+
# Returns if the target subscribes to the notification.
|
114
|
+
# This method can be overriden.
|
115
|
+
# @api protected
|
116
|
+
#
|
117
|
+
# @param [String] key Key of the notification
|
118
|
+
# @param [Boolean] subscribe_as_default Default subscription value to use when the subscription record does not configured
|
119
|
+
# @return [Boolean] If the target subscribes to the notification
|
120
|
+
def _subscribes_to_notification?(key, subscribe_as_default = ActivityNotification.config.subscribe_as_default)
|
121
|
+
evaluate_subscription(subscriptions.find_by_key(key), :subscribing, subscribe_as_default)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Returns if the target subscribes to the notification email.
|
125
|
+
# This method can be overriden.
|
126
|
+
# @api protected
|
127
|
+
#
|
128
|
+
# @param [String] key Key of the notification
|
129
|
+
# @param [Boolean] subscribe_as_default Default subscription value to use when the subscription record does not configured
|
130
|
+
# @return [Boolean] If the target subscribes to the notification
|
131
|
+
def _subscribes_to_notification_email?(key, subscribe_as_default = ActivityNotification.config.subscribe_as_default)
|
132
|
+
evaluate_subscription(subscriptions.find_by_key(key), :subscribing_to_email, subscribe_as_default)
|
133
|
+
end
|
134
|
+
alias_method :_subscribes_to_email?, :_subscribes_to_notification_email?
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
# Returns if the target subscribes.
|
139
|
+
# @api private
|
140
|
+
# @param [Boolean] record Subscription record
|
141
|
+
# @param [Symbol] field Evaluating subscription field of the record
|
142
|
+
# @param [Boolean] default Default subscription value to use when the subscription record does not configured
|
143
|
+
# @return [Boolean] If the target subscribes
|
144
|
+
def evaluate_subscription(record, field, default)
|
145
|
+
default ? record.blank? || record.send(field) : record.present? && record.send(field)
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
@@ -16,6 +16,7 @@ module ActivityNotification
|
|
16
16
|
class_attribute :_notification_email,
|
17
17
|
:_notification_email_allowed,
|
18
18
|
:_batch_notification_email_allowed,
|
19
|
+
:_notification_subscription_allowed,
|
19
20
|
:_notification_devise_resource,
|
20
21
|
:_printable_notification_target_name
|
21
22
|
set_target_class_defaults
|
@@ -34,6 +35,7 @@ module ActivityNotification
|
|
34
35
|
self._notification_email = nil
|
35
36
|
self._notification_email_allowed = ActivityNotification.config.email_enabled
|
36
37
|
self._batch_notification_email_allowed = ActivityNotification.config.email_enabled
|
38
|
+
self._notification_subscription_allowed = ActivityNotification.config.subscription_enabled
|
37
39
|
self._notification_devise_resource = ->(model) { model }
|
38
40
|
self._printable_notification_target_name = :printable_name
|
39
41
|
nil
|
@@ -45,6 +47,7 @@ module ActivityNotification
|
|
45
47
|
# @option options [Boolean] :reverse (false) If notification index will be ordered as earliest first
|
46
48
|
# @option options [Boolean] :with_group_members (false) If notification index will include group members
|
47
49
|
# @option options [Boolean] :as_latest_group_member (false) If grouped notification will be shown as the latest group member (default is shown as the earliest member)
|
50
|
+
# @option options [String] :filtered_by_status (:all) Status for filter, :all, :opened and :unopened are available
|
48
51
|
# @option options [String] :filtered_by_type (nil) Notifiable type for filter
|
49
52
|
# @option options [Object] :filtered_by_group (nil) Group instance for filter
|
50
53
|
# @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
@@ -53,12 +56,23 @@ module ActivityNotification
|
|
53
56
|
# @option options [Array|Hash] :custom_filter (nil) Custom notification filter (e.g. ["created_at >= ?", time.hour.ago])
|
54
57
|
# @return [Array<Notificaion>] All notifications for this target type
|
55
58
|
def all_notifications(options = {})
|
56
|
-
reverse
|
57
|
-
with_group_members
|
59
|
+
reverse = options[:reverse] || false
|
60
|
+
with_group_members = options[:with_group_members] || false
|
61
|
+
as_latest_group_member = options[:as_latest_group_member] || false
|
58
62
|
target_notifications = Notification.filtered_by_target_type(self.name)
|
59
63
|
.all_index!(reverse, with_group_members)
|
60
64
|
.filtered_by_options(options)
|
61
|
-
|
65
|
+
.with_target
|
66
|
+
case options[:filtered_by_status]
|
67
|
+
when :opened, 'opened'
|
68
|
+
target_notifications = target_notifications.opened_only!
|
69
|
+
when :unopened, 'unopened'
|
70
|
+
target_notifications = target_notifications.unopened_only
|
71
|
+
end
|
72
|
+
target_notifications = target_notifications.limit(options[:limit]) if options[:limit].present?
|
73
|
+
as_latest_group_member ?
|
74
|
+
target_notifications.map{ |n| n.latest_group_member } :
|
75
|
+
target_notifications.to_a
|
62
76
|
end
|
63
77
|
|
64
78
|
# Gets all notifications for this target type grouped by targets.
|
@@ -73,6 +87,7 @@ module ActivityNotification
|
|
73
87
|
# @option options [Boolean] :reverse (false) If notification index will be ordered as earliest first
|
74
88
|
# @option options [Boolean] :with_group_members (false) If notification index will include group members
|
75
89
|
# @option options [Boolean] :as_latest_group_member (false) If grouped notification will be shown as the latest group member (default is shown as the earliest member)
|
90
|
+
# @option options [String] :filtered_by_status (:all) Status for filter, :all, :opened and :unopened are available
|
76
91
|
# @option options [String] :filtered_by_type (nil) Notifiable type for filter
|
77
92
|
# @option options [Object] :filtered_by_group (nil) Group instance for filter
|
78
93
|
# @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
@@ -84,29 +99,6 @@ module ActivityNotification
|
|
84
99
|
all_notifications(options).group_by(&:target)
|
85
100
|
end
|
86
101
|
|
87
|
-
# Gets all unopened notifications for this target type grouped by targets.
|
88
|
-
#
|
89
|
-
# @example Get all unopened notifications for users grouped by user
|
90
|
-
# @unopened_notification_index_map = User.unopened_notification_index_map
|
91
|
-
# @unopened_notification_index_map.each do |user, notifications|
|
92
|
-
# # Do something for user and notifications
|
93
|
-
# end
|
94
|
-
#
|
95
|
-
# @option options [Integer] :limit (nil) Limit to query for notifications
|
96
|
-
# @option options [Boolean] :reverse (false) If notification index will be ordered as earliest first
|
97
|
-
# @option options [Boolean] :with_group_members (false) If notification index will include group members
|
98
|
-
# @option options [Boolean] :as_latest_group_member (false) If grouped notification will be shown as the latest group member (default is shown as the earliest member)
|
99
|
-
# @option options [String] :filtered_by_type (nil) Notifiable type for filter
|
100
|
-
# @option options [Object] :filtered_by_group (nil) Group instance for filter
|
101
|
-
# @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
102
|
-
# @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
|
103
|
-
# @option options [String] :filtered_by_key (nil) Key of the notification for filter
|
104
|
-
# @option options [Array|Hash] :custom_filter (nil) Custom notification filter (e.g. ["created_at >= ?", time.hour.ago])
|
105
|
-
# @return [Array<Notificaion>] All unopened notifications for this target type grouped by targets
|
106
|
-
def unopened_notification_index_map(options = {})
|
107
|
-
all_notifications(options).unopened_only.group_by(&:target)
|
108
|
-
end
|
109
|
-
|
110
102
|
# Send batch notification email to this type targets with unopened notifications.
|
111
103
|
#
|
112
104
|
# @example Send batch notification email to the users with unopened notifications of specified key
|
@@ -114,23 +106,34 @@ module ActivityNotification
|
|
114
106
|
# @example Send batch notification email to the users with unopened notifications of specified key in 1 hour
|
115
107
|
# User.send_batch_unopened_notification_email(filtered_by_key: 'this.key', custom_filter: ["created_at >= ?", time.hour.ago])
|
116
108
|
#
|
117
|
-
# @option options [Integer]
|
118
|
-
# @option options [Boolean]
|
119
|
-
# @option options [Boolean]
|
120
|
-
# @option options [Boolean]
|
121
|
-
# @option options [String]
|
122
|
-
# @option options [Object]
|
123
|
-
# @option options [String]
|
124
|
-
# @option options [String]
|
125
|
-
# @option options [String]
|
126
|
-
# @option options [Array|Hash]
|
109
|
+
# @option options [Integer] :limit (nil) Limit to query for notifications
|
110
|
+
# @option options [Boolean] :reverse (false) If notification index will be ordered as earliest first
|
111
|
+
# @option options [Boolean] :with_group_members (false) If notification index will include group members
|
112
|
+
# @option options [Boolean] :as_latest_group_member (false) If grouped notification will be shown as the latest group member (default is shown as the earliest member)
|
113
|
+
# @option options [String] :filtered_by_type (nil) Notifiable type for filter
|
114
|
+
# @option options [Object] :filtered_by_group (nil) Group instance for filter
|
115
|
+
# @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
116
|
+
# @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
|
117
|
+
# @option options [String] :filtered_by_key (nil) Key of the notification for filter
|
118
|
+
# @option options [Array|Hash] :custom_filter (nil) Custom notification filter (e.g. ["created_at >= ?", time.hour.ago])
|
119
|
+
# @option options [Boolean] :send_later (false) If it sends notification email asynchronously
|
120
|
+
# @option options [String, Symbol] :fallback (:batch_default) Fallback template to use when MissingTemplate is raised
|
121
|
+
# @option options [String] :batch_key (nil) Key of the batch notification email, a key of the first notification will be used if not specified
|
127
122
|
# @return [Hash<Object, Mail::Message|ActionMailer::DeliveryJob>] Hash of target and sent email message or its delivery job
|
128
123
|
def send_batch_unopened_notification_email(options = {})
|
129
|
-
unopened_notification_index_map =
|
124
|
+
unopened_notification_index_map = notification_index_map(options.merge(filtered_by_status: :unopened))
|
125
|
+
mailer_options = options.select { |k, _| [:send_later, :fallback, :batch_key].include?(k) }
|
130
126
|
unopened_notification_index_map.map { |target, notifications|
|
131
|
-
[target, Notification.send_batch_notification_email(target, notifications,
|
127
|
+
[target, Notification.send_batch_notification_email(target, notifications, mailer_options)]
|
132
128
|
}.to_h
|
133
129
|
end
|
130
|
+
|
131
|
+
# Returns if subscription management is allowed for this target type.
|
132
|
+
# @return [Boolean] If subscription management is allowed for this target type
|
133
|
+
def subscription_enabled?
|
134
|
+
_notification_subscription_allowed ? true : false
|
135
|
+
end
|
136
|
+
alias_method :notification_subscription_enabled?, :subscription_enabled?
|
134
137
|
end
|
135
138
|
|
136
139
|
# Returns target email address for email notification.
|
@@ -154,13 +157,22 @@ module ActivityNotification
|
|
154
157
|
# Returns if sending batch notification email is allowed for the target from configured field or overriden method.
|
155
158
|
# This method is able to be overriden.
|
156
159
|
#
|
157
|
-
# @param [Object] notifiable_type Notifiable type of the notifications
|
158
160
|
# @param [String] key Key of the notifications
|
159
161
|
# @return [Boolean] If sending batch notification email is allowed for the target
|
160
|
-
def batch_notification_email_allowed?(
|
161
|
-
resolve_value(_batch_notification_email_allowed,
|
162
|
+
def batch_notification_email_allowed?(key)
|
163
|
+
resolve_value(_batch_notification_email_allowed, key)
|
162
164
|
end
|
163
165
|
|
166
|
+
# Returns if subscription management is allowed for the target from configured field or overriden method.
|
167
|
+
# This method is able to be overriden.
|
168
|
+
#
|
169
|
+
# @param [String] key Key of the notifications
|
170
|
+
# @return [Boolean] If subscription management is allowed for the target
|
171
|
+
def subscription_allowed?(key)
|
172
|
+
resolve_value(_notification_subscription_allowed, key)
|
173
|
+
end
|
174
|
+
alias_method :notification_subscription_allowed?, :subscription_allowed?
|
175
|
+
|
164
176
|
# Returns if current resource signed in with Devise is authenticated for the notification.
|
165
177
|
# This method is able to be overriden.
|
166
178
|
#
|
@@ -174,7 +186,7 @@ module ActivityNotification
|
|
174
186
|
"with devise resource #{devise_resource.class} has been passed to #{self.class}##{__method__}. "\
|
175
187
|
"You have to override #{self.class}##{__method__} method or set devise_resource in acts_as_target."
|
176
188
|
end
|
177
|
-
current_resource.present?
|
189
|
+
current_resource.present? && current_resource == devise_resource
|
178
190
|
end
|
179
191
|
|
180
192
|
# Returns printable target model name to show in view or email.
|
@@ -215,13 +227,13 @@ module ActivityNotification
|
|
215
227
|
_unopened_notification_index(options).present?
|
216
228
|
end
|
217
229
|
|
218
|
-
#
|
219
|
-
# This method is the typical way to get
|
220
|
-
# When the target
|
230
|
+
# Returns automatically arranged notification index of the target.
|
231
|
+
# This method is the typical way to get notification index from controller and view.
|
232
|
+
# When the target has unopened notifications, it returns unopened notifications first.
|
221
233
|
# Additionaly, it returns opened notifications unless unopened index size overs the limit.
|
222
|
-
# @todo Is this
|
234
|
+
# @todo Is this conbimned array the best solution?
|
223
235
|
#
|
224
|
-
# @example Get automatically arranged notification index of
|
236
|
+
# @example Get automatically arranged notification index of @user
|
225
237
|
# @notifications = @user.notification_index
|
226
238
|
#
|
227
239
|
# @param [Hash] options Options for notification index
|
@@ -242,9 +254,9 @@ module ActivityNotification
|
|
242
254
|
options)
|
243
255
|
end
|
244
256
|
|
245
|
-
#
|
257
|
+
# Returns unopened notification index of the target.
|
246
258
|
#
|
247
|
-
# @example Get unopened notification index of
|
259
|
+
# @example Get unopened notification index of @user
|
248
260
|
# @notifications = @user.unopened_notification_index
|
249
261
|
#
|
250
262
|
# @param [Hash] options Options for notification index
|
@@ -263,9 +275,9 @@ module ActivityNotification
|
|
263
275
|
arrange_single_notification_index(method(:_unopened_notification_index), options)
|
264
276
|
end
|
265
277
|
|
266
|
-
#
|
278
|
+
# Returns opened notification index of the target.
|
267
279
|
#
|
268
|
-
# @example Get opened notification index of
|
280
|
+
# @example Get opened notification index of @user
|
269
281
|
# @notifications = @user.opened_notification_index(10)
|
270
282
|
#
|
271
283
|
# @param [Hash] options Options for notification index
|
@@ -290,12 +302,13 @@ module ActivityNotification
|
|
290
302
|
#
|
291
303
|
# @param [Object] notifiable Notifiable instance to notify
|
292
304
|
# @param [Hash] options Options for notifications
|
293
|
-
# @option options [String]
|
294
|
-
# @option options [Object]
|
295
|
-
# @option options [
|
296
|
-
# @option options [
|
297
|
-
# @option options [
|
298
|
-
# @option options [Boolean]
|
305
|
+
# @option options [String] :key (notifiable.default_notification_key) Key of the notification
|
306
|
+
# @option options [Object] :group (nil) Group unit of the notifications
|
307
|
+
# @option options [ActiveSupport::Duration] :group_expiry_delay (nil) Expiry period of a notification group
|
308
|
+
# @option options [Object] :notifier (nil) Notifier of the notifications
|
309
|
+
# @option options [Hash] :parameters ({}) Additional parameters of the notifications
|
310
|
+
# @option options [Boolean] :send_email (true) Whether it sends notification email
|
311
|
+
# @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
|
299
312
|
# @return [Notification] Generated notification instance
|
300
313
|
def notify_to(notifiable, options = {})
|
301
314
|
Notification.notify_to(self, notifiable, options)
|
@@ -306,12 +319,12 @@ module ActivityNotification
|
|
306
319
|
# @see NotificationApi#open_all_of
|
307
320
|
#
|
308
321
|
# @param [Hash] options Options for opening notifications
|
309
|
-
# @option options [DateTime] :opened_at
|
310
|
-
# @option options [String] :filtered_by_type (nil)
|
311
|
-
# @option options [Object] :filtered_by_group (nil)
|
312
|
-
# @option options [String] :filtered_by_group_type (nil)
|
313
|
-
# @option options [String] :filtered_by_group_id (nil)
|
314
|
-
# @option options [String] :filtered_by_key (nil)
|
322
|
+
# @option options [DateTime] :opened_at (Time.current) Time to set to opened_at of the notification record
|
323
|
+
# @option options [String] :filtered_by_type (nil) Notifiable type for filter
|
324
|
+
# @option options [Object] :filtered_by_group (nil) Group instance for filter
|
325
|
+
# @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
326
|
+
# @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
|
327
|
+
# @option options [String] :filtered_by_key (nil) Key of the notification for filter
|
315
328
|
# @return [Integer] Number of opened notification records
|
316
329
|
def open_all_notifications(options = {})
|
317
330
|
Notification.open_all_of(self, options)
|
@@ -328,9 +341,9 @@ module ActivityNotification
|
|
328
341
|
# @notifications = @user.notification_index_with_attributes
|
329
342
|
#
|
330
343
|
# @param [Hash] options Options for notification index
|
331
|
-
# @option options [Boolean] :send_later
|
332
|
-
# @option options [String, Symbol] :fallback
|
333
|
-
# @option options [String] :batch_key
|
344
|
+
# @option options [Boolean] :send_later (false) If it sends notification email asynchronously
|
345
|
+
# @option options [String, Symbol] :fallback (:batch_default) Fallback template to use when MissingTemplate is raised
|
346
|
+
# @option options [String] :batch_key (nil) Key of the batch notification email, a key of the first notification will be used if not specified
|
334
347
|
# @option options [Integer] :limit (nil) Limit to query for notifications
|
335
348
|
# @option options [Boolean] :reverse (false) If notification index will be ordered as earliest first
|
336
349
|
# @option options [Boolean] :with_group_members (false) If notification index will include group members
|
@@ -417,6 +430,27 @@ module ActivityNotification
|
|
417
430
|
end
|
418
431
|
end
|
419
432
|
|
433
|
+
# Returns if the target subscribes to the notification.
|
434
|
+
# It also returns true when the subscription management is not allowed for the target.
|
435
|
+
#
|
436
|
+
# @param [String] key Key of the notification
|
437
|
+
# @param [String] subscribe_as_default Default subscription value to use when the subscription record does not configured
|
438
|
+
# @return [Boolean] If the target subscribes the notification or the subscription management is not allowed for the target
|
439
|
+
def subscribes_to_notification?(key, subscribe_as_default = ActivityNotification.config.subscribe_as_default)
|
440
|
+
!subscription_allowed?(key) or _subscribes_to_notification?(key, subscribe_as_default)
|
441
|
+
end
|
442
|
+
|
443
|
+
# Returns if the target subscribes to the notification email.
|
444
|
+
# It also returns true when the subscription management is not allowed for the target.
|
445
|
+
#
|
446
|
+
# @param [String] key Key of the notification
|
447
|
+
# @param [String] subscribe_as_default Default subscription value to use when the subscription record does not configured
|
448
|
+
# @return [Boolean] If the target subscribes the notification email or the subscription management is not allowed for the target
|
449
|
+
def subscribes_to_notification_email?(key, subscribe_as_default = ActivityNotification.config.subscribe_as_default)
|
450
|
+
!subscription_allowed?(key) or _subscribes_to_notification_email?(key, subscribe_as_default)
|
451
|
+
end
|
452
|
+
alias_method :subscribes_to_email?, :subscribes_to_notification_email?
|
453
|
+
|
420
454
|
|
421
455
|
private
|
422
456
|
|
@@ -4,7 +4,9 @@ module ActivityNotification
|
|
4
4
|
include Renderable
|
5
5
|
include Common
|
6
6
|
include NotificationApi
|
7
|
-
|
7
|
+
# @deprecated ActivityNotification.config.table_name as of 1.1.0
|
8
|
+
self.table_name = ActivityNotification.config.table_name || ActivityNotification.config.notification_table_name
|
9
|
+
# self.table_name = ActivityNotification.config.notification_table_name
|
8
10
|
|
9
11
|
# Belongs to target instance of this notification as polymorphic association.
|
10
12
|
# @scope instance
|
@@ -61,10 +63,10 @@ module ActivityNotification
|
|
61
63
|
# ActivityNotification::Notification.all_index!
|
62
64
|
# is defined same as
|
63
65
|
# ActivityNotification::Notification.group_owners_only.latest_order
|
66
|
+
# @scope class
|
64
67
|
# @example Get all notification index of the @user
|
65
68
|
# @notifications = @user.notifications.all_index!
|
66
69
|
# @notifications = @user.notifications.group_owners_only.latest_order
|
67
|
-
# @scope class
|
68
70
|
# @param [Boolean] reverse If notification index will be ordered as earliest first
|
69
71
|
# @param [Boolean] with_group_members If notification index will include group members
|
70
72
|
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
@@ -82,10 +84,10 @@ module ActivityNotification
|
|
82
84
|
# ActivityNotification::Notification.unopened_index
|
83
85
|
# is defined same as
|
84
86
|
# ActivityNotification::Notification.unopened_only.group_owners_only.latest_order
|
87
|
+
# @scope class
|
85
88
|
# @example Get unopened notificaton index of the @user
|
86
89
|
# @notifications = @user.notifications.unopened_index
|
87
90
|
# @notifications = @user.notifications.unopened_only.group_owners_only.latest_order
|
88
|
-
# @scope class
|
89
91
|
# @param [Boolean] reverse If notification index will be ordered as earliest first
|
90
92
|
# @param [Boolean] with_group_members If notification index will include group members
|
91
93
|
# @return [ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
|
@@ -110,10 +112,10 @@ module ActivityNotification
|
|
110
112
|
# ActivityNotification::Notification.opened_index(limit)
|
111
113
|
# is defined same as
|
112
114
|
# ActivityNotification::Notification.opened_only(limit).group_owners_only.latest_order
|
115
|
+
# @scope class
|
113
116
|
# @example Get unopened notificaton index of the @user with limit 10
|
114
117
|
# @notifications = @user.notifications.opened_index(10)
|
115
118
|
# @notifications = @user.notifications.opened_only(10).group_owners_only.latest_order
|
116
|
-
# @scope class
|
117
119
|
# @param [Integer] limit Limit to query for opened notifications
|
118
120
|
# @param [Boolean] reverse If notification index will be ordered as earliest first
|
119
121
|
# @param [Boolean] with_group_members If notification index will include group members
|
@@ -214,7 +216,7 @@ module ActivityNotification
|
|
214
216
|
if options.has_key?(:filtered_by_group)
|
215
217
|
filtered_notifications = filtered_notifications.filtered_by_group(options[:filtered_by_group])
|
216
218
|
end
|
217
|
-
if options.has_key?(:filtered_by_group_type)
|
219
|
+
if options.has_key?(:filtered_by_group_type) && options.has_key?(:filtered_by_group_id)
|
218
220
|
filtered_notifications = filtered_notifications
|
219
221
|
.where(group_type: options[:filtered_by_group_type], group_id: options[:filtered_by_group_id])
|
220
222
|
end
|