diff options
author | Jan Provaznik <jprovaznik@gitlab.com> | 2018-07-12 22:03:39 +0200 |
---|---|---|
committer | Jan Provaznik <jprovaznik@gitlab.com> | 2018-07-16 09:29:35 +0200 |
commit | 7d35d81c393be0c854a8a42fab84fc2e00f16f41 (patch) | |
tree | 049b00747715199a0af8fa5ac1c7eee306d51d8a | |
parent | fabf6a5634fa5d3c585d01a0d0dfac6c39dcbe8e (diff) | |
download | gitlab-ce-jprovazn-resource-events.tar.gz |
Resource event modelsjprovazn-resource-events
-rw-r--r-- | app/models/concerns/label_eventable.rb | 14 | ||||
-rw-r--r-- | app/models/issue.rb | 1 | ||||
-rw-r--r-- | app/models/merge_request.rb | 1 | ||||
-rw-r--r-- | app/models/resource_label_event.rb | 11 | ||||
-rw-r--r-- | app/services/issuable/common_system_notes_service.rb | 1 | ||||
-rw-r--r-- | app/services/resource_label_event_service.rb | 32 | ||||
-rw-r--r-- | db/migrate/20180712172057_create_resource_label_events.rb | 16 | ||||
-rw-r--r-- | db/schema.rb | 16 | ||||
-rw-r--r-- | spec/lib/gitlab/import_export/all_models.yml | 2 | ||||
-rw-r--r-- | spec/models/resource_label_event_spec.rb | 10 |
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 |