add check extensions
Test Workflow / test (push) Successful in 3s

This commit is contained in:
vladp
2025-12-22 17:17:48 +07:00
parent 76e8f4ab1d
commit 33479ea9af
4 changed files with 99 additions and 35 deletions
@@ -7,9 +7,12 @@ import ru.soune.nocopy.dto.file.FileUploadRequest;
import ru.soune.nocopy.entity.file.FileType;
import java.util.Arrays;
import java.util.List;
@Component
public class FileUploadRequestValidator implements Validator {
private final List<FileType> supportedFileTypes = Arrays.asList(FileType.values());
@Override
public boolean supports(Class<?> clazz) {
return FileUploadRequest.class.isAssignableFrom(clazz);
@@ -21,7 +24,7 @@ public class FileUploadRequestValidator implements Validator {
validateType(request.getFileType(), errors);
validateFileName(request.getFileName(), errors);
validateExtension(request.getExtension(), errors);
validateExtension(request.getExtension(), request.getFileName(), errors);
}
private void validateType(String fileType, Errors errors) {
@@ -31,7 +34,12 @@ public class FileUploadRequestValidator implements Validator {
}
try {
FileType.valueOf(fileType.toUpperCase());
FileType parsedType = FileType.valueOf(fileType.toUpperCase());
if (!supportedFileTypes.contains(parsedType)) {
errors.rejectValue("fileType", "fileType.unsupported",
"Unsupported file type. Valid types: " + Arrays.toString(FileType.values()));
}
} catch (IllegalArgumentException e) {
errors.rejectValue("fileType", "fileType.invalid",
"Invalid file type. Valid types: " + Arrays.toString(FileType.values()));
@@ -50,10 +58,50 @@ public class FileUploadRequestValidator implements Validator {
}
}
private void validateExtension(String extension, Errors errors) {
if (extension == null || extension.isBlank()) {
errors.rejectValue("extension", "extension.required", "Extension is required");
private void validateExtension(String fileType, String fileName, Errors errors) {
if (fileType == null || fileType.isBlank()) {
errors.rejectValue("fileType", "fileType.required", "File type is required");
return;
}
String fileExtension = getFileExtension(fileName);
if (fileExtension == null || fileExtension.isBlank()) {
errors.rejectValue("fileName", "fileName.invalid.extension", "File must have an extension");
return;
}
if (fileExtension.contains(".")) {
errors.rejectValue("extension", "extension.required", "Extension contains comma");
return;
}
try {
FileType parsedType = FileType.valueOf(fileType.toUpperCase());
if (!supportedFileTypes.contains(parsedType)) {
errors.rejectValue("fileType", "fileType.unsupported",
"Unsupported file type. Supported types: " + supportedFileTypes);
return;
}
if (!parsedType.supportsExtension(fileExtension)) {
errors.rejectValue("fileName", "fileType.extension.mismatch",
String.format("File extension '%s' does not match file type '%s'. Allowed extensions for %s: %s",
fileExtension, parsedType.getDisplayName(), parsedType.getDisplayName(),
parsedType.getAllowedExtensions()));
}
} catch (IllegalArgumentException e) {
errors.rejectValue("fileType", "fileType.invalid",
"Invalid file type. Valid types: " + Arrays.toString(FileType.values()));
}
}
private String getFileExtension(String fileName) {
if (fileName == null || fileName.lastIndexOf('.') == -1) {
return null;
}
return fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
}
}