From ba89406417d273a7a490f9c3a745340a902a1341 Mon Sep 17 00:00:00 2001 From: backdev-1 Date: Tue, 5 May 2026 15:31:49 +0700 Subject: [PATCH] dev add method link --- .../dto/docviewer/DockViewStatsResponse.java | 6 +++ .../nocopy/repository/DockViewRepository.java | 3 ++ .../service/dockview/DockViewService.java | 31 +++------------ .../nocopy/service/geo/GeoCountryService.java | 39 +++++++++++++++++++ 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/dto/docviewer/DockViewStatsResponse.java b/src/main/java/ru/soune/nocopy/dto/docviewer/DockViewStatsResponse.java index 9d5d440..208691b 100644 --- a/src/main/java/ru/soune/nocopy/dto/docviewer/DockViewStatsResponse.java +++ b/src/main/java/ru/soune/nocopy/dto/docviewer/DockViewStatsResponse.java @@ -23,6 +23,12 @@ public class DockViewStatsResponse { private Long uniqueUsers; + private int documentsCount; + + private int uniqueCountryCount; + + private int uniqueCityCount; + private LocalDateTime firstViewDate; private LocalDateTime lastViewDate; diff --git a/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java b/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java index e71f84f..c0fa2a0 100644 --- a/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/DockViewRepository.java @@ -17,6 +17,9 @@ public interface DockViewRepository extends JpaRepository { List findAllByFileId(String fileId); + @Query("SELECT d.viewerIp FROM DockView d WHERE d.fileId IN :fileIds") + List findAllViewerIps(@Param("fileIds") List fileIds); + List findAllByViewerId(Long viewerId); Optional findByFileIdAndViewerId(String fileId, Long viewerId); 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 60d463e..074aae2 100644 --- a/src/main/java/ru/soune/nocopy/service/dockview/DockViewService.java +++ b/src/main/java/ru/soune/nocopy/service/dockview/DockViewService.java @@ -53,34 +53,10 @@ public class DockViewService { return saved; } - - public DockViewStatsResponse getStatsByFileId(String fileId) { - Optional statsOpt = dockViewRepository.findViewsStatsByFileId(fileId); - - if (statsOpt.isEmpty()) { - return DockViewStatsResponse.builder() - .fileId(fileId) - .totalViews(0L) - .uniqueIps(0L) - .uniqueUsers(0L) - .firstViewDate(null) - .lastViewDate(null) - .build(); - } - - Object[] stats = statsOpt.get(); - 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(); - } - public DockViewStatsResponse getTotalStatsByFileIds(List fileIds) { List statsList = dockViewRepository.findTotalViewsStatsByFileIds(fileIds); + List allViewerIps = dockViewRepository.findAllViewerIps(fileIds); + Map uniqueGeoCount = geoCountryService.getUniqueGeoCount(allViewerIps); if (statsList.isEmpty()) { return DockViewStatsResponse.builder() @@ -98,6 +74,9 @@ public class DockViewService { .totalViews((Long) stats[0]) .uniqueIps((Long) stats[1]) .uniqueUsers((Long) stats[2]) + .documentsCount(fileIds.size()) + .uniqueCityCount(uniqueGeoCount.get("uniqueCities")) + .uniqueCountryCount(uniqueGeoCount.get("uniqueCountries")) .lastViewDate((LocalDateTime) stats[3]) .firstViewDate((LocalDateTime) stats[4]) .build(); diff --git a/src/main/java/ru/soune/nocopy/service/geo/GeoCountryService.java b/src/main/java/ru/soune/nocopy/service/geo/GeoCountryService.java index f005a93..597975c 100644 --- a/src/main/java/ru/soune/nocopy/service/geo/GeoCountryService.java +++ b/src/main/java/ru/soune/nocopy/service/geo/GeoCountryService.java @@ -11,6 +11,10 @@ import org.springframework.stereotype.Service; import java.io.IOException; import java.net.InetAddress; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; @Service @Slf4j @@ -40,6 +44,41 @@ public class GeoCountryService { } } + public Map getUniqueGeoCount(List ipList) { + Set uniqueCountries = new HashSet<>(); + Set uniqueCountryCodes = new HashSet<>(); + Set uniqueCities = new HashSet<>(); + + if (ipList != null) { + for (String ip : ipList) { + try { + String country = getCountryByIp(ip); + if (!"UNKNOWN".equals(country)) { + uniqueCountries.add(country); + } + + String countryCode = getCountryCodeByIp(ip); + if (!"UNKNOWN".equals(countryCode)) { + uniqueCountryCodes.add(countryCode); + } + + String city = getCityByIp(ip); + if (!"UNKNOWN".equals(city)) { + uniqueCities.add(city); + } + } catch (Exception e) { + log.error("Error processing IP: {}", ip, e); + } + } + } + + return Map.of( + "uniqueCountries", uniqueCountries.size(), + "uniqueCountryCodes", uniqueCountryCodes.size(), + "uniqueCities", uniqueCities.size() + ); + } + public String getCountryCode(String input) { try { CountryResponse response = extractCountry(input);