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; import ru.soune.nocopy.entity.file.ProtectionStatus; 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 userFiles = fileEntityRepository.findByUserId(userId); return calculateStats(userFiles); } public FileInfoUserResponse calculateStats(List files) { return FileInfoUserResponse.builder() .allFileSize(calculateTotalSize(files)) .fileCount(calculateTotalCount(files)) .filesCheck(calculateByStatus(files, FileStatus.CHECKED)) .filesViolation(calculateByStatus(files, FileStatus.VIOLATION)) .imagesSize(calculateMediaSize(files, FileType.IMAGE)) .imagesCount(calculateMediaCount(files, FileType.IMAGE)) .imagesCheck(calculateMediaByStatus(files, FileType.IMAGE, FileStatus.CHECKED)) .imagesViolations(calculateMediaByStatus(files, FileType.IMAGE, FileStatus.VIOLATION)) .videosSize(calculateMediaSize(files, FileType.VIDEO)) .videosCount(calculateMediaCount(files, FileType.VIDEO)) .videosCheck(calculateMediaByStatus(files, FileType.VIDEO, FileStatus.CHECKED)) .videosViolations(calculateMediaByStatus(files, FileType.VIDEO, FileStatus.VIOLATION)) .audiosSize(calculateMediaSize(files, FileType.AUDIO)) .audiosCount(calculateMediaCount(files, FileType.AUDIO)) .audiosCheck(calculateMediaByStatus(files, FileType.AUDIO, FileStatus.CHECKED)) .audiosViolations(calculateMediaByStatus(files, FileType.AUDIO, FileStatus.VIOLATION)) .protectedFilesCount(protectedUserFiles(files)) .build(); } private Long protectedUserFiles(List files) { return files.stream().filter(file -> file.getProtectionStatus() == ProtectionStatus.PROTECTED).count(); } private Long calculateTotalSize(List files) { return files.stream() .filter(file -> file.getStatus() != FileStatus.DELETED) .mapToLong(FileEntity::getFileSize) .sum(); } private Integer calculateTotalCount(List files) { return (int) files.stream() .filter(file -> file.getStatus() != FileStatus.DELETED) .count(); } private Integer calculateByStatus(List files, FileStatus status) { return (int) files.stream() .filter(file -> file.getStatus() == status) .count(); } private Long calculateMediaSize(List files, FileType fileType) { return files.stream() .filter(file -> file.getStatus() != FileStatus.DELETED) .filter(file -> isFileType(file, fileType)) .mapToLong(FileEntity::getFileSize) .sum(); } private Integer calculateMediaCount(List files, FileType fileType) { return (int) files.stream() .filter(file -> file.getStatus() != FileStatus.DELETED) .filter(file -> isFileType(file, fileType)) .count(); } private Integer calculateMediaByStatus(List 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); } }