Commit c34186f88258aadd03c7e692606ff2499d221d2b
1 parent
e6fbf79b
Exists in
spb-stable
and in
3 other branches
Refactor project watchers collecting.
Showing
1 changed file
with
33 additions
and
13 deletions
Show diff stats
app/services/notification_service.rb
| @@ -178,21 +178,41 @@ class NotificationService | @@ -178,21 +178,41 @@ class NotificationService | ||
| 178 | 178 | ||
| 179 | # Get project users with WATCH notification level | 179 | # Get project users with WATCH notification level |
| 180 | def project_watchers(project) | 180 | def project_watchers(project) |
| 181 | - project_watchers = [] | ||
| 182 | - member_methods = { project => :users_projects } | ||
| 183 | - member_methods.merge!(project.group => :users_groups) if project.group | ||
| 184 | - | ||
| 185 | - member_methods.each do |object, member_method| | ||
| 186 | - # Get project notification settings since it has higher priority | ||
| 187 | - user_ids = object.send(member_method).where(notification_level: Notification::N_WATCH).pluck(:user_id) | ||
| 188 | - project_watchers += User.where(id: user_ids) | ||
| 189 | - | ||
| 190 | - # next collect users who use global settings with watch state | ||
| 191 | - user_ids = object.send(member_method).where(notification_level: Notification::N_GLOBAL).pluck(:user_id) | ||
| 192 | - project_watchers += User.where(id: user_ids, notification_level: Notification::N_WATCH) | 181 | + # Gather all user ids that have WATCH notification setting for project |
| 182 | + project_notification_uids = project_notification_list(project, Notification::N_WATCH) | ||
| 183 | + | ||
| 184 | + # Gather all user ids that have WATCH notification setting for group | ||
| 185 | + group_notification_uids = group_notification_list(project, Notification::N_WATCH) | ||
| 186 | + | ||
| 187 | + # Gather all user ids that have GLOBAL setting | ||
| 188 | + global_notification_uids = global_notification_list(project) | ||
| 189 | + | ||
| 190 | + project_and_group_uids = [project_notification_uids, group_notification_uids].flatten.uniq | ||
| 191 | + group_and_project_watchers = User.where(id: project_and_group_uids) | ||
| 192 | + | ||
| 193 | + # Find all users that have WATCH as their GLOBAL setting | ||
| 194 | + global_watchers = User.where(id: global_notification_uids, notification_level: Notification::N_WATCH) | ||
| 195 | + | ||
| 196 | + [group_and_project_watchers, global_watchers].flatten.uniq | ||
| 197 | + end | ||
| 198 | + | ||
| 199 | + def project_notification_list(project, notification_level) | ||
| 200 | + project.users_projects.where(notification_level: notification_level).pluck(:user_id) | ||
| 201 | + end | ||
| 202 | + | ||
| 203 | + def group_notification_list(project, notification_level) | ||
| 204 | + if project.group | ||
| 205 | + project.group.users_groups.where(notification_level: notification_level).pluck(:user_id) | ||
| 206 | + else | ||
| 207 | + [] | ||
| 193 | end | 208 | end |
| 209 | + end | ||
| 194 | 210 | ||
| 195 | - project_watchers.uniq | 211 | + def global_notification_list(project) |
| 212 | + [ | ||
| 213 | + project_notification_list(project, Notification::N_GLOBAL), | ||
| 214 | + group_notification_list(project, Notification::N_GLOBAL) | ||
| 215 | + ].flatten | ||
| 196 | end | 216 | end |
| 197 | 217 | ||
| 198 | # Remove users with disabled notifications from array | 218 | # Remove users with disabled notifications from array |