From 07d05d2df7d1b79406232e91a7354e0c7fd1877a Mon Sep 17 00:00:00 2001
From: Douwe Maan <douwe@gitlab.com>
Date: Fri, 13 Feb 2015 11:57:56 +0100
Subject: [PATCH] Move all event creation to EventCreateService.

---
 app/controllers/projects/tags_controller.rb |  2 +-
 app/models/event.rb                         | 23 -------
 app/models/members/project_member.rb        | 17 ++----
 app/services/create_branch_service.rb       |  2 +-
 app/services/create_tag_service.rb          |  2 +-
 app/services/delete_branch_service.rb       |  2 +-
 app/services/event_create_service.rb        | 68 ++++++++++++++++-----
 app/services/git_push_service.rb            | 11 +---
 app/services/git_tag_push_service.rb        | 11 +---
 9 files changed, 64 insertions(+), 74 deletions(-)

diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb
index 64b820160d3..22eb8f67f9a 100644
--- a/app/controllers/projects/tags_controller.rb
+++ b/app/controllers/projects/tags_controller.rb
@@ -27,7 +27,7 @@ class Projects::TagsController < Projects::ApplicationController
     tag = @repository.find_tag(params[:id])
 
     if tag && @repository.rm_tag(tag.name)
-      Event.create_ref_event(@project, current_user, tag, 'rm', 'refs/tags')
+      EventCreateService.new.push_ref(@project, current_user, tag, 'rm', 'refs/tags')
     end
 
     respond_to do |format|
diff --git a/app/models/event.rb b/app/models/event.rb
index 9a42d380f87..3ead45a4bb4 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -49,29 +49,6 @@ class Event < ActiveRecord::Base
   scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
 
   class << self
-    def create_ref_event(project, user, ref, action = 'add', prefix = 'refs/heads')
-      commit = project.repository.commit(ref.target)
-
-      if action.to_s == 'add'
-        before = '00000000'
-        after = commit.id
-      else
-        before = commit.id
-        after = '00000000'
-      end
-
-      Event.create(
-        project: project,
-        action: Event::PUSHED,
-        data: {
-          ref: "#{prefix}/#{ref.name}",
-          before: before,
-          after: after
-        },
-        author_id: user.id
-      )
-    end
-
     def reset_event_cache_for(target)
       Event.where(target_id: target.id, target_type: target.class.to_s).
         order('id DESC').limit(100).
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 30c09f768d7..ff05ab1590f 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -114,12 +114,8 @@ class ProjectMember < Member
   end
 
   def post_create_hook
-    Event.create(
-      project_id: self.project.id,
-      action: Event::JOINED,
-      author_id: self.user.id
-    )
 
+    event_service.join_project(self.project, self.user)
     notification_service.new_team_member(self) unless owner?
     system_hook_service.execute_hooks_for(self, :create)
   end
@@ -129,15 +125,14 @@ class ProjectMember < Member
   end
 
   def post_destroy_hook
-    Event.create(
-      project_id: self.project.id,
-      action: Event::LEFT,
-      author_id: self.user.id
-    )
-
+    event_service.leave_project(self.project, self.user)
     system_hook_service.execute_hooks_for(self, :destroy)
   end
 
+  def event_service
+    EventCreateService.new
+  end
+
   def notification_service
     NotificationService.new
   end
diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb
index 901f67bafb3..5e971c7891c 100644
--- a/app/services/create_branch_service.rb
+++ b/app/services/create_branch_service.rb
@@ -17,7 +17,7 @@ class CreateBranchService < BaseService
     new_branch = repository.find_branch(branch_name)
 
     if new_branch
-      Event.create_ref_event(project, current_user, new_branch, 'add')
+      EventCreateService.new.push_ref(project, current_user, new_branch, 'add')
       return success(new_branch)
     else
       return error('Invalid reference name')
diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb
index 041c2287c36..a735d3f7f20 100644
--- a/app/services/create_tag_service.rb
+++ b/app/services/create_tag_service.rb
@@ -26,7 +26,7 @@ class CreateTagService < BaseService
         project.gitlab_ci_service.async_execute(push_data)
       end
 
-      Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags')
+      EventCreateService.new.push_ref(project, current_user, new_tag, 'add', 'refs/tags')
       success(new_tag)
     else
       error('Invalid reference name')
diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb
index cae6327fe72..c26aee2b0aa 100644
--- a/app/services/delete_branch_service.rb
+++ b/app/services/delete_branch_service.rb
@@ -25,7 +25,7 @@ class DeleteBranchService < BaseService
     end
 
     if repository.rm_branch(branch_name)
-      Event.create_ref_event(project, current_user, branch, 'rm')
+      EventCreateService.new.push_ref(project, current_user, branch, 'rm')
       success('Branch was removed')
     else
       return error('Failed to remove branch')
diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb
index 8d8a5873e62..bb3c37023a0 100644
--- a/app/services/event_create_service.rb
+++ b/app/services/event_create_service.rb
@@ -7,58 +7,94 @@
 #
 class EventCreateService
   def open_issue(issue, current_user)
-    create_event(issue, current_user, Event::CREATED)
+    create_record_event(issue, current_user, Event::CREATED)
   end
 
   def close_issue(issue, current_user)
-    create_event(issue, current_user, Event::CLOSED)
+    create_record_event(issue, current_user, Event::CLOSED)
   end
 
   def reopen_issue(issue, current_user)
-    create_event(issue, current_user, Event::REOPENED)
+    create_record_event(issue, current_user, Event::REOPENED)
   end
 
   def open_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::CREATED)
+    create_record_event(merge_request, current_user, Event::CREATED)
   end
 
   def close_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::CLOSED)
+    create_record_event(merge_request, current_user, Event::CLOSED)
   end
 
   def reopen_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::REOPENED)
+    create_record_event(merge_request, current_user, Event::REOPENED)
   end
 
   def merge_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::MERGED)
+    create_record_event(merge_request, current_user, Event::MERGED)
   end
 
   def open_milestone(milestone, current_user)
-    create_event(milestone, current_user, Event::CREATED)
+    create_record_event(milestone, current_user, Event::CREATED)
   end
 
   def close_milestone(milestone, current_user)
-    create_event(milestone, current_user, Event::CLOSED)
+    create_record_event(milestone, current_user, Event::CLOSED)
   end
 
   def reopen_milestone(milestone, current_user)
-    create_event(milestone, current_user, Event::REOPENED)
+    create_record_event(milestone, current_user, Event::REOPENED)
   end
 
   def leave_note(note, current_user)
-    create_event(note, current_user, Event::COMMENTED)
+    create_record_event(note, current_user, Event::COMMENTED)
+  end
+
+  def join_project(project, current_user)
+    create_event(project, current_user, Event::JOINED)
+  end
+
+  def leave_project(project, current_user)
+    create_event(project, current_user, Event::LEFT)
+  end
+
+  def push_ref(project, current_user, ref, action = 'add', prefix = 'refs/heads')
+    commit = project.repository.commit(ref.target)
+
+    if action.to_s == 'add'
+      before = '00000000'
+      after = commit.id
+    else
+      before = commit.id
+      after = '00000000'
+    end
+
+    data = {
+      ref: "#{prefix}/#{ref.name}",
+      before: before,
+      after: after
+    }
+
+    push(project, current_user, data)
+  end
+
+  def push(project, current_user, push_data)
+    create_event(project, current_user, Event::PUSHED, data: push_data)
   end
 
   private
 
-  def create_event(record, current_user, status)
-    Event.create(
-      project: record.project,
-      target_id: record.id,
-      target_type: record.class.name,
+  def create_record_event(record, current_user, status)
+    create_event(record.project, current_user, status, target_id: record.id, target_type: record.class.name)
+  end
+
+  def create_event(project, current_user, status, attributes = {})
+    attributes.reverse_merge!(
+      project: project,
       action: status,
       author_id: current_user.id
     )
+
+    Event.create(attributes)
   end
 end
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index c775f79ec29..f21e6ac207d 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -52,7 +52,7 @@ class GitPushService
       end
 
       @push_data = post_receive_data(oldrev, newrev, ref)
-      create_push_event(@push_data)
+      EventCreateService.new.push(project, user, @push_data)
       project.execute_hooks(@push_data.dup, :push_hooks)
       project.execute_services(@push_data.dup)
     end
@@ -60,15 +60,6 @@ class GitPushService
 
   protected
 
-  def create_push_event(push_data)
-    Event.create!(
-      project: project,
-      action: Event::PUSHED,
-      data: push_data,
-      author_id: push_data[:user_id]
-    )
-  end
-
   # Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched,
   # close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables.
   def process_commit_messages(ref)
diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb
index c24809ad607..46d8987f12d 100644
--- a/app/services/git_tag_push_service.rb
+++ b/app/services/git_tag_push_service.rb
@@ -5,7 +5,7 @@ class GitTagPushService
     @project, @user = project, user
     @push_data = create_push_data(oldrev, newrev, ref)
 
-    create_push_event
+    EventCreateService.new.push(project, user, @push_data)
     project.repository.expire_cache
     project.execute_hooks(@push_data.dup, :tag_push_hooks)
 
@@ -22,13 +22,4 @@ class GitTagPushService
     Gitlab::PushDataBuilder.
       build(project, user, oldrev, newrev, ref, [])
   end
-
-  def create_push_event
-    Event.create!(
-      project: project,
-      action: Event::PUSHED,
-      data: push_data,
-      author_id: push_data[:user_id]
-    )
-  end
 end
-- 
GitLab