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