@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user