From 4efb78191dc6f75bc254cacaf41694b6375c5636 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Tue, 11 Jan 2022 21:53:14 +0100
Subject: [PATCH] #663 - new database backend: postgresql

---
 pom.xml                                       |  9 +-
 .../de/deadlocker8/budgetmaster/Main.java     |  3 +
 .../budgetmaster/authentication/User.java     |  1 +
 .../utils/DatabaseConfiguration.java          | 23 +++--
 .../DatabaseConfigurationProperties.java      | 89 +++++++++++++++++++
 src/main/resources/application.properties     |  1 +
 .../config/templates/settings.properties      |  7 ++
 7 files changed, 126 insertions(+), 7 deletions(-)
 create mode 100644 src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java

diff --git a/pom.xml b/pom.xml
index 03a321318..1b067419b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>de.deadlocker8</groupId>
     <artifactId>BudgetMaster</artifactId>
-    <version>2.9.2</version>
+    <version>2.10.0</version>
     <name>BudgetMaster</name>
 
     <repositories>
@@ -77,7 +77,7 @@
 
         <app.versionDate>${maven.build.timestamp}</app.versionDate>
         <maven.build.timestamp.format>dd.MM.yy</maven.build.timestamp.format>
-        <app.versionCode>37</app.versionCode>
+        <app.versionCode>38</app.versionCode>
         <app.author>Robert Goldmann</app.author>
 
         <project.outputDirectory>build/${project.version}</project.outputDirectory>
@@ -155,6 +155,11 @@
             <version>${h2database.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.itextpdf</groupId>
             <artifactId>itextpdf</artifactId>
diff --git a/src/main/java/de/deadlocker8/budgetmaster/Main.java b/src/main/java/de/deadlocker8/budgetmaster/Main.java
index edbee1b17..6f269187e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/Main.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/Main.java
@@ -1,5 +1,6 @@
 package de.deadlocker8.budgetmaster;
 
+import de.deadlocker8.budgetmaster.utils.DatabaseConfigurationProperties;
 import de.thecodelabs.utils.io.PathUtils;
 import de.thecodelabs.utils.util.Localization;
 import de.thecodelabs.utils.util.SystemUtils;
@@ -11,6 +12,7 @@ import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
@@ -25,6 +27,7 @@ import java.util.*;
 
 @EnableScheduling
 @SpringBootApplication
+@EnableConfigurationProperties(DatabaseConfigurationProperties.class)
 public class Main extends SpringBootServletInitializer implements ApplicationRunner
 {
 	private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
diff --git a/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java b/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java
index 4fb314b07..d03f7f45d 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/authentication/User.java
@@ -7,6 +7,7 @@ import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 
 @Entity
+@Table(name = "login_user")
 public class User
 {
 	@Id
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java
index 0938019d8..dd2b3b8b9 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfiguration.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.utils;
 
-import de.deadlocker8.budgetmaster.Main;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -8,18 +8,31 @@ import org.springframework.context.annotation.Primary;
 import org.springframework.context.annotation.Profile;
 
 import javax.sql.DataSource;
-import java.nio.file.Path;
+import java.text.MessageFormat;
 
 @Configuration
 @Profile("!test")
 public class DatabaseConfiguration
 {
+	DatabaseConfigurationProperties databaseConfig;
+
+	@Autowired
+	public DatabaseConfiguration(DatabaseConfigurationProperties databaseConfig)
+	{
+		this.databaseConfig = databaseConfig;
+	}
+
 	@Bean
 	@Primary
 	public DataSource dataSource()
 	{
-		Path applicationSupportFolder = Main.getApplicationSupportFolder();
-		String jdbcString = "jdbc:h2:/" + applicationSupportFolder.toString() + "/" + "budgetmaster;DB_CLOSE_ON_EXIT=TRUE";
-		return DataSourceBuilder.create().username("sa").password("").url(jdbcString).driverClassName("org.h2.Driver").build();
+		final String jdbcString = MessageFormat.format("jdbc:postgresql://{0}:{1}/{2}", databaseConfig.getHostname(), Long.toString(databaseConfig.getPort()), databaseConfig.getDatabaseName());
+
+		return DataSourceBuilder.create()
+				.username(databaseConfig.getUsername())
+				.password(databaseConfig.getPassword())
+				.url(jdbcString)
+				.driverClassName("org.postgresql.Driver")
+				.build();
 	}
 }
diff --git a/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java
new file mode 100644
index 000000000..daea5a91f
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/utils/DatabaseConfigurationProperties.java
@@ -0,0 +1,89 @@
+package de.deadlocker8.budgetmaster.utils;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+
+@ConfigurationProperties(prefix = "budgetmaster.database")
+public class DatabaseConfigurationProperties
+{
+	@NotBlank
+	private String hostname;
+
+	@Min(1)
+	@Max(65536)
+	private int port;
+
+	@NotBlank
+	private String databaseName;
+
+	@NotBlank
+	private String username;
+
+	@NotBlank
+	private String password;
+
+	public String getHostname()
+	{
+		return hostname;
+	}
+
+	public void setHostname(String hostname)
+	{
+		this.hostname = hostname;
+	}
+
+	public int getPort()
+	{
+		return port;
+	}
+
+	public void setPort(int port)
+	{
+		this.port = port;
+	}
+
+	public String getDatabaseName()
+	{
+		return databaseName;
+	}
+
+	public void setDatabaseName(String databaseName)
+	{
+		this.databaseName = databaseName;
+	}
+
+	public String getUsername()
+	{
+		return username;
+	}
+
+	public void setUsername(String username)
+	{
+		this.username = username;
+	}
+
+	public String getPassword()
+	{
+		return password;
+	}
+
+	public void setPassword(String password)
+	{
+		this.password = password;
+	}
+
+	@Override
+	public String toString()
+	{
+		return "DatabaseConfigurationProperties{" +
+				"hostname='" + hostname + '\'' +
+				", port=" + port +
+				", databaseName='" + databaseName + '\'' +
+				", username='" + username + '\'' +
+				", password='" + password + '\'' +
+				'}';
+	}
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index a44ce63f3..f96ef5f3e 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,5 +1,6 @@
 spring.mvc.log-resolved-exception=false
 
+spring.jpa.show-sql=false
 spring.jpa.hibernate.ddl-auto=update
 
 spring.servlet.multipart.max-file-size=100MB
diff --git a/src/main/resources/config/templates/settings.properties b/src/main/resources/config/templates/settings.properties
index 2781007dd..4ae66e08f 100644
--- a/src/main/resources/config/templates/settings.properties
+++ b/src/main/resources/config/templates/settings.properties
@@ -2,6 +2,13 @@
 
 server.port=9000
 
+### database settings ###
+budgetmaster.database.hostname=localhost
+budgetmaster.database.port=5432
+budgetmaster.database.databaseName=budgetmaster
+budgetmaster.database.username=budgetmaster
+budgetmaster.database.password=budgetmaster
+
 ### SSL settings ###
 
 # do not change this property
-- 
GitLab