diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileInfoUserResponse.java b/src/main/java/ru/soune/nocopy/dto/file/FileInfoUserResponse.java new file mode 100644 index 0000000..8b2f932 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/file/FileInfoUserResponse.java @@ -0,0 +1,61 @@ +package ru.soune.nocopy.dto.file; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileInfoUserResponse { + @JsonProperty("all_files_size") + private Long allFileSize; + + @JsonProperty("all_files_quantity") + private Integer fileCount; + + @JsonProperty("all_files_check") + private Integer filesCheck; + + @JsonProperty("all_files_violation") + private Integer filesViolation; + + @JsonProperty("images_size") + private Long imagesSize; + + @JsonProperty("images_quantity") + private Integer imagesCount; + + @JsonProperty("images_check") + private Integer imagesCheck; + + @JsonProperty("images_violations") + private Integer imagesViolations; + + @JsonProperty("videos_size") + private Long videosSize; + + @JsonProperty("videos_quantity") + private Integer videosCount; + + @JsonProperty("videos_check") + private Integer videosCheck; + + @JsonProperty("videos_violations") + private Integer videosViolations; + + @JsonProperty("audios_size") + private Long audiosSize; + + @JsonProperty("audios_quantity") + private Integer audiosCount; + + @JsonProperty("audios_check") + private Integer audiosCheck; + + @JsonProperty("audios_violations") + private Integer audiosViolations; +} diff --git a/src/main/java/ru/soune/nocopy/entity/file/FileStatus.java b/src/main/java/ru/soune/nocopy/entity/file/FileStatus.java index 8e96247..b0b2351 100644 --- a/src/main/java/ru/soune/nocopy/entity/file/FileStatus.java +++ b/src/main/java/ru/soune/nocopy/entity/file/FileStatus.java @@ -4,5 +4,7 @@ public enum FileStatus { ACTIVE, DELETED, PROCESSING, + VIOLATION, + CHECKED, ERROR } diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index 968a3b7..9bddff0 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -9,11 +9,13 @@ import ru.soune.nocopy.dto.file.*; import ru.soune.nocopy.entity.AuthToken; 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.exception.FileEntityNotFoundException; import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.service.file.FileEntityService; +import ru.soune.nocopy.service.file.FileStatsService; import java.util.Arrays; import java.util.List; @@ -22,8 +24,11 @@ import java.util.List; @Component @RequiredArgsConstructor public class FileEntityHandler implements RequestHandler { + private final FileEntityService fileEntityService; + private final FileStatsService fileStatsService; + private final AuthTokenRepository authTokenRepository; private final ObjectMapper objectMapper; @@ -41,6 +46,8 @@ public class FileEntityHandler implements RequestHandler { switch (action) { case "file_info": return handleGetFileInfo(request, fileRequest); + case "user_files_info": + return handleGetFilesUserInfo(request, fileRequest); case "file_by_session": return handleGetFileBySession(request, fileRequest); case "user_files": @@ -73,6 +80,16 @@ public class FileEntityHandler implements RequestHandler { } } + private BaseResponse handleGetFilesUserInfo(BaseRequest request, FileEntityRequest fileRequest) { + Long userId = getUserIdFromToken(fileRequest.getToken()); + FileInfoUserResponse userFileStats = fileStatsService.getUserFileStats(userId); + + return new BaseResponse(request.getMsgId(), + MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), + userFileStats); + } + private BaseResponse handleGetFileInfo(BaseRequest request, FileEntityRequest fileRequest) { try { Long userId = getUserIdFromToken(fileRequest.getToken()); diff --git a/src/main/java/ru/soune/nocopy/service/file/FileStatsService.java b/src/main/java/ru/soune/nocopy/service/file/FileStatsService.java new file mode 100644 index 0000000..a32f04d --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/file/FileStatsService.java @@ -0,0 +1,93 @@ +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.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)) + .build(); + } + 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); + } +}