diff options
author | Heinrich Lee Yu <heinrich@gitlab.com> | 2019-09-06 11:18:51 +0800 |
---|---|---|
committer | Heinrich Lee Yu <heinrich@gitlab.com> | 2019-09-06 12:06:48 +0800 |
commit | c833a8e1a529b1fae082a2ad641fe9efe643df45 (patch) | |
tree | 85696d0ec8450e8e02e4496762387dc64c2feed1 | |
parent | 34822489d3633746592615cbd3e4bcc5b70a5d13 (diff) | |
download | gitlab-ce-65776-store-issue-mr-description-changes.tar.gz |
Store description changes65776-store-issue-mr-description-changes
Saves old and new description and associates with the system note
-rw-r--r-- | app/models/description_change.rb | 7 | ||||
-rw-r--r-- | app/services/system_note_service.rb | 10 | ||||
-rw-r--r-- | db/migrate/20190905233225_create_description_changes.rb | 15 | ||||
-rw-r--r-- | db/schema.rb | 10 | ||||
-rw-r--r-- | spec/models/description_change_spec.rb | 13 | ||||
-rw-r--r-- | spec/services/system_note_service_spec.rb | 31 |
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 |