From 9540a71307d17bd00d25ca9dc29b2983bfdd69d2 Mon Sep 17 00:00:00 2001 From: bivashy Date: Sat, 19 Jul 2025 18:41:34 +0000 Subject: [PATCH] [Fix] Return unique search results (#1) Reviewed-on: https://git.bivashy.dev/anyame/anyame-kodik-search-service/pulls/1 Co-authored-by: bivashy Co-committed-by: bivashy --- .../controller/SearchController.java | 9 +++-- .../service/KodikSearchFilterService.java | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/backend/search/kodik/service/anyame_backend/service/KodikSearchFilterService.java diff --git a/src/main/java/com/backend/search/kodik/service/anyame_backend/controller/SearchController.java b/src/main/java/com/backend/search/kodik/service/anyame_backend/controller/SearchController.java index 4bef8f6..f4ae4e2 100644 --- a/src/main/java/com/backend/search/kodik/service/anyame_backend/controller/SearchController.java +++ b/src/main/java/com/backend/search/kodik/service/anyame_backend/controller/SearchController.java @@ -13,6 +13,7 @@ import org.springframework.web.server.ResponseStatusException; import com.backend.search.kodik.service.anyame_backend.api.KodikAPI; import com.backend.search.kodik.service.anyame_backend.api.model.KodikResponse; import com.backend.search.kodik.service.anyame_backend.component.KodikAPITokenProvider; +import com.backend.search.kodik.service.anyame_backend.service.KodikSearchFilterService; import retrofit2.Response; @@ -21,10 +22,13 @@ public class SearchController { Logger log = LoggerFactory.getLogger(SearchController.class); private final KodikAPI kodikAPI; private final KodikAPITokenProvider tokenProvider; + private final KodikSearchFilterService searchFilterService; - public SearchController(KodikAPI kodikAPI, KodikAPITokenProvider tokenProvider) { + public SearchController(KodikAPI kodikAPI, KodikAPITokenProvider tokenProvider, + KodikSearchFilterService searchFilterService) { this.kodikAPI = kodikAPI; this.tokenProvider = tokenProvider; + this.searchFilterService = searchFilterService; } @GetMapping("/search") @@ -36,8 +40,7 @@ public class SearchController { response.message()); throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "bad response, code: " + response.code()); } - log.info("search result {}", response.body()); - return response.body(); + return searchFilterService.filter(response.body()); } catch (IOException e) { log.warn("i/o error", e); throw new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE, "i/o error"); diff --git a/src/main/java/com/backend/search/kodik/service/anyame_backend/service/KodikSearchFilterService.java b/src/main/java/com/backend/search/kodik/service/anyame_backend/service/KodikSearchFilterService.java new file mode 100644 index 0000000..15a0a51 --- /dev/null +++ b/src/main/java/com/backend/search/kodik/service/anyame_backend/service/KodikSearchFilterService.java @@ -0,0 +1,37 @@ +package com.backend.search.kodik.service.anyame_backend.service; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.springframework.stereotype.Service; + +import com.backend.search.kodik.service.anyame_backend.api.model.KodikResponse; +import com.backend.search.kodik.service.anyame_backend.api.model.KodikResponse.Result; + +@Service +public class KodikSearchFilterService { + + public KodikResponse filter(KodikResponse body) { + Set seenIds = new HashSet<>(); + List filteredResults = body.results.stream().filter(result -> { + String identifier = identifier(result); + boolean updated = seenIds.add(identifier); + return updated; + }).toList(); + + body.results = filteredResults; + return body; + } + + public String identifier(Result result) { + List identifiers = Arrays.asList(result.kinopoiskId, + result.imdbId, + result.shikimoriId, + result.worldartLink); + return identifiers.stream().filter(identifier -> identifier != null && !identifier.isBlank()).findFirst() + .orElse(result.id); + } + +}