64 lines
1.4 KiB
Ruby
64 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module AlertManagement
|
||
|
class UpdateAlertStatusService
|
||
|
include Gitlab::Utils::StrongMemoize
|
||
|
|
||
|
# @param alert [AlertManagement::Alert]
|
||
|
# @param user [User]
|
||
|
# @param status [Integer] Must match a value from AlertManagement::Alert::STATUSES
|
||
|
def initialize(alert, user, status)
|
||
|
@alert = alert
|
||
|
@user = user
|
||
|
@status = status
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
return error_no_permissions unless allowed?
|
||
|
return error_invalid_status unless status_key
|
||
|
|
||
|
if alert.update(status_event: status_event)
|
||
|
success
|
||
|
else
|
||
|
error(alert.errors.full_messages.to_sentence)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :alert, :user, :status
|
||
|
|
||
|
delegate :project, to: :alert
|
||
|
|
||
|
def allowed?
|
||
|
user.can?(:update_alert_management_alert, project)
|
||
|
end
|
||
|
|
||
|
def status_key
|
||
|
strong_memoize(:status_key) do
|
||
|
AlertManagement::Alert::STATUSES.key(status)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def status_event
|
||
|
AlertManagement::Alert::STATUS_EVENTS[status_key]
|
||
|
end
|
||
|
|
||
|
def success
|
||
|
ServiceResponse.success(payload: { alert: alert })
|
||
|
end
|
||
|
|
||
|
def error_no_permissions
|
||
|
error(_('You have no permissions'))
|
||
|
end
|
||
|
|
||
|
def error_invalid_status
|
||
|
error(_('Invalid status'))
|
||
|
end
|
||
|
|
||
|
def error(message)
|
||
|
ServiceResponse.error(payload: { alert: alert }, message: message)
|
||
|
end
|
||
|
end
|
||
|
end
|