Last active
August 16, 2023 18:49
-
-
Save karimmorta/c6a878b49cea46a8dc276528442184fa to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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.id}" | |
fulfilling_supplier = check_suppliers(order) | |
if fulfilling_supplier | |
reference = fulfilling_supplier.api_client.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) | |
found_supplier = nil | |
Supplier.find_each do |supplier| | |
stock_available = check_stock_for_order_at_supplier(order, supplier) | |
if stock_available | |
found_supplier = supplier | |
break | |
end | |
end | |
found_supplier | |
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