refactor code to be easier to match with the code snippets in the book

This commit is contained in:
Tom Hombergs
2021-02-20 13:40:34 +11:00
parent 02256fa543
commit e6e9e848d8
38 changed files with 170 additions and 164 deletions

View File

@@ -1,7 +1,7 @@
package io.reflectoring.buckpal; package io.reflectoring.buckpal;
import io.reflectoring.buckpal.application.service.MoneyTransferProperties; import io.reflectoring.buckpal.account.application.service.MoneyTransferProperties;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;

View File

@@ -1,10 +1,10 @@
package io.reflectoring.buckpal.adapter.web; package io.reflectoring.buckpal.account.adapter.in.web;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase; import io.reflectoring.buckpal.account.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand; import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.common.WebAdapter; import io.reflectoring.buckpal.common.WebAdapter;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.adapter.persistence; package io.reflectoring.buckpal.account.adapter.out.persistence;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;

View File

@@ -1,14 +1,14 @@
package io.reflectoring.buckpal.adapter.persistence; package io.reflectoring.buckpal.account.adapter.out.persistence;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import io.reflectoring.buckpal.domain.Account; import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity; import io.reflectoring.buckpal.account.domain.Activity;
import io.reflectoring.buckpal.domain.Activity.ActivityId; import io.reflectoring.buckpal.account.domain.Activity.ActivityId;
import io.reflectoring.buckpal.domain.ActivityWindow; import io.reflectoring.buckpal.account.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component

View File

@@ -1,18 +1,17 @@
package io.reflectoring.buckpal.adapter.persistence; package io.reflectoring.buckpal.account.adapter.out.persistence;
import javax.persistence.EntityNotFoundException; import javax.persistence.EntityNotFoundException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort; import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort; import io.reflectoring.buckpal.account.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Activity;
import io.reflectoring.buckpal.common.PersistenceAdapter; import io.reflectoring.buckpal.common.PersistenceAdapter;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@RequiredArgsConstructor @RequiredArgsConstructor
@PersistenceAdapter @PersistenceAdapter
@@ -20,7 +19,7 @@ class AccountPersistenceAdapter implements
LoadAccountPort, LoadAccountPort,
UpdateAccountStatePort { UpdateAccountStatePort {
private final AccountRepository accountRepository; private final SpringDataAccountRepository accountRepository;
private final ActivityRepository activityRepository; private final ActivityRepository activityRepository;
private final AccountMapper accountMapper; private final AccountMapper accountMapper;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.adapter.persistence; package io.reflectoring.buckpal.account.adapter.out.persistence;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.adapter.persistence; package io.reflectoring.buckpal.account.adapter.out.persistence;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;

View File

@@ -0,0 +1,6 @@
package io.reflectoring.buckpal.account.adapter.out.persistence;
import org.springframework.data.jpa.repository.JpaRepository;
interface SpringDataAccountRepository extends JpaRepository<AccountJpaEntity, Long> {
}

View File

@@ -0,0 +1,10 @@
package io.reflectoring.buckpal.account.application.port.in;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
public interface GetAccountBalanceQuery {
Money getAccountBalance(AccountId accountId);
}

View File

@@ -0,0 +1,34 @@
package io.reflectoring.buckpal.account.application.port.in;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import io.reflectoring.buckpal.common.SelfValidating;
import lombok.EqualsAndHashCode;
import lombok.Value;
import javax.validation.constraints.NotNull;
@Value
@EqualsAndHashCode(callSuper = false)
public
class SendMoneyCommand extends SelfValidating<SendMoneyCommand> {
@NotNull
private final AccountId sourceAccountId;
@NotNull
private final AccountId targetAccountId;
@NotNull
private final Money money;
public SendMoneyCommand(
AccountId sourceAccountId,
AccountId targetAccountId,
Money money) {
this.sourceAccountId = sourceAccountId;
this.targetAccountId = targetAccountId;
this.money = money;
this.validateSelf();
}
}

View File

@@ -0,0 +1,11 @@
package io.reflectoring.buckpal.account.application.port.in;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import io.reflectoring.buckpal.common.SelfValidating;
public interface SendMoneyUseCase {
boolean sendMoney(SendMoneyCommand command);
}

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.application.port.out; package io.reflectoring.buckpal.account.application.port.out;
import io.reflectoring.buckpal.domain.Account; import io.reflectoring.buckpal.account.domain.Account;
public interface AccountLock { public interface AccountLock {

View File

@@ -0,0 +1,11 @@
package io.reflectoring.buckpal.account.application.port.out;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
public interface LoadAccountPort {
Account loadAccount(AccountId accountId, LocalDateTime baselineDate);
}

View File

@@ -0,0 +1,9 @@
package io.reflectoring.buckpal.account.application.port.out;
import io.reflectoring.buckpal.account.domain.Account;
public interface UpdateAccountStatePort {
void updateActivities(Account account);
}

View File

@@ -1,11 +1,11 @@
package io.reflectoring.buckpal.application.service; package io.reflectoring.buckpal.account.application.service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import io.reflectoring.buckpal.application.port.in.GetAccountBalanceQuery; import io.reflectoring.buckpal.account.application.port.in.GetAccountBalanceQuery;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort; import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.application.service; package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;

View File

@@ -1,7 +1,7 @@
package io.reflectoring.buckpal.application.service; package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.application.port.out.AccountLock; import io.reflectoring.buckpal.account.application.port.out.AccountLock;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component

View File

@@ -1,12 +1,13 @@
package io.reflectoring.buckpal.application.service; package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase; import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.application.port.out.AccountLock; import io.reflectoring.buckpal.account.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort; import io.reflectoring.buckpal.account.application.port.out.AccountLock;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort; import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.account.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.common.UseCase; import io.reflectoring.buckpal.common.UseCase;
import io.reflectoring.buckpal.domain.Account; import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import javax.transaction.Transactional; import javax.transaction.Transactional;

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.application.service; package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
public class ThresholdExceededException extends RuntimeException { public class ThresholdExceededException extends RuntimeException {

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain; package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Optional; import java.util.Optional;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain; package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime; import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain; package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
@@ -7,7 +7,7 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import lombok.NonNull; import lombok.NonNull;
/** /**

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain; package io.reflectoring.buckpal.account.domain;
import java.math.BigInteger; import java.math.BigInteger;

View File

@@ -1,6 +0,0 @@
package io.reflectoring.buckpal.adapter.persistence;
import org.springframework.data.jpa.repository.JpaRepository;
interface AccountRepository extends JpaRepository<AccountJpaEntity, Long> {
}

View File

@@ -1,10 +0,0 @@
package io.reflectoring.buckpal.application.port.in;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
public interface GetAccountBalanceQuery {
Money getAccountBalance(AccountId accountId);
}

View File

@@ -1,39 +0,0 @@
package io.reflectoring.buckpal.application.port.in;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.common.SelfValidating;
import lombok.EqualsAndHashCode;
import lombok.Value;
import javax.validation.constraints.NotNull;
public interface SendMoneyUseCase {
boolean sendMoney(SendMoneyCommand command);
@Value
@EqualsAndHashCode(callSuper = false)
class SendMoneyCommand extends SelfValidating<SendMoneyCommand> {
@NotNull
private final AccountId sourceAccountId;
@NotNull
private final AccountId targetAccountId;
@NotNull
private final Money money;
public SendMoneyCommand(
AccountId sourceAccountId,
AccountId targetAccountId,
Money money) {
this.sourceAccountId = sourceAccountId;
this.targetAccountId = targetAccountId;
this.money = money;
this.validateSelf();
}
}
}

View File

@@ -1,11 +0,0 @@
package io.reflectoring.buckpal.application.port.out;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
public interface LoadAccountPort {
Account loadAccount(AccountId accountId, LocalDateTime baselineDate);
}

View File

@@ -1,9 +0,0 @@
package io.reflectoring.buckpal.application.port.out;
import io.reflectoring.buckpal.domain.Account;
public interface UpdateAccountStatePort {
void updateActivities(Account account);
}

View File

@@ -9,13 +9,13 @@ class DependencyRuleTests {
@Test @Test
void validateRegistrationContextArchitecture() { void validateRegistrationContextArchitecture() {
HexagonalArchitecture.boundedContext("io.reflectoring.buckpal") HexagonalArchitecture.boundedContext("io.reflectoring.buckpal.account")
.withDomainLayer("domain") .withDomainLayer("domain")
.withAdaptersLayer("adapter") .withAdaptersLayer("adapter")
.incoming("web") .incoming("in.web")
.outgoing("persistence") .outgoing("out.persistence")
.and() .and()
.withApplicationLayer("application") .withApplicationLayer("application")

View File

@@ -2,10 +2,10 @@ package io.reflectoring.buckpal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort; import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.domain.Account; import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;

View File

@@ -1,9 +1,9 @@
package io.reflectoring.buckpal.adapter.web; package io.reflectoring.buckpal.account.adapter.in.web;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase; import io.reflectoring.buckpal.account.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand; import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;

View File

@@ -1,11 +1,11 @@
package io.reflectoring.buckpal.adapter.persistence; package io.reflectoring.buckpal.account.adapter.out.persistence;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account; import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.ActivityWindow; import io.reflectoring.buckpal.account.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@@ -13,7 +13,7 @@ import org.springframework.context.annotation.Import;
import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql;
import static io.reflectoring.buckpal.common.AccountTestData.*; import static io.reflectoring.buckpal.common.AccountTestData.*;
import static io.reflectoring.buckpal.common.ActivityTestData.*; import static io.reflectoring.buckpal.common.ActivityTestData.*;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest @DataJpaTest
@Import({AccountPersistenceAdapter.class, AccountMapper.class}) @Import({AccountPersistenceAdapter.class, AccountMapper.class})

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.domain; package io.reflectoring.buckpal.account.domain;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static io.reflectoring.buckpal.common.AccountTestData.*; import static io.reflectoring.buckpal.common.AccountTestData.*;
import static io.reflectoring.buckpal.common.ActivityTestData.*; import static io.reflectoring.buckpal.common.ActivityTestData.*;

View File

@@ -1,8 +1,8 @@
package io.reflectoring.buckpal.domain; package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import org.assertj.core.api.Assertions; import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static io.reflectoring.buckpal.common.ActivityTestData.*; import static io.reflectoring.buckpal.common.ActivityTestData.*;

View File

@@ -1,12 +1,12 @@
package io.reflectoring.buckpal.application.service; package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand; import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.application.port.out.AccountLock; import io.reflectoring.buckpal.account.application.port.out.AccountLock;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort; import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort; import io.reflectoring.buckpal.account.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.domain.Account; import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mockito; import org.mockito.Mockito;

View File

@@ -1,9 +1,9 @@
package io.reflectoring.buckpal.common; package io.reflectoring.buckpal.common;
import io.reflectoring.buckpal.domain.Account; import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.ActivityWindow; import io.reflectoring.buckpal.account.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
public class AccountTestData { public class AccountTestData {

View File

@@ -2,10 +2,10 @@ package io.reflectoring.buckpal.common;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account.AccountId; import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity; import io.reflectoring.buckpal.account.domain.Activity;
import io.reflectoring.buckpal.domain.Activity.ActivityId; import io.reflectoring.buckpal.account.domain.Activity.ActivityId;
import io.reflectoring.buckpal.domain.Money; import io.reflectoring.buckpal.account.domain.Money;
public class ActivityTestData { public class ActivityTestData {