1# frozen_string_literal: true
2
3module Metrics::Dashboard::PrometheusApiProxy
4  extend ActiveSupport::Concern
5  include RenderServiceResults
6
7  included do
8    before_action :authorize_read_prometheus!, only: [:prometheus_proxy]
9  end
10
11  def prometheus_proxy
12    variable_substitution_result =
13      proxy_variable_substitution_service.new(proxyable, permit_params).execute
14
15    if variable_substitution_result[:status] == :error
16      return error_response(variable_substitution_result)
17    end
18
19    prometheus_result = ::Prometheus::ProxyService.new(
20      proxyable,
21      proxy_method,
22      proxy_path,
23      variable_substitution_result[:params]
24    ).execute
25
26    return continue_polling_response if prometheus_result.nil?
27    return error_response(prometheus_result) if prometheus_result[:status] == :error
28
29    success_response(prometheus_result)
30  end
31
32  private
33
34  def proxyable
35    raise NotImplementedError, "#{self.class} must implement method: #{__callee__}"
36  end
37
38  def proxy_variable_substitution_service
39    raise NotImplementedError, "#{self.class} must implement method: #{__callee__}"
40  end
41
42  def permit_params
43    params.permit!
44  end
45
46  def proxy_method
47    request.method
48  end
49
50  def proxy_path
51    params[:proxy_path]
52  end
53end
54