Skip to content

Commit 86fb96c

Browse files
committed
State projectors moved to the same file where process manager class is defined.
- state projector class is now nested inside each process manager class defintion to emphasize it's a part of the process - Infra::Process manager with_state definition uses block again to allow state projector class to be defined below
1 parent 003faf1 commit 86fb96c

13 files changed

+224
-237
lines changed

ecommerce/processes/lib/processes/determine_vat_rates_on_order_placed.rb

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
require_relative 'state_projectors/determine_vat_rates_on_order_placed'
2-
31
module Processes
42
class DetermineVatRatesOnOrderPlaced
5-
include Infra::ProcessManager.with_state(StateProjectors::DetermineVatRatesOnOrderPlaced)
3+
include Infra::ProcessManager.with_state { StateProjector }
64

75
subscribes_to(
86
Pricing::OfferAccepted,
@@ -26,5 +24,32 @@ def determine_vat_rates
2624
def fetch_id(event)
2725
event.data.fetch(:order_id)
2826
end
27+
28+
class StateProjector
29+
ProcessState = Data.define(:offer_accepted, :order_placed, :order_id, :order_lines) do
30+
def initialize(offer_accepted: false, order_placed: false, order_id: nil, order_lines: [])
31+
super
32+
end
33+
34+
def placed? = offer_accepted && order_placed
35+
end
36+
37+
def self.initial_state_instance
38+
ProcessState.new
39+
end
40+
41+
def self.apply(state_instance, event)
42+
case event
43+
when Pricing::OfferAccepted
44+
state_instance.with(
45+
offer_accepted: true,
46+
order_lines: event.data.fetch(:order_lines),
47+
order_id: event.data.fetch(:order_id)
48+
)
49+
when Fulfillment::OrderRegistered
50+
state_instance.with(order_placed: true)
51+
end
52+
end
53+
end
2954
end
3055
end

ecommerce/processes/lib/processes/order_item_invoicing_process.rb

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
require_relative 'state_projectors/order_item_invoicing_process'
2-
31
module Processes
42
class OrderItemInvoicingProcess
5-
include Infra::ProcessManager.with_state(StateProjectors::OrderItemInvoicingProcess)
6-
3+
include Infra::ProcessManager.with_state { StateProjector }
74
subscribes_to(
85
Pricing::PriceItemValueCalculated,
96
Taxes::VatRateDetermined
@@ -58,4 +55,36 @@ def call
5855
distributed_amounts
5956
end
6057
end
58+
59+
class StateProjector
60+
ProcessState = Data.define(:order_id, :product_id, :quantity, :vat_rate, :discounted_amount) do
61+
def initialize(order_id: nil, product_id: nil, quantity: nil, vat_rate: nil, discounted_amount: nil)
62+
super
63+
end
64+
65+
def can_create_invoice_item?
66+
order_id && product_id && quantity && vat_rate && discounted_amount
67+
end
68+
end
69+
70+
def self.initial_state_instance
71+
ProcessState.new
72+
end
73+
74+
def self.apply(state_instance, event)
75+
case event
76+
when Pricing::PriceItemValueCalculated
77+
state_instance.with(
78+
order_id: event.data.fetch(:order_id),
79+
product_id: event.data.fetch(:product_id),
80+
quantity: event.data.fetch(:quantity),
81+
discounted_amount: event.data.fetch(:discounted_amount)
82+
)
83+
when Taxes::VatRateDetermined
84+
state_instance.with(
85+
vat_rate: event.data.fetch(:vat_rate)
86+
)
87+
end
88+
end
89+
end
6190
end

ecommerce/processes/lib/processes/release_payment_process.rb

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
require_relative 'state_projectors/release_payment_process'
2-
31
module Processes
42
class ReleasePaymentProcess
5-
include Infra::ProcessManager.with_state(StateProjectors::ReleasePaymentProcess)
3+
include Infra::ProcessManager.with_state { StateProjector }
64
subscribes_to(
75
Payments::PaymentAuthorized,
86
Payments::PaymentReleased,
@@ -24,5 +22,39 @@ def release_payment
2422
def fetch_id(event)
2523
event.data.fetch(:order_id)
2624
end
25+
26+
class StateProjector
27+
ProcessState = Data.define(:order, :payment, :order_id) do
28+
def initialize(order: :draft, payment: :none, order_id: nil)
29+
super
30+
end
31+
32+
def release?
33+
payment.eql?(:authorized) && order.eql?(:expired)
34+
end
35+
end
36+
37+
def self.initial_state_instance
38+
ProcessState.new
39+
end
40+
41+
def self.apply(state_instance, event)
42+
case event
43+
when Payments::PaymentAuthorized
44+
state_instance.with(payment: :authorized)
45+
when Payments::PaymentReleased
46+
state_instance.with(payment: :released)
47+
when Fulfillment::OrderRegistered
48+
state_instance.with(
49+
order: :placed,
50+
order_id: event.data.fetch(:order_id)
51+
)
52+
when Pricing::OfferExpired
53+
state_instance.with(order: :expired)
54+
when Fulfillment::OrderConfirmed
55+
state_instance.with(order: :confirmed)
56+
end
57+
end
58+
end
2759
end
2860
end

ecommerce/processes/lib/processes/reservation_process.rb

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
require_relative 'state_projectors/reservation_process'
2-
31
module Processes
42
class ReservationProcess
5-
include Infra::ProcessManager.with_state(StateProjectors::ReservationProcess)
3+
include Infra::ProcessManager.with_state { StateProjector }
64

75
subscribes_to(
86
Pricing::OfferAccepted,
@@ -72,12 +70,34 @@ def fetch_id(event)
7270
event.data.fetch(:order_id)
7371
end
7472

75-
ProcessState = Data.define(:order, :order_lines) do
76-
def initialize(order: nil, order_lines: [])
77-
super(order:, order_lines: order_lines.freeze)
73+
class StateProjector
74+
ProcessState = Data.define(:order, :order_lines) do
75+
def initialize(order: nil, order_lines: [])
76+
super(order: order, order_lines: order_lines.freeze)
77+
end
78+
79+
def reserved_product_ids
80+
order_lines.keys
81+
end
7882
end
7983

80-
def reserved_product_ids = order_lines.keys
84+
def self.initial_state_instance
85+
ProcessState.new
86+
end
87+
88+
def self.apply(state_instance, event)
89+
case event
90+
when Pricing::OfferAccepted
91+
state_instance.with(
92+
order: :accepted,
93+
order_lines: event.data.fetch(:order_lines).map { |ol| [ol.fetch(:product_id), ol.fetch(:quantity)] }.to_h
94+
)
95+
when Fulfillment::OrderCancelled
96+
state_instance.with(order: :cancelled)
97+
when Fulfillment::OrderConfirmed
98+
state_instance.with(order: :confirmed)
99+
end
100+
end
81101
end
82102

83103
class SomeInventoryNotAvailable < StandardError
@@ -87,5 +107,6 @@ def initialize(unavailable_products)
87107
@unavailable_products = unavailable_products
88108
end
89109
end
110+
90111
end
91112
end

ecommerce/processes/lib/processes/shipment_process.rb

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
require_relative 'state_projectors/shipment_process'
2-
31
module Processes
42
class ShipmentProcess
5-
include Infra::ProcessManager.with_state(StateProjectors::ShipmentProcess)
3+
include Infra::ProcessManager.with_state { StateProjector }
64

75
subscribes_to(
86
Shipping::ShippingAddressAddedToShipment,
@@ -34,5 +32,26 @@ def authorize_shipment
3432
def fetch_id(event)
3533
event.data.fetch(:order_id)
3634
end
35+
36+
class StateProjector
37+
ProcessState = Data.define(:order, :shipment) do
38+
def initialize(order: nil, shipment: nil) = super
39+
end
40+
41+
def self.initial_state_instance
42+
ProcessState.new
43+
end
44+
45+
def self.apply(state_instance, event)
46+
case event
47+
when Shipping::ShippingAddressAddedToShipment
48+
state_instance.with(shipment: :address_set)
49+
when Fulfillment::OrderRegistered
50+
state_instance.with(order: :placed)
51+
when Fulfillment::OrderConfirmed
52+
state_instance.with(order: :confirmed)
53+
end
54+
end
55+
end
3756
end
3857
end

ecommerce/processes/lib/processes/state_projectors/determine_vat_rates_on_order_placed.rb

Lines changed: 0 additions & 30 deletions
This file was deleted.

ecommerce/processes/lib/processes/state_projectors/order_item_invoicing_process.rb

Lines changed: 0 additions & 35 deletions
This file was deleted.

ecommerce/processes/lib/processes/state_projectors/release_payment_process.rb

Lines changed: 0 additions & 37 deletions
This file was deleted.

ecommerce/processes/lib/processes/state_projectors/reservation_process.rb

Lines changed: 0 additions & 35 deletions
This file was deleted.

ecommerce/processes/lib/processes/state_projectors/shipment_process.rb

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)