OSDN Git Service

Notification refactoring
authorValery Sizov <vsv2711@gmail.com>
Sat, 17 Dec 2011 13:58:35 +0000 (15:58 +0200)
committerValery Sizov <vsv2711@gmail.com>
Sat, 17 Dec 2011 13:58:35 +0000 (15:58 +0200)
app/controllers/admin/users_controller.rb
app/controllers/application_controller.rb
app/controllers/issues_controller.rb
app/controllers/notes_controller.rb
app/models/mailer_observer.rb [new file with mode: 0644]
app/models/note.rb
config/application.rb

index 1c008d9..033332a 100644 (file)
@@ -27,7 +27,6 @@ class Admin::UsersController < ApplicationController
 
     respond_to do |format|
       if @admin_user.save
-        Notify.new_user_email(@admin_user, params[:user][:password]).deliver
         format.html { redirect_to [:admin, @admin_user], notice: 'User was successfully created.' }
         format.json { render json: @admin_user, status: :created, location: @admin_user }
       else
index 6f7ed9a..00ab93a 100644 (file)
@@ -1,5 +1,6 @@
 class ApplicationController < ActionController::Base
   before_filter :authenticate_user!
+  before_filter :set_current_user_for_mailer
   protect_from_forgery
   helper_method :abilities, :can?
 
@@ -19,6 +20,10 @@ class ApplicationController < ActionController::Base
     end
   end
 
+  def set_current_user_for_mailer
+    MailerObserver.current_user = current_user
+  end
+
   def abilities
     @abilities ||= Six.new
   end
index 9bf22d8..143bc19 100644 (file)
@@ -67,10 +67,7 @@ class IssuesController < ApplicationController
   def create
     @issue = @project.issues.new(params[:issue])
     @issue.author = current_user
-
-    if @issue.save && @issue.assignee != current_user
-      Notify.new_issue_email(@issue).deliver
-    end
+    @issue.save
 
     respond_with(@issue)
   end
index b8e04f1..5d99d1e 100644 (file)
@@ -12,10 +12,8 @@ class NotesController < ApplicationController
   def create
     @note = @project.notes.new(params[:note])
     @note.author = current_user
-
-    if @note.save
-      notify if params[:notify] == '1'
-    end
+    @note.notify = true if params[:notify] == '1'
+    @note.save
 
     respond_to do |format|
       format.html {redirect_to :back}
@@ -35,22 +33,4 @@ class NotesController < ApplicationController
     end
   end
 
-  protected
-
-  def notify
-    @project.users.reject { |u| u.id == current_user.id } .each do |u|
-      case @note.noteable_type
-      when "Commit" then
-        Notify.note_commit_email(u, @note).deliver
-      when "Issue" then
-        Notify.note_issue_email(u, @note).deliver
-      when "MergeRequest"
-        true # someone should write email notification
-      when "Snippet"
-        true
-      else
-        Notify.note_wall_email(u, @note).deliver
-      end
-    end
-  end
 end
diff --git a/app/models/mailer_observer.rb b/app/models/mailer_observer.rb
new file mode 100644 (file)
index 0000000..0f1e498
--- /dev/null
@@ -0,0 +1,41 @@
+class MailerObserver < ActiveRecord::Observer
+  observe :issue, :user, :note, :snippet
+  cattr_accessor :current_user
+
+  def after_create(model)
+    new_issue(model) if model.kind_of?(Issue)
+    new_user(model) if model.kind_of?(User)
+    new_note(model) if model.kind_of?(Note)
+  end
+
+  protected
+
+    def new_issue(issue)
+      if issue.assignee != current_user
+        Notify.new_issue_email(issue).deliver
+      end
+    end
+
+    def new_user(user)
+      Notify.new_user_email(user, user.password).deliver
+    end
+
+    def new_note(note)
+      return unless note.notify
+      note.project.users.reject { |u| u.id == current_user.id } .each do |u|
+        case note.noteable_type
+        when "Commit" then
+          Notify.note_commit_email(u, note).deliver
+        when "Issue" then
+          Notify.note_issue_email(u, note).deliver
+        when "MergeRequest"
+          true # someone should write email notification
+        when "Snippet"
+          true
+        else
+          Notify.note_wall_email(u, note).deliver
+        end
+      end
+    end
+
+end
index 946f506..9a38cd7 100644 (file)
@@ -13,6 +13,7 @@ class Note < ActiveRecord::Base
            :prefix => true
 
   attr_protected :author, :author_id
+  attr_accessor :notify
 
   validates_presence_of :project
 
@@ -35,6 +36,10 @@ class Note < ActiveRecord::Base
   scope :inc_author, includes(:author)
 
   mount_uploader :attachment, AttachmentUploader
+
+  def notify
+    @notify ||= false
+  end
 end
 # == Schema Information
 #
index 3481c6d..bdd5bbf 100644 (file)
@@ -23,7 +23,7 @@ module Gitlab
     # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
 
     # Activate observers that should always be running.
-    # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
+    config.active_record.observers = :mailer_observer
 
     # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
     # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.