fix(skill): keep published view stable for owners

This commit is contained in:
yun-zhi-ztl 2026-03-15 20:06:45 +08:00
parent 2757f0ede7
commit c6b3eab034
3 changed files with 44 additions and 7 deletions

View file

@ -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) {

View file

@ -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<Long, NamespaceRole> 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";

View file

@ -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))
}