diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-03-29 12:10:53 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-03-29 12:10:53 +0000 |
commit | 0488e34ba723b9a55bd6e35aafc0cf089b0b49fd (patch) | |
tree | ed803bb841727b835e66b9cc1417e1c0da4f7dc9 | |
parent | fdeacf0ad19424850105fbe38d7bf5901d2d3c39 (diff) | |
parent | c34186f88258aadd03c7e692606ff2499d221d2b (diff) | |
download | gitlab-ce-0488e34ba723b9a55bd6e35aafc0cf089b0b49fd.tar.gz |
Merge branch 'refactor_project_watchers_notifications' into 'master'
Refactor project watchers notifications
-rw-r--r-- | app/services/notification_service.rb | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 6fda9868aa5..d85398809c2 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -178,21 +178,41 @@ class NotificationService # Get project users with WATCH notification level def project_watchers(project) - project_watchers = [] - member_methods = { project => :users_projects } - member_methods.merge!(project.group => :users_groups) if project.group - - member_methods.each do |object, member_method| - # Get project notification settings since it has higher priority - user_ids = object.send(member_method).where(notification_level: Notification::N_WATCH).pluck(:user_id) - project_watchers += User.where(id: user_ids) - - # next collect users who use global settings with watch state - user_ids = object.send(member_method).where(notification_level: Notification::N_GLOBAL).pluck(:user_id) - project_watchers += User.where(id: user_ids, notification_level: Notification::N_WATCH) + # Gather all user ids that have WATCH notification setting for project + project_notification_uids = project_notification_list(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 ids that have GLOBAL setting + global_notification_uids = global_notification_list(project) + + project_and_group_uids = [project_notification_uids, group_notification_uids].flatten.uniq + group_and_project_watchers = User.where(id: project_and_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) + + [group_and_project_watchers, global_watchers].flatten.uniq + end + + def project_notification_list(project, notification_level) + project.users_projects.where(notification_level: notification_level).pluck(:user_id) + end + + def group_notification_list(project, notification_level) + if project.group + project.group.users_groups.where(notification_level: notification_level).pluck(:user_id) + else + [] end + end - project_watchers.uniq + def global_notification_list(project) + [ + project_notification_list(project, Notification::N_GLOBAL), + group_notification_list(project, Notification::N_GLOBAL) + ].flatten end # Remove users with disabled notifications from array |