summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Provaznik <jprovaznik@gitlab.com>2018-07-12 22:03:39 +0200
committerJan Provaznik <jprovaznik@gitlab.com>2018-07-16 09:29:35 +0200
commit7d35d81c393be0c854a8a42fab84fc2e00f16f41 (patch)
tree049b00747715199a0af8fa5ac1c7eee306d51d8a
parentfabf6a5634fa5d3c585d01a0d0dfac6c39dcbe8e (diff)
downloadgitlab-ce-jprovazn-resource-events.tar.gz
Resource event modelsjprovazn-resource-events
-rw-r--r--app/models/concerns/label_eventable.rb14
-rw-r--r--app/models/issue.rb1
-rw-r--r--app/models/merge_request.rb1
-rw-r--r--app/models/resource_label_event.rb11
-rw-r--r--app/services/issuable/common_system_notes_service.rb1
-rw-r--r--app/services/resource_label_event_service.rb32
-rw-r--r--db/migrate/20180712172057_create_resource_label_events.rb16
-rw-r--r--db/schema.rb16
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml2
-rw-r--r--spec/models/resource_label_event_spec.rb10
10 files changed, 103 insertions, 1 deletions
diff --git a/app/models/concerns/label_eventable.rb b/app/models/concerns/label_eventable.rb
new file mode 100644
index 00000000000..310850ce9b8
--- /dev/null
+++ b/app/models/concerns/label_eventable.rb
@@ -0,0 +1,14 @@
+# == LabelEventable concern
+#
+# Contains functionality related to objects that support adding/removing events.
+#
+# Used by Issue and MergeRequest.
+#
+
+module LabelEventable
+ extend ActiveSupport::Concern
+
+ included do
+ has_many :resource_label_events
+ end
+end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 4715d942c8d..e4ed06f9a69 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -12,6 +12,7 @@ class Issue < ActiveRecord::Base
include TimeTrackable
include ThrottledTouch
include IgnorableColumn
+ include LabelEventable
ignore_column :assignee_id, :branch_name, :deleted_at
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index b4090fd8baf..124ff6b3f91 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -10,6 +10,7 @@ class MergeRequest < ActiveRecord::Base
include EachBatch
include ThrottledTouch
include Gitlab::Utils::StrongMemoize
+ include LabelEventable
ignore_column :locked_at,
:ref_fetched,
diff --git a/app/models/resource_label_event.rb b/app/models/resource_label_event.rb
new file mode 100644
index 00000000000..d13895d2b05
--- /dev/null
+++ b/app/models/resource_label_event.rb
@@ -0,0 +1,11 @@
+class ResourceLabelEvent < ActiveRecord::Base
+ belongs_to :user
+ belongs_to :issue
+ belongs_to :merge_request
+ belongs_to :label
+
+ enum action: {
+ add: 1,
+ remove: 2
+ }
+end
diff --git a/app/services/issuable/common_system_notes_service.rb b/app/services/issuable/common_system_notes_service.rb
index 3da21bd8b8f..2ab2b4a9fb5 100644
--- a/app/services/issuable/common_system_notes_service.rb
+++ b/app/services/issuable/common_system_notes_service.rb
@@ -54,6 +54,7 @@ module Issuable
removed_labels = old_labels - issuable.labels
SystemNoteService.change_label(issuable, issuable.project, current_user, added_labels, removed_labels)
+ ResourceLabelEventService.change_labels(issuable, current_user, added_labels, removed_labels)
end
def create_title_change_note(old_title)
diff --git a/app/services/resource_label_event_service.rb b/app/services/resource_label_event_service.rb
new file mode 100644
index 00000000000..91fcba7fbbd
--- /dev/null
+++ b/app/services/resource_label_event_service.rb
@@ -0,0 +1,32 @@
+module ResourceLabelEventService
+ extend self
+
+ def change_labels(resource, user, added_labels, removed_labels)
+ label_hash = {
+ resource_column(resource) => resource.id,
+ user_id: user.id,
+ created_at: Time.now
+ }
+
+ labels = added_labels.map do |label|
+ label_hash.merge(label_id: label.id, action: ResourceLabelEvent.actions['add'])
+ end
+ labels += removed_labels.map do |label|
+ label_hash.merge(label_id: label.id, action: ResourceLabelEvent.actions['remove'])
+ end
+
+ Gitlab::Database.bulk_insert(ResourceLabelEvent.table_name, labels)
+ end
+
+ private
+
+ def resource_column(resource)
+ if resource.is_a?(Issue)
+ :issue_id
+ elsif resource.is_a?(MergeRequest)
+ :merge_request_id
+ else
+ raise ArgumentError, "Unknown resource type #{resource.class.name}"
+ end
+ end
+end
diff --git a/db/migrate/20180712172057_create_resource_label_events.rb b/db/migrate/20180712172057_create_resource_label_events.rb
new file mode 100644
index 00000000000..19909527d2d
--- /dev/null
+++ b/db/migrate/20180712172057_create_resource_label_events.rb
@@ -0,0 +1,16 @@
+class CreateResourceLabelEvents < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ create_table :resource_label_events, id: :bigserial do |t|
+ t.integer :action
+ t.references :issue, null: true, index: true, foreign_key: { on_delete: :cascade }
+ t.references :merge_request, null: true, index: true, foreign_key: { on_delete: :cascade }
+ t.references :label, index: true, foreign_key: { on_delete: :nullify }
+ t.references :user, index: true, foreign_key: { on_delete: :nullify }
+ t.datetime_with_timezone :created_at, null: false
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d2aa31fae30..1cbd3e99b97 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20180704204006) do
+ActiveRecord::Schema.define(version: 20180712172057) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -1785,6 +1785,20 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_index "remote_mirrors", ["last_successful_update_at"], name: "index_remote_mirrors_on_last_successful_update_at", using: :btree
add_index "remote_mirrors", ["project_id"], name: "index_remote_mirrors_on_project_id", using: :btree
+ create_table "resource_label_events", id: :bigserial, force: :cascade do |t|
+ t.integer "action"
+ t.integer "issue_id"
+ t.integer "merge_request_id"
+ t.integer "label_id"
+ t.integer "user_id"
+ t.datetime_with_timezone "created_at", null: false
+ end
+
+ add_index "resource_label_events", ["issue_id"], name: "index_resource_label_events_on_issue_id", using: :btree
+ add_index "resource_label_events", ["label_id"], name: "index_resource_label_events_on_label_id", using: :btree
+ add_index "resource_label_events", ["merge_request_id"], name: "index_resource_label_events_on_merge_request_id", using: :btree
+ add_index "resource_label_events", ["user_id"], name: "index_resource_label_events_on_user_id", using: :btree
+
create_table "routes", force: :cascade do |t|
t.integer "source_id", null: false
t.string "source_type", null: false
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 084ce3066d6..99255dbb911 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -7,6 +7,7 @@ issues:
- updated_by
- milestone
- notes
+- resource_label_events
- label_links
- labels
- last_edited_by
@@ -76,6 +77,7 @@ merge_requests:
- updated_by
- milestone
- notes
+- resource_label_events
- label_links
- labels
- last_edited_by
diff --git a/spec/models/resource_label_event_spec.rb b/spec/models/resource_label_event_spec.rb
new file mode 100644
index 00000000000..726c5bc2d9d
--- /dev/null
+++ b/spec/models/resource_label_event_spec.rb
@@ -0,0 +1,10 @@
+require 'rails_helper'
+
+RSpec.describe ResourceLabelEvent, type: :model do
+ describe 'associations' do
+ it { is_expected.to belong_to(:user) }
+ it { is_expected.to belong_to(:issue) }
+ it { is_expected.to belong_to(:merge_request) }
+ it { is_expected.to belong_to(:label) }
+ end
+end