From f9218898ece79275c585da3aeb932b7ede409776 Mon Sep 17 00:00:00 2001
From: Josh Frye <joshfng@gmail.com>
Date: Wed, 27 Jan 2016 10:59:16 -0500
Subject: [PATCH] [WIP] Background process note logic for #3948

---
 app/controllers/projects/notes_controller.rb |  2 +-
 app/services/notes/create_service.rb         | 19 ++-----------
 app/services/notes/post_process_service.rb   | 30 ++++++++++++++++++++
 app/workers/new_note_worker.rb               | 12 ++++++++
 4 files changed, 45 insertions(+), 18 deletions(-)
 create mode 100644 app/services/notes/post_process_service.rb
 create mode 100644 app/workers/new_note_worker.rb

diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb
index 4a2599dda37..1b9dd568043 100644
--- a/app/controllers/projects/notes_controller.rb
+++ b/app/controllers/projects/notes_controller.rb
@@ -106,7 +106,7 @@ class Projects::NotesController < Projects::ApplicationController
           { notes_left: [note], notes_right: [] }
         else
           { notes_left: [], notes_right: [note] }
-       end
+        end
     else
       template = "projects/notes/_diff_notes_with_reply"
       locals = { notes: [note] }
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index a8486e6a5a1..8d9661167b5 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -6,27 +6,12 @@ module Notes
       note.system = false
 
       if note.save
-        notification_service.new_note(note)
-
-        # Skip system notes, like status changes and cross-references and awards
-        unless note.system || note.is_award
-          event_service.leave_note(note, note.author)
-          note.create_cross_references!
-          execute_hooks(note)
-        end
+        # Finish the harder work in the background
+        NewNoteWorker.perform_in(2.seconds, note.id, params)
       end
 
       note
     end
 
-    def hook_data(note)
-      Gitlab::NoteDataBuilder.build(note, current_user)
-    end
-
-    def execute_hooks(note)
-      note_data = hook_data(note)
-      note.project.execute_hooks(note_data, :note_hooks)
-      note.project.execute_services(note_data, :note_hooks)
-    end
   end
 end
diff --git a/app/services/notes/post_process_service.rb b/app/services/notes/post_process_service.rb
new file mode 100644
index 00000000000..f37d3c50cdd
--- /dev/null
+++ b/app/services/notes/post_process_service.rb
@@ -0,0 +1,30 @@
+module Notes
+  class PostProcessService
+
+    attr_accessor :note
+
+    def initialize(note)
+      @note = note
+    end
+
+    def execute
+      # Skip system notes, like status changes and cross-references and awards
+      unless @note.system || @note.is_award
+        EventCreateService.new.leave_note(@note, @note.author)
+        @note.create_cross_references!
+        execute_note_hooks
+      end
+    end
+
+    def hook_data
+      Gitlab::NoteDataBuilder.build(@note, @note.author)
+    end
+
+    def execute_note_hooks
+      note_data = hook_data
+      @note.project.execute_hooks(note_data, :note_hooks)
+      @note.project.execute_services(note_data, :note_hooks)
+    end
+
+  end
+end
diff --git a/app/workers/new_note_worker.rb b/app/workers/new_note_worker.rb
new file mode 100644
index 00000000000..1b3232cd365
--- /dev/null
+++ b/app/workers/new_note_worker.rb
@@ -0,0 +1,12 @@
+class NewNoteWorker
+  include Sidekiq::Worker
+
+  sidekiq_options queue: :default
+
+  def perform(note_id, note_params)
+    note = Note.find(note_id)
+
+    NotificationService.new.new_note(note)
+    Notes::PostProcessService.new(note).execute
+  end
+end
-- 
GitLab