2026-01-06 12:50:39 +07:00
|
|
|
package ru.soune.nocopy.service.file;
|
|
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import ru.soune.nocopy.dto.file.FileInfoUserResponse;
|
|
|
|
|
import ru.soune.nocopy.entity.file.FileEntity;
|
|
|
|
|
import ru.soune.nocopy.entity.file.FileStatus;
|
|
|
|
|
import ru.soune.nocopy.entity.file.FileType;
|
2026-01-26 14:02:10 +07:00
|
|
|
import ru.soune.nocopy.entity.file.ProtectionStatus;
|
2026-01-06 12:50:39 +07:00
|
|
|
import ru.soune.nocopy.repository.FileEntityRepository;
|
|
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
public class FileStatsService {
|
|
|
|
|
private final FileEntityRepository fileEntityRepository;
|
|
|
|
|
|
|
|
|
|
public FileInfoUserResponse getUserFileStats(Long userId) {
|
|
|
|
|
List<FileEntity> userFiles = fileEntityRepository.findByUserId(userId);
|
|
|
|
|
return calculateStats(userFiles);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public FileInfoUserResponse calculateStats(List<FileEntity> files) {
|
|
|
|
|
return FileInfoUserResponse.builder()
|
|
|
|
|
.allFileSize(calculateTotalSize(files))
|
|
|
|
|
.fileCount(calculateTotalCount(files))
|
|
|
|
|
.filesCheck(calculateByStatus(files, FileStatus.CHECKED))
|
|
|
|
|
.filesViolation(calculateByStatus(files, FileStatus.VIOLATION))
|
2026-01-26 14:43:57 +07:00
|
|
|
.protectedFilesCount(protectedUserFiles(files))
|
2026-01-06 12:50:39 +07:00
|
|
|
|
|
|
|
|
.imagesSize(calculateMediaSize(files, FileType.IMAGE))
|
|
|
|
|
.imagesCount(calculateMediaCount(files, FileType.IMAGE))
|
|
|
|
|
.imagesCheck(calculateMediaByStatus(files, FileType.IMAGE, FileStatus.CHECKED))
|
|
|
|
|
.imagesViolations(calculateMediaByStatus(files, FileType.IMAGE, FileStatus.VIOLATION))
|
2026-01-26 14:43:57 +07:00
|
|
|
.protectedImageFilesCount(protectedUserFiles(files, FileType.IMAGE))
|
2026-01-06 12:50:39 +07:00
|
|
|
|
|
|
|
|
.videosSize(calculateMediaSize(files, FileType.VIDEO))
|
|
|
|
|
.videosCount(calculateMediaCount(files, FileType.VIDEO))
|
|
|
|
|
.videosCheck(calculateMediaByStatus(files, FileType.VIDEO, FileStatus.CHECKED))
|
|
|
|
|
.videosViolations(calculateMediaByStatus(files, FileType.VIDEO, FileStatus.VIOLATION))
|
2026-01-26 14:43:57 +07:00
|
|
|
.protectedVideoFilesCount(protectedUserFiles(files, FileType.VIDEO))
|
2026-01-06 12:50:39 +07:00
|
|
|
|
|
|
|
|
.audiosSize(calculateMediaSize(files, FileType.AUDIO))
|
|
|
|
|
.audiosCount(calculateMediaCount(files, FileType.AUDIO))
|
|
|
|
|
.audiosCheck(calculateMediaByStatus(files, FileType.AUDIO, FileStatus.CHECKED))
|
|
|
|
|
.audiosViolations(calculateMediaByStatus(files, FileType.AUDIO, FileStatus.VIOLATION))
|
2026-01-26 14:43:57 +07:00
|
|
|
.protectedAudioFilesCount(protectedUserFiles(files, FileType.AUDIO))
|
2026-01-06 12:50:39 +07:00
|
|
|
.build();
|
|
|
|
|
}
|
2026-01-26 14:02:10 +07:00
|
|
|
|
|
|
|
|
private Long protectedUserFiles(List<FileEntity> files) {
|
|
|
|
|
return files.stream().filter(file -> file.getProtectionStatus() == ProtectionStatus.PROTECTED).count();
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-26 14:43:57 +07:00
|
|
|
private Long protectedUserFiles(List<FileEntity> files, FileType type) {
|
2026-01-30 14:24:23 +07:00
|
|
|
return files.stream().filter(file -> file.getStatus() != FileStatus.DELETED &&
|
|
|
|
|
file.getStatus() != FileStatus.TEMP &&
|
|
|
|
|
file.getProtectionStatus() == ProtectionStatus.PROTECTED &&
|
2026-01-26 14:43:57 +07:00
|
|
|
file.getMimeType().equals(type.getDisplayName())).count();
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-06 12:50:39 +07:00
|
|
|
private Long calculateTotalSize(List<FileEntity> files) {
|
|
|
|
|
return files.stream()
|
2026-01-30 12:52:16 +07:00
|
|
|
.filter(file -> file.getStatus() != FileStatus.DELETED && file.getStatus() != FileStatus.TEMP)
|
2026-01-06 12:50:39 +07:00
|
|
|
.mapToLong(FileEntity::getFileSize)
|
|
|
|
|
.sum();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Integer calculateTotalCount(List<FileEntity> files) {
|
|
|
|
|
return (int) files.stream()
|
2026-01-30 12:52:16 +07:00
|
|
|
.filter(file -> file.getStatus() != FileStatus.DELETED && file.getStatus() != FileStatus.TEMP)
|
2026-01-06 12:50:39 +07:00
|
|
|
.count();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Integer calculateByStatus(List<FileEntity> files, FileStatus status) {
|
|
|
|
|
return (int) files.stream()
|
|
|
|
|
.filter(file -> file.getStatus() == status)
|
|
|
|
|
.count();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Long calculateMediaSize(List<FileEntity> files, FileType fileType) {
|
|
|
|
|
return files.stream()
|
2026-01-30 12:52:16 +07:00
|
|
|
.filter(file -> file.getStatus() != FileStatus.DELETED && file.getStatus() != FileStatus.TEMP)
|
2026-01-06 12:50:39 +07:00
|
|
|
.filter(file -> isFileType(file, fileType))
|
|
|
|
|
.mapToLong(FileEntity::getFileSize)
|
|
|
|
|
.sum();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Integer calculateMediaCount(List<FileEntity> files, FileType fileType) {
|
|
|
|
|
return (int) files.stream()
|
2026-01-30 12:52:16 +07:00
|
|
|
.filter(file -> file.getStatus() != FileStatus.DELETED && file.getStatus() != FileStatus.TEMP)
|
2026-01-06 12:50:39 +07:00
|
|
|
.filter(file -> isFileType(file, fileType))
|
|
|
|
|
.count();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Integer calculateMediaByStatus(List<FileEntity> files, FileType fileType, FileStatus status) {
|
|
|
|
|
return (int) files.stream()
|
|
|
|
|
.filter(file -> isFileType(file, fileType))
|
|
|
|
|
.filter(file -> file.getStatus() == status)
|
|
|
|
|
.count();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean isFileType(FileEntity file, FileType fileType) {
|
|
|
|
|
if (file.getFileExtension() == null) return false;
|
|
|
|
|
|
|
|
|
|
String extension = file.getFileExtension().toLowerCase().replace(".", "");
|
|
|
|
|
return fileType.supportsExtension(extension);
|
|
|
|
|
}
|
|
|
|
|
}
|