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")
+ );
+ }
}