summaryrefslogtreecommitdiff
path: root/app
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
parent618b5d34463b1a54cca0d47d3d815b7e388a1db2 (diff)
downloadgitlab-ce-618a3d125c0faf3b6e0484bc9955ffd0a597ad33.tar.gz
move Recipient to its own NotificationRecipient file
Diffstat (limited to 'app')
-rw-r--r--app/models/notification_recipient.rb102
-rw-r--r--app/services/notification_recipient_service.rb116
2 files changed, 109 insertions, 109 deletions
diff --git a/app/models/notification_recipient.rb b/app/models/notification_recipient.rb
new file mode 100644
index 00000000000..0b2eee56ff8
--- /dev/null
+++ b/app/models/notification_recipient.rb
@@ -0,0 +1,102 @@
+class NotificationRecipient
+ attr_reader :user, :project, :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
+
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,