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