From cbe6a58d76667cc059da324d26b8d34d18f29133 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?H=C3=A5kon=20F=2E=20Fjellanger?= <haakonff@stud.ntnu.no>
Date: Mon, 22 Apr 2024 14:11:43 +0200
Subject: [PATCH 1/4] Create function for finding other bank accounts with the
 same owner

---
 .../sparesti/mockBank/service/AccountService.java   | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/AccountService.java b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/AccountService.java
index a3de22e..2f1faff 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/AccountService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/AccountService.java
@@ -3,6 +3,7 @@ package idatt2106.systemutvikling.sparesti.mockBank.service;
 import idatt2106.systemutvikling.sparesti.mockBank.dao.AccountDAO;
 import idatt2106.systemutvikling.sparesti.mockBank.dao.CustomerDAO;
 import idatt2106.systemutvikling.sparesti.mockBank.repository.AccountRepository;
+import lombok.NonNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -28,4 +29,16 @@ public class AccountService {
     CustomerDAO customer = customerService.findCustomerByUsername(username);
     return accountRepository.findAccountDAOSByCustomerDAO(customer);
   }
+
+  public List<AccountDAO> findOtherAccountsOwnedBySameUser(@NonNull Long accountNumber) {
+    AccountDAO originalAccount = accountRepository.findAccountDAOByAccountNr(accountNumber).orElse(null);
+    if (originalAccount == null)
+      return null;
+
+    CustomerDAO c = customerService.findCustomerByUsername(originalAccount.getCustomerDAO().getUsername());
+    if (c == null)
+      return null;
+
+    return accountRepository.findAccountDAOSByCustomerDAO(c);
+  }
 }
-- 
GitLab


From 90b827b3a0932391d559937a3d102dc291bd3cd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?H=C3=A5kon=20F=2E=20Fjellanger?= <haakonff@stud.ntnu.no>
Date: Mon, 22 Apr 2024 14:12:42 +0200
Subject: [PATCH 2/4] First draft of extensive filtering on
 latestExpenses-functionality

---
 .../mapper/MockBankTransactionMapper.java     | 25 ++++++++
 .../service/BankTransactionService.java       | 57 +++++++++++++++++--
 2 files changed, 78 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/idatt2106/systemutvikling/sparesti/mockBank/mapper/MockBankTransactionMapper.java

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/mapper/MockBankTransactionMapper.java b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/mapper/MockBankTransactionMapper.java
new file mode 100644
index 0000000..cbac8aa
--- /dev/null
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/mapper/MockBankTransactionMapper.java
@@ -0,0 +1,25 @@
+package idatt2106.systemutvikling.sparesti.mockBank.mapper;
+
+import idatt2106.systemutvikling.sparesti.enums.TransactionCategory;
+import idatt2106.systemutvikling.sparesti.mockBank.dao.TransactionDAO;
+import idatt2106.systemutvikling.sparesti.model.Transaction;
+
+public class MockBankTransactionMapper {
+
+
+    public static Transaction toModel(TransactionDAO dao) {
+        return new Transaction(
+                dao.getTransactionId(),
+                dao.getAccountDAO().getAccountNr(),
+                dao.getTransactionTitle(),
+                dao.getTime(),
+                dao.getDebtorAccount(),
+                dao.getDebtorName(),
+                dao.getCreditorAccount(),
+                dao.getCreditorName(),
+                dao.getAmount(),
+                dao.getCurrency(),
+                TransactionCategory.NOT_CATEGORIZED
+        );
+    }
+}
diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
index 6e56b47..79a8b8c 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
@@ -1,12 +1,23 @@
 package idatt2106.systemutvikling.sparesti.mockBank.service;
 
+import idatt2106.systemutvikling.sparesti.dao.UserDAO;
+import idatt2106.systemutvikling.sparesti.mapper.TransactionMapper;
+import idatt2106.systemutvikling.sparesti.mockBank.dao.AccountDAO;
+import idatt2106.systemutvikling.sparesti.mockBank.dao.CustomerDAO;
 import idatt2106.systemutvikling.sparesti.mockBank.dao.TransactionDAO;
+import idatt2106.systemutvikling.sparesti.mockBank.mapper.MockBankTransactionMapper;
 import idatt2106.systemutvikling.sparesti.mockBank.repository.TransactionRepository;
 import idatt2106.systemutvikling.sparesti.model.Transaction;
 import idatt2106.systemutvikling.sparesti.service.TransactionServiceInterface;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Predicate;
+import jakarta.persistence.criteria.Root;
 import jakarta.validation.constraints.Positive;
 import lombok.AllArgsConstructor;
 import lombok.NonNull;
+import jakarta.persistence.criteria.Order;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
@@ -19,15 +30,53 @@ import java.util.List;
 public class BankTransactionService implements TransactionServiceInterface {
 
   private final TransactionRepository transactionRepository;
+  private final AccountService accountService;
+
+  private final EntityManager entityManager;
 
   @Override
   public List<Transaction> getLatestExpensesForAccountNumber(@NonNull Long accountNumber, @Positive int page, @Positive int pageSize) {
-    Pageable pageable = PageRequest.of(page, pageSize, Sort.by("time").ascending());
+      List<AccountDAO> allAccountsForUser = accountService.findOtherAccountsOwnedBySameUser(accountNumber);
+
+      if (allAccountsForUser == null)
+        return null;
+
+
+
+    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+    CriteriaQuery<TransactionDAO> criteriaQuery = criteriaBuilder.createQuery(TransactionDAO.class);
+    Root<TransactionDAO> root = criteriaQuery.from(TransactionDAO.class);
+
+    // A list of predicates each enforcing that the transactions creditor account is not equal the accounts owned by the user.
+    List<Predicate> creditorNotEqualOwnAccountList = allAccountsForUser
+            .stream()
+            .map(AccountDAO::getAccountNr)
+            .map((Long a) -> { return criteriaBuilder.notEqual(root.get("creditorAccount"), a); })
+            .toList();
+
+    // The predicate filtering out all accounts where the creditor is not equal
+    Predicate creditorAccountNotOwn = creditorNotEqualOwnAccountList.getFirst();
+    for (Predicate p : creditorNotEqualOwnAccountList)
+      creditorAccountNotOwn = criteriaBuilder.and(creditorAccountNotOwn, p);
+
+    // Predicate only allowing transactions where the debtor is the parameter account.
+    Predicate debtorAccountEqualAccountNumber = criteriaBuilder.equal(root.get("debtorAccount"), accountNumber);
+
+    // The final predicate to use, only allowing transactions that are outgoing and not internal.
+    Predicate transactionIsExpense = criteriaBuilder.
+            and(debtorAccountEqualAccountNumber, creditorAccountNotOwn);
+
+
 
-    return transactionRepository
-            .findTransactionDAOByDebtorAccount(accountNumber, pageable)
+    return entityManager
+            .createQuery(criteriaQuery.select(root)
+                    .where(transactionIsExpense)
+                    .orderBy(criteriaBuilder.desc(root.get("time"))))
+            .setFirstResult(page * pageSize)
+            .setMaxResults(pageSize)
+            .getResultList()
             .stream()
-            .map(BankTransactionService::toModel)
+            .map(MockBankTransactionMapper::toModel)
             .toList();
   }
 
-- 
GitLab


From 58d24c836664876f46f290427181e987ef0086f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?H=C3=A5kon=20F=2E=20Fjellanger?= <haakonff@stud.ntnu.no>
Date: Mon, 22 Apr 2024 14:18:30 +0200
Subject: [PATCH 3/4] Optimize imports

---
 .../sparesti/mockBank/service/BankTransactionService.java  | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
index 79a8b8c..a984a62 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
@@ -1,9 +1,6 @@
 package idatt2106.systemutvikling.sparesti.mockBank.service;
 
-import idatt2106.systemutvikling.sparesti.dao.UserDAO;
-import idatt2106.systemutvikling.sparesti.mapper.TransactionMapper;
 import idatt2106.systemutvikling.sparesti.mockBank.dao.AccountDAO;
-import idatt2106.systemutvikling.sparesti.mockBank.dao.CustomerDAO;
 import idatt2106.systemutvikling.sparesti.mockBank.dao.TransactionDAO;
 import idatt2106.systemutvikling.sparesti.mockBank.mapper.MockBankTransactionMapper;
 import idatt2106.systemutvikling.sparesti.mockBank.repository.TransactionRepository;
@@ -17,10 +14,6 @@ import jakarta.persistence.criteria.Root;
 import jakarta.validation.constraints.Positive;
 import lombok.AllArgsConstructor;
 import lombok.NonNull;
-import jakarta.persistence.criteria.Order;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
-- 
GitLab


From 2c984ae35e08fd473f09b92416aea04d71e1b6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?H=C3=A5kon=20F=2E=20Fjellanger?= <haakonff@stud.ntnu.no>
Date: Mon, 22 Apr 2024 14:21:42 +0200
Subject: [PATCH 4/4] Fix strange compilation issue

---
 .../sparesti/mockBank/service/BankTransactionService.java       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
index a984a62..529a5a6 100644
--- a/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
+++ b/src/main/java/idatt2106/systemutvikling/sparesti/mockBank/service/BankTransactionService.java
@@ -48,7 +48,7 @@ public class BankTransactionService implements TransactionServiceInterface {
             .toList();
 
     // The predicate filtering out all accounts where the creditor is not equal
-    Predicate creditorAccountNotOwn = creditorNotEqualOwnAccountList.getFirst();
+    Predicate creditorAccountNotOwn = creditorNotEqualOwnAccountList.get(0);
     for (Predicate p : creditorNotEqualOwnAccountList)
       creditorAccountNotOwn = criteriaBuilder.and(creditorAccountNotOwn, p);
 
-- 
GitLab