From 126f01d75e1c61dab9656f04739702a06afb2aa2 Mon Sep 17 00:00:00 2001 From: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:50:37 +0800 Subject: [PATCH] fix(subscription): retain yank visibility context Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> --- .../domain/event/SkillVersionYankedEvent.java | 2 +- .../skill/service/SkillGovernanceService.java | 2 +- .../service/SkillReviewSubmitServiceTest.java | 27 ++++++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/event/SkillVersionYankedEvent.java b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/event/SkillVersionYankedEvent.java index 9df82b5d..a9a6d92d 100644 --- a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/event/SkillVersionYankedEvent.java +++ b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/event/SkillVersionYankedEvent.java @@ -1,3 +1,3 @@ package com.iflytek.skillhub.domain.event; -public record SkillVersionYankedEvent(Long skillId, Long versionId, String actorUserId) {} +public record SkillVersionYankedEvent(Long skillId, Long versionId, String actorUserId, boolean wasPublished) {} diff --git a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillGovernanceService.java b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillGovernanceService.java index 3cad927f..552d9e1f 100644 --- a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillGovernanceService.java +++ b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillGovernanceService.java @@ -281,7 +281,7 @@ public class SkillGovernanceService { }); auditLogService.record(actorUserId, "YANK_SKILL_VERSION", "SKILL_VERSION", versionId, null, clientIp, userAgent, jsonReason(reason)); eventPublisher.publishEvent(new com.iflytek.skillhub.domain.event.SkillVersionYankedEvent( - version.getSkillId(), versionId, actorUserId)); + version.getSkillId(), versionId, actorUserId, true)); return saved; } diff --git a/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitServiceTest.java b/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitServiceTest.java index 264e129f..0b3b47d0 100644 --- a/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitServiceTest.java +++ b/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitServiceTest.java @@ -86,6 +86,7 @@ class SkillReviewSubmitServiceTest { assertEquals(SkillVersionStatus.PENDING_REVIEW, version.getStatus()); assertEquals(SkillVisibility.PUBLIC, version.getRequestedVisibility()); verify(reviewTaskRepository).save(any(ReviewTask.class)); + verify(eventPublisher, never()).publishEvent(any()); } @Test @@ -186,7 +187,7 @@ class SkillReviewSubmitServiceTest { ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(SkillPublishedEvent.class); - verify(eventPublisher).publishEvent(eventCaptor.capture()); + verify(eventPublisher, times(1)).publishEvent(eventCaptor.capture()); SkillPublishedEvent event = eventCaptor.getValue(); assertEquals(skillId, event.skillId()); assertEquals(versionId, event.versionId()); @@ -258,6 +259,30 @@ class SkillReviewSubmitServiceTest { verify(eventPublisher, never()).publishEvent(any()); } + @Test + @DisplayName("should not publish event when version persistence fails") + void shouldNotPublishEventWhenVersionPersistenceFails() { + // Given + Long skillId = 1L; + Long versionId = 100L; + String userId = "user-1"; + + Skill skill = createSkill(skillId, userId, 10L, SkillVisibility.PRIVATE); + SkillVersion version = createVersion(versionId, skillId, SkillVersionStatus.UPLOADED); + RuntimeException persistenceFailure = new RuntimeException("version save failed"); + + when(skillRepository.findById(skillId)).thenReturn(Optional.of(skill)); + when(skillVersionRepository.findById(versionId)).thenReturn(Optional.of(version)); + when(skillVersionRepository.save(version)).thenThrow(persistenceFailure); + + // When/Then + RuntimeException thrown = assertThrows(RuntimeException.class, + () -> service.confirmPublish(skillId, versionId, userId, Map.of())); + assertSame(persistenceFailure, thrown); + verify(skillRepository, never()).save(any()); + verify(eventPublisher, never()).publishEvent(any()); + } + @Test @DisplayName("should not publish event when skill persistence fails") void shouldNotPublishEventWhenSkillPersistenceFails() {