activity_notification 2.1.2 → 2.2.2
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.
- checksums.yaml +4 -4
- data/.travis.yml +10 -16
- data/CHANGELOG.md +52 -0
- data/Gemfile +2 -3
- data/README.md +2 -2
- data/activity_notification.gemspec +1 -1
- data/app/channels/activity_notification/notification_api_with_devise_channel.rb +1 -1
- data/app/channels/activity_notification/notification_channel.rb +1 -1
- data/app/channels/activity_notification/notification_with_devise_channel.rb +1 -1
- data/app/controllers/activity_notification/notifications_controller.rb +0 -20
- data/app/controllers/activity_notification/subscriptions_api_controller.rb +1 -1
- data/app/controllers/activity_notification/subscriptions_controller.rb +2 -2
- data/app/views/activity_notification/subscriptions/default/_form.html.erb +1 -1
- data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +2 -2
- data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +2 -2
- data/app/views/activity_notification/subscriptions/default/index.html.erb +2 -2
- data/app/views/activity_notification/subscriptions/default/show.html.erb +2 -2
- data/bin/bundle_update.sh +0 -1
- data/docs/Functions.md +19 -3
- data/docs/Setup.md +190 -63
- data/gemfiles/Gemfile.rails-5.0 +3 -1
- data/gemfiles/Gemfile.rails-5.1 +3 -1
- data/gemfiles/Gemfile.rails-5.2 +3 -1
- data/gemfiles/Gemfile.rails-6.0 +2 -3
- data/gemfiles/{Gemfile.rails-4.2 → Gemfile.rails-6.1} +4 -5
- data/lib/activity_notification/apis/notification_api.rb +7 -0
- data/lib/activity_notification/apis/subscription_api.rb +5 -5
- data/lib/activity_notification/common.rb +15 -4
- data/lib/activity_notification/config.rb +53 -23
- data/lib/activity_notification/controllers/common_controller.rb +2 -18
- data/lib/activity_notification/models/concerns/notifiable.rb +12 -12
- data/lib/activity_notification/models/concerns/subscriber.rb +6 -4
- data/lib/activity_notification/models/concerns/swagger/notification_schema.rb +34 -34
- data/lib/activity_notification/models/concerns/swagger/subscription_schema.rb +17 -17
- data/lib/activity_notification/models/concerns/target.rb +8 -12
- data/lib/activity_notification/optional_targets/action_cable_api_channel.rb +1 -1
- data/lib/activity_notification/optional_targets/action_cable_channel.rb +1 -1
- data/lib/activity_notification/orm/active_record.rb +1 -1
- data/lib/activity_notification/orm/active_record/notification.rb +3 -3
- data/lib/activity_notification/orm/dynamoid.rb +10 -3
- data/lib/activity_notification/orm/dynamoid/notification.rb +49 -14
- data/lib/activity_notification/orm/dynamoid/subscription.rb +2 -2
- data/lib/activity_notification/orm/mongoid.rb +10 -3
- data/lib/activity_notification/orm/mongoid/notification.rb +8 -6
- data/lib/activity_notification/orm/mongoid/subscription.rb +1 -1
- data/lib/activity_notification/renderable.rb +2 -2
- data/lib/activity_notification/roles/acts_as_notifiable.rb +13 -16
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/templates/activity_notification.rb +11 -1
- data/lib/generators/templates/migrations/migration.rb +1 -1
- data/spec/channels/notification_api_channel_spec.rb +42 -44
- data/spec/channels/notification_api_with_devise_channel_spec.rb +57 -59
- data/spec/channels/notification_channel_spec.rb +41 -43
- data/spec/channels/notification_with_devise_channel_spec.rb +75 -77
- data/spec/concerns/apis/subscription_api_spec.rb +144 -2
- data/spec/concerns/common_spec.rb +25 -3
- data/spec/concerns/models/notifiable_spec.rb +35 -35
- data/spec/concerns/models/subscriber_spec.rb +179 -6
- data/spec/concerns/models/target_spec.rb +10 -12
- data/spec/concerns/renderable_spec.rb +5 -5
- data/spec/config_spec.rb +26 -15
- data/spec/controllers/controller_spec_utility.rb +15 -51
- data/spec/generators/migration/migration_generator_spec.rb +2 -10
- data/spec/helpers/view_helpers_spec.rb +1 -1
- data/spec/optional_targets/action_cable_api_channel_spec.rb +21 -24
- data/spec/optional_targets/action_cable_channel_spec.rb +26 -29
- data/spec/rails_app/app/controllers/users_controller.rb +5 -0
- data/spec/rails_app/app/javascript/App.vue +8 -72
- data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +3 -4
- data/spec/rails_app/app/javascript/components/Top.vue +2 -3
- data/spec/rails_app/app/javascript/packs/spa.js +6 -3
- data/spec/rails_app/app/javascript/router/index.js +73 -0
- data/spec/rails_app/app/javascript/store/{auth.js → index.js} +0 -0
- data/spec/rails_app/app/models/dummy/dummy_group.rb +8 -0
- data/spec/rails_app/app/models/dummy/dummy_notifiable_target.rb +8 -0
- data/spec/rails_app/app/models/user.rb +2 -1
- data/spec/rails_app/config/application.rb +6 -7
- data/spec/rails_app/config/dynamoid.rb +11 -3
- data/spec/rails_app/config/environments/production.rb +3 -0
- data/spec/rails_app/config/environments/test.rb +2 -11
- data/spec/rails_app/config/initializers/activity_notification.rb +13 -3
- data/spec/rails_app/config/routes.rb +5 -1
- data/spec/rails_app/db/seeds.rb +9 -2
- data/spec/rails_app/package.json +14 -14
- data/spec/roles/acts_as_notifiable_spec.rb +5 -5
- data/spec/spec_helper.rb +1 -5
- metadata +12 -12
- data/spec/support/patch_rails_42_action_controller_test_response.rb +0 -11
|
@@ -90,15 +90,15 @@ module ActivityNotification
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
key :example, {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
action_cable_channel: {
|
|
94
|
+
subscribing: true,
|
|
95
|
+
subscribed_at: Time.current,
|
|
96
|
+
unsubscribed_at: nil
|
|
97
97
|
},
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
slack: {
|
|
99
|
+
subscribing: false,
|
|
100
|
+
subscribed_at: nil,
|
|
101
|
+
unsubscribed_at: Time.current
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
end
|
|
@@ -114,11 +114,11 @@ module ActivityNotification
|
|
|
114
114
|
key :type, :object
|
|
115
115
|
key :description, "Associated target model in your application"
|
|
116
116
|
key :example, {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
117
|
+
id: 1,
|
|
118
|
+
email: "ichiro@example.com",
|
|
119
|
+
name: "Ichiro",
|
|
120
|
+
created_at: Time.current,
|
|
121
|
+
updated_at: Time.current
|
|
122
122
|
}
|
|
123
123
|
end
|
|
124
124
|
end
|
|
@@ -145,11 +145,11 @@ module ActivityNotification
|
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
key :example, {
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
action_cable_channel: {
|
|
149
|
+
subscribing: true
|
|
150
150
|
},
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
slack: {
|
|
152
|
+
subscribing: false
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
end
|
|
@@ -213,16 +213,12 @@ module ActivityNotification
|
|
|
213
213
|
resolve_value(_notification_action_cable_with_devise)
|
|
214
214
|
end
|
|
215
215
|
|
|
216
|
-
#
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
def notification_action_cable_channel_class_name
|
|
222
|
-
notification_action_cable_with_devise? ? "ActivityNotification::NotificationWithDeviseChannel" : "ActivityNotification::NotificationChannel"
|
|
223
|
-
end
|
|
216
|
+
# Returns notification ActionCable channel class name from action_cable_with_devise? configuration.
|
|
217
|
+
#
|
|
218
|
+
# @return [String] Notification ActionCable channel class name from action_cable_with_devise? configuration
|
|
219
|
+
def notification_action_cable_channel_class_name
|
|
220
|
+
notification_action_cable_with_devise? ? "ActivityNotification::NotificationWithDeviseChannel" : "ActivityNotification::NotificationChannel"
|
|
224
221
|
end
|
|
225
|
-
# :nocov:
|
|
226
222
|
|
|
227
223
|
# Returns Devise resource model associated with this target.
|
|
228
224
|
#
|
|
@@ -545,7 +541,7 @@ module ActivityNotification
|
|
|
545
541
|
# @param [String] key Key of the notification
|
|
546
542
|
# @param [Boolean] subscribe_as_default Default subscription value to use when the subscription record does not configured
|
|
547
543
|
# @return [Boolean] If the target subscribes the notification email or the subscription management is not allowed for the target
|
|
548
|
-
def subscribes_to_notification_email?(key, subscribe_as_default = ActivityNotification.config.
|
|
544
|
+
def subscribes_to_notification_email?(key, subscribe_as_default = ActivityNotification.config.subscribe_to_email_as_default)
|
|
549
545
|
!subscription_allowed?(key) || _subscribes_to_notification_email?(key, subscribe_as_default)
|
|
550
546
|
end
|
|
551
547
|
alias_method :subscribes_to_email?, :subscribes_to_notification_email?
|
|
@@ -557,7 +553,7 @@ module ActivityNotification
|
|
|
557
553
|
# @param [String, Symbol] optional_target_name Class name of the optional target implementation (e.g. :amazon_sns, :slack)
|
|
558
554
|
# @param [Boolean] subscribe_as_default Default subscription value to use when the subscription record does not configured
|
|
559
555
|
# @return [Boolean] If the target subscribes the notification email or the subscription management is not allowed for the target
|
|
560
|
-
def subscribes_to_optional_target?(key, optional_target_name, subscribe_as_default = ActivityNotification.config.
|
|
556
|
+
def subscribes_to_optional_target?(key, optional_target_name, subscribe_as_default = ActivityNotification.config.subscribe_to_optional_targets_as_default)
|
|
561
557
|
!subscription_allowed?(key) || _subscribes_to_optional_target?(key, optional_target_name, subscribe_as_default)
|
|
562
558
|
end
|
|
563
559
|
|
|
@@ -693,4 +689,4 @@ module ActivityNotification
|
|
|
693
689
|
end
|
|
694
690
|
|
|
695
691
|
end
|
|
696
|
-
end
|
|
692
|
+
end
|
|
@@ -26,7 +26,7 @@ module ActivityNotification
|
|
|
26
26
|
# @return [Boolean] Whether Action Cable notification API is allowed
|
|
27
27
|
def notification_action_cable_api_allowed?(notification)
|
|
28
28
|
notification.target.notification_action_cable_allowed?(notification.notifiable, notification.key) &&
|
|
29
|
-
notification.notifiable.
|
|
29
|
+
notification.notifiable.notifiable_action_cable_api_allowed?(notification.target, notification.key)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
# Format message to broadcast
|
|
@@ -44,7 +44,7 @@ module ActivityNotification
|
|
|
44
44
|
# @return [Boolean] Whether Action Cable notification is allowed
|
|
45
45
|
def notification_action_cable_allowed?(notification)
|
|
46
46
|
notification.target.notification_action_cable_allowed?(notification.notifiable, notification.key) &&
|
|
47
|
-
notification.notifiable.
|
|
47
|
+
notification.notifiable.notifiable_action_cable_allowed?(notification.target, notification.key)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
# Format message to broadcast
|
|
@@ -6,7 +6,7 @@ module ActivityNotification
|
|
|
6
6
|
# Defines has_many association with ActivityNotification models.
|
|
7
7
|
# @return [ActiveRecord_AssociationRelation<Object>] Database query of associated model instances
|
|
8
8
|
def has_many_records(name, options = {})
|
|
9
|
-
has_many name, options
|
|
9
|
+
has_many name, **options
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
end
|
|
@@ -23,14 +23,14 @@ module ActivityNotification
|
|
|
23
23
|
# Belongs to group instance of this notification as polymorphic association.
|
|
24
24
|
# @scope instance
|
|
25
25
|
# @return [Object] Group instance of this notification
|
|
26
|
-
belongs_to :group,
|
|
26
|
+
belongs_to :group, polymorphic: true, optional: true
|
|
27
27
|
|
|
28
28
|
# Belongs to group owner notification instance of this notification.
|
|
29
29
|
# Only group member instance has :group_owner value.
|
|
30
30
|
# Group owner instance has nil as :group_owner association.
|
|
31
31
|
# @scope instance
|
|
32
32
|
# @return [Notification] Group owner notification instance of this notification
|
|
33
|
-
belongs_to :group_owner,
|
|
33
|
+
belongs_to :group_owner, class_name: "ActivityNotification::Notification", optional: true
|
|
34
34
|
|
|
35
35
|
# Has many group member notification instances of this notification.
|
|
36
36
|
# Only group owner instance has :group_members value.
|
|
@@ -42,7 +42,7 @@ module ActivityNotification
|
|
|
42
42
|
# Belongs to :notifier instance of this notification.
|
|
43
43
|
# @scope instance
|
|
44
44
|
# @return [Object] Notifier instance of this notification
|
|
45
|
-
belongs_to :notifier,
|
|
45
|
+
belongs_to :notifier, polymorphic: true, optional: true
|
|
46
46
|
|
|
47
47
|
# Serialize parameters Hash
|
|
48
48
|
serialize :parameters, Hash
|
|
@@ -22,8 +22,8 @@ module ActivityNotification
|
|
|
22
22
|
association_name = name.to_s.singularize.underscore
|
|
23
23
|
composite_field = "#{association_name}_key".to_sym
|
|
24
24
|
field composite_field, :string
|
|
25
|
-
associated_record_field = "#{association_name}
|
|
26
|
-
field associated_record_field, :
|
|
25
|
+
associated_record_field = "stored_#{association_name}".to_sym
|
|
26
|
+
field associated_record_field, :raw if ActivityNotification.config.store_with_associated_records && _options[:store_with_associated_records]
|
|
27
27
|
|
|
28
28
|
self.instance_eval do
|
|
29
29
|
define_method(name) do |reload = false|
|
|
@@ -43,7 +43,14 @@ module ActivityNotification
|
|
|
43
43
|
self.send("#{composite_field}=", nil)
|
|
44
44
|
else
|
|
45
45
|
self.send("#{composite_field}=", "#{new_instance.class.name}#{ActivityNotification.config.composite_key_delimiter}#{new_instance.id}")
|
|
46
|
-
|
|
46
|
+
associated_record_json = new_instance.as_json(_options[:as_json_options] || {})
|
|
47
|
+
# Cast Time and DateTime field to String to handle Dynamoid unsupported type error
|
|
48
|
+
if associated_record_json.present?
|
|
49
|
+
associated_record_json.each do |k, v|
|
|
50
|
+
associated_record_json[k] = v.to_s if v.is_a?(Time) || v.is_a?(DateTime)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
self.send("#{associated_record_field}=", associated_record_json) if ActivityNotification.config.store_with_associated_records && _options[:store_with_associated_records]
|
|
47
54
|
end
|
|
48
55
|
self.instance_variable_set("@#{name}", nil)
|
|
49
56
|
end
|
|
@@ -20,17 +20,17 @@ module ActivityNotification
|
|
|
20
20
|
# Belongs to target instance of this notification as polymorphic association using composite key.
|
|
21
21
|
# @scope instance
|
|
22
22
|
# @return [Object] Target instance of this notification
|
|
23
|
-
belongs_to_composite_xdb_record :target, store_with_associated_records: true
|
|
23
|
+
belongs_to_composite_xdb_record :target, store_with_associated_records: true, as_json_options: { methods: [:printable_type, :printable_target_name] }
|
|
24
24
|
|
|
25
25
|
# Belongs to notifiable instance of this notification as polymorphic association using composite key.
|
|
26
26
|
# @scope instance
|
|
27
27
|
# @return [Object] Notifiable instance of this notification
|
|
28
|
-
belongs_to_composite_xdb_record :notifiable, store_with_associated_records: true
|
|
28
|
+
belongs_to_composite_xdb_record :notifiable, store_with_associated_records: true, as_json_options: { methods: [:printable_type] }
|
|
29
29
|
|
|
30
30
|
# Belongs to group instance of this notification as polymorphic association using composite key.
|
|
31
31
|
# @scope instance
|
|
32
32
|
# @return [Object] Group instance of this notification
|
|
33
|
-
belongs_to_composite_xdb_record :group
|
|
33
|
+
belongs_to_composite_xdb_record :group, store_with_associated_records: true, as_json_options: { methods: [:printable_type, :printable_group_name] }
|
|
34
34
|
|
|
35
35
|
field :key, :string
|
|
36
36
|
field :parameters, :raw, default: {}
|
|
@@ -42,7 +42,7 @@ module ActivityNotification
|
|
|
42
42
|
# Group owner instance has nil as :group_owner association.
|
|
43
43
|
# @scope instance
|
|
44
44
|
# @return [Notification] Group owner notification instance of this notification
|
|
45
|
-
belongs_to :group_owner, { class_name: "ActivityNotification::Notification", foreign_key: :group_owner_id
|
|
45
|
+
belongs_to :group_owner, { class_name: "ActivityNotification::Notification", foreign_key: :group_owner_id, optional: true }
|
|
46
46
|
|
|
47
47
|
# Customized method that belongs to group owner notification instance of this notification.
|
|
48
48
|
# @raise [Errors::RecordNotFound] Record not found error
|
|
@@ -64,14 +64,54 @@ module ActivityNotification
|
|
|
64
64
|
# Belongs to :otifier instance of this notification.
|
|
65
65
|
# @scope instance
|
|
66
66
|
# @return [Object] Notifier instance of this notification
|
|
67
|
-
belongs_to_composite_xdb_record :notifier, store_with_associated_records: true
|
|
67
|
+
belongs_to_composite_xdb_record :notifier, store_with_associated_records: true, as_json_options: { methods: [:printable_type, :printable_notifier_name] }
|
|
68
|
+
|
|
69
|
+
# Additional fields to store from instance method when config.store_with_associated_records is enabled
|
|
70
|
+
if ActivityNotification.config.store_with_associated_records
|
|
71
|
+
field :stored_notifiable_path, :string
|
|
72
|
+
field :stored_printable_notifiable_name, :string
|
|
73
|
+
field :stored_group_member_notifier_count, :integer
|
|
74
|
+
field :stored_group_notification_count, :integer
|
|
75
|
+
field :stored_group_members, :array
|
|
76
|
+
|
|
77
|
+
# Returns prepared notification object to store
|
|
78
|
+
# @return [Object] prepared notification object to store
|
|
79
|
+
def prepare_to_store
|
|
80
|
+
self.stored_notifiable_path = notifiable_path
|
|
81
|
+
self.stored_printable_notifiable_name = printable_notifiable_name
|
|
82
|
+
if group_owner?
|
|
83
|
+
self.stored_group_notification_count = 0
|
|
84
|
+
self.stored_group_member_notifier_count = 0
|
|
85
|
+
self.stored_group_members = []
|
|
86
|
+
end
|
|
87
|
+
self
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Call after store action with stored notification
|
|
91
|
+
def after_store
|
|
92
|
+
if group_owner?
|
|
93
|
+
self.stored_group_notification_count = group_notification_count
|
|
94
|
+
self.stored_group_member_notifier_count = group_member_notifier_count
|
|
95
|
+
self.stored_group_members = group_members.as_json
|
|
96
|
+
self.stored_group_members.each do |group_member|
|
|
97
|
+
# Cast Time and DateTime field to String to handle Dynamoid unsupported type error
|
|
98
|
+
group_member.each do |k, v|
|
|
99
|
+
group_member[k] = v.to_s if v.is_a?(Time) || v.is_a?(DateTime)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
save
|
|
103
|
+
else
|
|
104
|
+
group_owner.after_store
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
68
108
|
|
|
69
109
|
# Mandatory global secondary index to query effectively
|
|
70
|
-
global_secondary_index hash_key: :target_key, range_key: :created_at, projected_attributes: :all
|
|
71
|
-
global_secondary_index hash_key: :group_owner_id, range_key: :created_at, projected_attributes: :all
|
|
110
|
+
global_secondary_index name: :index_target_key_created_at, hash_key: :target_key, range_key: :created_at, projected_attributes: :all
|
|
111
|
+
global_secondary_index name: :index_group_owner_id_created_at, hash_key: :group_owner_id, range_key: :created_at, projected_attributes: :all
|
|
72
112
|
# Optional global secondary index to sort by created_at
|
|
73
|
-
global_secondary_index hash_key: :notifier_key, range_key: :created_at, projected_attributes: :all
|
|
74
|
-
global_secondary_index hash_key: :notifiable_key, range_key: :created_at, projected_attributes: :all
|
|
113
|
+
global_secondary_index name: :index_notifier_key_created_at, hash_key: :notifier_key, range_key: :created_at, projected_attributes: :all
|
|
114
|
+
global_secondary_index name: :index_notifiable_key_created_at, hash_key: :notifiable_key, range_key: :created_at, projected_attributes: :all
|
|
75
115
|
|
|
76
116
|
validates :target, presence: true
|
|
77
117
|
validates :notifiable, presence: true
|
|
@@ -122,11 +162,6 @@ module ActivityNotification
|
|
|
122
162
|
raise ActivityNotification::DeleteRestrictionError, error_text
|
|
123
163
|
end
|
|
124
164
|
|
|
125
|
-
# Returns prepared notification object to store
|
|
126
|
-
# @return [Object] prepared notification object to store
|
|
127
|
-
# def prepare_to_store
|
|
128
|
-
# end
|
|
129
|
-
|
|
130
165
|
protected
|
|
131
166
|
|
|
132
167
|
# Returns count of group members of the unopened notification.
|
|
@@ -21,14 +21,14 @@ module ActivityNotification
|
|
|
21
21
|
|
|
22
22
|
field :key, :string
|
|
23
23
|
field :subscribing, :boolean, default: ActivityNotification.config.subscribe_as_default
|
|
24
|
-
field :subscribing_to_email, :boolean, default: ActivityNotification.config.
|
|
24
|
+
field :subscribing_to_email, :boolean, default: ActivityNotification.config.subscribe_to_email_as_default
|
|
25
25
|
field :subscribed_at, :datetime
|
|
26
26
|
field :unsubscribed_at, :datetime
|
|
27
27
|
field :subscribed_to_email_at, :datetime
|
|
28
28
|
field :unsubscribed_to_email_at, :datetime
|
|
29
29
|
field :optional_targets, :raw, default: {}
|
|
30
30
|
|
|
31
|
-
global_secondary_index hash_key: :target_key, range_key: :created_at, projected_attributes: :all
|
|
31
|
+
global_secondary_index name: :index_target_key_created_at, hash_key: :target_key, range_key: :created_at, projected_attributes: :all
|
|
32
32
|
|
|
33
33
|
validates :target, presence: true
|
|
34
34
|
validates :key, presence: true, uniqueness: { scope: :target_key }
|
|
@@ -24,8 +24,8 @@ module ActivityNotification
|
|
|
24
24
|
id_field, type_field = "#{association_name}_id", "#{association_name}_type"
|
|
25
25
|
field id_field, type: String
|
|
26
26
|
field type_field, type: String
|
|
27
|
-
associated_record_field = "#{association_name}
|
|
28
|
-
field associated_record_field, type:
|
|
27
|
+
associated_record_field = "stored_#{association_name}"
|
|
28
|
+
field associated_record_field, type: Hash if ActivityNotification.config.store_with_associated_records && _options[:store_with_associated_records]
|
|
29
29
|
|
|
30
30
|
self.instance_eval do
|
|
31
31
|
define_method(name) do |reload = false|
|
|
@@ -43,7 +43,14 @@ module ActivityNotification
|
|
|
43
43
|
if new_instance.nil? then instance_id, instance_type = nil, nil else instance_id, instance_type = new_instance.id, new_instance.class.name end
|
|
44
44
|
self.send("#{id_field}=", instance_id)
|
|
45
45
|
self.send("#{type_field}=", instance_type)
|
|
46
|
-
|
|
46
|
+
associated_record_json = new_instance.as_json(_options[:as_json_options] || {})
|
|
47
|
+
# Cast Hash $oid field to String id to handle BSON::String::IllegalKey
|
|
48
|
+
if associated_record_json.present?
|
|
49
|
+
associated_record_json.each do |k, v|
|
|
50
|
+
associated_record_json[k] = v['$oid'] if v.is_a?(Hash) && v.has_key?('$oid')
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
self.send("#{associated_record_field}=", associated_record_json) if ActivityNotification.config.store_with_associated_records && _options[:store_with_associated_records]
|
|
47
54
|
self.instance_variable_set("@#{name}", nil)
|
|
48
55
|
end
|
|
49
56
|
end
|
|
@@ -19,17 +19,17 @@ module ActivityNotification
|
|
|
19
19
|
# Belongs to target instance of this notification as polymorphic association.
|
|
20
20
|
# @scope instance
|
|
21
21
|
# @return [Object] Target instance of this notification
|
|
22
|
-
belongs_to_polymorphic_xdb_record :target, store_with_associated_records: true
|
|
22
|
+
belongs_to_polymorphic_xdb_record :target, store_with_associated_records: true, as_json_options: { methods: [:printable_type, :printable_target_name] }
|
|
23
23
|
|
|
24
24
|
# Belongs to notifiable instance of this notification as polymorphic association.
|
|
25
25
|
# @scope instance
|
|
26
26
|
# @return [Object] Notifiable instance of this notification
|
|
27
|
-
belongs_to_polymorphic_xdb_record :notifiable, store_with_associated_records: true
|
|
27
|
+
belongs_to_polymorphic_xdb_record :notifiable, store_with_associated_records: true, as_json_options: { methods: [:printable_type] }
|
|
28
28
|
|
|
29
29
|
# Belongs to group instance of this notification as polymorphic association.
|
|
30
30
|
# @scope instance
|
|
31
31
|
# @return [Object] Group instance of this notification
|
|
32
|
-
belongs_to_polymorphic_xdb_record :group
|
|
32
|
+
belongs_to_polymorphic_xdb_record :group, as_json_options: { methods: [:printable_type, :printable_group_name] }
|
|
33
33
|
|
|
34
34
|
field :key, type: String
|
|
35
35
|
field :parameters, type: Hash, default: {}
|
|
@@ -41,7 +41,7 @@ module ActivityNotification
|
|
|
41
41
|
# Group owner instance has nil as :group_owner association.
|
|
42
42
|
# @scope instance
|
|
43
43
|
# @return [Notification] Group owner notification instance of this notification
|
|
44
|
-
belongs_to :group_owner, { class_name: "ActivityNotification::Notification"
|
|
44
|
+
belongs_to :group_owner, { class_name: "ActivityNotification::Notification", optional: true }
|
|
45
45
|
|
|
46
46
|
# Has many group member notification instances of this notification.
|
|
47
47
|
# Only group owner instance has :group_members value.
|
|
@@ -53,7 +53,7 @@ module ActivityNotification
|
|
|
53
53
|
# Belongs to :otifier instance of this notification.
|
|
54
54
|
# @scope instance
|
|
55
55
|
# @return [Object] Notifier instance of this notification
|
|
56
|
-
belongs_to_polymorphic_xdb_record :notifier, store_with_associated_records: true
|
|
56
|
+
belongs_to_polymorphic_xdb_record :notifier, store_with_associated_records: true, as_json_options: { methods: [:printable_type, :printable_notifier_name] }
|
|
57
57
|
|
|
58
58
|
validates :target, presence: true
|
|
59
59
|
validates :notifiable, presence: true
|
|
@@ -140,7 +140,9 @@ module ActivityNotification
|
|
|
140
140
|
scope :filtered_by_group, ->(group) {
|
|
141
141
|
group.present? ?
|
|
142
142
|
where(group_id: group.id, group_type: group.class.name) :
|
|
143
|
-
|
|
143
|
+
Gem::Version.new(::Mongoid::VERSION) >= Gem::Version.new('7.1.0') ?
|
|
144
|
+
where(:group_id.exists => false, :group_type.exists => false).or(group_id: nil, group_type: nil) :
|
|
145
|
+
any_of({ :group_id.exists => false, :group_type.exists => false }, { group_id: nil, group_type: nil })
|
|
144
146
|
}
|
|
145
147
|
|
|
146
148
|
# Selects filtered notifications later than specified time.
|
|
@@ -20,7 +20,7 @@ module ActivityNotification
|
|
|
20
20
|
|
|
21
21
|
field :key, type: String
|
|
22
22
|
field :subscribing, type: Boolean, default: ActivityNotification.config.subscribe_as_default
|
|
23
|
-
field :subscribing_to_email, type: Boolean, default: ActivityNotification.config.
|
|
23
|
+
field :subscribing_to_email, type: Boolean, default: ActivityNotification.config.subscribe_to_email_as_default
|
|
24
24
|
field :subscribed_at, type: DateTime
|
|
25
25
|
field :unsubscribed_at, type: DateTime
|
|
26
26
|
field :subscribed_to_email_at, type: DateTime
|
|
@@ -29,8 +29,8 @@ module ActivityNotification
|
|
|
29
29
|
)
|
|
30
30
|
|
|
31
31
|
# Generate the :default fallback key without using pluralization key :count
|
|
32
|
-
default = I18n.t(k, attrs)
|
|
33
|
-
I18n.t(k, attrs.merge(count: group_notification_count, default: default))
|
|
32
|
+
default = I18n.t(k, **attrs)
|
|
33
|
+
I18n.t(k, **attrs.merge(count: group_notification_count, default: default))
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
# Renders notification from views.
|
|
@@ -239,25 +239,21 @@ module ActivityNotification
|
|
|
239
239
|
configured_params.update(add_destroy_dependency(target_type, options[:dependent_notifications]))
|
|
240
240
|
end
|
|
241
241
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
unless options[:optional_targets].has_key?(ActivityNotification::OptionalTarget::ActionCableChannel)
|
|
248
|
-
options[:optional_targets][ActivityNotification::OptionalTarget::ActionCableChannel] = {}
|
|
249
|
-
end
|
|
242
|
+
if options[:action_cable_allowed] || (ActivityNotification.config.action_cable_enabled && options[:action_cable_allowed] != false)
|
|
243
|
+
options[:optional_targets] ||= {}
|
|
244
|
+
require 'activity_notification/optional_targets/action_cable_channel'
|
|
245
|
+
unless options[:optional_targets].has_key?(ActivityNotification::OptionalTarget::ActionCableChannel)
|
|
246
|
+
options[:optional_targets][ActivityNotification::OptionalTarget::ActionCableChannel] = {}
|
|
250
247
|
end
|
|
248
|
+
end
|
|
251
249
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
end
|
|
250
|
+
if options[:action_cable_api_allowed] || (ActivityNotification.config.action_cable_api_enabled && options[:action_cable_api_allowed] != false)
|
|
251
|
+
options[:optional_targets] ||= {}
|
|
252
|
+
require 'activity_notification/optional_targets/action_cable_api_channel'
|
|
253
|
+
unless options[:optional_targets].has_key?(ActivityNotification::OptionalTarget::ActionCableApiChannel)
|
|
254
|
+
options[:optional_targets][ActivityNotification::OptionalTarget::ActionCableApiChannel] = {}
|
|
258
255
|
end
|
|
259
256
|
end
|
|
260
|
-
# :nocov:
|
|
261
257
|
|
|
262
258
|
if options[:optional_targets].is_a?(Hash)
|
|
263
259
|
options[:optional_targets] = arrange_optional_targets_option(options[:optional_targets])
|
|
@@ -265,7 +261,8 @@ module ActivityNotification
|
|
|
265
261
|
|
|
266
262
|
options[:printable_notifiable_name] ||= options.delete(:printable_name)
|
|
267
263
|
configured_params
|
|
268
|
-
.merge set_acts_as_parameters_for_target(target_type, [:targets, :group, :group_expiry_delay, :parameters, :email_allowed
|
|
264
|
+
.merge set_acts_as_parameters_for_target(target_type, [:targets, :group, :group_expiry_delay, :parameters, :email_allowed], options, "notification_")
|
|
265
|
+
.merge set_acts_as_parameters_for_target(target_type, [:action_cable_allowed, :action_cable_api_allowed], options, "notifiable_")
|
|
269
266
|
.merge set_acts_as_parameters_for_target(target_type, [:notifier, :notifiable_path, :printable_notifiable_name, :optional_targets], options)
|
|
270
267
|
end
|
|
271
268
|
|