@@ -81,4 +81,10 @@ public class FileEntityRequest {
|
|||||||
|
|
||||||
@JsonProperty("permissions")
|
@JsonProperty("permissions")
|
||||||
private Map<String, Boolean> 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 ru.soune.nocopy.entity.file.permission.PermissionType;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -45,4 +46,5 @@ public class FileEntityResponse {
|
|||||||
private LocalDateTime fileUploadDate;
|
private LocalDateTime fileUploadDate;
|
||||||
private String monitoring;
|
private String monitoring;
|
||||||
private Map<PermissionType, Boolean> permissions;
|
private Map<PermissionType, Boolean> permissions;
|
||||||
|
private List<Map<String, Object>> appealInfos;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,4 +36,7 @@ public class FileListResponse {
|
|||||||
|
|
||||||
@JsonProperty("total_size")
|
@JsonProperty("total_size")
|
||||||
private Long totalSize;
|
private Long totalSize;
|
||||||
|
|
||||||
|
@JsonProperty("statuses")
|
||||||
|
private List<String> statuses;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -283,10 +283,14 @@ public class FileEntityHandler implements RequestHandler {
|
|||||||
String[] searchTerms = searchQuery.split("\\s+");
|
String[] searchTerms = searchQuery.split("\\s+");
|
||||||
String filterType = fileRequest.getType();
|
String filterType = fileRequest.getType();
|
||||||
String dateFilter = fileRequest.getDateFilter();
|
String dateFilter = fileRequest.getDateFilter();
|
||||||
|
List<String> statuses = fileRequest.getStatuses();
|
||||||
|
Boolean isAppeal = fileRequest.getIsAppeal();
|
||||||
|
|
||||||
List<FileEntityResponse> filteredFiles = allFiles.getFiles().stream()
|
List<FileEntityResponse> filteredFiles = allFiles.getFiles().stream()
|
||||||
.filter(f -> matchesSearch(f, searchTerms, searchQuery, filterType))
|
.filter(f -> matchesSearch(f, searchTerms, searchQuery, filterType))
|
||||||
.filter(f -> matchesDateFilter(f, dateFilter))
|
.filter(f -> matchesDateFilter(f, dateFilter))
|
||||||
|
.filter(f -> matchesStatuses(f, statuses))
|
||||||
|
.filter(f -> matchesAppeal(f, isAppeal))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
Comparator<FileEntityResponse> comparator = getComparator(sortBy, sortOrder);
|
Comparator<FileEntityResponse> comparator = getComparator(sortBy, sortOrder);
|
||||||
@@ -313,6 +317,8 @@ public class FileEntityHandler implements RequestHandler {
|
|||||||
.pageSize(pageSize)
|
.pageSize(pageSize)
|
||||||
.sortBy(sortBy)
|
.sortBy(sortBy)
|
||||||
.sortOrder(sortOrder.getValue())
|
.sortOrder(sortOrder.getValue())
|
||||||
|
.statuses(List.of(FileStatus.BLOCKED.name(), FileStatus.ACTIVE.name(),
|
||||||
|
FileStatus.MODERATION.name()))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
return new BaseResponse(request.getMsgId(),
|
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) {
|
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());
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import ru.soune.nocopy.dto.file.FileEntityResponse;
|
import ru.soune.nocopy.dto.file.FileEntityResponse;
|
||||||
import ru.soune.nocopy.dto.file.FileResponse;
|
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.FileEntity;
|
||||||
import ru.soune.nocopy.entity.file.FileStatus;
|
import ru.soune.nocopy.entity.file.FileStatus;
|
||||||
import ru.soune.nocopy.entity.file.ProtectionStatus;
|
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.monitoring.MonitoringType;
|
||||||
import ru.soune.nocopy.entity.user.User;
|
import ru.soune.nocopy.entity.user.User;
|
||||||
import ru.soune.nocopy.exception.FileEntityNotFoundException;
|
import ru.soune.nocopy.exception.FileEntityNotFoundException;
|
||||||
|
import ru.soune.nocopy.repository.FileAppealRepository;
|
||||||
import ru.soune.nocopy.repository.FileEntityRepository;
|
import ru.soune.nocopy.repository.FileEntityRepository;
|
||||||
import ru.soune.nocopy.repository.FileMonitoringRepository;
|
import ru.soune.nocopy.repository.FileMonitoringRepository;
|
||||||
import ru.soune.nocopy.repository.UserRepository;
|
import ru.soune.nocopy.repository.UserRepository;
|
||||||
import ru.soune.nocopy.service.file.cloud.CloudStorageService;
|
import ru.soune.nocopy.service.file.cloud.CloudStorageService;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
@@ -29,9 +32,7 @@ import java.nio.file.Path;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.nio.file.StandardOpenOption;
|
import java.nio.file.StandardOpenOption;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -47,6 +48,8 @@ public class FileEntityService {
|
|||||||
|
|
||||||
private final CloudStorageService cloudStorageService;
|
private final CloudStorageService cloudStorageService;
|
||||||
|
|
||||||
|
private final FileAppealRepository fileAppealRepository;
|
||||||
|
|
||||||
@Value("${server.baseurl}")
|
@Value("${server.baseurl}")
|
||||||
private String baseUrl;
|
private String baseUrl;
|
||||||
|
|
||||||
@@ -387,6 +390,8 @@ public class FileEntityService {
|
|||||||
name = fileName.substring(0, lastDotIndex);
|
name = fileName.substring(0, lastDotIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Map<String, Object>> appeals = getFileAppeals(fileEntity.getId());
|
||||||
|
|
||||||
return FileEntityResponse.builder()
|
return FileEntityResponse.builder()
|
||||||
.id(fileEntity.getId())
|
.id(fileEntity.getId())
|
||||||
.userId(fileEntity.getUserId())
|
.userId(fileEntity.getUserId())
|
||||||
@@ -417,6 +422,30 @@ public class FileEntityService {
|
|||||||
.protectedFilePath(fileEntity.getProtectedFilePath())
|
.protectedFilePath(fileEntity.getProtectedFilePath())
|
||||||
.thumbnailFileUrl(baseUrl + "/api/files/protected/" + fileEntity.getId() + "/thumbnail")
|
.thumbnailFileUrl(baseUrl + "/api/files/protected/" + fileEntity.getId() + "/thumbnail")
|
||||||
.permissions(fileEntity.getPermissions())
|
.permissions(fileEntity.getPermissions())
|
||||||
|
.appealInfos(appeals)
|
||||||
.build();
|
.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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user