From 037445dcd591deb4cdeb09751eb18d8872cc282a Mon Sep 17 00:00:00 2001 From: vladp Date: Fri, 20 Mar 2026 12:59:03 +0700 Subject: [PATCH] dev add violation notion --- .../nocopy/dto/file/FileEntityRequest.java | 6 + .../nocopy/handler/FileEntityHandler.java | 139 +++++++++--------- 2 files changed, 77 insertions(+), 68 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java index 50fadd5..c21f7b4 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java @@ -40,4 +40,10 @@ public class FileEntityRequest { @JsonProperty("sort_order") private String sortOrder; + + @JsonProperty("type") + private String type; + + @JsonProperty("date_filter") + private String dateFilter; } diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index b6e9202..210b5c6 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -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 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 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 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,