diff --git a/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java b/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java index b5d3f5c..7784ed7 100644 --- a/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/DockViewFileHandler.java @@ -93,7 +93,7 @@ public class DockViewFileHandler implements RequestHandler { private BaseResponse handleGetViewStats(BaseRequest request, DocViewerRequest docViewerRequest) { try { - Long userId = authService.useUserAuthToken(docViewerRequest.getToken()); + Long userId = authService.useUserAuthToken(docViewerRequest.getToken()); List fileIds = fileEntityService.getAllUserFiles(userId) .stream() .map(FileEntity::getId) @@ -106,12 +106,12 @@ public class DockViewFileHandler implements RequestHandler { null); } - List statsByFileIds = dockViewService.getStatsByFileIds(fileIds); + DockViewStatsResponse totalStats = dockViewService.getTotalStatsByFileIds(fileIds); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), - statsByFileIds); + totalStats); } catch (NotFoundAuthToken e) { return new BaseResponse(request.getMsgId(), MessageCode.INVALID_TOKEN.getCode(), @@ -119,4 +119,33 @@ public class DockViewFileHandler implements RequestHandler { null); } } + +// private BaseResponse handleGetViewStats(BaseRequest request, DocViewerRequest docViewerRequest) { +// try { +// Long userId = authService.useUserAuthToken(docViewerRequest.getToken()); +// List fileIds = fileEntityService.getAllUserFiles(userId) +// .stream() +// .map(FileEntity::getId) +// .toList(); +// +// if (fileIds.isEmpty()) { +// return new BaseResponse(request.getMsgId(), +// MessageCode.FILE_NOT_FOUND.getCode(), +// "Files for search not found", +// null); +// } +// +// List statsByFileIds = dockViewService.getStatsByFileIds(fileIds); +// +// return new BaseResponse(request.getMsgId(), +// MessageCode.SUCCESS.getCode(), +// MessageCode.SUCCESS.getDescription(), +// statsByFileIds); +// } catch (NotFoundAuthToken e) { +// return new BaseResponse(request.getMsgId(), +// MessageCode.INVALID_TOKEN.getCode(), +// "Authentication required", +// null); +// } +// } } diff --git a/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java b/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java index b19de36..03b3bd1 100644 --- a/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java @@ -28,6 +28,16 @@ public interface DockViewRepository extends JpaRepository { @Query("SELECT dv FROM DockView dv WHERE dv.fileId IN :fileIds") Page findAllByFileIds(@Param("fileIds") List fileIds, Pageable pageable); + @Query("SELECT " + + "COUNT(dv) as totalViews, " + + "COUNT(DISTINCT dv.viewerIp) as uniqueIps, " + + "COUNT(DISTINCT dv.viewerId) as uniqueUsers, " + + "MAX(dv.createdAt) as lastViewDate, " + + "MIN(dv.createdAt) as firstViewDate " + + "FROM DockView dv " + + "WHERE dv.fileId IN :fileIds") + Optional findTotalViewsStatsByFileIds(@Param("fileIds") List fileIds); + Page findAllByViewerIdOrderByCreatedAtDesc(Long viewerId, Pageable pageable); long countByFileId(String fileId); diff --git a/src/main/java/ru/soune/nocopy/service/dockview/DockViewService.java b/src/main/java/ru/soune/nocopy/service/dockview/DockViewService.java index b8a0a29..7e6425e 100644 --- a/src/main/java/ru/soune/nocopy/service/dockview/DockViewService.java +++ b/src/main/java/ru/soune/nocopy/service/dockview/DockViewService.java @@ -79,6 +79,29 @@ public class DockViewService { .build(); } + public DockViewStatsResponse getTotalStatsByFileIds(List fileIds) { + Optional statsOpt = dockViewRepository.findTotalViewsStatsByFileIds(fileIds); + + if (statsOpt.isEmpty() || statsOpt.get() == null) { + return DockViewStatsResponse.builder() + .totalViews(0L) + .uniqueIps(0L) + .uniqueUsers(0L) + .firstViewDate(null) + .lastViewDate(null) + .build(); + } + + Object[] stats = statsOpt.get(); + return DockViewStatsResponse.builder() + .totalViews(stats[0] != null ? (Long) stats[0] : 0L) + .uniqueIps(stats[1] != null ? (Long) stats[1] : 0L) + .uniqueUsers(stats[2] != null ? (Long) stats[2] : 0L) + .lastViewDate((LocalDateTime) stats[3]) + .firstViewDate((LocalDateTime) stats[4]) + .build(); + } + public List getStatsByFileIds(List fileIds) { List statsList = dockViewRepository.findViewsStatsByFileIds(fileIds);