Skip to content

Commit be148b7

Browse files
committed
move Orderign::Order expiration to Pricing::Offer expiration
1 parent d28d3fb commit be148b7

File tree

9 files changed

+68
-29
lines changed

9 files changed

+68
-29
lines changed

ecommerce/pricing/lib/pricing.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ def call(event_store, command_bus)
9090
RejectOffer,
9191
OnRejectOffer.new(event_store)
9292
)
93+
command_bus.register(
94+
ExpireOffer,
95+
OnExpireOffer.new(event_store)
96+
)
9397
command_bus.register(
9498
SetTimePromotionDiscount,
9599
SetTimePromotionDiscountHandler.new(event_store)

ecommerce/pricing/lib/pricing/commands.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,10 @@ class RejectOffer < Infra::Command
104104

105105
alias aggregate_id order_id
106106
end
107+
108+
class ExpireOffer < Infra::Command
109+
attribute :order_id, Infra::Types::UUID
110+
111+
alias aggregate_id order_id
112+
end
107113
end

ecommerce/pricing/lib/pricing/events.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,8 @@ class OfferAccepted < Infra::Event
8787
class OfferRejected < Infra::Event
8888
attribute :order_id, Infra::Types::UUID
8989
end
90+
91+
class OfferExpired < Infra::Event
92+
attribute :order_id, Infra::Types::UUID
93+
end
9094
end

ecommerce/pricing/lib/pricing/offer.rb

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ def initialize(id)
66
@id = id
77
@items = []
88
@discounts = []
9-
@accepted = false
9+
@state = :draft
1010
end
1111

1212
def add_item(product_id, pricing_policy)
13-
fail_if_accepted
13+
fail_unless_draft
1414
apply_discounts_to_pricing_policy(pricing_policy)
1515
items = pricing_policy.apply(@items, product_id)
1616
apply PriceItemAdded.new(
@@ -24,7 +24,7 @@ def add_item(product_id, pricing_policy)
2424
end
2525

2626
def remove_item(product_id, catalog_price)
27-
fail_if_accepted
27+
fail_unless_draft
2828
item = @items.find { |item| item.product_id == product_id && item.catalog_price == catalog_price }
2929
return unless item
3030
apply PriceItemRemoved.new(
@@ -38,7 +38,7 @@ def remove_item(product_id, catalog_price)
3838
end
3939

4040
def apply_discount(discount, pricing_policy)
41-
fail_if_accepted
41+
fail_unless_draft
4242
raise NotPossibleToAssignDiscountTwice if discount_exists?(discount.type)
4343
apply PercentageDiscountSet.new(
4444
data: {
@@ -52,7 +52,7 @@ def apply_discount(discount, pricing_policy)
5252
end
5353

5454
def change_discount(discount, pricing_policy)
55-
fail_if_accepted
55+
fail_unless_draft
5656
raise NotPossibleToChangeDiscount unless discount_exists?(discount.type)
5757
apply PercentageDiscountChanged.new(
5858
data: {
@@ -66,7 +66,7 @@ def change_discount(discount, pricing_policy)
6666
end
6767

6868
def remove_discount(type, pricing_policy)
69-
fail_if_accepted
69+
fail_unless_draft
7070
raise NotPossibleToRemoveWithoutDiscount unless discount_exists?(type)
7171
apply PercentageDiscountRemoved.new(
7272
data: {
@@ -99,7 +99,7 @@ def remove_free_product(order_id, product_id)
9999
end
100100

101101
def use_coupon(coupon_id, discount)
102-
fail_if_accepted
102+
fail_unless_draft
103103
apply CouponUsed.new(
104104
data: {
105105
order_id: @id,
@@ -110,6 +110,7 @@ def use_coupon(coupon_id, discount)
110110
end
111111

112112
def accept
113+
raise CantAcceptEmptyOffer if @items.empty?
113114
apply OfferAccepted.new(
114115
data: {
115116
order_id: @id,
@@ -126,14 +127,20 @@ def accept
126127
end
127128

128129
def reject
129-
raise OnlyAcceptedOfferCanBeRejected unless @accepted
130+
raise OnlyAcceptedOfferCanBeRejected unless accepted?
130131
apply OfferRejected.new(data: { order_id: @id })
131132
end
132133

134+
def expire
135+
raise OnlyDraftOfferCanBeExpired unless draft?
136+
apply OfferExpired.new(data: { order_id: @id })
137+
end
138+
133139
private
134140

135-
def fail_if_accepted
136-
raise CantModifyAcceptedOffer if @accepted
141+
def fail_unless_draft
142+
raise CantModifyAcceptedOffer if accepted?
143+
raise CantModifyExpiredOffer if expired?
137144
end
138145

139146
def apply_discounts_to_pricing_policy(pricing_policy)
@@ -196,17 +203,25 @@ def recalculate_prices(pricing_policy)
196203
end
197204

198205
on OfferAccepted do |_|
199-
@accepted = true
206+
@state = :accepted
200207
end
201208

202209
on OfferRejected do |_|
203-
@accepted = false
210+
@state = :draft
211+
end
212+
213+
on OfferExpired do |_|
214+
@state = :expired
204215
end
205216

206217
def discount_exists?(type)
207218
@discounts.find { |discount| discount.type == type }
208219
end
209220

221+
def draft? = @state == :draft
222+
def accepted? = @state == :accepted
223+
def expired? = @state == :expired
224+
210225
ItemPrice = Data.define(:product_id, :catalog_price, :price)
211226

212227
class List

ecommerce/pricing/lib/pricing/services.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,21 @@ class FreeProductAlreadyMade < StandardError
1414
class FreeProductNotExists < StandardError
1515
end
1616

17+
class CantAcceptEmptyOffer < StandardError
18+
end
19+
1720
class CantModifyAcceptedOffer < StandardError
1821
end
1922

23+
class CantModifyExpiredOffer < StandardError
24+
end
25+
2026
class OnlyAcceptedOfferCanBeRejected < StandardError
2127
end
2228

29+
class OnlyDraftOfferCanBeExpired < StandardError
30+
end
31+
2332
class SetPercentageDiscountHandler
2433
def initialize(event_store)
2534
@repository = Infra::AggregateRootRepository.new(event_store)
@@ -231,4 +240,16 @@ def call(command)
231240
end
232241
end
233242
end
243+
244+
class OnExpireOffer
245+
def initialize(event_store)
246+
@repository = Infra::AggregateRootRepository.new(event_store)
247+
end
248+
249+
def call(command)
250+
@repository.with_aggregate(Offer, command.aggregate_id) do |order|
251+
order.expire
252+
end
253+
end
254+
end
234255
end

rails_application/app/controllers/orders_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def create
9292
def expire
9393
Orders::Order
9494
.where(state: "Draft")
95-
.find_each { |order| command_bus.(Ordering::SetOrderAsExpired.new(order_id: order.uid)) }
95+
.find_each { |order| command_bus.(Pricing::ExpireOffer.new(order_id: order.uid)) }
9696
redirect_to root_path
9797
end
9898

rails_application/app/read_models/client_orders/configuration.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class Product < ApplicationRecord
4141

4242
class Configuration
4343
def call(event_store)
44-
event_store.subscribe(OrderHandlers::ExpireOrder, to: [Ordering::OrderExpired])
44+
event_store.subscribe(OrderHandlers::ExpireOrder, to: [Pricing::OfferExpired])
4545
event_store.subscribe(OrderHandlers::CancelOrder, to: [Fulfillment::OrderCancelled])
4646
event_store.subscribe(OrderHandlers::SubmitOrder, to: [Fulfillment::OrderRegistered])
4747
event_store.subscribe(OrderHandlers::ConfirmOrder, to: [Fulfillment::OrderConfirmed])

rails_application/app/read_models/orders/configuration.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,19 @@ def call(event_store)
6868
event_store.subscribe(CreateCustomer.new, to: [Crm::CustomerRegistered])
6969
event_store.subscribe(AssignCustomerToOrder.new, to: [Crm::CustomerAssignedToOrder])
7070
event_store.subscribe(SubmitOrder.new, to: [Fulfillment::OrderRegistered])
71-
event_store.subscribe(ExpireOrder.new, to: [Ordering::OrderExpired])
71+
event_store.subscribe(ExpireOrder.new, to: [Pricing::OfferExpired])
7272
event_store.subscribe(ConfirmOrder.new, to: [Fulfillment::OrderConfirmed])
7373
event_store.subscribe(CancelOrder.new, to: [Fulfillment::OrderCancelled])
7474
event_store.subscribe(UpdateTimePromotionDiscountValue.new, to: [Pricing::PercentageDiscountSet])
7575
event_store.subscribe(RemoveTimePromotionDiscount.new, to: [Pricing::PercentageDiscountRemoved])
7676

7777
subscribe(
7878
->(event) { broadcast_order_state_change(event.data.fetch(:order_id), 'Submitted') },
79-
[Ordering::OrderPlaced]
79+
[Fulfillment::OrderRegistered]
8080
)
8181
subscribe(
8282
->(event) { broadcast_order_state_change(event.data.fetch(:order_id), "Expired") },
83-
[Ordering::OrderExpired]
83+
[Pricing::OfferExpired]
8484
)
8585
subscribe(
8686
->(event) { broadcast_order_state_change(event.data.fetch(:order_id), "Paid") },

rails_application/test/orders/order_expired_test.rb

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ def test_expire_created_order
2626
run_command(Pricing::SetPrice.new(product_id: product_id, price: 39))
2727

2828
order_id = SecureRandom.uuid
29-
order_number = Ordering::FakeNumberGenerator::FAKE_NUMBER
3029
event_store.publish(
3130
Pricing::PriceItemAdded.new(
3231
data: {
@@ -37,18 +36,8 @@ def test_expire_created_order
3736
}
3837
)
3938
)
40-
event_store.publish(
41-
Ordering::OrderPlaced.new(
42-
data: {
43-
order_id: order_id,
44-
order_number: order_number,
45-
customer_id: customer_id,
46-
order_lines: { product_id => 1 }
47-
}
48-
)
49-
)
5039

51-
order_expired = Ordering::OrderExpired.new(data: { order_id: order_id })
40+
order_expired = Pricing::OfferExpired.new(data: { order_id: order_id })
5241
event_store.publish(order_expired)
5342

5443
assert_equal(Order.count, 1)

0 commit comments

Comments
 (0)