From 5152d5f2b8cf7855ff13c3f38cb547ae372d6d61 Mon Sep 17 00:00:00 2001
From: Damien MARCHAT <dmarchat@takima.fr>
Date: Thu, 24 Apr 2025 16:55:57 +0200
Subject: [PATCH] Day 1 part 2.3

---
 .../bakery/CookieOrderer.java                 |  9 ++++---
 .../bakery/bake/BakeService.java              |  4 ++-
 .../bakery/bake/BakeServiceImpl.java          | 15 +++++++++--
 .../temporalpractice/bakery/bake/Input.java   | 12 +++++++++
 .../temporalpractice/bakery/bake/Output.java  | 12 +++++++++
 .../bakery/batter/BatterService.java          |  4 ++-
 .../bakery/batter/BatterServiceImpl.java      |  9 +++++--
 .../temporalpractice/bakery/batter/Input.java | 11 ++++++++
 .../bakery/batter/Output.java                 | 11 ++++++++
 .../bakery/cookie/BestCookieWorkflow.java     | 26 ++++++++++++++-----
 .../bakery/cookie/CookieWorkflow.java         |  5 +++-
 .../temporalpractice/bakery/cookie/Input.java | 23 ++++++++++++++++
 .../bakery/cookie/Output.java                 | 19 ++++++++++++++
 13 files changed, 144 insertions(+), 16 deletions(-)
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/bake/Input.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/bake/Output.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/batter/Input.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/batter/Output.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/cookie/Input.java
 create mode 100644 src/main/java/io/takima/temporalpractice/bakery/cookie/Output.java

diff --git a/src/main/java/io/takima/temporalpractice/bakery/CookieOrderer.java b/src/main/java/io/takima/temporalpractice/bakery/CookieOrderer.java
index 70fa9e3..a5efdd7 100644
--- a/src/main/java/io/takima/temporalpractice/bakery/CookieOrderer.java
+++ b/src/main/java/io/takima/temporalpractice/bakery/CookieOrderer.java
@@ -2,11 +2,14 @@ package io.takima.temporalpractice.bakery;
 
 import io.takima.temporalpractice.bakery.bake.BakeServiceImpl;
 import io.takima.temporalpractice.bakery.batter.BatterServiceImpl;
+import io.takima.temporalpractice.bakery.cookie.BestCookieWorkflow;
+import io.takima.temporalpractice.bakery.cookie.CookieWorkflow;
+import io.takima.temporalpractice.bakery.cookie.Input.Baking;
+import io.takima.temporalpractice.bakery.cookie.Input.CookiePreference;
+import io.takima.temporalpractice.bakery.cookie.Input.Topping;
 import io.temporal.client.WorkflowClient;
 import io.temporal.client.WorkflowOptions;
 import io.temporal.serviceclient.WorkflowServiceStubs;
-import io.takima.temporalpractice.bakery.cookie.CookieWorkflow;
-import io.takima.temporalpractice.bakery.cookie.BestCookieWorkflow;
 import io.temporal.worker.Worker;
 import io.temporal.worker.WorkerFactory;
 
@@ -34,6 +37,6 @@ public class CookieOrderer {
 
         CookieWorkflow workflow = client.newWorkflowStub(CookieWorkflow.class, options);
 
-        workflow.orderCookie(); // Start the Workflow Execution
+        workflow.orderCookie(new CookiePreference(10, Baking.SOFT, Topping.CHOCOLATE)); // Start the Workflow Execution
     }
 }
diff --git a/src/main/java/io/takima/temporalpractice/bakery/bake/BakeService.java b/src/main/java/io/takima/temporalpractice/bakery/bake/BakeService.java
index d411a8b..18130d8 100644
--- a/src/main/java/io/takima/temporalpractice/bakery/bake/BakeService.java
+++ b/src/main/java/io/takima/temporalpractice/bakery/bake/BakeService.java
@@ -1,8 +1,10 @@
 package io.takima.temporalpractice.bakery.bake;
 
+import io.takima.temporalpractice.bakery.bake.Input.BakeOrder;
+import io.takima.temporalpractice.bakery.bake.Output.CompleteOrder;
 import io.temporal.activity.ActivityInterface;
 
 @ActivityInterface
 public interface BakeService {
-    void bake();
+    CompleteOrder bake(BakeOrder bakeOrder);
 }
diff --git a/src/main/java/io/takima/temporalpractice/bakery/bake/BakeServiceImpl.java b/src/main/java/io/takima/temporalpractice/bakery/bake/BakeServiceImpl.java
index 346b162..fc4d354 100644
--- a/src/main/java/io/takima/temporalpractice/bakery/bake/BakeServiceImpl.java
+++ b/src/main/java/io/takima/temporalpractice/bakery/bake/BakeServiceImpl.java
@@ -1,8 +1,19 @@
 package io.takima.temporalpractice.bakery.bake;
 
+import io.takima.temporalpractice.bakery.bake.Input.BakeOrder;
+import io.takima.temporalpractice.bakery.bake.Output.CompleteOrder;
+import io.takima.temporalpractice.bakery.cookie.Output.Cookie;
+
+import java.util.stream.IntStream;
+
 public class BakeServiceImpl implements BakeService {
     @Override
-    public void bake() {
-        System.out.println("Baking cookies!");
+    public CompleteOrder bake(BakeOrder bakeOrder) {
+        var targetQuantity = bakeOrder.batter().quantityInGrams() / 30;
+        var cookies = IntStream.range(0, targetQuantity)
+                .mapToObj((i) -> new Cookie(bakeOrder.baking(), bakeOrder.batter().topping()))
+                .toList();
+        System.out.println("Baked cookies\n" + cookies);
+        return new CompleteOrder(cookies);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/io/takima/temporalpractice/bakery/bake/Input.java b/src/main/java/io/takima/temporalpractice/bakery/bake/Input.java
new file mode 100644
index 0000000..36e7c7a
--- /dev/null
+++ b/src/main/java/io/takima/temporalpractice/bakery/bake/Input.java
@@ -0,0 +1,12 @@
+package io.takima.temporalpractice.bakery.bake;
+
+import io.takima.temporalpractice.bakery.batter.Output.Batter;
+import io.takima.temporalpractice.bakery.cookie.Input.Baking;
+
+public class Input {
+    public record BakeOrder(
+            Batter batter,
+            Baking baking
+    ) {
+    }
+}
diff --git a/src/main/java/io/takima/temporalpractice/bakery/bake/Output.java b/src/main/java/io/takima/temporalpractice/bakery/bake/Output.java
new file mode 100644
index 0000000..71e1fc0
--- /dev/null
+++ b/src/main/java/io/takima/temporalpractice/bakery/bake/Output.java
@@ -0,0 +1,12 @@
+package io.takima.temporalpractice.bakery.bake;
+
+import io.takima.temporalpractice.bakery.cookie.Output.Cookie;
+
+import java.util.List;
+
+public class Output {
+    public record CompleteOrder(
+            List<Cookie> cookies
+    ) {
+    }
+}
diff --git a/src/main/java/io/takima/temporalpractice/bakery/batter/BatterService.java b/src/main/java/io/takima/temporalpractice/bakery/batter/BatterService.java
index 2bf83ed..9357ad1 100644
--- a/src/main/java/io/takima/temporalpractice/bakery/batter/BatterService.java
+++ b/src/main/java/io/takima/temporalpractice/bakery/batter/BatterService.java
@@ -1,8 +1,10 @@
 package io.takima.temporalpractice.bakery.batter;
 
+import io.takima.temporalpractice.bakery.batter.Input.BatterOrder;
+import io.takima.temporalpractice.bakery.batter.Output.Batter;
 import io.temporal.activity.ActivityInterface;
 
 @ActivityInterface
 public interface BatterService {
-    void prepareBatter();
+    Batter prepareBatter(BatterOrder batterOrder);
 }
diff --git a/src/main/java/io/takima/temporalpractice/bakery/batter/BatterServiceImpl.java b/src/main/java/io/takima/temporalpractice/bakery/batter/BatterServiceImpl.java
index 305a10a..bd4e0f2 100644
--- a/src/main/java/io/takima/temporalpractice/bakery/batter/BatterServiceImpl.java
+++ b/src/main/java/io/takima/temporalpractice/bakery/batter/BatterServiceImpl.java
@@ -1,8 +1,13 @@
 package io.takima.temporalpractice.bakery.batter;
 
+import io.takima.temporalpractice.bakery.batter.Input.BatterOrder;
+import io.takima.temporalpractice.bakery.batter.Output.Batter;
+
 public class BatterServiceImpl implements BatterService {
     @Override
-    public void prepareBatter() {
-        System.out.println("Mixing flour, sugar, and love...");
+    public Batter prepareBatter(BatterOrder batterOrder) {
+        var batter = new Batter(batterOrder.topping(), batterOrder.amount() * 30);
+        System.out.println("Prepared cookie batter\n" + batter);
+        return batter;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/io/takima/temporalpractice/bakery/batter/Input.java b/src/main/java/io/takima/temporalpractice/bakery/batter/Input.java
new file mode 100644
index 0000000..e58d4f2
--- /dev/null
+++ b/src/main/java/io/takima/temporalpractice/bakery/batter/Input.java
@@ -0,0 +1,11 @@
+package io.takima.temporalpractice.bakery.batter;
+
+import io.takima.temporalpractice.bakery.cookie.Input.Topping;
+
+public class Input {
+    public record BatterOrder(
+            Topping topping,
+            int amount
+    ) {
+    }
+}
diff --git a/src/main/java/io/takima/temporalpractice/bakery/batter/Output.java b/src/main/java/io/takima/temporalpractice/bakery/batter/Output.java
new file mode 100644
index 0000000..076d10a
--- /dev/null
+++ b/src/main/java/io/takima/temporalpractice/bakery/batter/Output.java
@@ -0,0 +1,11 @@
+package io.takima.temporalpractice.bakery.batter;
+
+import io.takima.temporalpractice.bakery.cookie.Input.Topping;
+
+public class Output {
+    public record Batter(
+            Topping topping,
+            int quantityInGrams
+    ) {
+    }
+}
diff --git a/src/main/java/io/takima/temporalpractice/bakery/cookie/BestCookieWorkflow.java b/src/main/java/io/takima/temporalpractice/bakery/cookie/BestCookieWorkflow.java
index 7380234..d0f33fa 100644
--- a/src/main/java/io/takima/temporalpractice/bakery/cookie/BestCookieWorkflow.java
+++ b/src/main/java/io/takima/temporalpractice/bakery/cookie/BestCookieWorkflow.java
@@ -1,11 +1,17 @@
 package io.takima.temporalpractice.bakery.cookie;
 
+import io.takima.temporalpractice.bakery.bake.BakeService;
+import io.takima.temporalpractice.bakery.batter.BatterService;
+import io.takima.temporalpractice.bakery.cookie.Output.CookieOrder;
 import io.temporal.activity.ActivityOptions;
 import io.temporal.workflow.Workflow;
-import io.takima.temporalpractice.bakery.batter.BatterService;
-import io.takima.temporalpractice.bakery.bake.BakeService;
+
 import java.time.Duration;
 
+import static io.takima.temporalpractice.bakery.bake.Input.BakeOrder;
+import static io.takima.temporalpractice.bakery.batter.Input.BatterOrder;
+import static io.takima.temporalpractice.bakery.cookie.Input.CookiePreference;
+
 public class BestCookieWorkflow implements CookieWorkflow {
     private final BatterService batterService;
     private final BakeService bakeService;
@@ -21,10 +27,18 @@ public class BestCookieWorkflow implements CookieWorkflow {
     }
 
     @Override
-    public void orderCookie() {
+    public CookieOrder orderCookie(CookiePreference cookiePreference) {
         System.out.println("Starting to prepare your cookie!");
-        batterService.prepareBatter();
-        bakeService.bake();
-        System.out.println("Your cookie is ready!");
+
+        var batter = batterService.prepareBatter(
+                new BatterOrder(cookiePreference.topping(), cookiePreference.amount())
+        );
+
+        var cookies = bakeService.bake(
+                new BakeOrder(batter, cookiePreference.baking())
+        ).cookies();
+
+        System.out.println("Your cookies are ready!");
+        return new CookieOrder(cookies);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/io/takima/temporalpractice/bakery/cookie/CookieWorkflow.java b/src/main/java/io/takima/temporalpractice/bakery/cookie/CookieWorkflow.java
index 80ba653..f673176 100644
--- a/src/main/java/io/takima/temporalpractice/bakery/cookie/CookieWorkflow.java
+++ b/src/main/java/io/takima/temporalpractice/bakery/cookie/CookieWorkflow.java
@@ -3,8 +3,11 @@ package io.takima.temporalpractice.bakery.cookie;
 import io.temporal.workflow.WorkflowInterface;
 import io.temporal.workflow.WorkflowMethod;
 
+import static io.takima.temporalpractice.bakery.cookie.Input.CookiePreference;
+import static io.takima.temporalpractice.bakery.cookie.Output.CookieOrder;
+
 @WorkflowInterface
 public interface CookieWorkflow {
     @WorkflowMethod
-    void orderCookie();
+    CookieOrder orderCookie(CookiePreference cookiePreference);
 }
\ No newline at end of file
diff --git a/src/main/java/io/takima/temporalpractice/bakery/cookie/Input.java b/src/main/java/io/takima/temporalpractice/bakery/cookie/Input.java
new file mode 100644
index 0000000..153fc88
--- /dev/null
+++ b/src/main/java/io/takima/temporalpractice/bakery/cookie/Input.java
@@ -0,0 +1,23 @@
+package io.takima.temporalpractice.bakery.cookie;
+
+public class Input {
+    public enum Baking {
+        RAW,
+        SOFT,
+        COOKED,
+        BURNT
+    }
+
+    public enum Topping {
+        CHOCOLATE,
+        NUTS,
+        NONE
+    }
+
+    public record CookiePreference(
+            int amount,
+            Baking baking,
+            Topping topping
+    ) {
+    }
+}
diff --git a/src/main/java/io/takima/temporalpractice/bakery/cookie/Output.java b/src/main/java/io/takima/temporalpractice/bakery/cookie/Output.java
new file mode 100644
index 0000000..b4a738f
--- /dev/null
+++ b/src/main/java/io/takima/temporalpractice/bakery/cookie/Output.java
@@ -0,0 +1,19 @@
+package io.takima.temporalpractice.bakery.cookie;
+
+import io.takima.temporalpractice.bakery.cookie.Input.Baking;
+import io.takima.temporalpractice.bakery.cookie.Input.Topping;
+
+import java.util.List;
+
+public class Output {
+    public record CookieOrder(
+            List<Cookie> cookies
+    ) {
+    }
+
+    public record Cookie(
+            Baking baking,
+            Topping topping
+    ) {
+    }
+}
-- 
GitLab