From bffdf177170805de34862c93171567485b6d0015 Mon Sep 17 00:00:00 2001 From: vladp Date: Fri, 13 Mar 2026 13:55:10 +0700 Subject: [PATCH] dev add vio --- .../controller/GlobalSearchController.java | 3 +- .../violation/FileViolationSummaryDTO.java | 25 +++++++++ .../dto/violation/ViolationInfoDTO.java | 16 ++++++ .../service/violation/ViolationService.java | 51 ++++++++++++++----- 4 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ru/soune/nocopy/dto/violation/FileViolationSummaryDTO.java create mode 100644 src/main/java/ru/soune/nocopy/dto/violation/ViolationInfoDTO.java diff --git a/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java b/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java index 9f09b72..2765f28 100644 --- a/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java +++ b/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*; import ru.soune.nocopy.dto.search.GlobalSearchStartRequest; import ru.soune.nocopy.dto.search.GlobalSearchStartResponse; import ru.soune.nocopy.dto.search.GlobalSearchStatusResponse; +import ru.soune.nocopy.dto.violation.FileViolationSummaryDTO; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.search.GlobalSearchTask; import ru.soune.nocopy.entity.search.SearchStatus; @@ -114,7 +115,7 @@ public class GlobalSearchController { return ResponseEntity.ok().body(Map.of("error", errorData)); } - Map> fileViolationsSummary; + List fileViolationsSummary; try { Long userId = authService.useUserAuthToken(tokenHeader); diff --git a/src/main/java/ru/soune/nocopy/dto/violation/FileViolationSummaryDTO.java b/src/main/java/ru/soune/nocopy/dto/violation/FileViolationSummaryDTO.java new file mode 100644 index 0000000..77d713d --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/violation/FileViolationSummaryDTO.java @@ -0,0 +1,25 @@ +package ru.soune.nocopy.dto.violation; + +import lombok.Builder; +import lombok.Data; +import ru.soune.nocopy.entity.file.FileStatus; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@Builder +public class FileViolationSummaryDTO { + private String fileId; + private Integer supportId; + private String fileName; + private String storedFileName; + private String filePath; + private Long fileSize; + private String mimeType; + private FileStatus status; + private LocalDateTime createdAt; + private long violationCount; + private LocalDateTime latestViolationDate; + private List violations; +} diff --git a/src/main/java/ru/soune/nocopy/dto/violation/ViolationInfoDTO.java b/src/main/java/ru/soune/nocopy/dto/violation/ViolationInfoDTO.java new file mode 100644 index 0000000..fa6ee64 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/violation/ViolationInfoDTO.java @@ -0,0 +1,16 @@ +package ru.soune.nocopy.dto.violation; + +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Builder +public class ViolationInfoDTO { + private Long violationId; + private String url; + private String pageUrl; + private String host; + private LocalDateTime createdDate; +} 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 67edda1..ddf3b2d 100644 --- a/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java +++ b/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java @@ -8,6 +8,8 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import ru.soune.nocopy.dto.file.YandexSearchResponse; +import ru.soune.nocopy.dto.violation.FileViolationSummaryDTO; +import ru.soune.nocopy.dto.violation.ViolationInfoDTO; import ru.soune.nocopy.dto.violation.ViolationStatisticsResponse; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.search.GlobalSearchResult; @@ -18,6 +20,7 @@ import ru.soune.nocopy.repository.ViolationRepository; import ru.soune.nocopy.service.file.FileEntityService; import java.time.LocalDateTime; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -57,29 +60,49 @@ public class ViolationService { } } - public Map> getFileViolationsSummary(Long userId) { + public List getFileViolationsSummary(Long userId) { List userFiles = fileEntityService.getAllUserFiles(userId); List violations = violationRepository.findByFileEntityIn(userFiles); Map> violationsByFileId = violations.stream() .collect(Collectors.groupingBy(v -> v.getFileEntity().getId())); - Map> result = new HashMap<>(); + return userFiles.stream() + .map(file -> { + List fileViolations = violationsByFileId.getOrDefault(file.getId(), + Collections.emptyList()); - for (Map.Entry> entry : violationsByFileId.entrySet()) { - List fileViolations = entry.getValue(); + List violationDtos = fileViolations.stream() + .map(v -> ViolationInfoDTO.builder() + .violationId(v.getId()) + .url(v.getUrl()) + .pageUrl(v.getPageUrl()) + .host(v.getHost()) + .createdDate(v.getCreatedDate()) + .build()) + .collect(Collectors.toList()); - Map info = new HashMap<>(); - info.put("count", fileViolations.size()); - info.put("latestDate", fileViolations.stream() - .map(Violation::getCreatedDate) - .max(LocalDateTime::compareTo) - .orElse(null)); + LocalDateTime latestDate = fileViolations.stream() + .map(Violation::getCreatedDate) + .max(LocalDateTime::compareTo) + .orElse(null); - result.put(entry.getKey(), info); - } - - return result; + return FileViolationSummaryDTO.builder() + .fileId(file.getId()) + .supportId(file.getSupportId()) + .fileName(file.getOriginalFileName()) + .storedFileName(file.getStoredFileName()) + .filePath(file.getFilePath()) + .fileSize(file.getFileSize()) + .mimeType(file.getMimeType()) + .status(file.getStatus()) + .createdAt(file.getCreatedAt()) + .violationCount(fileViolations.size()) + .latestViolationDate(latestDate) + .violations(violationDtos) + .build(); + }) + .collect(Collectors.toList()); } public List violationsByFileId(FileEntity file) {