Skip to content

Commit e8c0aa3

Browse files
✨ feat: Resources Pool | DepositResources and WithdrawResources supports multiple resource types
1 parent baadf40 commit e8c0aa3

7 files changed

Lines changed: 46 additions & 31 deletions

File tree

src/main/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPool.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import com.dddheroes.heroesofddd.resourcespool.write.withdraw.CannotWithdrawMoreThanDepositedResources;
66
import com.dddheroes.heroesofddd.resourcespool.write.withdraw.ResourcesWithdrawn;
77
import com.dddheroes.heroesofddd.resourcespool.write.withdraw.WithdrawResources;
8-
import com.dddheroes.heroesofddd.shared.Amount;
9-
import com.dddheroes.heroesofddd.shared.ResourceType;
108
import com.dddheroes.heroesofddd.shared.Resources;
119
import org.axonframework.commandhandling.CommandHandler;
1210
import org.axonframework.eventsourcing.EventSourcingHandler;
@@ -27,28 +25,28 @@ class ResourcesPool {
2725
@CommandHandler
2826
@CreationPolicy(AggregateCreationPolicy.CREATE_IF_MISSING)
2927
void decide(DepositResources command) {
30-
apply(ResourcesDeposited.event(command.resourcesPoolId(), command.type(), command.amount()));
28+
apply(ResourcesDeposited.event(command.resourcesPoolId(), command.resources()));
3129
}
3230

3331
@EventSourcingHandler
3432
void evolve(ResourcesDeposited event) {
3533
resourcesPoolId = new ResourcesPoolId(event.resourcesPoolId());
36-
this.balance = balance.plus(ResourceType.from(event.type()), new Amount(event.amount()));
34+
this.balance = balance.plus(Resources.fromRaw(event.resources()));
3735
}
3836

3937
@CommandHandler
4038
void decide(WithdrawResources command) {
4139
new CannotWithdrawMoreThanDepositedResources(
4240
balance,
43-
Resources.from(command.type(), command.amount())
41+
command.resources()
4442
).verify();
45-
apply(ResourcesWithdrawn.event(command.resourcesPoolId(), command.type(), command.amount()));
43+
apply(ResourcesWithdrawn.event(command.resourcesPoolId(), command.resources()));
4644
}
4745

4846
@EventSourcingHandler
4947
void evolve(ResourcesWithdrawn event) {
5048
resourcesPoolId = new ResourcesPoolId(event.resourcesPoolId());
51-
this.balance = balance.minus(ResourceType.from(event.type()), new Amount(event.amount()));
49+
this.balance = balance.minus(Resources.fromRaw(event.resources()));
5250
}
5351

5452
ResourcesPool() {

src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/DepositResources.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@
22

33
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolCommand;
44
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId;
5-
import com.dddheroes.heroesofddd.shared.Amount;
6-
import com.dddheroes.heroesofddd.shared.ResourceType;
5+
import com.dddheroes.heroesofddd.shared.Resources;
76
import org.axonframework.modelling.command.TargetAggregateIdentifier;
87

8+
import java.util.Map;
9+
910
public record DepositResources(
1011
@TargetAggregateIdentifier
1112
ResourcesPoolId resourcesPoolId,
12-
ResourceType type,
13-
Amount amount
13+
Resources resources
1414
) implements ResourcesPoolCommand {
1515

1616
public static DepositResources command(String resourcesPoolId, String type, Integer amount) {
17-
return new DepositResources(ResourcesPoolId.of(resourcesPoolId), ResourceType.from(type), Amount.of(amount));
17+
return command(resourcesPoolId, Map.of(type, amount));
18+
}
19+
20+
public static DepositResources command(String resourcesPoolId, Map<String, Integer> resources) {
21+
return new DepositResources(ResourcesPoolId.of(resourcesPoolId), Resources.fromRaw(resources));
1822
}
1923
}

src/main/java/com/dddheroes/heroesofddd/resourcespool/write/deposit/ResourcesDeposited.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolEvent;
44
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId;
5-
import com.dddheroes.heroesofddd.shared.Amount;
6-
import com.dddheroes.heroesofddd.shared.ResourceType;
5+
import com.dddheroes.heroesofddd.shared.Resources;
6+
7+
import java.util.Map;
78

89
public record ResourcesDeposited(
910
String resourcesPoolId,
10-
String type,
11-
Integer amount
11+
Map<String, Integer> resources
1212
) implements ResourcesPoolEvent {
1313

14-
public static ResourcesDeposited event(ResourcesPoolId resourcesPoolId, ResourceType type, Amount amount) {
15-
return new ResourcesDeposited(resourcesPoolId.raw(), type.name(), amount.raw());
14+
public static ResourcesDeposited event(ResourcesPoolId resourcesPoolId, Resources resources) {
15+
return new ResourcesDeposited(resourcesPoolId.raw(), resources.raw());
1616
}
1717
}

src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/ResourcesWithdrawn.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolEvent;
44
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId;
5-
import com.dddheroes.heroesofddd.shared.Amount;
6-
import com.dddheroes.heroesofddd.shared.ResourceType;
5+
import com.dddheroes.heroesofddd.shared.Resources;
6+
7+
import java.util.Map;
78

89
public record ResourcesWithdrawn(
910
String resourcesPoolId,
10-
String type,
11-
Integer amount
11+
Map<String, Integer> resources
1212
) implements ResourcesPoolEvent {
1313

14-
public static ResourcesWithdrawn event(ResourcesPoolId resourcesPoolId, ResourceType type, Amount amount) {
15-
return new ResourcesWithdrawn(resourcesPoolId.raw(), type.name(), amount.raw());
14+
public static ResourcesWithdrawn event(ResourcesPoolId resourcesPoolId, Resources resources) {
15+
return new ResourcesWithdrawn(resourcesPoolId.raw(), resources.raw());
1616
}
1717
}

src/main/java/com/dddheroes/heroesofddd/resourcespool/write/withdraw/WithdrawResources.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@
22

33
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolCommand;
44
import com.dddheroes.heroesofddd.resourcespool.write.ResourcesPoolId;
5-
import com.dddheroes.heroesofddd.shared.Amount;
6-
import com.dddheroes.heroesofddd.shared.ResourceType;
5+
import com.dddheroes.heroesofddd.shared.Resources;
76
import org.axonframework.modelling.command.TargetAggregateIdentifier;
87

8+
import java.util.Map;
9+
910
public record WithdrawResources(
1011
@TargetAggregateIdentifier
1112
ResourcesPoolId resourcesPoolId,
12-
ResourceType type,
13-
Amount amount
13+
Resources resources
1414
) implements ResourcesPoolCommand {
1515

1616
public static WithdrawResources command(String resourcesPoolId, String type, Integer amount) {
17-
return new WithdrawResources(ResourcesPoolId.of(resourcesPoolId), ResourceType.from(type), Amount.of(amount));
17+
return command(resourcesPoolId, Map.of(type, amount));
18+
}
19+
20+
public static WithdrawResources command(String resourcesPoolId, Map<String, Integer> resources) {
21+
return new WithdrawResources(ResourcesPoolId.of(resourcesPoolId), Resources.fromRaw(resources));
1822
}
1923
}

src/main/java/com/dddheroes/heroesofddd/shared/Resources.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ public Resources plus(ResourceType type, Amount amount) {
2626
return new Resources(newResources);
2727
}
2828

29+
public Resources plus(Resources additionalResources) {
30+
return plus(additionalResources.raw);
31+
}
32+
33+
public Resources minus(Resources additionalResources) {
34+
return minus(additionalResources.raw);
35+
}
36+
2937
public Resources minus(ResourceType type, Amount amount) {
3038
Map<ResourceType, Amount> newResources = new HashMap<>(this.raw);
3139
newResources.merge(type, amount, Amount::minus);

src/test/java/com/dddheroes/heroesofddd/resourcespool/write/ResourcesPoolTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.dddheroes.heroesofddd.resourcespool.write.withdraw.ResourcesWithdrawn;
55
import com.dddheroes.heroesofddd.shared.Amount;
66
import com.dddheroes.heroesofddd.shared.ResourceType;
7+
import com.dddheroes.heroesofddd.shared.Resources;
78
import org.axonframework.test.aggregate.AggregateTestFixture;
89
import org.junit.jupiter.api.*;
910

@@ -18,10 +19,10 @@ void setUp() {
1819
}
1920

2021
protected ResourcesDeposited resourcesDeposited(ResourceType type, Integer amount) {
21-
return ResourcesDeposited.event(resourcesPoolId, type, Amount.of(amount));
22+
return ResourcesDeposited.event(resourcesPoolId, Resources.from(type, Amount.of(amount)));
2223
}
2324

2425
protected ResourcesWithdrawn resourcesWithdrawn(ResourceType type, Integer amount) {
25-
return ResourcesWithdrawn.event(resourcesPoolId, type, Amount.of(amount));
26+
return ResourcesWithdrawn.event(resourcesPoolId, Resources.from(type, Amount.of(amount)));
2627
}
2728
}

0 commit comments

Comments
 (0)