dev add violation notion
Test Workflow / test (push) Successful in 5s

This commit is contained in:
vladp
2026-03-20 12:59:03 +07:00
parent ff9c959600
commit 037445dcd5
2 changed files with 77 additions and 68 deletions
@@ -40,4 +40,10 @@ public class FileEntityRequest {
@JsonProperty("sort_order") @JsonProperty("sort_order")
private String sortOrder; private String sortOrder;
@JsonProperty("type")
private String type;
@JsonProperty("date_filter")
private String dateFilter;
} }
@@ -16,6 +16,7 @@ import ru.soune.nocopy.service.register.AuthService;
import ru.soune.nocopy.service.file.FileEntityService; import ru.soune.nocopy.service.file.FileEntityService;
import ru.soune.nocopy.service.file.FileStatsService; import ru.soune.nocopy.service.file.FileStatsService;
import java.time.LocalDate;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -182,53 +183,6 @@ public class FileEntityHandler implements RequestHandler {
} }
} }
// private BaseResponse handleSearchFiles(BaseRequest request, FileEntityRequest fileRequest) {
// try {
// Long userId = authService.useUserAuthToken(fileRequest.getToken());
// int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1;
// int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20;
//
// if (fileRequest.getQuery() == null || fileRequest.getQuery().isBlank()) {
// return handleGetUserFiles(request, fileRequest);
// }
//
// FileResponse allFiles = fileEntityService.getUserFiles(userId, 1, 1000, request.getVersion());
//
// var filteredFiles = allFiles.getFiles().stream()
// .filter(f -> (f.getOriginalFileName() + f.getFileExtension()).toLowerCase()
// .contains(fileRequest.getQuery().toLowerCase()))
// .toList();
//
// int start = (page - 1) * pageSize;
// int end = Math.min(start + pageSize, filteredFiles.size());
// List<FileEntityResponse> fileEntityResponses = filteredFiles.subList(start, Math.min(end, filteredFiles.size()));
// long sumSize = fileEntityResponses.stream()
// .mapToLong(FileEntityResponse::getFileSize)
// .sum();
//
// FileListResponse response = FileListResponse.builder()
// .files(fileEntityResponses)
// .totalCount(filteredFiles.size())
// .totalSize(sumSize)
// .formattedTotalSize(fileEntityService.formatFileSize(sumSize))
// .page(page)
// .pageSize(pageSize)
// .build();
//
// return new BaseResponse(request.getMsgId(),
// MessageCode.SUCCESS.getCode(),
// MessageCode.SUCCESS.getDescription(),
// response);
// } catch (NotFoundAuthToken e) {
// return new BaseResponse(request.getMsgId(), MessageCode.INVALID_TOKEN.getCode(),
// "Authentication required", null);
// } catch (Exception e) {
// log.error("Error searching files", e);
// return new BaseResponse(request.getMsgId(), MessageCode.FILE_UPLOAD_ERROR.getCode(),
// "Failed to search files: " + e.getMessage(), null);
// }
// }
private BaseResponse handleSearchFiles(BaseRequest request, FileEntityRequest fileRequest) { private BaseResponse handleSearchFiles(BaseRequest request, FileEntityRequest fileRequest) {
try { try {
Long userId = authService.useUserAuthToken(fileRequest.getToken()); Long userId = authService.useUserAuthToken(fileRequest.getToken());
@@ -238,17 +192,16 @@ public class FileEntityHandler implements RequestHandler {
String sortBy = fileRequest.getSortBy() != null ? fileRequest.getSortBy() : "fileName"; String sortBy = fileRequest.getSortBy() != null ? fileRequest.getSortBy() : "fileName";
SortOrder sortOrder = SortOrder.fromString(fileRequest.getSortOrder()); SortOrder sortOrder = SortOrder.fromString(fileRequest.getSortOrder());
if (fileRequest.getQuery() == null || fileRequest.getQuery().isBlank()) {
return handleGetUserFilesWithSort(request, fileRequest, sortBy, sortOrder);
}
FileResponse allFiles = fileEntityService.getUserFiles(userId, 1, 1000, request.getVersion()); FileResponse allFiles = fileEntityService.getUserFiles(userId, 1, 1000, request.getVersion());
String searchQuery = fileRequest.getQuery().toLowerCase().trim(); String searchQuery = fileRequest.getQuery() != null ? fileRequest.getQuery().toLowerCase().trim() : "";
String[] searchTerms = searchQuery.split("\\s+"); String[] searchTerms = searchQuery.split("\\s+");
String filterType = fileRequest.getType();
String dateFilter = fileRequest.getDateFilter();
List<FileEntityResponse> filteredFiles = allFiles.getFiles().stream() List<FileEntityResponse> filteredFiles = allFiles.getFiles().stream()
.filter(f -> matchesSearch(f, searchTerms, searchQuery)) .filter(f -> matchesSearch(f, searchTerms, searchQuery, filterType))
.filter(f -> matchesDateFilter(f, dateFilter))
.collect(Collectors.toList()); .collect(Collectors.toList());
Comparator<FileEntityResponse> comparator = getComparator(sortBy, sortOrder); Comparator<FileEntityResponse> comparator = getComparator(sortBy, sortOrder);
@@ -294,37 +247,82 @@ public class FileEntityHandler implements RequestHandler {
} }
} }
private boolean matchesSearch(FileEntityResponse file, String[] searchTerms, String fullQuery) { private boolean matchesDateFilter(FileEntityResponse file, String dateFilter) {
if (dateFilter == null || dateFilter.isEmpty()) {
return true;
}
LocalDate fileDate = file.getCreatedAt().toLocalDate();
LocalDate now = LocalDate.now();
switch (dateFilter.toLowerCase()) {
case "today":
return fileDate.equals(now);
case "week":
return fileDate.isAfter(now.minusWeeks(1)) && !fileDate.isAfter(now);
case "month":
return fileDate.isAfter(now.minusMonths(1)) && !fileDate.isAfter(now);
default:
return true;
}
}
private boolean matchesSearch(FileEntityResponse file, String[] searchTerms, String fullQuery, String type) {
String fileName = getSafeString(file.getFileName()); String fileName = getSafeString(file.getFileName());
String originalFileName = getSafeString(file.getOriginalFileName()); String originalFileName = getSafeString(file.getOriginalFileName());
String mimeType = getSafeString(file.getMimeType());
String fileFormat = getSafeString(file.getFileFormat()); String fileFormat = getSafeString(file.getFileFormat());
String fullFileName = fileName + " " + originalFileName; String fullFileName = fileName + " " + originalFileName;
if (fullFileName.toLowerCase().contains(fullQuery)) { boolean matchesType = true;
return true; if (type != null && !type.isEmpty()) {
matchesType = matchesMimeType(mimeType, type);
} }
for (String term : searchTerms) { if (!matchesType) {
if (term.length() < 2) continue; return false;
}
if (fullFileName.toLowerCase().contains(term)) { if (fullQuery != null && !fullQuery.isEmpty()) {
if (fullFileName.toLowerCase().contains(fullQuery)) {
return true; return true;
} }
}
if (fileFormat.toLowerCase().contains(fullQuery)) { for (String term : searchTerms) {
return true; if (term.length() < 2) continue;
} if (fullFileName.toLowerCase().contains(term)) {
return true;
}
}
String fileNameWithExtension = fileName; if (fileFormat.toLowerCase().contains(fullQuery)) {
if (!fileFormat.isEmpty() && !fileName.toLowerCase().endsWith("." + fileFormat.toLowerCase())) {
fileNameWithExtension = fileName + "." + fileFormat;
if (fileNameWithExtension.toLowerCase().contains(fullQuery)) {
return true; return true;
} }
if (mimeType.toLowerCase().contains(fullQuery)) {
return true;
}
if (!fileFormat.isEmpty() && !fileName.toLowerCase().endsWith("." + fileFormat.toLowerCase())) {
String fileNameWithExtension = fileName + "." + fileFormat;
if (fileNameWithExtension.toLowerCase().contains(fullQuery)) {
return true;
}
}
return false;
} }
return false; return true;
}
private boolean matchesMimeType(String mimeType, String filterType) {
if (filterType == null || filterType.isEmpty()) return true;
String mimeTypeLower = mimeType.toLowerCase();
String filterTypeLower = filterType.toLowerCase().trim();
return mimeTypeLower.equals(filterTypeLower);
} }
private String getSafeString(String value) { private String getSafeString(String value) {
@@ -341,6 +339,11 @@ public class FileEntityHandler implements RequestHandler {
); );
break; break;
case "fileType":
comparator = Comparator.comparing(
FileEntityResponse::getMimeType);
break;
case "createdAt": case "createdAt":
comparator = Comparator.comparing( comparator = Comparator.comparing(
FileEntityResponse::getCreatedAt, FileEntityResponse::getCreatedAt,