Commit 3676275a authored by http://jneen.net/'s avatar http://jneen.net/

don't rely on order of notification levels

factor out #suitable_notification_level? and check manually by
notification level. this makes the notification logic clear and actually
reflect what is in the documentation as to what should happen with each
setting.
parent 7059af29
...@@ -27,46 +27,45 @@ class NotificationRecipient ...@@ -27,46 +27,45 @@ class NotificationRecipient
@notification_setting ||= find_notification_setting @notification_setting ||= find_notification_setting
end end
def raw_notification_level
notification_setting&.level&.to_sym
end
def notification_level def notification_level
# custom is treated the same as watch if it's enabled - otherwise it's @notification_level ||= notification_setting&.level&.to_sym
# set to :custom, meaning to send exactly when our type is :participating
# or :mention.
@notification_level ||=
case raw_notification_level
when :custom
if @custom_action && notification_setting&.event_enabled?(@custom_action)
:watch
else
:custom
end
else
raw_notification_level
end
end end
def notifiable? def notifiable?
return false unless has_access? return false unless has_access?
return false if own_activity? return false if own_activity?
return true if @type == :subscription # even users with :disabled notifications receive manual subscriptions
return !unsubscribed? if @type == :subscription
return false if notification_level.nil? || notification_level == :disabled
return %i[participating mention].include?(@type) if notification_level == :custom
return false if %i[watch participating].include?(notification_level) && excluded_watcher_action? return false unless suitable_notification_level?
return false unless NotificationSetting.levels[notification_level] <= NotificationSetting.levels[@type]
# check this last because it's expensive
# nobody should receive notifications if they've specifically unsubscribed
return false if unsubscribed? return false if unsubscribed?
true true
end end
def suitable_notification_level?
case notification_level
when :disabled, nil
false
when :custom
custom_enabled? || %i[participating mention].include?(@type)
when :watch, :participating
!excluded_watcher_action?
when :mention
@type == :mention
else
false
end
end
def custom_enabled?
@custom_action && notification_setting&.event_enabled?(@custom_action)
end
def unsubscribed? def unsubscribed?
return false unless @target return false unless @target
return false unless @target.respond_to?(:subscriptions) return false unless @target.respond_to?(:subscriptions)
...@@ -98,7 +97,7 @@ class NotificationRecipient ...@@ -98,7 +97,7 @@ class NotificationRecipient
def excluded_watcher_action? def excluded_watcher_action?
return false unless @custom_action return false unless @custom_action
return false if raw_notification_level == :custom return false if notification_level == :custom
NotificationSetting::EXCLUDED_WATCHER_EVENTS.include?(@custom_action) NotificationSetting::EXCLUDED_WATCHER_EVENTS.include?(@custom_action)
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment