Class: Retailer::WebhookResultProcessor

Inherits:
Object
  • Object
show all
Defined in:
app/services/retailer/webhook_result_processor.rb

Overview

Processes results received via Oxylabs webhook callback.
Uses factory pattern to delegate extraction to retailer-specific extractors.

Instance Method Summary collapse

Constructor Details

#initializeWebhookResultProcessor

Returns a new instance of WebhookResultProcessor.



10
11
12
# File 'app/services/retailer/webhook_result_processor.rb', line 10

def initialize
  @api = Retailer::OxylabsApi.new
end

Instance Method Details

#process(payload) ⇒ Object

Process a single webhook payload from Oxylabs
Note: Oxylabs callback only notifies that the job is done - we must fetch results separately

Parameters:

  • payload (Hash)

    The webhook payload containing job notification



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/services/retailer/webhook_result_processor.rb', line 17

def process(payload)
  job_id = payload['id']
  status = payload['status']

  Rails.logger.info "[Oxylabs Webhook] Processing job #{job_id} with status: #{status}"

  unless status == 'done'
    Rails.logger.warn "[Oxylabs Webhook] Job #{job_id} not done (status: #{status})"
    return
  end

  # Find the catalog item from URL params or context
  catalog_item = find_catalog_item(payload)
  return unless catalog_item

  # Fetch the actual results from Oxylabs API
  result = @api.job_results(job_id)
  unless result.success?
    Rails.logger.error "[Oxylabs Webhook] Failed to fetch results for job #{job_id}: #{result.error}"
    return
  end

  results = result.data
  if results.blank?
    Rails.logger.warn "[Oxylabs Webhook] Job #{job_id} returned empty results"
    return
  end

  content_size = results.first&.dig('content').to_s.size
  Rails.logger.info "[Oxylabs Webhook] Fetched results for job #{job_id}: #{content_size} bytes"

  # Process the result
  process_result(catalog_item, results.first, payload)
end