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.monitoring.GetViolationsRequest; import ru.soune.nocopy.dto.monitoring.ViolationResponse; import ru.soune.nocopy.entity.monitoring.FoundViolationEntity; import ru.soune.nocopy.entity.user.User; import ru.soune.nocopy.repository.FoundViolationRepository; import ru.soune.nocopy.service.register.AuthService; import java.util.List; import java.util.stream.Collectors; @Slf4j @Component @RequiredArgsConstructor public class GetViolationsHandler implements RequestHandler { private final ObjectMapper objectMapper; private final FoundViolationRepository violationRepository; private final AuthService authService; @Override public BaseResponse handle(BaseRequest request) throws Exception { GetViolationsRequest violationsRequest = objectMapper.convertValue( request.getMessageBody(), GetViolationsRequest.class); String authToken = violationsRequest.getAuthToken(); //TODO add return for null token if (authToken == null) { return new BaseResponse(0, 0, "", new Object()); } User user = authService.getAuthToken(authToken).getUser(); List violations; if (violationsRequest.getFileId() != null) { violations = violationRepository.findByFileIdOrderByFoundAtDesc( violationsRequest.getFileId()); } else { violations = violationRepository.findByUserIdOrderByFoundAtDesc(user.getId()); } if (violationsRequest.isMarkAsRead()) { violations.stream() .filter(FoundViolationEntity::isNew) .forEach(v -> v.setNew(false)); violationRepository.saveAll(violations); } List response = violations.stream() .map(this::mapToResponse) .collect(Collectors.toList()); return new BaseResponse( request.getMsgId(), MessageCode.SUCCESS.getCode(), "Violations retrieved", response ); } private ViolationResponse mapToResponse(FoundViolationEntity entity) { return ViolationResponse.builder() .id(entity.getId()) .fileId(entity.getFileId()) .fileName(entity.getFileName()) .foundUrl(entity.getFoundUrl()) .pageUrl(entity.getPageUrl()) .pageTitle(entity.getPageTitle()) .host(entity.getHost()) .searchEngine(entity.getSearchEngine()) .foundAt(entity.getFoundAt()) .isNew(entity.isNew()) .build(); } }