Skip to content

Instantly share code, notes, and snippets.

@louishuyng
Created October 23, 2023 13:46
Show Gist options
  • Save louishuyng/975e53d81ff242c9c1aff88f6c37a1df to your computer and use it in GitHub Desktop.
Save louishuyng/975e53d81ff242c9c1aff88f6c37a1df to your computer and use it in GitHub Desktop.
Process Manager Event
class CapturingProcess < ApplicationJob
prepend RailsEventStore::AsyncHandler
class State < ActiveRecord::Base
self.table_name = "capturing_process_state"
serialize :data
def self.get_by_order_number(order_number)
transaction do
lock.find_or_create_by(order_number: order_number).tap do |s|
s.data ||= {auth: false, shipped: false, completed: false}
yield s
s.save!
end
end
end
end
def perform(event)
State.get_by_order_number(event.data.fetch(:order_number)) do |state|
case event
when Orders::OrderShipped
state.data[:shipped] = true
when Payments::PaymentAuthorized
state.data[:auth] = true
else
raise ArgumentError
end
if trigger_command?(state)
PaymentsService.new.call(
CapturePaymentCommand.new(order_number: state.order_number)
)
state.data[:completed] = true
end
end
end
private
def trigger_command?(state)
state.data[:auth] && state.data[:shipped] && !state.data[:completed]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment