diff --git a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java index 23f8a46..1e12bed 100644 --- a/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/ImageFoundRequestHandler.java @@ -54,51 +54,52 @@ public class ImageFoundRequestHandler implements RequestHandler { Map.of("fileId",fileId))); }); -// YandexSearchResponse response = yandexSearchService.searchByFileEntity(fileEntity); +// YandexSearchResponse response = yandexSearchService.searchByFileEntity(fileId); //TODO uncommited when add billing // GoogleVisionSearchResponse googleVisionSearchResponse = googleVisionSearchService.searchByFileEntity(fileId); - - String searchResponseYandex; - String searchResponseGoogle; - List allUniqueImages; //TODO отдавать любой полученный результат,даже если по таймауту падают + + String searchResponseYandex = null; + String searchResponseGoogle = null; + List allYandexImages = new ArrayList<>(); + List allGoogleImages = new ArrayList<>(); + List allUniqueImages; + boolean hasTimeout = false; + try { searchResponseYandex = searchImageService.searchReverseByPublicUrl(fileEntity, "yandex_reverse_image", "visual_matches"); log.info("searchResponseYandex OK"); - List allYandexImages = searchImageService.getAllImagesWithoutPagination( + allYandexImages = searchImageService.getAllImagesWithoutPagination( searchResponseYandex, "visual_matches"); -// searchResponseGoogle = searchImageService.searchReverseByPublicUrl(fileEntity, "google_lens", -// "exact_matches"); - - log.info("searchResponseGoogle OK"); -// List allGoogleImages = searchImageService.getAllImagesWithoutPagination( -// searchResponseGoogle, "exact_matches"); -// allUniqueImages = searchImageService.removeDuplicateUrls(allYandexImages, -// allGoogleImages); - allUniqueImages = searchImageService.removeDuplicateUrls(allYandexImages, - new ArrayList<>()); - log.info("allUniqueImages OK"); - } catch (TimeoutException e) { - log.warn("Search timeout for file {}, returning empty results", fileId); - return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), - "Search completed (partial)", Map.of( - "results", List.of(), - "total", 0, - "searchStatus", "timeout" - )); + log.warn("Yandex search timeout for file {}", fileId); + hasTimeout = true; } catch (IOException e) { - log.error("Search failed for file {}", fileId, e); - return new BaseResponse(request.getMsgId(), 20007, - "Search service temporarily unavailable", - Map.of("fileId", fileId)); + log.error("Yandex search failed for file {}", fileId, e); } - tariffInfoService.writeOffTokens(fileEntity.getUserId(), TariffConstants.TOKEN_VALUE_FOR_SEARCH); + try { + searchResponseGoogle = searchImageService.searchReverseByPublicUrl(fileEntity, "google_lens", + "exact_matches"); + log.info("searchResponseGoogle OK"); + allGoogleImages = searchImageService.getAllImagesWithoutPagination( + searchResponseGoogle, "exact_matches"); + } catch (TimeoutException e) { + log.warn("Google search timeout for file {}", fileId); + hasTimeout = true; + } catch (IOException e) { + log.error("Google search failed for file {}", fileId, e); + } - checkCounterService.incrementCheckCount(fileEntity.getUserId(), fileEntity.getMimeType()); + allUniqueImages = searchImageService.removeDuplicateUrls(allYandexImages, allGoogleImages); + log.info("allUniqueImages OK: {} images", allUniqueImages.size()); + + if (!allUniqueImages.isEmpty()) { + tariffInfoService.writeOffTokens(fileEntity.getUserId(), TariffConstants.TOKEN_VALUE_FOR_SEARCH); + checkCounterService.incrementCheckCount(fileEntity.getUserId(), fileEntity.getMimeType()); + } int page = imageSearchRequest.getPage() != null ? imageSearchRequest.getPage() : 1; int pageSize = 5; @@ -113,7 +114,84 @@ public class ImageFoundRequestHandler implements RequestHandler { finalResponse.setTotalResults(allUniqueImages.size()); finalResponse.setTotalPages((int) Math.ceil((double) allUniqueImages.size() / (pageSize * 2))); + String message = hasTimeout ? "Search completed (partial)" : MessageCode.SUCCESS.getDescription(); + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), - MessageCode.SUCCESS.getDescription(), finalResponse); + message, finalResponse); } + +// @Override +// public BaseResponse handle(BaseRequest request) throws Exception { +// ImageSearchRequest imageSearchRequest = objectMapper.convertValue(request.getMessageBody(), +// ImageSearchRequest.class); +// +// String fileId = imageSearchRequest.getFileId(); +// +// FileEntity fileEntity = fileEntityRepository.findById(fileId) +// .orElseThrow(() -> { +// throw new NotValidFieldException("File not found", new BaseResponse(20007, +// MessageCode.FILE_NOT_FOUND.getCode(), MessageCode.FILE_NOT_FOUND.getDescription(), +// Map.of("fileId",fileId))); +// }); +// +//// YandexSearchResponse response = yandexSearchService.searchByFileEntity(fileEntity); +// +// //TODO uncommited when add billing +//// GoogleVisionSearchResponse googleVisionSearchResponse = googleVisionSearchService.searchByFileEntity(fileId); +// //TODO отдавать любой полученный результат,даже если по таймауту падают +// +// String searchResponseYandex; +// String searchResponseGoogle; +// List allUniqueImages; +// try { +// searchResponseYandex = searchImageService.searchReverseByPublicUrl(fileEntity, "yandex_reverse_image", +// "visual_matches"); +// log.info("searchResponseYandex OK"); +// List allYandexImages = searchImageService.getAllImagesWithoutPagination( +// searchResponseYandex, "visual_matches"); +// searchResponseGoogle = searchImageService.searchReverseByPublicUrl(fileEntity, "google_lens", +// "exact_matches"); +// +// log.info("searchResponseGoogle OK"); +// List allGoogleImages = searchImageService.getAllImagesWithoutPagination( +// searchResponseGoogle, "exact_matches"); +// allUniqueImages = searchImageService.removeDuplicateUrls(allYandexImages, +// allGoogleImages); +// log.info("allUniqueImages OK"); +// +// } catch (TimeoutException e) { +// log.warn("Search timeout for file {}, returning empty results", fileId); +// return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), +// "Search completed (partial)", Map.of( +// "results", List.of(), +// "total", 0, +// "searchStatus", "timeout" +// )); +// } catch (IOException e) { +// log.error("Search failed for file {}", fileId, e); +// return new BaseResponse(request.getMsgId(), 20007, +// "Search service temporarily unavailable", +// Map.of("fileId", fileId)); +// } +// +// tariffInfoService.writeOffTokens(fileEntity.getUserId(), TariffConstants.TOKEN_VALUE_FOR_SEARCH); +// +// checkCounterService.incrementCheckCount(fileEntity.getUserId(), fileEntity.getMimeType()); +// +// int page = imageSearchRequest.getPage() != null ? imageSearchRequest.getPage() : 1; +// int pageSize = 5; +// +// List pagedResults = searchImageService.paginateResults(allUniqueImages, page, +// pageSize * 2); +// +// YandexSearchResponse finalResponse = new YandexSearchResponse(); +// finalResponse.setImages(pagedResults); +// finalResponse.setPage(page); +// finalResponse.setPageSize(pageSize * 2); +// finalResponse.setTotalResults(allUniqueImages.size()); +// finalResponse.setTotalPages((int) Math.ceil((double) allUniqueImages.size() / (pageSize * 2))); +// +// return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), +// MessageCode.SUCCESS.getDescription(), finalResponse); +// } }