From 86e6ee39fd5eb9de1c058bab66240f69a0f8720a Mon Sep 17 00:00:00 2001 From: xkollar3 <xkollar3@fi.muni.cz> Date: Sun, 5 May 2024 17:37:40 +0200 Subject: [PATCH] fixed transaction state upon unsuccessful exchange --- .../TransactionManagementFacadeITTest.java | 2 +- .../obs/rest/TransactionControllerITTest.java | 4 +-- .../fi/obs/data/dbo/TransactionState.java | 3 +- .../fi/obs/service/TransactionService.java | 32 +++++++++---------- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/transaction-service/src/it/java/cz/muni/fi/obs/facade/TransactionManagementFacadeITTest.java b/transaction-service/src/it/java/cz/muni/fi/obs/facade/TransactionManagementFacadeITTest.java index e0e599c..90b750a 100644 --- a/transaction-service/src/it/java/cz/muni/fi/obs/facade/TransactionManagementFacadeITTest.java +++ b/transaction-service/src/it/java/cz/muni/fi/obs/facade/TransactionManagementFacadeITTest.java @@ -99,7 +99,7 @@ public class TransactionManagementFacadeITTest extends IntegrationTest { Page<TransactionDbo> transactionDbos = facade.viewTransactionHistory(account1.getAccountNumber(), 0, 10); assertThat(transactionDbos.getContent().stream() - .allMatch(trans -> trans.getTransactionState().equals(TransactionState.FAILED))).isTrue(); + .allMatch(trans -> trans.getTransactionState().equals(TransactionState.INSUFFICIENT_BALANCE))).isTrue(); assertThat(facade.calculateAccountBalance(account1.getAccountNumber())).isEqualTo(BigDecimal.valueOf(0)); assertThat(facade.calculateAccountBalance(account2.getAccountNumber())).isEqualTo(BigDecimal.valueOf(0)); } diff --git a/transaction-service/src/it/java/cz/muni/fi/obs/rest/TransactionControllerITTest.java b/transaction-service/src/it/java/cz/muni/fi/obs/rest/TransactionControllerITTest.java index 9f3ec4b..bfe47b5 100644 --- a/transaction-service/src/it/java/cz/muni/fi/obs/rest/TransactionControllerITTest.java +++ b/transaction-service/src/it/java/cz/muni/fi/obs/rest/TransactionControllerITTest.java @@ -330,7 +330,7 @@ class TransactionControllerITTest extends IntegrationTest { .returns(transactionCreateDto.withdrawAmount(), TransactionDbo::getWithdrawAmount); - assertThat(transaction.get().getTransactionState()).isIn(TransactionState.SUCCESSFUL, TransactionState.FAILED); + assertThat(transaction.get().getTransactionState()).isIn(TransactionState.SUCCESSFUL, TransactionState.INSUFFICIENT_BALANCE); transactionRepository.deleteById(transaction.get().getId()); } @@ -387,7 +387,7 @@ class TransactionControllerITTest extends IntegrationTest { .toList(); assertThat(accountFiveWithdrawals.stream() - .anyMatch(transaction -> transaction.getTransactionState().equals(TransactionState.FAILED))).isTrue(); + .anyMatch(transaction -> transaction.getTransactionState().equals(TransactionState.INSUFFICIENT_BALANCE))).isTrue(); } private String buildBalancePath(String accountNumber) { diff --git a/transaction-service/src/main/java/cz/muni/fi/obs/data/dbo/TransactionState.java b/transaction-service/src/main/java/cz/muni/fi/obs/data/dbo/TransactionState.java index b00547d..daabf9a 100644 --- a/transaction-service/src/main/java/cz/muni/fi/obs/data/dbo/TransactionState.java +++ b/transaction-service/src/main/java/cz/muni/fi/obs/data/dbo/TransactionState.java @@ -4,5 +4,6 @@ public enum TransactionState { PENDING, SUCCESSFUL, - FAILED; + CANNOT_EXCHANGE, + INSUFFICIENT_BALANCE; } diff --git a/transaction-service/src/main/java/cz/muni/fi/obs/service/TransactionService.java b/transaction-service/src/main/java/cz/muni/fi/obs/service/TransactionService.java index c11777b..1a3b77c 100644 --- a/transaction-service/src/main/java/cz/muni/fi/obs/service/TransactionService.java +++ b/transaction-service/src/main/java/cz/muni/fi/obs/service/TransactionService.java @@ -22,20 +22,12 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneOffset; -import java.util.Optional; -import java.util.UUID; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; import java.util.List; import java.util.Optional; import java.util.UUID; -import static cz.muni.fi.obs.data.dbo.TransactionState.FAILED; +import static cz.muni.fi.obs.data.dbo.TransactionState.CANNOT_EXCHANGE; +import static cz.muni.fi.obs.data.dbo.TransactionState.INSUFFICIENT_BALANCE; import static cz.muni.fi.obs.data.dbo.TransactionState.PENDING; import static cz.muni.fi.obs.data.dbo.TransactionState.SUCCESSFUL; @@ -116,9 +108,16 @@ public class TransactionService { .amount(transaction.getWithdrawAmount()) .build(); - CurrencyExchangeResult exchangeResult = callCurrencyClient(request); - transaction.setConversionRate(exchangeResult.exchangeRate()); - transaction.setDepositAmount(exchangeResult.destAmount()); + Optional<CurrencyExchangeResult> currencyExchangeResult = callCurrencyClient(request); + if (currencyExchangeResult.isEmpty()) { + transaction.setTransactionState(CANNOT_EXCHANGE); + repository.save(transaction); + return; + } else { + CurrencyExchangeResult exchangeResult = currencyExchangeResult.get(); + transaction.setConversionRate(exchangeResult.exchangeRate()); + transaction.setDepositAmount(exchangeResult.destAmount()); + } } else { transaction.setConversionRate(1d); transaction.setDepositAmount(transaction.getWithdrawAmount()); @@ -135,12 +134,11 @@ public class TransactionService { } private TransactionState computeTransactionState(String id, BigDecimal withdrawAmount) { - return calculateAccountBalance(id).compareTo(withdrawAmount) >= 0 ? SUCCESSFUL : FAILED; + return calculateAccountBalance(id).compareTo(withdrawAmount) >= 0 ? SUCCESSFUL : INSUFFICIENT_BALANCE; } - private CurrencyExchangeResult callCurrencyClient(CurrencyExchangeRequest request) { - return client.getCurrencyExchange(request) - .orElseThrow(() -> new ResourceNotFoundException("Currency exchange rate not found")); + private Optional<CurrencyExchangeResult> callCurrencyClient(CurrencyExchangeRequest request) { + return client.getCurrencyExchange(request); } public Page<TransactionDbo> listByAccount(String accountId, Pageable pageable, LocalDate date) { -- GitLab