From db606284cb8b72214bc31195115a8909b6941713 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 2 Jun 2026 13:01:41 +0700 Subject: [PATCH] Add file info public --- .../nocopy/dto/file/FileEntityRequest.java | 6 ++++ .../nocopy/dto/file/FileEntityResponse.java | 2 ++ .../nocopy/dto/file/FileListResponse.java | 3 ++ .../nocopy/handler/FileEntityHandler.java | 22 ++++++++++++ .../service/file/FileEntityService.java | 35 +++++++++++++++++-- 5 files changed, 65 insertions(+), 3 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 7231e63..233b041 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java @@ -81,4 +81,10 @@ public class FileEntityRequest { @JsonProperty("permissions") private Map permissions; + + @JsonProperty("is_appeal") + private Boolean isAppeal; + + @JsonProperty("statuses") + private List statuses; } diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileEntityResponse.java b/src/main/java/ru/soune/nocopy/dto/file/FileEntityResponse.java index ba53ea8..f69d5ed 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileEntityResponse.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileEntityResponse.java @@ -8,6 +8,7 @@ import ru.soune.nocopy.entity.file.FileStatus; import ru.soune.nocopy.entity.file.permission.PermissionType; import java.time.LocalDateTime; +import java.util.List; import java.util.Map; @Data @@ -45,4 +46,5 @@ public class FileEntityResponse { private LocalDateTime fileUploadDate; private String monitoring; private Map permissions; + private List> appealInfos; } diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileListResponse.java b/src/main/java/ru/soune/nocopy/dto/file/FileListResponse.java index acd2b0c..40a2db7 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileListResponse.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileListResponse.java @@ -36,4 +36,7 @@ public class FileListResponse { @JsonProperty("total_size") private Long totalSize; + + @JsonProperty("statuses") + private List statuses; } diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index 265a43b..496a1c3 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -283,10 +283,14 @@ public class FileEntityHandler implements RequestHandler { String[] searchTerms = searchQuery.split("\\s+"); String filterType = fileRequest.getType(); String dateFilter = fileRequest.getDateFilter(); + List statuses = fileRequest.getStatuses(); + Boolean isAppeal = fileRequest.getIsAppeal(); List filteredFiles = allFiles.getFiles().stream() .filter(f -> matchesSearch(f, searchTerms, searchQuery, filterType)) .filter(f -> matchesDateFilter(f, dateFilter)) + .filter(f -> matchesStatuses(f, statuses)) + .filter(f -> matchesAppeal(f, isAppeal)) .collect(Collectors.toList()); Comparator comparator = getComparator(sortBy, sortOrder); @@ -313,6 +317,8 @@ public class FileEntityHandler implements RequestHandler { .pageSize(pageSize) .sortBy(sortBy) .sortOrder(sortOrder.getValue()) + .statuses(List.of(FileStatus.BLOCKED.name(), FileStatus.ACTIVE.name(), + FileStatus.MODERATION.name())) .build(); return new BaseResponse(request.getMsgId(), @@ -352,6 +358,22 @@ public class FileEntityHandler implements RequestHandler { } } + private boolean matchesStatuses(FileEntityResponse file, List statuses) { + if (statuses == null || statuses.isEmpty()) { + return true; + } + + return statuses.contains(file.getStatus().name()); + } + + private boolean matchesAppeal(FileEntityResponse file, Boolean isAppeal) { + if (isAppeal == null) { + return true; + } + + return !file.getAppealInfos().isEmpty() == isAppeal; + } + private boolean matchesSearch(FileEntityResponse file, String[] searchTerms, String fullQuery, String type) { String fileName = getSafeString(file.getFileName()); String originalFileName = getSafeString(file.getOriginalFileName()); diff --git a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java index 674f248..b3051df 100644 --- a/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java +++ b/src/main/java/ru/soune/nocopy/service/file/FileEntityService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.soune.nocopy.dto.file.FileEntityResponse; import ru.soune.nocopy.dto.file.FileResponse; +import ru.soune.nocopy.entity.file.FileAppeal; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileStatus; import ru.soune.nocopy.entity.file.ProtectionStatus; @@ -16,11 +17,13 @@ import ru.soune.nocopy.entity.monitoring.FileMonitoringEntity; import ru.soune.nocopy.entity.monitoring.MonitoringType; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.exception.FileEntityNotFoundException; +import ru.soune.nocopy.repository.FileAppealRepository; import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.repository.FileMonitoringRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.file.cloud.CloudStorageService; +import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; @@ -29,9 +32,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -47,6 +48,8 @@ public class FileEntityService { private final CloudStorageService cloudStorageService; + private final FileAppealRepository fileAppealRepository; + @Value("${server.baseurl}") private String baseUrl; @@ -387,6 +390,8 @@ public class FileEntityService { name = fileName.substring(0, lastDotIndex); } + List> appeals = getFileAppeals(fileEntity.getId()); + return FileEntityResponse.builder() .id(fileEntity.getId()) .userId(fileEntity.getUserId()) @@ -417,6 +422,30 @@ public class FileEntityService { .protectedFilePath(fileEntity.getProtectedFilePath()) .thumbnailFileUrl(baseUrl + "/api/files/protected/" + fileEntity.getId() + "/thumbnail") .permissions(fileEntity.getPermissions()) + .appealInfos(appeals) .build(); } + + private List> getFileAppeals(String fileId) { + List appeals = fileAppealRepository.findByFileId(fileId); + if (appeals == null || appeals.isEmpty()) { + return Collections.emptyList(); + } + + return appeals.stream() + .map(appeal -> { + Map appealMap = new HashMap<>(); + appealMap.put("id", appeal.getId()); + appealMap.put("userId", appeal.getUserId()); + appealMap.put("appealReason", appeal.getAppealReason()); + appealMap.put("additionalInfo", appeal.getAdditionalInfo()); + appealMap.put("status", appeal.getStatus() != null ? appeal.getStatus().name() : null); + appealMap.put("adminComment", appeal.getAdminComment()); + appealMap.put("moderatorId", appeal.getModeratorId()); + appealMap.put("createdAt", appeal.getCreatedAt()); + appealMap.put("resolvedAt", appeal.getResolvedAt()); + return appealMap; + }) + .collect(Collectors.toList()); + } } \ No newline at end of file