From 773e8470b0bf868fb1409d159ffe41187ee4f6a2 Mon Sep 17 00:00:00 2001 From: mbremer Date: Tue, 12 Oct 2021 07:40:26 +0200 Subject: [PATCH] add db-table configuration (WIP) --- .../mbremer/configuration/Configuration.java | 19 ++++++++ .../configuration/DatabaseConfigSource.java | 40 +++++++++++++++++ .../de/mbremer/secutity/UserResource.java | 45 +++++++++++++++++++ .../de/mbremer/traffic/TrafficAdminForm.java | 11 +++++ .../de/mbremer/traffic/TrafficUserForm.java | 4 ++ ...lipse.microprofile.config.spi.ConfigSource | 1 + .../db/migration/V0004__configuration.sql | 5 +++ src/main/resources/templates/user.html | 8 ++-- 8 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/mbremer/configuration/Configuration.java create mode 100644 src/main/java/de/mbremer/configuration/DatabaseConfigSource.java create mode 100644 src/main/java/de/mbremer/traffic/TrafficAdminForm.java create mode 100644 src/main/java/de/mbremer/traffic/TrafficUserForm.java create mode 100644 src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource create mode 100644 src/main/resources/db/migration/V0004__configuration.sql diff --git a/src/main/java/de/mbremer/configuration/Configuration.java b/src/main/java/de/mbremer/configuration/Configuration.java new file mode 100644 index 0000000..d430f1f --- /dev/null +++ b/src/main/java/de/mbremer/configuration/Configuration.java @@ -0,0 +1,19 @@ +package de.mbremer.configuration; + +import io.quarkus.hibernate.orm.panache.PanacheEntity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.persistence.Entity; + +@Entity +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class Configuration extends PanacheEntity { + String propertyName; + String value; +} diff --git a/src/main/java/de/mbremer/configuration/DatabaseConfigSource.java b/src/main/java/de/mbremer/configuration/DatabaseConfigSource.java new file mode 100644 index 0000000..9ca7c04 --- /dev/null +++ b/src/main/java/de/mbremer/configuration/DatabaseConfigSource.java @@ -0,0 +1,40 @@ +package de.mbremer.configuration; + +import io.quarkus.hibernate.orm.panache.PanacheQuery; +import org.eclipse.microprofile.config.spi.ConfigSource; + +import java.util.Set; +import java.util.stream.Collectors; + +public class DatabaseConfigSource implements ConfigSource { + + @Override + public Set getPropertyNames() { + try { + return Configuration.streamAll().map(c -> ((Configuration) c).getPropertyName()).collect(Collectors.toSet()); + } catch (IllegalStateException e) { + // DB in not up + return Set.of(); + } + } + + @Override + public String getValue(String propertyName) { + try { + PanacheQuery conf = Configuration.find("propertyName", propertyName); + if (conf == null) { + // DB in not up + return null; + } + return conf.singleResultOptional().map(c -> ((Configuration) c).getValue()).orElse(null); + } catch (IllegalStateException e) { + // DB in not up + return null; + } + } + + @Override + public String getName() { + return DatabaseConfigSource.class.getSimpleName(); + } +} diff --git a/src/main/java/de/mbremer/secutity/UserResource.java b/src/main/java/de/mbremer/secutity/UserResource.java index e65a340..14dd03b 100644 --- a/src/main/java/de/mbremer/secutity/UserResource.java +++ b/src/main/java/de/mbremer/secutity/UserResource.java @@ -1,23 +1,31 @@ package de.mbremer.secutity; +import de.mbremer.configuration.Configuration; import de.mbremer.room.Room; +import de.mbremer.traffic.TrafficAdminForm; +import de.mbremer.traffic.TrafficUserForm; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; import io.quarkus.panache.common.Sort; import io.quarkus.qute.Location; import io.quarkus.qute.Template; import io.quarkus.qute.TemplateInstance; import io.quarkus.security.identity.SecurityIdentity; +import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; +import org.jboss.resteasy.annotations.jaxrs.PathParam; import org.jboss.resteasy.annotations.providers.multipart.MultipartForm; import javax.annotation.security.PermitAll; import javax.annotation.security.RolesAllowed; import javax.inject.Inject; +import javax.persistence.NoResultException; import javax.transaction.Transactional; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.NewCookie; import javax.ws.rs.core.Response; import java.net.URI; +import java.util.Optional; import static de.mbremer.secutity.Role.ADMIN; @@ -36,6 +44,9 @@ public class UserResource { @Inject @Location("user.html") Template userTemplate; + // TODO: 12.10.21 +// @ConfigProperty(name = "google_api_key") +// Optional googleApiKey; @GET @Produces(MediaType.TEXT_HTML) @@ -44,11 +55,14 @@ public class UserResource { TemplateInstance templateInstance = userTemplate .data("current_user", User.find("username", identity.getPrincipal().getName()).singleResult()); +// log.info("Google-API-Key" + googleApiKey.orElse("-")); + if (identity.hasRole("ADMIN")) { templateInstance .data("is_admin", true) .data("users", User.listAll(Sort.by("username"))) .data("rooms", Room.listAll(Sort.by("name"))); +// .data("google_api_key", googleApiKey.orElse("")); } return templateInstance; @@ -144,4 +158,35 @@ public class UserResource { return getUser(); } + + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.TEXT_HTML) + @Transactional + @Path("/traffic/config/") + public TemplateInstance configureTrafficAdmin(@MultipartForm TrafficAdminForm trafficAdminForm) { + log.info("configure traffic"); + + try { + Configuration apiKeyConfig = Configuration.find("propertyName", "google_api_key").singleResult(); + apiKeyConfig.setValue(trafficAdminForm.googleApiKey); + log.info("update API-Key: " + trafficAdminForm.googleApiKey); + } catch (NoResultException e) { + new Configuration("google_api_key", trafficAdminForm.googleApiKey).persist(); + log.info("create API-Key: " + trafficAdminForm.googleApiKey); + } + + return getUser(); + } + + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + @Produces(MediaType.TEXT_HTML) + @Transactional + @Path("/traffic/config/{username}") + public TemplateInstance configureTrafficUser(@PathParam("username") String username, @MultipartForm TrafficUserForm trafficUserForm) { + log.info("configure traffic for " + username); + + return getUser(); + } } diff --git a/src/main/java/de/mbremer/traffic/TrafficAdminForm.java b/src/main/java/de/mbremer/traffic/TrafficAdminForm.java new file mode 100644 index 0000000..bae6230 --- /dev/null +++ b/src/main/java/de/mbremer/traffic/TrafficAdminForm.java @@ -0,0 +1,11 @@ +package de.mbremer.traffic; + +import javax.ws.rs.FormParam; + + +public class TrafficAdminForm { + public @FormParam("googleapikey") + String googleApiKey; + public @FormParam("officeadress") + String officeAdress; +} diff --git a/src/main/java/de/mbremer/traffic/TrafficUserForm.java b/src/main/java/de/mbremer/traffic/TrafficUserForm.java new file mode 100644 index 0000000..95227bf --- /dev/null +++ b/src/main/java/de/mbremer/traffic/TrafficUserForm.java @@ -0,0 +1,4 @@ +package de.mbremer.traffic; + +public class TrafficUserForm { +} diff --git a/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource b/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource new file mode 100644 index 0000000..3dfa939 --- /dev/null +++ b/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource @@ -0,0 +1 @@ +de.mbremer.configuration.DatabaseConfigSource diff --git a/src/main/resources/db/migration/V0004__configuration.sql b/src/main/resources/db/migration/V0004__configuration.sql new file mode 100644 index 0000000..b1d2661 --- /dev/null +++ b/src/main/resources/db/migration/V0004__configuration.sql @@ -0,0 +1,5 @@ +create table configuration ( + id bigint not null primary key, + propertyName varchar not null unique, + value varchar not null +); diff --git a/src/main/resources/templates/user.html b/src/main/resources/templates/user.html index a8f75c4..51f28ac 100644 --- a/src/main/resources/templates/user.html +++ b/src/main/resources/templates/user.html @@ -40,16 +40,16 @@

Verkehrsinfos

-
+
- +
- +
@@ -73,7 +73,7 @@

Verkehrsinfos

Die Fahrzeit wird über die googlemaps-API ermittelt und bei Überschreitung des Grenzwerts via E-Mail gewarnt.
- +