diff --git a/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java b/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java index d047ebe..1c6b2e3 100644 --- a/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ViolationStatisticsHandler.java @@ -6,9 +6,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import ru.soune.nocopy.dto.BaseRequest; import ru.soune.nocopy.dto.BaseResponse; +import ru.soune.nocopy.dto.MessageCode; import ru.soune.nocopy.dto.violation.ViolationStatisticsRequest; import ru.soune.nocopy.dto.violation.ViolationStatisticsResponse; import ru.soune.nocopy.entity.user.AuthToken; +import ru.soune.nocopy.exception.FileEntityNotFoundException; +import ru.soune.nocopy.exception.UserNotHavePermission; import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.service.violation.ViolationService; @@ -55,16 +58,36 @@ public class ViolationStatisticsHandler implements RequestHandler { } Long userId = tokenOptional.orElseThrow().getUser().getId(); + ViolationStatisticsResponse statistics; + + try { + statistics = violationService.getViolationStatistics( + userId, + statRequest.getFileId(), + startDate, + endDate); + } catch (UserNotHavePermission e) { + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageBody("userId: " + userId) + .messageCode(MessageCode.USER_NOT_HAD_PERMISSION.getCode()) + .messageDesc(MessageCode.USER_NOT_HAD_PERMISSION.getDescription()) + .build(); + } catch (FileEntityNotFoundException e) { + return BaseResponse.builder() + .msgId(request.getMsgId()) + .messageBody("fileId: " + statRequest.getFileId()) + .messageDesc(MessageCode.FILE_NOT_FOUND.getDescription()) + .messageCode(MessageCode.FILE_NOT_FOUND.getCode()) + .build(); + } - ViolationStatisticsResponse statistics = violationService.getViolationStatistics( - userId, - statRequest.getFileId(), - startDate, - endDate); return BaseResponse.builder() .msgId(request.getMsgId()) .messageBody(statistics) + .messageCode(MessageCode.SUCCESS.getCode()) + .messageDesc(MessageCode.SUCCESS.getDescription()) .build(); } diff --git a/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java index 9dc6307..abfdb78 100644 --- a/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/ComplaintEntityRepository.java @@ -11,6 +11,7 @@ import org.springframework.transaction.annotation.Transactional; import ru.soune.nocopy.entity.complaint.ComplaintEntity; import ru.soune.nocopy.entity.complaint.ComplaintStatus; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -41,6 +42,8 @@ public interface ComplaintEntityRepository extends JpaRepository violations); diff --git a/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java b/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java index 87ffefd..1b27390 100644 --- a/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/LawCaseRepository.java @@ -10,6 +10,7 @@ import ru.soune.nocopy.entity.complaint.LawCase; import ru.soune.nocopy.entity.complaint.LawCasePriority; import ru.soune.nocopy.entity.complaint.LawCaseType; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -47,5 +48,11 @@ public interface LawCaseRepository extends JpaRepository { @Query("SELECT COUNT(l) FROM LawCase l WHERE l.violationId IN :violationIds") Long countLawCaseByViolationIds(@Param("violationIds") List violationIds); + @Query("SELECT COUNT(lc) FROM LawCase lc WHERE lc.user.Id = :userId " + + "AND lc.createdAt BETWEEN :startDate AND :endDate") + Long countLawCasesByUserAndDateRange(@Param("userId") Long userId, @Param("startDate") LocalDateTime startDate, + @Param("endDate") LocalDateTime endDate); + + Optional getLawCaseByViolationIdAndType(Long violationId, LawCaseType type); } diff --git a/src/main/java/ru/soune/nocopy/service/user/UserService.java b/src/main/java/ru/soune/nocopy/service/user/UserService.java index ab8c917..f58607a 100644 --- a/src/main/java/ru/soune/nocopy/service/user/UserService.java +++ b/src/main/java/ru/soune/nocopy/service/user/UserService.java @@ -41,6 +41,13 @@ public class UserService { return userRepository.save(user); } + public String userEmailById(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId)); + + return user.getEmail(); + } + @Transactional public UserDTO updateUser(UserRequest userRequest, User currentUser) { User user = userRepository.findById(currentUser.getId()) 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 fc6e56c..e5016be 100644 --- a/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java +++ b/src/main/java/ru/soune/nocopy/service/violation/ViolationService.java @@ -12,13 +12,17 @@ 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.user.User; import ru.soune.nocopy.entity.violation.Violation; +import ru.soune.nocopy.exception.UserNotHavePermission; 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; +import ru.soune.nocopy.service.user.UserService; +import java.io.FileNotFoundException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; @@ -40,6 +44,8 @@ public class ViolationService { private final LawCaseRepository lawCaseRepository; + private final UserService userService; + public void processViolation(YandexSearchResponse.ImageResult imageResult, FileEntity file, GlobalSearchResult result) { String url = imageResult.getUrl(); @@ -287,16 +293,16 @@ public class ViolationService { } public ViolationStatisticsResponse getViolationStatistics(Long userId, String fileId, - LocalDateTime startDate, LocalDateTime endDate) { + LocalDateTime startDate, LocalDateTime endDate) throws FileNotFoundException { List userFiles; if (fileId != null && !fileId.isEmpty()) { FileEntity file = fileEntityRepository.findById(fileId) - .orElseThrow(() -> new IllegalArgumentException("File not found with id: " + fileId)); + .orElseThrow(() -> new FileNotFoundException("File not found with id: " + fileId)); if (!file.getUserId().equals(userId)) { - throw new IllegalArgumentException("File does not belong to user"); + throw new UserNotHavePermission("File does not belong to user"); } userFiles = List.of(file); @@ -345,7 +351,13 @@ public class ViolationService { Long totalComplaints = 0L; Long totalLawCases = 0L; - if (!violationIds.isEmpty()) { + if (startDate != null && endDate != null) { + totalLawCases = lawCaseRepository.countLawCasesByUserAndDateRange(userId, startDate, endDate); + totalComplaints = complaintRepository.countComplaintEntityByEmailAndCreatedAtBetween( + userService.userEmailById(userId), + startDate, + endDate); + } else if (!violationIds.isEmpty()) { totalComplaints = complaintRepository.countComplaintByViolations(violationIds); totalLawCases = lawCaseRepository.countLawCaseByViolationIds(violationIds); }