Skip to content

Commit bb16894

Browse files
committed
Added Evolve functions to Group Checkouts
1 parent 861a5af commit bb16894

3 files changed

Lines changed: 195 additions & 24 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
11
package io.eventdriven.distributedprocesses.core.collections;
22

3+
import java.util.Arrays;
4+
import java.util.Collection;
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
38
public final class CollectionsExtensions {
4-
public static <T> T[] toArray(T...elements){
9+
public static <T> T[] toArray(T... elements) {
510
return elements;
611
}
12+
13+
public static <K, V> Map<K, V> mapWith(Map<K, V> map, K key, V value) {
14+
var clone = new HashMap<>(map);
15+
16+
clone.replace(key, value);
17+
18+
return clone;
19+
}
20+
21+
public static <K, V> Map<K, V> mapWith(Map<K, V> map, Collection<K> keys, V value) {
22+
var clone = new HashMap<>(map);
23+
24+
for (var key : keys) {
25+
clone.replace(key, value);
26+
}
27+
28+
return clone;
29+
}
30+
31+
public static <K, V> boolean valueIs(Map<K, V> map, K key, V... values) {
32+
var existingValue = map.get(key);
33+
34+
return Arrays.stream(values)
35+
.filter(v -> v == existingValue)
36+
.findAny().isPresent();
37+
}
738
}

samples/distributed-processes/src/main/java/io/eventdriven/distributedprocesses/hotelmanagement/choreography/groupcheckout/GroupCheckout.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package io.eventdriven.distributedprocesses.hotelmanagement.choreography.groupcheckout;
22

3+
import java.util.Arrays;
4+
import java.util.HashMap;
35
import java.util.Map;
46
import java.util.UUID;
57

8+
import static io.eventdriven.distributedprocesses.core.collections.CollectionsExtensions.valueIs;
9+
import static java.util.stream.Collectors.toMap;
10+
import static io.eventdriven.distributedprocesses.hotelmanagement.choreography.groupcheckout.GroupCheckoutEvent.*;
11+
612
public sealed interface GroupCheckout {
713
record Initial() implements GroupCheckout {
814
}
@@ -29,4 +35,81 @@ enum CheckoutStatus {
2935
Completed,
3036
Failed
3137
}
38+
39+
static GroupCheckout evolve(GroupCheckout current, GroupCheckoutEvent event) {
40+
return switch (event) {
41+
case GroupCheckoutInitiated initiated: {
42+
if (!(current instanceof GroupCheckout.Initial))
43+
yield current;
44+
45+
yield new GroupCheckout.InProgress(
46+
initiated.groupCheckoutId(),
47+
Arrays.stream(initiated.guestStayAccountIds())
48+
.collect(toMap(key -> key, value -> GroupCheckout.CheckoutStatus.Initiated))
49+
);
50+
}
51+
case GuestCheckoutsStarted checkoutsStarted: {
52+
if (!(current instanceof GroupCheckout.InProgress inProgress))
53+
yield current;
54+
55+
var guestStayCheckouts = new HashMap<>(inProgress.guestStayCheckouts);
56+
57+
for (var guestStayAccountId : checkoutsStarted.guestStayAccountIds()) {
58+
if (valueIs(guestStayCheckouts, guestStayAccountId, GroupCheckout.CheckoutStatus.Initiated))
59+
guestStayCheckouts.replace(guestStayAccountId, GroupCheckout.CheckoutStatus.InProgress);
60+
}
61+
62+
yield new GroupCheckout.InProgress(
63+
inProgress.id(),
64+
guestStayCheckouts
65+
);
66+
}
67+
case GuestCheckoutCompleted checkoutCompleted: {
68+
if (!(current instanceof GroupCheckout.InProgress inProgress))
69+
yield current;
70+
71+
var guestStayCheckouts = new HashMap<>(inProgress.guestStayCheckouts);
72+
var guestStayAccountId = checkoutCompleted.guestStayAccountId();
73+
74+
if (valueIs(guestStayCheckouts, guestStayAccountId, GroupCheckout.CheckoutStatus.Initiated, GroupCheckout.CheckoutStatus.InProgress))
75+
guestStayCheckouts.replace(guestStayAccountId, GroupCheckout.CheckoutStatus.Completed);
76+
77+
yield new GroupCheckout.InProgress(
78+
inProgress.id(),
79+
guestStayCheckouts
80+
);
81+
}
82+
case GuestCheckoutFailed guestCheckoutFailed: {
83+
if (!(current instanceof GroupCheckout.InProgress inProgress))
84+
yield current;
85+
86+
var guestStayCheckouts = new HashMap<>(inProgress.guestStayCheckouts);
87+
var guestStayAccountId = guestCheckoutFailed.guestStayAccountId();
88+
89+
if (valueIs(guestStayCheckouts, guestStayAccountId, GroupCheckout.CheckoutStatus.Initiated, GroupCheckout.CheckoutStatus.InProgress))
90+
guestStayCheckouts.replace(guestStayAccountId, GroupCheckout.CheckoutStatus.Failed);
91+
92+
yield new GroupCheckout.InProgress(
93+
inProgress.id(),
94+
guestStayCheckouts
95+
);
96+
}
97+
case GroupCheckoutCompleted ignore: {
98+
if (!(current instanceof GroupCheckout.InProgress inProgress))
99+
yield current;
100+
101+
yield new GroupCheckout.Completed(
102+
inProgress.id()
103+
);
104+
}
105+
case GroupCheckoutFailed ignore: {
106+
if (!(current instanceof GroupCheckout.InProgress inProgress))
107+
yield current;
108+
109+
yield new GroupCheckout.Failed(
110+
inProgress.id()
111+
);
112+
}
113+
};
114+
}
32115
}
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package io.eventdriven.distributedprocesses.hotelmanagement.saga.groupcheckout;
22

3+
import java.util.Arrays;
4+
import java.util.HashMap;
35
import java.util.Map;
46
import java.util.UUID;
57

8+
import static io.eventdriven.distributedprocesses.core.collections.CollectionsExtensions.valueIs;
69
import static java.util.stream.Collectors.toMap;
10+
import static io.eventdriven.distributedprocesses.hotelmanagement.saga.groupcheckout.GroupCheckoutEvent.*;
711

812
public sealed interface GroupCheckout {
913
record Initial() implements GroupCheckout {
@@ -32,27 +36,80 @@ enum CheckoutStatus {
3236
Failed
3337
}
3438

35-
// public void when(GroupCheckoutEvent event) {
36-
// switch (event) {
37-
// case GroupCheckoutEvent.GroupCheckoutInitiated checkoutInitiated -> {
38-
// id = checkoutInitiated.groupCheckoutId();
39-
// guestStayCheckouts = Arrays.stream(checkoutInitiated.guestStayAccountIds())
40-
// .collect(toMap(key -> key, value -> CheckoutStatus.Pending));
41-
// status = CheckoutStatus.Pending;
42-
// }
43-
// case GroupCheckoutEvent.GuestCheckoutsInitiated guestCheckoutInitiated -> {
44-
// for (var guestStayCheckoutId : guestCheckoutInitiated.guestStayAccountIds()) {
45-
// guestStayCheckouts.replace(guestStayCheckoutId, CheckoutStatus.Initiated);
46-
// }
47-
// }
48-
// case GroupCheckoutEvent.GuestCheckoutCompleted guestCheckoutCompleted ->
49-
// guestStayCheckouts.replace(guestCheckoutCompleted.guestStayAccountId(), CheckoutStatus.Completed);
50-
// case GroupCheckoutEvent.GuestCheckoutFailed guestCheckoutFailed ->
51-
// guestStayCheckouts.replace(guestCheckoutFailed.guestStayAccountId(), CheckoutStatus.Failed);
52-
// case GroupCheckoutEvent.GroupCheckoutCompleted groupCheckoutCompleted ->
53-
// status = CheckoutStatus.Completed;
54-
// case GroupCheckoutEvent.GroupCheckoutFailed groupCheckoutFailed ->
55-
// status = CheckoutStatus.Failed;
56-
// }
57-
// }
39+
static GroupCheckout evolve(GroupCheckout current, GroupCheckoutEvent event) {
40+
return switch (event) {
41+
case GroupCheckoutInitiated initiated: {
42+
if (!(current instanceof Initial))
43+
yield current;
44+
45+
yield new InProgress(
46+
initiated.groupCheckoutId(),
47+
Arrays.stream(initiated.guestStayAccountIds())
48+
.collect(toMap(key -> key, value -> CheckoutStatus.Initiated))
49+
);
50+
}
51+
case GuestCheckoutsStarted checkoutsStarted: {
52+
if (!(current instanceof InProgress inProgress))
53+
yield current;
54+
55+
var guestStayCheckouts = new HashMap<>(inProgress.guestStayCheckouts);
56+
57+
for (var guestStayAccountId : checkoutsStarted.guestStayAccountIds()) {
58+
if (valueIs(guestStayCheckouts, guestStayAccountId, CheckoutStatus.Initiated))
59+
guestStayCheckouts.replace(guestStayAccountId, CheckoutStatus.InProgress);
60+
}
61+
62+
yield new InProgress(
63+
inProgress.id(),
64+
guestStayCheckouts
65+
);
66+
}
67+
case GuestCheckoutCompleted checkoutCompleted: {
68+
if (!(current instanceof InProgress inProgress))
69+
yield current;
70+
71+
var guestStayCheckouts = new HashMap<>(inProgress.guestStayCheckouts);
72+
var guestStayAccountId = checkoutCompleted.guestStayAccountId();
73+
74+
if (valueIs(guestStayCheckouts, guestStayAccountId, CheckoutStatus.Initiated, CheckoutStatus.InProgress))
75+
guestStayCheckouts.replace(guestStayAccountId, CheckoutStatus.Completed);
76+
77+
yield new InProgress(
78+
inProgress.id(),
79+
guestStayCheckouts
80+
);
81+
}
82+
case GuestCheckoutFailed guestCheckoutFailed: {
83+
if (!(current instanceof InProgress inProgress))
84+
yield current;
85+
86+
var guestStayCheckouts = new HashMap<>(inProgress.guestStayCheckouts);
87+
var guestStayAccountId = guestCheckoutFailed.guestStayAccountId();
88+
89+
if (valueIs(guestStayCheckouts, guestStayAccountId, CheckoutStatus.Initiated, CheckoutStatus.InProgress))
90+
guestStayCheckouts.replace(guestStayAccountId, CheckoutStatus.Failed);
91+
92+
yield new InProgress(
93+
inProgress.id(),
94+
guestStayCheckouts
95+
);
96+
}
97+
case GroupCheckoutCompleted ignore: {
98+
if (!(current instanceof InProgress inProgress))
99+
yield current;
100+
101+
yield new Completed(
102+
inProgress.id()
103+
);
104+
}
105+
case GroupCheckoutFailed ignore: {
106+
if (!(current instanceof InProgress inProgress))
107+
yield current;
108+
109+
yield new Failed(
110+
inProgress.id()
111+
);
112+
}
113+
};
114+
}
58115
}

0 commit comments

Comments
 (0)