@reventlessdev/online-shop-aggregates-ordering 3.0.0-alpha.237 → 3.0.0-alpha.239
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/lib/bs/.compiler.log +2 -2
- package/lib/bs/compiler-info.json +1 -1
- package/lib/bs/src/CatalogProduct/Aggregate/CatalogProduct-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/CatalogProduct/Aggregate/CatalogProduct-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/CatalogProduct/Aggregate/CatalogProduct_Behavior-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/CatalogProduct/Aggregate/CatalogProduct_Behavior-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/CatalogProduct/ReadModel/AvailableProducts-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/CatalogProduct/ReadModel/AvailableProducts-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/CatalogProduct/ReadModel/AvailableProducts.res +0 -1
- package/lib/bs/src/CatalogProduct/ReadModel/AvailableProducts_Projections-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/CatalogProduct/ReadModel/AvailableProducts_Projections-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/CatalogProduct/ReadModel/AvailableProducts_Projections.ast +0 -0
- package/lib/bs/src/CatalogProduct/ReadModel/AvailableProducts_Projections.res +2 -4
- package/lib/bs/src/Customer/Aggregate/Customer-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Customer/Aggregate/Customer-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Customer/Aggregate/Customer_Behavior-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Customer/Aggregate/Customer_Behavior-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Customer/ReadModel/Customers-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Customer/ReadModel/Customers-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Customer/ReadModel/Customers.res +0 -1
- package/lib/bs/src/Customer/ReadModel/Customers_Projections-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Customer/ReadModel/Customers_Projections-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Customer/ReadModel/Customers_Projections.ast +0 -0
- package/lib/bs/src/Customer/ReadModel/Customers_Projections.res +1 -2
- package/lib/bs/src/Extension/Products_Extension-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Extension/Products_Extension-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/ExtensionPoint/Orders_ExtensionPointMapping-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/ExtensionPoint/Orders_ExtensionPointMapping-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/ExtensionPoint/Orders_ExtensionPointMapping.ast +0 -0
- package/lib/bs/src/ExtensionPoint/Orders_ExtensionPointMapping.res +11 -14
- package/lib/bs/src/LifecycleModel-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/LifecycleModel-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/LifecycleModel.ast +0 -0
- package/lib/bs/src/LifecycleModel.res +28 -4
- package/lib/bs/src/Order/Aggregate/Order-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Order/Aggregate/Order-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Order/Aggregate/Order_Behavior-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Order/Aggregate/Order_Behavior-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Order/Aggregate/Order_Behavior.ast +0 -0
- package/lib/bs/src/Order/Aggregate/Order_Behavior.res +1 -2
- package/lib/bs/src/Order/Aggregate/Order_Mappings-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Order/Aggregate/Order_Mappings-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Order/ReadModel/Orders-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Order/ReadModel/Orders-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Order/ReadModel/Orders.res +0 -1
- package/lib/bs/src/Order/ReadModel/Orders_Projections-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Order/ReadModel/Orders_Projections-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Order/ReadModel/Orders_Projections.ast +0 -0
- package/lib/bs/src/Order/ReadModel/Orders_Projections.res +4 -7
- package/lib/bs/src/Order/SideEffect/Order_EmailNotification-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Order/SideEffect/Order_EmailNotification-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Order/SideEffect/Order_EmailNotification.ast +0 -0
- package/lib/bs/src/Order/SideEffect/Order_EmailNotification.res +1 -4
- package/lib/bs/src/Plugin-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Plugin-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Plugin.ast +0 -0
- package/lib/bs/src/Plugin.res +34 -12
- package/lib/bs/src/Task/OrderNotifications-OrderingPlugin.cmi +0 -0
- package/lib/bs/src/Task/OrderNotifications-OrderingPlugin.cmt +0 -0
- package/lib/bs/src/Task/OrderNotifications.ast +0 -0
- package/lib/bs/src/Task/OrderNotifications.res +1 -1
- package/lib/bs/tests/CatalogProduct/Aggregate/CatalogProduct_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/CatalogProduct/Aggregate/CatalogProduct_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/CatalogProduct/ReadModel/AvailableProducts_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/CatalogProduct/ReadModel/AvailableProducts_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/Customer/Aggregate/Customer_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Customer/Aggregate/Customer_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/Customer/Aggregate/Customer_GWT.ast +0 -0
- package/lib/bs/tests/Customer/Aggregate/Customer_GWT.res +3 -12
- package/lib/bs/tests/Customer/ReadModel/Customers_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Customer/ReadModel/Customers_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/Extension/Products_Extension_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Extension/Products_Extension_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/ExtensionPoint/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/ExtensionPoint/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/ExtensionPoint/Orders_ExtensionPointMapping_GWT.ast +0 -0
- package/lib/bs/tests/ExtensionPoint/Orders_ExtensionPointMapping_GWT.res +3 -9
- package/lib/bs/tests/Order/Aggregate/OrderMappings_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Order/Aggregate/OrderMappings_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/Order/Aggregate/OrderMappings_GWT.ast +0 -0
- package/lib/bs/tests/Order/Aggregate/OrderMappings_GWT.res +1 -3
- package/lib/bs/tests/Order/Aggregate/Order_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Order/Aggregate/Order_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/Order/ReadModel/Orders_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Order/ReadModel/Orders_GWT-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/Order/SideEffect/EmailService_Mock-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Order/SideEffect/EmailService_Mock-OrderingPlugin.cmt +0 -0
- package/lib/bs/tests/Order/SideEffect/Order_EmailNotification_GWT-OrderingPlugin.cmi +0 -0
- package/lib/bs/tests/Order/SideEffect/Order_EmailNotification_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/.compiler.log +2 -2
- package/lib/ocaml/AvailableProducts-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/AvailableProducts-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/AvailableProducts.res +0 -1
- package/lib/ocaml/AvailableProducts_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/AvailableProducts_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/AvailableProducts_Projections-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/AvailableProducts_Projections-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/AvailableProducts_Projections.ast +0 -0
- package/lib/ocaml/AvailableProducts_Projections.res +2 -4
- package/lib/ocaml/CatalogProduct-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/CatalogProduct-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/CatalogProduct_Behavior-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/CatalogProduct_Behavior-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/CatalogProduct_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/CatalogProduct_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Customer-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Customer-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Customer_Behavior-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Customer_Behavior-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Customer_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Customer_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Customer_GWT.ast +0 -0
- package/lib/ocaml/Customer_GWT.res +3 -12
- package/lib/ocaml/Customers-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Customers-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Customers.res +0 -1
- package/lib/ocaml/Customers_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Customers_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Customers_Projections-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Customers_Projections-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Customers_Projections.ast +0 -0
- package/lib/ocaml/Customers_Projections.res +1 -2
- package/lib/ocaml/EmailService_Mock-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/EmailService_Mock-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/LifecycleModel-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/LifecycleModel-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/LifecycleModel.ast +0 -0
- package/lib/ocaml/LifecycleModel.res +28 -4
- package/lib/ocaml/Order-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Order-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/OrderMappings_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/OrderMappings_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/OrderMappings_GWT.ast +0 -0
- package/lib/ocaml/OrderMappings_GWT.res +1 -3
- package/lib/ocaml/OrderNotifications-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/OrderNotifications-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/OrderNotifications.ast +0 -0
- package/lib/ocaml/OrderNotifications.res +1 -1
- package/lib/ocaml/Order_Behavior-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Order_Behavior-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Order_Behavior.ast +0 -0
- package/lib/ocaml/Order_Behavior.res +1 -2
- package/lib/ocaml/Order_EmailNotification-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Order_EmailNotification-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Order_EmailNotification.ast +0 -0
- package/lib/ocaml/Order_EmailNotification.res +1 -4
- package/lib/ocaml/Order_EmailNotification_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Order_EmailNotification_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Order_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Order_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Order_Mappings-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Order_Mappings-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Orders-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Orders-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Orders.res +0 -1
- package/lib/ocaml/Orders_ExtensionPointMapping-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Orders_ExtensionPointMapping-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Orders_ExtensionPointMapping.ast +0 -0
- package/lib/ocaml/Orders_ExtensionPointMapping.res +11 -14
- package/lib/ocaml/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Orders_ExtensionPointMapping_GWT.ast +0 -0
- package/lib/ocaml/Orders_ExtensionPointMapping_GWT.res +3 -9
- package/lib/ocaml/Orders_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Orders_GWT-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Orders_Projections-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Orders_Projections-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Orders_Projections.ast +0 -0
- package/lib/ocaml/Orders_Projections.res +4 -7
- package/lib/ocaml/Plugin-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Plugin-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Plugin.ast +0 -0
- package/lib/ocaml/Plugin.res +34 -12
- package/lib/ocaml/Products_Extension-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Products_Extension-OrderingPlugin.cmt +0 -0
- package/lib/ocaml/Products_Extension_GWT-OrderingPlugin.cmi +0 -0
- package/lib/ocaml/Products_Extension_GWT-OrderingPlugin.cmt +0 -0
- package/package.json +9 -9
- package/src/CatalogProduct/ReadModel/AvailableProducts.res +0 -1
- package/src/CatalogProduct/ReadModel/AvailableProducts_Projections.res +2 -4
- package/src/Customer/ReadModel/Customers.res +0 -1
- package/src/Customer/ReadModel/Customers_Projections.res +1 -2
- package/src/ExtensionPoint/Orders_ExtensionPointMapping.res +11 -14
- package/src/LifecycleModel.res +28 -4
- package/src/Order/Aggregate/Order_Behavior.res +1 -2
- package/src/Order/ReadModel/Orders.res +0 -1
- package/src/Order/ReadModel/Orders_Projections.res +4 -7
- package/src/Order/SideEffect/Order_EmailNotification.res +1 -4
- package/src/Plugin.res +34 -12
- package/src/Task/OrderNotifications.res +1 -1
- package/tests/Customer/Aggregate/Customer_GWT.res +3 -12
- package/tests/ExtensionPoint/Orders_ExtensionPointMapping_GWT.res +3 -9
- package/tests/Order/Aggregate/OrderMappings_GWT.res +1 -3
|
Binary file
|
|
@@ -14,10 +14,7 @@ describe("Customer Behavior", () => {
|
|
|
14
14
|
)
|
|
15
15
|
|
|
16
16
|
test("Register on deactivated aggregate returns CustomerAlreadyDeactivated", () =>
|
|
17
|
-
givenEvents([
|
|
18
|
-
Registered({email: "alice@example.com", address: "123 Main St"}),
|
|
19
|
-
Deactivated,
|
|
20
|
-
])
|
|
17
|
+
givenEvents([Registered({email: "alice@example.com", address: "123 Main St"}), Deactivated])
|
|
21
18
|
->whenCmd(Register({email: "bob@example.com", address: "456 Oak Ave"}))
|
|
22
19
|
->thenError(CustomerAlreadyDeactivated)
|
|
23
20
|
)
|
|
@@ -41,10 +38,7 @@ describe("Customer Behavior", () => {
|
|
|
41
38
|
)
|
|
42
39
|
|
|
43
40
|
test("UpdateEmail on deactivated customer returns CustomerAlreadyDeactivated", () =>
|
|
44
|
-
givenEvents([
|
|
45
|
-
Registered({email: "alice@example.com", address: "123 Main St"}),
|
|
46
|
-
Deactivated,
|
|
47
|
-
])
|
|
41
|
+
givenEvents([Registered({email: "alice@example.com", address: "123 Main St"}), Deactivated])
|
|
48
42
|
->whenCmd(UpdateEmail({email: "bob@example.com"}))
|
|
49
43
|
->thenError(CustomerAlreadyDeactivated)
|
|
50
44
|
)
|
|
@@ -80,10 +74,7 @@ describe("Customer Behavior", () => {
|
|
|
80
74
|
)
|
|
81
75
|
|
|
82
76
|
test("Deactivate on deactivated customer produces no events (idempotent)", () =>
|
|
83
|
-
givenEvents([
|
|
84
|
-
Registered({email: "alice@example.com", address: "123 Main St"}),
|
|
85
|
-
Deactivated,
|
|
86
|
-
])
|
|
77
|
+
givenEvents([Registered({email: "alice@example.com", address: "123 Main St"}), Deactivated])
|
|
87
78
|
->whenCmd(Deactivate)
|
|
88
79
|
->thenNoEvent
|
|
89
80
|
)
|
|
Binary file
|
|
Binary file
|
package/lib/ocaml/Customers.res
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -9,8 +9,7 @@ module CustomerMapping = Mapping.Make(
|
|
|
9
9
|
open Customer
|
|
10
10
|
let project = ({event, id, _}) =>
|
|
11
11
|
switch event {
|
|
12
|
-
| Registered({email, address}) =>
|
|
13
|
-
Set(id, {Customers.email: email, address, deactivated: false})
|
|
12
|
+
| Registered({email, address}) => Set(id, {Customers.email, address, deactivated: false})
|
|
14
13
|
| EmailUpdated({email}) => Update(id, state => {...state, email})
|
|
15
14
|
| AddressUpdated({address}) => Update(id, state => {...state, address})
|
|
16
15
|
| Deactivated => Update(id, state => {...state, deactivated: true})
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -7,8 +7,32 @@
|
|
|
7
7
|
// annotation where it is silent.
|
|
8
8
|
|
|
9
9
|
let model: array<Reventless.Plugin.derivedEdge> = [
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
{
|
|
11
|
+
component: "Order",
|
|
12
|
+
command: "Cancel",
|
|
13
|
+
level: Reventless.Plugin.Instance,
|
|
14
|
+
allowedStates: ["Placed"],
|
|
15
|
+
targets: ["Cancelled"],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
component: "Order",
|
|
19
|
+
command: "Place",
|
|
20
|
+
level: Reventless.Plugin.Collection,
|
|
21
|
+
allowedStates: [],
|
|
22
|
+
targets: ["Placed"],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
component: "Order",
|
|
26
|
+
command: "Refund",
|
|
27
|
+
level: Reventless.Plugin.Instance,
|
|
28
|
+
allowedStates: ["Cancelled"],
|
|
29
|
+
targets: ["Refunded"],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
component: "Order",
|
|
33
|
+
command: "Ship",
|
|
34
|
+
level: Reventless.Plugin.Instance,
|
|
35
|
+
allowedStates: ["Placed"],
|
|
36
|
+
targets: ["Shipped"],
|
|
37
|
+
},
|
|
14
38
|
]
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -43,9 +43,7 @@ describe("Order auto-ship mapping (Placed → Ship)", () => {
|
|
|
43
43
|
|
|
44
44
|
test("Refund command does not fire the mapping (only Placed events do)", () =>
|
|
45
45
|
givenSourceEvents([placedEvent, Order.Cancelled({productIds: ["prod-1"]})])
|
|
46
|
-
->andTargetEvents([
|
|
47
|
-
("order-1", [placedEvent, Order.Cancelled({productIds: ["prod-1"]})]),
|
|
48
|
-
])
|
|
46
|
+
->andTargetEvents([("order-1", [placedEvent, Order.Cancelled({productIds: ["prod-1"]})])])
|
|
49
47
|
->whenSourceCmd("order-1", Refund({reason: "customer-changed-mind"}))
|
|
50
48
|
->thenNoTargetEvent
|
|
51
49
|
)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -29,8 +29,7 @@ let evolve = (state, event) =>
|
|
|
29
29
|
|
|
30
30
|
let decide = (state, command) =>
|
|
31
31
|
switch (state, command) {
|
|
32
|
-
| (NotCreated, Place({customerId, productIds})) =>
|
|
33
|
-
Ok([Order.Placed({customerId, productIds})])
|
|
32
|
+
| (NotCreated, Place({customerId, productIds})) => Ok([Order.Placed({customerId, productIds})])
|
|
34
33
|
| (NotCreated, Ship) => Error(OrderNotFound)
|
|
35
34
|
| (NotCreated, Cancel) => Error(OrderNotFound)
|
|
36
35
|
| (NotCreated, Refund(_)) => Error(OrderNotFound)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -10,9 +10,6 @@ module Source = {
|
|
|
10
10
|
let execute = async (orderId, _meta, event, _queryEngine) =>
|
|
11
11
|
switch event {
|
|
12
12
|
| Order.Placed({customerId}) =>
|
|
13
|
-
await EmailService.sendOrderConfirmation(
|
|
14
|
-
~email=customerId,
|
|
15
|
-
~orderId=orderId->Order.Id.toString,
|
|
16
|
-
)
|
|
13
|
+
await EmailService.sendOrderConfirmation(~email=customerId, ~orderId=orderId->Order.Id.toString)
|
|
17
14
|
| _ => ()
|
|
18
15
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/ocaml/Orders.res
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -7,22 +7,19 @@ module Delegate = Order
|
|
|
7
7
|
|
|
8
8
|
let mapIncomingCommand = (_id, _command, _meta) => []
|
|
9
9
|
|
|
10
|
-
let mapOutgoingEvent = Some(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
PublishEvent(
|
|
10
|
+
let mapOutgoingEvent = Some(
|
|
11
|
+
(_id, event, _meta, _queryEngine) =>
|
|
12
|
+
switch event {
|
|
13
|
+
| Order.Placed({customerId, productIds}) =>
|
|
14
|
+
productIds->Array.map(productId => PublishEvent(
|
|
15
15
|
productId,
|
|
16
16
|
OrderingSpec.Orders_ExtensionPoint.ItemOrdered({productId, orderId: _id, customerId}),
|
|
17
|
-
)
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
productIds->Array.map(productId =>
|
|
21
|
-
PublishEvent(
|
|
17
|
+
))
|
|
18
|
+
| Order.Cancelled({productIds}) =>
|
|
19
|
+
productIds->Array.map(productId => PublishEvent(
|
|
22
20
|
productId,
|
|
23
21
|
OrderingSpec.Orders_ExtensionPoint.ItemOrderCancelled({productId, orderId: _id}),
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
22
|
+
))
|
|
23
|
+
| _ => []
|
|
24
|
+
},
|
|
28
25
|
)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -13,21 +13,15 @@ describe("Orders ExtensionPoint mapping — per-product fan-out", () => {
|
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
test("Cancelled fans out to one ItemOrderCancelled per product", () =>
|
|
16
|
-
whenDelegateEvent(
|
|
17
|
-
Delegate.Cancelled({productIds: ["p1", "p2"]}),
|
|
18
|
-
)->thenPublishesEvents([
|
|
16
|
+
whenDelegateEvent(Delegate.Cancelled({productIds: ["p1", "p2"]}))->thenPublishesEvents([
|
|
19
17
|
("p1", ExtensionPoint.ItemOrderCancelled({productId: "p1", orderId: "gwt-id"})),
|
|
20
18
|
("p2", ExtensionPoint.ItemOrderCancelled({productId: "p2", orderId: "gwt-id"})),
|
|
21
19
|
])
|
|
22
20
|
)
|
|
23
21
|
|
|
24
|
-
test("Shipped publishes nothing", () =>
|
|
25
|
-
whenDelegateEvent(Delegate.Shipped)->thenPublishesNothing
|
|
26
|
-
)
|
|
22
|
+
test("Shipped publishes nothing", () => whenDelegateEvent(Delegate.Shipped)->thenPublishesNothing)
|
|
27
23
|
|
|
28
24
|
test("Refunded publishes nothing", () =>
|
|
29
|
-
whenDelegateEvent(
|
|
30
|
-
Delegate.Refunded({reason: "customer-changed-mind"}),
|
|
31
|
-
)->thenPublishesNothing
|
|
25
|
+
whenDelegateEvent(Delegate.Refunded({reason: "customer-changed-mind"}))->thenPublishesNothing
|
|
32
26
|
)
|
|
33
27
|
})
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -13,17 +13,14 @@ module OrderMapping = Mapping.Make(
|
|
|
13
13
|
Set(
|
|
14
14
|
id,
|
|
15
15
|
{
|
|
16
|
-
Orders.customerId
|
|
16
|
+
Orders.customerId,
|
|
17
17
|
productIds,
|
|
18
18
|
lifecycle: (Placed: Orders.lifecycle),
|
|
19
19
|
},
|
|
20
20
|
)
|
|
21
|
-
| Shipped =>
|
|
22
|
-
|
|
23
|
-
|
|
|
24
|
-
Update(id, state => {...state, lifecycle: (Cancelled: Orders.lifecycle)})
|
|
25
|
-
| Refunded(_) =>
|
|
26
|
-
Update(id, state => {...state, lifecycle: (Refunded: Orders.lifecycle)})
|
|
21
|
+
| Shipped => Update(id, state => {...state, lifecycle: (Shipped: Orders.lifecycle)})
|
|
22
|
+
| Cancelled(_) => Update(id, state => {...state, lifecycle: (Cancelled: Orders.lifecycle)})
|
|
23
|
+
| Refunded(_) => Update(id, state => {...state, lifecycle: (Refunded: Orders.lifecycle)})
|
|
27
24
|
}
|
|
28
25
|
},
|
|
29
26
|
)
|
|
Binary file
|
|
Binary file
|
package/lib/ocaml/Plugin.ast
CHANGED
|
Binary file
|
package/lib/ocaml/Plugin.res
CHANGED
|
@@ -14,14 +14,13 @@ module Make = (Platform: ReventlessInfra.Platform.T) => {
|
|
|
14
14
|
Customer_Behavior,
|
|
15
15
|
ReventlessInfra.NoEventMappings.Make(Customer),
|
|
16
16
|
)
|
|
17
|
-
module OrderAggregate = Platform.Aggregate.Make(
|
|
18
|
-
Order,
|
|
19
|
-
Order_Behavior,
|
|
20
|
-
Order_Mappings,
|
|
21
|
-
)
|
|
17
|
+
module OrderAggregate = Platform.Aggregate.Make(Order, Order_Behavior, Order_Mappings)
|
|
22
18
|
|
|
23
19
|
// ReadModels
|
|
24
|
-
module AvailableProductsReadModel = Platform.ReadModel.Make(
|
|
20
|
+
module AvailableProductsReadModel = Platform.ReadModel.Make(
|
|
21
|
+
AvailableProducts,
|
|
22
|
+
AvailableProducts_Projections,
|
|
23
|
+
)
|
|
25
24
|
module CustomersReadModel = Platform.ReadModel.Make(Customers, Customers_Projections)
|
|
26
25
|
module OrdersReadModel = Platform.ReadModel.Make(Orders, Orders_Projections)
|
|
27
26
|
|
|
@@ -36,11 +35,26 @@ module Make = (Platform: ReventlessInfra.Platform.T) => {
|
|
|
36
35
|
|
|
37
36
|
let pluginStructure = Platform.Plugin.makePluginDefinition(
|
|
38
37
|
~name="Ordering",
|
|
39
|
-
~aggregates=[
|
|
40
|
-
|
|
38
|
+
~aggregates=[
|
|
39
|
+
module(CatalogProductAggregate),
|
|
40
|
+
module(CustomerAggregate),
|
|
41
|
+
module(OrderAggregate),
|
|
42
|
+
],
|
|
43
|
+
~readModels=[
|
|
44
|
+
module(AvailableProductsReadModel),
|
|
45
|
+
module(CustomersReadModel),
|
|
46
|
+
module(OrdersReadModel),
|
|
47
|
+
],
|
|
41
48
|
~extensions=[module(Products_Extension)],
|
|
42
49
|
~extensionPoints=[module(Orders_ExtensionPointMapping)],
|
|
43
|
-
~componentChapters=Dict.fromArray([
|
|
50
|
+
~componentChapters=Dict.fromArray([
|
|
51
|
+
("AvailableProducts", "CatalogProduct"),
|
|
52
|
+
("CatalogProduct", "CatalogProduct"),
|
|
53
|
+
("Customer", "Customer"),
|
|
54
|
+
("Customers", "Customer"),
|
|
55
|
+
("Order", "Order"),
|
|
56
|
+
("Orders", "Order"),
|
|
57
|
+
]),
|
|
44
58
|
~lifecycleModel=LifecycleModel.model,
|
|
45
59
|
)
|
|
46
60
|
|
|
@@ -50,10 +64,18 @@ module Make = (Platform: ReventlessInfra.Platform.T) => {
|
|
|
50
64
|
~heartbeatInterval=5,
|
|
51
65
|
~extensionPoints=[module(Orders_ExtensionPoint)],
|
|
52
66
|
~extensions=[module(Products_Extension)],
|
|
53
|
-
~aggregates=[
|
|
54
|
-
|
|
67
|
+
~aggregates=[
|
|
68
|
+
module(CatalogProductAggregate),
|
|
69
|
+
module(CustomerAggregate),
|
|
70
|
+
module(OrderAggregate),
|
|
71
|
+
],
|
|
72
|
+
~readModels=[
|
|
73
|
+
module(AvailableProductsReadModel),
|
|
74
|
+
module(CustomersReadModel),
|
|
75
|
+
module(OrdersReadModel),
|
|
76
|
+
],
|
|
55
77
|
~tasks=[module(OrderNotificationsTask)],
|
|
56
|
-
~pluginStructure
|
|
78
|
+
~pluginStructure,
|
|
57
79
|
~uiFragments=?uiBundleUrl->Option.map(url =>
|
|
58
80
|
Platform.Plugin.makeAutoUIManifest(
|
|
59
81
|
~remoteEntryUrl=url,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reventlessdev/online-shop-aggregates-ordering",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.239",
|
|
4
4
|
"description": "Online Shop example — Ordering plugin (Customer & Order aggregates)",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"jest": {
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"sury": "11.0.0-rc.2",
|
|
24
|
-
"@reventlessdev/online-shop-aggregates-catalog-spec": "3.0.0-alpha.
|
|
25
|
-
"@reventlessdev/online-shop-aggregates-ordering-spec": "3.0.0-alpha.
|
|
26
|
-
"@reventlessdev/
|
|
27
|
-
"@reventlessdev/reventless-
|
|
28
|
-
"@reventlessdev/
|
|
29
|
-
"@reventlessdev/reventless-local": "3.0.0-alpha.
|
|
30
|
-
"@reventlessdev/reventless-spec": "3.0.0-alpha.
|
|
24
|
+
"@reventlessdev/online-shop-aggregates-catalog-spec": "3.0.0-alpha.133",
|
|
25
|
+
"@reventlessdev/online-shop-aggregates-ordering-spec": "3.0.0-alpha.133",
|
|
26
|
+
"@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.20",
|
|
27
|
+
"@reventlessdev/reventless-gwt": "1.0.0-alpha.208",
|
|
28
|
+
"@reventlessdev/reventless-infra": "3.0.0-alpha.162",
|
|
29
|
+
"@reventlessdev/reventless-local": "3.0.0-alpha.250",
|
|
30
|
+
"@reventlessdev/reventless-spec": "3.0.0-alpha.134"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"rescript": "12.3.0",
|
|
34
34
|
"sury-ppx": "11.0.0-rc.2",
|
|
35
|
-
"@reventlessdev/reventless-ppx": "1.0.0-alpha.
|
|
35
|
+
"@reventlessdev/reventless-ppx": "1.0.0-alpha.80"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"rescript": "12.3.0"
|
|
@@ -9,10 +9,8 @@ module CatalogProductMapping = Mapping.Make(
|
|
|
9
9
|
open CatalogProduct
|
|
10
10
|
let project = ({event, id, _}) =>
|
|
11
11
|
switch event {
|
|
12
|
-
| Synced({name, price}) =>
|
|
13
|
-
|
|
14
|
-
| PriceUpdated({price}) =>
|
|
15
|
-
Update(id, state => {...state, price})
|
|
12
|
+
| Synced({name, price}) => Set(id, {AvailableProducts.name, price})
|
|
13
|
+
| PriceUpdated({price}) => Update(id, state => {...state, price})
|
|
16
14
|
}
|
|
17
15
|
},
|
|
18
16
|
)
|
|
@@ -9,8 +9,7 @@ module CustomerMapping = Mapping.Make(
|
|
|
9
9
|
open Customer
|
|
10
10
|
let project = ({event, id, _}) =>
|
|
11
11
|
switch event {
|
|
12
|
-
| Registered({email, address}) =>
|
|
13
|
-
Set(id, {Customers.email: email, address, deactivated: false})
|
|
12
|
+
| Registered({email, address}) => Set(id, {Customers.email, address, deactivated: false})
|
|
14
13
|
| EmailUpdated({email}) => Update(id, state => {...state, email})
|
|
15
14
|
| AddressUpdated({address}) => Update(id, state => {...state, address})
|
|
16
15
|
| Deactivated => Update(id, state => {...state, deactivated: true})
|
|
@@ -7,22 +7,19 @@ module Delegate = Order
|
|
|
7
7
|
|
|
8
8
|
let mapIncomingCommand = (_id, _command, _meta) => []
|
|
9
9
|
|
|
10
|
-
let mapOutgoingEvent = Some(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
PublishEvent(
|
|
10
|
+
let mapOutgoingEvent = Some(
|
|
11
|
+
(_id, event, _meta, _queryEngine) =>
|
|
12
|
+
switch event {
|
|
13
|
+
| Order.Placed({customerId, productIds}) =>
|
|
14
|
+
productIds->Array.map(productId => PublishEvent(
|
|
15
15
|
productId,
|
|
16
16
|
OrderingSpec.Orders_ExtensionPoint.ItemOrdered({productId, orderId: _id, customerId}),
|
|
17
|
-
)
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
productIds->Array.map(productId =>
|
|
21
|
-
PublishEvent(
|
|
17
|
+
))
|
|
18
|
+
| Order.Cancelled({productIds}) =>
|
|
19
|
+
productIds->Array.map(productId => PublishEvent(
|
|
22
20
|
productId,
|
|
23
21
|
OrderingSpec.Orders_ExtensionPoint.ItemOrderCancelled({productId, orderId: _id}),
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
22
|
+
))
|
|
23
|
+
| _ => []
|
|
24
|
+
},
|
|
28
25
|
)
|
package/src/LifecycleModel.res
CHANGED
|
@@ -7,8 +7,32 @@
|
|
|
7
7
|
// annotation where it is silent.
|
|
8
8
|
|
|
9
9
|
let model: array<Reventless.Plugin.derivedEdge> = [
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
{
|
|
11
|
+
component: "Order",
|
|
12
|
+
command: "Cancel",
|
|
13
|
+
level: Reventless.Plugin.Instance,
|
|
14
|
+
allowedStates: ["Placed"],
|
|
15
|
+
targets: ["Cancelled"],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
component: "Order",
|
|
19
|
+
command: "Place",
|
|
20
|
+
level: Reventless.Plugin.Collection,
|
|
21
|
+
allowedStates: [],
|
|
22
|
+
targets: ["Placed"],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
component: "Order",
|
|
26
|
+
command: "Refund",
|
|
27
|
+
level: Reventless.Plugin.Instance,
|
|
28
|
+
allowedStates: ["Cancelled"],
|
|
29
|
+
targets: ["Refunded"],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
component: "Order",
|
|
33
|
+
command: "Ship",
|
|
34
|
+
level: Reventless.Plugin.Instance,
|
|
35
|
+
allowedStates: ["Placed"],
|
|
36
|
+
targets: ["Shipped"],
|
|
37
|
+
},
|
|
14
38
|
]
|
|
@@ -29,8 +29,7 @@ let evolve = (state, event) =>
|
|
|
29
29
|
|
|
30
30
|
let decide = (state, command) =>
|
|
31
31
|
switch (state, command) {
|
|
32
|
-
| (NotCreated, Place({customerId, productIds})) =>
|
|
33
|
-
Ok([Order.Placed({customerId, productIds})])
|
|
32
|
+
| (NotCreated, Place({customerId, productIds})) => Ok([Order.Placed({customerId, productIds})])
|
|
34
33
|
| (NotCreated, Ship) => Error(OrderNotFound)
|
|
35
34
|
| (NotCreated, Cancel) => Error(OrderNotFound)
|
|
36
35
|
| (NotCreated, Refund(_)) => Error(OrderNotFound)
|
|
@@ -13,17 +13,14 @@ module OrderMapping = Mapping.Make(
|
|
|
13
13
|
Set(
|
|
14
14
|
id,
|
|
15
15
|
{
|
|
16
|
-
Orders.customerId
|
|
16
|
+
Orders.customerId,
|
|
17
17
|
productIds,
|
|
18
18
|
lifecycle: (Placed: Orders.lifecycle),
|
|
19
19
|
},
|
|
20
20
|
)
|
|
21
|
-
| Shipped =>
|
|
22
|
-
|
|
23
|
-
|
|
|
24
|
-
Update(id, state => {...state, lifecycle: (Cancelled: Orders.lifecycle)})
|
|
25
|
-
| Refunded(_) =>
|
|
26
|
-
Update(id, state => {...state, lifecycle: (Refunded: Orders.lifecycle)})
|
|
21
|
+
| Shipped => Update(id, state => {...state, lifecycle: (Shipped: Orders.lifecycle)})
|
|
22
|
+
| Cancelled(_) => Update(id, state => {...state, lifecycle: (Cancelled: Orders.lifecycle)})
|
|
23
|
+
| Refunded(_) => Update(id, state => {...state, lifecycle: (Refunded: Orders.lifecycle)})
|
|
27
24
|
}
|
|
28
25
|
},
|
|
29
26
|
)
|
|
@@ -10,9 +10,6 @@ module Source = {
|
|
|
10
10
|
let execute = async (orderId, _meta, event, _queryEngine) =>
|
|
11
11
|
switch event {
|
|
12
12
|
| Order.Placed({customerId}) =>
|
|
13
|
-
await EmailService.sendOrderConfirmation(
|
|
14
|
-
~email=customerId,
|
|
15
|
-
~orderId=orderId->Order.Id.toString,
|
|
16
|
-
)
|
|
13
|
+
await EmailService.sendOrderConfirmation(~email=customerId, ~orderId=orderId->Order.Id.toString)
|
|
17
14
|
| _ => ()
|
|
18
15
|
}
|