BathHacked/energy-sparks

View on GitHub
lib/rollbar_api/rql_jobs.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'json'
require 'faraday'

module RollbarApi
  API_BASE = 'https://api.rollbar.com'.freeze
  FAILED_STATES = %w[failed cancelled timed_out].freeze
  END_STATES = FAILED_STATES + ['success']

  class RqlJobs
    def initialize(api_token, client = nil)
      @client = if client != nil
                  client
                else
                  Faraday.new(API_BASE, request: { timeout: 20 })
                end
      raise 'ROLLBAR_READ_ACCESS_TOKEN not configured' unless api_token
      @api_token = api_token
    end

    def submit_job(query)
      body = {
        query_string: query,
        access_token: @api_token,
        force_refresh: true
      }
      resp = @client.post('/api/1/rql/jobs') do |req|
        req.body = body.to_json
      end
      raise 'Unable to submit job' unless resp.success?
      json = JSON.parse(resp.body)
      return json['result']['id']
    end

    def job_status(job_id)
      json = get_job(job_id)
      return json['result']['status']
    end

    def get_job(job_id)
      resp = @client.get("/api/1/rql/job/#{job_id}", {
        access_token: @api_token
      })
      raise 'Unable to get job' unless resp.success?
      json = JSON.parse(resp.body)
      return json
    end

    def get_result(job_id)
      resp = @client.get("/api/1/rql/job/#{job_id}/result", {
        access_token: @api_token
      })
      raise 'Unable to fetch RQL results' unless resp.success?
      json = JSON.parse(resp.body)
      return json
    end

    def run_query(query)
      job_id = submit_job(query)
      status = job_status(job_id)
      status = job_status(job_id) until END_STATES.include?(status)
      raise "RQL query failed #{status}" if FAILED_STATES.include?(status)
      return get_result(job_id)
    end
  end
end