Replace broken order data

Bugsnag expects a string as value, not an ActiveRecord object. The
result was just "filtered" data, not showing any of the order's
attributes.

Since wanting to share the order data seems a common pattern, I added a
convenience method for it.
This commit is contained in:
Maikel Linke
2024-11-20 17:13:10 +11:00
parent 61e7c1db07
commit 6a8cc410d2
7 changed files with 31 additions and 21 deletions

View File

@@ -50,9 +50,7 @@ module OrderCompletion
end
def order_invalid!
Alert.raise("Notice: invalid order loaded during checkout") do |payload|
payload.add_metadata :order, :order, @order
end
Alert.raise_with_record("Notice: invalid order loaded during checkout", @order)
flash[:error] = t('checkout.order_not_loaded')
redirect_to main_app.shop_path
@@ -92,9 +90,7 @@ module OrderCompletion
end
def notify_failure(error = RuntimeError.new(order_processing_error))
Alert.raise(error) do |payload|
payload.add_metadata :order, @order
end
Alert.raise_with_record(error, @order)
flash[:error] = order_processing_error if flash.blank?
end

View File

@@ -20,9 +20,7 @@ module OrderStockCheck
def check_order_cycle_expiry
return unless current_order_cycle&.closed?
Alert.raise("Notice: order cycle closed during checkout completion") do |payload|
payload.add_metadata :order, :order, current_order
end
Alert.raise_with_record("Notice: order cycle closed during checkout completion", current_order)
current_order.empty!
current_order.set_order_cycle! nil

View File

@@ -19,9 +19,7 @@ class BackorderJob < ApplicationJob
rescue StandardError => e
# Errors here shouldn't affect the checkout. So let's report them
# separately:
Alert.raise(e) do |payload|
payload.add_metadata(:order, :order, order)
end
Alert.raise_with_record(e, order)
end
def perform(order)

View File

@@ -16,9 +16,7 @@ class StockSyncJob < ApplicationJob
rescue StandardError => e
# Errors here shouldn't affect the shopping. So let's report them
# separately:
Alert.raise(e) do |payload|
payload.add_metadata(:order, :order, order)
end
Alert.raise_with_record(e, order)
end
def self.sync_linked_catalogs_now(order)
@@ -29,9 +27,7 @@ class StockSyncJob < ApplicationJob
rescue StandardError => e
# Errors here shouldn't affect the shopping. So let's report them
# separately:
Alert.raise(e) do |payload|
payload.add_metadata(:order, :order, order)
end
Alert.raise_with_record(e, order)
end
def self.catalog_ids(order)

View File

@@ -28,4 +28,11 @@ class Alert
block.call(payload)
end
end
def self.raise_with_record(error, record, &)
metadata = {
record.class.name => record&.attributes || { record_was_nil: true }
}
self.raise(error, metadata, &)
end
end

View File

@@ -24,9 +24,7 @@ class PlaceProxyOrder
send_placement_email
rescue StandardError => e
summarizer.record_and_log_error(:processing, order, e.message)
Alert.raise(e) do |payload|
payload.add_metadata :order, :order, order
end
Alert.raise_with_record(e, order)
end
private

View File

@@ -51,6 +51,23 @@ RSpec.describe Alert do
end
end
it "sends ActiveRecord objects" do
order = Spree::Order.new(number: "ABC123")
expect_any_instance_of(Bugsnag::Report).to receive(:add_metadata).with(
"Spree::Order", hash_including("number" => "ABC123")
)
Alert.raise_with_record("Wrong order", order)
end
it "notifies Bugsnag when ActiveRecord object is missing" do
expect_any_instance_of(Bugsnag::Report).to receive(:add_metadata).with(
"NilClass", { record_was_nil: true }
)
Alert.raise_with_record("Wrong order", nil)
end
it "reaches the Bugsnag service for real", :vcr do
# You need to have a valid Bugsnag API key to record this test.
# And after recording, you need to check the Bugsnag account for the right