From 01654a324c1b5684b0c84544d4426e453e123911 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Fri, 22 Jul 2022 23:27:48 +0200
Subject: [PATCH] #677 - move keyword check to own controller + pass
 transaction name

---
 .../transactions/TransactionController.java   |  9 ----
 .../TransactionNameKeywordController.java     | 52 +++++++++++++++++++
 .../TransactionNameKeywordService.java        |  2 +-
 .../budgetmaster/utils/Mappings.java          |  1 +
 .../main/resources/static/js/transactions.js  |  7 +--
 .../templates/transactions/empty.ftl          |  0
 .../transactions/newTransactionMacros.ftl     |  2 +-
 .../transactionNameKeywordWarningModal.ftl    |  2 +-
 8 files changed, 60 insertions(+), 15 deletions(-)
 create mode 100644 BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordController.java
 create mode 100644 BudgetMasterServer/src/main/resources/templates/transactions/empty.ftl

diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
index a7c3dff3c..1465be91e 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
@@ -411,13 +411,4 @@ public class TransactionController extends BaseController
 		}
 		return ReturnValues.NEW_TRANSACTION;
 	}
-
-	@GetMapping("/keywordCheck")
-	public String keywordWarningModal(Model model)
-	{
-		// TODO implement real check
-		// TODO only return keyword for transaction name not template
-		model.addAttribute(ModelAttributes.KEYWORD, "income");
-		return ReturnValues.KEYWORD_WARNING;
-	}
 }
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordController.java
new file mode 100644
index 000000000..957744774
--- /dev/null
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordController.java
@@ -0,0 +1,52 @@
+package de.deadlocker8.budgetmaster.transactions.keywords;
+
+import de.deadlocker8.budgetmaster.controller.BaseController;
+import de.deadlocker8.budgetmaster.utils.Mappings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Controller
+@RequestMapping(Mappings.KEYWORDS)
+public class TransactionNameKeywordController extends BaseController
+{
+	private static class ModelAttributes
+	{
+		public static final String KEYWORD = "transactionNameKeyword";
+	}
+
+	private static class ReturnValues
+	{
+		public static final String KEYWORD_WARNING = "transactions/transactionNameKeywordWarningModal";
+		public static final String EMPTY = "transactions/empty";
+	}
+
+	private final TransactionNameKeywordService transactionNameKeywordService;
+
+	@Autowired
+	public TransactionNameKeywordController(TransactionNameKeywordService transactionNameKeywordService)
+	{
+		this.transactionNameKeywordService = transactionNameKeywordService;
+	}
+
+	@GetMapping("/keywordCheck")
+	public String keywordCheck(HttpServletResponse response, Model model, @RequestParam(value = "transactionName", required = false) String transactionName)
+	{
+		final List<String> matchingKeywords = transactionNameKeywordService.getMatchingKeywords(transactionName);
+
+		if(matchingKeywords.isEmpty())
+		{
+			response.setStatus(204);
+			return null;
+		}
+		else
+		{
+			model.addAttribute(ModelAttributes.KEYWORD, matchingKeywords.get(0));
+			return ReturnValues.KEYWORD_WARNING;
+		}
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordService.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordService.java
index 8718acecf..f653381fc 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordService.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/keywords/TransactionNameKeywordService.java
@@ -58,7 +58,7 @@ public class TransactionNameKeywordService implements Resettable
 
 		return keywords.stream()
 				.map(TransactionNameKeyword::getValue)
-				.filter(value -> textLowerCase.contains(value.toLowerCase(Locale.ROOT)))
+				.filter(value -> textLowerCase.contains(value.toLowerCase()))
 				.toList();
 	}
 }
diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Mappings.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Mappings.java
index 91f661cc6..332d2b61c 100644
--- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Mappings.java
+++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/utils/Mappings.java
@@ -25,6 +25,7 @@ public final class Mappings
 	public static final String TRANSACTIONS = "/transactions";
 	public static final String TAGS = "/tags";
 	public static final String HINTS = "/hints";
+	public static final String KEYWORDS = "/keywords";
 
 	public static final String MIGRATION = "/migration";
 }
diff --git a/BudgetMasterServer/src/main/resources/static/js/transactions.js b/BudgetMasterServer/src/main/resources/static/js/transactions.js
index 046df4d93..2d4f40714 100644
--- a/BudgetMasterServer/src/main/resources/static/js/transactions.js
+++ b/BudgetMasterServer/src/main/resources/static/js/transactions.js
@@ -480,17 +480,18 @@ function validateForm(allowEmptyAmount = false, skipKeywordCheck = false)
 function checkNameForKeywords()
 {
     let url = document.getElementById('keywordCheckUrl').dataset.url;
+    let transactionName = document.getElementById('transaction-name').value;
 
     let result;
 
     $.ajax({
         async: false,
         type: 'GET',
-        url: url,
+        url: url + '?transactionName=' + transactionName,
         data: {},
-        success: function(data)
+        success: function(data, textStatus, request)
         {
-            if(data)
+            if(request.status === 200)
             {
                 // name contains at least one keyword
                 result = true;
diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/empty.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/empty.ftl
new file mode 100644
index 000000000..e69de29bb
diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl
index cd29623fe..0f09255a7 100644
--- a/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl
+++ b/BudgetMasterServer/src/main/resources/templates/transactions/newTransactionMacros.ftl
@@ -304,7 +304,7 @@
 </#macro>
 
 <#macro buttons cancelURL includeContinueButton>
-    <div id="keywordCheckUrl" class="hidden" data-url="<@s.url '/transactions/keywordCheck'/>"></div>
+    <div id="keywordCheckUrl" class="hidden" data-url="<@s.url '/keywords/keywordCheck'/>"></div>
 
     <br>
     <hr>
diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/transactionNameKeywordWarningModal.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/transactionNameKeywordWarningModal.ftl
index 19f534606..3ec5be4ee 100644
--- a/BudgetMasterServer/src/main/resources/templates/transactions/transactionNameKeywordWarningModal.ftl
+++ b/BudgetMasterServer/src/main/resources/templates/transactions/transactionNameKeywordWarningModal.ftl
@@ -9,7 +9,7 @@
         <div class="row">
             <div class="sol s12">
                 ${locale.getString("transaction.warning.name.keyword.description.part1")}
-                <span id="keyword">${keyword}</span>
+                <span id="keyword">${transactionNameKeyword}</span>
                 ${locale.getString("transaction.warning.name.keyword.description.part2")}
             </div>
         </div>
-- 
GitLab