diff --git a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPool.java b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPool.java index 42cb9b4..9d5ef12 100644 --- a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPool.java +++ b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPool.java @@ -5,8 +5,6 @@ import com.dddheroes.heroesofddd.resourcespool.write.withdraw.CannotWithdrawMoreThanDepositedResources; import com.dddheroes.heroesofddd.resourcespool.write.withdraw.ResourcesWithdrawn; import com.dddheroes.heroesofddd.resourcespool.write.withdraw.WithdrawResources; -import com.dddheroes.heroesofddd.shared.Amount; -import com.dddheroes.heroesofddd.shared.ResourceType; import com.dddheroes.heroesofddd.shared.Resources; import org.axonframework.commandhandling.CommandHandler; import org.axonframework.eventsourcing.EventSourcingHandler; @@ -27,28 +25,28 @@ class ResourcesPool { @CommandHandler @CreationPolicy(AggregateCreationPolicy.CREATE_IF_MISSING) void decide(DepositResources command) { - apply(ResourcesDeposited.event(command.resourcesPoolId(), command.type(), command.amount())); + apply(ResourcesDeposited.event(command.resourcesPoolId(), command.resources())); } @EventSourcingHandler void evolve(ResourcesDeposited event) { resourcesPoolId = new ResourcesPoolId(event.resourcesPoolId()); - this.balance = balance.plus(ResourceType.from(event.type()), new Amount(event.amount())); + this.balance = balance.plus(Resources.fromRaw(event.resources())); } @CommandHandler void decide(WithdrawResources command) { new CannotWithdrawMoreThanDepositedResources( balance, - Resources.from(command.type(), command.amount()) + command.resources() ).verify(); - apply(ResourcesWithdrawn.event(command.resourcesPoolId(), command.type(), command.amount())); + apply(ResourcesWithdrawn.event(command.resourcesPoolId(), command.resources())); } @EventSourcingHandler void evolve(ResourcesWithdrawn event) { resourcesPoolId = new ResourcesPoolId(event.resourcesPoolId()); - this.balance = balance.minus(ResourceType.from(event.type()), new Amount(event.amount())); + this.balance = balance.minus(Resources.fromRaw(event.resources())); } ResourcesPool() { diff --git a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/DepositResources.java b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/DepositResources.java index afbedbd..fa95c66 100644 --- a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/DepositResources.java +++ b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/DepositResources.java @@ -2,18 +2,22 @@ import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolCommand; import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId; -import com.dddheroes.heroesofddd.shared.Amount; -import com.dddheroes.heroesofddd.shared.ResourceType; +import com.dddheroes.heroesofddd.shared.Resources; import org.axonframework.modelling.command.TargetAggregateIdentifier; +import java.util.Map; + public record DepositResources( @TargetAggregateIdentifier ResourcesPoolId resourcesPoolId, - ResourceType type, - Amount amount + Resources resources ) implements ResourcesPoolCommand { public static DepositResources command(String resourcesPoolId, String type, Integer amount) { - return new DepositResources(ResourcesPoolId.of(resourcesPoolId), ResourceType.from(type), Amount.of(amount)); + return command(resourcesPoolId, Map.of(type, amount)); + } + + public static DepositResources command(String resourcesPoolId, Map resources) { + return new DepositResources(ResourcesPoolId.of(resourcesPoolId), Resources.fromRaw(resources)); } } diff --git a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/ResourcesDeposited.java b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/ResourcesDeposited.java index 7eed6c3..71b0917 100644 --- a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/ResourcesDeposited.java +++ b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/ResourcesDeposited.java @@ -2,16 +2,16 @@ import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolEvent; import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId; -import com.dddheroes.heroesofddd.shared.Amount; -import com.dddheroes.heroesofddd.shared.ResourceType; +import com.dddheroes.heroesofddd.shared.Resources; + +import java.util.Map; public record ResourcesDeposited( String resourcesPoolId, - String type, - Integer amount + Map resources ) implements ResourcesPoolEvent { - public static ResourcesDeposited event(ResourcesPoolId resourcesPoolId, ResourceType type, Amount amount) { - return new ResourcesDeposited(resourcesPoolId.raw(), type.name(), amount.raw()); + public static ResourcesDeposited event(ResourcesPoolId resourcesPoolId, Resources resources) { + return new ResourcesDeposited(resourcesPoolId.raw(), resources.raw()); } } diff --git a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/ResourcesWithdrawn.java b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/ResourcesWithdrawn.java index e2078cb..81280bf 100644 --- a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/ResourcesWithdrawn.java +++ b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/ResourcesWithdrawn.java @@ -2,16 +2,16 @@ import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolEvent; import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId; -import com.dddheroes.heroesofddd.shared.Amount; -import com.dddheroes.heroesofddd.shared.ResourceType; +import com.dddheroes.heroesofddd.shared.Resources; + +import java.util.Map; public record ResourcesWithdrawn( String resourcesPoolId, - String type, - Integer amount + Map resources ) implements ResourcesPoolEvent { - public static ResourcesWithdrawn event(ResourcesPoolId resourcesPoolId, ResourceType type, Amount amount) { - return new ResourcesWithdrawn(resourcesPoolId.raw(), type.name(), amount.raw()); + public static ResourcesWithdrawn event(ResourcesPoolId resourcesPoolId, Resources resources) { + return new ResourcesWithdrawn(resourcesPoolId.raw(), resources.raw()); } } diff --git a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/WithdrawResources.java b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/WithdrawResources.java index e7babce..7b565ed 100644 --- a/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/WithdrawResources.java +++ b/src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/WithdrawResources.java @@ -2,18 +2,22 @@ import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolCommand; import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId; -import com.dddheroes.heroesofddd.shared.Amount; -import com.dddheroes.heroesofddd.shared.ResourceType; +import com.dddheroes.heroesofddd.shared.Resources; import org.axonframework.modelling.command.TargetAggregateIdentifier; +import java.util.Map; + public record WithdrawResources( @TargetAggregateIdentifier ResourcesPoolId resourcesPoolId, - ResourceType type, - Amount amount + Resources resources ) implements ResourcesPoolCommand { public static WithdrawResources command(String resourcesPoolId, String type, Integer amount) { - return new WithdrawResources(ResourcesPoolId.of(resourcesPoolId), ResourceType.from(type), Amount.of(amount)); + return command(resourcesPoolId, Map.of(type, amount)); + } + + public static WithdrawResources command(String resourcesPoolId, Map resources) { + return new WithdrawResources(ResourcesPoolId.of(resourcesPoolId), Resources.fromRaw(resources)); } } diff --git a/src/main/java/com/dddheroes/heroesofddd/shared/Resources.java b/src/main/java/com/dddheroes/heroesofddd/shared/Resources.java index 8051733..18f45e1 100644 --- a/src/main/java/com/dddheroes/heroesofddd/shared/Resources.java +++ b/src/main/java/com/dddheroes/heroesofddd/shared/Resources.java @@ -26,6 +26,14 @@ public Resources plus(ResourceType type, Amount amount) { return new Resources(newResources); } + public Resources plus(Resources additionalResources) { + return plus(additionalResources.raw); + } + + public Resources minus(Resources additionalResources) { + return minus(additionalResources.raw); + } + public Resources minus(ResourceType type, Amount amount) { Map newResources = new HashMap<>(this.raw); newResources.merge(type, amount, Amount::minus); diff --git a/src/test/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPoolTest.java b/src/test/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPoolTest.java index cb69d97..32844a3 100644 --- a/src/test/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPoolTest.java +++ b/src/test/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPoolTest.java @@ -4,6 +4,7 @@ import com.dddheroes.heroesofddd.resourcespool.write.withdraw.ResourcesWithdrawn; import com.dddheroes.heroesofddd.shared.Amount; import com.dddheroes.heroesofddd.shared.ResourceType; +import com.dddheroes.heroesofddd.shared.Resources; import org.axonframework.test.aggregate.AggregateTestFixture; import org.junit.jupiter.api.*; @@ -18,10 +19,10 @@ void setUp() { } protected ResourcesDeposited resourcesDeposited(ResourceType type, Integer amount) { - return ResourcesDeposited.event(resourcesPoolId, type, Amount.of(amount)); + return ResourcesDeposited.event(resourcesPoolId, Resources.from(type, Amount.of(amount))); } protected ResourcesWithdrawn resourcesWithdrawn(ResourceType type, Integer amount) { - return ResourcesWithdrawn.event(resourcesPoolId, type, Amount.of(amount)); + return ResourcesWithdrawn.event(resourcesPoolId, Resources.from(type, Amount.of(amount))); } }