summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Lee Yu <heinrich@gitlab.com>2019-09-06 11:18:51 +0800
committerHeinrich Lee Yu <heinrich@gitlab.com>2019-09-06 12:06:48 +0800
commitc833a8e1a529b1fae082a2ad641fe9efe643df45 (patch)
tree85696d0ec8450e8e02e4496762387dc64c2feed1
parent34822489d3633746592615cbd3e4bcc5b70a5d13 (diff)
downloadgitlab-ce-65776-store-issue-mr-description-changes.tar.gz
Saves old and new description and associates with the system note
-rw-r--r--app/models/description_change.rb7
-rw-r--r--app/services/system_note_service.rb10
-rw-r--r--db/migrate/20190905233225_create_description_changes.rb15
-rw-r--r--db/schema.rb10
-rw-r--r--spec/models/description_change_spec.rb13
-rw-r--r--spec/services/system_note_service_spec.rb31
6 files changed, 84 insertions, 2 deletions
diff --git a/app/models/description_change.rb b/app/models/description_change.rb
new file mode 100644
index 00000000000..f860f80f884
--- /dev/null
+++ b/app/models/description_change.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class DescriptionChange < ApplicationRecord
+ belongs_to :system_note, class_name: 'Note'
+
+ validates :system_note, presence: true
+end
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index 1b48b20e28b..b7af1ae20a9 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -341,7 +341,15 @@ module SystemNoteService
def change_description(noteable, project, author)
body = 'changed the description'
- create_note(NoteSummary.new(noteable, project, author, body, action: 'description'))
+ create_note(NoteSummary.new(noteable, project, author, body, action: 'description')).tap do |note|
+ next unless Feature.enabled?(:description_diffs)
+
+ DescriptionChange.create(
+ system_note_id: note.id,
+ old_description: noteable.description_before_last_save,
+ new_description: noteable.description
+ )
+ end
end
# Called when the confidentiality changes
diff --git a/db/migrate/20190905233225_create_description_changes.rb b/db/migrate/20190905233225_create_description_changes.rb
new file mode 100644
index 00000000000..dc30f64156a
--- /dev/null
+++ b/db/migrate/20190905233225_create_description_changes.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateDescriptionChanges < ActiveRecord::Migration[5.2]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ create_table :description_changes do |t|
+ t.references :system_note, index: true, foreign_key: { to_table: :notes }, null: false
+ t.text :old_description
+ t.text :new_description
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 61f7787f192..34ee90a925d 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2019_09_05_223900) do
+ActiveRecord::Schema.define(version: 2019_09_05_233225) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_trgm"
@@ -1167,6 +1167,13 @@ ActiveRecord::Schema.define(version: 2019_09_05_223900) do
t.index ["project_id", "status"], name: "index_deployments_on_project_id_and_status"
end
+ create_table "description_changes", force: :cascade do |t|
+ t.bigint "system_note_id", null: false
+ t.text "old_description"
+ t.text "new_description"
+ t.index ["system_note_id"], name: "index_description_changes_on_system_note_id"
+ end
+
create_table "design_management_designs", force: :cascade do |t|
t.integer "project_id", null: false
t.integer "issue_id", null: false
@@ -3827,6 +3834,7 @@ ActiveRecord::Schema.define(version: 2019_09_05_223900) do
add_foreign_key "deploy_keys_projects", "projects", name: "fk_58a901ca7e", on_delete: :cascade
add_foreign_key "deployments", "clusters", name: "fk_289bba3222", on_delete: :nullify
add_foreign_key "deployments", "projects", name: "fk_b9a3851b82", on_delete: :cascade
+ add_foreign_key "description_changes", "notes", column: "system_note_id"
add_foreign_key "design_management_designs", "issues", on_delete: :cascade
add_foreign_key "design_management_designs", "projects", on_delete: :cascade
add_foreign_key "design_management_designs_versions", "design_management_designs", column: "design_id", name: "fk_03c671965c", on_delete: :cascade
diff --git a/spec/models/description_change_spec.rb b/spec/models/description_change_spec.rb
new file mode 100644
index 00000000000..cde328d2956
--- /dev/null
+++ b/spec/models/description_change_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe DescriptionChange do
+ describe 'associations' do
+ it { is_expected.to belong_to(:system_note) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:system_note) }
+ end
+end
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index 910fe3b50b7..c428db105c1 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -414,6 +414,37 @@ describe SystemNoteService do
it 'sets the note text' do
expect(subject.note).to eq('changed the description')
end
+
+ context 'description diffs' do
+ before do
+ noteable.update(description: "New description")
+ end
+
+ context 'when feature is enabled' do
+ before do
+ stub_feature_flags(description_diffs: true)
+ end
+
+ it 'saves the description changes' do
+ subject
+
+ description_change = DescriptionChange.where(system_note_id: subject.id).first
+
+ expect(description_change.old_description).to eq(noteable.description_before_last_save)
+ expect(description_change.new_description).to eq(noteable.description)
+ end
+ end
+
+ context 'when feature is not enabled' do
+ before do
+ stub_feature_flags(description_diffs: false)
+ end
+
+ it 'does not save the description changes' do
+ expect { subject }.not_to change { DescriptionChange.count }
+ end
+ end
+ end
end
end