mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
46 lines
1.3 KiB
Ruby
46 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# A handy wrapper around error reporting libraries like Bugsnag.
|
|
#
|
|
# Bugsnag's API is great for general purpose but overly complex for our use.
|
|
# It also changes over time and we often make mistakes using it. So this class
|
|
# aims at:
|
|
#
|
|
# * Abstracting from Bugsnag, open for other services.
|
|
# * Simpler interface to reduce user error.
|
|
# * Central place to update Bugsnag API usage when it changes.
|
|
#
|
|
class Alert
|
|
# Alert Bugsnag with additional metadata to appear in tabs.
|
|
#
|
|
# Alert.raise(
|
|
# "Invalid order during checkout",
|
|
# {
|
|
# order: { number: "ABC123", state: "awaiting_return" },
|
|
# env: { referer: "example.com" }
|
|
# }
|
|
# )
|
|
def self.raise(error, metadata = {}, &block)
|
|
Bugsnag.notify(error) do |payload|
|
|
unless metadata.respond_to?(:each)
|
|
metadata = { metadata: { data: metadata } }
|
|
end
|
|
|
|
metadata.each do |name, data|
|
|
# Bugsnag only reports metadata when given a Hash.
|
|
data = { data: } unless data.is_a?(Hash)
|
|
payload.add_metadata(name, data)
|
|
end
|
|
|
|
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
|