diff --git a/pom.xml b/pom.xml
index 08a19d8..a2504f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,11 @@
32.1.2-jre
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson-bom.version}
+
com.knecon.fforesight
tenant-commons
diff --git a/src/main/java/com/knecon/fforesight/databasetenantcommons/TenantMessagingConfiguration.java b/src/main/java/com/knecon/fforesight/databasetenantcommons/TenantMessagingConfiguration.java
index 6f52572..bb76d34 100644
--- a/src/main/java/com/knecon/fforesight/databasetenantcommons/TenantMessagingConfiguration.java
+++ b/src/main/java/com/knecon/fforesight/databasetenantcommons/TenantMessagingConfiguration.java
@@ -1,6 +1,5 @@
package com.knecon.fforesight.databasetenantcommons;
-
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
@@ -23,13 +22,28 @@ public class TenantMessagingConfiguration {
@Value("${fforesight.multitenancy.tenant-created-dlq:tenant-created-dlq}")
private String tenantCreatedDLQ;
+ @Value("${fforesight.multitenancy.tenant-sync-queue:tenant-sync}")
+ private String tenantSyncEventQueue;
+
+ @Value("${fforesight.multitenancy.tenant-sync-dlq:tenant-sync-dlq}")
+ private String tenantSyncDQL;
+
+
+ @Bean(name = "tenantExchange")
+ TopicExchange tenantExchange(@Value("${fforesight.tenant-exchange.name}") String tenantExchangeName) {
+
+ return new TopicExchange(tenantExchangeName);
+ }
+
@Bean("persistenceServiceTenantCreatedQueue")
public Queue persistenceServiceTenantCreatedQueue() {
+
return QueueBuilder.durable(tenantCreatedEventQueue)
.withArgument("x-dead-letter-exchange", "").withArgument("x-dead-letter-routing-key", tenantCreatedDLQ).build();
}
+
@Bean
public Queue persistenceServiceTenantDLQ() {
@@ -40,13 +54,31 @@ public class TenantMessagingConfiguration {
@Bean
public Binding tenantExchangeBinding(@Qualifier("persistenceServiceTenantCreatedQueue") Queue persistenceServiceTenantCreatedQueue,
@Qualifier("tenantExchange") TopicExchange tenantExchange) {
+
return BindingBuilder.bind(persistenceServiceTenantCreatedQueue).to(tenantExchange).with("tenant.created");
}
- @Bean(name = "tenantExchange")
- TopicExchange tenantExchange(@Value("${fforesight.tenant-exchange.name}") String tenantExchangeName) {
- return new TopicExchange(tenantExchangeName);
+ @Bean("persistenceServiceTenantSyncQueue")
+ public Queue persistenceServiceTenantSyncQueue() {
+
+ return QueueBuilder.durable(tenantSyncEventQueue)
+ .withArgument("x-dead-letter-exchange", "").withArgument("x-dead-letter-routing-key", tenantSyncDQL).build();
+ }
+
+
+ @Bean
+ public Queue persistenceServiceTenantSyncDLQ() {
+
+ return QueueBuilder.durable(tenantSyncDQL).build();
+ }
+
+
+ @Bean
+ public Binding tenantExchangeSyncBinding(@Qualifier("persistenceServiceTenantSyncQueue") Queue persistenceServiceTenantSyncQueue,
+ @Qualifier("tenantExchange") TopicExchange tenantExchange) {
+
+ return BindingBuilder.bind(persistenceServiceTenantSyncQueue).to(tenantExchange).with("tenant.sync");
}
}
diff --git a/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/TenantSyncListener.java b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/TenantSyncListener.java
new file mode 100644
index 0000000..43807dd
--- /dev/null
+++ b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/TenantSyncListener.java
@@ -0,0 +1,45 @@
+package com.knecon.fforesight.databasetenantcommons.providers;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import com.knecon.fforesight.databasetenantcommons.providers.TenantLiquibaseInitializer;
+import com.knecon.fforesight.databasetenantcommons.providers.events.TenantCreatedEvent;
+import com.knecon.fforesight.databasetenantcommons.providers.events.TenantSyncEvent;
+
+import jakarta.annotation.PostConstruct;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class TenantSyncListener {
+
+ private final Optional tenantSyncServices;
+
+ @Value("${fforesight.multitenancy.tenant-sync-queue:tenant-sync}")
+ private String tenantSyncQueue;
+
+
+ @PostConstruct
+ public void postConstruct() {
+
+ log.info("Listener for tenant-sync started for queue: {}", tenantSyncQueue);
+ }
+
+
+ @SneakyThrows
+ @RabbitListener(queues = "${fforesight.multitenancy.tenant-sync-queue:tenant-sync}")
+ public void createTenant(TenantSyncEvent tenantSyncEvent) {
+
+ tenantSyncServices.ifPresent(t -> t.syncTenant(tenantSyncEvent));
+ }
+
+}
diff --git a/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/TenantSyncService.java b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/TenantSyncService.java
new file mode 100644
index 0000000..b119d1d
--- /dev/null
+++ b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/TenantSyncService.java
@@ -0,0 +1,9 @@
+package com.knecon.fforesight.databasetenantcommons.providers;
+
+import com.knecon.fforesight.databasetenantcommons.providers.events.TenantSyncEvent;
+
+public interface TenantSyncService {
+
+ void syncTenant(TenantSyncEvent tenantSyncEvent);
+
+}
diff --git a/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/events/TenantSyncEvent.java b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/events/TenantSyncEvent.java
new file mode 100644
index 0000000..3d0faa4
--- /dev/null
+++ b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/events/TenantSyncEvent.java
@@ -0,0 +1,17 @@
+package com.knecon.fforesight.databasetenantcommons.providers.events;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TenantSyncEvent {
+
+ private String tenantId;
+ private JsonNode payload;
+
+}