diff --git a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java index a845008..1306b7b 100644 --- a/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java +++ b/src/main/java/ru/soune/nocopy/configuration/HandlerConfig.java @@ -46,7 +46,8 @@ public class HandlerConfig { StatisticViolationHandler statisticViolationHandler, StatisticSubscriberHandler statisticSubscriberHandler, StatisticTokenHandler statisticTokenHandler, - StatisticIncomeHandler statisticIncomeHandler + StatisticIncomeHandler statisticIncomeHandler, + MonitoringStatisticHandler monitoringStatisticHandler ) { Map map = new HashMap<>(); @@ -85,6 +86,7 @@ public class HandlerConfig { map.put(30024, statisticSubscriberHandler); map.put(30025, statisticTokenHandler); map.put(30026, statisticIncomeHandler); + map.put(30027, monitoringStatisticHandler); return map; } diff --git a/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticRequest.java b/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticRequest.java new file mode 100644 index 0000000..68b70e0 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticRequest.java @@ -0,0 +1,8 @@ +package ru.soune.nocopy.dto.statistic; + +import lombok.Data; + +@Data +public class MonitoringStatisticRequest { + private String authToken; +} diff --git a/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticResponse.java b/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticResponse.java new file mode 100644 index 0000000..60559bd --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/statistic/MonitoringStatisticResponse.java @@ -0,0 +1,20 @@ +package ru.soune.nocopy.dto.statistic; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class MonitoringStatisticResponse { + + @JsonProperty("day") + private Long everyDay; + + @JsonProperty("month") + private Long everyMonth; + + @JsonProperty("weekly") + private Long everyWeekly; + +} diff --git a/src/main/java/ru/soune/nocopy/handler/MonitoringStatisticHandler.java b/src/main/java/ru/soune/nocopy/handler/MonitoringStatisticHandler.java new file mode 100644 index 0000000..669fe59 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/handler/MonitoringStatisticHandler.java @@ -0,0 +1,72 @@ +package ru.soune.nocopy.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +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.statistic.MonitoringStatisticRequest; +import ru.soune.nocopy.dto.statistic.MonitoringStatisticResponse; +import ru.soune.nocopy.entity.company.Company; +import ru.soune.nocopy.entity.monitoring.MonitoringType; +import ru.soune.nocopy.entity.user.User; +import ru.soune.nocopy.repository.FileMonitoringRepository; +import ru.soune.nocopy.repository.UserRepository; +import ru.soune.nocopy.service.register.AuthService; + +import java.util.List; + +@Slf4j +@Component +@RequiredArgsConstructor +public class MonitoringStatisticHandler implements RequestHandler { + + private final ObjectMapper objectMapper; + + private final AuthService authService; + + private final FileMonitoringRepository fileMonitoringRepository; + + private final UserRepository userRepository; + + @Override + public BaseResponse handle(BaseRequest request) throws Exception { + MonitoringStatisticRequest monitoringStatisticRequest = objectMapper.convertValue(request.getMessageBody(), + MonitoringStatisticRequest.class); + try { + String authToken = monitoringStatisticRequest.getAuthToken(); + Long userId = authService.useUserAuthToken(authToken); + + User user = userRepository.findById(userId).orElseThrow(); + Company company = user.getCompany(); + List userIds = company == null ? List.of(userId) : + user.getCompany() + .getUsers() + .stream() + .map(User::getId).toList(); + + MonitoringStatisticResponse monitoringStatisticResponse = MonitoringStatisticResponse.builder() + .everyDay(fileMonitoringRepository.countByUserIdsAndMonitoringType(userIds, + MonitoringType.MONITORING_DAILY)) + .everyMonth(fileMonitoringRepository.countByUserIdsAndMonitoringType(userIds, + MonitoringType.MONITORING_MONTHLY)) + .everyWeekly(fileMonitoringRepository.countByUserIdsAndMonitoringType(userIds, + MonitoringType.MONITORING_WEEKLY)) + .build(); + + return new BaseResponse( + request.getMsgId(), + MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), + monitoringStatisticResponse); + } catch (Exception e) { + return new BaseResponse( + request.getMsgId(), + MessageCode.INVALID_JSON_BODY.getCode(), + MessageCode.INVALID_JSON_BODY.getDescription(), + null); + } + } +} diff --git a/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java b/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java index 126aa7a..393309d 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java @@ -22,4 +22,11 @@ public interface FileMonitoringRepository extends JpaRepository findReadyForRun(@Param("now") LocalDateTime now); List findByMonitoringTypeAndIsActiveTrue(MonitoringType type); + + @Query("SELECT COUNT(m) FROM FileMonitoringEntity m " + + "WHERE m.userId IN :userIds " + + "AND m.monitoringType = :monitoringType " + + "AND m.isActive = true") + long countByUserIdsAndMonitoringType(@Param("userIds") List userIds, + @Param("monitoringType") MonitoringType monitoringType); }