Sha256: f604a93b99243abf2e32364b90613965df9fdf4d6777b53278f3df0810835aa9

Contents?: true

Size: 1.74 KB

Versions: 1

Compression:

Stored size: 1.74 KB

Contents

class ReverseMatchJob < Struct.new(:type, :match_class, :subject, :object, :referer, :origin)
  def enqueue(job)
    JobRelation.create(owner_reference: self.origin, job: job)
  end

  def perform
    conn = connection(subject, { accept: 'application/json' })
    response = conn.get
    link = response.body['links'].detect { |h| h['rel'] == type.to_s }
    request_url = link['href']
    request_method = link['method']

    conn = connection(request_url, { content_type: 'application/json', referer: referer })
    response = conn.send(request_method) do |req|
      req.params['match_class'] = match_class
      req.params['uri'] = object
    end
  end

  def error(job, exception)
    error_type = nil

    case exception
    when Faraday::Error::ConnectionFailed
      error_type = 'connection_failed'
    when Faraday::Error::TimeoutError
      error_type = 'timeout_error'
    when Faraday::Error::ResourceNotFound
      error_type = 'resource_not_found'
    when Faraday::ClientError
      body = exception.response[:body] || {}
      message = JSON.parse(body) unless body.empty?
      error_type = message['type']
    end

    unless error_type.nil?
      reference = JobRelation.find_by(owner_reference: self.origin, job: job)
      reference.update_attribute(:response_error, error_type)
    end
  end

  def success(job)
    reference = JobRelation.find_by(owner_reference: self.origin, job: job)
    reference.delete
  end

  private

  def connection(url, headers = {})
    Faraday::Connection.new(url: url, headers: headers) do |builder|
      builder.use FaradayMiddleware::ParseJson
      builder.use FaradayMiddleware::FollowRedirects, limit: 5
      builder.use Faraday::Response::RaiseError
      builder.adapter Faraday.default_adapter
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
iqvoc-4.6.0 app/jobs/reverse_match_job.rb