From 02b8d3ee6d275e12c2d191c93bd62e2e0151e56e Mon Sep 17 00:00:00 2001 From: vladp Date: Wed, 18 Mar 2026 17:07:44 +0700 Subject: [PATCH] dev add violation notion --- .../dto/violation/ViolationRequest.java | 3 ++ .../nocopy/handler/ViolationHandler.java | 45 +++++++++++-------- .../repository/ViolationRepository.java | 12 +++++ .../service/violation/ViolationService.java | 41 ++++++++++++++++- 4 files changed, 82 insertions(+), 19 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java b/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java index 97cdbd2..5c7a2d5 100644 --- a/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/violation/ViolationRequest.java @@ -33,4 +33,7 @@ public class ViolationRequest { @JsonProperty("action") private String action; + + @JsonProperty("token") + private String token; } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java b/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java index 8728e89..02fd0a6 100644 --- a/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ViolationHandler.java @@ -12,6 +12,8 @@ import ru.soune.nocopy.dto.violation.ViolationResponse; import ru.soune.nocopy.entity.file.FileEntity; import ru.soune.nocopy.entity.violation.Violation; import ru.soune.nocopy.repository.FileEntityRepository; +import ru.soune.nocopy.service.file.FileEntityService; +import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.violation.ViolationService; import java.io.FileNotFoundException; @@ -31,6 +33,10 @@ public class ViolationHandler implements RequestHandler { private final FileEntityRepository fileRepository; + private final AuthService authService; + + private final FileEntityService fileEntityService; + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override @@ -38,9 +44,19 @@ public class ViolationHandler implements RequestHandler { ViolationRequest violationRequest = objectMapper.convertValue(request.getMessageBody(), ViolationRequest.class); validateRequest(violationRequest); - //TODO add response - FileEntity file = fileRepository.findById(violationRequest.getFileId()) - .orElseThrow(() -> new FileNotFoundException("File not found with id: " + violationRequest.getFileId())); + + String token = violationRequest.getToken(); + Long userId = authService.useUserAuthToken(token); + + List targetFiles; + + if (violationRequest.getFileId() != null && !violationRequest.getFileId().isEmpty()) { + FileEntity file = fileRepository.findById(violationRequest.getFileId()) + .orElseThrow(() -> new FileNotFoundException("File not found with id: " + violationRequest.getFileId())); + targetFiles = List.of(file); + } else { + targetFiles = fileEntityService.getAllUserFiles(userId); + } LocalDateTime startDate = null; LocalDateTime endDate = null; @@ -52,12 +68,11 @@ public class ViolationHandler implements RequestHandler { if ("group".equalsIgnoreCase(violationRequest.getAction())) { Map groupedData = violationService.getGroupedViolations( - file, + targetFiles, violationRequest.getGroupBy(), violationRequest.getStatus(), startDate, - endDate - ); + endDate); return BaseResponse.builder() .msgId(request.getMsgId()) @@ -67,18 +82,18 @@ public class ViolationHandler implements RequestHandler { Page violationPage; if (startDate != null && endDate != null) { - violationPage = violationService.getViolationsByFileAndDateRange( - file, startDate, endDate, + violationPage = violationService.getViolationsByFilesAndDateRange( + targetFiles, startDate, endDate, violationRequest.getPage(), violationRequest.getSize(), violationRequest.getSortDirection() ); } else if (violationRequest.getStatus() != null && !violationRequest.getStatus().isEmpty()) { - violationPage = violationService.getViolationsByFileAndStatus( - file, violationRequest.getStatus(), + violationPage = violationService.getViolationsByFilesAndStatus( + targetFiles, violationRequest.getStatus(), violationRequest.getPage(), violationRequest.getSize(), violationRequest.getSortDirection() ); } else { - violationPage = violationService.getViolationsByFile( - file, + violationPage = violationService.getViolationsByFiles( + targetFiles, violationRequest.getPage(), violationRequest.getSize(), violationRequest.getSortDirection() ); } @@ -105,12 +120,7 @@ public class ViolationHandler implements RequestHandler { } } - //TODO add response exception private void validateRequest(ViolationRequest request) { - if (request.getFileId() == null) { - return; - } - if (request.getPage() < 0) { request.setPage(0); } @@ -125,7 +135,6 @@ public class ViolationHandler implements RequestHandler { } } - //TODO add response exception private LocalDateTime parseDate(String dateStr) { try { return LocalDateTime.parse(dateStr, DATE_FORMATTER); diff --git a/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java b/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java index 942b31c..25d7baa 100644 --- a/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/ViolationRepository.java @@ -41,6 +41,18 @@ public interface ViolationRepository extends JpaRepository { List findByFileEntityIn(List files); + Page findByFileEntityIn(List files, Pageable pageable); + + Page findByFileEntityInAndStatus(List files, String status, Pageable pageable); + + List findByFileEntityInAndStatus(List files, String status); + + Page findByFileEntityInAndCreatedDateBetween(List files, LocalDateTime startDate, + LocalDateTime endDate, Pageable pageable); + + List findByFileEntityInAndStatusAndCreatedDateBetween(List files, String status, + LocalDateTime startDate, LocalDateTime endDate); + List findByFileEntityInAndCreatedDateBetween(List files, LocalDateTime startDate, LocalDateTime endDate); 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 faa80ff..da47a62 100644 --- a/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java +++ b/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java @@ -146,6 +146,46 @@ public class ViolationService { )); } + public Page getViolationsByFiles(List files, int page, int size, String sortDirection) { + Sort sort = Sort.by(sortDirection.equalsIgnoreCase("desc") ? Sort.Direction.DESC : Sort.Direction.ASC, "createdDate"); + Pageable pageable = PageRequest.of(page, size, sort); + return violationRepository.findByFileEntityIn(files, pageable); + } + + public Page getViolationsByFilesAndStatus(List files, String status, int page, int size, String sortDirection) { + Sort sort = Sort.by(sortDirection.equalsIgnoreCase("desc") ? Sort.Direction.DESC : Sort.Direction.ASC, "createdDate"); + Pageable pageable = PageRequest.of(page, size, sort); + return violationRepository.findByFileEntityInAndStatus(files, status, pageable); + } + + public Page getViolationsByFilesAndDateRange(List files, LocalDateTime startDate, LocalDateTime endDate, + int page, int size, String sortDirection) { + Sort sort = Sort.by(sortDirection.equalsIgnoreCase("desc") ? Sort.Direction.DESC : Sort.Direction.ASC, "createdDate"); + Pageable pageable = PageRequest.of(page, size, sort); + return violationRepository.findByFileEntityInAndCreatedDateBetween(files, startDate, endDate, pageable); + } + + public Map getGroupedViolations(List files, String groupBy, String status, + LocalDateTime startDate, LocalDateTime endDate) { + List violations; + + if (status != null && !status.isEmpty() && startDate != null && endDate != null) { + violations = violationRepository.findByFileEntityInAndStatusAndCreatedDateBetween(files, status, startDate, endDate); + } else if (status != null && !status.isEmpty()) { + violations = violationRepository.findByFileEntityInAndStatus(files, status); + } else if (startDate != null && endDate != null) { + violations = violationRepository.findByFileEntityInAndCreatedDateBetween(files, startDate, endDate); + } else { + violations = violationRepository.findByFileEntityIn(files); + } + + return violations.stream() + .collect(Collectors.groupingBy( + v -> extractGroupKey(v.getPageUrl(), groupBy), + Collectors.counting() + )); + } + public ViolationStatisticsResponse getViolationStatistics(Long userId, String fileId, LocalDateTime startDate, LocalDateTime endDate) { @@ -207,7 +247,6 @@ public class ViolationService { .build(); } - private String extractGroupKey(String url, String groupBy) { try { String domain = url.replaceAll("https?://(www\\.)?", "").split("/")[0];