Skip to content

Commit 701d8f0

Browse files
committed
Add PreserveTypes to the pipeline to handle key symbolization.
- use PreserveTypes transformation with the same types config standard JSONClient uses - make PreserveTypes run before RefundToReturnEventMapper to allow it to symbolize old keys because old key names are stored in metadata PreserveTypes uses - run RefundToReturnEventMapper and transform payload using already symbolized keys
1 parent 8ae04d5 commit 701d8f0

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

infra/lib/infra/event_store.rb

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ def self.main
44
require_relative "../../../rails_application/lib/transformations/refund_to_return_event_mapper" rescue nil
55

66
begin
7+
preserve_types = create_standard_preserve_types
8+
79
mapper = RubyEventStore::Mappers::PipelineMapper.new(
810
RubyEventStore::Mappers::Pipeline.new(
11+
preserve_types,
912
Transformations::RefundToReturnEventMapper.new(
1013
'Ordering::DraftRefundCreated' => 'Ordering::DraftReturnCreated',
1114
'Ordering::ItemAddedToRefund' => 'Ordering::ItemAddedToReturn',
@@ -52,5 +55,55 @@ def link_event_to_stream(event, stream, expected_version: :any)
5255
)
5356
end
5457

58+
private
59+
60+
def self.create_standard_preserve_types
61+
preserve_types = RubyEventStore::Mappers::Transformation::PreserveTypes.new
62+
63+
types_config = {
64+
Symbol => {
65+
serializer: ->(v) { v.to_s },
66+
deserializer: ->(v) { v.to_sym }
67+
},
68+
Time => {
69+
serializer: ->(v) { v.iso8601(RubyEventStore::TIMESTAMP_PRECISION) },
70+
deserializer: ->(v) { Time.iso8601(v) }
71+
},
72+
Date => {
73+
serializer: ->(v) { v.iso8601 },
74+
deserializer: ->(v) { Date.iso8601(v) }
75+
},
76+
DateTime => {
77+
serializer: ->(v) { v.iso8601 },
78+
deserializer: ->(v) { DateTime.iso8601(v) }
79+
},
80+
BigDecimal => {
81+
serializer: ->(v) { v.to_s },
82+
deserializer: ->(v) { BigDecimal(v) }
83+
}
84+
}
85+
86+
if defined?(ActiveSupport::TimeWithZone)
87+
types_config[ActiveSupport::TimeWithZone] = {
88+
serializer: ->(v) { v.iso8601(RubyEventStore::TIMESTAMP_PRECISION) },
89+
deserializer: ->(v) { Time.iso8601(v).in_time_zone },
90+
stored_type: ->(*) { "ActiveSupport::TimeWithZone" }
91+
}
92+
end
93+
94+
if defined?(OpenStruct)
95+
types_config[OpenStruct] = {
96+
serializer: ->(v) { v.to_h },
97+
deserializer: ->(v) { OpenStruct.new(v) }
98+
}
99+
end
100+
101+
types_config.each do |type, config|
102+
preserve_types.register(type, **config)
103+
end
104+
105+
preserve_types
106+
end
107+
55108
end
56109
end

rails_application/lib/transformations/refund_to_return_event_mapper.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ def load(record)
3232
def transform_payload(data, old_class_name)
3333
case old_class_name
3434
when 'Ordering::DraftRefundCreated'
35-
data = transform_refund_to_return_payload(data, "refund_id", "return_id")
36-
transform_refund_to_return_payload(data, "refundable_products", "returnable_products")
35+
data = transform_refund_to_return_payload(data, :refund_id, :return_id)
36+
transform_refund_to_return_payload(data, :refundable_products, :returnable_products)
3737
when 'Ordering::ItemAddedToRefund', 'Ordering::ItemRemovedFromRefund'
38-
transform_refund_to_return_payload(data, "refund_id", "return_id")
38+
transform_refund_to_return_payload(data, :refund_id, :return_id)
3939
else
4040
data
4141
end

0 commit comments

Comments
 (0)