diff --git a/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java b/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java index 5f7cf1d..9f09b72 100644 --- a/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java +++ b/src/main/java/ru/soune/nocopy/controller/GlobalSearchController.java @@ -14,6 +14,7 @@ import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.repository.GlobalSearchTaskRepository; import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.search.GlobalSearchService; +import ru.soune.nocopy.service.violation.ViolationService; import java.util.*; @@ -31,6 +32,8 @@ public class GlobalSearchController { private final GlobalSearchTaskRepository searchTaskRepository; + private final ViolationService violationService; + @PostMapping("/start") public ResponseEntity startSearch( @RequestBody GlobalSearchStartRequest request, @@ -101,6 +104,35 @@ public class GlobalSearchController { return ResponseEntity.ok(taskOptional.get()); } + @GetMapping("/violation-summary") + public ResponseEntity getSummary(@RequestHeader(value = "Authorization", required = false) String tokenHeader) { + + if (tokenHeader == null || tokenHeader.isBlank()) { + Map errorData = new HashMap<>(); + errorData.put("token", tokenHeader); + + return ResponseEntity.ok().body(Map.of("error", errorData)); + } + + Map> fileViolationsSummary; + + try { + Long userId = authService.useUserAuthToken(tokenHeader); + + fileViolationsSummary = + violationService.getFileViolationsSummary(userId); + + if (fileViolationsSummary.isEmpty()) return ResponseEntity.ok().body("Violations summary not found"); + } catch (NotFoundAuthToken e) { + Map errorData = new HashMap<>(); + errorData.put("token", tokenHeader); + + return ResponseEntity.ok().body(Map.of("error", errorData)); + } + + return ResponseEntity.ok(fileViolationsSummary); + } + @GetMapping("/status/{taskId}") public ResponseEntity getStatus(@PathVariable String taskId, @RequestHeader(value = "Authorization", required = false) String tokenHeader) { diff --git a/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java b/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java index 585dd38..6f2de2c 100644 --- a/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java @@ -61,8 +61,7 @@ public class ViolationStatisticsHandler implements RequestHandler { userId, statRequest.getFileId(), startDate, - endDate - ); + endDate); return BaseResponse.builder() .msgId(request.getMsgId()) 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 6cff26f..67edda1 100644 --- a/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java +++ b/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java @@ -18,6 +18,7 @@ import ru.soune.nocopy.repository.ViolationRepository; import ru.soune.nocopy.service.file.FileEntityService; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -56,6 +57,31 @@ public class ViolationService { } } + public Map> 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<>(); + + for (Map.Entry> entry : violationsByFileId.entrySet()) { + List fileViolations = entry.getValue(); + + Map info = new HashMap<>(); + info.put("count", fileViolations.size()); + info.put("latestDate", fileViolations.stream() + .map(Violation::getCreatedDate) + .max(LocalDateTime::compareTo) + .orElse(null)); + + result.put(entry.getKey(), info); + } + + return result; + } + public List violationsByFileId(FileEntity file) { return violationRepository.findByFileEntity(file); } @@ -108,19 +134,6 @@ public class ViolationService { )); } - private String extractGroupKey(String url, String groupBy) { - try { - String domain = url.replaceAll("https?://(www\\.)?", "").split("/")[0]; - if ("tld".equalsIgnoreCase(groupBy)) { - int lastDot = domain.lastIndexOf('.'); - return lastDot > 0 ? domain.substring(lastDot + 1) : domain; - } - return domain; - } catch (Exception e) { - return "unknown"; - } - } - public ViolationStatisticsResponse getViolationStatistics(Long userId, String fileId, LocalDateTime startDate, LocalDateTime endDate) { @@ -181,4 +194,18 @@ public class ViolationService { .resolvedViolations(resolvedViolations) .build(); } + + + private String extractGroupKey(String url, String groupBy) { + try { + String domain = url.replaceAll("https?://(www\\.)?", "").split("/")[0]; + if ("tld".equalsIgnoreCase(groupBy)) { + int lastDot = domain.lastIndexOf('.'); + return lastDot > 0 ? domain.substring(lastDot + 1) : domain; + } + return domain; + } catch (Exception e) { + return "unknown"; + } + } } \ No newline at end of file