feat: 更新模板服务逻辑以支持系统模板状态检查和用户权限控制

dev_na
chenhao 2026-06-30 17:27:57 +08:00
parent c89e508091
commit 202ce057fd
2 changed files with 100 additions and 5 deletions

View File

@ -79,7 +79,7 @@ public class PromptTemplateServiceImpl extends ServiceImpl<PromptTemplateMapper,
Map<Long, HotWordGroup> hotWordGroupMap = queryHotWordGroupMap(records.stream().map(PromptTemplate::getHotWordGroupId).toList());
List<PromptTemplateVO> vos = records.stream()
.map(template -> toVO(template, effectiveStatus(template.getStatus(), userStatusMap.get(template.getId())), hotWordGroupMap))
.map(template -> toVO(template, effectiveStatus(template.getIsSystem(), template.getStatus(), userStatusMap.get(template.getId())), hotWordGroupMap))
.collect(Collectors.toList());
PageResult<List<PromptTemplateVO>> result = new PageResult<>();
@ -111,6 +111,9 @@ public class PromptTemplateServiceImpl extends ServiceImpl<PromptTemplateMapper,
if (template == null) {
return false;
}
if (Integer.valueOf(1).equals(template.getIsSystem()) && !Integer.valueOf(1).equals(template.getStatus())) {
return false;
}
PromptTemplateUserConfig existing = userConfigMapper.selectOne(new LambdaQueryWrapper<PromptTemplateUserConfig>()
.eq(PromptTemplateUserConfig::getTenantId, tenantId)
@ -139,6 +142,9 @@ public class PromptTemplateServiceImpl extends ServiceImpl<PromptTemplateMapper,
if (template == null) {
return false;
}
if (Integer.valueOf(1).equals(template.getIsSystem()) && !Integer.valueOf(1).equals(template.getStatus())) {
return false;
}
PromptTemplateUserConfig config = userConfigMapper.selectOne(new LambdaQueryWrapper<PromptTemplateUserConfig>()
.eq(PromptTemplateUserConfig::getTenantId, tenantId)
@ -146,7 +152,7 @@ public class PromptTemplateServiceImpl extends ServiceImpl<PromptTemplateMapper,
.eq(PromptTemplateUserConfig::getTemplateId, templateId)
.last("LIMIT 1"));
Integer userStatus = config == null ? null : config.getStatus();
return effectiveStatus(template.getStatus(), userStatus) == 1;
return effectiveStatus(template.getIsSystem(), template.getStatus(), userStatus) == 1;
}
private void validateHotWordGroupBinding(Long hotWordGroupId, Long templateTenantId) {
@ -176,8 +182,18 @@ public class PromptTemplateServiceImpl extends ServiceImpl<PromptTemplateMapper,
LambdaQueryWrapper<PromptTemplate> wrapper = new LambdaQueryWrapper<>();
wrapper.and(w -> w
.eq(PromptTemplate::getCreatorId, userId)
.or(sw -> sw.eq(PromptTemplate::getTenantId, 0L).eq(PromptTemplate::getIsSystem, 1))
.or(sw -> sw.eq(PromptTemplate::getTenantId, tenantId).eq(PromptTemplate::getIsSystem, 1))
.or(sw -> {
sw.eq(PromptTemplate::getTenantId, 0L).eq(PromptTemplate::getIsSystem, 1);
if (!Boolean.TRUE.equals(isPlatformAdmin)) {
sw.eq(PromptTemplate::getStatus, 1);
}
})
.or(sw -> {
sw.eq(PromptTemplate::getTenantId, tenantId).eq(PromptTemplate::getIsSystem, 1);
if (!Boolean.TRUE.equals(isPlatformAdmin) && !Boolean.TRUE.equals(isTenantAdmin)) {
sw.eq(PromptTemplate::getStatus, 1);
}
})
);
return wrapper;
}
@ -222,7 +238,10 @@ public class PromptTemplateServiceImpl extends ServiceImpl<PromptTemplateMapper,
.toList();
}
private Integer effectiveStatus(Integer templateStatus, Integer userStatus) {
private Integer effectiveStatus(Integer isSystem, Integer templateStatus, Integer userStatus) {
if (Integer.valueOf(1).equals(isSystem) && !Integer.valueOf(1).equals(templateStatus)) {
return 0;
}
if (userStatus != null) {
return userStatus;
}

View File

@ -7,6 +7,7 @@ import com.imeeting.dto.biz.PromptTemplateVO;
import com.imeeting.entity.biz.HotWord;
import com.imeeting.entity.biz.HotWordGroup;
import com.imeeting.entity.biz.PromptTemplate;
import com.imeeting.entity.biz.PromptTemplateUserConfig;
import com.imeeting.mapper.biz.HotWordGroupMapper;
import com.imeeting.mapper.biz.PromptTemplateUserConfigMapper;
import com.imeeting.service.biz.HotWordService;
@ -15,12 +16,15 @@ import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
class PromptTemplateServiceImplTest {
@ -214,4 +218,76 @@ class PromptTemplateServiceImplTest {
assertNull(result.getHotWordGroupName());
assertEquals(List.of(), result.getHotWords());
}
@Test
void pageTemplatesShouldHideDisabledSystemTemplateForNormalUser() {
PromptTemplateUserConfigMapper userConfigMapper = mock(PromptTemplateUserConfigMapper.class);
HotWordGroupMapper hotWordGroupMapper = mock(HotWordGroupMapper.class);
HotWordService hotWordService = mock(HotWordService.class);
PromptTemplateServiceImpl service = spy(new PromptTemplateServiceImpl(userConfigMapper, hotWordGroupMapper, hotWordService));
PromptTemplate template = new PromptTemplate();
template.setId(41L);
template.setTenantId(0L);
template.setCreatorId(1L);
template.setTemplateName("平台模板");
template.setCategory("default");
template.setIsSystem(1);
template.setPromptContent("content");
template.setStatus(0);
Page<PromptTemplate> page = new Page<>(1, 10);
page.setRecords(List.of());
page.setTotal(0);
doReturn(page).when(service).page(any(Page.class), any(LambdaQueryWrapper.class));
when(userConfigMapper.selectList(any())).thenReturn(List.of());
assertEquals(0, service.pageTemplates(1, 10, null, null, 9L, 7L, false, false).getRecords().size());
}
@Test
void updateUserTemplateStatusShouldRejectDisabledSystemTemplate() {
PromptTemplateUserConfigMapper userConfigMapper = mock(PromptTemplateUserConfigMapper.class);
HotWordGroupMapper hotWordGroupMapper = mock(HotWordGroupMapper.class);
HotWordService hotWordService = mock(HotWordService.class);
PromptTemplateServiceImpl service = spy(new PromptTemplateServiceImpl(userConfigMapper, hotWordGroupMapper, hotWordService));
PromptTemplate template = new PromptTemplate();
template.setId(51L);
template.setTenantId(0L);
template.setCreatorId(1L);
template.setIsSystem(1);
template.setStatus(0);
doReturn(template).when(service).getOne(any(LambdaQueryWrapper.class));
boolean result = service.updateUserTemplateStatus(51L, 1, 9L, 7L, true, false);
assertFalse(result);
verify(userConfigMapper, never()).selectOne(any());
verify(userConfigMapper, never()).insert(any(PromptTemplateUserConfig.class));
}
@Test
void isTemplateEnabledForUserShouldRespectSystemStatusFirst() {
PromptTemplateUserConfigMapper userConfigMapper = mock(PromptTemplateUserConfigMapper.class);
HotWordGroupMapper hotWordGroupMapper = mock(HotWordGroupMapper.class);
HotWordService hotWordService = mock(HotWordService.class);
PromptTemplateServiceImpl service = spy(new PromptTemplateServiceImpl(userConfigMapper, hotWordGroupMapper, hotWordService));
PromptTemplate template = new PromptTemplate();
template.setId(61L);
template.setTenantId(9L);
template.setCreatorId(1L);
template.setIsSystem(1);
template.setStatus(0);
doReturn(template).when(service).getOne(any(LambdaQueryWrapper.class));
boolean result = service.isTemplateEnabledForUser(61L, 9L, 7L, false, true);
assertFalse(result);
verify(userConfigMapper, never()).selectOne(any());
}
}