Rails: Event Storeの新しいAPIを解説する(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Rails Event Store - better APIs coming | Arkency Blog 原文公開日: 2018/03/03 著者: Robert Pankowecki サイト: Arkency Blog Rails: Event Storeの新しいAPIを解説する(翻訳) Rails Event Store v0.26に新しい素敵なAPIがあります。変更点の一部をざっと見てみましょう。 永続的なサブスクライバとハンドラー 以前のsubscribeは、handler(インスタンス/クラス/procのいずれか)とevent_type(ハンドラーがサブスクライブされたイベントの種類)という2つの引数を取りました。 class OrderSummaryEmail def call(event) order = Order.find(event.data.fetch(:event_id)) OrderMailer.summary(order).deliver_later end end client = RailsEventStore::Client.new client.subscribe(OrderSummaryEmail.new, [OrderPlaced]) 今回の変更で、以下のように書けるようになりました。 client.subscribe(OrderSummaryEmail.new, to: [OrderPlaced]) to:という名前付き引数のおかげでずっと読みやすくなったと思います。 さらに、Procのサブスクライブ方法が大きく改善されています。従来は以下のように書きました。 OrderSummaryEmail = -> (event) { order = Order.find(event.data.fetch(:event_id)) OrderMailer.summary(order).deliver_later } client = RailsEventStore::Client.new client.subscribe(OrderSummaryEmail, [OrderPlaced]) 今後は以下のようにブロックを直接渡せるようになります。 client = RailsEventStore::Client.new client.subscribe(to: [OrderPlaced]) do |event| order = Order.find(event.data.fetch(:event_id)) OrderMailer.summary(order).deliver_later end 一時的なサブスクライバとハンドラー 以前の一時的なサブスクライバに用いられていたAPIはどうも好きになれません。以前は以下のような感じでした。 client = RailsEventStore::Client.new client.subscribe(OrderSummaryEmail, [OrderPlaced]) do PlaceOrder.call end 2つのコードブロックをきれいに渡す方法が定まっておらず、不便でした。サブスクライバ用のコードブロックと、一時的なサブスクライバの中で有効にしておきたいコード片用のコードブロックは今まで次のような感じで書きました。 order_summary_email = -> (event) { order = Order.find(event.data.fetch(:event_id)) OrderMailer.summary(order).deliver_later } client = RailsEventStore::Client.new client.subscribe(order_summary_email, [OrderPlaced]) do PlaceOrder.call end 興味深いことに、ActiveSupport::Notificationsにも同様の制約があります。 subscriber = lambda {|*args| … } ActiveSupport::Notifications.subscribed(subscriber, “sql.active_record”) do # … end 今後使える新しいAPIでは次のようになりました。 client = RailsEventStore::Client.new client.within do PlaceOrder.call end.subscribe(to: [OrderPlaced]) do order = Order.find(event.data.fetch(:event_id)) OrderMailer.summary(order).deliver_later end.call チェイン可能なAPIはコントローラで使うことも、内部で起きたことをインポートして調べることもできます。 client.within do PlaceOrder.call end.subscribe(to: [OrderPlaced]) do |ev| head :ok end.subscribe(to: [OrderRejected]) do |ev| render json: {errors: […]} end.call success = 0 failure = 0 client.within do ImportCustomer.call end.subscribe(to: [CustomerImported]) do |_| success += 1 end.subscribe(to: [CustomerImportFailed]) do |_| failure += 1 end.call もちろんサブスクライバは従来どおり最初の引数に渡せます。サブスクライバはブロックでなくても構いません。 … Continue reading Rails: Event Storeの新しいAPIを解説する(翻訳)