Skip to content

Instantly share code, notes, and snippets.

@karimmorta
Created August 16, 2023 18:13
Show Gist options
  • Save karimmorta/40b13bf47d2190ec5575b4fe096f1910 to your computer and use it in GitHub Desktop.
Save karimmorta/40b13bf47d2190ec5575b4fe096f1910 to your computer and use it in GitHub Desktop.
# fullfill_orders_job.rb
...
class FulfillOrdersJob < ApplicationJob
queue_as :default
def perform(*args)
Order.pending.each do |order|
Order.transaction do
fulfill_order(order)
end
end
end
end
private
def fulfill_order(order)
Rails.logger.info "Fulfilling to fulfill order for #{order.customer_name}"
fulfilling_supplier = check_suppliers(order)
if fulfilling_supplier
reference = get_api_client(fulfilling_supplier).fulfill(product_name: order.product.name)
begin
order.update!(
supplier: fulfilling_supplier,
supplier_reference: reference,
state: 'completed'
)
Rails.logger.info "Order fulfilled successfully."
rescue ActiveRecord::RecordInvalid => e
Rails.logger.error "Error updating order: #{e.message}"
end
else
Rails.logger.info "Could not find a supplier with stock to fulfill order for #{order.id}".alarmify
end
end
def check_suppliers(order)
Supplier.find_each do |supplier|
check_stock_for_order_at_supplier(order, supplier)
end
end
def check_stock_for_order_at_supplier(order, supplier)
begin
stock = supplier.api_client.fetch_stock(product_name: order.product.name)
stock.positive?
rescue
Rails.logger.info "There was an error when checking for available stock for #{order.id} and #{supplier.name}".alarmify
end
end
...
# supplier.rb
class Supplier < ApplicationRecord
has_many :orders
validates :name, presence: true, uniqueness: true
def api_client
api_clients = {
'supplier_foo' => SupplierFooApi::Client,
'supplier_bar' => SupplierBarApi::Client
# Add other suppliers here
}
api_clients[self.name]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment