class AsyncResponse::Builder

Attributes

expires_at[R]
job_key[R]
worker_class[R]

Public Class Methods

new(worker_class, expires_at, job_key) click to toggle source
# File lib/async_response/builder.rb, line 5
def initialize(worker_class, expires_at, job_key)
  @worker_class = worker_class
  @expires_at = expires_at
  @job_key = job_key
end

Public Instance Methods

build(params) click to toggle source
# File lib/async_response/builder.rb, line 11
def build(params)
  job = async_job || create_job(params)
  response = respond_with(job)
  # Set job as shown, needs to display at least once
  # before we discount it due to expiry
  job.shown! if job.finished?
  response
end

Private Instance Methods

async_job() click to toggle source
# File lib/async_response/builder.rb, line 22
def async_job
  @async_job ||= AsyncResponse::Job.valid_job(job_type,
                                              hashed_job_key)
end
create_job(params) click to toggle source
# File lib/async_response/builder.rb, line 27
def create_job(params)
  @new_job ||= AsyncResponse::Job.create!(
    job_type: job_type,
    job_key: hashed_job_key,
    expires_at: expires_at || Time.zone.now,
    params: params
  )

  schedule_job(@new_job)
  @new_job
end
respond_with(job) click to toggle source
# File lib/async_response/builder.rb, line 39
def respond_with(job)
  {
    # Shown is only internally applicable, indistinguishable
    # from finished as far as a user is concerned
    status: job.shown? ? 'finished' : job.status,
    percentage_completion: job.percentage_completion,
    data: job.data,
    error: job.error
  }
end
schedule_job(job) click to toggle source
# File lib/async_response/builder.rb, line 50
def schedule_job(job)
  worker_class.perform_async(job.id)
end