summaryrefslogtreecommitdiff
path: root/lib/api/alert_management_alerts.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/api/alert_management_alerts.rb')
-rw-r--r--lib/api/alert_management_alerts.rb137
1 files changed, 137 insertions, 0 deletions
diff --git a/lib/api/alert_management_alerts.rb b/lib/api/alert_management_alerts.rb
new file mode 100644
index 00000000000..88230c86247
--- /dev/null
+++ b/lib/api/alert_management_alerts.rb
@@ -0,0 +1,137 @@
+# frozen_string_literal: true
+
+module API
+ class AlertManagementAlerts < ::API::Base
+ feature_category :incident_management
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ requires :alert_iid, type: Integer, desc: 'The IID of the Alert'
+ end
+
+ resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ namespace ':id/alert_management_alerts/:alert_iid/metric_images' do
+ post 'authorize' do
+ authorize!(:upload_alert_management_metric_image, find_project_alert(request.params[:alert_iid]))
+
+ require_gitlab_workhorse!
+ ::Gitlab::Workhorse.verify_api_request!(request.headers)
+ status 200
+ content_type ::Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE
+
+ params = {
+ has_length: false,
+ maximum_size: ::AlertManagement::MetricImage::MAX_FILE_SIZE.to_i
+ }
+
+ ::MetricImageUploader.workhorse_authorize(**params)
+ end
+
+ desc 'Upload a metric image for an alert' do
+ success Entities::MetricImage
+ end
+ params do
+ requires :file, type: ::API::Validations::Types::WorkhorseFile, desc: 'The image file to be uploaded'
+ optional :url, type: String, desc: 'The url to view more metric info'
+ optional :url_text, type: String, desc: 'A description of the image or URL'
+ end
+ post do
+ require_gitlab_workhorse!
+ bad_request!('File is too large') if max_file_size_exceeded?
+
+ alert = find_project_alert(params[:alert_iid])
+
+ authorize!(:upload_alert_management_metric_image, alert)
+
+ upload = ::AlertManagement::MetricImages::UploadService.new(
+ alert,
+ current_user,
+ params.slice(:file, :url, :url_text)
+ ).execute
+
+ if upload.success?
+ present upload.payload[:metric],
+ with: Entities::MetricImage,
+ current_user: current_user,
+ project: user_project
+ else
+ render_api_error!(upload.message, upload.http_status)
+ end
+ end
+
+ desc 'Metric Images for alert'
+ get do
+ alert = find_project_alert(params[:alert_iid])
+
+ if can?(current_user, :read_alert_management_metric_image, alert)
+ present alert.metric_images.order_created_at_asc, with: Entities::MetricImage
+ else
+ render_api_error!('Alert not found', 404)
+ end
+ end
+
+ desc 'Update a metric image for an alert' do
+ success Entities::MetricImage
+ end
+ params do
+ requires :metric_image_id, type: Integer, desc: 'The ID of metric image'
+ optional :url, type: String, desc: 'The url to view more metric info'
+ optional :url_text, type: String, desc: 'A description of the image or URL'
+ end
+ put ':metric_image_id' do
+ alert = find_project_alert(params[:alert_iid])
+
+ authorize!(:update_alert_management_metric_image, alert)
+
+ render_api_error!('Feature not available', 403) unless alert.metric_images_available?
+
+ metric_image = alert.metric_images.find_by_id(params[:metric_image_id])
+
+ render_api_error!('Metric image not found', 404) unless metric_image
+
+ if metric_image.update(params.slice(:url, :url_text))
+ present metric_image, with: Entities::MetricImage, current_user: current_user, project: user_project
+ else
+ unprocessable_entity!('Metric image could not be updated')
+ end
+ end
+
+ desc 'Remove a metric image for an alert' do
+ success Entities::MetricImage
+ end
+ params do
+ requires :metric_image_id, type: Integer, desc: 'The ID of metric image'
+ end
+ delete ':metric_image_id' do
+ alert = find_project_alert(params[:alert_iid])
+
+ authorize!(:destroy_alert_management_metric_image, alert)
+
+ render_api_error!('Feature not available', 403) unless alert.metric_images_available?
+
+ metric_image = alert.metric_images.find_by_id(params[:metric_image_id])
+
+ render_api_error!('Metric image not found', 404) unless metric_image
+
+ if metric_image.destroy
+ no_content!
+ else
+ unprocessable_entity!('Metric image could not be deleted')
+ end
+ end
+ end
+ end
+
+ helpers do
+ def find_project_alert(iid, project_id = nil)
+ project = project_id ? find_project!(project_id) : user_project
+
+ ::AlertManagement::AlertsFinder.new(current_user, project, { iid: [iid] }).execute.first
+ end
+
+ def max_file_size_exceeded?
+ params[:file].size > ::AlertManagement::MetricImage::MAX_FILE_SIZE
+ end
+ end
+ end
+end