activity_notification 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +5 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +5 -0
  6. data/Gemfile.lock +50 -44
  7. data/README.md +242 -81
  8. data/Rakefile +13 -13
  9. data/activity_notification.gemspec +6 -8
  10. data/app/controllers/activity_notification/notifications_controller.rb +89 -11
  11. data/app/controllers/activity_notification/notifications_with_devise_controller.rb +12 -3
  12. data/app/mailers/activity_notification/mailer.rb +3 -0
  13. data/gemfiles/Gemfile.rails-4.2 +13 -0
  14. data/gemfiles/Gemfile.rails-4.2.lock +190 -0
  15. data/gemfiles/Gemfile.rails-5.0 +14 -0
  16. data/gemfiles/Gemfile.rails-5.0.lock +201 -0
  17. data/lib/activity_notification.rb +10 -6
  18. data/lib/activity_notification/apis/notification_api.rb +137 -27
  19. data/lib/activity_notification/common.rb +48 -24
  20. data/lib/activity_notification/config.rb +68 -10
  21. data/lib/activity_notification/controllers/store_controller.rb +13 -5
  22. data/lib/activity_notification/helpers/polymorphic_helpers.rb +17 -3
  23. data/lib/activity_notification/helpers/view_helpers.rb +161 -45
  24. data/lib/activity_notification/mailers/helpers.rb +121 -83
  25. data/lib/activity_notification/models/concerns/notifiable.rb +162 -69
  26. data/lib/activity_notification/models/concerns/notifier.rb +2 -0
  27. data/lib/activity_notification/models/concerns/target.rb +124 -25
  28. data/lib/activity_notification/models/notification.rb +168 -4
  29. data/lib/activity_notification/rails/routes.rb +50 -48
  30. data/lib/activity_notification/renderable.rb +106 -26
  31. data/lib/activity_notification/roles/acts_as_notifiable.rb +99 -26
  32. data/lib/activity_notification/roles/acts_as_notifier.rb +3 -0
  33. data/lib/activity_notification/roles/acts_as_target.rb +70 -0
  34. data/lib/activity_notification/version.rb +1 -1
  35. data/lib/generators/activity_notification/active_record/migration_generator.rb +3 -1
  36. data/lib/generators/activity_notification/controllers_generator.rb +5 -0
  37. data/lib/generators/activity_notification/install_generator.rb +7 -3
  38. data/lib/generators/activity_notification/models/notification_generator.rb +4 -2
  39. data/lib/generators/activity_notification/views_generator.rb +20 -0
  40. data/spec/concerns/apis/notification_api_spec.rb +105 -36
  41. data/spec/concerns/common_spec.rb +1 -1
  42. data/spec/concerns/models/notifiable_spec.rb +2 -2
  43. data/spec/concerns/models/notifier_spec.rb +1 -1
  44. data/spec/concerns/models/target_spec.rb +9 -8
  45. data/spec/controllers/notifications_controller_shared_examples.rb +101 -28
  46. data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -4
  47. data/spec/helpers/view_helpers_spec.rb +3 -3
  48. data/spec/mailers/mailer_spec.rb +1 -1
  49. data/spec/models/notification_spec.rb +57 -3
  50. data/spec/rails_app/app/models/article.rb +1 -2
  51. data/spec/rails_app/app/models/comment.rb +8 -6
  52. data/spec/rails_app/app/models/user.rb +1 -1
  53. data/spec/rails_app/app/views/layouts/_header.html.erb +2 -0
  54. data/spec/rails_app/config/application.rb +3 -1
  55. data/spec/rails_app/config/environment.rb +12 -2
  56. data/spec/rails_app/config/environments/test.rb +11 -2
  57. data/spec/roles/acts_as_notifiable_spec.rb +2 -2
  58. data/spec/roles/acts_as_notifier_spec.rb +1 -1
  59. data/spec/roles/acts_as_target_spec.rb +3 -3
  60. data/spec/spec_helper.rb +6 -0
  61. metadata +35 -40
  62. data/spec/rails_app/app/models/concerns/.keep +0 -0
@@ -9,6 +9,8 @@ module ActivityNotification
9
9
  end
10
10
 
11
11
  class_methods do
12
+ # Checks if the model includes notifier and notifier methods are available.
13
+ # @return [Boolean] Always true
12
14
  def available_as_notifier?
13
15
  true
14
16
  end
@@ -1,55 +1,96 @@
1
1
  module ActivityNotification
2
+ # Target implementation included in target model to notify, like users or administrators.
2
3
  module Target
3
4
  extend ActiveSupport::Concern
4
5
  included do
5
6
  include Common
7
+
8
+ # Has many notification instances of this target.
9
+ # @scope instance
10
+ # @return [Array<Notificaion>] Array or database query of notifications of this target
6
11
  has_many :notifications,
7
12
  class_name: "::ActivityNotification::Notification",
8
13
  as: :target
14
+
9
15
  class_attribute :_notification_email, :_notification_email_allowed, :_notification_devise_resource
10
16
  set_target_class_defaults
11
17
  end
12
18
 
13
19
  class_methods do
20
+ # Checks if the model includes target and target methods are available.
21
+ # @return [Boolean] Always true
14
22
  def available_as_target?
15
23
  true
16
24
  end
17
25
 
26
+ # Sets default values to target class fields.
27
+ # @return [Nil] nil
18
28
  def set_target_class_defaults
19
29
  self._notification_email = nil
20
30
  self._notification_email_allowed = ActivityNotification.config.email_enabled
21
31
  self._notification_devise_resource = ->(model) { model }
32
+ nil
22
33
  end
23
34
  end
24
35
 
36
+ # Returns target email address for email notification.
37
+ # This method is able to be overriden.
38
+ #
39
+ # @return [String] Target email address
25
40
  def mailer_to
26
41
  resolve_value(_notification_email)
27
42
  end
28
43
 
44
+ # Returns if sending notification email is allowed for the target from configured field or overriden method.
45
+ # This method is able to be overriden.
46
+ #
47
+ # @param [Object] notifiable Notifiable instance of the notification
48
+ # @param [String] key Key of the notification
49
+ # @return [Boolean] If sending notification email is allowed for the target
29
50
  def notification_email_allowed?(notifiable, key)
30
51
  resolve_value(_notification_email_allowed, notifiable, key)
31
52
  end
32
53
 
54
+ # Returns if current resource signed in with Devise is authenticated for the notification.
55
+ # This method is able to be overriden.
56
+ #
57
+ # @param [Object] current_resource Current resource signed in with Devise
58
+ # @return [Boolean] If current resource signed in with Devise is authenticated for the notification
33
59
  def authenticated_with_devise?(current_resource)
34
60
  devise_resource = resolve_value(_notification_devise_resource)
35
61
  unless current_resource.instance_of? devise_resource.class
36
62
  raise TypeError,
37
- "Defferent type of current resource #{current_resource.class.to_s} "\
38
- "with devise resource #{devise_resource.class.to_s} has been passed to #{self.class}##{__method__}. "\
63
+ "Defferent type of current resource #{current_resource.class} "\
64
+ "with devise resource #{devise_resource.class} has been passed to #{self.class}##{__method__}. "\
39
65
  "You have to override #{self.class}##{__method__} method or set devise_resource in acts_as_target."
40
66
  end
41
67
  current_resource == devise_resource
42
68
  end
43
69
 
70
+ # Returns count of unopened notifications of the target.
71
+ #
72
+ # @return [Integer] Count of unopened notifications of the target
44
73
  def unopened_notification_count
45
74
  unopened_notification_index.count
46
75
  end
47
76
 
77
+ # Returns if the target has unopened notifications.
78
+ #
79
+ # @return [Boolean] If the target has unopened notifications
48
80
  def has_unopened_notifications?
49
81
  unopened_notification_index.exists?
50
82
  end
51
83
 
52
- #TODO is this switching the best solution?
84
+ # Gets automatically arranged notification index of the target.
85
+ # When the target has unopened notifications, returns unopened index with unopened_notification_index.
86
+ # Otherwise, returns opened index with opened_notification_index.
87
+ # @todo Is this switching the best solution?
88
+ #
89
+ # @example Get automatically arranged notification index of the @user
90
+ # @notifications = @user.notification_index
91
+ #
92
+ # @param [Integer] limit Limit to query for notifications
93
+ # @return [Array<Notificaion>] Notification index of the target
53
94
  def notification_index(limit = nil)
54
95
  # When the target have unopened notifications
55
96
  notifications.unopened_index.exists? ?
@@ -61,31 +102,68 @@ module ActivityNotification
61
102
  opened_notification_index
62
103
  end
63
104
 
105
+ # Gets unopened notification index of the target.
106
+ #
107
+ # @example Get unopened notification index of the @user
108
+ # @notifications = @user.unopened_notification_index
109
+ #
110
+ # @param [Integer] limit Limit to query for notifications
111
+ # @return [Array<Notificaion>] Unopened notification index of the target
64
112
  def unopened_notification_index(limit = nil)
65
113
  limit.present? ?
66
114
  notifications.unopened_index.limit(limit) :
67
115
  notifications.unopened_index
68
116
  end
69
117
 
118
+ # Gets opened notification index of the target.
119
+ #
120
+ # @example Get opened notification index of the @user
121
+ # @notifications = @user.opened_notification_index(10)
122
+ #
123
+ # @param [Integer] limit Limit to query for notifications
124
+ # @return [Array<Notificaion>] Opened notification index of the target
70
125
  def opened_notification_index(limit = ActivityNotification.config.opened_limit)
71
126
  notifications.opened_index(limit)
72
127
  end
73
128
 
74
-
75
- # Wrapper methods of Notification class methods
76
-
129
+ # Generates notifications to this target.
130
+ # This method calls NotificationApi#notify_to internally with self target instance.
131
+ # @see NotificationApi#notify_to
132
+ #
133
+ # @param [Object] notifiable Notifiable instance to notify
134
+ # @param [Hash] options Options for notifications
135
+ # @option options [String] :key (notifiable.default_notification_key) Key of the notification
136
+ # @option options [Object] :group (nil) Group unit of the notifications
137
+ # @option options [Object] :notifier (nil) Notifier of the notifications
138
+ # @option options [Hash] :parameters ({}) Additional parameters of the notifications
139
+ # @option options [Boolean] :send_email (true) Whether it sends notification email
140
+ # @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
141
+ # @return [Notification] Generated notification instance
77
142
  def notify_to(notifiable, options = {})
78
143
  Notification.notify_to(self, notifiable, options)
79
144
  end
80
145
 
81
- def open_all_notifications(opened_at = nil)
82
- Notification.open_all_of(self, opened_at)
146
+ # Opens all notifications of this target.
147
+ # This method calls NotificationApi#open_all_of internally with self target instance.
148
+ # @see NotificationApi#open_all_of
149
+ #
150
+ # @param [Hash] options Options for opening notifications
151
+ # @option options [DateTime] :opened_at (DateTime.now) Time to set to opened_at of the notification record
152
+ # @return [Integer] Number of opened notification records
153
+ # @todo Add filter option
154
+ def open_all_notifications(options = {})
155
+ Notification.open_all_of(self, options)
83
156
  end
84
157
 
85
158
 
86
- # Methods to be overriden
87
-
88
- # Typical method to get notifications index
159
+ # Gets automatically arranged notification index of the target with included attributes like target, notifiable, group and notifier.
160
+ # This method is the typical way to get notifications index from controller of view.
161
+ #
162
+ # @example Get automatically arranged notification index of the @user with included attributes
163
+ # @notifications = @user.notification_index_with_attributes
164
+ #
165
+ # @param [Integer] limit Limit to query for notifications
166
+ # @return [Array<Notificaion>] Notification index of the target with attributes
89
167
  def notification_index_with_attributes(limit = nil)
90
168
  # When the target have unopened notifications
91
169
  unopened_notification_index.exists? ?
@@ -97,25 +175,46 @@ module ActivityNotification
97
175
  opened_notification_index_with_attributes
98
176
  end
99
177
 
178
+ # Gets unopened notification index of the target with included attributes like target, notifiable, group and notifier.
179
+ #
180
+ # @example Get unopened notification index of the @user with included attributes
181
+ # @notifications = @user.unopened_notification_index_with_attributes
182
+ #
183
+ # @param [Integer] limit Limit to query for notifications
184
+ # @return [Array<Notificaion>] Unopened notification index of the target with attributes
100
185
  def unopened_notification_index_with_attributes(limit = nil)
101
- if unopened_notification_index(limit).present?
102
- Notification.group_member_exists?(unopened_notification_index(limit)) ?
103
- unopened_notification_index(limit).with_target.with_notifiable.with_group.with_notifier :
104
- unopened_notification_index(limit).with_target.with_notifiable.with_notifier
105
- else
106
- notifications.none
107
- end
186
+ include_attributes unopened_notification_index(limit)
108
187
  end
109
188
 
189
+ # Gets opened notification index of the target with including attributes like target, notifiable, group and notifier.
190
+ #
191
+ # @example Get opened notification index of the @user with included attributes
192
+ # @notifications = @user.opened_notification_index_with_attributes(10)
193
+ #
194
+ # @param [Integer] limit Limit to query for notifications
195
+ # @return [Array<Notificaion>] Opened notification index of the target with attributes
110
196
  def opened_notification_index_with_attributes(limit = ActivityNotification.config.opened_limit)
111
- if opened_notification_index(limit).present?
112
- Notification.group_member_exists?(opened_notification_index(limit)) ?
113
- opened_notification_index(limit).with_target.with_notifiable.with_group.with_notifier :
114
- opened_notification_index(limit).with_target.with_notifiable.with_notifier
115
- else
116
- notifications.none
117
- end
197
+ include_attributes opened_notification_index(limit)
118
198
  end
119
199
 
200
+ private
201
+
202
+ # Includes attributes like target, notifiable, group or notifier from the notification index.
203
+ # When group member exists in the notification index, group will be included in addition to target, notifiable and or notifier.
204
+ # Otherwise, target, notifiable and or notifier will be include without group.
205
+ # @api private
206
+ #
207
+ # @param [Array<Notificaion>] notification_index Notification index
208
+ # @return [Array<Notificaion>] Notification index with attributes
209
+ def include_attributes(notification_index)
210
+ if notification_index.present?
211
+ Notification.group_member_exists?(notification_index) ?
212
+ notification_index.with_target.with_notifiable.with_group.with_notifier :
213
+ notification_index.with_target.with_notifiable.with_notifier
214
+ else
215
+ notifications.none
216
+ end
217
+ end
218
+
120
219
  end
121
220
  end
@@ -1,17 +1,43 @@
1
1
  module ActivityNotification
2
+ # Notification model implementation generated by ActivityNotification.
2
3
  class Notification < ActiveRecord::Base
3
4
  include Renderable
4
5
  include Common
5
6
  include NotificationApi
6
7
  self.table_name = ActivityNotification.config.table_name
7
8
 
9
+ # Belongs to target instance of this notification as polymorphic association.
10
+ # @scope instance
11
+ # @return [Object] Target instance of this notification
8
12
  belongs_to :target, polymorphic: true
13
+
14
+ # Belongs to notifiable instance of this notification as polymorphic association.
15
+ # @scope instance
16
+ # @return [Object] Notifiable instance of this notification
9
17
  belongs_to :notifiable, polymorphic: true
18
+
19
+ # Belongs to group instance of this notification as polymorphic association.
20
+ # @scope instance
21
+ # @return [Object] Group instance of this notification
10
22
  belongs_to :group, polymorphic: true
23
+
24
+ # Belongs to group owner notification instance of this notification.
25
+ # Only group member instance has :group_owner value.
26
+ # Group owner instance has nil as :group_owner association.
27
+ # @scope instance
28
+ # @return [Notification] Group owner notification instance of this notification
11
29
  belongs_to :group_owner, class_name: :Notification
12
- has_many :group_members,
13
- class_name: "::ActivityNotification::Notification",
14
- foreign_key: :group_owner_id
30
+
31
+ # Has many group member notification instances of this notification.
32
+ # Only group owner instance has :group_members value.
33
+ # Group member instance has nil as :group_members association.
34
+ # @scope instance
35
+ # @return [Array<Notificaion>] Array or database query of the group member notification instances of this notification
36
+ has_many :group_members, class_name: :Notification, foreign_key: :group_owner_id
37
+
38
+ # Belongs to :otifier instance of this notification.
39
+ # @scope instance
40
+ # @return [Object] Notifier instance of this notification
15
41
  belongs_to :notifier, polymorphic: true
16
42
 
17
43
  # Serialize parameters Hash
@@ -21,30 +47,168 @@ module ActivityNotification
21
47
  validates :notifiable, presence: true
22
48
  validates :key, presence: true
23
49
 
50
+ # Selects group owner notifications only.
51
+ # @scope class
52
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
24
53
  scope :group_owners_only, -> { where(group_owner_id: nil) }
54
+
55
+ # Selects group member notifications only.
56
+ # @scope class
57
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
25
58
  scope :group_members_only, -> { where.not(group_owner_id: nil) }
59
+
60
+ # Selects unopened notifications only.
61
+ # @scope class
62
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
26
63
  scope :unopened_only, -> { where(opened_at: nil) }
64
+
65
+ # Selects unopened notification index.
66
+ # Defined same as `unopened_only.group_owners_only.latest_order`.
67
+ # @example Get unopened notificaton index of the @user
68
+ # @notifications = @user.unopened_index
69
+ # @scope class
70
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
27
71
  scope :unopened_index, -> { unopened_only.group_owners_only.latest_order }
72
+
73
+ # Selects opened notifications only without limit.
74
+ # Be careful to get too many records with this method.
75
+ # @scope class
76
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
28
77
  scope :opened_only!, -> { where.not(opened_at: nil) }
78
+
79
+ # Selects opened notifications only with limit.
80
+ # @scope class
81
+ # @param [Integer] limit Limit to query for opened notifications
82
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
29
83
  scope :opened_only, ->(limit) { opened_only!.limit(limit) }
84
+
85
+ # Selects unopened notification index.
86
+ # Defined same as `opened_only(limit).group_owners_only.latest_order`.
87
+ # @scope class
88
+ # @param [Integer] limit Limit to query for opened notifications
89
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
30
90
  scope :opened_index, ->(limit) { opened_only(limit).group_owners_only.latest_order }
91
+
92
+ # Selects group member notifications in unopened_index.
93
+ # @scope class
94
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
31
95
  scope :unopened_index_group_members_only, -> { where(group_owner_id: unopened_index.pluck(:id)) }
32
- scope :opened_index_group_members_only, ->(limit) { where(group_owner_id: opened_index(limit).pluck(:id)) }
33
96
 
97
+ # Selects group member notifications in opened_index.
98
+ # @scope class
99
+ # @param [Integer] limit Limit to query for opened notifications
100
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
101
+ scope :opened_index_group_members_only, ->(limit) { where(group_owner_id: opened_index(limit).map(&:id)) }
102
+
103
+ # Selects filtered notifications by target instance.
104
+ # ActivityNotification::Notification.filtered_by_target(@user)
105
+ # is the same as
106
+ # @user.notifications
107
+ # @scope class
108
+ # @param [Object] target Target instance for filter
109
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
34
110
  scope :filtered_by_target, ->(target) { where(target: target) }
111
+
112
+ # Selects filtered notifications by notifiable instance.
113
+ # @example Get filtered unopened notificatons of the @user for @comment as notifiable
114
+ # @notifications = @user.notifications.unopened_only.filtered_by_instance(@comment)
115
+ # @scope class
116
+ # @param [Object] notifiable Notifiable instance for filter
117
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
35
118
  scope :filtered_by_instance, ->(notifiable) { where(notifiable: notifiable) }
119
+
120
+ # Selects filtered notifications by notifiable_type.
121
+ # @example Get filtered unopened notificatons of the @user for Comment notifiable class
122
+ # @notifications = @user.notifications.unopened_only.filtered_by_type('Comment')
123
+ # @scope class
124
+ # @param [String] notifiable_type Notifiable type for filter
125
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
36
126
  scope :filtered_by_type, ->(notifiable_type) { where(notifiable_type: notifiable_type) }
127
+
128
+ # Selects filtered notifications by group instance.
129
+ # @example Get filtered unopened notificatons of the @user for @article as group
130
+ # @notifications = @user.notifications.unopened_only.filtered_by_group(@article)
131
+ # @scope class
132
+ # @param [Object] group Group instance for filter
133
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
37
134
  scope :filtered_by_group, ->(group) { where(group: group) }
135
+
136
+ # Selects filtered notifications by key.
137
+ # @example Get filtered unopened notificatons of the @user with key 'comment.reply'
138
+ # @notifications = @user.notifications.unopened_only.filtered_by_key('comment.reply')
139
+ # @scope class
140
+ # @param [String] key Key of the notification for filter
141
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
38
142
  scope :filtered_by_key, ->(key) { where(key: key) }
39
143
 
144
+ # Selects filtered notifications by notifiable_type, group or key with filter options.
145
+ # @example Get filtered unopened notificatons of the @user for Comment notifiable class
146
+ # @notifications = @user.notifications.unopened_only.filtered_by_options({ filtered_by_type: 'Comment' })
147
+ # @example Get filtered unopened notificatons of the @user for @article as group
148
+ # @notifications = @user.notifications.unopened_only.filtered_by_options({ filtered_by_group: @article })
149
+ # @example Get filtered unopened notificatons of the @user for Article instance id=1 as group
150
+ # @notifications = @user.notifications.unopened_only.filtered_by_options({ filtered_by_group_type: 'Article', filtered_by_group_id: '1' })
151
+ # @example Get filtered unopened notificatons of the @user with key 'comment.reply'
152
+ # @notifications = @user.notifications.unopened_only.filtered_by_options({ filtered_by_key: 'comment.reply' })
153
+ # @example Get filtered unopened notificatons of the @user for Comment notifiable class with key 'comment.reply'
154
+ # @notifications = @user.notifications.unopened_only.filtered_by_options({ filtered_by_type: 'Comment', filtered_by_key: 'comment.reply' })
155
+ # @scope class
156
+ # @param [Hash] options Options for filter
157
+ # @option options [String] :filtered_by_type (nil) Notifiable type for filter
158
+ # @option options [Object] :filtered_by_group (nil) Group instance for filter
159
+ # @option options [String] :filtered_by_group_type (nil) Group type for filter, valid with :filtered_by_group_id
160
+ # @option options [String] :filtered_by_group_id (nil) Group instance id for filter, valid with :filtered_by_group_type
161
+ # @option options [String] :filtered_by_key (nil) Key of the notification for filter
162
+ # @return [Array<Notificaion> | ActiveRecord_AssociationRelation<Notificaion>] Array or database query of filtered notifications
163
+ scope :filtered_by_options, ->(options = {}) {
164
+ options = options.with_indifferent_access
165
+ filtered_notifications = all
166
+ if options.has_key?(:filtered_by_type)
167
+ filtered_notifications = filtered_notifications.filtered_by_type(options[:filtered_by_type])
168
+ end
169
+ if options.has_key?(:filtered_by_group)
170
+ filtered_notifications = filtered_notifications.filtered_by_group(options[:filtered_by_group])
171
+ end
172
+ if options.has_key?(:filtered_by_group_type) and options.has_key?(:filtered_by_group_id)
173
+ filtered_notifications = filtered_notifications
174
+ .where(group_type: options[:filtered_by_group_type], group_id: options[:filtered_by_group_id])
175
+ end
176
+ if options.has_key?(:filtered_by_key)
177
+ filtered_notifications = filtered_notifications.filtered_by_key(options[:filtered_by_key])
178
+ end
179
+ filtered_notifications
180
+ }
181
+
182
+ # Includes target instance with query for notifications.
183
+ # @return [ActiveRecord_AssociationRelation] Database query of notifications with target
40
184
  scope :with_target, -> { includes(:target) }
185
+
186
+ # Includes notifiable instance with query for notifications.
187
+ # @return [ActiveRecord_AssociationRelation] Database query of notifications with notifiable
41
188
  scope :with_notifiable, -> { includes(:notifiable) }
189
+
190
+ # Includes group instance with query for notifications.
191
+ # @return [ActiveRecord_AssociationRelation] Database query of notifications with group
42
192
  scope :with_group, -> { includes(:group) }
193
+
194
+ # Includes notifier instance with query for notifications.
195
+ # @return [ActiveRecord_AssociationRelation] Database query of notifications with notifier
43
196
  scope :with_notifier, -> { includes(:notifier) }
44
197
 
198
+ # Orders by latest (newest) first as created_at: :desc.
199
+ # @return [ActiveRecord_AssociationRelation] Database query of notifications ordered by latest first
45
200
  scope :latest_order, -> { order(created_at: :desc) }
201
+
202
+ # Orders by earliest (older) first as created_at: :asc.
203
+ # @return [ActiveRecord_AssociationRelation] Database query of notifications ordered by earliest first
46
204
  scope :earliest_order, -> { order(created_at: :asc) }
205
+
206
+ # Returns latest notification instance.
207
+ # @return [Notification] Latest notification instance
47
208
  scope :latest, -> { latest_order.first }
209
+
210
+ # Returns earliest notification instance.
211
+ # @return [Notification] Earliest notification instance
48
212
  scope :earliest, -> { earliest_order.first }
49
213
  end
50
214
  end