From a530205d2b3ac6ea1d290a8bd3c5c607ea476505 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 29 Sep 2026 18:47:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/baiyue/common/event/EventTypes.java | 3 --- .../common/event/IamSecurityEventsV1.java | 25 ------------------- .../baiyue/common/event/DeliveryAckTest.java | 2 +- ...tDeliveryObservationAutoConfiguration.java | 2 ++ ...iveryObservationAutoConfigurationTest.java | 18 +++++++++++++ .../LastlegOrderControllerTest.java | 2 +- 6 files changed, 22 insertions(+), 30 deletions(-) delete mode 100644 common-event-contract/src/main/java/com/baiyue/common/event/IamSecurityEventsV1.java diff --git a/common-event-contract/src/main/java/com/baiyue/common/event/EventTypes.java b/common-event-contract/src/main/java/com/baiyue/common/event/EventTypes.java index 17172f544..81829864f 100644 --- a/common-event-contract/src/main/java/com/baiyue/common/event/EventTypes.java +++ b/common-event-contract/src/main/java/com/baiyue/common/event/EventTypes.java @@ -18,9 +18,6 @@ public final class EventTypes { public static final String BUSINESS_FEE_SOURCE_CHANGED = "BusinessFeeSourceChanged"; public static final String WALLET_COMMAND_REQUESTED = "WalletCommandRequested"; public static final String WALLET_COMMAND_COMPLETED = "WalletCommandCompleted"; - public static final String IAM_USER_STATUS_CHANGED = "IamUserStatusChanged"; - public static final String IAM_TENANT_STATUS_CHANGED = "IamTenantStatusChanged"; - public static final String IAM_PERMISSION_VERSION_CHANGED = "IamPermissionVersionChanged"; public static final String LAST_MILE_HANDOFF_ACCEPTED = "LastMileHandoffAccepted"; public static final String LAST_MILE_HANDOFF_REJECTED = "LastMileHandoffRejected"; public static final String LAST_MILE_MILESTONE_CHANGED = "LastMileMilestoneChanged"; diff --git a/common-event-contract/src/main/java/com/baiyue/common/event/IamSecurityEventsV1.java b/common-event-contract/src/main/java/com/baiyue/common/event/IamSecurityEventsV1.java deleted file mode 100644 index 8d1251801..000000000 --- a/common-event-contract/src/main/java/com/baiyue/common/event/IamSecurityEventsV1.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baiyue.common.event; - -import java.time.Instant; -import java.util.Set; - -/** IAM 向海外服务发布的 V1 安全投影事件负载。 */ -public final class IamSecurityEventsV1 { - public static final int VERSION = 1; - - private IamSecurityEventsV1() { } - - public record UserStatusChanged(long authUserId, long tenantId, String appCode, - String status, long permissionVersion, Instant changedAt) { } - - public record TenantStatusChanged(long tenantId, String status, Instant changedAt) { } - - public record PermissionVersionChanged(long authUserId, long tenantId, String appCode, - long permissionVersion, String reason, Instant changedAt, - Set roles, Set authorities) { - public PermissionVersionChanged { - roles = roles == null ? Set.of() : Set.copyOf(roles); - authorities = authorities == null ? Set.of() : Set.copyOf(authorities); - } - } -} diff --git a/common-event-contract/src/test/java/com/baiyue/common/event/DeliveryAckTest.java b/common-event-contract/src/test/java/com/baiyue/common/event/DeliveryAckTest.java index 69ac6b3b2..b681a6a47 100644 --- a/common-event-contract/src/test/java/com/baiyue/common/event/DeliveryAckTest.java +++ b/common-event-contract/src/test/java/com/baiyue/common/event/DeliveryAckTest.java @@ -44,6 +44,6 @@ class DeliveryAckTest { assertThat(EventDeliveryRoute.forEventType(EventTypes.OVERSEAS_CONTAINER_UNLOADED).serviceName()).isEqualTo("firstleg-service"); assertThat(EventDeliveryRoute.forEventType(EventTypes.WALLET_COMMAND_COMPLETED).serviceName()).isEqualTo("lastleg-service"); assertThatThrownBy(() -> EventDeliveryRoute.forEventType("UnknownEvent")).isInstanceOf(IllegalArgumentException.class); - assertThatThrownBy(() -> EventDeliveryRoute.forEventType(EventTypes.IAM_USER_STATUS_CHANGED)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> EventDeliveryRoute.forEventType("IamUserStatusChanged")).isInstanceOf(IllegalArgumentException.class); } } diff --git a/common-web/src/main/java/com/baiyue/common/web/EventDeliveryObservationAutoConfiguration.java b/common-web/src/main/java/com/baiyue/common/web/EventDeliveryObservationAutoConfiguration.java index efa4c05f8..473a4a3a4 100644 --- a/common-web/src/main/java/com/baiyue/common/web/EventDeliveryObservationAutoConfiguration.java +++ b/common-web/src/main/java/com/baiyue/common/web/EventDeliveryObservationAutoConfiguration.java @@ -5,6 +5,7 @@ import com.baiyue.common.core.outbox.EventDeliveryProducer; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.context.annotation.Bean; @@ -13,6 +14,7 @@ import org.springframework.transaction.PlatformTransactionManager; @AutoConfiguration(after = {JdbcTemplateAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) @ConditionalOnBean(EventDeliveryProducer.class) +@ConditionalOnProperty(prefix = "baiyue.event-delivery", name = "observation-enabled", havingValue = "true") public class EventDeliveryObservationAutoConfiguration { @Bean EventDeliveryJournal eventDeliveryJournal(JdbcTemplate jdbc, PlatformTransactionManager manager) { diff --git a/common-web/src/test/java/com/baiyue/common/web/EventDeliveryObservationAutoConfigurationTest.java b/common-web/src/test/java/com/baiyue/common/web/EventDeliveryObservationAutoConfigurationTest.java index 19a1a9674..b772fb46e 100644 --- a/common-web/src/test/java/com/baiyue/common/web/EventDeliveryObservationAutoConfigurationTest.java +++ b/common-web/src/test/java/com/baiyue/common/web/EventDeliveryObservationAutoConfigurationTest.java @@ -11,12 +11,14 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.beans.factory.annotation.Autowired; import static org.assertj.core.api.Assertions.*; class EventDeliveryObservationAutoConfigurationTest { @Test void configuresMandatoryAuditAndMetricsForServiceLocalJdbc() { var jdbc = new JdbcTemplate(new DriverManagerDataSource("jdbc:h2:mem:auto", "sa", "")); new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(EventDeliveryObservationAutoConfiguration.class)) + .withPropertyValues("baiyue.event-delivery.observation-enabled=true") .withBean(EventDeliveryProducer.class, () -> new EventDeliveryProducer() { }) .withBean(JdbcTemplate.class, () -> jdbc) .withBean(PlatformTransactionManager.class, () -> new DataSourceTransactionManager(jdbc.getDataSource())) @@ -28,6 +30,7 @@ class EventDeliveryObservationAutoConfigurationTest { } @Test void otherJdbcServicesDoNotAcquireTransactionOrMetricsRequirements() { new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(EventDeliveryObservationAutoConfiguration.class)) + .withPropertyValues("baiyue.event-delivery.observation-enabled=true") .withBean(JdbcTemplate.class, () -> new JdbcTemplate(new DriverManagerDataSource("jdbc:h2:mem:other", "sa", ""))) .run(context -> { assertThat(context).hasNotFailed(); @@ -38,13 +41,28 @@ class EventDeliveryObservationAutoConfigurationTest { @Test void producerWithoutMeterRegistryFailsInsteadOfSilentlyDisablingObservation() { var jdbc = new JdbcTemplate(new DriverManagerDataSource("jdbc:h2:mem:noRegistry", "sa", "")); new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(EventDeliveryObservationAutoConfiguration.class)) + .withPropertyValues("baiyue.event-delivery.observation-enabled=true") .withBean(EventDeliveryProducer.class, () -> new EventDeliveryProducer() { }) .withBean(JdbcTemplate.class, () -> jdbc) .withBean(PlatformTransactionManager.class, () -> new DataSourceTransactionManager(jdbc.getDataSource())) .run(context -> assertThat(context).hasFailed()); } + static class RequiredProducer implements EventDeliveryProducer { + @Autowired EventDeliveryJournal journal; + @Autowired EventDeliveryMetrics metrics; + } + @Test void producerMissingTheExplicitObservationSwitchCannotStart() { + var jdbc = new JdbcTemplate(new DriverManagerDataSource("jdbc:h2:mem:noSwitch", "sa", "")); + new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(EventDeliveryObservationAutoConfiguration.class)) + .withBean(RequiredProducer.class, RequiredProducer::new) + .withBean(JdbcTemplate.class, () -> jdbc) + .withBean(PlatformTransactionManager.class, () -> new DataSourceTransactionManager(jdbc.getDataSource())) + .withBean(MeterRegistry.class, SimpleMeterRegistry::new) + .run(context -> assertThat(context).hasFailed()); + } @Test void missingTransactionManagerFailsRatherThanInstallingNonTransactionalFallback() { new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(EventDeliveryObservationAutoConfiguration.class)) + .withPropertyValues("baiyue.event-delivery.observation-enabled=true") .withBean(EventDeliveryProducer.class, () -> new EventDeliveryProducer() { }) .withBean(JdbcTemplate.class, () -> new JdbcTemplate(new DriverManagerDataSource("jdbc:h2:mem:missing", "sa", ""))) .withBean(MeterRegistry.class, SimpleMeterRegistry::new) diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/controller/LastlegOrderControllerTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/controller/LastlegOrderControllerTest.java index d9d71ed41..8e378e736 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/controller/LastlegOrderControllerTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/controller/LastlegOrderControllerTest.java @@ -152,7 +152,7 @@ class LastlegOrderControllerTest { @Test void iamSecurityEventsAreRejectedBeforeLoadingCompletedConsumer() { EventEnvelope event = mock(EventEnvelope.class); - when(event.eventType()).thenReturn(EventTypes.IAM_USER_STATUS_CHANGED); + when(event.eventType()).thenReturn("IamUserStatusChanged"); LoadingCompletedConsumer loading = (LoadingCompletedConsumer) ReflectionTestUtils.getField(controller, "consumer"); assertThrows(com.baiyue.common.event.EventProtocolException.class, () -> controller.receive("internal-token", event));