BigW Consortium Gitlab

Commit 61e5fb6f by Dmitriy Zaporozhets

Merge pull request #1695 from riyad/cleanup-note-observer-and-notifications

Code cleanup on NoteObserver and Notify
parents ca42e91e 413778b6
...@@ -9,11 +9,11 @@ class Notify < ActionMailer::Base ...@@ -9,11 +9,11 @@ class Notify < ActionMailer::Base
default from: Gitlab.config.email_from default from: Gitlab.config.email_from
def new_user_email(user_id, password)
@user = User.find(user_id)
@password = password #
mail(to: @user.email, subject: subject("Account was created for you")) # Issue
end #
def new_issue_email(issue_id) def new_issue_email(issue_id)
@issue = Issue.find(issue_id) @issue = Issue.find(issue_id)
...@@ -21,12 +21,46 @@ class Notify < ActionMailer::Base ...@@ -21,12 +21,46 @@ class Notify < ActionMailer::Base
mail(to: @issue.assignee_email, subject: subject("new issue ##{@issue.id}", @issue.title)) mail(to: @issue.assignee_email, subject: subject("new issue ##{@issue.id}", @issue.title))
end end
def note_wall_email(recipient_id, note_id) def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id)
@note = Note.find(note_id) @issue = Issue.find(issue_id)
@project = @note.project @previous_assignee ||= User.find(previous_assignee_id)
mail(to: recipient(recipient_id), subject: subject) @project = @issue.project
mail(to: recipient(recipient_id), subject: subject("changed issue ##{@issue.id}", @issue.title))
end
def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id)
@issue = Issue.find issue_id
@issue_status = status
@updated_by = User.find updated_by_user_id
mail(to: recipient(recipient_id),
subject: subject("changed issue ##{@issue.id}", @issue.title))
end
#
# Merge Request
#
def new_merge_request_email(merge_request_id)
@merge_request = MergeRequest.find(merge_request_id)
@project = @merge_request.project
mail(to: @merge_request.assignee_email, subject: subject("new merge request !#{@merge_request.id}", @merge_request.title))
end
def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id)
@merge_request = MergeRequest.find(merge_request_id)
@previous_assignee ||= User.find(previous_assignee_id)
@project = @merge_request.project
mail(to: recipient(recipient_id), subject: subject("changed merge request !#{@merge_request.id}", @merge_request.title))
end end
#
# Note
#
def note_commit_email(recipient_id, note_id) def note_commit_email(recipient_id, note_id)
@note = Note.find(note_id) @note = Note.find(note_id)
@commit = @note.noteable @commit = @note.noteable
...@@ -35,6 +69,13 @@ class Notify < ActionMailer::Base ...@@ -35,6 +69,13 @@ class Notify < ActionMailer::Base
mail(to: recipient(recipient_id), subject: subject("note for commit #{@commit.short_id}", @commit.title)) mail(to: recipient(recipient_id), subject: subject("note for commit #{@commit.short_id}", @commit.title))
end end
def note_issue_email(recipient_id, note_id)
@note = Note.find(note_id)
@issue = @note.noteable
@project = @note.project
mail(to: recipient(recipient_id), subject: subject("note for issue ##{@issue.id}"))
end
def note_merge_request_email(recipient_id, note_id) def note_merge_request_email(recipient_id, note_id)
@note = Note.find(note_id) @note = Note.find(note_id)
@merge_request = @note.noteable @merge_request = @note.noteable
...@@ -42,11 +83,10 @@ class Notify < ActionMailer::Base ...@@ -42,11 +83,10 @@ class Notify < ActionMailer::Base
mail(to: recipient(recipient_id), subject: subject("note for merge request !#{@merge_request.id}")) mail(to: recipient(recipient_id), subject: subject("note for merge request !#{@merge_request.id}"))
end end
def note_issue_email(recipient_id, note_id) def note_wall_email(recipient_id, note_id)
@note = Note.find(note_id) @note = Note.find(note_id)
@issue = @note.noteable
@project = @note.project @project = @note.project
mail(to: recipient(recipient_id), subject: subject("note for issue ##{@issue.id}")) mail(to: recipient(recipient_id), subject: subject)
end end
def note_wiki_email(recipient_id, note_id) def note_wiki_email(recipient_id, note_id)
...@@ -56,25 +96,11 @@ class Notify < ActionMailer::Base ...@@ -56,25 +96,11 @@ class Notify < ActionMailer::Base
mail(to: recipient(recipient_id), subject: subject("note for wiki")) mail(to: recipient(recipient_id), subject: subject("note for wiki"))
end end
def new_merge_request_email(merge_request_id)
@merge_request = MergeRequest.find(merge_request_id)
@project = @merge_request.project
mail(to: @merge_request.assignee_email, subject: subject("new merge request !#{@merge_request.id}", @merge_request.title))
end
def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id)
@merge_request = MergeRequest.find(merge_request_id)
@previous_assignee ||= User.find(previous_assignee_id)
@project = @merge_request.project
mail(to: recipient(recipient_id), subject: subject("changed merge request !#{@merge_request.id}", @merge_request.title))
end
def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id) #
@issue = Issue.find(issue_id) # Project
@previous_assignee ||= User.find(previous_assignee_id) #
@project = @issue.project
mail(to: recipient(recipient_id), subject: subject("changed issue ##{@issue.id}", @issue.title))
end
def project_access_granted_email(user_project_id) def project_access_granted_email(user_project_id)
@users_project = UsersProject.find user_project_id @users_project = UsersProject.find user_project_id
...@@ -83,14 +109,19 @@ class Notify < ActionMailer::Base ...@@ -83,14 +109,19 @@ class Notify < ActionMailer::Base
subject: subject("access to project was granted")) subject: subject("access to project was granted"))
end end
def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id)
@issue = Issue.find issue_id
@issue_status = status #
@updated_by = User.find updated_by_user_id # User
mail(to: recipient(recipient_id), #
subject: subject("changed issue ##{@issue.id}", @issue.title))
def new_user_email(user_id, password)
@user = User.find(user_id)
@password = password
mail(to: @user.email, subject: subject("Account was created for you"))
end end
private private
# Look up a User by their ID and return their email address # Look up a User by their ID and return their email address
......
class NoteObserver < ActiveRecord::Observer class NoteObserver < ActiveRecord::Observer
def after_create(note) def after_create(note)
send_notify_mails(note)
end
protected
def send_notify_mails(note)
if note.notify if note.notify
# Notify whole team except author of note notify_team(note)
notify_team_of_new_note(note)
elsif note.notify_author elsif note.notify_author
# Notify only author of resource # Notify only author of resource
Notify.note_commit_email(note.commit_author.id, note.id).deliver Notify.note_commit_email(note.commit_author.id, note.id).deliver
...@@ -13,15 +18,15 @@ class NoteObserver < ActiveRecord::Observer ...@@ -13,15 +18,15 @@ class NoteObserver < ActiveRecord::Observer
end end
end end
protected # Notifies the whole team except the author of note
def notify_team(note)
def notify_team_of_new_note(note) # Note: wall posts are not "attached" to anything, so fall back to "Wall"
note_is_on = note.noteable_type || 'Wall' noteable_type = note.noteable_type || "Wall"
notify_method = 'note_' + note_is_on.underscore + '_email' notify_method = "note_#{noteable_type.underscore}_email".to_sym
if Notify.respond_to? notify_method if Notify.respond_to? notify_method
team_without_note_author(note).map do |u| team_without_note_author(note).map do |u|
Notify.send(notify_method.to_sym, u.id, note.id).deliver Notify.send(notify_method, u.id, note.id).deliver
end end
end end
end end
......
...@@ -3,8 +3,11 @@ require 'spec_helper' ...@@ -3,8 +3,11 @@ require 'spec_helper'
describe NoteObserver do describe NoteObserver do
subject { NoteObserver.instance } subject { NoteObserver.instance }
let(:team_without_author) { (1..2).map { |n| double :user, id: n } }
let(:delivery_success) { double deliver: true }
describe '#after_create' do describe '#after_create' do
let(:note) { double :note, notify: false, notify_author: false } let(:note) { double :note }
it 'is called after a note is created' do it 'is called after a note is created' do
subject.should_receive :after_create subject.should_receive :after_create
...@@ -14,40 +17,51 @@ describe NoteObserver do ...@@ -14,40 +17,51 @@ describe NoteObserver do
end end
end end
it 'sends out notifications' do
subject.should_receive(:send_notify_mails).with(note)
subject.after_create(note)
end
end
describe "#send_notify_mails" do
let(:note) { double :note, notify: false, notify_author: false }
it 'notifies team of new note when flagged to notify' do it 'notifies team of new note when flagged to notify' do
note.stub(:notify).and_return(true) note.stub(:notify).and_return(true)
subject.should_receive(:notify_team_of_new_note).with(note) subject.should_receive(:notify_team).with(note)
subject.after_create(note) subject.after_create(note)
end end
it 'does not notify team of new note when not flagged to notify' do it 'does not notify team of new note when not flagged to notify' do
subject.should_not_receive(:notify_team_of_new_note).with(note) subject.should_not_receive(:notify_team).with(note)
subject.after_create(note) subject.after_create(note)
end end
it 'notifies the author of a commit when flagged to notify the author' do it 'notifies the author of a commit when flagged to notify the author' do
note.stub(:notify_author).and_return(true) note.stub(:notify_author).and_return(true)
note.stub(:id).and_return(42) note.stub(:id).and_return(42)
author = double :user, id: 1 author = double :user, id: 1
note.stub(:commit_author).and_return(author) note.stub(:commit_author).and_return(author)
Notify.should_receive(:note_commit_email).and_return(double(deliver: true)) Notify.should_receive(:note_commit_email).and_return(delivery_success)
subject.after_create(note) subject.after_create(note)
end end
it 'does not notify the author of a commit when not flagged to notify the author' do it 'does not notify the author of a commit when not flagged to notify the author' do
Notify.should_not_receive(:note_commit_email) Notify.should_not_receive(:note_commit_email)
subject.after_create(note) subject.after_create(note)
end end
it 'does nothing if no notify flags are set' do it 'does nothing if no notify flags are set' do
subject.after_create(note).should be_nil subject.after_create(note).should be_nil
end end
end end
describe '#notify_team' do
let(:team_without_author) { (1..2).map { |n| double :user, id: n } }
describe '#notify_team_of_new_note' do
let(:note) { double :note, id: 1 } let(:note) { double :note, id: 1 }
before :each do before :each do
...@@ -57,40 +71,45 @@ describe NoteObserver do ...@@ -57,40 +71,45 @@ describe NoteObserver do
context 'notifies team of a new note on' do context 'notifies team of a new note on' do
it 'a commit' do it 'a commit' do
note.stub(:noteable_type).and_return('Commit') note.stub(:noteable_type).and_return('Commit')
Notify.should_receive(:note_commit_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_commit_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'an issue' do it 'an issue' do
note.stub(:noteable_type).and_return('Issue') note.stub(:noteable_type).and_return('Issue')
Notify.should_receive(:note_issue_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_issue_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'a wiki page' do it 'a wiki page' do
note.stub(:noteable_type).and_return('Wiki') note.stub(:noteable_type).and_return('Wiki')
Notify.should_receive(:note_wiki_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_wiki_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'a merge request' do it 'a merge request' do
note.stub(:noteable_type).and_return('MergeRequest') note.stub(:noteable_type).and_return('MergeRequest')
Notify.should_receive(:note_merge_request_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_merge_request_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'a wall' do it 'a wall' do
# Note: wall posts have #noteable_type of nil
note.stub(:noteable_type).and_return(nil) note.stub(:noteable_type).and_return(nil)
Notify.should_receive(:note_wall_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_wall_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
end end
it 'does nothing for a new note on a snippet' do it 'does nothing for a new note on a snippet' do
note.stub(:noteable_type).and_return('Snippet') note.stub(:noteable_type).and_return('Snippet')
subject.send(:notify_team_of_new_note, note).should be_nil subject.send(:notify_team, note).should be_nil
end end
end end
......
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