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