Commit 27568155 authored by Vitali Tatarintev's avatar Vitali Tatarintev

Add system note when timeline event created

When there is a new timeline event created, add a system note to the
incident
parent 11c4a0bd
......@@ -23,7 +23,8 @@ module EE
'vulnerability_dismissed' => 'cancel',
'vulnerability_resolved' => 'status_closed',
'published' => 'bullhorn',
'paging_started' => 'mobile'
'paging_started' => 'mobile',
'timeline_event' => 'clock'
}.freeze
override :system_note_icon_name
......
......@@ -9,7 +9,7 @@ module EE
epic_issue_added issue_added_to_epic epic_issue_removed issue_removed_from_epic
epic_issue_moved issue_changed_epic epic_date_changed relate_epic unrelate_epic
vulnerability_confirmed vulnerability_dismissed vulnerability_resolved vulnerability_detected
iteration paging_started
iteration paging_started timeline_event
].freeze
EE_TYPES_WITH_CROSS_REFERENCES = %w[
......
......@@ -120,6 +120,10 @@ module EE
escalations_service(noteable, noteable.project).start_escalation(escalation_policy, author)
end
def add_timeline_event(timeline_event)
incidents_service(timeline_event.incident).add_timeline_event(timeline_event)
end
private
def issuables_service(noteable, project, author)
......@@ -141,5 +145,9 @@ module EE
def escalations_service(noteable, project)
::SystemNotes::EscalationsService.new(noteable: noteable, project: project)
end
def incidents_service(incident)
::SystemNotes::IncidentsService.new(noteable: incident)
end
end
end
......@@ -29,6 +29,8 @@ module IncidentManagement
timeline_event = IncidentManagement::TimelineEvent.new(timeline_event_params)
if timeline_event.save
add_system_note(timeline_event)
success(timeline_event)
else
error_in_save(timeline_event)
......@@ -38,6 +40,12 @@ module IncidentManagement
private
attr_reader :project, :user, :incident, :params
def add_system_note(timeline_event)
return unless Feature.enabled?(:incident_timeline, project, default_enabled: :yaml)
SystemNoteService.add_timeline_event(timeline_event)
end
end
end
end
# frozen_string_literal: true
module SystemNotes
class IncidentsService < ::SystemNotes::BaseService
def initialize(noteable:)
@noteable = noteable
@project = noteable.project
end
def add_timeline_event(timeline_event)
author = timeline_event.author
anchor = "timeline_event_#{timeline_event.id}"
path = url_helpers.project_issues_incident_path(project, noteable, anchor: anchor)
body = "added an [incident timeline event](#{path})"
create_note(NoteSummary.new(noteable, project, author, body, action: 'timeline_event'))
end
end
end
......@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe EE::SystemNoteMetadata do
%i[
vulnerability_confirmed vulnerability_dismissed vulnerability_resolved vulnerability_detected
timeline_event
].each do |action|
context 'when action type is valid' do
subject do
......
......@@ -105,5 +105,25 @@ RSpec.describe IncidentManagement::TimelineEvents::CreateService do
it 'successfully creates a database record', :aggregate_failures do
expect { execute }.to change { ::IncidentManagement::TimelineEvent.count }.by(1)
end
context 'when incident_timeline feature flag is enabled' do
before do
stub_feature_flags(incident_timeline: project)
end
it 'creates a system note' do
expect { execute }.to change { incident.notes.reload.count }.by(1)
end
end
context 'when incident_timeline feature flag is disabled' do
before do
stub_feature_flags(incident_timeline: false)
end
it 'does not create a system note' do
expect { execute }.not_to change { incident.notes.reload.count }
end
end
end
end
......@@ -173,4 +173,16 @@ RSpec.describe SystemNoteService do
described_class.start_escalation(noteable, policy, author)
end
end
describe '.add_timeline_event' do
let(:timeline_event) { instance_double('IncidentManagement::TimelineEvent', incident: noteable, project: project) }
it 'calls IncidentsService' do
expect_next_instance_of(::SystemNotes::IncidentsService) do |service|
expect(service).to receive(:add_timeline_event).with(timeline_event)
end
described_class.add_timeline_event(timeline_event)
end
end
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe SystemNotes::IncidentsService do
include Gitlab::Routing
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
let_it_be(:author) { create(:user) }
let_it_be(:incident) { create(:incident, project: project, author: user) }
let_it_be(:timeline_event) { create(:incident_management_timeline_event, project: project, incident: incident, author: author) }
describe "#add_timeline_event" do
subject { described_class.new(noteable: incident).add_timeline_event(timeline_event) }
it_behaves_like 'a system note' do
let(:noteable) { incident }
let(:action) { 'timeline_event' }
end
it 'poses the correct text to the system note' do
path = project_issues_incident_path(project, incident, anchor: "timeline_event_#{timeline_event.id}")
expect(subject.note).to match("added an [incident timeline event](#{path})")
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment