summaryrefslogtreecommitdiff
path: root/app/services/incident_management
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/incident_management')
-rw-r--r--app/services/incident_management/create_incident_label_service.rb22
-rw-r--r--app/services/incident_management/incidents/create_service.rb16
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/after_update_service.rb18
-rw-r--r--app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb29
4 files changed, 39 insertions, 46 deletions
diff --git a/app/services/incident_management/create_incident_label_service.rb b/app/services/incident_management/create_incident_label_service.rb
deleted file mode 100644
index 595f5df184f..00000000000
--- a/app/services/incident_management/create_incident_label_service.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-module IncidentManagement
- class CreateIncidentLabelService < BaseService
- LABEL_PROPERTIES = {
- title: 'incident',
- color: '#CC0033',
- description: <<~DESCRIPTION.chomp
- Denotes a disruption to IT services and \
- the associated issues require immediate attention
- DESCRIPTION
- }.freeze
-
- def execute
- label = Labels::FindOrCreateService
- .new(current_user, project, **LABEL_PROPERTIES)
- .execute(skip_authorization: true)
-
- ServiceResponse.success(payload: { label: label })
- end
- end
-end
diff --git a/app/services/incident_management/incidents/create_service.rb b/app/services/incident_management/incidents/create_service.rb
index f8437290d9b..ef66325fdcc 100644
--- a/app/services/incident_management/incidents/create_service.rb
+++ b/app/services/incident_management/incidents/create_service.rb
@@ -2,15 +2,16 @@
module IncidentManagement
module Incidents
- class CreateService < BaseService
+ class CreateService < ::BaseProjectService
ISSUE_TYPE = 'incident'
- def initialize(project, current_user, title:, description:, severity: IssuableSeverity::DEFAULT)
- super(project, current_user)
+ def initialize(project, current_user, title:, description:, severity: IssuableSeverity::DEFAULT, alert: nil)
+ super(project: project, current_user: current_user)
@title = title
@description = description
@severity = severity
+ @alert = alert
end
def execute
@@ -21,11 +22,16 @@ module IncidentManagement
title: title,
description: description,
issue_type: ISSUE_TYPE,
- severity: severity
+ severity: severity,
+ alert_management_alert: alert
},
spam_params: nil
).execute
+ if alert
+ return error(alert.errors.full_messages.to_sentence, issue) unless alert.valid?
+ end
+
return error(issue.errors.full_messages.to_sentence, issue) unless issue.valid?
success(issue)
@@ -33,7 +39,7 @@ module IncidentManagement
private
- attr_reader :title, :description, :severity
+ attr_reader :title, :description, :severity, :alert
def success(issue)
ServiceResponse.success(payload: { issue: issue })
diff --git a/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb b/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb
index a7a99f88b32..b7f8b268f18 100644
--- a/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb
+++ b/app/services/incident_management/issuable_escalation_statuses/after_update_service.rb
@@ -3,12 +3,12 @@
module IncidentManagement
module IssuableEscalationStatuses
class AfterUpdateService < ::BaseProjectService
- def initialize(issuable, current_user)
+ def initialize(issuable, current_user, **params)
@issuable = issuable
@escalation_status = issuable.escalation_status
@alert = issuable.alert_management_alert
- super(project: issuable.project, current_user: current_user)
+ super(project: issuable.project, current_user: current_user, params: params)
end
def execute
@@ -22,19 +22,27 @@ module IncidentManagement
attr_reader :issuable, :escalation_status, :alert
def after_update
- sync_to_alert
+ sync_status_to_alert
+ add_status_system_note
end
- def sync_to_alert
+ def sync_status_to_alert
return unless alert
return if alert.status == escalation_status.status
::AlertManagement::Alerts::UpdateService.new(
alert,
current_user,
- status: escalation_status.status_name
+ status: escalation_status.status_name,
+ status_change_reason: " by changing the incident status of #{issuable.to_reference(project)}"
).execute
end
+
+ def add_status_system_note
+ return unless escalation_status.status_previously_changed?
+
+ SystemNoteService.change_incident_status(issuable, current_user, params[:status_change_reason])
+ end
end
end
end
diff --git a/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb b/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
index 1a660e1a163..8f591b375ee 100644
--- a/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
+++ b/app/services/incident_management/issuable_escalation_statuses/prepare_update_service.rb
@@ -2,18 +2,16 @@
module IncidentManagement
module IssuableEscalationStatuses
- class PrepareUpdateService
+ class PrepareUpdateService < ::BaseProjectService
include Gitlab::Utils::StrongMemoize
- SUPPORTED_PARAMS = %i[status].freeze
-
- InvalidParamError = Class.new(StandardError)
+ SUPPORTED_PARAMS = %i[status status_change_reason].freeze
def initialize(issuable, current_user, params)
@issuable = issuable
- @current_user = current_user
- @params = params.dup || {}
- @project = issuable.project
+ @param_errors = []
+
+ super(project: issuable.project, current_user: current_user, params: Hash(params))
end
def execute
@@ -23,19 +21,18 @@ module IncidentManagement
filter_attributes
filter_redundant_params
+ return invalid_param_error if param_errors.any?
+
ServiceResponse.success(payload: { escalation_status: params })
- rescue InvalidParamError
- invalid_param_error
end
private
- attr_reader :issuable, :current_user, :params, :project
+ attr_reader :issuable, :param_errors
def available?
- Feature.enabled?(:incident_escalations, project) &&
+ issuable.supports_escalation? &&
user_has_permissions? &&
- issuable.supports_escalation? &&
escalation_status.present?
end
@@ -66,7 +63,7 @@ module IncidentManagement
return unless status
status_event = escalation_status.status_event_for(status)
- raise InvalidParamError unless status_event
+ add_param_error(:status) && return unless status_event
params[:status_event] = status_event
end
@@ -85,12 +82,16 @@ module IncidentManagement
end
end
+ def add_param_error(param)
+ param_errors << param
+ end
+
def availability_error
ServiceResponse.error(message: 'Escalation status updates are not available for this issue, user, or project.')
end
def invalid_param_error
- ServiceResponse.error(message: 'Invalid value was provided for a parameter.')
+ ServiceResponse.error(message: "Invalid value was provided for parameters: #{param_errors.join(', ')}")
end
end
end