From 75bb5aa5aad914d50c54f030e4475346d4682a29 Mon Sep 17 00:00:00 2001 From: Serghei Motpan Date: Sat, 23 Mar 2024 20:05:04 +0200 Subject: [PATCH] Reorder packages and add custom Guard usage for validations --- .../java/io/myfinbox/account/Account.java | 92 ------------------- .../io/myfinbox/account/AccountCreated.java | 15 +-- .../{ => adapter}/web/AccountController.java | 6 +- .../web/AccountControllerApi.java | 2 +- .../CreateAccountService.java | 6 +- .../CreateAccountUseCase.java | 3 +- .../io/myfinbox/account/domain/Account.java | 81 ++++++++++++++++ .../account/{ => domain}/Accounts.java | 6 +- .../messaging/AccountEventsListener.java | 8 +- .../{ => adapter}/web/ExpenseController.java | 8 +- .../web/ExpenseControllerApi.java | 2 +- .../{ => application}/CategoryService.java | 4 +- .../CreateExpenseService.java | 8 +- .../CreateExpenseUseCase.java | 3 +- .../DefaultCategoryService.java | 6 +- .../{ => application}/ExpenseCommand.java | 2 +- .../ExpenseCommandValidator.java | 4 +- .../{ => domain}/AccountIdentifier.java | 6 +- .../expense/{ => domain}/Categories.java | 4 +- .../expense/{ => domain}/Category.java | 25 ++--- .../{ => domain}/DefaultCategories.java | 2 +- .../expense/{ => domain}/Expense.java | 3 +- .../expense/{ => domain}/Expenses.java | 4 +- .../messaging/AccountEventsListener.java | 8 +- .../DefaultIncomeSourceService.java | 6 +- .../IncomeSourceService.java | 4 +- .../{ => domain}/AccountIdentifier.java | 6 +- .../{ => domain}/DefaultIncomeSources.java | 2 +- .../income/{ => domain}/IncomeSource.java | 25 ++--- .../income/{ => domain}/IncomeSources.java | 4 +- .../io/myfinbox/shared/ApiFailureHandler.java | 4 +- .../main/java/io/myfinbox/shared/Failure.java | 4 +- .../io/myfinbox/account/DataSamples.groovy | 11 ++- .../web/AccountControllerSpec.groovy | 2 +- .../CreateAccountServiceSpec.groovy | 5 +- .../io/myfinbox/expense/DataSamples.groovy | 5 + .../AccountEventsListenerSpec.groovy | 18 ++-- .../web/ExpenseControllerSpec.groovy | 2 +- .../CreateExpenseServiceSpec.groovy | 11 ++- .../DefaultCategoryServiceSpec.groovy | 6 +- .../io/myfinbox/income/DataSamples.groovy | 3 + .../AccountEventsListenerSpec.groovy | 18 ++-- .../DefaultIncomeSourceServiceSpec.groovy | 6 +- 43 files changed, 224 insertions(+), 226 deletions(-) delete mode 100644 server/src/main/java/io/myfinbox/account/Account.java rename server/src/main/java/io/myfinbox/account/{ => adapter}/web/AccountController.java (89%) rename server/src/main/java/io/myfinbox/account/{ => adapter}/web/AccountControllerApi.java (98%) rename server/src/main/java/io/myfinbox/account/{ => application}/CreateAccountService.java (95%) rename server/src/main/java/io/myfinbox/account/{ => application}/CreateAccountUseCase.java (91%) create mode 100644 server/src/main/java/io/myfinbox/account/domain/Account.java rename server/src/main/java/io/myfinbox/account/{ => domain}/Accounts.java (67%) rename server/src/main/java/io/myfinbox/expense/{ => adapter}/messaging/AccountEventsListener.java (84%) rename server/src/main/java/io/myfinbox/expense/{ => adapter}/web/ExpenseController.java (92%) rename server/src/main/java/io/myfinbox/expense/{ => adapter}/web/ExpenseControllerApi.java (98%) rename server/src/main/java/io/myfinbox/expense/{ => application}/CategoryService.java (80%) rename server/src/main/java/io/myfinbox/expense/{ => application}/CreateExpenseService.java (86%) rename server/src/main/java/io/myfinbox/expense/{ => application}/CreateExpenseUseCase.java (85%) rename server/src/main/java/io/myfinbox/expense/{ => application}/DefaultCategoryService.java (79%) rename server/src/main/java/io/myfinbox/expense/{ => application}/ExpenseCommand.java (95%) rename server/src/main/java/io/myfinbox/expense/{ => application}/ExpenseCommandValidator.java (97%) rename server/src/main/java/io/myfinbox/expense/{ => domain}/AccountIdentifier.java (69%) rename server/src/main/java/io/myfinbox/expense/{ => domain}/Categories.java (81%) rename server/src/main/java/io/myfinbox/expense/{ => domain}/Category.java (62%) rename server/src/main/java/io/myfinbox/expense/{ => domain}/DefaultCategories.java (94%) rename server/src/main/java/io/myfinbox/expense/{ => domain}/Expense.java (97%) rename server/src/main/java/io/myfinbox/expense/{ => domain}/Expenses.java (66%) rename server/src/main/java/io/myfinbox/income/{ => adapter}/messaging/AccountEventsListener.java (86%) rename server/src/main/java/io/myfinbox/income/{ => application}/DefaultIncomeSourceService.java (79%) rename server/src/main/java/io/myfinbox/income/{ => application}/IncomeSourceService.java (80%) rename server/src/main/java/io/myfinbox/income/{ => domain}/AccountIdentifier.java (73%) rename server/src/main/java/io/myfinbox/income/{ => domain}/DefaultIncomeSources.java (92%) rename server/src/main/java/io/myfinbox/income/{ => domain}/IncomeSource.java (63%) rename server/src/main/java/io/myfinbox/income/{ => domain}/IncomeSources.java (78%) rename server/src/test/groovy/io/myfinbox/account/{ => adapter}/web/AccountControllerSpec.groovy (99%) rename server/src/test/groovy/io/myfinbox/account/{ => application}/CreateAccountServiceSpec.groovy (97%) rename server/src/test/groovy/io/myfinbox/expense/{ => adapter}/messaging/AccountEventsListenerSpec.groovy (84%) rename server/src/test/groovy/io/myfinbox/expense/{ => adapter}/web/ExpenseControllerSpec.groovy (99%) rename server/src/test/groovy/io/myfinbox/expense/{ => application}/CreateExpenseServiceSpec.groovy (94%) rename server/src/test/groovy/io/myfinbox/expense/{ => application}/DefaultCategoryServiceSpec.groovy (86%) rename server/src/test/groovy/io/myfinbox/income/{ => adapter}/messaging/AccountEventsListenerSpec.groovy (83%) rename server/src/test/groovy/io/myfinbox/income/{ => application}/DefaultIncomeSourceServiceSpec.groovy (86%) diff --git a/server/src/main/java/io/myfinbox/account/Account.java b/server/src/main/java/io/myfinbox/account/Account.java deleted file mode 100644 index ed9a800..0000000 --- a/server/src/main/java/io/myfinbox/account/Account.java +++ /dev/null @@ -1,92 +0,0 @@ -package io.myfinbox.account; - -import jakarta.persistence.*; -import lombok.*; -import org.apache.commons.lang3.StringUtils; -import org.springframework.data.domain.AbstractAggregateRoot; - -import java.io.Serializable; -import java.time.Instant; -import java.util.UUID; - -import static java.util.Objects.requireNonNull; -import static java.util.regex.Pattern.compile; -import static lombok.AccessLevel.PRIVATE; -import static org.apache.commons.lang3.StringUtils.isBlank; - -@Entity -@Table(name = "accounts") -@Getter -@ToString -@EqualsAndHashCode(callSuper = false) -@NoArgsConstructor(access = PRIVATE, force = true) -public class Account extends AbstractAggregateRoot { - - static final String patternRFC5322 = "^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$"; - static final int MAX_LENGTH = 255; - - private @EmbeddedId AccountIdentifier id; - private @Embedded EmailAddress emailAddress; - private String firstName; - private String lastName; - private Instant creationDate; - - @Builder - public Account(String firstName, String lastName, EmailAddress emailAddress) { - this.emailAddress = requireNonNull(emailAddress, "emailAddress cannot be null"); - - if (!StringUtils.isBlank(firstName)) { - requireNonOverflow(firstName, "firstName overflow, max length allowed '%d'".formatted(MAX_LENGTH)); - this.firstName = firstName.trim(); - } - - if (!StringUtils.isBlank(lastName)) { - requireNonOverflow(lastName, "lastName overflow, max length allowed '%d'".formatted(MAX_LENGTH)); - this.lastName = lastName.trim(); - } - - this.id = new AccountIdentifier(UUID.randomUUID()); - this.creationDate = Instant.now(); - - registerEvent(new AccountCreated(this.id, this.emailAddress, firstName, lastName)); - } - - private static void requireNonOverflow(String text, String message) { - if (StringUtils.length(text) > Account.MAX_LENGTH) - throw new IllegalArgumentException(message); - } - - @Embeddable - public record AccountIdentifier(UUID id) implements Serializable { - - public AccountIdentifier { - requireNonNull(id, "id cannot be null"); - } - - @Override - public String toString() { - return id.toString(); - } - } - - @Embeddable - public record EmailAddress(String emailAddress) implements Serializable { - - public EmailAddress { - if (isBlank(emailAddress)) { - throw new IllegalArgumentException("emailAddress cannot be blank"); - } - - requireNonOverflow(emailAddress, "emailAddress max length must be '%d'".formatted(MAX_LENGTH)); - - if (!compile(patternRFC5322).matcher(emailAddress).matches()) { - throw new IllegalArgumentException("emailAddress must match '%s'".formatted(patternRFC5322)); - } - } - - @Override - public String toString() { - return emailAddress; - } - } -} diff --git a/server/src/main/java/io/myfinbox/account/AccountCreated.java b/server/src/main/java/io/myfinbox/account/AccountCreated.java index ccd8864..27b184e 100644 --- a/server/src/main/java/io/myfinbox/account/AccountCreated.java +++ b/server/src/main/java/io/myfinbox/account/AccountCreated.java @@ -1,23 +1,24 @@ package io.myfinbox.account; -import io.myfinbox.account.Account.AccountIdentifier; -import io.myfinbox.account.Account.EmailAddress; import io.myfinbox.shared.DomainEvent; import lombok.Builder; -import static java.util.Objects.requireNonNull; +import java.util.UUID; + +import static io.myfinbox.shared.Guards.notBlank; +import static io.myfinbox.shared.Guards.notNull; /** * Represents an event indicating that an account has been created. */ @Builder -public record AccountCreated(AccountIdentifier accountIdentifier, - EmailAddress emailAddress, +public record AccountCreated(UUID accountId, + String emailAddress, String firstName, String lastName) implements DomainEvent { public AccountCreated { - requireNonNull(accountIdentifier, "accountIdentifier cannot be null"); - requireNonNull(emailAddress, "emailAddress cannot be null"); + notNull(accountId, "accountIdentifier cannot be null"); + notBlank(emailAddress, "emailAddress cannot be blank"); } } diff --git a/server/src/main/java/io/myfinbox/account/web/AccountController.java b/server/src/main/java/io/myfinbox/account/adapter/web/AccountController.java similarity index 89% rename from server/src/main/java/io/myfinbox/account/web/AccountController.java rename to server/src/main/java/io/myfinbox/account/adapter/web/AccountController.java index 424bec7..d91f641 100644 --- a/server/src/main/java/io/myfinbox/account/web/AccountController.java +++ b/server/src/main/java/io/myfinbox/account/adapter/web/AccountController.java @@ -1,7 +1,7 @@ -package io.myfinbox.account.web; +package io.myfinbox.account.adapter.web; -import io.myfinbox.account.CreateAccountUseCase; -import io.myfinbox.account.CreateAccountUseCase.CreateAccountCommand; +import io.myfinbox.account.application.CreateAccountUseCase; +import io.myfinbox.account.application.CreateAccountUseCase.CreateAccountCommand; import io.myfinbox.shared.AccountCreateResource; import io.myfinbox.shared.ApiFailureHandler; import lombok.RequiredArgsConstructor; diff --git a/server/src/main/java/io/myfinbox/account/web/AccountControllerApi.java b/server/src/main/java/io/myfinbox/account/adapter/web/AccountControllerApi.java similarity index 98% rename from server/src/main/java/io/myfinbox/account/web/AccountControllerApi.java rename to server/src/main/java/io/myfinbox/account/adapter/web/AccountControllerApi.java index 9ac4ee5..22b343b 100644 --- a/server/src/main/java/io/myfinbox/account/web/AccountControllerApi.java +++ b/server/src/main/java/io/myfinbox/account/adapter/web/AccountControllerApi.java @@ -1,4 +1,4 @@ -package io.myfinbox.account.web; +package io.myfinbox.account.adapter.web; import io.myfinbox.shared.AccountCreateResource; import io.myfinbox.shared.ApiErrorResponse; diff --git a/server/src/main/java/io/myfinbox/account/CreateAccountService.java b/server/src/main/java/io/myfinbox/account/application/CreateAccountService.java similarity index 95% rename from server/src/main/java/io/myfinbox/account/CreateAccountService.java rename to server/src/main/java/io/myfinbox/account/application/CreateAccountService.java index ada07ec..8101b7b 100644 --- a/server/src/main/java/io/myfinbox/account/CreateAccountService.java +++ b/server/src/main/java/io/myfinbox/account/application/CreateAccountService.java @@ -1,5 +1,7 @@ -package io.myfinbox.account; +package io.myfinbox.account.application; +import io.myfinbox.account.domain.Account; +import io.myfinbox.account.domain.Accounts; import io.myfinbox.shared.Failure; import io.myfinbox.shared.Failure.FieldViolation; import io.vavr.collection.Seq; @@ -12,7 +14,7 @@ import java.util.regex.Pattern; -import static io.myfinbox.account.CreateAccountUseCase.CreateAccountCommand.*; +import static io.myfinbox.account.application.CreateAccountUseCase.CreateAccountCommand.*; import static io.vavr.API.Invalid; import static io.vavr.API.Valid; diff --git a/server/src/main/java/io/myfinbox/account/CreateAccountUseCase.java b/server/src/main/java/io/myfinbox/account/application/CreateAccountUseCase.java similarity index 91% rename from server/src/main/java/io/myfinbox/account/CreateAccountUseCase.java rename to server/src/main/java/io/myfinbox/account/application/CreateAccountUseCase.java index 0cfb70f..6690131 100644 --- a/server/src/main/java/io/myfinbox/account/CreateAccountUseCase.java +++ b/server/src/main/java/io/myfinbox/account/application/CreateAccountUseCase.java @@ -1,5 +1,6 @@ -package io.myfinbox.account; +package io.myfinbox.account.application; +import io.myfinbox.account.domain.Account; import io.myfinbox.shared.Failure; import io.vavr.control.Either; import lombok.Builder; diff --git a/server/src/main/java/io/myfinbox/account/domain/Account.java b/server/src/main/java/io/myfinbox/account/domain/Account.java new file mode 100644 index 0000000..aa230b2 --- /dev/null +++ b/server/src/main/java/io/myfinbox/account/domain/Account.java @@ -0,0 +1,81 @@ +package io.myfinbox.account.domain; + +import io.myfinbox.account.AccountCreated; +import jakarta.persistence.*; +import lombok.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.AbstractAggregateRoot; + +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; +import java.util.regex.Pattern; + +import static io.myfinbox.shared.Guards.*; +import static lombok.AccessLevel.PRIVATE; + +@Entity +@Table(name = "accounts") +@Getter +@ToString +@EqualsAndHashCode(callSuper = false) +@NoArgsConstructor(access = PRIVATE, force = true) +public class Account extends AbstractAggregateRoot { + + public static final int MAX_LENGTH = 255; + + public static final String patternRFC5322 = "^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$"; + static final Pattern pattern = Pattern.compile(patternRFC5322); + + private @EmbeddedId AccountIdentifier id; + private @Embedded EmailAddress emailAddress; + private String firstName; + private String lastName; + private Instant creationDate; + + @Builder + public Account(String firstName, String lastName, EmailAddress emailAddress) { + this.emailAddress = notNull(emailAddress, "emailAddress cannot be null"); + + if (!StringUtils.isBlank(firstName)) { + this.firstName = doesNotOverflow(firstName.trim(), MAX_LENGTH, "firstName overflow, max length allowed '%d'".formatted(MAX_LENGTH)); + } + + if (!StringUtils.isBlank(lastName)) { + this.lastName = doesNotOverflow(lastName.trim(), MAX_LENGTH, "lastName overflow, max length allowed '%d'".formatted(MAX_LENGTH)); + } + + this.id = new AccountIdentifier(UUID.randomUUID()); + this.creationDate = Instant.now(); + + registerEvent(new AccountCreated(this.id.id(), this.emailAddress.emailAddress(), firstName, lastName)); + } + + @Embeddable + public record AccountIdentifier(UUID id) implements Serializable { + + public AccountIdentifier { + notNull(id, "id cannot be null"); + } + + @Override + public String toString() { + return id.toString(); + } + } + + @Embeddable + public record EmailAddress(String emailAddress) implements Serializable { + + public EmailAddress { + notBlank(emailAddress, "emailAddress cannot be blank"); + doesNotOverflow(emailAddress.trim(), MAX_LENGTH, "emailAddress max length must be '%d'".formatted(MAX_LENGTH)); + matches(emailAddress, pattern, "emailAddress must match '%s'".formatted(patternRFC5322)); + } + + @Override + public String toString() { + return emailAddress; + } + } +} diff --git a/server/src/main/java/io/myfinbox/account/Accounts.java b/server/src/main/java/io/myfinbox/account/domain/Accounts.java similarity index 67% rename from server/src/main/java/io/myfinbox/account/Accounts.java rename to server/src/main/java/io/myfinbox/account/domain/Accounts.java index 0861d72..b2cd7ea 100644 --- a/server/src/main/java/io/myfinbox/account/Accounts.java +++ b/server/src/main/java/io/myfinbox/account/domain/Accounts.java @@ -1,7 +1,7 @@ -package io.myfinbox.account; +package io.myfinbox.account.domain; -import io.myfinbox.account.Account.AccountIdentifier; -import io.myfinbox.account.Account.EmailAddress; +import io.myfinbox.account.domain.Account.AccountIdentifier; +import io.myfinbox.account.domain.Account.EmailAddress; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; diff --git a/server/src/main/java/io/myfinbox/expense/messaging/AccountEventsListener.java b/server/src/main/java/io/myfinbox/expense/adapter/messaging/AccountEventsListener.java similarity index 84% rename from server/src/main/java/io/myfinbox/expense/messaging/AccountEventsListener.java rename to server/src/main/java/io/myfinbox/expense/adapter/messaging/AccountEventsListener.java index 0714cee..e35d18c 100644 --- a/server/src/main/java/io/myfinbox/expense/messaging/AccountEventsListener.java +++ b/server/src/main/java/io/myfinbox/expense/adapter/messaging/AccountEventsListener.java @@ -1,8 +1,8 @@ -package io.myfinbox.expense.messaging; +package io.myfinbox.expense.adapter.messaging; import io.myfinbox.account.AccountCreated; -import io.myfinbox.expense.AccountIdentifier; -import io.myfinbox.expense.CategoryService; +import io.myfinbox.expense.application.CategoryService; +import io.myfinbox.expense.domain.AccountIdentifier; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.modulith.events.ApplicationModuleListener; @@ -26,7 +26,7 @@ class AccountEventsListener { @ApplicationModuleListener public void on(AccountCreated event) { log.debug("Handle account create event {}", event); - var either = categoryService.createDefault(new AccountIdentifier(event.accountIdentifier().id())); + var either = categoryService.createDefault(new AccountIdentifier(event.accountId())); if (either.isLeft()) { log.error("Failed to create default categories for account: {}, failure: {}", event, either.getLeft()); diff --git a/server/src/main/java/io/myfinbox/expense/web/ExpenseController.java b/server/src/main/java/io/myfinbox/expense/adapter/web/ExpenseController.java similarity index 92% rename from server/src/main/java/io/myfinbox/expense/web/ExpenseController.java rename to server/src/main/java/io/myfinbox/expense/adapter/web/ExpenseController.java index 18a6b50..0bc2207 100644 --- a/server/src/main/java/io/myfinbox/expense/web/ExpenseController.java +++ b/server/src/main/java/io/myfinbox/expense/adapter/web/ExpenseController.java @@ -1,8 +1,8 @@ -package io.myfinbox.expense.web; +package io.myfinbox.expense.adapter.web; -import io.myfinbox.expense.CreateExpenseUseCase; -import io.myfinbox.expense.Expense; -import io.myfinbox.expense.ExpenseCommand; +import io.myfinbox.expense.application.CreateExpenseUseCase; +import io.myfinbox.expense.application.ExpenseCommand; +import io.myfinbox.expense.domain.Expense; import io.myfinbox.shared.ApiFailureHandler; import io.myfinbox.shared.ExpenseResource; import lombok.RequiredArgsConstructor; diff --git a/server/src/main/java/io/myfinbox/expense/web/ExpenseControllerApi.java b/server/src/main/java/io/myfinbox/expense/adapter/web/ExpenseControllerApi.java similarity index 98% rename from server/src/main/java/io/myfinbox/expense/web/ExpenseControllerApi.java rename to server/src/main/java/io/myfinbox/expense/adapter/web/ExpenseControllerApi.java index d10bf21..76c5e9f 100644 --- a/server/src/main/java/io/myfinbox/expense/web/ExpenseControllerApi.java +++ b/server/src/main/java/io/myfinbox/expense/adapter/web/ExpenseControllerApi.java @@ -1,4 +1,4 @@ -package io.myfinbox.expense.web; +package io.myfinbox.expense.adapter.web; import io.myfinbox.shared.ApiErrorResponse; import io.myfinbox.shared.ExpenseResource; diff --git a/server/src/main/java/io/myfinbox/expense/CategoryService.java b/server/src/main/java/io/myfinbox/expense/application/CategoryService.java similarity index 80% rename from server/src/main/java/io/myfinbox/expense/CategoryService.java rename to server/src/main/java/io/myfinbox/expense/application/CategoryService.java index 31d0034..4a57269 100644 --- a/server/src/main/java/io/myfinbox/expense/CategoryService.java +++ b/server/src/main/java/io/myfinbox/expense/application/CategoryService.java @@ -1,5 +1,7 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.application; +import io.myfinbox.expense.domain.AccountIdentifier; +import io.myfinbox.expense.domain.Category; import io.myfinbox.shared.Failure; import io.vavr.control.Either; diff --git a/server/src/main/java/io/myfinbox/expense/CreateExpenseService.java b/server/src/main/java/io/myfinbox/expense/application/CreateExpenseService.java similarity index 86% rename from server/src/main/java/io/myfinbox/expense/CreateExpenseService.java rename to server/src/main/java/io/myfinbox/expense/application/CreateExpenseService.java index 1b9dda8..a52a9b1 100644 --- a/server/src/main/java/io/myfinbox/expense/CreateExpenseService.java +++ b/server/src/main/java/io/myfinbox/expense/application/CreateExpenseService.java @@ -1,6 +1,10 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.application; -import io.myfinbox.expense.Category.CategoryIdentifier; +import io.myfinbox.expense.domain.AccountIdentifier; +import io.myfinbox.expense.domain.Categories; +import io.myfinbox.expense.domain.Category.CategoryIdentifier; +import io.myfinbox.expense.domain.Expense; +import io.myfinbox.expense.domain.Expenses; import io.myfinbox.shared.Failure; import io.myfinbox.shared.PaymentType; import io.vavr.control.Either; diff --git a/server/src/main/java/io/myfinbox/expense/CreateExpenseUseCase.java b/server/src/main/java/io/myfinbox/expense/application/CreateExpenseUseCase.java similarity index 85% rename from server/src/main/java/io/myfinbox/expense/CreateExpenseUseCase.java rename to server/src/main/java/io/myfinbox/expense/application/CreateExpenseUseCase.java index 0e0b4d3..fc82ba9 100644 --- a/server/src/main/java/io/myfinbox/expense/CreateExpenseUseCase.java +++ b/server/src/main/java/io/myfinbox/expense/application/CreateExpenseUseCase.java @@ -1,5 +1,6 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.application; +import io.myfinbox.expense.domain.Expense; import io.myfinbox.shared.Failure; import io.vavr.control.Either; diff --git a/server/src/main/java/io/myfinbox/expense/DefaultCategoryService.java b/server/src/main/java/io/myfinbox/expense/application/DefaultCategoryService.java similarity index 79% rename from server/src/main/java/io/myfinbox/expense/DefaultCategoryService.java rename to server/src/main/java/io/myfinbox/expense/application/DefaultCategoryService.java index f4d6334..b9cfe4e 100644 --- a/server/src/main/java/io/myfinbox/expense/DefaultCategoryService.java +++ b/server/src/main/java/io/myfinbox/expense/application/DefaultCategoryService.java @@ -1,5 +1,9 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.application; +import io.myfinbox.expense.domain.AccountIdentifier; +import io.myfinbox.expense.domain.Categories; +import io.myfinbox.expense.domain.Category; +import io.myfinbox.expense.domain.DefaultCategories; import io.myfinbox.shared.Failure; import io.vavr.control.Either; import lombok.RequiredArgsConstructor; diff --git a/server/src/main/java/io/myfinbox/expense/ExpenseCommand.java b/server/src/main/java/io/myfinbox/expense/application/ExpenseCommand.java similarity index 95% rename from server/src/main/java/io/myfinbox/expense/ExpenseCommand.java rename to server/src/main/java/io/myfinbox/expense/application/ExpenseCommand.java index 37a7f98..abd1794 100644 --- a/server/src/main/java/io/myfinbox/expense/ExpenseCommand.java +++ b/server/src/main/java/io/myfinbox/expense/application/ExpenseCommand.java @@ -1,4 +1,4 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.application; import lombok.Builder; diff --git a/server/src/main/java/io/myfinbox/expense/ExpenseCommandValidator.java b/server/src/main/java/io/myfinbox/expense/application/ExpenseCommandValidator.java similarity index 97% rename from server/src/main/java/io/myfinbox/expense/ExpenseCommandValidator.java rename to server/src/main/java/io/myfinbox/expense/application/ExpenseCommandValidator.java index 39e1d7c..2c07900 100644 --- a/server/src/main/java/io/myfinbox/expense/ExpenseCommandValidator.java +++ b/server/src/main/java/io/myfinbox/expense/application/ExpenseCommandValidator.java @@ -1,4 +1,4 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.application; import io.myfinbox.shared.Failure.FieldViolation; import io.myfinbox.shared.PaymentType; @@ -10,7 +10,7 @@ import java.util.Currency; import java.util.UUID; -import static io.myfinbox.expense.ExpenseCommand.*; +import static io.myfinbox.expense.application.ExpenseCommand.*; import static io.vavr.API.Invalid; import static io.vavr.API.Valid; import static java.math.BigDecimal.ZERO; diff --git a/server/src/main/java/io/myfinbox/expense/AccountIdentifier.java b/server/src/main/java/io/myfinbox/expense/domain/AccountIdentifier.java similarity index 69% rename from server/src/main/java/io/myfinbox/expense/AccountIdentifier.java rename to server/src/main/java/io/myfinbox/expense/domain/AccountIdentifier.java index beb6b2b..c85813e 100644 --- a/server/src/main/java/io/myfinbox/expense/AccountIdentifier.java +++ b/server/src/main/java/io/myfinbox/expense/domain/AccountIdentifier.java @@ -1,17 +1,17 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.domain; import jakarta.persistence.Embeddable; import java.io.Serializable; import java.util.UUID; -import static java.util.Objects.requireNonNull; +import static io.myfinbox.shared.Guards.notNull; @Embeddable public record AccountIdentifier(UUID id) implements Serializable { public AccountIdentifier { - requireNonNull(id, "id cannot be null"); + notNull(id, "id cannot be null"); } @Override diff --git a/server/src/main/java/io/myfinbox/expense/Categories.java b/server/src/main/java/io/myfinbox/expense/domain/Categories.java similarity index 81% rename from server/src/main/java/io/myfinbox/expense/Categories.java rename to server/src/main/java/io/myfinbox/expense/domain/Categories.java index 8f56892..f213c4a 100644 --- a/server/src/main/java/io/myfinbox/expense/Categories.java +++ b/server/src/main/java/io/myfinbox/expense/domain/Categories.java @@ -1,6 +1,6 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.domain; -import io.myfinbox.expense.Category.CategoryIdentifier; +import io.myfinbox.expense.domain.Category.CategoryIdentifier; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/server/src/main/java/io/myfinbox/expense/Category.java b/server/src/main/java/io/myfinbox/expense/domain/Category.java similarity index 62% rename from server/src/main/java/io/myfinbox/expense/Category.java rename to server/src/main/java/io/myfinbox/expense/domain/Category.java index f4d2db7..b3d28f8 100644 --- a/server/src/main/java/io/myfinbox/expense/Category.java +++ b/server/src/main/java/io/myfinbox/expense/domain/Category.java @@ -1,4 +1,4 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.domain; import jakarta.persistence.*; import lombok.EqualsAndHashCode; @@ -10,10 +10,8 @@ import java.time.Instant; import java.util.UUID; -import static java.util.Objects.requireNonNull; +import static io.myfinbox.shared.Guards.*; import static lombok.AccessLevel.PRIVATE; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.apache.commons.lang3.StringUtils.length; /** * Defines the domain model representation of expense category @@ -40,28 +38,17 @@ public final class Category { public Category(String name, AccountIdentifier account) { this.id = new CategoryIdentifier(UUID.randomUUID()); - this.account = requireNonNull(account, "account cannot be null"); - this.name = requireValidName(name); + this.account = notNull(account, "account cannot be null"); + notBlank(name, "name cannot be blank"); + this.name = doesNotOverflow(name, MAX_LENGTH, "name overflow, max length allowed '%d'".formatted(MAX_LENGTH)); this.creationTimestamp = Instant.now(); } - private String requireValidName(String name) { - if (isBlank(name)) { - throw new IllegalArgumentException("name cannot be blank"); - } - - if (length(name) > MAX_LENGTH) { - throw new IllegalArgumentException("name overflow, max length allowed '%d'".formatted(MAX_LENGTH)); - } - - return name; - } - @Embeddable public record CategoryIdentifier(UUID id) implements Serializable { public CategoryIdentifier { - requireNonNull(id, "id cannot be null"); + notNull(id, "id cannot be null"); } @Override diff --git a/server/src/main/java/io/myfinbox/expense/DefaultCategories.java b/server/src/main/java/io/myfinbox/expense/domain/DefaultCategories.java similarity index 94% rename from server/src/main/java/io/myfinbox/expense/DefaultCategories.java rename to server/src/main/java/io/myfinbox/expense/domain/DefaultCategories.java index 8c33909..5b5e665 100644 --- a/server/src/main/java/io/myfinbox/expense/DefaultCategories.java +++ b/server/src/main/java/io/myfinbox/expense/domain/DefaultCategories.java @@ -1,4 +1,4 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.domain; import java.util.Arrays; import java.util.List; diff --git a/server/src/main/java/io/myfinbox/expense/Expense.java b/server/src/main/java/io/myfinbox/expense/domain/Expense.java similarity index 97% rename from server/src/main/java/io/myfinbox/expense/Expense.java rename to server/src/main/java/io/myfinbox/expense/domain/Expense.java index 4f96de8..8515b37 100644 --- a/server/src/main/java/io/myfinbox/expense/Expense.java +++ b/server/src/main/java/io/myfinbox/expense/domain/Expense.java @@ -1,6 +1,7 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.domain; import io.hypersistence.utils.hibernate.type.money.MonetaryAmountType; +import io.myfinbox.expense.ExpenseCreated; import io.myfinbox.shared.PaymentType; import jakarta.persistence.*; import lombok.*; diff --git a/server/src/main/java/io/myfinbox/expense/Expenses.java b/server/src/main/java/io/myfinbox/expense/domain/Expenses.java similarity index 66% rename from server/src/main/java/io/myfinbox/expense/Expenses.java rename to server/src/main/java/io/myfinbox/expense/domain/Expenses.java index ffa4b3b..979507f 100644 --- a/server/src/main/java/io/myfinbox/expense/Expenses.java +++ b/server/src/main/java/io/myfinbox/expense/domain/Expenses.java @@ -1,9 +1,9 @@ -package io.myfinbox.expense; +package io.myfinbox.expense.domain; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import static io.myfinbox.expense.Expense.ExpenseIdentifier; +import static io.myfinbox.expense.domain.Expense.ExpenseIdentifier; @Repository public interface Expenses extends JpaRepository { diff --git a/server/src/main/java/io/myfinbox/income/messaging/AccountEventsListener.java b/server/src/main/java/io/myfinbox/income/adapter/messaging/AccountEventsListener.java similarity index 86% rename from server/src/main/java/io/myfinbox/income/messaging/AccountEventsListener.java rename to server/src/main/java/io/myfinbox/income/adapter/messaging/AccountEventsListener.java index 1b862b5..18e3e5d 100644 --- a/server/src/main/java/io/myfinbox/income/messaging/AccountEventsListener.java +++ b/server/src/main/java/io/myfinbox/income/adapter/messaging/AccountEventsListener.java @@ -1,8 +1,8 @@ -package io.myfinbox.income.messaging; +package io.myfinbox.income.adapter.messaging; import io.myfinbox.account.AccountCreated; -import io.myfinbox.income.AccountIdentifier; -import io.myfinbox.income.IncomeSourceService; +import io.myfinbox.income.application.IncomeSourceService; +import io.myfinbox.income.domain.AccountIdentifier; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.modulith.events.ApplicationModuleListener; @@ -30,7 +30,7 @@ class AccountEventsListener { @Transactional(propagation = REQUIRES_NEW) public void on(AccountCreated event) { log.debug("Handle account create event {}", event); - var either = incomeSourceService.createDefault(new AccountIdentifier(event.accountIdentifier().id())); + var either = incomeSourceService.createDefault(new AccountIdentifier(event.accountId())); if (either.isLeft()) { log.error("Failed to create default income sources for account: {}, failure: {}", event, either.getLeft()); diff --git a/server/src/main/java/io/myfinbox/income/DefaultIncomeSourceService.java b/server/src/main/java/io/myfinbox/income/application/DefaultIncomeSourceService.java similarity index 79% rename from server/src/main/java/io/myfinbox/income/DefaultIncomeSourceService.java rename to server/src/main/java/io/myfinbox/income/application/DefaultIncomeSourceService.java index 8eb67b8..beb8daa 100644 --- a/server/src/main/java/io/myfinbox/income/DefaultIncomeSourceService.java +++ b/server/src/main/java/io/myfinbox/income/application/DefaultIncomeSourceService.java @@ -1,5 +1,9 @@ -package io.myfinbox.income; +package io.myfinbox.income.application; +import io.myfinbox.income.domain.AccountIdentifier; +import io.myfinbox.income.domain.DefaultIncomeSources; +import io.myfinbox.income.domain.IncomeSource; +import io.myfinbox.income.domain.IncomeSources; import io.myfinbox.shared.Failure; import io.vavr.control.Either; import lombok.RequiredArgsConstructor; diff --git a/server/src/main/java/io/myfinbox/income/IncomeSourceService.java b/server/src/main/java/io/myfinbox/income/application/IncomeSourceService.java similarity index 80% rename from server/src/main/java/io/myfinbox/income/IncomeSourceService.java rename to server/src/main/java/io/myfinbox/income/application/IncomeSourceService.java index 0f168f6..fe5b098 100644 --- a/server/src/main/java/io/myfinbox/income/IncomeSourceService.java +++ b/server/src/main/java/io/myfinbox/income/application/IncomeSourceService.java @@ -1,5 +1,7 @@ -package io.myfinbox.income; +package io.myfinbox.income.application; +import io.myfinbox.income.domain.AccountIdentifier; +import io.myfinbox.income.domain.IncomeSource; import io.myfinbox.shared.Failure; import io.vavr.control.Either; diff --git a/server/src/main/java/io/myfinbox/income/AccountIdentifier.java b/server/src/main/java/io/myfinbox/income/domain/AccountIdentifier.java similarity index 73% rename from server/src/main/java/io/myfinbox/income/AccountIdentifier.java rename to server/src/main/java/io/myfinbox/income/domain/AccountIdentifier.java index 6c2ccbc..abe1d9c 100644 --- a/server/src/main/java/io/myfinbox/income/AccountIdentifier.java +++ b/server/src/main/java/io/myfinbox/income/domain/AccountIdentifier.java @@ -1,11 +1,11 @@ -package io.myfinbox.income; +package io.myfinbox.income.domain; import jakarta.persistence.Embeddable; import java.io.Serializable; import java.util.UUID; -import static java.util.Objects.requireNonNull; +import static io.myfinbox.shared.Guards.notNull; /** * Represents an identifier for an account. @@ -14,7 +14,7 @@ public record AccountIdentifier(UUID id) implements Serializable { public AccountIdentifier { - requireNonNull(id, "id cannot be null"); + notNull(id, "id cannot be null"); } @Override diff --git a/server/src/main/java/io/myfinbox/income/DefaultIncomeSources.java b/server/src/main/java/io/myfinbox/income/domain/DefaultIncomeSources.java similarity index 92% rename from server/src/main/java/io/myfinbox/income/DefaultIncomeSources.java rename to server/src/main/java/io/myfinbox/income/domain/DefaultIncomeSources.java index 178ad40..4c4de56 100644 --- a/server/src/main/java/io/myfinbox/income/DefaultIncomeSources.java +++ b/server/src/main/java/io/myfinbox/income/domain/DefaultIncomeSources.java @@ -1,4 +1,4 @@ -package io.myfinbox.income; +package io.myfinbox.income.domain; import java.util.Arrays; import java.util.List; diff --git a/server/src/main/java/io/myfinbox/income/IncomeSource.java b/server/src/main/java/io/myfinbox/income/domain/IncomeSource.java similarity index 63% rename from server/src/main/java/io/myfinbox/income/IncomeSource.java rename to server/src/main/java/io/myfinbox/income/domain/IncomeSource.java index 57674db..f32a25f 100644 --- a/server/src/main/java/io/myfinbox/income/IncomeSource.java +++ b/server/src/main/java/io/myfinbox/income/domain/IncomeSource.java @@ -1,4 +1,4 @@ -package io.myfinbox.income; +package io.myfinbox.income.domain; import jakarta.persistence.*; import lombok.EqualsAndHashCode; @@ -10,10 +10,8 @@ import java.time.Instant; import java.util.UUID; -import static java.util.Objects.requireNonNull; +import static io.myfinbox.shared.Guards.*; import static lombok.AccessLevel.PRIVATE; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.apache.commons.lang3.StringUtils.length; /** * Defines the domain model representation of income source @@ -40,28 +38,17 @@ public final class IncomeSource { public IncomeSource(String name, AccountIdentifier account) { this.id = new IncomeSourceIdentifier(UUID.randomUUID()); - this.account = requireNonNull(account, "account cannot be null"); - this.name = requireValidName(name); + this.account = notNull(account, "account cannot be null"); + notBlank(name, "name cannot be blank"); + this.name = doesNotOverflow(name, MAX_LENGTH, "name overflow, max length allowed '%d'".formatted(MAX_LENGTH)); this.creationTimestamp = Instant.now(); } - private String requireValidName(String name) { - if (isBlank(name)) { - throw new IllegalArgumentException("name cannot be blank"); - } - - if (length(name) > MAX_LENGTH) { - throw new IllegalArgumentException("name overflow, max length allowed '%d'".formatted(MAX_LENGTH)); - } - - return name; - } - @Embeddable public record IncomeSourceIdentifier(UUID id) implements Serializable { public IncomeSourceIdentifier { - requireNonNull(id, "id cannot be null"); + notNull(id, "id cannot be null"); } @Override diff --git a/server/src/main/java/io/myfinbox/income/IncomeSources.java b/server/src/main/java/io/myfinbox/income/domain/IncomeSources.java similarity index 78% rename from server/src/main/java/io/myfinbox/income/IncomeSources.java rename to server/src/main/java/io/myfinbox/income/domain/IncomeSources.java index 45ecfd0..6181273 100644 --- a/server/src/main/java/io/myfinbox/income/IncomeSources.java +++ b/server/src/main/java/io/myfinbox/income/domain/IncomeSources.java @@ -1,6 +1,6 @@ -package io.myfinbox.income; +package io.myfinbox.income.domain; -import io.myfinbox.income.IncomeSource.IncomeSourceIdentifier; +import io.myfinbox.income.domain.IncomeSource.IncomeSourceIdentifier; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/server/src/main/java/io/myfinbox/shared/ApiFailureHandler.java b/server/src/main/java/io/myfinbox/shared/ApiFailureHandler.java index a744fa3..a7de678 100644 --- a/server/src/main/java/io/myfinbox/shared/ApiFailureHandler.java +++ b/server/src/main/java/io/myfinbox/shared/ApiFailureHandler.java @@ -7,7 +7,7 @@ import static io.myfinbox.shared.ApiErrorResponse.*; import static io.myfinbox.shared.Failure.*; -import static java.util.Objects.requireNonNull; +import static io.myfinbox.shared.Guards.notNull; /** * {@link ApiFailureHandler} defines the mapping between application Failure and REST ApiError Response. @@ -23,7 +23,7 @@ public final class ApiFailureHandler { * @throws NullPointerException if the provided failure is null. */ public ResponseEntity handle(Failure failure) { - requireNonNull(failure, "failure cannot be null"); + notNull(failure, "failure cannot be null"); return switch (failure) { case NotFoundFailure(var message) -> notFound(message); case ConflictFailure(var message) -> conflict(message); diff --git a/server/src/main/java/io/myfinbox/shared/Failure.java b/server/src/main/java/io/myfinbox/shared/Failure.java index b1fcd54..4152bb2 100644 --- a/server/src/main/java/io/myfinbox/shared/Failure.java +++ b/server/src/main/java/io/myfinbox/shared/Failure.java @@ -4,7 +4,7 @@ import java.util.Collection; -import static java.util.Objects.requireNonNull; +import static io.myfinbox.shared.Guards.notNull; /** * A marker interface representing different types of failures that can occur in the application. @@ -45,7 +45,7 @@ static Failure ofConflict(String message) { record ValidationFailure(String message, Collection fieldViolations) implements Failure { public ValidationFailure { - requireNonNull(fieldViolations, "fieldViolations cannot be null"); + notNull(fieldViolations, "fieldViolations cannot be null"); } } diff --git a/server/src/test/groovy/io/myfinbox/account/DataSamples.groovy b/server/src/test/groovy/io/myfinbox/account/DataSamples.groovy index afc273c..516712e 100644 --- a/server/src/test/groovy/io/myfinbox/account/DataSamples.groovy +++ b/server/src/test/groovy/io/myfinbox/account/DataSamples.groovy @@ -2,8 +2,9 @@ package io.myfinbox.account import com.fasterxml.jackson.databind.json.JsonMapper import groovy.json.JsonOutput +import io.myfinbox.account.domain.Account -import static io.myfinbox.account.CreateAccountUseCase.CreateAccountCommand +import static io.myfinbox.account.application.CreateAccountUseCase.CreateAccountCommand class DataSamples { @@ -26,10 +27,10 @@ class DataSamples { ] static ACCOUNT_CREATED_EVENT = [ - accountIdentifier: ["id": "e2709aa2-7907-4f78-98b6-0f36a0c1b5ca"], - emailAddress : ["emailAddress": "jonsnow@gmail.com"], - firstName : "Jon", - lastName : "Snow" + accountId : "e2709aa2-7907-4f78-98b6-0f36a0c1b5ca", + emailAddress: ["emailAddress": "jonsnow@gmail.com"], + firstName : "Jon", + lastName : "Snow" ] static newSampleCreateAccountCommand(map = [:]) { diff --git a/server/src/test/groovy/io/myfinbox/account/web/AccountControllerSpec.groovy b/server/src/test/groovy/io/myfinbox/account/adapter/web/AccountControllerSpec.groovy similarity index 99% rename from server/src/test/groovy/io/myfinbox/account/web/AccountControllerSpec.groovy rename to server/src/test/groovy/io/myfinbox/account/adapter/web/AccountControllerSpec.groovy index 2a7f7a6..8fb16d2 100644 --- a/server/src/test/groovy/io/myfinbox/account/web/AccountControllerSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/account/adapter/web/AccountControllerSpec.groovy @@ -1,4 +1,4 @@ -package io.myfinbox.account.web +package io.myfinbox.account.adapter.web import groovy.json.JsonOutput import groovy.json.JsonSlurper diff --git a/server/src/test/groovy/io/myfinbox/account/CreateAccountServiceSpec.groovy b/server/src/test/groovy/io/myfinbox/account/application/CreateAccountServiceSpec.groovy similarity index 97% rename from server/src/test/groovy/io/myfinbox/account/CreateAccountServiceSpec.groovy rename to server/src/test/groovy/io/myfinbox/account/application/CreateAccountServiceSpec.groovy index b091318..75318ef 100644 --- a/server/src/test/groovy/io/myfinbox/account/CreateAccountServiceSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/account/application/CreateAccountServiceSpec.groovy @@ -1,5 +1,8 @@ -package io.myfinbox.account +package io.myfinbox.account.application + +import io.myfinbox.account.domain.Account +import io.myfinbox.account.domain.Accounts import io.myfinbox.shared.Failure import spock.lang.Specification import spock.lang.Tag diff --git a/server/src/test/groovy/io/myfinbox/expense/DataSamples.groovy b/server/src/test/groovy/io/myfinbox/expense/DataSamples.groovy index cb69cd6..52b32b9 100644 --- a/server/src/test/groovy/io/myfinbox/expense/DataSamples.groovy +++ b/server/src/test/groovy/io/myfinbox/expense/DataSamples.groovy @@ -2,6 +2,11 @@ package io.myfinbox.expense import com.fasterxml.jackson.databind.json.JsonMapper import groovy.json.JsonOutput +import io.myfinbox.expense.application.ExpenseCommand +import io.myfinbox.expense.domain.AccountIdentifier +import io.myfinbox.expense.domain.Category +import io.myfinbox.expense.domain.DefaultCategories +import io.myfinbox.expense.domain.Expense class DataSamples { diff --git a/server/src/test/groovy/io/myfinbox/expense/messaging/AccountEventsListenerSpec.groovy b/server/src/test/groovy/io/myfinbox/expense/adapter/messaging/AccountEventsListenerSpec.groovy similarity index 84% rename from server/src/test/groovy/io/myfinbox/expense/messaging/AccountEventsListenerSpec.groovy rename to server/src/test/groovy/io/myfinbox/expense/adapter/messaging/AccountEventsListenerSpec.groovy index dd5c8ff..21ee8c2 100644 --- a/server/src/test/groovy/io/myfinbox/expense/messaging/AccountEventsListenerSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/expense/adapter/messaging/AccountEventsListenerSpec.groovy @@ -1,12 +1,11 @@ -package io.myfinbox.expense.messaging +package io.myfinbox.expense.adapter.messaging import io.myfinbox.TestServerApplication -import io.myfinbox.account.Account import io.myfinbox.account.AccountCreated -import io.myfinbox.expense.AccountIdentifier -import io.myfinbox.expense.Categories -import io.myfinbox.expense.Category -import io.myfinbox.expense.DefaultCategories +import io.myfinbox.expense.domain.AccountIdentifier +import io.myfinbox.expense.domain.Categories +import io.myfinbox.expense.domain.Category +import io.myfinbox.expense.domain.DefaultCategories import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.TestConfiguration @@ -69,12 +68,7 @@ class AccountEventsListenerSpec extends Specification { @Override @Transactional void run() { - eventPublisher.publishEvent(new AccountCreated( - new Account.AccountIdentifier(accountId), - new Account.EmailAddress("email@email.com"), - "Jon", - "Snow" - )) + eventPublisher.publishEvent(new AccountCreated(accountId, "email@email.com", "Jon", "Snow")) } } } diff --git a/server/src/test/groovy/io/myfinbox/expense/web/ExpenseControllerSpec.groovy b/server/src/test/groovy/io/myfinbox/expense/adapter/web/ExpenseControllerSpec.groovy similarity index 99% rename from server/src/test/groovy/io/myfinbox/expense/web/ExpenseControllerSpec.groovy rename to server/src/test/groovy/io/myfinbox/expense/adapter/web/ExpenseControllerSpec.groovy index 63abbd7..4a7dd06 100644 --- a/server/src/test/groovy/io/myfinbox/expense/web/ExpenseControllerSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/expense/adapter/web/ExpenseControllerSpec.groovy @@ -1,4 +1,4 @@ -package io.myfinbox.expense.web +package io.myfinbox.expense.adapter.web import groovy.json.JsonOutput import groovy.json.JsonSlurper diff --git a/server/src/test/groovy/io/myfinbox/expense/CreateExpenseServiceSpec.groovy b/server/src/test/groovy/io/myfinbox/expense/application/CreateExpenseServiceSpec.groovy similarity index 94% rename from server/src/test/groovy/io/myfinbox/expense/CreateExpenseServiceSpec.groovy rename to server/src/test/groovy/io/myfinbox/expense/application/CreateExpenseServiceSpec.groovy index b90e381..6d3f8f6 100644 --- a/server/src/test/groovy/io/myfinbox/expense/CreateExpenseServiceSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/expense/application/CreateExpenseServiceSpec.groovy @@ -1,12 +1,17 @@ -package io.myfinbox.expense +package io.myfinbox.expense.application + +import io.myfinbox.expense.domain.AccountIdentifier +import io.myfinbox.expense.domain.Categories +import io.myfinbox.expense.domain.Expense +import io.myfinbox.expense.domain.Expenses import io.myfinbox.shared.Failure import spock.lang.Specification import spock.lang.Tag -import static io.myfinbox.expense.Category.CategoryIdentifier -import static io.myfinbox.expense.CreateExpenseService.VALIDATION_FAILURE_MESSAGE import static io.myfinbox.expense.DataSamples.* +import static io.myfinbox.expense.application.CreateExpenseService.VALIDATION_FAILURE_MESSAGE +import static io.myfinbox.expense.domain.Category.CategoryIdentifier @Tag("unit") class CreateExpenseServiceSpec extends Specification { diff --git a/server/src/test/groovy/io/myfinbox/expense/DefaultCategoryServiceSpec.groovy b/server/src/test/groovy/io/myfinbox/expense/application/DefaultCategoryServiceSpec.groovy similarity index 86% rename from server/src/test/groovy/io/myfinbox/expense/DefaultCategoryServiceSpec.groovy rename to server/src/test/groovy/io/myfinbox/expense/application/DefaultCategoryServiceSpec.groovy index 00c89a9..6d2cc14 100644 --- a/server/src/test/groovy/io/myfinbox/expense/DefaultCategoryServiceSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/expense/application/DefaultCategoryServiceSpec.groovy @@ -1,5 +1,9 @@ -package io.myfinbox.expense +package io.myfinbox.expense.application +import io.myfinbox.expense.domain.AccountIdentifier +import io.myfinbox.expense.domain.Categories +import io.myfinbox.expense.domain.Category +import io.myfinbox.expense.domain.DefaultCategories import io.myfinbox.shared.Failure import spock.lang.Specification import spock.lang.Tag diff --git a/server/src/test/groovy/io/myfinbox/income/DataSamples.groovy b/server/src/test/groovy/io/myfinbox/income/DataSamples.groovy index 0dbb754..13bd5f8 100644 --- a/server/src/test/groovy/io/myfinbox/income/DataSamples.groovy +++ b/server/src/test/groovy/io/myfinbox/income/DataSamples.groovy @@ -1,6 +1,9 @@ package io.myfinbox.income import com.fasterxml.jackson.databind.json.JsonMapper +import io.myfinbox.income.domain.AccountIdentifier +import io.myfinbox.income.domain.DefaultIncomeSources +import io.myfinbox.income.domain.IncomeSource class DataSamples { diff --git a/server/src/test/groovy/io/myfinbox/income/messaging/AccountEventsListenerSpec.groovy b/server/src/test/groovy/io/myfinbox/income/adapter/messaging/AccountEventsListenerSpec.groovy similarity index 83% rename from server/src/test/groovy/io/myfinbox/income/messaging/AccountEventsListenerSpec.groovy rename to server/src/test/groovy/io/myfinbox/income/adapter/messaging/AccountEventsListenerSpec.groovy index 159d710..b813fe5 100644 --- a/server/src/test/groovy/io/myfinbox/income/messaging/AccountEventsListenerSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/income/adapter/messaging/AccountEventsListenerSpec.groovy @@ -1,12 +1,11 @@ -package io.myfinbox.income.messaging +package io.myfinbox.income.adapter.messaging import io.myfinbox.TestServerApplication -import io.myfinbox.account.Account import io.myfinbox.account.AccountCreated -import io.myfinbox.income.AccountIdentifier -import io.myfinbox.income.DefaultIncomeSources -import io.myfinbox.income.IncomeSource -import io.myfinbox.income.IncomeSources +import io.myfinbox.income.domain.AccountIdentifier +import io.myfinbox.income.domain.DefaultIncomeSources +import io.myfinbox.income.domain.IncomeSource +import io.myfinbox.income.domain.IncomeSources import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.TestConfiguration @@ -69,12 +68,7 @@ class AccountEventsListenerSpec extends Specification { @Override @Transactional void run() { - eventPublisher.publishEvent(new AccountCreated( - new Account.AccountIdentifier(accountId), - new Account.EmailAddress("email@email.com"), - "Jon", - "Snow" - )) + eventPublisher.publishEvent(new AccountCreated(accountId, "email@email.com", "Jon", "Snow")) } } } diff --git a/server/src/test/groovy/io/myfinbox/income/DefaultIncomeSourceServiceSpec.groovy b/server/src/test/groovy/io/myfinbox/income/application/DefaultIncomeSourceServiceSpec.groovy similarity index 86% rename from server/src/test/groovy/io/myfinbox/income/DefaultIncomeSourceServiceSpec.groovy rename to server/src/test/groovy/io/myfinbox/income/application/DefaultIncomeSourceServiceSpec.groovy index 0b7864e..a72c01d 100644 --- a/server/src/test/groovy/io/myfinbox/income/DefaultIncomeSourceServiceSpec.groovy +++ b/server/src/test/groovy/io/myfinbox/income/application/DefaultIncomeSourceServiceSpec.groovy @@ -1,5 +1,9 @@ -package io.myfinbox.income +package io.myfinbox.income.application +import io.myfinbox.income.domain.AccountIdentifier +import io.myfinbox.income.domain.DefaultIncomeSources +import io.myfinbox.income.domain.IncomeSource +import io.myfinbox.income.domain.IncomeSources import io.myfinbox.shared.Failure import spock.lang.Specification import spock.lang.Tag