Harden front draft preview isolation
This commit is contained in:
@@ -55,6 +55,8 @@ public class GenProject extends BaseEntity
|
||||
@Excel(name = "状态", readConverterExp = "0=正常,1=停用")
|
||||
private String status;
|
||||
|
||||
private transient Boolean frontDraft;
|
||||
|
||||
private List<GenTable> tables;
|
||||
|
||||
public void setProjectId(Long projectId)
|
||||
@@ -165,6 +167,18 @@ public class GenProject extends BaseEntity
|
||||
this.tables = tables;
|
||||
}
|
||||
|
||||
public Boolean getFrontDraft() {
|
||||
return frontDraft;
|
||||
}
|
||||
|
||||
public void setFrontDraft(Boolean frontDraft) {
|
||||
this.frontDraft = frontDraft;
|
||||
}
|
||||
|
||||
public boolean isFrontDraft() {
|
||||
return Boolean.TRUE.equals(frontDraft);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||
@@ -185,4 +199,4 @@ public class GenProject extends BaseEntity
|
||||
.append("remark", getRemark())
|
||||
.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,6 +236,9 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
|
||||
private List<SysProjectModule> getProjectModules(GenProject project) {
|
||||
if (project.isFrontDraft()) {
|
||||
return new ArrayList<SysProjectModule>();
|
||||
}
|
||||
SysProjectModule projectModuleFilter = new SysProjectModule();
|
||||
projectModuleFilter.setProjectId(project.getProjectId());
|
||||
return sysProjectModuleService.selectSysProjectModuleList(projectModuleFilter);
|
||||
@@ -250,11 +253,17 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
|
||||
private SysProjectTemplate resolveProjectTemplate(GenProject project, String type) {
|
||||
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
|
||||
if (projectTemplate != null && projectTemplate.getTemplateId() != null) {
|
||||
return projectTemplate;
|
||||
if (!project.isFrontDraft()) {
|
||||
SysProjectTemplate projectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(project.getProjectId(), type);
|
||||
if (projectTemplate != null && projectTemplate.getTemplateId() != null) {
|
||||
return projectTemplate;
|
||||
}
|
||||
}
|
||||
|
||||
return resolveActiveTemplate(project.getProjectId(), type);
|
||||
}
|
||||
|
||||
private SysProjectTemplate resolveActiveTemplate(Long projectId, String type) {
|
||||
Template templateFilter = new Template();
|
||||
templateFilter.setTemplateType(type);
|
||||
List<Template> templates = templateService.selectTemplateList(templateFilter);
|
||||
@@ -262,7 +271,7 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
for (Template template : templates) {
|
||||
if (template != null && template.getTemplateId() != null && Long.valueOf(0L).equals(template.getTemplateStatus())) {
|
||||
SysProjectTemplate fallbackTemplate = new SysProjectTemplate();
|
||||
fallbackTemplate.setProjectId(project.getProjectId());
|
||||
fallbackTemplate.setProjectId(projectId);
|
||||
fallbackTemplate.setTemplateId(template.getTemplateId());
|
||||
fallbackTemplate.setTemplateType(type);
|
||||
return fallbackTemplate;
|
||||
@@ -273,6 +282,12 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
|
||||
private List<SysProjectStructure> selectStructureNodes(GenProject project, SysProjectTemplate projectTemplate) {
|
||||
if (project.isFrontDraft()) {
|
||||
SysProjectStructure query = new SysProjectStructure();
|
||||
query.setTemplateId(projectTemplate.getTemplateId());
|
||||
query.setStatus("0");
|
||||
return sysProjectStructureService.selectSysProjectStructureList(query);
|
||||
}
|
||||
SysProjectTemplate boundProjectTemplate = sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(
|
||||
project.getProjectId(), projectTemplate.getTemplateType());
|
||||
if (boundProjectTemplate != null && boundProjectTemplate.getTemplateId() != null) {
|
||||
@@ -394,6 +409,9 @@ public class GenProjectServiceImpl implements IGenProjectService {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (project != null && project.isFrontDraft()) {
|
||||
throw new ServiceException("Table is not in front draft: " + tableId);
|
||||
}
|
||||
GenTable table = genTableMapper.selectGenTableById(tableId);
|
||||
if (table == null) {
|
||||
throw new ServiceException("业务表不存在:" + tableId);
|
||||
|
||||
@@ -18,6 +18,7 @@ public class FrontProjectConverter
|
||||
return null;
|
||||
}
|
||||
GenProject genProject = new GenProject();
|
||||
genProject.setFrontDraft(true);
|
||||
genProject.setProjectId(project.getProjectId());
|
||||
genProject.setProjectName(project.getProjectName());
|
||||
genProject.setProjectFileName(project.getProjectFileName());
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.ruoyi.generator.service;
|
||||
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import com.ruoyi.generator.domain.GenProject;
|
||||
import com.ruoyi.generator.domain.GenTable;
|
||||
import com.ruoyi.generator.domain.GenTableColumn;
|
||||
@@ -173,6 +174,54 @@ public class GenProjectServiceImplTest {
|
||||
assertEquals("0", structureCaptor.getValue().getStatus());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void frontDraftProjectStructureIgnoresProjectTemplateBindingAndModules() {
|
||||
GenProject project = project();
|
||||
project.setFrontDraft(true);
|
||||
project.setTables(Arrays.asList(table(11L, "sys_user", "User")));
|
||||
|
||||
when(sysProjectTemplateService.selectSysProjectTemplateByProjectAndType(1L, "backend")).thenReturn(projectTemplate(999L));
|
||||
when(templateService.selectTemplateList(any(Template.class))).thenReturn(Arrays.asList(
|
||||
template(99L, 1L),
|
||||
template(101L, 0L)
|
||||
));
|
||||
when(sysProjectStructureService.selectSysProjectStructureList(any(SysProjectStructure.class))).thenReturn(Arrays.asList(
|
||||
structure(1L, 0L, "{projectName}", "folder", null, null),
|
||||
structure(2L, 1L, "{ClassName}.java", "file", 0L, "controller.java.vm")
|
||||
));
|
||||
|
||||
List<Map<String, Object>> structure = service.getProjectStructure(project, "backend");
|
||||
|
||||
assertEquals("demo-app", structure.get(0).get("name"));
|
||||
assertEquals("User.java", child(structure.get(0), 0).get("name"));
|
||||
verify(sysProjectTemplateService, never()).selectSysProjectTemplateByProjectAndType(1L, "backend");
|
||||
verify(sysProjectStructureService, never()).selectProjectStructureListByModule(1L, 999L);
|
||||
verify(sysProjectModuleService, never()).selectSysProjectModuleList(any(SysProjectModule.class));
|
||||
|
||||
ArgumentCaptor<SysProjectStructure> structureCaptor = ArgumentCaptor.forClass(SysProjectStructure.class);
|
||||
verify(sysProjectStructureService).selectSysProjectStructureList(structureCaptor.capture());
|
||||
assertEquals(Long.valueOf(101L), structureCaptor.getValue().getTemplateId());
|
||||
assertEquals("0", structureCaptor.getValue().getStatus());
|
||||
}
|
||||
|
||||
@Test(expected = ServiceException.class)
|
||||
public void frontDraftPreviewRejectsTableOutsideDraftWithoutMapperFallback() {
|
||||
GenProject project = project();
|
||||
project.setFrontDraft(true);
|
||||
project.setTables(Arrays.asList(table(11L, "sys_user", "User")));
|
||||
|
||||
when(templateService.selectTemplateList(any(Template.class))).thenReturn(Arrays.asList(template(101L, 0L)));
|
||||
when(templateFileService.selectTemplateFilesByTemplateId(101L)).thenReturn(Arrays.asList(
|
||||
templateFile("controller.java.vm", "class Outside {}")
|
||||
));
|
||||
|
||||
try {
|
||||
service.previewCode(project, 99L, "controller.java.vm", "backend");
|
||||
} finally {
|
||||
verify(genTableMapper, never()).selectGenTableById(99L);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private Map<String, Object> child(Map<String, Object> node, int index) {
|
||||
return ((List<Map<String, Object>>) node.get("children")).get(index);
|
||||
|
||||
Reference in New Issue
Block a user