diff --git a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillQueryService.java b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillQueryService.java index 5dbc990e..d03565f5 100644 --- a/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillQueryService.java +++ b/server/skillhub-domain/src/main/java/com/iflytek/skillhub/domain/skill/service/SkillQueryService.java @@ -399,14 +399,14 @@ public class SkillQueryService { } private SkillVersion resolvePreviewVersion(Skill skill, String currentUserId) { - SkillVersion ownerPreview = resolveOwnerPendingPreview(skill, currentUserId); - if (ownerPreview != null) { - return ownerPreview; + SkillVersion publishedVersion = null; + if (skill.getLatestVersionId() != null) { + publishedVersion = skillVersionRepository.findById(skill.getLatestVersionId()).orElse(null); } - if (skill.getLatestVersionId() == null) { - return null; + if (publishedVersion != null) { + return publishedVersion; } - return skillVersionRepository.findById(skill.getLatestVersionId()).orElse(null); + return resolveOwnerPendingPreview(skill, currentUserId); } private SkillVersion resolveOwnerPendingPreview(Skill skill, String currentUserId) { diff --git a/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillQueryServiceTest.java b/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillQueryServiceTest.java index 937c72f1..143e8b7a 100644 --- a/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillQueryServiceTest.java +++ b/server/skillhub-domain/src/test/java/com/iflytek/skillhub/domain/skill/service/SkillQueryServiceTest.java @@ -502,6 +502,40 @@ class SkillQueryServiceTest { assertFalse(result.canInteract()); } + @Test + void testGetSkillDetail_ShouldKeepPublishedVersionWhenSkillAlreadyPublic() throws Exception { + String namespaceSlug = "test-ns"; + String skillSlug = "test-skill"; + String ownerId = "owner-1"; + Map userNsRoles = Map.of(); + + Namespace namespace = new Namespace(namespaceSlug, "Test NS", ownerId); + setId(namespace, 1L); + Skill skill = new Skill(1L, skillSlug, ownerId, SkillVisibility.PUBLIC); + setId(skill, 1L); + skill.setStatus(SkillStatus.ACTIVE); + skill.setLatestVersionId(11L); + + SkillVersion published = new SkillVersion(1L, "1.0.0", ownerId); + setId(published, 11L); + published.setStatus(SkillVersionStatus.PUBLISHED); + + SkillVersion pending = new SkillVersion(1L, "1.1.0", ownerId); + setId(pending, 12L); + pending.setStatus(SkillVersionStatus.PENDING_REVIEW); + + when(namespaceRepository.findBySlug(namespaceSlug)).thenReturn(Optional.of(namespace)); + when(skillRepository.findByNamespaceIdAndSlug(1L, skillSlug)).thenReturn(Optional.of(skill)); + when(visibilityChecker.canAccess(skill, ownerId, userNsRoles)).thenReturn(true); + when(skillVersionRepository.findById(11L)).thenReturn(Optional.of(published)); + + SkillQueryService.SkillDetailDTO result = service.getSkillDetail(namespaceSlug, skillSlug, ownerId, userNsRoles); + + assertEquals("1.0.0", result.latestVersion()); + assertEquals("PUBLISHED", result.viewingVersionStatus()); + assertTrue(result.canInteract()); + } + @Test void testGetVersionDetail_ShouldAllowPendingVersionForOwnerPreview() throws Exception { String namespaceSlug = "test-ns"; diff --git a/web/src/shared/lib/date-time.ts b/web/src/shared/lib/date-time.ts index ff229610..64c3e457 100644 --- a/web/src/shared/lib/date-time.ts +++ b/web/src/shared/lib/date-time.ts @@ -13,9 +13,12 @@ function parseServerDateTime(value: string): Date { } export function formatLocalDateTime( - value: string, + value: string | null | undefined, locale: string, options: Intl.DateTimeFormatOptions = { dateStyle: 'medium', timeStyle: 'short' }, ) { + if (!value) { + return '—' + } return new Intl.DateTimeFormat(locale, options).format(parseServerDateTime(value)) }