From 063118f392447fedd831da7c84c15d982b0da8dc Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 7 Jun 2020 11:37:53 +0200
Subject: [PATCH] #338 - prevent creation of a template with already existing
 name

---
 .../templates/TemplateController.java           |  7 ++-----
 .../budgetmaster/templates/TemplateService.java |  7 +++++++
 .../templates/TemplateValidator.java            | 17 +++++++++++++++++
 .../deadlocker8/budgetmaster/utils/Strings.java |  1 +
 4 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
index f07261a57..4edf2e672 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateController.java
@@ -65,10 +65,7 @@ public class TemplateController extends BaseController
 	@GetMapping("/templates/fromTransactionModal")
 	public String fromTransactionModal(Model model)
 	{
-		final List<String> templateNames = templateService.getRepository().findAll().stream()
-				.map(Template::getTemplateName)
-				.collect(Collectors.toList());
-		model.addAttribute("existingTemplateNames", GSON.toJson(templateNames));
+		model.addAttribute("existingTemplateNames", GSON.toJson(templateService.getExistingTemplateNames()));
 		return "templates/createFromTransactionModal";
 	}
 
@@ -158,7 +155,7 @@ public class TemplateController extends BaseController
 					   @RequestParam(value = "isPayment", required = false) boolean isPayment)
 	{
 
-		TemplateValidator templateValidator = new TemplateValidator();
+		TemplateValidator templateValidator = new TemplateValidator(templateService.getExistingTemplateNames());
 		templateValidator.validate(template, bindingResult);
 
 		transactionService.handleAmount(template, isPayment);
diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java
index 45c614903..d4b4768ea 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateService.java
@@ -99,4 +99,11 @@ public class TemplateService implements Resetable
 		model.addAttribute("isPayment", isPayment);
 		model.addAttribute("suggestionsJSON", GSON.toJson(new ArrayList<String>()));
 	}
+
+	public List<String> getExistingTemplateNames()
+	{
+		return getRepository().findAll().stream()
+				.map(Template::getTemplateName)
+				.collect(Collectors.toList());
+	}
 }
diff --git a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateValidator.java b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateValidator.java
index 39e12581c..be1effcdc 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateValidator.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/templates/TemplateValidator.java
@@ -6,9 +6,18 @@ import org.springframework.validation.Errors;
 import org.springframework.validation.ValidationUtils;
 import org.springframework.validation.Validator;
 
+import java.util.List;
+
 
 public class TemplateValidator implements Validator
 {
+	private List<String> existingTemplateNames;
+
+	public TemplateValidator(List<String> existingTemplateNames)
+	{
+		this.existingTemplateNames = existingTemplateNames;
+	}
+
 	public boolean supports(Class clazz)
 	{
 		return Transaction.class.equals(clazz);
@@ -17,5 +26,13 @@ public class TemplateValidator implements Validator
 	public void validate(Object obj, Errors errors)
 	{
 		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "templateName", Strings.WARNING_EMPTY_TRANSACTION_NAME);
+
+		Template template = (Template)obj;
+
+		boolean isNameAlreadyUsed = this.existingTemplateNames.stream().anyMatch(template.getTemplateName()::equalsIgnoreCase);
+		if(isNameAlreadyUsed)
+		{
+			errors.rejectValue("templateName", Strings.WARNING_DUPLICATE_TEMPLATE_NAME);
+		}
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
index 2fc6204d2..0cd2a8311 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/Strings.java
@@ -28,6 +28,7 @@ public class Strings
 	public static final String WARNING_EMPTY_CHART_SCRIPT = "warning.empty.chart.script";
 	public static final String WARNING_EMPTY_NUMBER = "warning.empty.number";
 	public static final String WARNING_EMPTY_NUMBER_ZERO_ALLOWED = "warning.empty.number.zero.allowed";
+	public static final String WARNING_DUPLICATE_TEMPLATE_NAME = "warning.duplicate.template.name";
 
 	//REPORT
 	public static final String REPORT_FOOTER_LEFT = "report.footer.left";
-- 
GitLab