diff --git a/calm-hub/.gitignore b/calm-hub/.gitignore
index ee1b34071..049281bf5 100644
--- a/calm-hub/.gitignore
+++ b/calm-hub/.gitignore
@@ -42,7 +42,7 @@
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
-# *.iml
+*.iml
# *.ipr
# CMake
@@ -316,4 +316,4 @@ thumb
sketch
-# End of https://www.toptal.com/developers/gitignore/api/intellij,react,node,java,maven
\ No newline at end of file
+# End of https://www.toptal.com/developers/gitignore/api/intellij,react,node,java,maven
diff --git a/calm-hub/mongo/init-mongo.js b/calm-hub/mongo/init-mongo.js
index 09044f782..849e1d8f5 100644
--- a/calm-hub/mongo/init-mongo.js
+++ b/calm-hub/mongo/init-mongo.js
@@ -21,6 +21,17 @@ if (db.counters.countDocuments({ _id: "architectureStoreCounter" }) === 1) {
print("architectureStoreCounter already exists, no initialization needed");
}
+if (db.counters.countDocuments({ _id: "adrStoreCounter" }) === 1) {
+ db.counters.insertOne({
+ _id: "adrStoreCounter",
+ sequence_value: 1
+ });
+ print("Initialized adrStoreCounter with sequence_value 1");
+} else {
+ print("adrStoreCounter already exists, no initialization needed");
+}
+
+
if (db.counters.countDocuments({ _id: "flowStoreCounter" }) === 1) {
db.counters.insertOne({
_id: "flowStoreCounter",
diff --git a/calm-hub/pom.xml b/calm-hub/pom.xml
index a95f1db59..9fb82398c 100644
--- a/calm-hub/pom.xml
+++ b/calm-hub/pom.xml
@@ -44,6 +44,16 @@
io.quarkus
quarkus-mongodb-client
+
+ io.soabase.record-builder
+ record-builder-core
+ 44
+ provided
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
@@ -165,6 +175,11 @@
org.jacoco
jacoco-maven-plugin
0.8.12
+
+
+ **/*Builder.*
+
+
default-prepare-agent
@@ -200,6 +215,21 @@
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+ io.soabase.record-builder
+ record-builder-processor
+ 44
+
+
+
+
diff --git a/calm-hub/src/integration-test/java/integration/MongoAdrIntegration.java b/calm-hub/src/integration-test/java/integration/MongoAdrIntegration.java
new file mode 100644
index 000000000..1c3f15388
--- /dev/null
+++ b/calm-hub/src/integration-test/java/integration/MongoAdrIntegration.java
@@ -0,0 +1,210 @@
+package integration;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoDatabase;
+import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.TestProfile;
+import org.bson.Document;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.finos.calm.domain.adr.Adr;
+import org.finos.calm.domain.adr.AdrMeta;
+import org.finos.calm.domain.adr.AdrMetaBuilder;
+import org.finos.calm.domain.adr.Decision;
+import org.finos.calm.domain.adr.DecisionBuilder;
+import org.finos.calm.domain.adr.LinkBuilder;
+import org.finos.calm.domain.adr.NewAdrRequest;
+import org.finos.calm.domain.adr.NewAdrRequestBuilder;
+import org.finos.calm.domain.adr.Option;
+import org.finos.calm.domain.adr.OptionBuilder;
+import org.finos.calm.domain.adr.Status;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import static integration.MongoSetup.counterSetup;
+import static integration.MongoSetup.namespaceSetup;
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@QuarkusTest
+@TestProfile(IntegrationTestProfile.class)
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class MongoAdrIntegration {
+
+ private ObjectMapper objectMapper;
+
+ private static final Logger logger = LoggerFactory.getLogger(MongoAdrIntegration.class);
+
+ private final String TITLE = "My ADR";
+ private final String PROBLEM_STATEMENT = "My problem is...";
+ private final List DECISION_DRIVERS = List.of("a", "b", "c");
+ private final Option OPTION_A = OptionBuilder.builder().name("Option 1").description("optionDescription")
+ .positiveConsequences(List.of("a")).negativeConsequences(List.of("b")).build();
+ private final Option OPTION_B = OptionBuilder.builder().name("Option 2").description("optionDescription")
+ .positiveConsequences(List.of("c")).negativeConsequences(List.of("d")).build();
+ private final List