Commit 72b9c14ebca18b065085f18590e09ccb6137dc6f

Authored by Dmitriy Zaporozhets
1 parent f5ee330a

refactored mail observer

Showing 1 changed file with 40 additions and 37 deletions   Show diff stats
app/models/mailer_observer.rb
@@ -27,25 +27,31 @@ class MailerObserver < ActiveRecord::Observer @@ -27,25 +27,31 @@ class MailerObserver < ActiveRecord::Observer
27 end 27 end
28 28
29 def new_note(note) 29 def new_note(note)
30 - # Notify whole team except author of note  
31 if note.notify 30 if note.notify
32 - note.project.users.reject { |u| u.id == current_user.id } .each do |u|  
33 - case note.noteable_type  
34 - when "Commit" then  
35 - Notify.note_commit_email(u.id, note.id).deliver  
36 - when "Issue" then  
37 - Notify.note_issue_email(u.id, note.id).deliver  
38 - when "MergeRequest" then  
39 - Notify.note_merge_request_email(u.id, note.id).deliver  
40 - when "Snippet"  
41 - true  
42 - else  
43 - Notify.note_wall_email(u.id, note.id).deliver  
44 - end  
45 - end  
46 - # Notify only author of resource 31 + # Notify whole team except author of note
  32 + notify_note(note)
47 elsif note.notify_author 33 elsif note.notify_author
  34 + # Notify only author of resource
48 Notify.note_commit_email(note.commit_author.id, note.id).deliver 35 Notify.note_commit_email(note.commit_author.id, note.id).deliver
  36 + else
  37 + # Otherwise ignore it
  38 + nil
  39 + end
  40 + end
  41 +
  42 + def notify_note note
  43 + # reject author of note from mail list
  44 + users = note.project.users.reject { |u| u.id == current_user.id }
  45 +
  46 + users.each do |u|
  47 + case note.noteable_type
  48 + when "Commit"; Notify.note_commit_email(u.id, note.id).deliver
  49 + when "Issue"; Notify.note_issue_email(u.id, note.id).deliver
  50 + when "MergeRequest"; Notify.note_merge_request_email(u.id, note.id).deliver
  51 + when "Snippet"; true
  52 + else
  53 + Notify.note_wall_email(u.id, note.id).deliver
  54 + end
49 end 55 end
50 end 56 end
51 57
@@ -56,37 +62,34 @@ class MailerObserver < ActiveRecord::Observer @@ -56,37 +62,34 @@ class MailerObserver < ActiveRecord::Observer
56 end 62 end
57 63
58 def changed_merge_request(merge_request) 64 def changed_merge_request(merge_request)
59 - if merge_request.assignee_id_changed?  
60 - recipients_ids = merge_request.assignee_id_was, merge_request.assignee_id  
61 - recipients_ids.delete current_user.id  
62 -  
63 - User.find(recipients_ids).each do |user|  
64 - Notify.reassigned_merge_request_email(user.id, merge_request.id, merge_request.assignee_id_was).deliver  
65 - end  
66 - end  
67 -  
68 - if merge_request.closed_changed?  
69 - note = Note.new(:noteable => merge_request, :project => merge_request.project)  
70 - note.author = current_user  
71 - note.note = "_Status changed to #{merge_request.closed ? 'closed' : 'reopened'}_"  
72 - note.save()  
73 - end 65 + status_notify_and_comment issue, :reassigned_merge_request_email
74 end 66 end
75 67
76 def changed_issue(issue) 68 def changed_issue(issue)
77 - if issue.assignee_id_changed?  
78 - recipients_ids = issue.assignee_id_was, issue.assignee_id 69 + status_notify_and_comment issue, :reassigned_issue_email
  70 + end
  71 +
  72 + # This method used for Issues & Merge Requests
  73 + #
  74 + # It create a comment for Issue or MR if someone close/reopen.
  75 + # It also notify via email if assignee was changed
  76 + #
  77 + def status_notify_and_comment target, mail_method
  78 + # If assigne changed - notify to recipients
  79 + if target.assignee_id_changed?
  80 + recipients_ids = target.assignee_id_was, target.assignee_id
79 recipients_ids.delete current_user.id 81 recipients_ids.delete current_user.id
80 82
81 recipients_ids.each do |recipient_id| 83 recipients_ids.each do |recipient_id|
82 - Notify.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was).deliver 84 + Notify.send(mail_method, recipient_id, target.id, target.assignee_id_was).deliver
83 end 85 end
84 end 86 end
85 87
86 - if issue.closed_changed?  
87 - note = Note.new(:noteable => issue, :project => issue.project) 88 + # Create comment about status changed
  89 + if target.closed_changed?
  90 + note = Note.new(:noteable => target, :project => target.project)
88 note.author = current_user 91 note.author = current_user
89 - note.note = "_Status changed to #{issue.closed ? 'closed' : 'reopened'}_" 92 + note.note = "_Status changed to #{target.closed ? 'closed' : 'reopened'}_"
90 note.save() 93 note.save()
91 end 94 end
92 end 95 end