From aab9dc47c1ae7049963febea915e244dc93d9180 Mon Sep 17 00:00:00 2001 From: Oliver Santana Date: Mon, 26 Jan 2026 08:27:13 +0000 Subject: [PATCH] refactor: mongodb target system from sync to springdata --- inventory-orders-service/build.gradle.kts | 7 +++ .../examples/inventory/FlamingockConfig.java | 22 +++----- .../examples/inventory/TargetSystems.java | 54 ------------------- ..._mongodb_addDiscountCodeFieldToOrders.java | 16 +++--- ...db_backfillDiscountsForExistingOrders.java | 10 ++-- ..._0005__mongodb_addIndexOnDiscountCode.java | 12 ++--- .../src/main/resources/application.yml | 3 ++ .../inventory/InventoryOrdersAppTest.java | 2 +- 8 files changed, 35 insertions(+), 91 deletions(-) diff --git a/inventory-orders-service/build.gradle.kts b/inventory-orders-service/build.gradle.kts index 3cb1680..0239636 100644 --- a/inventory-orders-service/build.gradle.kts +++ b/inventory-orders-service/build.gradle.kts @@ -62,6 +62,9 @@ dependencies { // Spring Boot implementation("org.springframework.boot:spring-boot-starter-web") +// Springdata for MongoDB dependency + implementation("org.springframework.boot:spring-boot-starter-data-mongodb") + // Others dependencies needed for this example // implementation("org.slf4j:slf4j-simple:2.0.6") // Commented out - Spring Boot provides logging @@ -91,6 +94,10 @@ tasks.named("jar") { }) } +tasks.jar { + isZip64 = true +} + tasks.withType { options.compilerArgs.add("-parameters") } diff --git a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/FlamingockConfig.java b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/FlamingockConfig.java index 5c77294..43a008d 100644 --- a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/FlamingockConfig.java +++ b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/FlamingockConfig.java @@ -1,15 +1,13 @@ package io.flamingock.examples.inventory; -import com.mongodb.client.MongoClient; import io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient; import io.confluent.kafka.schemaregistry.client.SchemaRegistryClient; import io.flamingock.internal.core.external.store.CommunityAuditStore; import io.flamingock.store.mongodb.sync.MongoDBSyncAuditStore; import io.flamingock.examples.inventory.util.KafkaSchemaManager; import io.flamingock.examples.inventory.util.LaunchDarklyClient; -import io.flamingock.examples.inventory.util.MongoDBUtil; +import io.flamingock.targetsystem.mongodb.springdata.MongoDBSpringDataTargetSystem; import io.flamingock.targetsystem.nontransactional.NonTransactionalTargetSystem; -import io.flamingock.targetsystem.mongodb.sync.MongoDBSyncTargetSystem; import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.admin.AdminClientConfig; import org.springframework.beans.factory.annotation.Value; @@ -17,6 +15,8 @@ import org.springframework.context.annotation.Configuration; import jakarta.annotation.PreDestroy; +import org.springframework.data.mongodb.core.MongoTemplate; + import java.time.Duration; import java.util.Collections; import java.util.Properties; @@ -24,9 +24,6 @@ @Configuration public class FlamingockConfig { - @Value("${mongodb.uri:mongodb://localhost:27017/}") - private String mongodbUri; - @Value("${kafka.bootstrap-servers:localhost:9092}") private String kafkaBootstrapServers; @@ -38,14 +35,9 @@ public class FlamingockConfig { private AdminClient kafkaAdminClient; - @Bean(destroyMethod = "close") - public MongoClient mongoClient() { - return MongoDBUtil.getMongoClient(mongodbUri); - } - @Bean - public MongoDBSyncTargetSystem mongoDBSyncTargetSystem(MongoClient mongoClient) { - return new MongoDBSyncTargetSystem(TargetSystems.MONGODB_TARGET_SYSTEM, mongoClient, TargetSystems.DATABASE_NAME); + public MongoDBSpringDataTargetSystem mongoDBSpringDataTargetSystem(MongoTemplate mongoTemplate) { + return new MongoDBSpringDataTargetSystem(TargetSystems.MONGODB_TARGET_SYSTEM, mongoTemplate); } @Bean @@ -78,8 +70,8 @@ public NonTransactionalTargetSystem toggleTargetSystem() { //This could return any of the available community audit stores @Bean - public CommunityAuditStore auditStore(MongoDBSyncTargetSystem mongoDBSyncTargetSystem) { - return MongoDBSyncAuditStore.from(mongoDBSyncTargetSystem); + public CommunityAuditStore auditStore(MongoDBSpringDataTargetSystem mongoDBSpringDataTargetSystem) { + return MongoDBSyncAuditStore.from(mongoDBSpringDataTargetSystem); } @PreDestroy diff --git a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/TargetSystems.java b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/TargetSystems.java index 7a3e050..06814ad 100644 --- a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/TargetSystems.java +++ b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/TargetSystems.java @@ -1,63 +1,9 @@ package io.flamingock.examples.inventory; -import com.mongodb.client.MongoClient; -import io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient; -import io.confluent.kafka.schemaregistry.client.SchemaRegistryClient; -import io.flamingock.examples.inventory.util.KafkaSchemaManager; -import io.flamingock.examples.inventory.util.LaunchDarklyClient; -import io.flamingock.examples.inventory.util.MongoDBUtil; -import io.flamingock.targetsystem.nontransactional.NonTransactionalTargetSystem; -import io.flamingock.targetsystem.mongodb.sync.MongoDBSyncTargetSystem; -import org.apache.kafka.clients.admin.AdminClient; -import org.apache.kafka.clients.admin.AdminClientConfig; - -import java.util.Collections; -import java.util.Properties; - public final class TargetSystems { public static final String MONGODB_TARGET_SYSTEM = "mongodb-inventory"; public static final String KAFKA_TARGET_SYSTEM = "kafka-inventory"; public static final String FEATURE_FLAG_TARGET_SYSTEM = "toggle-inventory"; - - public static final String DATABASE_NAME = "inventory"; - public static final String CONFIG_FILE_PATH = "config/application.yml"; - private TargetSystems() {} - - public static NonTransactionalTargetSystem toggleTargetSystem() { - // Create LaunchDarkly Management API client for demonstration - // In demo mode, this uses a dummy token and will log intended operations - LaunchDarklyClient launchDarklyClient = new LaunchDarklyClient( - "demo-token", // In real usage, this would be your LaunchDarkly API token - "inventory-service", - "production" - ); - - return new NonTransactionalTargetSystem(FEATURE_FLAG_TARGET_SYSTEM).addDependency(launchDarklyClient); - } - - public static MongoDBSyncTargetSystem mongoDBSyncTargetSystem() { - MongoClient mongoClient = MongoDBUtil.getMongoClient("mongodb://localhost:27017/"); - return new MongoDBSyncTargetSystem(MONGODB_TARGET_SYSTEM, mongoClient, DATABASE_NAME); - } - - public static NonTransactionalTargetSystem kafkaTargetSystem() throws Exception { - SchemaRegistryClient schemaRegistryClient = new CachedSchemaRegistryClient( - Collections.singletonList("http://localhost:8081"), - 100 - ); - - // Kafka Admin client for topic management - Properties kafkaProps = new Properties(); - kafkaProps.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); - AdminClient kafkaAdminClient = AdminClient.create(kafkaProps); - - // Kafka schema manager - KafkaSchemaManager schemaManager = new KafkaSchemaManager(schemaRegistryClient, kafkaAdminClient); - //We simulate the topic is already created - schemaManager.createTopicIfNotExists("order-created", 3, (short) 1); - return new NonTransactionalTargetSystem(KAFKA_TARGET_SYSTEM).addDependency(schemaManager); - } - } diff --git a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0001__mongodb_addDiscountCodeFieldToOrders.java b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0001__mongodb_addDiscountCodeFieldToOrders.java index 7f9e622..a89693e 100644 --- a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0001__mongodb_addDiscountCodeFieldToOrders.java +++ b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0001__mongodb_addDiscountCodeFieldToOrders.java @@ -16,12 +16,12 @@ package io.flamingock.examples.inventory.changes; -import com.mongodb.client.MongoDatabase; import io.flamingock.api.annotations.Apply; import io.flamingock.api.annotations.Change; import io.flamingock.api.annotations.Rollback; import io.flamingock.api.annotations.TargetSystem; import org.bson.Document; +import org.springframework.data.mongodb.core.MongoTemplate; import java.time.LocalDateTime; import java.util.Arrays; @@ -36,27 +36,23 @@ public class _0001__mongodb_addDiscountCodeFieldToOrders { private static final String ORDERS_COLLECTION_NAME = "orders"; @Apply - public void apply(MongoDatabase mongoDatabase) { + public void apply(MongoTemplate mongoTemplate) { Document order1 = buildOrder1(); Document order2 = buildOrder2(); - mongoDatabase + mongoTemplate .getCollection(ORDERS_COLLECTION_NAME) .insertMany(Arrays.asList(order1, order2)); } @Rollback - public void rollback(MongoDatabase mongoDatabase) { - if(doesExistOrdersCollection(mongoDatabase)) { - mongoDatabase.getCollection(ORDERS_COLLECTION_NAME).drop(); + public void rollback(MongoTemplate mongoTemplate) { + if(mongoTemplate.collectionExists(ORDERS_COLLECTION_NAME)) { + mongoTemplate.dropCollection(ORDERS_COLLECTION_NAME); } } - private boolean doesExistOrdersCollection(MongoDatabase mongoDatabase) { - return mongoDatabase.listCollectionNames().into(new java.util.ArrayList<>()).contains("orders"); - } - private static Document buildOrder2() { return new Document() .append("orderId", "ORD-002") diff --git a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0004__mongodb_backfillDiscountsForExistingOrders.java b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0004__mongodb_backfillDiscountsForExistingOrders.java index 8a73d1f..621af40 100644 --- a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0004__mongodb_backfillDiscountsForExistingOrders.java +++ b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0004__mongodb_backfillDiscountsForExistingOrders.java @@ -17,7 +17,6 @@ package io.flamingock.examples.inventory.changes; import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Updates; import io.flamingock.api.annotations.Apply; @@ -27,6 +26,7 @@ import org.bson.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.mongodb.core.MongoTemplate; import static io.flamingock.examples.inventory.TargetSystems.MONGODB_TARGET_SYSTEM; @@ -37,10 +37,10 @@ public class _0004__mongodb_backfillDiscountsForExistingOrders { private static final Logger logger = LoggerFactory.getLogger(_0004__mongodb_backfillDiscountsForExistingOrders.class); @Apply - public void apply(MongoDatabase mongoDatabase) { + public void apply(MongoTemplate mongoTemplate) { logger.info("Backfilling discountCode field for existing orders"); - MongoCollection orders = mongoDatabase.getCollection("orders"); + MongoCollection orders = mongoTemplate.getCollection("orders"); // Update all orders that don't have a discountCode field var filter = Filters.exists("discountCode", false); @@ -60,10 +60,10 @@ public void apply(MongoDatabase mongoDatabase) { } @Rollback - public void rollback(MongoDatabase mongoDatabase) { + public void rollback(MongoTemplate mongoTemplate) { logger.info("Rolling back: Removing discountCode and discountApplied fields"); - MongoCollection orders = mongoDatabase.getCollection("orders"); + MongoCollection orders = mongoTemplate.getCollection("orders"); // Remove the discountCode field from all documents orders.updateMany( diff --git a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0005__mongodb_addIndexOnDiscountCode.java b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0005__mongodb_addIndexOnDiscountCode.java index c167485..34eaa83 100644 --- a/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0005__mongodb_addIndexOnDiscountCode.java +++ b/inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0005__mongodb_addIndexOnDiscountCode.java @@ -17,7 +17,6 @@ package io.flamingock.examples.inventory.changes; import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.IndexOptions; import com.mongodb.client.model.Indexes; import io.flamingock.api.annotations.Apply; @@ -27,11 +26,12 @@ import org.bson.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.mongodb.core.MongoTemplate; import static io.flamingock.examples.inventory.TargetSystems.MONGODB_TARGET_SYSTEM; @TargetSystem(id = MONGODB_TARGET_SYSTEM) -@Change(id = "add-index-on-discount-code", author = "flamingock-team", transactional = true) +@Change(id = "add-index-on-discount-code", author = "flamingock-team", transactional = false) public class _0005__mongodb_addIndexOnDiscountCode { @@ -41,10 +41,10 @@ public class _0005__mongodb_addIndexOnDiscountCode { private static final String ORDERS_COLLECTION = "orders"; @Apply - public void apply(MongoDatabase mongoDatabase) { + public void apply(MongoTemplate mongoTemplate) { logger.info("Creating index on discountCode field for efficient reporting queries"); - MongoCollection orders = mongoDatabase.getCollection(ORDERS_COLLECTION); + MongoCollection orders = mongoTemplate.getCollection(ORDERS_COLLECTION); // Check if index already exists (idempotent operation) boolean indexExists = orders.listIndexes() @@ -66,10 +66,10 @@ public void apply(MongoDatabase mongoDatabase) { } @Rollback - public void rollback(MongoDatabase mongoDatabase) { + public void rollback(MongoTemplate mongoTemplate) { logger.info("Rolling back: Dropping index on discountCode field"); - MongoCollection orders = mongoDatabase.getCollection(ORDERS_COLLECTION); + MongoCollection orders = mongoTemplate.getCollection(ORDERS_COLLECTION); try { // Check if index exists before attempting to drop it diff --git a/inventory-orders-service/src/main/resources/application.yml b/inventory-orders-service/src/main/resources/application.yml index 6e32f5f..185d358 100644 --- a/inventory-orders-service/src/main/resources/application.yml +++ b/inventory-orders-service/src/main/resources/application.yml @@ -1,6 +1,9 @@ spring: application: name: inventory-orders-service + data: + mongodb: + database: inventory server: port: 8080 diff --git a/inventory-orders-service/src/test/java/io/flamingock/examples/inventory/InventoryOrdersAppTest.java b/inventory-orders-service/src/test/java/io/flamingock/examples/inventory/InventoryOrdersAppTest.java index d7f88ec..5cc1e42 100644 --- a/inventory-orders-service/src/test/java/io/flamingock/examples/inventory/InventoryOrdersAppTest.java +++ b/inventory-orders-service/src/test/java/io/flamingock/examples/inventory/InventoryOrdersAppTest.java @@ -66,7 +66,7 @@ class InventoryOrdersAppTest { @DynamicPropertySource static void configureProperties(DynamicPropertyRegistry registry) { - registry.add("mongodb.uri", mongoDBContainer::getConnectionString); + registry.add("spring.mongodb.uri", mongoDBContainer::getReplicaSetUrl); registry.add("kafka.bootstrap-servers", kafkaContainer::getBootstrapServers); registry.add("kafka.schema-registry-url", () -> String.format("http://%s:%d", schemaRegistryContainer.getHost(),