diff --git a/app/observers/note_observer.rb b/app/observers/note_observer.rb index 1c3c1ad3..944c6839 100644 --- a/app/observers/note_observer.rb +++ b/app/observers/note_observer.rb @@ -1,41 +1,10 @@ class NoteObserver < ActiveRecord::Observer def after_create(note) - send_notify_mails(note) + notification.new_note(note) end protected - def send_notify_mails(note) - if note.notify - notify_team(note) - elsif note.notify_author - # Notify only author of resource - if note.commit_author - Notify.delay.note_commit_email(note.commit_author.id, note.id) - end - else - # Otherwise ignore it - nil - end - end - - # Notifies the whole team except the author of note - def notify_team(note) - # Note: wall posts are not "attached" to anything, so fall back to "Wall" - noteable_type = note.noteable_type.presence || "Wall" - notify_method = "note_#{noteable_type.underscore}_email".to_sym - - if Notify.respond_to? notify_method - team_without_note_author(note).map do |u| - Notify.delay.send(notify_method, u.id, note.id) - end - end - end - - def team_without_note_author(note) - note.project.users.reject { |u| u.id == note.author.id } - end - def notification NotificationService.new end diff --git a/app/observers/user_observer.rb b/app/observers/user_observer.rb index 6c461e07..7ce3be0c 100644 --- a/app/observers/user_observer.rb +++ b/app/observers/user_observer.rb @@ -2,8 +2,7 @@ class UserObserver < ActiveRecord::Observer def after_create(user) log_info("User \"#{user.name}\" (#{user.email}) was created") - # Dont email omniauth created users - Notify.delay.new_user_email(user.id, user.password) unless user.extern_uid? + notification.new_user(user) end def after_destroy user @@ -25,4 +24,8 @@ class UserObserver < ActiveRecord::Observer def log_info message Gitlab::AppLogger.info message end + + def notification + NotificationService.new + end end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 873fc297..05a6730f 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -80,4 +80,32 @@ class NotificationService Notify.delay.reassigned_merge_request_email(recipient_id, merge_request.id, merge_request.assignee_id_was) end end + + # Notify new user with email after creation + def new_user(user) + # Dont email omniauth created users + Notify.delay.new_user_email(user.id, user.password) unless user.extern_uid? + end + + # Notify users on new note in system + # + # TODO: split on methods and refactor + # + def new_note(note) + if note.notify + users = note.project.users.reject { |u| u.id == note.author.id } + + # Note: wall posts are not "attached" to anything, so fall back to "Wall" + noteable_type = note.noteable_type.presence || "Wall" + notify_method = "note_#{noteable_type.underscore}_email".to_sym + + if Notify.respond_to? notify_method + team_without_note_author(note).map do |u| + Notify.delay.send(notify_method, u.id, note.id) + end + end + elsif note.notify_author && note.commit_author + Notify.delay.note_commit_email(note.commit_author.id, note.id) + end + end end