activity_notification 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +5 -0
- data/.yardopts +3 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +50 -44
- data/README.md +242 -81
- data/Rakefile +13 -13
- data/activity_notification.gemspec +6 -8
- data/app/controllers/activity_notification/notifications_controller.rb +89 -11
- data/app/controllers/activity_notification/notifications_with_devise_controller.rb +12 -3
- data/app/mailers/activity_notification/mailer.rb +3 -0
- data/gemfiles/Gemfile.rails-4.2 +13 -0
- data/gemfiles/Gemfile.rails-4.2.lock +190 -0
- data/gemfiles/Gemfile.rails-5.0 +14 -0
- data/gemfiles/Gemfile.rails-5.0.lock +201 -0
- data/lib/activity_notification.rb +10 -6
- data/lib/activity_notification/apis/notification_api.rb +137 -27
- data/lib/activity_notification/common.rb +48 -24
- data/lib/activity_notification/config.rb +68 -10
- data/lib/activity_notification/controllers/store_controller.rb +13 -5
- data/lib/activity_notification/helpers/polymorphic_helpers.rb +17 -3
- data/lib/activity_notification/helpers/view_helpers.rb +161 -45
- data/lib/activity_notification/mailers/helpers.rb +121 -83
- data/lib/activity_notification/models/concerns/notifiable.rb +162 -69
- data/lib/activity_notification/models/concerns/notifier.rb +2 -0
- data/lib/activity_notification/models/concerns/target.rb +124 -25
- data/lib/activity_notification/models/notification.rb +168 -4
- data/lib/activity_notification/rails/routes.rb +50 -48
- data/lib/activity_notification/renderable.rb +106 -26
- data/lib/activity_notification/roles/acts_as_notifiable.rb +99 -26
- data/lib/activity_notification/roles/acts_as_notifier.rb +3 -0
- data/lib/activity_notification/roles/acts_as_target.rb +70 -0
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/activity_notification/active_record/migration_generator.rb +3 -1
- data/lib/generators/activity_notification/controllers_generator.rb +5 -0
- data/lib/generators/activity_notification/install_generator.rb +7 -3
- data/lib/generators/activity_notification/models/notification_generator.rb +4 -2
- data/lib/generators/activity_notification/views_generator.rb +20 -0
- data/spec/concerns/apis/notification_api_spec.rb +105 -36
- data/spec/concerns/common_spec.rb +1 -1
- data/spec/concerns/models/notifiable_spec.rb +2 -2
- data/spec/concerns/models/notifier_spec.rb +1 -1
- data/spec/concerns/models/target_spec.rb +9 -8
- data/spec/controllers/notifications_controller_shared_examples.rb +101 -28
- data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -4
- data/spec/helpers/view_helpers_spec.rb +3 -3
- data/spec/mailers/mailer_spec.rb +1 -1
- data/spec/models/notification_spec.rb +57 -3
- data/spec/rails_app/app/models/article.rb +1 -2
- data/spec/rails_app/app/models/comment.rb +8 -6
- data/spec/rails_app/app/models/user.rb +1 -1
- data/spec/rails_app/app/views/layouts/_header.html.erb +2 -0
- data/spec/rails_app/config/application.rb +3 -1
- data/spec/rails_app/config/environment.rb +12 -2
- data/spec/rails_app/config/environments/test.rb +11 -2
- data/spec/roles/acts_as_notifiable_spec.rb +2 -2
- data/spec/roles/acts_as_notifier_spec.rb +1 -1
- data/spec/roles/acts_as_target_spec.rb +3 -3
- data/spec/spec_helper.rb +6 -0
- metadata +35 -40
- data/spec/rails_app/app/models/concerns/.keep +0 -0
@@ -0,0 +1,201 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
activity_notification (0.0.9)
|
5
|
+
activerecord (>= 4.2.0)
|
6
|
+
i18n (>= 0.5.0)
|
7
|
+
railties (>= 4.2.0, < 5.1)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
actioncable (5.0.0.1)
|
13
|
+
actionpack (= 5.0.0.1)
|
14
|
+
nio4r (~> 1.2)
|
15
|
+
websocket-driver (~> 0.6.1)
|
16
|
+
actionmailer (5.0.0.1)
|
17
|
+
actionpack (= 5.0.0.1)
|
18
|
+
actionview (= 5.0.0.1)
|
19
|
+
activejob (= 5.0.0.1)
|
20
|
+
mail (~> 2.5, >= 2.5.4)
|
21
|
+
rails-dom-testing (~> 2.0)
|
22
|
+
actionpack (5.0.0.1)
|
23
|
+
actionview (= 5.0.0.1)
|
24
|
+
activesupport (= 5.0.0.1)
|
25
|
+
rack (~> 2.0)
|
26
|
+
rack-test (~> 0.6.3)
|
27
|
+
rails-dom-testing (~> 2.0)
|
28
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
29
|
+
actionview (5.0.0.1)
|
30
|
+
activesupport (= 5.0.0.1)
|
31
|
+
builder (~> 3.1)
|
32
|
+
erubis (~> 2.7.0)
|
33
|
+
rails-dom-testing (~> 2.0)
|
34
|
+
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
35
|
+
activejob (5.0.0.1)
|
36
|
+
activesupport (= 5.0.0.1)
|
37
|
+
globalid (>= 0.3.6)
|
38
|
+
activemodel (5.0.0.1)
|
39
|
+
activesupport (= 5.0.0.1)
|
40
|
+
activerecord (5.0.0.1)
|
41
|
+
activemodel (= 5.0.0.1)
|
42
|
+
activesupport (= 5.0.0.1)
|
43
|
+
arel (~> 7.0)
|
44
|
+
activesupport (5.0.0.1)
|
45
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
46
|
+
i18n (~> 0.7)
|
47
|
+
minitest (~> 5.1)
|
48
|
+
tzinfo (~> 1.1)
|
49
|
+
ammeter (1.1.3)
|
50
|
+
activesupport (>= 3.0)
|
51
|
+
railties (>= 3.0)
|
52
|
+
rspec-rails (>= 2.2)
|
53
|
+
arel (7.1.1)
|
54
|
+
bcrypt (3.1.11)
|
55
|
+
builder (3.2.2)
|
56
|
+
concurrent-ruby (1.0.2)
|
57
|
+
coveralls (0.8.15)
|
58
|
+
json (>= 1.8, < 3)
|
59
|
+
simplecov (~> 0.12.0)
|
60
|
+
term-ansicolor (~> 1.3)
|
61
|
+
thor (~> 0.19.1)
|
62
|
+
tins (>= 1.6.0, < 2)
|
63
|
+
devise (4.2.0)
|
64
|
+
bcrypt (~> 3.0)
|
65
|
+
orm_adapter (~> 0.1)
|
66
|
+
railties (>= 4.1.0, < 5.1)
|
67
|
+
responders
|
68
|
+
warden (~> 1.2.3)
|
69
|
+
diff-lcs (1.2.5)
|
70
|
+
docile (1.1.5)
|
71
|
+
erubis (2.7.0)
|
72
|
+
factory_girl (4.7.0)
|
73
|
+
activesupport (>= 3.0.0)
|
74
|
+
factory_girl_rails (4.7.0)
|
75
|
+
factory_girl (~> 4.7.0)
|
76
|
+
railties (>= 3.0.0)
|
77
|
+
globalid (0.3.7)
|
78
|
+
activesupport (>= 4.1.0)
|
79
|
+
i18n (0.7.0)
|
80
|
+
jquery-rails (4.2.1)
|
81
|
+
rails-dom-testing (>= 1, < 3)
|
82
|
+
railties (>= 4.2.0)
|
83
|
+
thor (>= 0.14, < 2.0)
|
84
|
+
json (2.0.2)
|
85
|
+
loofah (2.0.3)
|
86
|
+
nokogiri (>= 1.5.9)
|
87
|
+
mail (2.6.4)
|
88
|
+
mime-types (>= 1.16, < 4)
|
89
|
+
method_source (0.8.2)
|
90
|
+
mime-types (3.1)
|
91
|
+
mime-types-data (~> 3.2015)
|
92
|
+
mime-types-data (3.2016.0521)
|
93
|
+
mini_portile2 (2.1.0)
|
94
|
+
minitest (5.9.0)
|
95
|
+
nio4r (1.2.1)
|
96
|
+
nokogiri (1.6.8)
|
97
|
+
mini_portile2 (~> 2.1.0)
|
98
|
+
pkg-config (~> 1.1.7)
|
99
|
+
orm_adapter (0.5.0)
|
100
|
+
pkg-config (1.1.7)
|
101
|
+
rack (2.0.1)
|
102
|
+
rack-test (0.6.3)
|
103
|
+
rack (>= 1.0)
|
104
|
+
rails (5.0.0.1)
|
105
|
+
actioncable (= 5.0.0.1)
|
106
|
+
actionmailer (= 5.0.0.1)
|
107
|
+
actionpack (= 5.0.0.1)
|
108
|
+
actionview (= 5.0.0.1)
|
109
|
+
activejob (= 5.0.0.1)
|
110
|
+
activemodel (= 5.0.0.1)
|
111
|
+
activerecord (= 5.0.0.1)
|
112
|
+
activesupport (= 5.0.0.1)
|
113
|
+
bundler (>= 1.3.0, < 2.0)
|
114
|
+
railties (= 5.0.0.1)
|
115
|
+
sprockets-rails (>= 2.0.0)
|
116
|
+
rails-controller-testing (1.0.1)
|
117
|
+
actionpack (~> 5.x)
|
118
|
+
actionview (~> 5.x)
|
119
|
+
activesupport (~> 5.x)
|
120
|
+
rails-dom-testing (2.0.1)
|
121
|
+
activesupport (>= 4.2.0, < 6.0)
|
122
|
+
nokogiri (~> 1.6.0)
|
123
|
+
rails-html-sanitizer (1.0.3)
|
124
|
+
loofah (~> 2.0)
|
125
|
+
railties (5.0.0.1)
|
126
|
+
actionpack (= 5.0.0.1)
|
127
|
+
activesupport (= 5.0.0.1)
|
128
|
+
method_source
|
129
|
+
rake (>= 0.8.7)
|
130
|
+
thor (>= 0.18.1, < 2.0)
|
131
|
+
rake (11.2.2)
|
132
|
+
responders (2.3.0)
|
133
|
+
railties (>= 4.2.0, < 5.1)
|
134
|
+
rspec-core (3.5.2)
|
135
|
+
rspec-support (~> 3.5.0)
|
136
|
+
rspec-expectations (3.5.0)
|
137
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
138
|
+
rspec-support (~> 3.5.0)
|
139
|
+
rspec-mocks (3.5.0)
|
140
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
141
|
+
rspec-support (~> 3.5.0)
|
142
|
+
rspec-rails (3.5.2)
|
143
|
+
actionpack (>= 3.0)
|
144
|
+
activesupport (>= 3.0)
|
145
|
+
railties (>= 3.0)
|
146
|
+
rspec-core (~> 3.5.0)
|
147
|
+
rspec-expectations (~> 3.5.0)
|
148
|
+
rspec-mocks (~> 3.5.0)
|
149
|
+
rspec-support (~> 3.5.0)
|
150
|
+
rspec-support (3.5.0)
|
151
|
+
simplecov (0.12.0)
|
152
|
+
docile (~> 1.1.0)
|
153
|
+
json (>= 1.8, < 3)
|
154
|
+
simplecov-html (~> 0.10.0)
|
155
|
+
simplecov-html (0.10.0)
|
156
|
+
sprockets (3.7.0)
|
157
|
+
concurrent-ruby (~> 1.0)
|
158
|
+
rack (> 1, < 3)
|
159
|
+
sprockets-rails (3.1.1)
|
160
|
+
actionpack (>= 4.0)
|
161
|
+
activesupport (>= 4.0)
|
162
|
+
sprockets (>= 3.0.0)
|
163
|
+
sqlite3 (1.3.11)
|
164
|
+
term-ansicolor (1.3.2)
|
165
|
+
tins (~> 1.0)
|
166
|
+
thor (0.19.1)
|
167
|
+
thread_safe (0.3.5)
|
168
|
+
timecop (0.8.1)
|
169
|
+
tins (1.12.0)
|
170
|
+
tzinfo (1.2.2)
|
171
|
+
thread_safe (~> 0.1)
|
172
|
+
warden (1.2.6)
|
173
|
+
rack (>= 1.0)
|
174
|
+
websocket-driver (0.6.4)
|
175
|
+
websocket-extensions (>= 0.1.0)
|
176
|
+
websocket-extensions (0.1.2)
|
177
|
+
yard (0.9.5)
|
178
|
+
yard-activesupport-concern (0.0.1)
|
179
|
+
yard (>= 0.8)
|
180
|
+
|
181
|
+
PLATFORMS
|
182
|
+
ruby
|
183
|
+
|
184
|
+
DEPENDENCIES
|
185
|
+
activity_notification!
|
186
|
+
ammeter
|
187
|
+
coveralls
|
188
|
+
devise (~> 4.2.0)
|
189
|
+
factory_girl_rails (~> 4.7.0)
|
190
|
+
jquery-rails
|
191
|
+
rails (~> 5.0.0)
|
192
|
+
rails-controller-testing
|
193
|
+
rspec-rails (~> 3.5.1)
|
194
|
+
simplecov (~> 0.12.0)
|
195
|
+
sqlite3
|
196
|
+
timecop
|
197
|
+
yard (~> 0.9.5)
|
198
|
+
yard-activesupport-concern (~> 0.0.1)
|
199
|
+
|
200
|
+
BUNDLED WITH
|
201
|
+
1.12.5
|
@@ -22,19 +22,23 @@ module ActivityNotification
|
|
22
22
|
autoload :Helpers, 'activity_notification/mailers/helpers'
|
23
23
|
end
|
24
24
|
|
25
|
-
# Returns
|
25
|
+
# Returns configuration object of ActivityNotification.
|
26
26
|
def self.config
|
27
27
|
@config ||= ActivityNotification::Config.new
|
28
28
|
end
|
29
29
|
|
30
|
-
#
|
31
|
-
#
|
30
|
+
# Sets global configuration options for ActivityNotification.
|
32
31
|
# All available options and their defaults are in the example below:
|
33
32
|
# @example Initializer for Rails
|
34
33
|
# ActivityNotification.configure do |config|
|
35
|
-
# config.enabled
|
36
|
-
# config.table_name
|
37
|
-
#
|
34
|
+
# config.enabled = true
|
35
|
+
# config.table_name = "notifications"
|
36
|
+
# config.email_enabled = false
|
37
|
+
# config.mailer_sender = nil
|
38
|
+
# config.mailer = 'ActivityNotification::Mailer'
|
39
|
+
# config.parent_mailer = 'ActionMailer::Base'
|
40
|
+
# config.parent_controller = 'ApplicationController'
|
41
|
+
# config.opened_limit = 10
|
38
42
|
# end
|
39
43
|
def self.configure(&block)
|
40
44
|
yield(config) if block_given?
|
@@ -1,25 +1,77 @@
|
|
1
1
|
module ActivityNotification
|
2
|
+
# Defines API for notification included in Notification model.
|
2
3
|
module NotificationApi
|
3
4
|
extend ActiveSupport::Concern
|
4
5
|
|
5
|
-
# Define store_notification as private clas method
|
6
6
|
included do
|
7
|
+
# Defines store_notification as private clas method
|
7
8
|
private_class_method :store_notification
|
8
9
|
end
|
9
10
|
|
10
|
-
# For notification API
|
11
11
|
class_methods do
|
12
|
+
# Generates notifications to configured targets with notifiable model.
|
13
|
+
#
|
14
|
+
# @example Use with target_type as Symbol
|
15
|
+
# ActivityNotification::Notification.notify :users, @comment
|
16
|
+
# @example Use with target_type as String
|
17
|
+
# ActivityNotification::Notification.notify 'User', @comment
|
18
|
+
# @example Use with target_type as Class
|
19
|
+
# ActivityNotification::Notification.notify User, @comment
|
20
|
+
# @example Use with options
|
21
|
+
# ActivityNotification::Notification.notify :users, @comment, key: 'custom.comment', group: @comment.article
|
22
|
+
# ActivityNotification::Notification.notify :users, @comment, parameters: { reply_to: @comment.reply_to }, send_later: false
|
23
|
+
#
|
24
|
+
# @param [Symbol, String, Class] target_type Type of target
|
25
|
+
# @param [Object] notifiable Notifiable instance
|
26
|
+
# @param [Hash] options Options for notifications
|
27
|
+
# @option options [String] :key (notifiable.default_notification_key) Key of the notification
|
28
|
+
# @option options [Object] :group (nil) Group unit of the notifications
|
29
|
+
# @option options [Object] :notifier (nil) Notifier of the notifications
|
30
|
+
# @option options [Hash] :parameters ({}) Additional parameters of the notifications
|
31
|
+
# @option options [Boolean] :send_email (true) If it sends notification email
|
32
|
+
# @option options [Boolean] :send_later (true) If it sends notification email asynchronously
|
33
|
+
# @return [Array<Notificaion>] Array of generated notifications
|
12
34
|
def notify(target_type, notifiable, options = {})
|
13
35
|
targets = notifiable.notification_targets(target_type, options[:key])
|
14
36
|
unless targets.blank?
|
15
37
|
notify_all(targets, notifiable, options)
|
16
38
|
end
|
17
39
|
end
|
18
|
-
|
40
|
+
|
41
|
+
# Generates notifications to specified targets.
|
42
|
+
#
|
43
|
+
# @example Notify to all users
|
44
|
+
# ActivityNotification::Notification.notify_all User.all, @comment
|
45
|
+
#
|
46
|
+
# @param [Array<Object>] targets Targets to send notifications
|
47
|
+
# @param [Object] notifiable Notifiable instance
|
48
|
+
# @param [Hash] options Options for notifications
|
49
|
+
# @option options [String] :key (notifiable.default_notification_key) Key of the notification
|
50
|
+
# @option options [Object] :group (nil) Group unit of the notifications
|
51
|
+
# @option options [Object] :notifier (nil) Notifier of the notifications
|
52
|
+
# @option options [Hash] :parameters ({}) Additional parameters of the notifications
|
53
|
+
# @option options [Boolean] :send_email (true) Whether it sends notification email
|
54
|
+
# @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
|
55
|
+
# @return [Array<Notificaion>] Array of generated notifications
|
19
56
|
def notify_all(targets, notifiable, options = {})
|
20
57
|
Array(targets).map { |target| notify_to(target, notifiable, options) }
|
21
58
|
end
|
22
|
-
|
59
|
+
|
60
|
+
# Generates notifications to one target.
|
61
|
+
#
|
62
|
+
# @example Notify to one user
|
63
|
+
# ActivityNotification::Notification.notify_to @comment.auther, @comment
|
64
|
+
#
|
65
|
+
# @param [Object] target Target to send notifications
|
66
|
+
# @param [Object] notifiable Notifiable instance
|
67
|
+
# @param [Hash] options Options for notifications
|
68
|
+
# @option options [String] :key (notifiable.default_notification_key) Key of the notification
|
69
|
+
# @option options [Object] :group (nil) Group unit of the notifications
|
70
|
+
# @option options [Object] :notifier (nil) Notifier of the notifications
|
71
|
+
# @option options [Hash] :parameters ({}) Additional parameters of the notifications
|
72
|
+
# @option options [Boolean] :send_email (true) Whether it sends notification email
|
73
|
+
# @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
|
74
|
+
# @return [Notification] Generated notification instance
|
23
75
|
def notify_to(target, notifiable, options = {})
|
24
76
|
send_email = options.has_key?(:send_email) ? options[:send_email] : true
|
25
77
|
send_later = options.has_key?(:send_later) ? options[:send_later] : true
|
@@ -30,25 +82,42 @@ module ActivityNotification
|
|
30
82
|
# Return created notification
|
31
83
|
notification
|
32
84
|
end
|
33
|
-
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
|
85
|
+
|
86
|
+
# Opens all notifications of the target.
|
87
|
+
#
|
88
|
+
# @param [Object] target Target of the notifications to open
|
89
|
+
# @param [Hash] options Options for opening notifications
|
90
|
+
# @option options [DateTime] :opened_at (DateTime.now) Time to set to opened_at of the notification record
|
91
|
+
# @option options [String] :filtered_by_type (nil) Notifiable type for filter
|
92
|
+
# @option options [Object] :filtered_by_group (nil) Group instance for filter
|
93
|
+
# @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
|
94
|
+
# @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
|
95
|
+
# @option options [String] :filtered_by_key (nil) Key of the notification for filter
|
96
|
+
# @return [Integer] Number of opened notification records
|
97
|
+
# @todo Add filter option
|
98
|
+
def open_all_of(target, options = {})
|
99
|
+
opened_at = options[:opened_at] || DateTime.now
|
100
|
+
target.notifications.unopened_only.filtered_by_options(options).update_all(opened_at: opened_at)
|
38
101
|
end
|
39
102
|
|
40
|
-
#
|
41
|
-
#
|
103
|
+
# Returns if group member of the notifications exists.
|
104
|
+
# This method is designed to be called from controllers or views to avoid N+1.
|
105
|
+
#
|
106
|
+
# @param [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] notifications Array or database query of the notifications to test member exists
|
107
|
+
# @return [Boolean] If group member of the notifications exists
|
42
108
|
def group_member_exists?(notifications)
|
43
|
-
notifications.present? && where(group_owner_id: notifications.
|
109
|
+
notifications.present? && where(group_owner_id: notifications.map(&:id)).exists?
|
44
110
|
end
|
45
|
-
|
111
|
+
|
112
|
+
# Returns available options for kinds of notify methods.
|
113
|
+
#
|
114
|
+
# @return [Array<Notificaion>] Available options for kinds of notify methods
|
46
115
|
def available_options
|
47
116
|
[:key, :group, :parameters, :notifier, :send_email, :send_later].freeze
|
48
117
|
end
|
49
118
|
|
50
|
-
#
|
51
|
-
|
119
|
+
# Stores notifications to datastore
|
120
|
+
# @api private
|
52
121
|
def store_notification(target, notifiable, options = {})
|
53
122
|
target_type = target.to_class_name
|
54
123
|
key = options[:key] || notifiable.default_notification_key
|
@@ -57,7 +126,7 @@ module ActivityNotification
|
|
57
126
|
parameters = options[:parameters] || {}
|
58
127
|
parameters.merge!(options.except(*available_options))
|
59
128
|
parameters.merge!(notifiable.notification_parameters(target_type, key))
|
60
|
-
|
129
|
+
|
61
130
|
# Bundle notification group by target, notifiable_type, group and key
|
62
131
|
# Defferent notifiable.id can be made in a same group
|
63
132
|
group_owner = where(target: target, notifiable_type: notifiable.to_class_name, key: key, group: group)
|
@@ -71,8 +140,10 @@ module ActivityNotification
|
|
71
140
|
end
|
72
141
|
|
73
142
|
|
74
|
-
#
|
75
|
-
|
143
|
+
# Sends notification email to the target.
|
144
|
+
#
|
145
|
+
# @param [Boolean] send_later If it sends notification email asynchronously
|
146
|
+
# @return [Mail::Message, ActionMailer::DeliveryJob] Email message or its delivery job
|
76
147
|
def send_notification_email(send_later = true)
|
77
148
|
if send_later
|
78
149
|
Mailer.send_notification_email(self).deliver_later
|
@@ -81,34 +152,61 @@ module ActivityNotification
|
|
81
152
|
end
|
82
153
|
end
|
83
154
|
|
84
|
-
|
85
|
-
|
155
|
+
# Opens the notification.
|
156
|
+
#
|
157
|
+
# @param [Hash] options Options for opening notifications
|
158
|
+
# @option options [DateTime] :opened_at (DateTime.now) Time to set to opened_at of the notification record
|
159
|
+
# @option options [Boolean] :with_members (true) If it opens notifications including group members
|
160
|
+
# @return [Integer] Number of opened notification records
|
161
|
+
def open!(options = {})
|
162
|
+
opened_at = options[:opened_at] || DateTime.now
|
163
|
+
with_members = options.has_key?(:with_members) ? options[:with_members] : true
|
86
164
|
update(opened_at: opened_at)
|
87
|
-
group_members.update_all(opened_at: opened_at) + 1
|
165
|
+
with_members ? group_members.update_all(opened_at: opened_at) + 1 : 1
|
88
166
|
end
|
89
167
|
|
168
|
+
# Returns if the notification is unopened.
|
169
|
+
#
|
170
|
+
# @return [Boolean] If the notification is unopened
|
90
171
|
def unopened?
|
91
172
|
!opened?
|
92
173
|
end
|
93
174
|
|
175
|
+
# Returns if the notification is opened.
|
176
|
+
#
|
177
|
+
# @return [Boolean] If the notification is opened
|
94
178
|
def opened?
|
95
179
|
opened_at.present?
|
96
180
|
end
|
97
181
|
|
182
|
+
# Returns if the notification is group owner.
|
183
|
+
#
|
184
|
+
# @return [Boolean] If the notification is group owner
|
98
185
|
def group_owner?
|
99
186
|
group_owner_id.blank?
|
100
187
|
end
|
101
188
|
|
189
|
+
# Returns if the notification is group member belonging to owner.
|
190
|
+
#
|
191
|
+
# @return [Boolean] If the notification is group member
|
102
192
|
def group_member?
|
103
193
|
group_owner_id.present?
|
104
194
|
end
|
105
195
|
|
106
|
-
#
|
196
|
+
# Returns if group member of the notification exists.
|
197
|
+
# This method is designed to cache group by query result to avoid N+1 call.
|
198
|
+
#
|
199
|
+
# @param [Integer] limit Limit to query for opened notifications
|
200
|
+
# @return [Boolean] If group member of the notification exists
|
107
201
|
def group_member_exists?(limit = ActivityNotification.config.opened_limit)
|
108
202
|
group_member_count(limit) > 0
|
109
203
|
end
|
110
204
|
|
111
|
-
#
|
205
|
+
# Returns count of group members of the notification.
|
206
|
+
# This method is designed to cache group by query result to avoid N+1 call.
|
207
|
+
#
|
208
|
+
# @param [Integer] limit Limit to query for opened notifications
|
209
|
+
# @return [Integer] Count of group members of the notification
|
112
210
|
def group_member_count(limit = ActivityNotification.config.opened_limit)
|
113
211
|
notification = group_member? ? group_owner : self
|
114
212
|
notification.opened? ?
|
@@ -116,16 +214,23 @@ module ActivityNotification
|
|
116
214
|
notification.unopened_group_member_count
|
117
215
|
end
|
118
216
|
|
217
|
+
# Returns notifiable_path to move after opening notification with notifiable.notifiable_path.
|
218
|
+
#
|
219
|
+
# @return [String] Notifiable path URL to move after opening notification
|
119
220
|
def notifiable_path
|
120
|
-
notifiable.notifiable_path(target_type)
|
221
|
+
notifiable.notifiable_path(target_type, key)
|
121
222
|
end
|
122
223
|
|
123
224
|
|
124
|
-
# Protected instance methods
|
125
225
|
protected
|
126
226
|
|
227
|
+
# Returns count of group members of the unopened notification.
|
228
|
+
# This method is designed to cache group by query result to avoid N+1 call.
|
229
|
+
# @api protected
|
230
|
+
#
|
231
|
+
# @return [Integer] Count of group members of the unopened notification
|
127
232
|
def unopened_group_member_count
|
128
|
-
# Cache group
|
233
|
+
# Cache group by query result to avoid N+1 call
|
129
234
|
unopened_group_member_counts = target.notifications
|
130
235
|
.unopened_index_group_members_only
|
131
236
|
.group(:group_owner_id)
|
@@ -133,8 +238,13 @@ module ActivityNotification
|
|
133
238
|
unopened_group_member_counts[id] || 0
|
134
239
|
end
|
135
240
|
|
241
|
+
# Returns count of group members of the opened notification.
|
242
|
+
# This method is designed to cache group by query result to avoid N+1 call.
|
243
|
+
# @api protected
|
244
|
+
#
|
245
|
+
# @return [Integer] Count of group members of the opened notification
|
136
246
|
def opened_group_member_count(limit = ActivityNotification.config.opened_limit)
|
137
|
-
# Cache group
|
247
|
+
# Cache group by query result to avoid N+1 call
|
138
248
|
opened_group_member_counts = target.notifications
|
139
249
|
.opened_index_group_members_only(limit)
|
140
250
|
.group(:group_owner_id)
|