From de3f972effa5aee7a30458a631698c6cfa0ef9a6 Mon Sep 17 00:00:00 2001 From: stCarolas Date: Thu, 7 Mar 2024 01:45:03 +0300 Subject: [PATCH] update micronaut, add testuser to sql migration, saving new WidgetConfigValue --- Dockerfile | 6 ++--- TODO | 1 + local.sh | 8 ++++++ pom.xml | 17 +++++++------ .../io/github/stcarolas/oda/Application.java | 21 +++++++++++++++- .../stcarolas/oda/config/ConfigValue.java | 7 ++++++ .../config/ConfigValueAbstractFactory.java | 25 ++++++++++++++++++- .../oda/config/values/WidgetsConfigValue.java | 18 ++++++++++--- src/main/resources/application-allinone.yml | 4 +++ src/main/resources/application-standalone.yml | 7 ++++++ src/main/resources/application.yml | 7 ------ .../db/migration/V2__add-testuser.sql | 1 + .../oda/config/ConfigControllerTest.java | 2 +- .../ConfigValueAbstractFactoryTest.java | 25 +++++++++++++++++-- 14 files changed, 124 insertions(+), 25 deletions(-) create mode 100644 TODO create mode 100755 local.sh create mode 100644 src/main/resources/application-allinone.yml create mode 100644 src/main/resources/application-standalone.yml create mode 100644 src/main/resources/db/migration/V2__add-testuser.sql diff --git a/Dockerfile b/Dockerfile index 5a85416..f7eb86e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -FROM eclipse-temurin:17-jdk-jammy +FROM fedora:39 WORKDIR /app -COPY target/oda-config-service-0.1.jar /app +COPY target/oda-config-service /app -CMD ["java","--add-opens","java.base/java.time=ALL-UNNAMED","-jar","oda-config-service-0.1.jar"] +CMD ["./oda-config-service"] diff --git a/TODO b/TODO new file mode 100644 index 0000000..b3b6a14 --- /dev/null +++ b/TODO @@ -0,0 +1 @@ +default paymentpage config diff --git a/local.sh b/local.sh new file mode 100755 index 0000000..38f5a59 --- /dev/null +++ b/local.sh @@ -0,0 +1,8 @@ +version=`date +%s` +imagename="ghcr.io/opendonationassistant/oda-config-service:$version" + +export JAVA_HOME=/usr/lib/jvm/graalvm-jdk-21.0.2+13.1 +mvn clean package -Dpackaging=native-image +podman build . -t $imagename +podman save $imagename | sudo k3s ctr image import - +kubectl get deploy config-service -o json | jq ".spec.template.spec.containers[0].image = \"$imagename\"" | kubectl apply -f - diff --git a/pom.xml b/pom.xml index fd7243a..cbd23bc 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ io.micronaut.platform micronaut-parent - 4.1.0 + 4.2.3 @@ -17,7 +17,7 @@ jar 17 17 - 4.1.0 + 4.2.3 netty true false @@ -101,15 +101,11 @@ - - io.micronaut.testresources - micronaut-test-resources-core - 2.3.3 - org.mockito mockito-core 5.10.0 + test org.testcontainers @@ -121,6 +117,12 @@ postgresql test + + io.micronaut.testresources + micronaut-test-resources-core + 2.3.3 + test + io.micronaut.testresources micronaut-test-resources-extensions-core @@ -182,6 +184,7 @@ org.apache.maven.plugins maven-compiler-plugin + false io.micronaut diff --git a/src/main/java/io/github/stcarolas/oda/Application.java b/src/main/java/io/github/stcarolas/oda/Application.java index 5456cf8..f082214 100644 --- a/src/main/java/io/github/stcarolas/oda/Application.java +++ b/src/main/java/io/github/stcarolas/oda/Application.java @@ -1,10 +1,29 @@ package io.github.stcarolas.oda; +import io.micronaut.context.ApplicationContext; +import io.micronaut.context.ApplicationContextBuilder; +import io.micronaut.context.ApplicationContextConfigurer; +import io.micronaut.context.annotation.ContextConfigurer; import io.micronaut.runtime.Micronaut; public class Application { + @ContextConfigurer + public static class DefaultEnvironmentConfigurer + implements ApplicationContextConfigurer { + + @Override + public void configure(ApplicationContextBuilder builder) { + builder.defaultEnvironments("standalone"); + } + } + public static void main(String[] args) { - Beans.context = Micronaut.build(args).banner(false).start(); + ApplicationContext context = Micronaut + .build(args) + .mainClass(Application.class) + .banner(false) + .start(); + Beans.context = context; } } diff --git a/src/main/java/io/github/stcarolas/oda/config/ConfigValue.java b/src/main/java/io/github/stcarolas/oda/config/ConfigValue.java index 239a891..ba6b880 100644 --- a/src/main/java/io/github/stcarolas/oda/config/ConfigValue.java +++ b/src/main/java/io/github/stcarolas/oda/config/ConfigValue.java @@ -80,4 +80,11 @@ public String getId() { public void setId(String id) { this.id = id; } + + @Override + public String toString() { + return "{\"_type\"=\"ConfigValue\",\"id\"=\"" + id + "\", name\"=\"" + name + "\", ownerId\"=\"" + ownerId + + "\", value\"=\"" + value + "}"; + } + } diff --git a/src/main/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactory.java b/src/main/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactory.java index 143aab5..798196b 100644 --- a/src/main/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactory.java +++ b/src/main/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactory.java @@ -4,6 +4,7 @@ import io.micronaut.core.annotation.NonNull; import jakarta.inject.Inject; import jakarta.inject.Singleton; +import java.util.HashMap; import java.util.Objects; import java.util.Optional; @@ -25,9 +26,31 @@ public ConfigValueAbstractFactory(@NonNull ConfigRepository repository) { Objects.requireNonNull(ownerId, "Missing ownerId to search for config"); Objects.requireNonNull(name, "Missing config's name to search for it"); Optional value = repository.find(ownerId, name); + if (value.isEmpty() && "widgets".equalsIgnoreCase(name)) { + SaveableConfigValue widgetsValue = new SaveableConfigValue( + "widgets", + ownerId, + new HashMap<>(), + repository + ); + widgetsValue.save(); + return Optional.of( + new WidgetsConfigValue( + widgetsValue.getId(), + widgetsValue.getOwnerId(), + widgetsValue.getValue(), + repository + ) + ); + } return value.map(it -> "widgets".equals(it.getName()) - ? new WidgetsConfigValue(it.getId(), it.getOwnerId(), it.getValue(), repository) + ? new WidgetsConfigValue( + it.getId(), + it.getOwnerId(), + it.getValue(), + repository + ) : it ); } diff --git a/src/main/java/io/github/stcarolas/oda/config/values/WidgetsConfigValue.java b/src/main/java/io/github/stcarolas/oda/config/values/WidgetsConfigValue.java index 18e4964..3658e90 100644 --- a/src/main/java/io/github/stcarolas/oda/config/values/WidgetsConfigValue.java +++ b/src/main/java/io/github/stcarolas/oda/config/values/WidgetsConfigValue.java @@ -2,10 +2,13 @@ import io.github.stcarolas.oda.config.ConfigRepository; import io.github.stcarolas.oda.config.SaveableConfigValue; +import io.micronaut.core.util.StringUtils; import io.micronaut.serde.annotation.Serdeable; import java.util.HashMap; import java.util.Map; +import com.fasterxml.uuid.Generators; + @Serdeable public class WidgetsConfigValue extends SaveableConfigValue { @@ -16,13 +19,22 @@ public WidgetsConfigValue( ConfigRepository repository ) { super("widgets", ownerId, values, repository); - this.setId(id); + this.setId( + StringUtils.isEmpty(id) + ? Generators.timeBasedEpochGenerator().generate().toString() + : id + ); this.setName("widgets"); - var topicValues = (Map) values.getOrDefault( + if (values == null) { + values = new HashMap<>(); + } + + var topicValues = new HashMap((Map) values.getOrDefault( "topic", new HashMap<>() - ); + )); + defaultValues(ownerId) .entrySet() .stream() diff --git a/src/main/resources/application-allinone.yml b/src/main/resources/application-allinone.yml new file mode 100644 index 0000000..f0302b1 --- /dev/null +++ b/src/main/resources/application-allinone.yml @@ -0,0 +1,4 @@ +datasources: + default: + driverClassName: 'org.postgresql.Driver' + db-type: "postgresql" diff --git a/src/main/resources/application-standalone.yml b/src/main/resources/application-standalone.yml new file mode 100644 index 0000000..6dfddd2 --- /dev/null +++ b/src/main/resources/application-standalone.yml @@ -0,0 +1,7 @@ +rabbitmq.host: ${RABBITMQ_HOST:`localhost`} +datasources: + default: + url: ${JDBC_URL:`jdbc:postgresql://localhost/postgres?currentSchema=config`} + username: ${JDBC_USER:`postgres`} + password: ${JDBC_PASSWORD:`postgres`} + driverClassName: 'org.postgresql.Driver' diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f97ad6d..4084722 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,13 +12,6 @@ micronaut: jwks: keycloak: url: https://auth.oda.digital/realms/ODA/protocol/openid-connect/certs -datasources: - default: - url: ${JDBC_URL} - username: ${JDBC_USER:`postgres`} - password: ${JDBC_PASSWORD:`postgres`} - db-type: "postgresql" - driverClassName: 'org.postgresql.Driver' endpoints: flyway: enabled: true diff --git a/src/main/resources/db/migration/V2__add-testuser.sql b/src/main/resources/db/migration/V2__add-testuser.sql new file mode 100644 index 0000000..1c2168b --- /dev/null +++ b/src/main/resources/db/migration/V2__add-testuser.sql @@ -0,0 +1 @@ +insert into config(id, name, owner_id, value) values ('018e139a-89e6-75cb-adc2-d02202470b14', 'paymentpage', 'testuser', '{"fio": "Иванов Иван Иванович", "inn": "111111111111", "email": "stcarolas@gmail.com", "nickname": "testuser", "arbitraryText": "приветик, \nспасибо за донатик))", "media.requests.enabled": true}') diff --git a/src/test/java/io/github/stcarolas/oda/config/ConfigControllerTest.java b/src/test/java/io/github/stcarolas/oda/config/ConfigControllerTest.java index 0c251e6..23d0a1c 100644 --- a/src/test/java/io/github/stcarolas/oda/config/ConfigControllerTest.java +++ b/src/test/java/io/github/stcarolas/oda/config/ConfigControllerTest.java @@ -15,7 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@MicronautTest +@MicronautTest(environments = "allinone") public class ConfigControllerTest { Logger log = LoggerFactory.getLogger(ConfigControllerTest.class); diff --git a/src/test/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactoryTest.java b/src/test/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactoryTest.java index 7647354..aa59fed 100644 --- a/src/test/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactoryTest.java +++ b/src/test/java/io/github/stcarolas/oda/config/ConfigValueAbstractFactoryTest.java @@ -1,6 +1,5 @@ package io.github.stcarolas.oda.config; -import static java.util.Optional.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrowsExactly; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -55,7 +54,7 @@ public void testReturnStoredValue() { var factory = new ConfigValueAbstractFactory(mockRepository); var expected = Optional.of(config); assertEquals(expected, factory.findExisting("testuser", "testname")); - verify(mockRepository).find("testuser","testname"); + verify(mockRepository).find("testuser", "testname"); } @Test @@ -92,4 +91,26 @@ public void testReturnDefaultValuesForWidgetsIfMissing() throws IOException { ); assertEquals(expectedValue, config.get().getValue()); } + + @Test + public void testMergingSavedWidgetConfigWithDefaultValues() { + Map configValues = Map.of( + "topic", + Map.of("alerts", "sometestvalue") + ); + when(mockRepository.find(Mockito.any(), Mockito.any())) + .thenReturn( + Optional.of(new ConfigValue("id", "widgets", "testuser", configValues)) + ); + var factory = new ConfigValueAbstractFactory(mockRepository); + + Optional config = factory.findExisting("testuser", "widgets"); + + assertTrue(config.isPresent()); + ConfigValue fact = config.get(); + assertEquals( + "sometestvalue", + ((Map) fact.getValue().get("topic")).get("alerts") + ); + } }