@@ -16,9 +16,8 @@ import ru.soune.nocopy.service.register.AuthService;
|
||||
import ru.soune.nocopy.service.file.FileEntityService;
|
||||
import ru.soune.nocopy.service.file.FileStatsService;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@@ -183,53 +182,285 @@ 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());
|
||||
int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1;
|
||||
int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20;
|
||||
|
||||
String sortBy = fileRequest.getSortBy() != null ? fileRequest.getSortBy() : "fileName";
|
||||
SortOrder sortOrder = SortOrder.fromString(fileRequest.getSortOrder());
|
||||
|
||||
if (fileRequest.getQuery() == null || fileRequest.getQuery().isBlank()) {
|
||||
return handleGetUserFiles(request, fileRequest);
|
||||
return handleGetUserFilesWithSort(request, fileRequest, sortBy, sortOrder);
|
||||
}
|
||||
|
||||
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();
|
||||
String searchQuery = fileRequest.getQuery().toLowerCase().trim();
|
||||
String[] searchTerms = searchQuery.split("\\s+");
|
||||
|
||||
List<FileEntityResponse> filteredFiles = allFiles.getFiles().stream()
|
||||
.filter(f -> matchesSearch(f, searchTerms, searchQuery))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Comparator<FileEntityResponse> comparator = getComparator(sortBy, sortOrder);
|
||||
filteredFiles.sort(comparator);
|
||||
|
||||
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()
|
||||
|
||||
if (start >= filteredFiles.size()) {
|
||||
return createEmptyResponse(request, page, pageSize, sortBy, sortOrder.getValue());
|
||||
}
|
||||
|
||||
List<FileEntityResponse> paginatedFiles = filteredFiles.subList(start, end);
|
||||
long totalSize = paginatedFiles.stream()
|
||||
.mapToLong(FileEntityResponse::getFileSize)
|
||||
.sum();
|
||||
|
||||
FileListResponse response = FileListResponse.builder()
|
||||
.files(fileEntityResponses)
|
||||
.files(paginatedFiles)
|
||||
.totalCount(filteredFiles.size())
|
||||
.totalSize(sumSize)
|
||||
.formattedTotalSize(fileEntityService.formatFileSize(sumSize))
|
||||
.totalSize(totalSize)
|
||||
.formattedTotalSize(fileEntityService.formatFileSize(totalSize))
|
||||
.page(page)
|
||||
.pageSize(pageSize)
|
||||
.sortBy(sortBy)
|
||||
.sortOrder(sortOrder.getValue())
|
||||
.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(),
|
||||
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(),
|
||||
return new BaseResponse(request.getMsgId(),
|
||||
MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Failed to search files: " + e.getMessage(), null);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean matchesSearch(FileEntityResponse file, String[] searchTerms, String fullQuery) {
|
||||
String fileName = getSafeString(file.getFileName());
|
||||
String originalFileName = getSafeString(file.getOriginalFileName());
|
||||
String fileFormat = getSafeString(file.getFileFormat());
|
||||
String fullFileName = fileName + " " + originalFileName;
|
||||
|
||||
if (fullFileName.toLowerCase().contains(fullQuery)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (String term : searchTerms) {
|
||||
if (term.length() < 2) continue;
|
||||
|
||||
if (fullFileName.toLowerCase().contains(term)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (fileFormat.toLowerCase().contains(fullQuery)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String fileNameWithExtension = fileName;
|
||||
if (!fileFormat.isEmpty() && !fileName.toLowerCase().endsWith("." + fileFormat.toLowerCase())) {
|
||||
fileNameWithExtension = fileName + "." + fileFormat;
|
||||
if (fileNameWithExtension.toLowerCase().contains(fullQuery)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private String getSafeString(String value) {
|
||||
return value != null ? value : "";
|
||||
}
|
||||
|
||||
private Comparator<FileEntityResponse> getComparator(String sortBy, SortOrder sortOrder) {
|
||||
Comparator<FileEntityResponse> comparator;
|
||||
|
||||
switch (sortBy) {
|
||||
case "fileSize":
|
||||
comparator = Comparator.comparingLong(
|
||||
FileEntityResponse::getFileSize
|
||||
);
|
||||
break;
|
||||
|
||||
case "createdAt":
|
||||
comparator = Comparator.comparing(
|
||||
FileEntityResponse::getCreatedAt,
|
||||
Comparator.nullsLast(Comparator.naturalOrder())
|
||||
);
|
||||
break;
|
||||
|
||||
case "updatedAt":
|
||||
comparator = Comparator.comparing(
|
||||
FileEntityResponse::getUpdatedAt,
|
||||
Comparator.nullsLast(Comparator.naturalOrder())
|
||||
);
|
||||
break;
|
||||
|
||||
case "fileName":
|
||||
comparator = Comparator.comparing(
|
||||
f -> getSafeString(f.getFileName()).toLowerCase(),
|
||||
Comparator.nullsLast(Comparator.naturalOrder())
|
||||
);
|
||||
break;
|
||||
|
||||
case "protectStatus":
|
||||
comparator = Comparator.comparing(
|
||||
f -> getSafeString(f.getProtectStatus()).toLowerCase(),
|
||||
Comparator.nullsLast(Comparator.naturalOrder())
|
||||
);
|
||||
break;
|
||||
|
||||
case "supportId":
|
||||
comparator = Comparator.comparing(
|
||||
FileEntityResponse::getSupportId,
|
||||
Comparator.nullsLast(Comparator.naturalOrder())
|
||||
);
|
||||
break;
|
||||
|
||||
default:
|
||||
comparator = Comparator.comparing(
|
||||
f -> getSafeString(f.getFileName()).toLowerCase(),
|
||||
Comparator.nullsLast(Comparator.naturalOrder())
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
return sortOrder == SortOrder.DESC ? comparator.reversed() : comparator;
|
||||
}
|
||||
|
||||
private BaseResponse createEmptyResponse(BaseRequest request, int page, int pageSize,
|
||||
String sortBy, String sortOrder) {
|
||||
FileListResponse emptyResponse = FileListResponse.builder()
|
||||
.files(Collections.emptyList())
|
||||
.totalCount(0)
|
||||
.totalSize(0L)
|
||||
.formattedTotalSize("0 B")
|
||||
.page(page)
|
||||
.pageSize(pageSize)
|
||||
.sortBy(sortBy)
|
||||
.sortOrder(sortOrder)
|
||||
.build();
|
||||
|
||||
return new BaseResponse(request.getMsgId(),
|
||||
MessageCode.SUCCESS.getCode(),
|
||||
MessageCode.SUCCESS.getDescription(),
|
||||
emptyResponse);
|
||||
}
|
||||
|
||||
private BaseResponse handleGetUserFilesWithSort(BaseRequest request, FileEntityRequest fileRequest,
|
||||
String sortBy, SortOrder sortOrder) {
|
||||
try {
|
||||
Long userId = authService.useUserAuthToken(fileRequest.getToken());
|
||||
int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1;
|
||||
int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20;
|
||||
|
||||
FileResponse allFiles = fileEntityService.getUserFiles(userId, 1, 1000, request.getVersion());
|
||||
|
||||
List<FileEntityResponse> files = new ArrayList<>(allFiles.getFiles());
|
||||
|
||||
Comparator<FileEntityResponse> comparator = getComparator(sortBy, sortOrder);
|
||||
files.sort(comparator);
|
||||
|
||||
int start = (page - 1) * pageSize;
|
||||
int end = Math.min(start + pageSize, files.size());
|
||||
|
||||
if (start >= files.size()) {
|
||||
return createEmptyResponse(request, page, pageSize, sortBy, sortOrder.getValue());
|
||||
}
|
||||
|
||||
List<FileEntityResponse> paginatedFiles = files.subList(start, end);
|
||||
long totalSize = paginatedFiles.stream()
|
||||
.mapToLong(FileEntityResponse::getFileSize)
|
||||
.sum();
|
||||
|
||||
FileListResponse response = FileListResponse.builder()
|
||||
.files(paginatedFiles)
|
||||
.totalCount(files.size())
|
||||
.totalSize(totalSize)
|
||||
.formattedTotalSize(fileEntityService.formatFileSize(totalSize))
|
||||
.page(page)
|
||||
.pageSize(pageSize)
|
||||
.sortBy(sortBy)
|
||||
.sortOrder(sortOrder.getValue())
|
||||
.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 getting user files with sort", e);
|
||||
return new BaseResponse(request.getMsgId(),
|
||||
MessageCode.FILE_UPLOAD_ERROR.getCode(),
|
||||
"Failed to get files: " + e.getMessage(),
|
||||
null);
|
||||
}
|
||||
}
|
||||
|
||||
private BaseResponse handleGetStorageUsage(BaseRequest request, FileEntityRequest fileRequest) {
|
||||
try {
|
||||
Long userId = authService.useUserAuthToken(fileRequest.getToken());
|
||||
|
||||
Reference in New Issue
Block a user