dev add vio
Test Workflow / test (push) Successful in 2s

This commit is contained in:
vladp
2026-03-13 13:55:10 +07:00
parent 507947d6a6
commit bffdf17717
4 changed files with 80 additions and 15 deletions
@@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*;
import ru.soune.nocopy.dto.search.GlobalSearchStartRequest; import ru.soune.nocopy.dto.search.GlobalSearchStartRequest;
import ru.soune.nocopy.dto.search.GlobalSearchStartResponse; import ru.soune.nocopy.dto.search.GlobalSearchStartResponse;
import ru.soune.nocopy.dto.search.GlobalSearchStatusResponse; 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.file.FileEntity;
import ru.soune.nocopy.entity.search.GlobalSearchTask; import ru.soune.nocopy.entity.search.GlobalSearchTask;
import ru.soune.nocopy.entity.search.SearchStatus; import ru.soune.nocopy.entity.search.SearchStatus;
@@ -114,7 +115,7 @@ public class GlobalSearchController {
return ResponseEntity.ok().body(Map.of("error", errorData)); return ResponseEntity.ok().body(Map.of("error", errorData));
} }
Map<String, Map<String, Object>> fileViolationsSummary; List<FileViolationSummaryDTO> fileViolationsSummary;
try { try {
Long userId = authService.useUserAuthToken(tokenHeader); Long userId = authService.useUserAuthToken(tokenHeader);
@@ -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<ViolationInfoDTO> violations;
}
@@ -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;
}
@@ -8,6 +8,8 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.soune.nocopy.dto.file.YandexSearchResponse; 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.dto.violation.ViolationStatisticsResponse;
import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.file.FileEntity;
import ru.soune.nocopy.entity.search.GlobalSearchResult; 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 ru.soune.nocopy.service.file.FileEntityService;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -57,29 +60,49 @@ public class ViolationService {
} }
} }
public Map<String, Map<String, Object>> getFileViolationsSummary(Long userId) { public List<FileViolationSummaryDTO> getFileViolationsSummary(Long userId) {
List<FileEntity> userFiles = fileEntityService.getAllUserFiles(userId); List<FileEntity> userFiles = fileEntityService.getAllUserFiles(userId);
List<Violation> violations = violationRepository.findByFileEntityIn(userFiles); List<Violation> violations = violationRepository.findByFileEntityIn(userFiles);
Map<String, List<Violation>> violationsByFileId = violations.stream() Map<String, List<Violation>> violationsByFileId = violations.stream()
.collect(Collectors.groupingBy(v -> v.getFileEntity().getId())); .collect(Collectors.groupingBy(v -> v.getFileEntity().getId()));
Map<String, Map<String, Object>> result = new HashMap<>(); return userFiles.stream()
.map(file -> {
List<Violation> fileViolations = violationsByFileId.getOrDefault(file.getId(),
Collections.emptyList());
for (Map.Entry<String, List<Violation>> entry : violationsByFileId.entrySet()) { List<ViolationInfoDTO> violationDtos = fileViolations.stream()
List<Violation> fileViolations = entry.getValue(); .map(v -> ViolationInfoDTO.builder()
.violationId(v.getId())
.url(v.getUrl())
.pageUrl(v.getPageUrl())
.host(v.getHost())
.createdDate(v.getCreatedDate())
.build())
.collect(Collectors.toList());
Map<String, Object> info = new HashMap<>(); LocalDateTime latestDate = fileViolations.stream()
info.put("count", fileViolations.size()); .map(Violation::getCreatedDate)
info.put("latestDate", fileViolations.stream() .max(LocalDateTime::compareTo)
.map(Violation::getCreatedDate) .orElse(null);
.max(LocalDateTime::compareTo)
.orElse(null));
result.put(entry.getKey(), info); return FileViolationSummaryDTO.builder()
} .fileId(file.getId())
.supportId(file.getSupportId())
return result; .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<Violation> violationsByFileId(FileEntity file) { public List<Violation> violationsByFileId(FileEntity file) {