@@ -40,4 +40,10 @@ public class FileEntityRequest {
|
||||
|
||||
@JsonProperty("sort_order")
|
||||
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.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,19 +247,49 @@ 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;
|
||||
|
||||
boolean matchesType = true;
|
||||
if (type != null && !type.isEmpty()) {
|
||||
matchesType = matchesMimeType(mimeType, type);
|
||||
}
|
||||
|
||||
if (!matchesType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fullQuery != null && !fullQuery.isEmpty()) {
|
||||
if (fullFileName.toLowerCase().contains(fullQuery)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (String term : searchTerms) {
|
||||
if (term.length() < 2) continue;
|
||||
|
||||
if (fullFileName.toLowerCase().contains(term)) {
|
||||
return true;
|
||||
}
|
||||
@@ -316,9 +299,12 @@ public class FileEntityHandler implements RequestHandler {
|
||||
return true;
|
||||
}
|
||||
|
||||
String fileNameWithExtension = fileName;
|
||||
if (mimeType.toLowerCase().contains(fullQuery)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!fileFormat.isEmpty() && !fileName.toLowerCase().endsWith("." + fileFormat.toLowerCase())) {
|
||||
fileNameWithExtension = fileName + "." + fileFormat;
|
||||
String fileNameWithExtension = fileName + "." + fileFormat;
|
||||
if (fileNameWithExtension.toLowerCase().contains(fullQuery)) {
|
||||
return true;
|
||||
}
|
||||
@@ -327,6 +313,18 @@ public class FileEntityHandler implements RequestHandler {
|
||||
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) {
|
||||
return value != null ? 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,
|
||||
|
||||
Reference in New Issue
Block a user