class RailsCloudTasks::Rack::Jobs

Public Class Methods

call(env) click to toggle source
# File lib/rails_cloud_tasks/rack/jobs.rb, line 8
def call(env)
  job_class = extract_job_class(env)

  RailsCloudTasks::Instrumentation.transaction_name!(
    "RailsCloudTasks/#{job_class}/perform_now"
  )

  request = ::Rack::Request.new(env)
  job_args = extract_args(request)

  job_class.perform_now(*job_args)

  response(200, {})
rescue Rack::InvalidPayloadError => e
  response(422, { error: e.message })
end

Private Class Methods

extract_args(request) click to toggle source
# File lib/rails_cloud_tasks/rack/jobs.rb, line 32
def extract_args(request)
  body = request.body.read
  JSON.parse(body) || []
rescue JSON::ParserError, KeyError
  raise Rack::InvalidPayloadError
end
extract_job_class(env) click to toggle source
# File lib/rails_cloud_tasks/rack/jobs.rb, line 27
def extract_job_class(env)
  env.dig('action_dispatch.request.path_parameters', :job_class)
     .constantize
end
response(status, body) click to toggle source
# File lib/rails_cloud_tasks/rack/jobs.rb, line 39
def response(status, body)
  [status, { 'Content-Type' => 'application/json' }, [body.to_json]]
end