summaryrefslogtreecommitdiff
path: root/app/models/notification_recipient.rb
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2018-06-07 20:10:45 +0000
committerSean McGivern <sean@mcgivern.me.uk>2018-06-07 20:10:45 +0000
commit6e614bd5e03e55a6b64a89b1cdbf2973bdd6ca84 (patch)
treed5b71bf7d2f32e5f4fc8fdb658762e343433a869 /app/models/notification_recipient.rb
parent27aa2e544b9f97b701888bd17d517c5f2b697f91 (diff)
parentafe5d7d56ee771dac6e4a97d23e69d678c03da2d (diff)
downloadgitlab-ce-6e614bd5e03e55a6b64a89b1cdbf2973bdd6ca84.tar.gz
Merge branch 'issue_44230' into 'master'
Apply notification settings level of groups to all child objects Closes #44230 See merge request gitlab-org/gitlab-ce!19191
Diffstat (limited to 'app/models/notification_recipient.rb')
-rw-r--r--app/models/notification_recipient.rb29
1 files changed, 27 insertions, 2 deletions
diff --git a/app/models/notification_recipient.rb b/app/models/notification_recipient.rb
index 79458bd048a..1a03dd9df56 100644
--- a/app/models/notification_recipient.rb
+++ b/app/models/notification_recipient.rb
@@ -1,4 +1,6 @@
class NotificationRecipient
+ include Gitlab::Utils::StrongMemoize
+
attr_reader :user, :type, :reason
def initialize(user, type, **opts)
unless NotificationSetting.levels.key?(type) || type == :subscription
@@ -142,10 +144,33 @@ class NotificationRecipient
return project_setting unless project_setting.nil? || project_setting.global?
- group_setting = @group && user.notification_settings_for(@group)
+ group_setting = closest_non_global_group_notification_settting
- return group_setting unless group_setting.nil? || group_setting.global?
+ return group_setting unless group_setting.nil?
user.global_notification_setting
end
+
+ # Returns the notificaton_setting of the lowest group in hierarchy with non global level
+ def closest_non_global_group_notification_settting
+ return unless @group
+ return if indexed_group_notification_settings.empty?
+
+ notification_setting = nil
+
+ @group.self_and_ancestors_ids.each do |id|
+ notification_setting = indexed_group_notification_settings[id]
+ break if notification_setting
+ end
+
+ notification_setting
+ end
+
+ def indexed_group_notification_settings
+ strong_memoize(:indexed_group_notification_settings) do
+ @group.notification_settings.where(user_id: user.id)
+ .where.not(level: NotificationSetting.levels[:global])
+ .index_by(&:source_id)
+ end
+ end
end