Separate observing of Note and MergeRequests
* Move is_assigned? and is_being_xx? methods to IssueCommonality This is behavior merge requests have in common with issues. Moved methods to IssueCommonality role. Put specs directly into merge_request_spec because setup differs for issues and MRs specifically in the "closed" factory to use. * Add MergeRequestObserver. Parallels IssueObserver in almost every way. Ripe for refactoring. * Rename MailerObserver to NoteObserver With merge request observing moved out of MailerObserver, all that was left was Note logic. Renamed to NoteObserver, added tests and updated application config for new observer names. Refactored NoteObserver to use the note's author and not rely on current_user. * Set current_user for MergeRequestObserver IssueObserver and MergeRequestObserver are the only observers that need a reference to the current_user that they cannot look up on the objects they are observing.
This commit is contained in:
parent
2b7fd29b1a
commit
16ceae895e
11 changed files with 445 additions and 102 deletions
|
@ -1,80 +0,0 @@
|
|||
class MailerObserver < ActiveRecord::Observer
|
||||
observe :note, :merge_request
|
||||
cattr_accessor :current_user
|
||||
|
||||
def after_create(model)
|
||||
new_note(model) if model.kind_of?(Note)
|
||||
new_merge_request(model) if model.kind_of?(MergeRequest)
|
||||
end
|
||||
|
||||
def after_update(model)
|
||||
changed_merge_request(model) if model.kind_of?(MergeRequest)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def new_note(note)
|
||||
if note.notify
|
||||
# Notify whole team except author of note
|
||||
notify_note(note)
|
||||
elsif note.notify_author
|
||||
# Notify only author of resource
|
||||
Notify.note_commit_email(note.commit_author.id, note.id).deliver
|
||||
else
|
||||
# Otherwise ignore it
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def notify_note note
|
||||
# reject author of note from mail list
|
||||
users = note.project.users.reject { |u| u.id == current_user.id }
|
||||
|
||||
users.each do |u|
|
||||
case note.noteable_type
|
||||
when "Commit"; Notify.note_commit_email(u.id, note.id).deliver
|
||||
when "Issue"; Notify.note_issue_email(u.id, note.id).deliver
|
||||
when "Wiki"; Notify.note_wiki_email(u.id, note.id).deliver
|
||||
when "MergeRequest"; Notify.note_merge_request_email(u.id, note.id).deliver
|
||||
when "Snippet"; true
|
||||
else
|
||||
Notify.note_wall_email(u.id, note.id).deliver
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def new_merge_request(merge_request)
|
||||
if merge_request.assignee && merge_request.assignee != current_user
|
||||
Notify.new_merge_request_email(merge_request.id).deliver
|
||||
end
|
||||
end
|
||||
|
||||
def changed_merge_request(merge_request)
|
||||
status_notify_and_comment merge_request, :reassigned_merge_request_email
|
||||
end
|
||||
|
||||
# This method used for Issues & Merge Requests
|
||||
#
|
||||
# It create a comment for Issue or MR if someone close/reopen.
|
||||
# It also notify via email if assignee was changed
|
||||
#
|
||||
def status_notify_and_comment target, mail_method
|
||||
# If assigne changed - notify to recipients
|
||||
if target.assignee_id_changed?
|
||||
recipients_ids = target.assignee_id_was, target.assignee_id
|
||||
recipients_ids.delete current_user.id
|
||||
|
||||
recipients_ids.each do |recipient_id|
|
||||
Notify.send(mail_method, recipient_id, target.id, target.assignee_id_was).deliver
|
||||
end
|
||||
end
|
||||
|
||||
# Create comment about status changed
|
||||
if target.closed_changed?
|
||||
note = Note.new(noteable: target, project: target.project)
|
||||
note.author = current_user
|
||||
note.note = "_Status changed to #{target.closed ? 'closed' : 'reopened'}_"
|
||||
note.save()
|
||||
end
|
||||
end
|
||||
end
|
31
app/observers/merge_request_observer.rb
Normal file
31
app/observers/merge_request_observer.rb
Normal file
|
@ -0,0 +1,31 @@
|
|||
class MergeRequestObserver < ActiveRecord::Observer
|
||||
cattr_accessor :current_user
|
||||
|
||||
def after_create(merge_request)
|
||||
if merge_request.assignee && merge_request.assignee != current_user
|
||||
Notify.new_merge_request_email(merge_request.id).deliver
|
||||
end
|
||||
end
|
||||
|
||||
def after_update(merge_request)
|
||||
send_reassigned_email(merge_request) if merge_request.is_being_reassigned?
|
||||
|
||||
status = nil
|
||||
status = 'closed' if merge_request.is_being_closed?
|
||||
status = 'reopened' if merge_request.is_being_reopened?
|
||||
if status
|
||||
Note.create_status_change_note(merge_request, current_user, status)
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def send_reassigned_email(merge_request)
|
||||
recipients_ids = merge_request.assignee_id_was, merge_request.assignee_id
|
||||
recipients_ids.delete current_user.id
|
||||
|
||||
recipients_ids.each do |recipient_id|
|
||||
Notify.reassigned_merge_request_email(recipient_id, merge_request.id, merge_request.assignee_id_was).deliver
|
||||
end
|
||||
end
|
||||
end
|
36
app/observers/note_observer.rb
Normal file
36
app/observers/note_observer.rb
Normal file
|
@ -0,0 +1,36 @@
|
|||
class NoteObserver < ActiveRecord::Observer
|
||||
|
||||
def after_create(note)
|
||||
if note.notify
|
||||
# Notify whole team except author of note
|
||||
notify_team_of_new_note(note)
|
||||
elsif note.notify_author
|
||||
# Notify only author of resource
|
||||
Notify.note_commit_email(note.commit_author.id, note.id).deliver
|
||||
else
|
||||
# Otherwise ignore it
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def notify_team_of_new_note(note)
|
||||
team_without_note_author(note).map do |u|
|
||||
case note.noteable_type
|
||||
when "Commit"; Notify.note_commit_email(u.id, note.id).deliver
|
||||
when "Issue"; Notify.note_issue_email(u.id, note.id).deliver
|
||||
when "Wiki"; Notify.note_wiki_email(u.id, note.id).deliver
|
||||
when "MergeRequest"; Notify.note_merge_request_email(u.id, note.id).deliver
|
||||
when "Wall"; Notify.note_wall_email(u.id, note.id).deliver
|
||||
when "Snippet"; true # no notifications for snippets?
|
||||
else
|
||||
true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def team_without_note_author(note)
|
||||
note.project.users.reject { |u| u.id == note.author.id }
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue