feat: 更新模板服务逻辑以支持系统模板状态检查和用户权限控制
parent
c89e508091
commit
202ce057fd
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue