Commit 528a641e authored by Marin Jankovski's avatar Marin Jankovski

Use group notification settings while honoring project settings.

parent ce30a56f
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment