@reventlessdev/online-shop-dcb-ordering 1.0.0-alpha.103 → 1.0.0-alpha.105

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.
Files changed (140) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/lib/bs/.compiler.log +2 -2
  3. package/lib/bs/compiler-info.json +1 -1
  4. package/lib/bs/src/Extension/Products_Extension-OrderingPlugin.cmi +0 -0
  5. package/lib/bs/src/Extension/Products_Extension-OrderingPlugin.cmt +0 -0
  6. package/lib/bs/src/Order/AutomationSlice/AutoShipOrder_Automation-OrderingPlugin.cmi +0 -0
  7. package/lib/bs/src/Order/AutomationSlice/AutoShipOrder_Automation-OrderingPlugin.cmt +0 -0
  8. package/lib/bs/src/Order/AutomationSlice/AutoShipOrder_Automation.ast +0 -0
  9. package/lib/bs/src/Order/AutomationSlice/AutoShipOrder_Automation.res +0 -2
  10. package/lib/bs/src/Order/OutboundTranslationSlice/SendOrderConfirmation-OrderingPlugin.cmi +0 -0
  11. package/lib/bs/src/Order/OutboundTranslationSlice/SendOrderConfirmation-OrderingPlugin.cmt +0 -0
  12. package/lib/bs/src/Order/OutboundTranslationSlice/SendOrderConfirmation.ast +0 -0
  13. package/lib/bs/src/Order/OutboundTranslationSlice/SendOrderConfirmation.res +3 -0
  14. package/lib/bs/src/Order/OutboundTranslationSlice/SendOrderConfirmation.res.mjs +3 -0
  15. package/lib/bs/src/Order/OutboundTranslationSlice/SendOrderConfirmation_Translation-OrderingPlugin.cmi +0 -0
  16. package/lib/bs/src/Order/OutboundTranslationSlice/SendOrderConfirmation_Translation-OrderingPlugin.cmt +0 -0
  17. package/lib/bs/src/Order/StateChangeSlice/CancelOrder-OrderingPlugin.cmi +0 -0
  18. package/lib/bs/src/Order/StateChangeSlice/CancelOrder-OrderingPlugin.cmt +0 -0
  19. package/lib/bs/src/Order/StateChangeSlice/CancelOrder.ast +0 -0
  20. package/lib/bs/src/Order/StateChangeSlice/CancelOrder.res +1 -0
  21. package/lib/bs/src/Order/StateChangeSlice/CancelOrder_Behavior-OrderingPlugin.cmi +0 -0
  22. package/lib/bs/src/Order/StateChangeSlice/CancelOrder_Behavior-OrderingPlugin.cmt +0 -0
  23. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder-OrderingPlugin.cmi +0 -0
  24. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder-OrderingPlugin.cmt +0 -0
  25. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder.ast +0 -0
  26. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder.res +1 -10
  27. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder.res.mjs +1 -1
  28. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder_Behavior-OrderingPlugin.cmi +0 -0
  29. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder_Behavior-OrderingPlugin.cmt +0 -0
  30. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder_Behavior.ast +0 -0
  31. package/lib/bs/src/Order/StateChangeSlice/PlaceOrder_Behavior.res +3 -8
  32. package/lib/bs/src/Order/StateChangeSlice/ShipOrder-OrderingPlugin.cmi +0 -0
  33. package/lib/bs/src/Order/StateChangeSlice/ShipOrder-OrderingPlugin.cmt +0 -0
  34. package/lib/bs/src/Order/StateChangeSlice/ShipOrder_Behavior-OrderingPlugin.cmi +0 -0
  35. package/lib/bs/src/Order/StateChangeSlice/ShipOrder_Behavior-OrderingPlugin.cmt +0 -0
  36. package/lib/bs/src/Plugin-OrderingPlugin.cmi +0 -0
  37. package/lib/bs/src/Plugin-OrderingPlugin.cmt +0 -0
  38. package/lib/bs/src/Plugin.res.mjs +2 -1
  39. package/lib/bs/tests/CatalogProduct/StateChangeSlice/SyncCatalogProduct_GWT-OrderingPlugin.cmi +0 -0
  40. package/lib/bs/tests/CatalogProduct/StateChangeSlice/SyncCatalogProduct_GWT-OrderingPlugin.cmt +0 -0
  41. package/lib/bs/tests/CatalogProduct/StateViewSlice/AvailableProducts_GWT-OrderingPlugin.cmi +0 -0
  42. package/lib/bs/tests/CatalogProduct/StateViewSlice/AvailableProducts_GWT-OrderingPlugin.cmt +0 -0
  43. package/lib/bs/tests/Customer/StateChangeSlice/ChangeAddress_GWT-OrderingPlugin.cmi +0 -0
  44. package/lib/bs/tests/Customer/StateChangeSlice/ChangeAddress_GWT-OrderingPlugin.cmt +0 -0
  45. package/lib/bs/tests/Customer/StateChangeSlice/ChangeEmail_GWT-OrderingPlugin.cmi +0 -0
  46. package/lib/bs/tests/Customer/StateChangeSlice/ChangeEmail_GWT-OrderingPlugin.cmt +0 -0
  47. package/lib/bs/tests/Customer/StateChangeSlice/DeactivateCustomer_GWT-OrderingPlugin.cmi +0 -0
  48. package/lib/bs/tests/Customer/StateChangeSlice/DeactivateCustomer_GWT-OrderingPlugin.cmt +0 -0
  49. package/lib/bs/tests/Customer/StateChangeSlice/RegisterCustomer_GWT-OrderingPlugin.cmi +0 -0
  50. package/lib/bs/tests/Customer/StateChangeSlice/RegisterCustomer_GWT-OrderingPlugin.cmt +0 -0
  51. package/lib/bs/tests/Customer/StateViewSlice/Customers_GWT-OrderingPlugin.cmi +0 -0
  52. package/lib/bs/tests/Customer/StateViewSlice/Customers_GWT-OrderingPlugin.cmt +0 -0
  53. package/lib/bs/tests/Extension/Products_Extension_GWT-OrderingPlugin.cmi +0 -0
  54. package/lib/bs/tests/Extension/Products_Extension_GWT-OrderingPlugin.cmt +0 -0
  55. package/lib/bs/tests/ExtensionPoint/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmi +0 -0
  56. package/lib/bs/tests/ExtensionPoint/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmt +0 -0
  57. package/lib/bs/tests/Order/AutomationSlice/AutoShipOrder_GWT-OrderingPlugin.cmi +0 -0
  58. package/lib/bs/tests/Order/AutomationSlice/AutoShipOrder_GWT-OrderingPlugin.cmt +0 -0
  59. package/lib/bs/tests/Order/OutboundTranslationSlice/SendOrderConfirmation_GWT-OrderingPlugin.cmi +0 -0
  60. package/lib/bs/tests/Order/OutboundTranslationSlice/SendOrderConfirmation_GWT-OrderingPlugin.cmj +0 -0
  61. package/lib/bs/tests/Order/OutboundTranslationSlice/SendOrderConfirmation_GWT-OrderingPlugin.cmt +0 -0
  62. package/lib/bs/tests/Order/OutboundTranslationSlice/SendOrderConfirmation_GWT.res.mjs +1 -0
  63. package/lib/bs/tests/Order/StateChangeSlice/CancelOrder_GWT-OrderingPlugin.cmi +0 -0
  64. package/lib/bs/tests/Order/StateChangeSlice/CancelOrder_GWT-OrderingPlugin.cmt +0 -0
  65. package/lib/bs/tests/Order/StateChangeSlice/PlaceOrder_GWT-OrderingPlugin.cmi +0 -0
  66. package/lib/bs/tests/Order/StateChangeSlice/PlaceOrder_GWT-OrderingPlugin.cmt +0 -0
  67. package/lib/bs/tests/Order/StateChangeSlice/ShipOrder_GWT-OrderingPlugin.cmi +0 -0
  68. package/lib/bs/tests/Order/StateChangeSlice/ShipOrder_GWT-OrderingPlugin.cmt +0 -0
  69. package/lib/bs/tests/Order/StateViewSlice/Orders_GWT-OrderingPlugin.cmi +0 -0
  70. package/lib/bs/tests/Order/StateViewSlice/Orders_GWT-OrderingPlugin.cmt +0 -0
  71. package/lib/ocaml/.compiler.log +2 -2
  72. package/lib/ocaml/AutoShipOrder_Automation-OrderingPlugin.cmi +0 -0
  73. package/lib/ocaml/AutoShipOrder_Automation-OrderingPlugin.cmt +0 -0
  74. package/lib/ocaml/AutoShipOrder_Automation.ast +0 -0
  75. package/lib/ocaml/AutoShipOrder_Automation.res +0 -2
  76. package/lib/ocaml/AutoShipOrder_GWT-OrderingPlugin.cmi +0 -0
  77. package/lib/ocaml/AutoShipOrder_GWT-OrderingPlugin.cmt +0 -0
  78. package/lib/ocaml/AvailableProducts_GWT-OrderingPlugin.cmi +0 -0
  79. package/lib/ocaml/AvailableProducts_GWT-OrderingPlugin.cmt +0 -0
  80. package/lib/ocaml/CancelOrder-OrderingPlugin.cmi +0 -0
  81. package/lib/ocaml/CancelOrder-OrderingPlugin.cmt +0 -0
  82. package/lib/ocaml/CancelOrder.ast +0 -0
  83. package/lib/ocaml/CancelOrder.res +1 -0
  84. package/lib/ocaml/CancelOrder_Behavior-OrderingPlugin.cmi +0 -0
  85. package/lib/ocaml/CancelOrder_Behavior-OrderingPlugin.cmt +0 -0
  86. package/lib/ocaml/CancelOrder_GWT-OrderingPlugin.cmi +0 -0
  87. package/lib/ocaml/CancelOrder_GWT-OrderingPlugin.cmt +0 -0
  88. package/lib/ocaml/ChangeAddress_GWT-OrderingPlugin.cmi +0 -0
  89. package/lib/ocaml/ChangeAddress_GWT-OrderingPlugin.cmt +0 -0
  90. package/lib/ocaml/ChangeEmail_GWT-OrderingPlugin.cmi +0 -0
  91. package/lib/ocaml/ChangeEmail_GWT-OrderingPlugin.cmt +0 -0
  92. package/lib/ocaml/Customers_GWT-OrderingPlugin.cmi +0 -0
  93. package/lib/ocaml/Customers_GWT-OrderingPlugin.cmt +0 -0
  94. package/lib/ocaml/DeactivateCustomer_GWT-OrderingPlugin.cmi +0 -0
  95. package/lib/ocaml/DeactivateCustomer_GWT-OrderingPlugin.cmt +0 -0
  96. package/lib/ocaml/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmi +0 -0
  97. package/lib/ocaml/Orders_ExtensionPointMapping_GWT-OrderingPlugin.cmt +0 -0
  98. package/lib/ocaml/Orders_GWT-OrderingPlugin.cmi +0 -0
  99. package/lib/ocaml/Orders_GWT-OrderingPlugin.cmt +0 -0
  100. package/lib/ocaml/PlaceOrder-OrderingPlugin.cmi +0 -0
  101. package/lib/ocaml/PlaceOrder-OrderingPlugin.cmt +0 -0
  102. package/lib/ocaml/PlaceOrder.ast +0 -0
  103. package/lib/ocaml/PlaceOrder.res +1 -10
  104. package/lib/ocaml/PlaceOrder_Behavior-OrderingPlugin.cmi +0 -0
  105. package/lib/ocaml/PlaceOrder_Behavior-OrderingPlugin.cmt +0 -0
  106. package/lib/ocaml/PlaceOrder_Behavior.ast +0 -0
  107. package/lib/ocaml/PlaceOrder_Behavior.res +3 -8
  108. package/lib/ocaml/PlaceOrder_GWT-OrderingPlugin.cmi +0 -0
  109. package/lib/ocaml/PlaceOrder_GWT-OrderingPlugin.cmt +0 -0
  110. package/lib/ocaml/Plugin-OrderingPlugin.cmi +0 -0
  111. package/lib/ocaml/Plugin-OrderingPlugin.cmt +0 -0
  112. package/lib/ocaml/Products_Extension-OrderingPlugin.cmi +0 -0
  113. package/lib/ocaml/Products_Extension-OrderingPlugin.cmt +0 -0
  114. package/lib/ocaml/Products_Extension_GWT-OrderingPlugin.cmi +0 -0
  115. package/lib/ocaml/Products_Extension_GWT-OrderingPlugin.cmt +0 -0
  116. package/lib/ocaml/RegisterCustomer_GWT-OrderingPlugin.cmi +0 -0
  117. package/lib/ocaml/RegisterCustomer_GWT-OrderingPlugin.cmt +0 -0
  118. package/lib/ocaml/SendOrderConfirmation-OrderingPlugin.cmi +0 -0
  119. package/lib/ocaml/SendOrderConfirmation-OrderingPlugin.cmt +0 -0
  120. package/lib/ocaml/SendOrderConfirmation.ast +0 -0
  121. package/lib/ocaml/SendOrderConfirmation.res +3 -0
  122. package/lib/ocaml/SendOrderConfirmation_GWT-OrderingPlugin.cmi +0 -0
  123. package/lib/ocaml/SendOrderConfirmation_GWT-OrderingPlugin.cmj +0 -0
  124. package/lib/ocaml/SendOrderConfirmation_GWT-OrderingPlugin.cmt +0 -0
  125. package/lib/ocaml/SendOrderConfirmation_Translation-OrderingPlugin.cmi +0 -0
  126. package/lib/ocaml/SendOrderConfirmation_Translation-OrderingPlugin.cmt +0 -0
  127. package/lib/ocaml/ShipOrder-OrderingPlugin.cmi +0 -0
  128. package/lib/ocaml/ShipOrder-OrderingPlugin.cmt +0 -0
  129. package/lib/ocaml/ShipOrder_Behavior-OrderingPlugin.cmi +0 -0
  130. package/lib/ocaml/ShipOrder_Behavior-OrderingPlugin.cmt +0 -0
  131. package/lib/ocaml/ShipOrder_GWT-OrderingPlugin.cmi +0 -0
  132. package/lib/ocaml/ShipOrder_GWT-OrderingPlugin.cmt +0 -0
  133. package/lib/ocaml/SyncCatalogProduct_GWT-OrderingPlugin.cmi +0 -0
  134. package/lib/ocaml/SyncCatalogProduct_GWT-OrderingPlugin.cmt +0 -0
  135. package/package.json +8 -8
  136. package/src/Order/AutomationSlice/AutoShipOrder_Automation.res +0 -2
  137. package/src/Order/OutboundTranslationSlice/SendOrderConfirmation.res +3 -0
  138. package/src/Order/StateChangeSlice/CancelOrder.res +1 -0
  139. package/src/Order/StateChangeSlice/PlaceOrder.res +1 -10
  140. package/src/Order/StateChangeSlice/PlaceOrder_Behavior.res +3 -8
package/CHANGELOG.md CHANGED
@@ -3,6 +3,21 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 1.0.0-alpha.105 (2026-07-02)
7
+
8
+ **Note:** Version bump only for package @reventlessdev/online-shop-dcb-ordering
9
+
10
+
11
+
12
+
13
+
14
+ # 1.0.0-alpha.104 (2026-06-29)
15
+
16
+ ### Features
17
+
18
+ * external-system boxes for translation slices (Event Graph data) ([3f8ad39](https://github.com/ReventlessDev/reventless-core/commit/3f8ad39b78a3cb1182d59a0e1fb203b7dcb7379b))
19
+
20
+
6
21
  # 1.0.0-alpha.103 (2026-06-27)
7
22
 
8
23
  **Note:** Version bump only for package @reventlessdev/online-shop-dcb-ordering
@@ -1,2 +1,2 @@
1
- #Start(1782549921109)
2
- #Done(1782549923116)
1
+ #Start(1782989603279)
2
+ #Done(1782989605465)
@@ -4,5 +4,5 @@
4
4
  "bsc_hash": "75e3a59c95cc953608fd3dd6ea6ed68141bba4414a20a52f114261b8a48385fa",
5
5
  "rescript_config_hash": "2b45634c4ef9d26c69e2cd8282eb5d077ce9cf087ded0065001d0f0d889e241c",
6
6
  "runtime_path": "/home/runner/work/reventless-core/reventless-core/node_modules/@rescript/runtime",
7
- "generated_at": "1782549923133"
7
+ "generated_at": "1782989605477"
8
8
  }
@@ -1,8 +1,6 @@
1
1
  @@reventless.automation
2
2
 
3
3
  // Single DCB source — events from the ordering plugin's own event log.
4
- // `module Id = Reventless.Id.String` and dcbTags on `*Id` fields are
5
- // auto-injected by `@@reventless.automation` (Source-module scan).
6
4
  module OrderingDcbSource = {
7
5
  let name = "OrderingDcbEventLog"
8
6
  @schema
@@ -17,3 +17,6 @@ type inboundCommand = unit
17
17
  let maxRetries = 3
18
18
  let heartbeatInterval = 60
19
19
  let targetName = None
20
+ // Foreign system this anti-corruption slice publishes confirmations to — drawn as an
21
+ // external box outside the Ordering plugin in the Event Graph.
22
+ let externalSystem = Some("EmailService")
@@ -26,6 +26,8 @@ let heartbeatInterval = 60;
26
26
 
27
27
  let targetName;
28
28
 
29
+ let externalSystem = "EmailService";
30
+
29
31
  let moduleUrl = "@reventlessdev/online-shop-dcb-ordering/src/Order/OutboundTranslationSlice/SendOrderConfirmation.res.mjs";
30
32
 
31
33
  export {
@@ -37,6 +39,7 @@ export {
37
39
  maxRetries,
38
40
  heartbeatInterval,
39
41
  targetName,
42
+ externalSystem,
40
43
  moduleUrl,
41
44
  }
42
45
  /* consumedEventSchema Not a pure module */
@@ -19,6 +19,7 @@ type error =
19
19
 
20
20
  @schema
21
21
  type event = OrderCancelled({
22
+ // orderId and productIds both tag — @partitionTag picks the storage partition.
22
23
  @partitionTag orderId: string,
23
24
  productIds: array<string>,
24
25
  })
@@ -1,19 +1,9 @@
1
1
  // PlaceOrder StateChangeSlice.
2
2
  // Handles the PlaceOrder command; rejects duplicate placement and validates
3
3
  // that all referenced products have been synced to the ordering event log.
4
- //
5
- // The tagged array `productIds: array<string>` triggers automatic multi-clause
6
- // query construction: one OR clause per orderId and per productId element —
7
- // fetching both Order and CatalogProduct events. The plural field name is
8
- // auto-singularised by the PPX so each element is stored under tag key
9
- // `productId`, sharing the key with single-value `productId: string` producers.
10
4
 
11
5
  @@reventless.spec
12
6
 
13
- // `OrderPlaced` carries `orderId` (not partial) so the decision model can
14
- // discriminate placements across the multi-clause query. Without it,
15
- // OrderPlaced events from sibling orders that share a `productId` tag would
16
- // leak in and falsely set "this order exists".
17
7
  @schema
18
8
  type consumedEvent =
19
9
  | OrderPlaced({orderId: string})
@@ -21,6 +11,7 @@ type consumedEvent =
21
11
 
22
12
  @schema
23
13
  type command =
14
+ // Multiple tagged fields — @partitionTag picks orderId as the storage partition.
24
15
  PlaceOrder({@partitionTag orderId: string, customerId: string, @ref("AvailableProducts") productIds: array<string>})
25
16
 
26
17
  @schema
@@ -19,7 +19,7 @@ let commandSchema = S.schema(s => ({
19
19
  TAG: "PlaceOrder",
20
20
  orderId: s.m(DcbTag$Reventless.partition),
21
21
  customerId: s.m(DcbTag$Reventless.string),
22
- productIds: s.m(S.array(Reference$Reventless.to_(undefined, "productId", "AvailableProducts")))
22
+ productIds: s.m(S.array(Reference$Reventless.to_(undefined, undefined, "AvailableProducts")))
23
23
  }));
24
24
 
25
25
  let errorSchema = S.union([
@@ -1,13 +1,8 @@
1
1
  @@reventless.behavior
2
2
 
3
- // `placedOrderIds` tracks every OrderPlaced the query returned (regardless of
4
- // orderIdthe multi-clause query also fetches by productId tags), so the
5
- // `decide` step can ask "is THIS particular orderId already placed?" without
6
- // being confused by OrderPlaced events from sibling orders sharing a product.
7
- //
8
- // Stored as immutable arrays (rather than `Set.t`) so each fold yields a
9
- // fresh state — `evolve` returns a new record instead of mutating a shared
10
- // one. This keeps successive `decide` calls (and unit tests) hermetic.
3
+ // Stored as immutable arrays (rather than `Set.t`) so each fold yields a fresh
4
+ // state`evolve` returns a new record instead of mutating a shared one. This
5
+ // keeps successive `decide` calls (and unit tests) hermetic.
11
6
  type state = {placedOrderIds: array<string>, availableProductIds: array<string>}
12
7
 
13
8
  let initialState = {placedOrderIds: [], availableProductIds: []}
@@ -222,7 +222,8 @@ function Make(Platform) {
222
222
  inboundCommandSchema: SendOrderConfirmation$OrderingPlugin.inboundCommandSchema,
223
223
  maxRetries: SendOrderConfirmation$OrderingPlugin.maxRetries,
224
224
  heartbeatInterval: SendOrderConfirmation$OrderingPlugin.heartbeatInterval,
225
- targetName: undefined
225
+ targetName: undefined,
226
+ externalSystem: SendOrderConfirmation$OrderingPlugin.externalSystem
226
227
  })({
227
228
  collect: SendOrderConfirmation_Translation$OrderingPlugin.collect,
228
229
  translate: SendOrderConfirmation_Translation$OrderingPlugin.translate,
@@ -13,6 +13,7 @@ let SendOrderConfirmationSlice = {
13
13
  maxRetries: SendOrderConfirmation$OrderingPlugin.maxRetries,
14
14
  heartbeatInterval: SendOrderConfirmation$OrderingPlugin.heartbeatInterval,
15
15
  targetName: undefined,
16
+ externalSystem: SendOrderConfirmation$OrderingPlugin.externalSystem,
16
17
  moduleUrl: SendOrderConfirmation$OrderingPlugin.moduleUrl,
17
18
  collect: SendOrderConfirmation_Translation$OrderingPlugin.collect
18
19
  };
@@ -1,2 +1,2 @@
1
- #Start(1782549921109)
2
- #Done(1782549923116)
1
+ #Start(1782989603279)
2
+ #Done(1782989605465)
@@ -1,8 +1,6 @@
1
1
  @@reventless.automation
2
2
 
3
3
  // Single DCB source — events from the ordering plugin's own event log.
4
- // `module Id = Reventless.Id.String` and dcbTags on `*Id` fields are
5
- // auto-injected by `@@reventless.automation` (Source-module scan).
6
4
  module OrderingDcbSource = {
7
5
  let name = "OrderingDcbEventLog"
8
6
  @schema
Binary file
@@ -19,6 +19,7 @@ type error =
19
19
 
20
20
  @schema
21
21
  type event = OrderCancelled({
22
+ // orderId and productIds both tag — @partitionTag picks the storage partition.
22
23
  @partitionTag orderId: string,
23
24
  productIds: array<string>,
24
25
  })
Binary file
@@ -1,19 +1,9 @@
1
1
  // PlaceOrder StateChangeSlice.
2
2
  // Handles the PlaceOrder command; rejects duplicate placement and validates
3
3
  // that all referenced products have been synced to the ordering event log.
4
- //
5
- // The tagged array `productIds: array<string>` triggers automatic multi-clause
6
- // query construction: one OR clause per orderId and per productId element —
7
- // fetching both Order and CatalogProduct events. The plural field name is
8
- // auto-singularised by the PPX so each element is stored under tag key
9
- // `productId`, sharing the key with single-value `productId: string` producers.
10
4
 
11
5
  @@reventless.spec
12
6
 
13
- // `OrderPlaced` carries `orderId` (not partial) so the decision model can
14
- // discriminate placements across the multi-clause query. Without it,
15
- // OrderPlaced events from sibling orders that share a `productId` tag would
16
- // leak in and falsely set "this order exists".
17
7
  @schema
18
8
  type consumedEvent =
19
9
  | OrderPlaced({orderId: string})
@@ -21,6 +11,7 @@ type consumedEvent =
21
11
 
22
12
  @schema
23
13
  type command =
14
+ // Multiple tagged fields — @partitionTag picks orderId as the storage partition.
24
15
  PlaceOrder({@partitionTag orderId: string, customerId: string, @ref("AvailableProducts") productIds: array<string>})
25
16
 
26
17
  @schema
Binary file
@@ -1,13 +1,8 @@
1
1
  @@reventless.behavior
2
2
 
3
- // `placedOrderIds` tracks every OrderPlaced the query returned (regardless of
4
- // orderIdthe multi-clause query also fetches by productId tags), so the
5
- // `decide` step can ask "is THIS particular orderId already placed?" without
6
- // being confused by OrderPlaced events from sibling orders sharing a product.
7
- //
8
- // Stored as immutable arrays (rather than `Set.t`) so each fold yields a
9
- // fresh state — `evolve` returns a new record instead of mutating a shared
10
- // one. This keeps successive `decide` calls (and unit tests) hermetic.
3
+ // Stored as immutable arrays (rather than `Set.t`) so each fold yields a fresh
4
+ // state`evolve` returns a new record instead of mutating a shared one. This
5
+ // keeps successive `decide` calls (and unit tests) hermetic.
11
6
  type state = {placedOrderIds: array<string>, availableProductIds: array<string>}
12
7
 
13
8
  let initialState = {placedOrderIds: [], availableProductIds: []}
Binary file
Binary file
Binary file
@@ -17,3 +17,6 @@ type inboundCommand = unit
17
17
  let maxRetries = 3
18
18
  let heartbeatInterval = 60
19
19
  let targetName = None
20
+ // Foreign system this anti-corruption slice publishes confirmations to — drawn as an
21
+ // external box outside the Ordering plugin in the Event Graph.
22
+ let externalSystem = Some("EmailService")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/online-shop-dcb-ordering",
3
- "version": "1.0.0-alpha.103",
3
+ "version": "1.0.0-alpha.105",
4
4
  "description": "Online Shop example — Ordering bounded context (Customer & Order) using the DCB pattern",
5
5
  "license": "Apache-2.0",
6
6
  "jest": {
@@ -21,18 +21,18 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "sury": "^11.0.0-alpha.4",
24
- "@reventlessdev/online-shop-dcb-ordering-spec": "1.0.0-alpha.58",
25
- "@reventlessdev/online-shop-dcb-catalog-spec": "1.0.0-alpha.58",
24
+ "@reventlessdev/online-shop-dcb-ordering-spec": "1.0.0-alpha.60",
25
+ "@reventlessdev/online-shop-dcb-catalog-spec": "1.0.0-alpha.60",
26
+ "@reventlessdev/reventless-gwt": "1.0.0-alpha.76",
27
+ "@reventlessdev/reventless-infra": "3.0.0-alpha.83",
26
28
  "@reventlessdev/rescript-pulumi-pulumi": "2.3.0-alpha.14",
27
- "@reventlessdev/reventless-gwt": "1.0.0-alpha.74",
28
- "@reventlessdev/reventless-infra": "3.0.0-alpha.81",
29
- "@reventlessdev/reventless-local": "3.0.0-alpha.113",
30
- "@reventlessdev/reventless-spec": "3.0.0-alpha.61"
29
+ "@reventlessdev/reventless-local": "3.0.0-alpha.115",
30
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.63"
31
31
  },
32
32
  "devDependencies": {
33
33
  "rescript": "^12.3.0",
34
34
  "sury-ppx": "11.0.0-alpha.2",
35
- "@reventlessdev/reventless-ppx": "1.0.0-alpha.47"
35
+ "@reventlessdev/reventless-ppx": "1.0.0-alpha.48"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "rescript": "^12.3.0"
@@ -1,8 +1,6 @@
1
1
  @@reventless.automation
2
2
 
3
3
  // Single DCB source — events from the ordering plugin's own event log.
4
- // `module Id = Reventless.Id.String` and dcbTags on `*Id` fields are
5
- // auto-injected by `@@reventless.automation` (Source-module scan).
6
4
  module OrderingDcbSource = {
7
5
  let name = "OrderingDcbEventLog"
8
6
  @schema
@@ -17,3 +17,6 @@ type inboundCommand = unit
17
17
  let maxRetries = 3
18
18
  let heartbeatInterval = 60
19
19
  let targetName = None
20
+ // Foreign system this anti-corruption slice publishes confirmations to — drawn as an
21
+ // external box outside the Ordering plugin in the Event Graph.
22
+ let externalSystem = Some("EmailService")
@@ -19,6 +19,7 @@ type error =
19
19
 
20
20
  @schema
21
21
  type event = OrderCancelled({
22
+ // orderId and productIds both tag — @partitionTag picks the storage partition.
22
23
  @partitionTag orderId: string,
23
24
  productIds: array<string>,
24
25
  })
@@ -1,19 +1,9 @@
1
1
  // PlaceOrder StateChangeSlice.
2
2
  // Handles the PlaceOrder command; rejects duplicate placement and validates
3
3
  // that all referenced products have been synced to the ordering event log.
4
- //
5
- // The tagged array `productIds: array<string>` triggers automatic multi-clause
6
- // query construction: one OR clause per orderId and per productId element —
7
- // fetching both Order and CatalogProduct events. The plural field name is
8
- // auto-singularised by the PPX so each element is stored under tag key
9
- // `productId`, sharing the key with single-value `productId: string` producers.
10
4
 
11
5
  @@reventless.spec
12
6
 
13
- // `OrderPlaced` carries `orderId` (not partial) so the decision model can
14
- // discriminate placements across the multi-clause query. Without it,
15
- // OrderPlaced events from sibling orders that share a `productId` tag would
16
- // leak in and falsely set "this order exists".
17
7
  @schema
18
8
  type consumedEvent =
19
9
  | OrderPlaced({orderId: string})
@@ -21,6 +11,7 @@ type consumedEvent =
21
11
 
22
12
  @schema
23
13
  type command =
14
+ // Multiple tagged fields — @partitionTag picks orderId as the storage partition.
24
15
  PlaceOrder({@partitionTag orderId: string, customerId: string, @ref("AvailableProducts") productIds: array<string>})
25
16
 
26
17
  @schema
@@ -1,13 +1,8 @@
1
1
  @@reventless.behavior
2
2
 
3
- // `placedOrderIds` tracks every OrderPlaced the query returned (regardless of
4
- // orderIdthe multi-clause query also fetches by productId tags), so the
5
- // `decide` step can ask "is THIS particular orderId already placed?" without
6
- // being confused by OrderPlaced events from sibling orders sharing a product.
7
- //
8
- // Stored as immutable arrays (rather than `Set.t`) so each fold yields a
9
- // fresh state — `evolve` returns a new record instead of mutating a shared
10
- // one. This keeps successive `decide` calls (and unit tests) hermetic.
3
+ // Stored as immutable arrays (rather than `Set.t`) so each fold yields a fresh
4
+ // state`evolve` returns a new record instead of mutating a shared one. This
5
+ // keeps successive `decide` calls (and unit tests) hermetic.
11
6
  type state = {placedOrderIds: array<string>, availableProductIds: array<string>}
12
7
 
13
8
  let initialState = {placedOrderIds: [], availableProductIds: []}