@@ -3,13 +3,21 @@ package ru.soune.nocopy.service.dockview;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import ru.soune.nocopy.dto.docviewer.DocViewerRequest;
|
||||
import ru.soune.nocopy.dto.docviewer.DockViewResponse;
|
||||
import ru.soune.nocopy.dto.docviewer.DockViewStatsResponse;
|
||||
import ru.soune.nocopy.entity.docviewer.DockView;
|
||||
import ru.soune.nocopy.entity.file.FileEntity;
|
||||
import ru.soune.nocopy.entity.user.User;
|
||||
import ru.soune.nocopy.repository.DockViewRepository;
|
||||
import ru.soune.nocopy.repository.FileEntityRepository;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.service.geo.GeoCountryService;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
@@ -22,6 +30,12 @@ public class DockViewService {
|
||||
|
||||
private final DockViewRepository dockViewRepository;
|
||||
|
||||
private final GeoCountryService geoCountryService;
|
||||
|
||||
private final FileEntityRepository fileEntityRepository;
|
||||
|
||||
private final UserRepository userRepository;
|
||||
|
||||
@Transactional
|
||||
public DockView createDockView(DocViewerRequest request, Long userId) {
|
||||
DockView dockView = new DockView();
|
||||
@@ -65,6 +79,86 @@ public class DockViewService {
|
||||
.build();
|
||||
}
|
||||
|
||||
public List<DockViewStatsResponse> getStatsByFileIds(List<String> fileIds) {
|
||||
List<Object[]> statsList = dockViewRepository.findViewsStatsByFileIds(fileIds);
|
||||
|
||||
Map<String, Object[]> statsMap = statsList.stream()
|
||||
.collect(Collectors.toMap(
|
||||
stats -> (String) stats[0],
|
||||
stats -> stats
|
||||
));
|
||||
|
||||
return fileIds.stream()
|
||||
.map(fileId -> {
|
||||
Object[] stats = statsMap.get(fileId);
|
||||
|
||||
if (stats == null) {
|
||||
return DockViewStatsResponse.builder()
|
||||
.fileId(fileId)
|
||||
.totalViews(0L)
|
||||
.uniqueIps(0L)
|
||||
.uniqueUsers(0L)
|
||||
.firstViewDate(null)
|
||||
.lastViewDate(null)
|
||||
.build();
|
||||
}
|
||||
|
||||
return DockViewStatsResponse.builder()
|
||||
.fileId((String) stats[0])
|
||||
.totalViews((Long) stats[1])
|
||||
.uniqueIps((Long) stats[2])
|
||||
.uniqueUsers((Long) stats[3])
|
||||
.lastViewDate((LocalDateTime) stats[4])
|
||||
.firstViewDate((LocalDateTime) stats[5])
|
||||
.build();
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public DockViewStatsResponse getOpenLastHistory(int page, int size, String sortDirection, String sortBy,
|
||||
List<String> fileIds) {
|
||||
Pageable pageable = PageRequest.of(page, size,
|
||||
Sort.by(Sort.Direction.fromString(sortDirection), sortBy));
|
||||
|
||||
Page<DockView> dockViews = dockViewRepository.findAllByFileId(pageable, fileIds);
|
||||
|
||||
if (dockViews.isEmpty()) {
|
||||
return DockViewStatsResponse.builder()
|
||||
.build();
|
||||
}
|
||||
|
||||
List<DockViewResponse> history = new ArrayList<>();
|
||||
|
||||
for (DockView dockView: dockViews) {
|
||||
String country = geoCountryService.getCountryByIp(dockView.getViewerIp());
|
||||
String city = geoCountryService.getCityByIp(dockView.getViewerIp());
|
||||
LocalDateTime createdAt = dockView.getCreatedAt();
|
||||
String fileId = dockView.getFileId();
|
||||
|
||||
FileEntity file = fileEntityRepository.findByFileId(fileId);
|
||||
Long viewerId = dockView.getViewerId();
|
||||
User viewer = userRepository.findById(viewerId).orElse(null);
|
||||
|
||||
DockViewResponse response = DockViewResponse.builder()
|
||||
.city(city)
|
||||
.country(country)
|
||||
.viewDate(createdAt)
|
||||
.document(file.getOriginalFileName())
|
||||
.viewer(viewer == null ? "guest" : viewer.getFullName())
|
||||
.build();
|
||||
|
||||
history.add(response);
|
||||
}
|
||||
|
||||
return DockViewStatsResponse.builder()
|
||||
.history(history)
|
||||
.pageNumber(dockViews.getNumber())
|
||||
.pageSize(dockViews.getSize())
|
||||
.totalPages(dockViews.getTotalPages())
|
||||
.totalElements(dockViews.getTotalElements())
|
||||
.build();
|
||||
}
|
||||
|
||||
public DockViewStatsResponse getBasicStatsByFileId(String fileId) {
|
||||
long totalViews = dockViewRepository.countByFileId(fileId);
|
||||
long uniqueIps = dockViewRepository.countUniqueIpsByFileId(fileId);
|
||||
|
||||
Reference in New Issue
Block a user