diff options
Diffstat (limited to 'app/services/incident_management')
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 |