diff options
Diffstat (limited to 'app/services/alert_management/create_alert_issue_service.rb')
-rw-r--r-- | app/services/alert_management/create_alert_issue_service.rb | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/app/services/alert_management/create_alert_issue_service.rb b/app/services/alert_management/create_alert_issue_service.rb new file mode 100644 index 00000000000..0197f29145d --- /dev/null +++ b/app/services/alert_management/create_alert_issue_service.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +module AlertManagement + class CreateAlertIssueService + # @param alert [AlertManagement::Alert] + # @param user [User] + def initialize(alert, user) + @alert = alert + @user = user + end + + def execute + return error_no_permissions unless allowed? + return error_issue_already_exists if alert.issue + + result = create_issue(alert, user, alert_payload) + @issue = result[:issue] + + return error(result[:message]) if result[:status] == :error + return error(alert.errors.full_messages.to_sentence) unless update_alert_issue_id + + success + end + + private + + attr_reader :alert, :user, :issue + + delegate :project, to: :alert + + def allowed? + Feature.enabled?(:alert_management_create_alert_issue, project) && + user.can?(:create_issue, project) + end + + def create_issue(alert, user, alert_payload) + ::IncidentManagement::CreateIssueService + .new(project, alert_payload, user) + .execute(skip_settings_check: true) + end + + def alert_payload + if alert.prometheus? + alert.payload + else + Gitlab::Alerting::NotificationPayloadParser.call(alert.payload.to_h) + end + end + + def update_alert_issue_id + alert.update(issue_id: issue.id) + end + + def success + ServiceResponse.success(payload: { issue: issue }) + end + + def error(message) + ServiceResponse.error(payload: { issue: issue }, message: message) + end + + def error_issue_already_exists + error(_('An issue already exists')) + end + + def error_no_permissions + error(_('You have no permissions')) + end + end +end |