From 14625ea2893c70560d137d8bb61b2b9ff6f53ba1 Mon Sep 17 00:00:00 2001 From: bivashy Date: Sun, 22 Mar 2026 01:24:46 +0500 Subject: [PATCH] Move package `com.backend.metadata.kodik.service` to `com.backend.metadata.kodik` --- .../ApplicationBeanProducer.java | 2 +- .../{service => }/ApplicationLifecycle.java | 2 +- .../api/JacksonConvertFactoryBuilder.java | 2 +- .../kodik/{service => }/api/KodikAPI.java | 19 +++++++- .../api/model/KodikResponse.java | 6 ++- .../{service => }/api/model/MaterialData.java | 2 +- .../resource/SearchResource.java | 45 ++++++++++++++----- .../{service => }/KodikAPITokenProvider.java | 2 +- .../KodikSearchFilterService.java | 25 +++++++---- 9 files changed, 77 insertions(+), 28 deletions(-) rename src/main/java/com/backend/metadata/kodik/{service => }/ApplicationBeanProducer.java (95%) rename src/main/java/com/backend/metadata/kodik/{service => }/ApplicationLifecycle.java (97%) rename src/main/java/com/backend/metadata/kodik/{service => }/api/JacksonConvertFactoryBuilder.java (90%) rename src/main/java/com/backend/metadata/kodik/{service => }/api/KodikAPI.java (74%) rename src/main/java/com/backend/metadata/kodik/{service => }/api/model/KodikResponse.java (94%) rename src/main/java/com/backend/metadata/kodik/{service => }/api/model/MaterialData.java (98%) rename src/main/java/com/backend/metadata/kodik/{service => }/resource/SearchResource.java (75%) rename src/main/java/com/backend/metadata/kodik/service/{service => }/KodikAPITokenProvider.java (85%) rename src/main/java/com/backend/metadata/kodik/service/{service => }/KodikSearchFilterService.java (66%) diff --git a/src/main/java/com/backend/metadata/kodik/service/ApplicationBeanProducer.java b/src/main/java/com/backend/metadata/kodik/ApplicationBeanProducer.java similarity index 95% rename from src/main/java/com/backend/metadata/kodik/service/ApplicationBeanProducer.java rename to src/main/java/com/backend/metadata/kodik/ApplicationBeanProducer.java index 9b9fb1a..9cbd1d0 100644 --- a/src/main/java/com/backend/metadata/kodik/service/ApplicationBeanProducer.java +++ b/src/main/java/com/backend/metadata/kodik/ApplicationBeanProducer.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service; +package com.backend.metadata.kodik; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; diff --git a/src/main/java/com/backend/metadata/kodik/service/ApplicationLifecycle.java b/src/main/java/com/backend/metadata/kodik/ApplicationLifecycle.java similarity index 97% rename from src/main/java/com/backend/metadata/kodik/service/ApplicationLifecycle.java rename to src/main/java/com/backend/metadata/kodik/ApplicationLifecycle.java index 649b9c1..e5abf4f 100644 --- a/src/main/java/com/backend/metadata/kodik/service/ApplicationLifecycle.java +++ b/src/main/java/com/backend/metadata/kodik/ApplicationLifecycle.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service; +package com.backend.metadata.kodik; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/com/backend/metadata/kodik/service/api/JacksonConvertFactoryBuilder.java b/src/main/java/com/backend/metadata/kodik/api/JacksonConvertFactoryBuilder.java similarity index 90% rename from src/main/java/com/backend/metadata/kodik/service/api/JacksonConvertFactoryBuilder.java rename to src/main/java/com/backend/metadata/kodik/api/JacksonConvertFactoryBuilder.java index 4da8c22..c4a1af8 100644 --- a/src/main/java/com/backend/metadata/kodik/service/api/JacksonConvertFactoryBuilder.java +++ b/src/main/java/com/backend/metadata/kodik/api/JacksonConvertFactoryBuilder.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service.api; +package com.backend.metadata.kodik.api; import jakarta.enterprise.context.ApplicationScoped; diff --git a/src/main/java/com/backend/metadata/kodik/service/api/KodikAPI.java b/src/main/java/com/backend/metadata/kodik/api/KodikAPI.java similarity index 74% rename from src/main/java/com/backend/metadata/kodik/service/api/KodikAPI.java rename to src/main/java/com/backend/metadata/kodik/api/KodikAPI.java index c1b31d3..6a7f731 100644 --- a/src/main/java/com/backend/metadata/kodik/service/api/KodikAPI.java +++ b/src/main/java/com/backend/metadata/kodik/api/KodikAPI.java @@ -1,6 +1,6 @@ -package com.backend.metadata.kodik.service.api; +package com.backend.metadata.kodik.api; -import com.backend.metadata.kodik.service.api.model.KodikResponse; +import com.backend.metadata.kodik.api.model.KodikResponse; import io.github.easyretrofit.core.annotation.RetrofitBuilder; import retrofit2.Call; @@ -10,6 +10,21 @@ import retrofit2.http.POST; @RetrofitBuilder(baseUrl = "${kodik.api.url}", addConverterFactory = { JacksonConvertFactoryBuilder.class }) public interface KodikAPI { + @FormUrlEncoded + @POST("list") + Call list( + @Field("token") String token, + @Field("limit") int limit, + @Field("with_material_data") int withMaterialData); + + @FormUrlEncoded + @POST("list") + Call list( + @Field("token") String token, + @Field("next") String next, + @Field("limit") int limit, + @Field("with_material_data") int withMaterialData); + @FormUrlEncoded @POST("search") Call search( diff --git a/src/main/java/com/backend/metadata/kodik/service/api/model/KodikResponse.java b/src/main/java/com/backend/metadata/kodik/api/model/KodikResponse.java similarity index 94% rename from src/main/java/com/backend/metadata/kodik/service/api/model/KodikResponse.java rename to src/main/java/com/backend/metadata/kodik/api/model/KodikResponse.java index 1155423..7278381 100644 --- a/src/main/java/com/backend/metadata/kodik/service/api/model/KodikResponse.java +++ b/src/main/java/com/backend/metadata/kodik/api/model/KodikResponse.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service.api.model; +package com.backend.metadata.kodik.api.model; import java.util.List; @@ -9,6 +9,10 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class KodikResponse { public int total; public List results; + @JsonProperty("prev_page") + public String previousPage; + @JsonProperty("next_page") + public String nextPage; @JsonIgnoreProperties(ignoreUnknown = true) public static class Result { diff --git a/src/main/java/com/backend/metadata/kodik/service/api/model/MaterialData.java b/src/main/java/com/backend/metadata/kodik/api/model/MaterialData.java similarity index 98% rename from src/main/java/com/backend/metadata/kodik/service/api/model/MaterialData.java rename to src/main/java/com/backend/metadata/kodik/api/model/MaterialData.java index 7875f87..c40c1bd 100644 --- a/src/main/java/com/backend/metadata/kodik/service/api/model/MaterialData.java +++ b/src/main/java/com/backend/metadata/kodik/api/model/MaterialData.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service.api.model; +package com.backend.metadata.kodik.api.model; import java.util.List; diff --git a/src/main/java/com/backend/metadata/kodik/service/resource/SearchResource.java b/src/main/java/com/backend/metadata/kodik/resource/SearchResource.java similarity index 75% rename from src/main/java/com/backend/metadata/kodik/service/resource/SearchResource.java rename to src/main/java/com/backend/metadata/kodik/resource/SearchResource.java index b4fe865..9979981 100644 --- a/src/main/java/com/backend/metadata/kodik/service/resource/SearchResource.java +++ b/src/main/java/com/backend/metadata/kodik/resource/SearchResource.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service.resource; +package com.backend.metadata.kodik.resource; import java.io.IOException; @@ -6,10 +6,10 @@ import javax.naming.ServiceUnavailableException; import org.jboss.logging.Logger; -import com.backend.metadata.kodik.service.api.KodikAPI; -import com.backend.metadata.kodik.service.api.model.KodikResponse; -import com.backend.metadata.kodik.service.service.KodikAPITokenProvider; -import com.backend.metadata.kodik.service.service.KodikSearchFilterService; +import com.backend.metadata.kodik.api.KodikAPI; +import com.backend.metadata.kodik.api.model.KodikResponse; +import com.backend.metadata.kodik.service.KodikAPITokenProvider; +import com.backend.metadata.kodik.service.KodikSearchFilterService; import io.quarkiverse.retrofit.runtime.EnableRetrofit; import jakarta.ws.rs.BadRequestException; @@ -19,7 +19,7 @@ import jakarta.ws.rs.PathParam; import jakarta.ws.rs.QueryParam; import retrofit2.Response; -@EnableRetrofit("com.backend.metadata.kodik.service.api") +@EnableRetrofit("com.backend.metadata.kodik.api") @Path("/kodik") public class SearchResource { private static final Logger LOG = Logger.getLogger(SearchResource.class); @@ -34,6 +34,24 @@ public class SearchResource { this.searchFilterService = searchFilterService; } + @GET + @Path("/list") + public KodikResponse list() throws ServiceUnavailableException { + try { + Response response = kodikAPI.list(tokenProvider.getKodikToken(), 100, 1).execute(); + if (!response.isSuccessful()) { + LOG.errorv("failed list request with response code {0}, message {1}", + response.code(), + response.message()); + throw new BadRequestException("bad response, code: " + response.code()); + } + return filterResults(response.body()); + } catch (IOException e) { + LOG.warn("i/o error", e); + throw new ServiceUnavailableException("i/o error"); + } + } + @GET @Path("/search") public KodikResponse search(@QueryParam("title") String title) throws ServiceUnavailableException { @@ -45,7 +63,7 @@ public class SearchResource { response.message()); throw new BadRequestException("bad response, code: " + response.code()); } - return searchFilterService.filter(response.body()); + return filterResults(response.body()); } catch (IOException e) { LOG.warn("i/o error", e); throw new ServiceUnavailableException("i/o error"); @@ -63,7 +81,7 @@ public class SearchResource { response.code(), response.message()); throw new BadRequestException("bad response, code: " + response.code()); } - return searchFilterService.filter(response.body()); + return filterResults(response.body()); } catch (IOException e) { LOG.warn("i/o error", e); throw new ServiceUnavailableException("i/o error"); @@ -81,7 +99,7 @@ public class SearchResource { response.code(), response.message()); throw new BadRequestException("bad response, code: " + response.code()); } - return searchFilterService.filter(response.body()); + return filterResults(response.body()); } catch (IOException e) { LOG.warn("i/o error", e); throw new ServiceUnavailableException("i/o error"); @@ -99,7 +117,7 @@ public class SearchResource { response.code(), response.message()); throw new BadRequestException("bad response, code: " + response.code()); } - return searchFilterService.filter(response.body()); + return filterResults(response.body()); } catch (IOException e) { LOG.warn("i/o error", e); throw new ServiceUnavailableException("i/o error"); @@ -116,11 +134,16 @@ public class SearchResource { response.code(), response.message()); throw new BadRequestException("bad response, code: " + response.code()); } - return searchFilterService.filter(response.body()); + return filterResults(response.body()); } catch (IOException e) { LOG.warn("i/o error", e); throw new ServiceUnavailableException("i/o error"); } } + private KodikResponse filterResults(KodikResponse response) { + response.results = searchFilterService.filter(response.results); + return response; + } + } diff --git a/src/main/java/com/backend/metadata/kodik/service/service/KodikAPITokenProvider.java b/src/main/java/com/backend/metadata/kodik/service/KodikAPITokenProvider.java similarity index 85% rename from src/main/java/com/backend/metadata/kodik/service/service/KodikAPITokenProvider.java rename to src/main/java/com/backend/metadata/kodik/service/KodikAPITokenProvider.java index 8864e6a..4b1d658 100644 --- a/src/main/java/com/backend/metadata/kodik/service/service/KodikAPITokenProvider.java +++ b/src/main/java/com/backend/metadata/kodik/service/KodikAPITokenProvider.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service.service; +package com.backend.metadata.kodik.service; import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.config.inject.ConfigProperty; diff --git a/src/main/java/com/backend/metadata/kodik/service/service/KodikSearchFilterService.java b/src/main/java/com/backend/metadata/kodik/service/KodikSearchFilterService.java similarity index 66% rename from src/main/java/com/backend/metadata/kodik/service/service/KodikSearchFilterService.java rename to src/main/java/com/backend/metadata/kodik/service/KodikSearchFilterService.java index 8ea3438..3429882 100644 --- a/src/main/java/com/backend/metadata/kodik/service/service/KodikSearchFilterService.java +++ b/src/main/java/com/backend/metadata/kodik/service/KodikSearchFilterService.java @@ -1,4 +1,4 @@ -package com.backend.metadata.kodik.service.service; +package com.backend.metadata.kodik.service; import java.util.ArrayList; import java.util.Arrays; @@ -9,7 +9,7 @@ import java.util.Set; import org.jboss.logging.Logger; -import com.backend.metadata.kodik.service.api.model.KodikResponse; +import com.backend.metadata.kodik.api.model.KodikResponse; import jakarta.enterprise.context.ApplicationScoped; @@ -19,21 +19,28 @@ public class KodikSearchFilterService { private static final Logger LOG = Logger.getLogger(KodikSearchFilterService.class); private static final Set ALLOWED_TYPES = Set.of("anime-serial", "anime"); - public KodikResponse filter(KodikResponse body) { - Objects.requireNonNull(body, "KodikResponse body cannot be null"); - Objects.requireNonNull(body.results, "KodikResponse.results cannot be null"); + public List filter(List target) { + return filter(target, new HashSet<>()); + } + public List filter(List target, List fullSeen) { Set seenIds = new HashSet<>(); + for (KodikResponse.Result seen : fullSeen) { + seenIds.add(identifier(seen)); + } + return filter(target, seenIds); + } + + public List filter(List target, Set seenIds) { + Objects.requireNonNull(target, "target cannot be null"); List filteredResults = new ArrayList<>(); - for (KodikResponse.Result result : body.results) { + for (KodikResponse.Result result : target) { if (isAllowedType(result) && isUnique(result, seenIds)) { filteredResults.add(result); } } - - body.results = filteredResults; - return body; + return filteredResults; } private boolean isAllowedType(KodikResponse.Result result) {