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