refactor(项目管理): 优化文件模块以及文件的名称唯一性判定
This commit is contained in:
parent
0ff439f776
commit
24f12d7b12
|
@ -29,4 +29,6 @@ public interface ExtFileMetadataMapper {
|
|||
List<FileMetadata> selectRefIdByModuleIds(@Param("moduleIds") List<String> moduleIds);
|
||||
|
||||
List<String> selectFileTypeByProjectId(@Param("projectId") String projectId, @Param("storage") String storage);
|
||||
|
||||
long countRepositoryFileByFileNameAndBranch(@Param("projectId") String projectId, @Param("moduleId") String moduleId, @Param("filePath") String filePath, @Param("branch") String branch);
|
||||
}
|
||||
|
|
|
@ -166,6 +166,15 @@
|
|||
INNER JOIN user createUser ON f.create_user = createUser.id
|
||||
WHERE f.id = #{id}
|
||||
</select>
|
||||
<select id="countRepositoryFileByFileNameAndBranch" resultType="java.lang.Long">
|
||||
SELECT count(f.id)
|
||||
FROM file_metadata f
|
||||
INNER JOIN file_metadata_repository fgit ON f.id = fgit.file_metadata_id
|
||||
WHERE f.path = #{filePath}
|
||||
AND f.module_id = #{moduleId}
|
||||
AND fgit.branch = #{branch}
|
||||
AND f.project_id = #{projectId}
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
|
@ -160,14 +160,7 @@ public class FileMetadataService {
|
|||
}
|
||||
//检查处理后的用户名合法性
|
||||
if (StringUtils.equals(storage, StorageType.MINIO.name())) {
|
||||
this.checkMinIOFileName(null, fileMetadata.getName(), projectId);
|
||||
} else {
|
||||
//Git: 存储库下的文件路径不能重复
|
||||
FileMetadataExample example = new FileMetadataExample();
|
||||
example.createCriteria().andPathEqualTo(filePath).andProjectIdEqualTo(projectId).andStorageEqualTo(StorageType.GIT.name()).andModuleIdEqualTo(moduleId);
|
||||
if (fileMetadataMapper.countByExample(example) > 0) {
|
||||
throw new MSException(Translator.get("file.name.exist") + ":" + fileMetadata.getName());
|
||||
}
|
||||
this.checkMinIOFileName(null, fileMetadata.getName(), fileMetadata.getType(), projectId);
|
||||
}
|
||||
|
||||
fileMetadata.setId(IDGenerator.nextStr());
|
||||
|
@ -272,15 +265,15 @@ public class FileMetadataService {
|
|||
return fileName;
|
||||
}
|
||||
|
||||
private void checkMinIOFileName(String id, String fileName, String projectId) {
|
||||
private void checkMinIOFileName(String id, String fileName, String type, String projectId) {
|
||||
if (StringUtils.isBlank(fileName)) {
|
||||
throw new MSException(Translator.get("file.name.cannot.be.empty"));
|
||||
}
|
||||
FileMetadataExample example = new FileMetadataExample();
|
||||
if (StringUtils.isBlank(id)) {
|
||||
example.createCriteria().andNameEqualTo(fileName).andProjectIdEqualTo(projectId).andStorageEqualTo(StorageType.MINIO.name());
|
||||
example.createCriteria().andNameEqualTo(fileName).andTypeEqualTo(type).andProjectIdEqualTo(projectId).andStorageEqualTo(StorageType.MINIO.name());
|
||||
} else {
|
||||
example.createCriteria().andNameEqualTo(fileName).andProjectIdEqualTo(projectId).andIdNotEqualTo(id).andStorageEqualTo(StorageType.MINIO.name());
|
||||
example.createCriteria().andNameEqualTo(fileName).andTypeEqualTo(type).andProjectIdEqualTo(projectId).andIdNotEqualTo(id).andStorageEqualTo(StorageType.MINIO.name());
|
||||
}
|
||||
if (fileMetadataMapper.countByExample(example) > 0) {
|
||||
throw new MSException(Translator.get("file.name.exist") + ":" + fileName);
|
||||
|
@ -375,7 +368,7 @@ public class FileMetadataService {
|
|||
updateExample.setDescription(request.getDescription());
|
||||
updateExample.setModuleId(request.getModuleId());
|
||||
if (StringUtils.isNotBlank(request.getName())) {
|
||||
this.checkMinIOFileName(request.getId(), request.getName(), fileMetadata.getProjectId());
|
||||
this.checkMinIOFileName(request.getId(), request.getName(), fileMetadata.getType(), fileMetadata.getProjectId());
|
||||
updateExample.setName(request.getName());
|
||||
}
|
||||
if (request.getTags() != null) {
|
||||
|
|
|
@ -66,16 +66,14 @@ public class FileModuleService extends ModuleTreeService implements CleanupProje
|
|||
fileModule.setName(request.getName().trim());
|
||||
fileModule.setParentId(request.getParentId());
|
||||
fileModule.setProjectId(request.getProjectId());
|
||||
fileModule.setModuleType(ModuleConstants.NODE_TYPE_DEFAULT);
|
||||
this.checkDataValidity(fileModule);
|
||||
fileModule.setCreateTime(System.currentTimeMillis());
|
||||
fileModule.setUpdateTime(fileModule.getCreateTime());
|
||||
fileModule.setPos(this.countPos(request.getParentId(), ModuleConstants.NODE_TYPE_DEFAULT));
|
||||
fileModule.setCreateUser(operator);
|
||||
fileModule.setUpdateUser(operator);
|
||||
fileModule.setModuleType(ModuleConstants.NODE_TYPE_DEFAULT);
|
||||
|
||||
fileModuleMapper.insert(fileModule);
|
||||
|
||||
//记录日志
|
||||
fileModuleLogService.saveAddLog(fileModule, operator);
|
||||
return fileModule.getId();
|
||||
|
@ -102,17 +100,16 @@ public class FileModuleService extends ModuleTreeService implements CleanupProje
|
|||
throw new MSException(Translator.get("parent.node.not_blank"));
|
||||
}
|
||||
example.clear();
|
||||
|
||||
if (StringUtils.isNotBlank(fileModule.getProjectId())) {
|
||||
//检查项目ID是否和父节点ID一致
|
||||
example.createCriteria().andProjectIdEqualTo(fileModule.getProjectId()).andIdEqualTo(fileModule.getParentId());
|
||||
example.createCriteria().andProjectIdEqualTo(fileModule.getProjectId()).andModuleTypeEqualTo(fileModule.getModuleType()).andIdEqualTo(fileModule.getParentId());
|
||||
if (fileModuleMapper.countByExample(example) == 0) {
|
||||
throw new MSException(Translator.get("project.cannot.match.parent"));
|
||||
}
|
||||
example.clear();
|
||||
}
|
||||
}
|
||||
example.createCriteria().andParentIdEqualTo(fileModule.getParentId()).andNameEqualTo(fileModule.getName()).andIdNotEqualTo(fileModule.getId());
|
||||
example.createCriteria().andParentIdEqualTo(fileModule.getParentId()).andNameEqualTo(fileModule.getName()).andModuleTypeEqualTo(fileModule.getModuleType()).andIdNotEqualTo(fileModule.getId());
|
||||
if (fileModuleMapper.countByExample(example) > 0) {
|
||||
throw new MSException(Translator.get("node.name.repeat"));
|
||||
}
|
||||
|
@ -128,6 +125,7 @@ public class FileModuleService extends ModuleTreeService implements CleanupProje
|
|||
updateModule.setId(request.getId());
|
||||
updateModule.setName(request.getName().trim());
|
||||
updateModule.setParentId(module.getParentId());
|
||||
updateModule.setModuleType(module.getModuleType());
|
||||
this.checkDataValidity(updateModule);
|
||||
updateModule.setUpdateTime(System.currentTimeMillis());
|
||||
updateModule.setUpdateUser(userId);
|
||||
|
|
|
@ -9,6 +9,7 @@ import io.metersphere.project.dto.filemanagement.request.FileRepositoryCreateReq
|
|||
import io.metersphere.project.dto.filemanagement.request.FileRepositoryUpdateRequest;
|
||||
import io.metersphere.project.dto.filemanagement.request.RepositoryFileAddRequest;
|
||||
import io.metersphere.project.dto.filemanagement.response.FileRepositoryResponse;
|
||||
import io.metersphere.project.mapper.ExtFileMetadataMapper;
|
||||
import io.metersphere.project.mapper.FileMetadataMapper;
|
||||
import io.metersphere.project.mapper.FileMetadataRepositoryMapper;
|
||||
import io.metersphere.project.mapper.FileModuleRepositoryMapper;
|
||||
|
@ -40,6 +41,8 @@ public class FileRepositoryService extends FileModuleService {
|
|||
@Resource
|
||||
private FileMetadataMapper fileMetadataMapper;
|
||||
@Resource
|
||||
private ExtFileMetadataMapper extFileMetadataMapper;
|
||||
@Resource
|
||||
private FileModuleRepositoryMapper fileModuleRepositoryMapper;
|
||||
@Resource
|
||||
private FileMetadataRepositoryMapper fileMetadataRepositoryMapper;
|
||||
|
@ -57,13 +60,13 @@ public class FileRepositoryService extends FileModuleService {
|
|||
fileModule.setName(request.getName().trim());
|
||||
fileModule.setParentId(ModuleConstants.ROOT_NODE_PARENT_ID);
|
||||
fileModule.setProjectId(request.getProjectId());
|
||||
fileModule.setModuleType(ModuleConstants.NODE_TYPE_GIT);
|
||||
super.checkDataValidity(fileModule);
|
||||
fileModule.setCreateTime(System.currentTimeMillis());
|
||||
fileModule.setUpdateTime(fileModule.getCreateTime());
|
||||
fileModule.setPos(this.countPos(ModuleConstants.ROOT_NODE_PARENT_ID, ModuleConstants.NODE_TYPE_GIT));
|
||||
fileModule.setCreateUser(operator);
|
||||
fileModule.setUpdateUser(operator);
|
||||
fileModule.setModuleType(ModuleConstants.NODE_TYPE_GIT);
|
||||
fileModuleMapper.insert(fileModule);
|
||||
|
||||
//记录模块仓库数据
|
||||
|
@ -139,6 +142,13 @@ public class FileRepositoryService extends FileModuleService {
|
|||
}
|
||||
FileMetadata fileMetadata = fileMetadataService.genFileMetadata(request.getFilePath(), StorageType.GIT.name(), fileAttachInfo.getSize(), request.isEnable(),
|
||||
fileModule.getProjectId(), fileModule.getId(), operator);
|
||||
|
||||
//判断文件是否存在: 同一存储库下文件路径和分支不能重复
|
||||
if (extFileMetadataMapper.countRepositoryFileByFileNameAndBranch(
|
||||
fileModule.getProjectId(), fileModule.getId(), request.getFilePath(), request.getBranch()) > 0) {
|
||||
throw new MSException(Translator.get("file.name.exist") + ":" + fileMetadata.getName());
|
||||
}
|
||||
|
||||
fileMetadata.setFileVersion(fileAttachInfo.getCommitId());
|
||||
fileMetadataMapper.insert(fileMetadata);
|
||||
|
||||
|
|
|
@ -156,6 +156,7 @@ public class FileRepositoryControllerTest extends BaseTest {
|
|||
createRequest.setUrl(GITEA_URL);
|
||||
createRequest.setToken(GITEA_TOKEN);
|
||||
createRequest.setName("GITEA存储库");
|
||||
|
||||
MvcResult result = this.requestPostWithOkAndReturn(FileManagementRequestUtils.URL_FILE_REPOSITORY_CREATE, createRequest);
|
||||
String returnStr = result.getResponse().getContentAsString();
|
||||
ResultHolder rh = JSON.parseObject(returnStr, ResultHolder.class);
|
||||
|
@ -382,8 +383,19 @@ public class FileRepositoryControllerTest extends BaseTest {
|
|||
getFileMessage(fileId);
|
||||
fileList.add(fileId);
|
||||
|
||||
//测试其他分支的多层目录的文件
|
||||
//测试其他分支的README.en.md
|
||||
String otherBranch = "develop";
|
||||
request = new RepositoryFileAddRequest();
|
||||
request.setBranch(otherBranch);
|
||||
request.setFilePath(filePath);
|
||||
request.setModuleId(repositoryId);
|
||||
result = this.requestPostWithOkAndReturn(FileManagementRequestUtils.URL_FILE_REPOSITORY_FILE_ADD, request);
|
||||
fileId = JSON.parseObject(result.getResponse().getContentAsString(), ResultHolder.class).getData().toString();
|
||||
this.checkRepositoryFile(fileId, request);
|
||||
getFileMessage(fileId);
|
||||
fileList.add(fileId);
|
||||
|
||||
//测试其他分支的多层目录的文件
|
||||
String folderFilePath1 = "test-folder/gitea/test.txt";
|
||||
request = new RepositoryFileAddRequest();
|
||||
request.setBranch(otherBranch);
|
||||
|
|
|
@ -21,7 +21,6 @@ public class PersonalUpdateRequest {
|
|||
private String username;
|
||||
|
||||
@Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "{user.email.not_blank}")
|
||||
private String phone;
|
||||
|
||||
@Schema(description = "邮箱", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
|
|
|
@ -298,7 +298,7 @@
|
|||
"children": [
|
||||
{
|
||||
"id": "PERSONAL_INFO",
|
||||
"name": "my_settings_personal_info",
|
||||
"name": "permission.my_settings_personal_info",
|
||||
"permissions": [
|
||||
{
|
||||
"id": "SYSTEM_PERSONAL:READ"
|
||||
|
|
|
@ -91,7 +91,6 @@ public class PersonalControllerTests extends BaseTest {
|
|||
request.setId(loginUser);
|
||||
request.setEmail("admin_update@metersphere.io");
|
||||
request.setUsername("admin_update");
|
||||
request.setPhone("1111111111");
|
||||
request.setAvatar(IDGenerator.nextStr());
|
||||
this.requestPostWithOk(PersonalRequestUtils.URL_PERSONAL_UPDATE_INFO, request);
|
||||
userDTO = this.selectUserDTO(loginUser);
|
||||
|
@ -108,7 +107,7 @@ public class PersonalControllerTests extends BaseTest {
|
|||
request.setId(loginUser);
|
||||
request.setEmail("admin@metersphere.io");
|
||||
request.setUsername("'Administrator'");
|
||||
request.setPhone("12345678901");
|
||||
request.setPhone("");
|
||||
this.requestPostWithOk(PersonalRequestUtils.URL_PERSONAL_UPDATE_INFO, request);
|
||||
userDTO = this.selectUserDTO(loginUser);
|
||||
this.checkUserInformation(userDTO, request);
|
||||
|
@ -122,12 +121,6 @@ public class PersonalControllerTests extends BaseTest {
|
|||
this.requestPost(PersonalRequestUtils.URL_PERSONAL_UPDATE_INFO, request).andExpect(status().is5xxServerError());
|
||||
|
||||
//参数校验
|
||||
request = new PersonalUpdateRequest();
|
||||
request.setId(loginUser);
|
||||
request.setEmail("admin@metersphere.io");
|
||||
request.setUsername("'Administrator'");
|
||||
this.requestPost(PersonalRequestUtils.URL_PERSONAL_UPDATE_INFO, request).andExpect(status().isBadRequest());
|
||||
|
||||
request = new PersonalUpdateRequest();
|
||||
request.setId(loginUser);
|
||||
request.setEmail("admin@metersphere.io");
|
||||
|
|
Loading…
Reference in New Issue