From 77d9ed4bdd1f00e3cbd741fae7064fcdfbc8616f Mon Sep 17 00:00:00 2001 From: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:55:18 +0800 Subject: [PATCH] fix(publish): emit event on confirm publish Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> --- .../service/SkillReviewSubmitService.java | 4 +++ .../service/SkillReviewSubmitServiceTest.java | 36 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitService.java b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitService.java index df8e9fd1..0b2e396b 100644 --- a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitService.java +++ b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillReviewSubmitService.java @@ -1,5 +1,6 @@ package com.iflytek.skillhub.domain.skill.service; +import com.iflytek.skillhub.domain.event.SkillPublishedEvent; import com.iflytek.skillhub.domain.namespace.NamespaceMemberRepository; import com.iflytek.skillhub.domain.namespace.NamespaceRole; import com.iflytek.skillhub.domain.review.ReviewTask; @@ -145,6 +146,9 @@ public class SkillReviewSubmitService { skill.setLatestVersionId(versionId); skill.setUpdatedBy(actorUserId); skillRepository.save(skill); + + eventPublisher.publishEvent(new SkillPublishedEvent( + skill.getId(), version.getId(), actorUserId)); } private void assertCanManageLifecycle(Skill skill, String actorUserId, Map userNamespaceRoles) { 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 4f8f9565..264e129f 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 @@ -1,5 +1,6 @@ package com.iflytek.skillhub.domain.skill.service; +import com.iflytek.skillhub.domain.event.SkillPublishedEvent; import com.iflytek.skillhub.domain.namespace.NamespaceRole; import com.iflytek.skillhub.domain.review.ReviewTask; import com.iflytek.skillhub.domain.review.ReviewTaskRepository; @@ -180,7 +181,16 @@ class SkillReviewSubmitServiceTest { assertEquals(SkillVersionStatus.PUBLISHED, version.getStatus()); assertNotNull(version.getPublishedAt()); assertEquals(versionId, skill.getLatestVersionId()); + verify(skillVersionRepository).save(version); verify(skillRepository).save(skill); + + ArgumentCaptor eventCaptor = + ArgumentCaptor.forClass(SkillPublishedEvent.class); + verify(eventPublisher).publishEvent(eventCaptor.capture()); + SkillPublishedEvent event = eventCaptor.getValue(); + assertEquals(skillId, event.skillId()); + assertEquals(versionId, event.versionId()); + assertEquals(userId, event.publisherId()); } @Test @@ -225,6 +235,7 @@ class SkillReviewSubmitServiceTest { // When/Then assertThrows(DomainBadRequestException.class, () -> service.confirmPublish(skillId, versionId, userId, Map.of())); + verify(eventPublisher, never()).publishEvent(any()); } @Test @@ -244,6 +255,31 @@ class SkillReviewSubmitServiceTest { // When/Then assertThrows(DomainBadRequestException.class, () -> service.confirmPublish(skillId, versionId, userId, Map.of())); + verify(eventPublisher, never()).publishEvent(any()); + } + + @Test + @DisplayName("should not publish event when skill persistence fails") + void shouldNotPublishEventWhenSkillPersistenceFails() { + // 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("skill save failed"); + + when(skillRepository.findById(skillId)).thenReturn(Optional.of(skill)); + when(skillVersionRepository.findById(versionId)).thenReturn(Optional.of(version)); + when(skillRepository.save(skill)).thenThrow(persistenceFailure); + + // When/Then + RuntimeException thrown = assertThrows(RuntimeException.class, + () -> service.confirmPublish(skillId, versionId, userId, Map.of())); + assertSame(persistenceFailure, thrown); + verify(skillVersionRepository).save(version); + verify(eventPublisher, never()).publishEvent(any()); } }