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