From 585c2842de365628fd0f0f30da539eb33fd3682e Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 16 Jun 2024 22:26:12 +0200 Subject: [PATCH 1/6] Add API prefix and change app port --- src/main/resources/application.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e6bb50d..51943cc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1,4 @@ quarkus.quinoa.dev-server.port=4200 -quarkus.quinoa.build-dir=dist \ No newline at end of file +quarkus.quinoa.build-dir=dist +quarkus.http.port=80 +quarkus.resteasy-reactive.path=/api/v1 \ No newline at end of file From d98231184a65565d27ad2f487c4a8a8de6ff59ed Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 16 Jun 2024 22:26:22 +0200 Subject: [PATCH 2/6] Add db docker compose --- db/docker-compose.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 db/docker-compose.yml diff --git a/db/docker-compose.yml b/db/docker-compose.yml new file mode 100644 index 0000000..d6407f1 --- /dev/null +++ b/db/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.8' +services: + rethinkdb: + image: rethinkdb:latest + restart: unless-stopped + volumes: + - rethinkdb_data:/data + ports: + - "28015:28015" # Client driver port + - "8080:8080" # Admin UI port + +volumes: + rethinkdb_data: \ No newline at end of file From d4c6c4165bb8948916ff46a05f3cb831d9544be0 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 16 Jun 2024 22:26:31 +0200 Subject: [PATCH 3/6] Add test resource --- .../de/w665/fluidcms/rest/mapping/TestResource.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java diff --git a/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java new file mode 100644 index 0000000..bbf5b1d --- /dev/null +++ b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java @@ -0,0 +1,13 @@ +package de.w665.fluidcms.rest.mapping; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import org.jboss.resteasy.reactive.RestResponse; + +@Path("/test") +public class TestResource { + @GET + public RestResponse test() { + return RestResponse.ResponseBuilder.ok("Test").build(); + } +} From 375722e3a4a690fb7a1e171f8bf289c791ac3696 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 17 Jun 2024 00:37:17 +0200 Subject: [PATCH 4/6] Add RethinkDBConnector and RethinkDBService - Configure dependency --- build.gradle | 4 ++ .../de/w665/fluidcms/db/RethinkDBConfig.java | 23 ++++++++++ .../w665/fluidcms/db/RethinkDBConnector.java | 37 ++++++++++++++++ .../de/w665/fluidcms/db/RethinkDBService.java | 42 +++++++++++++++++++ .../fluidcms/rest/mapping/TestResource.java | 16 ++++++- src/main/resources/application.properties | 8 +++- 6 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/w665/fluidcms/db/RethinkDBConfig.java create mode 100644 src/main/java/de/w665/fluidcms/db/RethinkDBConnector.java create mode 100644 src/main/java/de/w665/fluidcms/db/RethinkDBService.java diff --git a/build.gradle b/build.gradle index 689fd49..ae22861 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,10 @@ dependencies { testImplementation 'io.rest-assured:rest-assured' compileOnly 'org.projectlombok:lombok:1.18.32' annotationProcessor 'org.projectlombok:lombok:1.18.32' + implementation ('com.rethinkdb:rethinkdb-driver:2.4.4') { + exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' // exclude older jackson-databind version + } + implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1' // Manually add newer jackson-databind version without CVE } group 'de.w665' diff --git a/src/main/java/de/w665/fluidcms/db/RethinkDBConfig.java b/src/main/java/de/w665/fluidcms/db/RethinkDBConfig.java new file mode 100644 index 0000000..d882711 --- /dev/null +++ b/src/main/java/de/w665/fluidcms/db/RethinkDBConfig.java @@ -0,0 +1,23 @@ +package de.w665.fluidcms.db; + +import jakarta.inject.Singleton; +import lombok.Getter; +import lombok.Setter; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +@Getter +@Setter +@Singleton +public class RethinkDBConfig { + @ConfigProperty(name = "fluidcms.database.host") + String host; + + @ConfigProperty(name = "fluidcms.database.port") + int port; + + @ConfigProperty(name = "fluidcms.database.name") + String database; + + @ConfigProperty(name = "fluidcms.database.autoresetonstartup") + boolean autoresetonstartup; +} diff --git a/src/main/java/de/w665/fluidcms/db/RethinkDBConnector.java b/src/main/java/de/w665/fluidcms/db/RethinkDBConnector.java new file mode 100644 index 0000000..7af6086 --- /dev/null +++ b/src/main/java/de/w665/fluidcms/db/RethinkDBConnector.java @@ -0,0 +1,37 @@ +package de.w665.fluidcms.db; + +import com.rethinkdb.RethinkDB; +import com.rethinkdb.net.Connection; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Singleton +@RequiredArgsConstructor +@Getter +public class RethinkDBConnector { + + @Inject + RethinkDBConfig config; + + private final RethinkDB r = RethinkDB.r; + private Connection connection; + + @PostConstruct + public void connectToDatabase() { + connection = r.connection().hostname(config.getHost()).port(config.getPort()).connect(); + log.info("Connected to RethinkDB at " + config.getHost() + ":" + config.getPort() + " on database " + config.getDatabase()); + } + + @PreDestroy + public void closeConnection() { + if (connection != null) { + connection.close(); + } + } +} \ No newline at end of file diff --git a/src/main/java/de/w665/fluidcms/db/RethinkDBService.java b/src/main/java/de/w665/fluidcms/db/RethinkDBService.java new file mode 100644 index 0000000..57afdcc --- /dev/null +++ b/src/main/java/de/w665/fluidcms/db/RethinkDBService.java @@ -0,0 +1,42 @@ +package de.w665.fluidcms.db; + +import com.rethinkdb.RethinkDB; +import com.rethinkdb.gen.exc.ReqlOpFailedError; +import com.rethinkdb.net.Connection; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@ApplicationScoped +public class RethinkDBService { + + @Inject + RethinkDBConfig config; + + @Inject + RethinkDBConnector connector; + + private Connection connection; + private RethinkDB r; + + @PostConstruct + public void init() { + this.r = connector.getR(); + this.connection = connector.getConnection(); + initialize(); + } + + public void initialize() { + + log.debug("Initializing RethinkDB database..."); + // rethinkdb check if database exists + try { + r.dbCreate(config.getDatabase()).run(connection).stream(); + log.debug("Database " + config.getDatabase() + " created"); + } catch (ReqlOpFailedError e) { + log.debug("Database " + config.getDatabase() + " already exists. Error: " + e.getClass().getSimpleName()); + } + } +} diff --git a/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java index bbf5b1d..7d7b1f9 100644 --- a/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java +++ b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java @@ -1,13 +1,27 @@ package de.w665.fluidcms.rest.mapping; +import de.w665.fluidcms.db.RethinkDBConfig; +import de.w665.fluidcms.db.RethinkDBService; +import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; import org.jboss.resteasy.reactive.RestResponse; @Path("/test") public class TestResource { + + @Inject + RethinkDBConfig rethinkDBConfig; + + @Inject + RethinkDBService rethinkDBService; + @GET + @Produces(MediaType.TEXT_PLAIN) public RestResponse test() { - return RestResponse.ResponseBuilder.ok("Test").build(); + this.rethinkDBService.initialize(); + return RestResponse.ResponseBuilder.ok(rethinkDBConfig.getHost()).build(); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 51943cc..4ed4957 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,10 @@ quarkus.quinoa.dev-server.port=4200 quarkus.quinoa.build-dir=dist quarkus.http.port=80 -quarkus.resteasy-reactive.path=/api/v1 \ No newline at end of file +quarkus.resteasy-reactive.path=/api/v1 + +# Database +fluidcms.database.host=localhost +fluidcms.database.port=28015 +fluidcms.database.name=fluidcms +fluidcms.database.autoresetonstartup=false \ No newline at end of file From d1710a2a9c1ac2916dc79656ad97511f33239dcc Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 17 Jun 2024 20:51:05 +0200 Subject: [PATCH 5/6] Finish RethinkDBService Add TestRepo Set debug log level --- .../de/w665/fluidcms/db/RethinkDBService.java | 8 ++-- .../de/w665/fluidcms/db/repo/TestRepo.java | 43 +++++++++++++++++++ .../fluidcms/rest/mapping/TestResource.java | 12 ++---- src/main/resources/application.properties | 1 + 4 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 src/main/java/de/w665/fluidcms/db/repo/TestRepo.java diff --git a/src/main/java/de/w665/fluidcms/db/RethinkDBService.java b/src/main/java/de/w665/fluidcms/db/RethinkDBService.java index 57afdcc..d21760c 100644 --- a/src/main/java/de/w665/fluidcms/db/RethinkDBService.java +++ b/src/main/java/de/w665/fluidcms/db/RethinkDBService.java @@ -3,13 +3,13 @@ package de.w665.fluidcms.db; import com.rethinkdb.RethinkDB; import com.rethinkdb.gen.exc.ReqlOpFailedError; import com.rethinkdb.net.Connection; -import jakarta.annotation.PostConstruct; -import jakarta.enterprise.context.ApplicationScoped; +import io.quarkus.runtime.Startup; import jakarta.inject.Inject; +import jakarta.inject.Singleton; import lombok.extern.slf4j.Slf4j; @Slf4j -@ApplicationScoped +@Singleton public class RethinkDBService { @Inject @@ -21,7 +21,7 @@ public class RethinkDBService { private Connection connection; private RethinkDB r; - @PostConstruct + @Startup public void init() { this.r = connector.getR(); this.connection = connector.getConnection(); diff --git a/src/main/java/de/w665/fluidcms/db/repo/TestRepo.java b/src/main/java/de/w665/fluidcms/db/repo/TestRepo.java new file mode 100644 index 0000000..4c4446b --- /dev/null +++ b/src/main/java/de/w665/fluidcms/db/repo/TestRepo.java @@ -0,0 +1,43 @@ +package de.w665.fluidcms.db.repo; + +import com.rethinkdb.RethinkDB; +import com.rethinkdb.net.Connection; +import de.w665.fluidcms.db.RethinkDBConfig; +import de.w665.fluidcms.db.RethinkDBConnector; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@ApplicationScoped +public class TestRepo { + + @Inject + RethinkDBConnector connector; + + @Inject + RethinkDBConfig config; + + private final String TABLE_NAME = "test"; + private RethinkDB r; + private Connection connection; + + @PostConstruct + public void init() { + this.r = this.connector.getR(); + this.connection = this.connector.getConnection(); + + // Check if table exists + try { + r.db(config.getDatabase()).tableCreate(TABLE_NAME).run(connection); + log.debug("Table " + TABLE_NAME + " created"); + } catch (Exception e) { + log.debug("Table " + TABLE_NAME + " already exists"); + } + } + + public void insert(String value) { + r.db(config.getDatabase()).table(TABLE_NAME).insert(r.hashMap("value", value)).run(connection); + } +} diff --git a/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java index 7d7b1f9..e43fdb5 100644 --- a/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java +++ b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java @@ -1,7 +1,6 @@ package de.w665.fluidcms.rest.mapping; -import de.w665.fluidcms.db.RethinkDBConfig; -import de.w665.fluidcms.db.RethinkDBService; +import de.w665.fluidcms.db.repo.TestRepo; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -13,15 +12,12 @@ import org.jboss.resteasy.reactive.RestResponse; public class TestResource { @Inject - RethinkDBConfig rethinkDBConfig; - - @Inject - RethinkDBService rethinkDBService; + TestRepo testRepo; @GET @Produces(MediaType.TEXT_PLAIN) public RestResponse test() { - this.rethinkDBService.initialize(); - return RestResponse.ResponseBuilder.ok(rethinkDBConfig.getHost()).build(); + testRepo.insert("testString"); + return RestResponse.ResponseBuilder.ok("test").build(); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4ed4957..42b7e7d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,6 +2,7 @@ quarkus.quinoa.dev-server.port=4200 quarkus.quinoa.build-dir=dist quarkus.http.port=80 quarkus.resteasy-reactive.path=/api/v1 +quarkus.log.category."de.w665.fluidcms".level=DEBUG # Database fluidcms.database.host=localhost From d62f2c25b9738b1d2a0f986ae8e714584d706dbd Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 17 Jun 2024 20:52:18 +0200 Subject: [PATCH 6/6] fix TestResource --- src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java index e43fdb5..a6b427a 100644 --- a/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java +++ b/src/main/java/de/w665/fluidcms/rest/mapping/TestResource.java @@ -18,6 +18,6 @@ public class TestResource { @Produces(MediaType.TEXT_PLAIN) public RestResponse test() { testRepo.insert("testString"); - return RestResponse.ResponseBuilder.ok("test").build(); + return RestResponse.ResponseBuilder.ok("Inserted testString into db.").build(); } }