refactor(项目管理): 优化文件模块以及文件的名称唯一性判定

This commit is contained in:
song-tianyang 2023-12-08 11:29:09 +08:00 committed by 刘瑞斌
parent 0ff439f776
commit 24f12d7b12
9 changed files with 46 additions and 30 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -298,7 +298,7 @@
"children": [
{
"id": "PERSONAL_INFO",
"name": "my_settings_personal_info",
"name": "permission.my_settings_personal_info",
"permissions": [
{
"id": "SYSTEM_PERSONAL:READ"

View File

@ -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");