From 792e0048cc68882ca541df45279ffdec9feb2afb Mon Sep 17 00:00:00 2001 From: vladp Date: Tue, 10 Feb 2026 11:58:32 +0700 Subject: [PATCH] dev add pagination for search in internet images --- .../soune/nocopy/dto/file/ImageSearchRequest.java | 6 ++++++ .../nocopy/dto/file/YandexSearchResponse.java | 8 ++++++++ .../nocopy/handler/ImageFoundRequestHandler.java | 5 ++++- .../search/SearchApiToYandexResponseMapper.java | 15 +++++++++++---- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/soune/nocopy/dto/file/ImageSearchRequest.java b/src/main/java/ru/soune/nocopy/dto/file/ImageSearchRequest.java index f943989..ff4fd06 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/ImageSearchRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/ImageSearchRequest.java @@ -7,4 +7,10 @@ import lombok.Data; public class ImageSearchRequest { @JsonProperty("file_id") private String fileId; + + @JsonProperty("page") + private Integer page = 1; + + @JsonProperty("page_size") + private Integer pageSize = 10; } diff --git a/src/main/java/ru/soune/nocopy/dto/file/YandexSearchResponse.java b/src/main/java/ru/soune/nocopy/dto/file/YandexSearchResponse.java index 98b764f..f387391 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/YandexSearchResponse.java +++ b/src/main/java/ru/soune/nocopy/dto/file/YandexSearchResponse.java @@ -42,4 +42,12 @@ public class YandexSearchResponse { @JsonProperty("host") private String host; } + + private int page; + + private int pageSize; + + private int totalResults; + + private int totalPages; } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java index 0901fa8..04c5f78 100644 --- a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java @@ -59,12 +59,15 @@ public class ImageFoundRequestHandler implements RequestHandler { // GoogleVisionSearchResponse googleVisionSearchResponse = googleVisionSearchService.searchByFileEntity(fileId); String yandexReverseSearchResponse = yandexSearchService.searchReverseByPublicUrl(fileEntity); + int page = imageSearchRequest.getPage() != null ? imageSearchRequest.getPage() : 1; + int pageSize = imageSearchRequest.getPageSize() != null ? imageSearchRequest.getPageSize() : 10; tariffInfoService.writeOffTokens(fileEntity.getUserId(), TariffConstants.TOKEN_VALUE_FOR_SEARCH); checkCounterService.incrementCheckCount(fileEntity.getUserId(), fileEntity.getMimeType()); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), - MessageCode.SUCCESS.getDescription(),mapper.mapToYandexResponse(yandexReverseSearchResponse)); + MessageCode.SUCCESS.getDescription(),mapper.mapToYandexResponse(yandexReverseSearchResponse, page, + pageSize)); } } diff --git a/src/main/java/ru/soune/nocopy/service/search/SearchApiToYandexResponseMapper.java b/src/main/java/ru/soune/nocopy/service/search/SearchApiToYandexResponseMapper.java index 8bb8158..1758d16 100644 --- a/src/main/java/ru/soune/nocopy/service/search/SearchApiToYandexResponseMapper.java +++ b/src/main/java/ru/soune/nocopy/service/search/SearchApiToYandexResponseMapper.java @@ -9,7 +9,7 @@ import java.util.List; public class SearchApiToYandexResponseMapper { private final ObjectMapper objectMapper = new ObjectMapper(); - public YandexSearchResponse mapToYandexResponse(String searchApiJson) throws Exception { + public YandexSearchResponse mapToYandexResponse(String searchApiJson, int page, int pageSize) throws Exception { JsonNode root = objectMapper.readTree(searchApiJson); YandexSearchResponse response = new YandexSearchResponse(); @@ -18,9 +18,12 @@ public class SearchApiToYandexResponseMapper { JsonNode visualMatches = root.path("visual_matches"); if (visualMatches.isArray()) { - for (JsonNode match : visualMatches) { - YandexSearchResponse.ImageResult result = new YandexSearchResponse.ImageResult(); + int startIndex = (page - 1) * pageSize; + int endIndex = Math.min(startIndex + pageSize, visualMatches.size()); + for (int i = startIndex; i < endIndex; i++) { + JsonNode match = visualMatches.get(i); + YandexSearchResponse.ImageResult result = new YandexSearchResponse.ImageResult(); JsonNode imageNode = match.path("image"); if (!imageNode.isMissingNode()) { @@ -30,7 +33,6 @@ public class SearchApiToYandexResponseMapper { } result.setPageUrl(match.path("link").asText()); - result.setPageTitle(match.path("title").asText()); String source = match.path("source").asText(); @@ -40,6 +42,11 @@ public class SearchApiToYandexResponseMapper { imageResults.add(result); } } + + response.setPage(page); + response.setPageSize(pageSize); + response.setTotalResults(visualMatches.size()); + response.setTotalPages((int) Math.ceil((double) visualMatches.size() / pageSize)); } response.setImages(imageResults);