Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarin Jankovski <marin@gitlab.com>2014-03-29 13:56:13 +0400
committerMarin Jankovski <marin@gitlab.com>2014-04-01 19:18:52 +0400
commitce30a56f333f61c01314cf32e15381080a9b14d3 (patch)
tree7b8e9b9a56ba67f4cec8223fde5898b2d3cf4f79 /app/services
parentf4f0a7e03e64e3fffb9b14ba5583e2c6b7c6441b (diff)
Add or remove watchers from list based on their notification settings.
Diffstat (limited to 'app/services')
-rw-r--r--app/services/notification_service.rb46
1 files changed, 31 insertions, 15 deletions
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index d85398809c2..4d6616b969d 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -178,22 +178,24 @@ class NotificationService
# Get project users with WATCH notification level
def project_watchers(project)
- # Gather all user ids that have WATCH notification setting for project
- project_notification_uids = project_notification_list(project, Notification::N_WATCH)
+ # Gather all user that have WATCH notification setting for project and group
+ project_uids, group_uids = project_and_group_watchers(project, Notification::N_WATCH)
- # Gather all user ids that have WATCH notification setting for group
- group_notification_uids = group_notification_list(project, Notification::N_WATCH)
+ # Gather all user that have WATCH as their GLOBAL setting
+ global_setting_project, global_setting_group = project_and_group_watchers(project, Notification::N_GLOBAL)
+ global_uids = [global_setting_project, global_setting_group].flatten.uniq
+ global_watchers_ids = User.where(id: global_uids, notification_level: Notification::N_WATCH).pluck(:id)
- # Gather all user ids that have GLOBAL setting
- global_notification_uids = global_notification_list(project)
+ # Select watchers based on what the project setting is
+ project_watchers, user_ids = select_watchers(global_watchers_ids, global_setting_project, project_uids)
- project_and_group_uids = [project_notification_uids, group_notification_uids].flatten.uniq
- group_and_project_watchers = User.where(id: project_and_group_uids)
+ # Select watchers based on what the group setting is
+ group_watchers, ids = select_watchers(user_ids, global_setting_group, group_uids)
- # Find all users that have WATCH as their GLOBAL setting
- global_watchers = User.where(id: global_notification_uids, notification_level: Notification::N_WATCH)
+ project_watchers.concat(group_watchers.concat(ids)).uniq
+ watchers = User.where(id: project_watchers)
- [group_and_project_watchers, global_watchers].flatten.uniq
+ watchers.to_a
end
def project_notification_list(project, notification_level)
@@ -208,11 +210,25 @@ class NotificationService
end
end
- def global_notification_list(project)
+ def select_watchers(user_ids, global_setting, setting)
+ watchers = []
+ user_ids.each do |i|
+ if setting.include?(i)
+ watchers << i
+ elsif global_setting.include?(i)
+ watchers << i
+ else
+ user_ids.delete(i)
+ end
+ end
+ [watchers, user_ids]
+ end
+
+ def project_and_group_watchers(project, notification_level)
[
- project_notification_list(project, Notification::N_GLOBAL),
- group_notification_list(project, Notification::N_GLOBAL)
- ].flatten
+ project_notification_list(project, notification_level),
+ group_notification_list(project, notification_level)
+ ]
end
# Remove users with disabled notifications from array