diff options
author | Marin Jankovski <marin@gitlab.com> | 2014-04-01 15:07:23 +0400 |
---|---|---|
committer | Marin Jankovski <marin@gitlab.com> | 2014-04-01 19:18:52 +0400 |
commit | 528a641e9ee5f72f3f5a1da1e1a31b9b61262efd (patch) | |
tree | bed18bc9bb273bd7f5d53a8e7e14ce293619c3ca /app/services | |
parent | ce30a56f333f61c01314cf32e15381080a9b14d3 (diff) |
Use group notification settings while honoring project settings.
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/notification_service.rb | 73 |
1 files changed, 41 insertions, 32 deletions
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 4d6616b969d..dc5f4aa8822 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -178,28 +178,28 @@ class NotificationService # Get project users with WATCH notification level def project_watchers(project) - # Gather all user that have WATCH notification setting for project and group - project_uids, group_uids = project_and_group_watchers(project, Notification::N_WATCH) + project_members = project_notification_list(project) - # 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) + project_global= project_notification_list(project, Notification::N_GLOBAL) + group_global = group_notification_list(project, Notification::N_GLOBAL) + global_watch = User.where( + id: [project_global, group_global].flatten.uniq, + notification_level: Notification::N_WATCH + ).pluck(:id) - # Select watchers based on what the project setting is - project_watchers, user_ids = select_watchers(global_watchers_ids, global_setting_project, project_uids) + project_watch = watch_project(project, project_global, global_watch) + group_watch = watch_group(project, project_members, group_global, global_watch) - # Select watchers based on what the group setting is - group_watchers, ids = select_watchers(user_ids, global_setting_group, group_uids) - - project_watchers.concat(group_watchers.concat(ids)).uniq - watchers = User.where(id: project_watchers) - - watchers.to_a + User.where(id: project_watch.concat(group_watch).uniq).to_a end - def project_notification_list(project, notification_level) - project.users_projects.where(notification_level: notification_level).pluck(:user_id) + def project_notification_list(project, notification_level=nil) + project_members = project.users_projects + if notification_level + project_members.where(notification_level: notification_level).pluck(:user_id) + else + project_members.pluck(:user_id) + end end def group_notification_list(project, notification_level) @@ -210,25 +210,34 @@ class NotificationService end end - 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) + def watch_project(project, global_setting, watch_global) + uids = project_notification_list(project, Notification::N_WATCH) + + global_setting.each do |i| + if watch_global.include?(i) + uids << i end end - [watchers, user_ids] + uids.uniq end - def project_and_group_watchers(project, notification_level) - [ - project_notification_list(project, notification_level), - group_notification_list(project, notification_level) - ] + def watch_group(project, project_members, global_setting, watch_global) + uids = group_notification_list(project, Notification::N_WATCH) + # Group setting is watch, add to watchers list user is not project member + watch = [] + uids.each do |i| + if project_members.exclude?(i) + watch << i + end + end + + global_setting.each do |i| + if project_members.exclude?(i) && watch_global.include?(i) + watch << i + end + end + + watch.uniq end # Remove users with disabled notifications from array |