api/app/services/spree/webhooks/subscribers/handle_request.rb
# frozen_string_literal: true
module Spree
module Webhooks
module Subscribers
class HandleRequest
def initialize(event_name:, subscriber:, webhook_payload_body:)
@event_name = event_name
@subscriber = subscriber
@webhook_payload_body = JSON.parse(webhook_payload_body)
end
def call
Rails.logger.debug(msg("sending to '#{url}'"))
Rails.logger.debug(msg("webhook_payload_body: #{body_with_event_metadata}"))
if request.unprocessable_uri?
return process(:warn, msg("can not make a request to '#{url}'"))
end
return process(:warn, msg("failed for '#{url}'")) if request.failed_request?
process(:debug, msg("success for URL '#{url}'"))
end
private
attr_reader :webhook_payload_body, :event_name, :subscriber
delegate :execution_time, :failed_request?, :response_code, :success?, :unprocessable_uri?, to: :request
delegate :id, :url, to: :subscriber
delegate :created_at, :id, to: :event, prefix: true
def process(log_level, msg)
Rails.logger.public_send(log_level, msg)
make_request
update_event(msg)
nil
end
def request
@request ||=
Spree::Webhooks::Subscribers::MakeRequest.new(
signature: event.signature_for(body_with_event_metadata),
url: url,
webhook_payload_body: body_with_event_metadata
)
end
alias make_request request
def body_with_event_metadata
webhook_payload_body.
merge(event_created_at: event_created_at, event_id: event_id, event_type: event.name).
to_json
end
def event
@event ||= Spree::Webhooks::Event.create!(
name: event_name, subscriber_id: subscriber.id, url: url
)
end
def update_event(msg)
event.update(
execution_time: execution_time,
request_errors: msg,
response_code: response_code,
success: success?
)
end
def msg(msg)
"[SPREE WEBHOOKS] '#{event_name}' #{msg}"
end
end
end
end
end