summaryrefslogtreecommitdiff
path: root/app/services/notification_recipient_service.rb
diff options
context:
space:
mode:
authorhttp://jneen.net/ <jneen@jneen.net>2017-07-26 08:43:27 -0700
committerhttp://jneen.net/ <jneen@jneen.net>2017-08-03 09:07:18 -0700
commit618a3d125c0faf3b6e0484bc9955ffd0a597ad33 (patch)
tree96763beaf00a0998374a50478e48a95830948b78 /app/services/notification_recipient_service.rb
parent618b5d34463b1a54cca0d47d3d815b7e388a1db2 (diff)
downloadgitlab-ce-618a3d125c0faf3b6e0484bc9955ffd0a597ad33.tar.gz
move Recipient to its own NotificationRecipient file
Diffstat (limited to 'app/services/notification_recipient_service.rb')
-rw-r--r--app/services/notification_recipient_service.rb116
1 files changed, 7 insertions, 109 deletions
diff --git a/app/services/notification_recipient_service.rb b/app/services/notification_recipient_service.rb
index 788e06502ee..5d8c3a39af1 100644
--- a/app/services/notification_recipient_service.rb
+++ b/app/services/notification_recipient_service.rb
@@ -2,8 +2,12 @@
# Used by NotificationService to determine who should receive notification
#
module NotificationRecipientService
- def self.notifiable_users(*a)
- Recipient.notifiable_users(*a)
+ def self.notifiable_users(users, *args)
+ users.map { |u| NotificationRecipient.new(u, *args) }.select(&:notifiable?).map(&:user)
+ end
+
+ def self.notifiable?(user, *args)
+ NotificationRecipient.new(user, *args).notifiable?
end
def self.build_recipients(*a)
@@ -18,112 +22,6 @@ module NotificationRecipientService
Builder::NewNote.new(*a).recipient_users
end
- class Recipient
- def self.notifiable_users(users, *args)
- users.map { |u| new(u, *args) }.select(&:notifiable?).map(&:user)
- end
-
- attr_reader :user, :type
- def initialize(user, project, type,
- custom_action: nil, target: nil, acting_user: nil, read_ability: nil)
- @project = project
- @custom_action = custom_action
- @acting_user = acting_user
- @read_ability = read_ability
- @target = target
- @user = user
- @type = type
- end
-
- def notification_setting
- @notification_setting ||= find_notification_setting
- end
-
- def raw_notification_level
- notification_setting&.level&.to_sym
- end
-
- def notification_level
- # custom is treated the same as watch if it's enabled - otherwise it's
- # as :disabled.
- @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
-
- def notifiable?
- return false unless has_access?
- return false if own_activity?
-
- return true 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 NotificationSetting.levels[notification_level] <= NotificationSetting.levels[type]
-
- return false if unsubscribed?
-
- true
- end
-
- def unsubscribed?
- return false unless @target
- return false unless @target.respond_to?(:subscriptions)
-
- subscription = @target.subscriptions.find_by_user_id(@user.id)
- subscription && !subscription.subscribed
- end
-
- def own_activity?
- return false unless @acting_user
- return false if @acting_user.notified_of_own_activity?
-
- user == @acting_user
- end
-
- def has_access?
- return false unless user.can?(:receive_notifications)
- return true unless @read_ability
-
- DeclarativePolicy.subject_scope do
- user.can?(@read_ability, @target)
- end
- end
-
- def excluded_watcher_action?
- return false unless @custom_action
- return false if raw_notification_level == :custom
-
- NotificationSetting::EXCLUDED_WATCHER_EVENTS.include?(@custom_action)
- end
-
- private
-
- def find_notification_setting
- project_setting = project && user.notification_settings_for(project)
-
- return project_setting unless project_setting.nil? || project_setting.global?
-
- group_setting = project&.group && user.notification_settings_for(project.group)
-
- return group_setting unless group_setting.nil? || group_setting.global?
-
- user.global_notification_setting
- end
- end
-
module Builder
class Base
def initialize(*)
@@ -158,7 +56,7 @@ module NotificationRecipientService
end
def make_recipient(user, type)
- Recipient.new(user, project, type,
+ NotificationRecipient.new(user, project, type,
custom_action: custom_action,
target: target,
acting_user: acting_user,