From f29c30475e621dedae24791ae9b144b6bef2f80a Mon Sep 17 00:00:00 2001
From: James Lopez <james@jameslopez.es>
Date: Fri, 1 Jul 2016 15:34:10 +0200
Subject: [PATCH] use has_many relationship with events

---
 app/models/concerns/eventable.rb                  | 15 ---------------
 app/models/issue.rb                               |  3 ++-
 app/models/merge_request.rb                       |  3 ++-
 app/models/milestone.rb                           |  2 +-
 app/models/note.rb                                |  2 +-
 lib/gitlab/import_export/relation_factory.rb      |  1 +
 .../import_export/project_tree_restorer_spec.rb   |  6 ++++++
 7 files changed, 13 insertions(+), 19 deletions(-)
 delete mode 100644 app/models/concerns/eventable.rb

diff --git a/app/models/concerns/eventable.rb b/app/models/concerns/eventable.rb
deleted file mode 100644
index aa23b350a06..00000000000
--- a/app/models/concerns/eventable.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-module Eventable
-  extend ActiveSupport::Concern
-
-  def events
-    Event.where(target_id: id, target_type: self.class.to_s)
-  end
-
-  def events=(events)
-    events.each do |event|
-      event.target_id = id
-      event.data.deep_symbolize_keys! if event.data
-      event.save!
-    end
-  end
-end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index ae177c041e7..60abd47409e 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -6,7 +6,6 @@ class Issue < ActiveRecord::Base
   include Referable
   include Sortable
   include Taskable
-  include Eventable
 
   DueDateStruct = Struct.new(:title, :name).freeze
   NoDueDate     = DueDateStruct.new('No Due Date', '0').freeze
@@ -20,6 +19,8 @@ class Issue < ActiveRecord::Base
   belongs_to :project
   belongs_to :moved_to, class_name: 'Issue'
 
+  has_many :events, as: :target, dependent: :destroy
+
   validates :project, presence: true
 
   scope :cared, ->(user) { where(assignee_id: user) }
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 326a0430eb4..5ebc8f0c99f 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -5,7 +5,6 @@ class MergeRequest < ActiveRecord::Base
   include Sortable
   include Taskable
   include Importable
-  include Eventable
 
   belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project"
   belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project"
@@ -13,6 +12,8 @@ class MergeRequest < ActiveRecord::Base
 
   has_one :merge_request_diff, dependent: :destroy
 
+  has_many :events, as: :target, dependent: :destroy
+
   serialize :merge_params, Hash
 
   after_create :create_merge_request_diff, unless: :importing
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 2283376c8ac..2bd7f198030 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -11,13 +11,13 @@ class Milestone < ActiveRecord::Base
   include Referable
   include StripAttribute
   include Milestoneish
-  include Eventable
 
   belongs_to :project
   has_many :issues
   has_many :labels, -> { distinct.reorder('labels.title') },  through: :issues
   has_many :merge_requests
   has_many :participants, -> { distinct.reorder('users.name') }, through: :issues, source: :assignee
+  has_many :events, as: :target, dependent: :destroy
 
   scope :active, -> { with_state(:active) }
   scope :closed, -> { with_state(:closed) }
diff --git a/app/models/note.rb b/app/models/note.rb
index ed26fb2d88a..c2bb117eb03 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -5,7 +5,6 @@ class Note < ActiveRecord::Base
   include Mentionable
   include Awardable
   include Importable
-  include Eventable
 
   # Attribute containing rendered and redacted Markdown as generated by
   # Banzai::ObjectRenderer.
@@ -22,6 +21,7 @@ class Note < ActiveRecord::Base
   belongs_to :updated_by, class_name: "User"
 
   has_many :todos, dependent: :destroy
+  has_many :events, as: :target, dependent: :destroy
 
   delegate :gfm_reference, :local_reference, to: :noteable
   delegate :name, to: :project, prefix: true
diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb
index 92bf7e0a2fc..3fd89e08f09 100644
--- a/lib/gitlab/import_export/relation_factory.rb
+++ b/lib/gitlab/import_export/relation_factory.rb
@@ -33,6 +33,7 @@ module Gitlab
         update_user_references
         update_project_references
         reset_ci_tokens if @relation_name == 'Ci::Trigger'
+        @relation_hash['data'].deep_symbolize_keys! if @relation_name == :events && @relation_hash['data']
 
         generate_imported_object
       end
diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
index 23036ab8108..e401ca99077 100644
--- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
@@ -24,6 +24,12 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do
 
         expect(Ci::Pipeline.first.notes).not_to be_empty
       end
+
+      it 'restores the correct event' do
+        restored_project_json
+
+        expect(Event.where.not(data: nil).first.data[:ref]).not_to be_empty
+      end
     end
   end
 end
-- 
GitLab