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
@@ -16,6 +16,7 @@ import ru.soune.nocopy.service.register.AuthService;
import ru.soune.nocopy.service.file.FileEntityService;
import ru.soune.nocopy.service.file.FileStatsService;
import java.time.LocalDate;
import java.util.*;
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) {
try {
Long userId = authService.useUserAuthToken(fileRequest.getToken());
@@ -238,17 +192,16 @@ public class FileEntityHandler implements RequestHandler {
String sortBy = fileRequest.getSortBy() != null ? fileRequest.getSortBy() : "fileName";
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());
String searchQuery = fileRequest.getQuery().toLowerCase().trim();
String searchQuery = fileRequest.getQuery() != null ? fileRequest.getQuery().toLowerCase().trim() : "";
String[] searchTerms = searchQuery.split("\\s+");
String filterType = fileRequest.getType();
String dateFilter = fileRequest.getDateFilter();
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());
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 originalFileName = getSafeString(file.getOriginalFileName());
String mimeType = getSafeString(file.getMimeType());
String fileFormat = getSafeString(file.getFileFormat());
String fullFileName = fileName + " " + originalFileName;
if (fullFileName.toLowerCase().contains(fullQuery)) {
return true;
boolean matchesType = true;
if (type != null && !type.isEmpty()) {
matchesType = matchesMimeType(mimeType, type);
}
for (String term : searchTerms) {
if (term.length() < 2) continue;
if (!matchesType) {
return false;
}
if (fullFileName.toLowerCase().contains(term)) {
if (fullQuery != null && !fullQuery.isEmpty()) {
if (fullFileName.toLowerCase().contains(fullQuery)) {
return true;
}
}
if (fileFormat.toLowerCase().contains(fullQuery)) {
return true;
}
for (String term : searchTerms) {
if (term.length() < 2) continue;
if (fullFileName.toLowerCase().contains(term)) {
return true;
}
}
String fileNameWithExtension = fileName;
if (!fileFormat.isEmpty() && !fileName.toLowerCase().endsWith("." + fileFormat.toLowerCase())) {
fileNameWithExtension = fileName + "." + fileFormat;
if (fileNameWithExtension.toLowerCase().contains(fullQuery)) {
if (fileFormat.toLowerCase().contains(fullQuery)) {
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) {
@@ -341,6 +339,11 @@ public class FileEntityHandler implements RequestHandler {
);
break;
case "fileType":
comparator = Comparator.comparing(
FileEntityResponse::getMimeType);
break;
case "createdAt":
comparator = Comparator.comparing(
FileEntityResponse::getCreatedAt,