Add file info public
Test Workflow / test (push) Has been cancelled

This commit is contained in:
2026-06-02 13:01:41 +07:00
parent de32f9b4d1
commit db606284cb
5 changed files with 65 additions and 3 deletions
@@ -81,4 +81,10 @@ public class FileEntityRequest {
@JsonProperty("permissions")
private Map<String, Boolean> permissions;
@JsonProperty("is_appeal")
private Boolean isAppeal;
@JsonProperty("statuses")
private List<String> statuses;
}
@@ -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<PermissionType, Boolean> permissions;
private List<Map<String, Object>> appealInfos;
}
@@ -36,4 +36,7 @@ public class FileListResponse {
@JsonProperty("total_size")
private Long totalSize;
@JsonProperty("statuses")
private List<String> statuses;
}
@@ -283,10 +283,14 @@ public class FileEntityHandler implements RequestHandler {
String[] searchTerms = searchQuery.split("\\s+");
String filterType = fileRequest.getType();
String dateFilter = fileRequest.getDateFilter();
List<String> statuses = fileRequest.getStatuses();
Boolean isAppeal = fileRequest.getIsAppeal();
List<FileEntityResponse> 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<FileEntityResponse> 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<String> 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());
@@ -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<Map<String, Object>> 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<Map<String, Object>> getFileAppeals(String fileId) {
List<FileAppeal> appeals = fileAppealRepository.findByFileId(fileId);
if (appeals == null || appeals.isEmpty()) {
return Collections.emptyList();
}
return appeals.stream()
.map(appeal -> {
Map<String, Object> 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());
}
}