1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# frozen_string_literal: true
module IncidentManagement
module TimelineEvents
DEFAULT_ACTION = 'comment'
DEFAULT_EDITABLE = false
DEFAULT_AUTO_CREATED = false
class CreateService < TimelineEvents::BaseService
def initialize(incident, user, params)
@project = incident.project
@incident = incident
@user = user
@params = params
@auto_created = !!params.fetch(:auto_created, DEFAULT_AUTO_CREATED)
end
class << self
def create_incident(incident, user)
note = "@#{user.username} created the incident"
occurred_at = incident.created_at
action = 'issues'
new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
end
def reopen_incident(incident, user)
note = "@#{user.username} reopened the incident"
occurred_at = incident.updated_at
action = 'issues'
new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
end
def resolve_incident(incident, user)
note = "@#{user.username} resolved the incident"
occurred_at = incident.updated_at
action = 'status'
new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
end
def change_incident_status(incident, user, escalation_status)
status = escalation_status.status_name.to_s.titleize
note = "@#{user.username} changed the incident status to **#{status}**"
occurred_at = incident.updated_at
action = 'status'
new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
end
def change_labels(incident, user, added_labels: [], removed_labels: [])
return if Feature.disabled?(:incident_timeline_events_from_labels, incident.project)
if added_labels.blank? && removed_labels.blank?
return ServiceResponse.error(message: _('There are no changed labels'))
end
labels_note = -> (verb, labels) {
"#{verb} #{labels.map(&:to_reference).join(' ')} #{'label'.pluralize(labels.count)}" if labels.present?
}
added_note = labels_note.call('added', added_labels)
removed_note = labels_note.call('removed', removed_labels)
note = "@#{user.username} #{[added_note, removed_note].compact.join(' and ')}"
occurred_at = incident.updated_at
action = 'label'
new(incident, user, note: note, occurred_at: occurred_at, action: action, auto_created: true).execute
end
end
def execute
return error_no_permissions unless allowed?
timeline_event_params = {
project: project,
incident: incident,
author: user,
note: params[:note],
action: params.fetch(:action, DEFAULT_ACTION),
note_html: params[:note_html].presence || params[:note],
occurred_at: params[:occurred_at],
promoted_from_note: params[:promoted_from_note],
editable: params.fetch(:editable, DEFAULT_EDITABLE)
}
timeline_event = IncidentManagement::TimelineEvent.new(timeline_event_params)
if timeline_event.save
add_system_note(timeline_event)
track_usage_event(:incident_management_timeline_event_created, user.id)
success(timeline_event)
else
error_in_save(timeline_event)
end
end
private
attr_reader :project, :user, :incident, :params, :auto_created
def allowed?
return true if auto_created
super
end
def add_system_note(timeline_event)
return if auto_created
return unless Feature.enabled?(:incident_timeline, project)
SystemNoteService.add_timeline_event(timeline_event)
end
end
end
end
|