diff --git a/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsResponse.java b/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsResponse.java index 64d143c..fa36d39 100644 --- a/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsResponse.java +++ b/src/main/java/ru/soune/nocopy/dto/violation/ViolationStatisticsResponse.java @@ -14,6 +14,12 @@ public class ViolationStatisticsResponse { @JsonProperty("new_violations") private long newViolations; + @JsonProperty("total_complaints") + private int totalComplaints; + + @JsonProperty("total_law_cases") + private int totalLawCases; + @JsonProperty("in_progress_violations") private long inProgressViolations; diff --git a/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java index b1db235..2c0a522 100644 --- a/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java @@ -41,6 +41,9 @@ public interface ComplaintEntityRepository extends JpaRepository violations); + @Query("SELECT c FROM ComplaintEntity c WHERE c.email IN :emails") Page getComplaintsByUserEmails(@Param("emails") List emails, Pageable pageable); } diff --git a/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java b/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java index 0bf4fea..b0aa1d8 100644 --- a/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java @@ -44,5 +44,8 @@ public interface LawCaseRepository extends JpaRepository { @Query("SELECT COUNT(lc.id) FROM LawCase lc") Long getTotalLawCasesCount(); + @Query("SELECT COUNT(*) FROM LawCase l WHERE l.violationId IN :violationIds") + int countLawCaseByViolationIds(@Param("violationIds") List violationIds); + Optional getLawCaseByViolationIdAndType(Long violationId, LawCaseType type); } diff --git a/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java b/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java index b52655b..c839c53 100644 --- a/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java +++ b/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java @@ -2,19 +2,19 @@ package ru.soune.nocopy.service.violation; import lombok.AllArgsConstructor; import org.apache.commons.codec.digest.DigestUtils; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; +import org.springframework.data.domain.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.soune.nocopy.dto.file.YandexSearchResponse; import ru.soune.nocopy.dto.violation.FileViolationSummaryDTO; import ru.soune.nocopy.dto.violation.ViolationStatisticsResponse; import ru.soune.nocopy.entity.file.FileEntity; +import ru.soune.nocopy.entity.file.FileStatus; import ru.soune.nocopy.entity.search.GlobalSearchResult; import ru.soune.nocopy.entity.violation.Violation; +import ru.soune.nocopy.repository.ComplaintEntityRepository; import ru.soune.nocopy.repository.FileEntityRepository; +import ru.soune.nocopy.repository.LawCaseRepository; import ru.soune.nocopy.repository.ViolationRepository; import ru.soune.nocopy.service.file.FileEntityService; @@ -32,6 +32,10 @@ public class ViolationService { private final FileEntityService fileEntityService; + private final ComplaintEntityRepository complaintRepository; + + private final LawCaseRepository lawCaseRepository; + public void processViolation(YandexSearchResponse.ImageResult imageResult, FileEntity file, GlobalSearchResult result) { String url = imageResult.getUrl(); @@ -61,22 +65,26 @@ public class ViolationService { return violationRepository.findById(violationId).orElse(null); } - public List getFileViolationsSummary(Long userId) { - List userFiles = fileEntityService.getAllUserFiles(userId); - List violations = violationRepository.findByFileEntityInAndStatusNot(userFiles, - ViolationStatus.NOT_OWNER_FILE.name()); + public Page getFileViolationsSummary(Long userId, String fileName, String sortDirection, Integer page, + Integer size, LocalDateTime start, LocalDateTime end) { + List userFiles = fileName == null || fileName.isEmpty() ? fileEntityService.getAllUserFiles(userId) + : fileEntityService.getAllUserFilesWithFileName(userId, fileName, + List.of(FileStatus.ACTIVE, FileStatus.BLOCKED, FileStatus.MODERATION)); - Map> violationsByFileId = violations.stream() + Sort sort = Sort.by(sortDirection.equalsIgnoreCase("desc") ? Sort.Direction.DESC : Sort.Direction.ASC, + "createdDate"); + Pageable pageable = PageRequest.of(page, size, sort); + + Page violations = violationRepository.findByFileEntityInAndStatusNotAndCreatedDateBetween( + userFiles, ViolationStatus.NOT_OWNER_FILE.name(), start, end, pageable); + + Map> violationsByFileId = violations.getContent().stream() .collect(Collectors.groupingBy(v -> v.getFileEntity().getId())); - return userFiles.stream() - .map(file -> { - List fileViolations = violationsByFileId.getOrDefault(file.getId(), - Collections.emptyList()); - - if (fileViolations.isEmpty()) { - return null; - } + List dtoList = violationsByFileId.entrySet().stream() + .map(entry -> { + List fileViolations = entry.getValue(); + FileEntity file = fileViolations.get(0).getFileEntity(); LocalDateTime latestDate = fileViolations.stream() .map(Violation::getCreatedDate) @@ -95,8 +103,9 @@ public class ViolationService { .latestViolationDate(latestDate) .build(); }) - .filter(Objects::nonNull) .collect(Collectors.toList()); + + return new PageImpl<>(dtoList, pageable, violations.getTotalElements()); } @Transactional @@ -226,11 +235,19 @@ public class ViolationService { .filter(v -> v.getStatus().equals(ViolationStatus.AUTHORIZED_USE.name())) .count(); + List violationIds = violations.stream().map(Violation::getId).toList(); + + int totalComplaints = complaintRepository.countComplaintByViolations(violationIds); + + int totalLawCases = lawCaseRepository.countLawCaseByViolationIds(violationIds); + return ViolationStatisticsResponse.builder() .totalViolations(violations.size()) .newViolations(newViolations) .inProgressViolations(inProgressViolations) .resolvedViolations(resolvedViolations) + .totalComplaints(totalComplaints) + .totalLawCases(totalLawCases) .build(); }