Skip to content

Commit 7b8a418

Browse files
authored
refactor: mongodb target system from sync to springdata (#13)
1 parent af42431 commit 7b8a418

8 files changed

Lines changed: 35 additions & 91 deletions

File tree

inventory-orders-service/build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ dependencies {
6262
// Spring Boot
6363
implementation("org.springframework.boot:spring-boot-starter-web")
6464

65+
// Springdata for MongoDB dependency
66+
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
67+
6568
// Others dependencies needed for this example
6669
// implementation("org.slf4j:slf4j-simple:2.0.6") // Commented out - Spring Boot provides logging
6770

@@ -91,6 +94,10 @@ tasks.named<Jar>("jar") {
9194
})
9295
}
9396

97+
tasks.jar {
98+
isZip64 = true
99+
}
100+
94101
tasks.withType<JavaCompile> {
95102
options.compilerArgs.add("-parameters")
96103
}

inventory-orders-service/src/main/java/io/flamingock/examples/inventory/FlamingockConfig.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,29 @@
11
package io.flamingock.examples.inventory;
22

3-
import com.mongodb.client.MongoClient;
43
import io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient;
54
import io.confluent.kafka.schemaregistry.client.SchemaRegistryClient;
65
import io.flamingock.internal.core.external.store.CommunityAuditStore;
76
import io.flamingock.store.mongodb.sync.MongoDBSyncAuditStore;
87
import io.flamingock.examples.inventory.util.KafkaSchemaManager;
98
import io.flamingock.examples.inventory.util.LaunchDarklyClient;
10-
import io.flamingock.examples.inventory.util.MongoDBUtil;
9+
import io.flamingock.targetsystem.mongodb.springdata.MongoDBSpringDataTargetSystem;
1110
import io.flamingock.targetsystem.nontransactional.NonTransactionalTargetSystem;
12-
import io.flamingock.targetsystem.mongodb.sync.MongoDBSyncTargetSystem;
1311
import org.apache.kafka.clients.admin.AdminClient;
1412
import org.apache.kafka.clients.admin.AdminClientConfig;
1513
import org.springframework.beans.factory.annotation.Value;
1614
import org.springframework.context.annotation.Bean;
1715
import org.springframework.context.annotation.Configuration;
1816

1917
import jakarta.annotation.PreDestroy;
18+
import org.springframework.data.mongodb.core.MongoTemplate;
19+
2020
import java.time.Duration;
2121
import java.util.Collections;
2222
import java.util.Properties;
2323

2424
@Configuration
2525
public class FlamingockConfig {
2626

27-
@Value("${mongodb.uri:mongodb://localhost:27017/}")
28-
private String mongodbUri;
29-
3027
@Value("${kafka.bootstrap-servers:localhost:9092}")
3128
private String kafkaBootstrapServers;
3229

@@ -38,14 +35,9 @@ public class FlamingockConfig {
3835

3936
private AdminClient kafkaAdminClient;
4037

41-
@Bean(destroyMethod = "close")
42-
public MongoClient mongoClient() {
43-
return MongoDBUtil.getMongoClient(mongodbUri);
44-
}
45-
4638
@Bean
47-
public MongoDBSyncTargetSystem mongoDBSyncTargetSystem(MongoClient mongoClient) {
48-
return new MongoDBSyncTargetSystem(TargetSystems.MONGODB_TARGET_SYSTEM, mongoClient, TargetSystems.DATABASE_NAME);
39+
public MongoDBSpringDataTargetSystem mongoDBSpringDataTargetSystem(MongoTemplate mongoTemplate) {
40+
return new MongoDBSpringDataTargetSystem(TargetSystems.MONGODB_TARGET_SYSTEM, mongoTemplate);
4941
}
5042

5143
@Bean
@@ -78,8 +70,8 @@ public NonTransactionalTargetSystem toggleTargetSystem() {
7870

7971
//This could return any of the available community audit stores
8072
@Bean
81-
public CommunityAuditStore auditStore(MongoDBSyncTargetSystem mongoDBSyncTargetSystem) {
82-
return MongoDBSyncAuditStore.from(mongoDBSyncTargetSystem);
73+
public CommunityAuditStore auditStore(MongoDBSpringDataTargetSystem mongoDBSpringDataTargetSystem) {
74+
return MongoDBSyncAuditStore.from(mongoDBSpringDataTargetSystem);
8375
}
8476

8577
@PreDestroy
Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,9 @@
11
package io.flamingock.examples.inventory;
22

3-
import com.mongodb.client.MongoClient;
4-
import io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient;
5-
import io.confluent.kafka.schemaregistry.client.SchemaRegistryClient;
6-
import io.flamingock.examples.inventory.util.KafkaSchemaManager;
7-
import io.flamingock.examples.inventory.util.LaunchDarklyClient;
8-
import io.flamingock.examples.inventory.util.MongoDBUtil;
9-
import io.flamingock.targetsystem.nontransactional.NonTransactionalTargetSystem;
10-
import io.flamingock.targetsystem.mongodb.sync.MongoDBSyncTargetSystem;
11-
import org.apache.kafka.clients.admin.AdminClient;
12-
import org.apache.kafka.clients.admin.AdminClientConfig;
13-
14-
import java.util.Collections;
15-
import java.util.Properties;
16-
173
public final class TargetSystems {
184
public static final String MONGODB_TARGET_SYSTEM = "mongodb-inventory";
195
public static final String KAFKA_TARGET_SYSTEM = "kafka-inventory";
206
public static final String FEATURE_FLAG_TARGET_SYSTEM = "toggle-inventory";
217

22-
23-
public static final String DATABASE_NAME = "inventory";
24-
public static final String CONFIG_FILE_PATH = "config/application.yml";
25-
268
private TargetSystems() {}
27-
28-
public static NonTransactionalTargetSystem toggleTargetSystem() {
29-
// Create LaunchDarkly Management API client for demonstration
30-
// In demo mode, this uses a dummy token and will log intended operations
31-
LaunchDarklyClient launchDarklyClient = new LaunchDarklyClient(
32-
"demo-token", // In real usage, this would be your LaunchDarkly API token
33-
"inventory-service",
34-
"production"
35-
);
36-
37-
return new NonTransactionalTargetSystem(FEATURE_FLAG_TARGET_SYSTEM).addDependency(launchDarklyClient);
38-
}
39-
40-
public static MongoDBSyncTargetSystem mongoDBSyncTargetSystem() {
41-
MongoClient mongoClient = MongoDBUtil.getMongoClient("mongodb://localhost:27017/");
42-
return new MongoDBSyncTargetSystem(MONGODB_TARGET_SYSTEM, mongoClient, DATABASE_NAME);
43-
}
44-
45-
public static NonTransactionalTargetSystem kafkaTargetSystem() throws Exception {
46-
SchemaRegistryClient schemaRegistryClient = new CachedSchemaRegistryClient(
47-
Collections.singletonList("http://localhost:8081"),
48-
100
49-
);
50-
51-
// Kafka Admin client for topic management
52-
Properties kafkaProps = new Properties();
53-
kafkaProps.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
54-
AdminClient kafkaAdminClient = AdminClient.create(kafkaProps);
55-
56-
// Kafka schema manager
57-
KafkaSchemaManager schemaManager = new KafkaSchemaManager(schemaRegistryClient, kafkaAdminClient);
58-
//We simulate the topic is already created
59-
schemaManager.createTopicIfNotExists("order-created", 3, (short) 1);
60-
return new NonTransactionalTargetSystem(KAFKA_TARGET_SYSTEM).addDependency(schemaManager);
61-
}
62-
639
}

inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0001__mongodb_addDiscountCodeFieldToOrders.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616

1717
package io.flamingock.examples.inventory.changes;
1818

19-
import com.mongodb.client.MongoDatabase;
2019
import io.flamingock.api.annotations.Apply;
2120
import io.flamingock.api.annotations.Change;
2221
import io.flamingock.api.annotations.Rollback;
2322
import io.flamingock.api.annotations.TargetSystem;
2423
import org.bson.Document;
24+
import org.springframework.data.mongodb.core.MongoTemplate;
2525

2626
import java.time.LocalDateTime;
2727
import java.util.Arrays;
@@ -36,27 +36,23 @@ public class _0001__mongodb_addDiscountCodeFieldToOrders {
3636
private static final String ORDERS_COLLECTION_NAME = "orders";
3737

3838
@Apply
39-
public void apply(MongoDatabase mongoDatabase) {
39+
public void apply(MongoTemplate mongoTemplate) {
4040
Document order1 = buildOrder1();
4141
Document order2 = buildOrder2();
42-
mongoDatabase
42+
mongoTemplate
4343
.getCollection(ORDERS_COLLECTION_NAME)
4444
.insertMany(Arrays.asList(order1, order2));
4545

4646
}
4747

4848
@Rollback
49-
public void rollback(MongoDatabase mongoDatabase) {
50-
if(doesExistOrdersCollection(mongoDatabase)) {
51-
mongoDatabase.getCollection(ORDERS_COLLECTION_NAME).drop();
49+
public void rollback(MongoTemplate mongoTemplate) {
50+
if(mongoTemplate.collectionExists(ORDERS_COLLECTION_NAME)) {
51+
mongoTemplate.dropCollection(ORDERS_COLLECTION_NAME);
5252
}
5353
}
5454

5555

56-
private boolean doesExistOrdersCollection(MongoDatabase mongoDatabase) {
57-
return mongoDatabase.listCollectionNames().into(new java.util.ArrayList<>()).contains("orders");
58-
}
59-
6056
private static Document buildOrder2() {
6157
return new Document()
6258
.append("orderId", "ORD-002")

inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0004__mongodb_backfillDiscountsForExistingOrders.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package io.flamingock.examples.inventory.changes;
1818

1919
import com.mongodb.client.MongoCollection;
20-
import com.mongodb.client.MongoDatabase;
2120
import com.mongodb.client.model.Filters;
2221
import com.mongodb.client.model.Updates;
2322
import io.flamingock.api.annotations.Apply;
@@ -27,6 +26,7 @@
2726
import org.bson.Document;
2827
import org.slf4j.Logger;
2928
import org.slf4j.LoggerFactory;
29+
import org.springframework.data.mongodb.core.MongoTemplate;
3030

3131
import static io.flamingock.examples.inventory.TargetSystems.MONGODB_TARGET_SYSTEM;
3232

@@ -37,10 +37,10 @@ public class _0004__mongodb_backfillDiscountsForExistingOrders {
3737
private static final Logger logger = LoggerFactory.getLogger(_0004__mongodb_backfillDiscountsForExistingOrders.class);
3838

3939
@Apply
40-
public void apply(MongoDatabase mongoDatabase) {
40+
public void apply(MongoTemplate mongoTemplate) {
4141
logger.info("Backfilling discountCode field for existing orders");
4242

43-
MongoCollection<Document> orders = mongoDatabase.getCollection("orders");
43+
MongoCollection<Document> orders = mongoTemplate.getCollection("orders");
4444

4545
// Update all orders that don't have a discountCode field
4646
var filter = Filters.exists("discountCode", false);
@@ -60,10 +60,10 @@ public void apply(MongoDatabase mongoDatabase) {
6060
}
6161

6262
@Rollback
63-
public void rollback(MongoDatabase mongoDatabase) {
63+
public void rollback(MongoTemplate mongoTemplate) {
6464
logger.info("Rolling back: Removing discountCode and discountApplied fields");
6565

66-
MongoCollection<Document> orders = mongoDatabase.getCollection("orders");
66+
MongoCollection<Document> orders = mongoTemplate.getCollection("orders");
6767

6868
// Remove the discountCode field from all documents
6969
orders.updateMany(

inventory-orders-service/src/main/java/io/flamingock/examples/inventory/changes/_0005__mongodb_addIndexOnDiscountCode.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package io.flamingock.examples.inventory.changes;
1818

1919
import com.mongodb.client.MongoCollection;
20-
import com.mongodb.client.MongoDatabase;
2120
import com.mongodb.client.model.IndexOptions;
2221
import com.mongodb.client.model.Indexes;
2322
import io.flamingock.api.annotations.Apply;
@@ -27,11 +26,12 @@
2726
import org.bson.Document;
2827
import org.slf4j.Logger;
2928
import org.slf4j.LoggerFactory;
29+
import org.springframework.data.mongodb.core.MongoTemplate;
3030

3131
import static io.flamingock.examples.inventory.TargetSystems.MONGODB_TARGET_SYSTEM;
3232

3333
@TargetSystem(id = MONGODB_TARGET_SYSTEM)
34-
@Change(id = "add-index-on-discount-code", author = "flamingock-team", transactional = true)
34+
@Change(id = "add-index-on-discount-code", author = "flamingock-team", transactional = false)
3535

3636
public class _0005__mongodb_addIndexOnDiscountCode {
3737

@@ -41,10 +41,10 @@ public class _0005__mongodb_addIndexOnDiscountCode {
4141
private static final String ORDERS_COLLECTION = "orders";
4242

4343
@Apply
44-
public void apply(MongoDatabase mongoDatabase) {
44+
public void apply(MongoTemplate mongoTemplate) {
4545
logger.info("Creating index on discountCode field for efficient reporting queries");
4646

47-
MongoCollection<Document> orders = mongoDatabase.getCollection(ORDERS_COLLECTION);
47+
MongoCollection<Document> orders = mongoTemplate.getCollection(ORDERS_COLLECTION);
4848

4949
// Check if index already exists (idempotent operation)
5050
boolean indexExists = orders.listIndexes()
@@ -66,10 +66,10 @@ public void apply(MongoDatabase mongoDatabase) {
6666
}
6767

6868
@Rollback
69-
public void rollback(MongoDatabase mongoDatabase) {
69+
public void rollback(MongoTemplate mongoTemplate) {
7070
logger.info("Rolling back: Dropping index on discountCode field");
7171

72-
MongoCollection<Document> orders = mongoDatabase.getCollection(ORDERS_COLLECTION);
72+
MongoCollection<Document> orders = mongoTemplate.getCollection(ORDERS_COLLECTION);
7373

7474
try {
7575
// Check if index exists before attempting to drop it
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
spring:
22
application:
33
name: inventory-orders-service
4+
data:
5+
mongodb:
6+
database: inventory
47

58
server:
69
port: 8080

inventory-orders-service/src/test/java/io/flamingock/examples/inventory/InventoryOrdersAppTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class InventoryOrdersAppTest {
6666

6767
@DynamicPropertySource
6868
static void configureProperties(DynamicPropertyRegistry registry) {
69-
registry.add("mongodb.uri", mongoDBContainer::getConnectionString);
69+
registry.add("spring.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
7070
registry.add("kafka.bootstrap-servers", kafkaContainer::getBootstrapServers);
7171
registry.add("kafka.schema-registry-url", () -> String.format("http://%s:%d",
7272
schemaRegistryContainer.getHost(),

0 commit comments

Comments
 (0)