Compare commits
12 Commits
multi-modu
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e8ea87312 | ||
|
|
919ae2de13 | ||
|
|
13e604d083 | ||
|
|
83ecaa202b | ||
|
|
f5a9be5077 | ||
|
|
4806b68230 | ||
|
|
844ee6b55b | ||
|
|
e8fce429e6 | ||
|
|
31d89ab436 | ||
|
|
e6e9e848d8 | ||
|
|
02256fa543 | ||
|
|
612a40bced |
36
.github/workflows/ci.yml
vendored
Normal file
36
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: "Checkout sources"
|
||||||
|
uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: "Setup Java"
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 14
|
||||||
|
|
||||||
|
- name: "Initialize Gradle dependencies cache"
|
||||||
|
uses: actions/cache@v2
|
||||||
|
with:
|
||||||
|
path: ~/.gradle/caches
|
||||||
|
key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/build.gradle') }}
|
||||||
|
|
||||||
|
- name: "Run Gradle build"
|
||||||
|
run: chmod 755 gradlew && ./gradlew build
|
||||||
|
|
||||||
|
- name: "Zip build reports"
|
||||||
|
if: failure()
|
||||||
|
run: zip -r reports.zip build/reports
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v1
|
||||||
|
name: "Upload build reports"
|
||||||
|
if: failure()
|
||||||
|
with:
|
||||||
|
name: reports
|
||||||
|
path: reports.zip
|
||||||
17
.travis.yml
17
.travis.yml
@@ -1,17 +0,0 @@
|
|||||||
before_install:
|
|
||||||
- chmod +x gradlew
|
|
||||||
- |
|
|
||||||
if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(.md)|^(LICENSE)'
|
|
||||||
then
|
|
||||||
echo "Not running CI since only docs were changed."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
install: ./gradlew assemble
|
|
||||||
|
|
||||||
script: ./gradlew clean build --info
|
|
||||||
|
|
||||||
language: java
|
|
||||||
|
|
||||||
jdk:
|
|
||||||
- oraclejdk11
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
# Example Implementation of a Hexagonal Architecture
|
# Example Implementation of a Hexagonal Architecture
|
||||||
|
|
||||||
[](https://travis-ci.org/thombergs/buckpal)
|
[](https://github.com/thombergs/buckpal/actions/workflows/ci.yml)
|
||||||
|
|
||||||
|
[](https://reflectoring.io/book)
|
||||||
|
|
||||||
This is the companion code to my eBook [Get Your Hands Dirty on Clean Architecture](https://leanpub.com/get-your-hands-dirty-on-clean-architecture).
|
This is the companion code to my eBook [Get Your Hands Dirty on Clean Architecture](https://leanpub.com/get-your-hands-dirty-on-clean-architecture).
|
||||||
|
|
||||||
@@ -13,5 +15,5 @@ It implements a domain-centric "Hexagonal" approach of a common web application
|
|||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
* JDK 8
|
* JDK 11
|
||||||
* this project uses Lombok, so enable annotation processing in your IDE
|
* this project uses Lombok, so enable annotation processing in your IDE
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
implementation project(':common')
|
|
||||||
implementation project(':buckpal-application')
|
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok'
|
|
||||||
annotationProcessor 'org.projectlombok:lombok'
|
|
||||||
|
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
|
||||||
|
|
||||||
testImplementation('org.springframework.boot:spring-boot-starter-test') {
|
|
||||||
exclude group: 'junit' // excluding junit 4
|
|
||||||
}
|
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
|
|
||||||
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
|
|
||||||
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
|
|
||||||
testImplementation 'de.adesso:junit-insights:1.1.0'
|
|
||||||
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
|
|
||||||
testImplementation 'com.h2database:h2'
|
|
||||||
testImplementation project(':buckpal-testdata')
|
|
||||||
}
|
|
||||||
|
|
||||||
test {
|
|
||||||
useJUnitPlatform()
|
|
||||||
systemProperty 'de.adesso.junitinsights.enabled', 'true'
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package io.reflectoring.buckpal.adapter.persistence;
|
|
||||||
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
|
|
||||||
interface AccountRepository extends JpaRepository<AccountJpaEntity, Long> {
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package io.reflectoring.buckpal.adapter.persistence;
|
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
|
|
||||||
@SpringBootApplication
|
|
||||||
class TestApplication {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
SpringApplication.run(TestApplication.class, args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
implementation project(':common')
|
|
||||||
implementation project(':buckpal-application')
|
|
||||||
|
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok'
|
|
||||||
annotationProcessor 'org.projectlombok:lombok'
|
|
||||||
|
|
||||||
testImplementation('org.springframework.boot:spring-boot-starter-test') {
|
|
||||||
exclude group: 'junit' // excluding junit 4
|
|
||||||
}
|
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
|
|
||||||
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
|
|
||||||
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
|
|
||||||
testImplementation 'de.adesso:junit-insights:1.1.0'
|
|
||||||
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
|
|
||||||
}
|
|
||||||
|
|
||||||
test {
|
|
||||||
useJUnitPlatform()
|
|
||||||
systemProperty 'de.adesso.junitinsights.enabled', 'true'
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
Manifest-Version: 1.0
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package io.reflectoring.buckpal.adapter.web;
|
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
|
|
||||||
@SpringBootApplication
|
|
||||||
public class TestApplication {
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
implementation project(':common')
|
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok'
|
|
||||||
annotationProcessor 'org.projectlombok:lombok'
|
|
||||||
|
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
|
||||||
|
|
||||||
implementation 'javax.transaction:javax.transaction-api'
|
|
||||||
|
|
||||||
testImplementation('org.springframework.boot:spring-boot-starter-test') {
|
|
||||||
exclude group: 'junit' // excluding junit 4
|
|
||||||
}
|
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
|
|
||||||
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
|
|
||||||
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
|
|
||||||
testImplementation 'de.adesso:junit-insights:1.1.0'
|
|
||||||
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
|
|
||||||
testImplementation project(':buckpal-testdata')
|
|
||||||
}
|
|
||||||
|
|
||||||
test {
|
|
||||||
useJUnitPlatform()
|
|
||||||
systemProperty 'de.adesso.junitinsights.enabled', 'true'
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -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);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
package io.reflectoring.buckpal.application.port.out;
|
|
||||||
|
|
||||||
import io.reflectoring.buckpal.domain.Account;
|
|
||||||
|
|
||||||
public interface UpdateAccountStatePort {
|
|
||||||
|
|
||||||
void updateActivities(Account account);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
plugins {
|
|
||||||
id "org.springframework.boot" version "2.1.9.RELEASE"
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
|
|
||||||
compileOnly 'org.projectlombok:lombok'
|
|
||||||
annotationProcessor 'org.projectlombok:lombok'
|
|
||||||
|
|
||||||
implementation project(':common')
|
|
||||||
implementation project(':buckpal-application')
|
|
||||||
implementation project(':adapters:buckpal-persistence')
|
|
||||||
implementation project(':adapters:buckpal-web')
|
|
||||||
implementation ('org.springframework.boot:spring-boot-starter-web')
|
|
||||||
runtimeOnly 'com.h2database:h2'
|
|
||||||
|
|
||||||
testImplementation('org.springframework.boot:spring-boot-starter-test') {
|
|
||||||
exclude group: 'junit' // excluding junit 4
|
|
||||||
}
|
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
|
|
||||||
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
|
|
||||||
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
|
|
||||||
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
|
|
||||||
testImplementation 'de.adesso:junit-insights:1.1.0'
|
|
||||||
testImplementation 'com.h2database:h2'
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
test {
|
|
||||||
useJUnitPlatform()
|
|
||||||
systemProperty 'de.adesso.junitinsights.enabled', 'true'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
implementation project(':buckpal-application')
|
|
||||||
}
|
|
||||||
56
build.gradle
56
build.gradle
@@ -1,29 +1,47 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id "io.spring.dependency-management" version "1.0.8.RELEASE"
|
id 'org.springframework.boot' version '2.4.3'
|
||||||
|
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||||
}
|
}
|
||||||
|
|
||||||
subprojects {
|
|
||||||
|
|
||||||
group = 'io.reflectoring.reviewapp'
|
group = 'io.reflectoring.buckpal'
|
||||||
version = '0.0.1-SNAPSHOT'
|
version = '0.0.1-SNAPSHOT'
|
||||||
|
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
apply plugin: 'io.spring.dependency-management'
|
apply plugin: 'io.spring.dependency-management'
|
||||||
apply plugin: 'java-library'
|
apply plugin: 'java-library'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
compileJava {
|
||||||
|
sourceCompatibility = 11
|
||||||
|
targetCompatibility = 11
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly 'org.projectlombok:lombok'
|
||||||
|
annotationProcessor 'org.projectlombok:lombok'
|
||||||
|
|
||||||
|
implementation ('org.springframework.boot:spring-boot-starter-web')
|
||||||
|
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
||||||
|
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
||||||
|
|
||||||
|
testImplementation('org.springframework.boot:spring-boot-starter-test') {
|
||||||
|
exclude group: 'junit' // excluding junit 4
|
||||||
}
|
}
|
||||||
|
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
|
||||||
|
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
|
||||||
|
testImplementation 'com.tngtech.archunit:archunit:0.16.0'
|
||||||
|
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
|
||||||
|
testImplementation 'com.h2database:h2'
|
||||||
|
|
||||||
dependencyManagement {
|
runtimeOnly 'com.h2database:h2'
|
||||||
imports {
|
|
||||||
mavenBom("org.springframework.boot:spring-boot-dependencies:2.1.9.RELEASE")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compileJava {
|
|
||||||
sourceCompatibility = 1.8
|
|
||||||
targetCompatibility = 1.8
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
implementation 'org.springframework:spring-context'
|
|
||||||
implementation 'javax.validation:validation-api'
|
|
||||||
}
|
|
||||||
|
|
||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
include 'common'
|
|
||||||
include 'buckpal-configuration'
|
|
||||||
|
|
||||||
include 'adapters:buckpal-web'
|
|
||||||
include 'adapters:buckpal-persistence'
|
|
||||||
include 'buckpal-application'
|
|
||||||
include 'buckpal-testdata'
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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> {
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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 {
|
||||||
|
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
@@ -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 {
|
||||||
|
|
||||||
@@ -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;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package io.reflectoring.buckpal.domain;
|
package io.reflectoring.buckpal.account.domain;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package io.reflectoring.buckpal.domain;
|
package io.reflectoring.buckpal.account.domain;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
|
||||||
@@ -10,9 +10,9 @@ import java.util.Set;
|
|||||||
public abstract class SelfValidating<T> {
|
public abstract class SelfValidating<T> {
|
||||||
|
|
||||||
private Validator validator;
|
private Validator validator;
|
||||||
|
private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
||||||
|
|
||||||
public SelfValidating() {
|
public SelfValidating() {
|
||||||
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
|
||||||
validator = factory.getValidator();
|
validator = factory.getValidator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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")
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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})
|
||||||
@@ -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.*;
|
||||||
@@ -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.*;
|
||||||
@@ -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;
|
||||||
@@ -23,10 +23,10 @@ abstract class ArchitectureElement {
|
|||||||
static void denyDependency(String fromPackageName, String toPackageName, JavaClasses classes) {
|
static void denyDependency(String fromPackageName, String toPackageName, JavaClasses classes) {
|
||||||
noClasses()
|
noClasses()
|
||||||
.that()
|
.that()
|
||||||
.resideInAPackage("io.reflectoring.reviewapp.domain..")
|
.resideInAPackage(matchAllClassesInPackage(fromPackageName))
|
||||||
.should()
|
.should()
|
||||||
.dependOnClassesThat()
|
.dependOnClassesThat()
|
||||||
.resideInAnyPackage("io.reflectoring.reviewapp.application..")
|
.resideInAnyPackage(matchAllClassesInPackage(toPackageName))
|
||||||
.check(classes);
|
.check(classes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,13 +34,7 @@ abstract class ArchitectureElement {
|
|||||||
List<String> fromPackages, List<String> toPackages, JavaClasses classes) {
|
List<String> fromPackages, List<String> toPackages, JavaClasses classes) {
|
||||||
for (String fromPackage : fromPackages) {
|
for (String fromPackage : fromPackages) {
|
||||||
for (String toPackage : toPackages) {
|
for (String toPackage : toPackages) {
|
||||||
noClasses()
|
denyDependency(fromPackage, toPackage, classes);
|
||||||
.that()
|
|
||||||
.resideInAPackage(matchAllClassesInPackage(fromPackage))
|
|
||||||
.should()
|
|
||||||
.dependOnClassesThat()
|
|
||||||
.resideInAnyPackage(matchAllClassesInPackage(toPackage))
|
|
||||||
.check(classes);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 {
|
||||||
|
|
||||||
@@ -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 {
|
||||||
|
|
||||||
Reference in New Issue
Block a user