Skip to content

Commit bed0840

Browse files
authored
Merge pull request #455 from RailsEventStore/refund-to-return
Rename Refund to Return
2 parents 9326f3a + 2294fe6 commit bed0840

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+680
-363
lines changed

ecommerce/ordering/.mutant.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ matcher:
1111
- Ordering::Test*
1212
- Ordering::Configuration#call
1313
- Ordering::Configuration#initialize
14-
- Ordering::RefundableProducts#call
14+
- Ordering::ReturnableProducts#call

ecommerce/ordering/lib/ordering.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
require "infra"
2-
require_relative "ordering/events/draft_refund_created"
3-
require_relative "ordering/events/item_added_to_refund"
4-
require_relative "ordering/events/item_removed_from_refund"
5-
require_relative "ordering/commands/create_draft_refund"
6-
require_relative "ordering/commands/add_item_to_refund"
7-
require_relative "ordering/commands/remove_item_from_refund"
2+
require_relative "ordering/events/draft_return_created"
3+
require_relative "ordering/events/item_added_to_return"
4+
require_relative "ordering/events/item_removed_from_return"
5+
require_relative "ordering/commands/create_draft_return"
6+
require_relative "ordering/commands/add_item_to_return"
7+
require_relative "ordering/commands/remove_item_from_return"
88
require_relative "ordering/service"
9-
require_relative "ordering/refund"
10-
require_relative "ordering/refundable_products"
9+
require_relative "ordering/return"
10+
require_relative "ordering/returnable_products"
1111

1212
module Ordering
1313
class Configuration
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module Ordering
2+
class AddItemToReturn < Infra::Command
3+
attribute :return_id, Infra::Types::UUID
4+
attribute :order_id, Infra::Types::UUID
5+
attribute :product_id, Infra::Types::UUID
6+
7+
alias aggregate_id return_id
8+
end
9+
10+
AddItemToRefund = AddItemToReturn
11+
end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module Ordering
2+
class CreateDraftReturn < Infra::Command
3+
attribute :return_id, Infra::Types::UUID
4+
attribute :order_id, Infra::Types::UUID
5+
6+
alias aggregate_id return_id
7+
end
8+
9+
CreateDraftRefund = CreateDraftReturn
10+
end
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module Ordering
2+
class RemoveItemFromReturn < Infra::Command
3+
attribute :return_id, Infra::Types::UUID
4+
attribute :order_id, Infra::Types::UUID
5+
attribute :product_id, Infra::Types::UUID
6+
7+
alias aggregate_id return_id
8+
end
9+
10+
RemoveItemFromRefund = RemoveItemFromReturn
11+
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module Ordering
2+
class DraftReturnCreated < Infra::Event
3+
attribute :return_id, Infra::Types::UUID
4+
attribute :order_id, Infra::Types::UUID
5+
attribute :returnable_products, Infra::Types::Array.of(
6+
Infra::Types::Hash.schema(
7+
product_id: Infra::Types::UUID,
8+
quantity: Infra::Types::Integer
9+
)
10+
)
11+
end
12+
13+
DraftRefundCreated = DraftReturnCreated
14+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Ordering
2+
class ItemAddedToReturn < Infra::Event
3+
attribute :return_id, Infra::Types::UUID
4+
attribute :order_id, Infra::Types::UUID
5+
attribute :product_id, Infra::Types::UUID
6+
end
7+
8+
ItemAddedToRefund = ItemAddedToReturn
9+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module Ordering
2+
class ItemRemovedFromReturn < Infra::Event
3+
attribute :return_id, Infra::Types::UUID
4+
attribute :order_id, Infra::Types::UUID
5+
attribute :product_id, Infra::Types::UUID
6+
end
7+
8+
ItemRemovedFromRefund = ItemRemovedFromReturn
9+
end
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
module Ordering
2+
class Return
3+
include AggregateRoot
4+
5+
ExceedsOrderQuantityError = Class.new(StandardError)
6+
ReturnHaveNotBeenRequestedForThisProductError = Class.new(StandardError)
7+
8+
def initialize(id)
9+
@id = id
10+
@return_items = ItemsList.new
11+
end
12+
13+
def create_draft(order_id, returnable_products)
14+
apply DraftReturnCreated.new(data: { return_id: @id, order_id: order_id, returnable_products: returnable_products })
15+
end
16+
17+
def add_item(product_id)
18+
raise ExceedsOrderQuantityError unless enough_items?(product_id)
19+
apply ItemAddedToReturn.new(data: { return_id: @id, order_id: @order_id, product_id: product_id })
20+
end
21+
22+
def remove_item(product_id)
23+
raise ReturnHaveNotBeenRequestedForThisProductError unless @return_items.quantity(product_id).positive?
24+
apply ItemRemovedFromReturn.new(data: { return_id: @id, order_id: @order_id, product_id: product_id })
25+
end
26+
27+
on DraftReturnCreated do |event|
28+
@order_id = event.data[:order_id]
29+
@returnable_products = event.data[:returnable_products]
30+
end
31+
32+
on ItemAddedToReturn do |event|
33+
@return_items.increase_quantity(event.data[:product_id])
34+
end
35+
36+
on ItemRemovedFromReturn do |event|
37+
@return_items.decrease_quantity(event.data[:product_id])
38+
end
39+
40+
private
41+
42+
def enough_items?(product_id)
43+
@return_items.quantity(product_id) < returnable_quantity(product_id)
44+
end
45+
46+
def returnable_quantity(product_id)
47+
product = @returnable_products.find { |product| product.fetch(:product_id) == product_id }
48+
product.fetch(:quantity)
49+
end
50+
end
51+
52+
class ItemsList
53+
attr_reader :return_items
54+
55+
def initialize
56+
@return_items = Hash.new(0)
57+
end
58+
59+
def increase_quantity(product_id)
60+
return_items[product_id] = quantity(product_id) + 1
61+
end
62+
63+
def decrease_quantity(product_id)
64+
return_items[product_id] -= 1
65+
return_items.delete(product_id) if quantity(product_id).equal?(0)
66+
end
67+
68+
def quantity(product_id)
69+
return_items[product_id]
70+
end
71+
end
72+
73+
Refund = Return
74+
RefundableProducts = ReturnableProducts if defined?(ReturnableProducts)
75+
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module Ordering
2+
class ReturnableProducts
3+
def call(event_store, order_id)
4+
accepted_event = event_store
5+
.read.backward
6+
.stream("Pricing::Offer$#{order_id}")
7+
.of_type(Pricing::OfferAccepted)
8+
.first
9+
10+
placed_event = event_store
11+
.read
12+
.stream("Fulfillment::Order$#{order_id}")
13+
.first
14+
15+
accepted_event.data.fetch(:order_lines) if placed_event
16+
end
17+
end
18+
19+
RefundableProducts = ReturnableProducts
20+
end

0 commit comments

Comments
 (0)