Move package com.backend.metadata.kodik.service to com.backend.metadata.kodik

This commit is contained in:
2026-03-22 01:24:46 +05:00
parent 3e8409f150
commit 14625ea289
9 changed files with 77 additions and 28 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -1,4 +1,4 @@
package com.backend.metadata.kodik.service.api;
package com.backend.metadata.kodik.api;
import jakarta.enterprise.context.ApplicationScoped;

View File

@@ -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<KodikResponse> list(
@Field("token") String token,
@Field("limit") int limit,
@Field("with_material_data") int withMaterialData);
@FormUrlEncoded
@POST("list")
Call<KodikResponse> list(
@Field("token") String token,
@Field("next") String next,
@Field("limit") int limit,
@Field("with_material_data") int withMaterialData);
@FormUrlEncoded
@POST("search")
Call<KodikResponse> search(

View File

@@ -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<Result> results;
@JsonProperty("prev_page")
public String previousPage;
@JsonProperty("next_page")
public String nextPage;
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Result {

View File

@@ -1,4 +1,4 @@
package com.backend.metadata.kodik.service.api.model;
package com.backend.metadata.kodik.api.model;
import java.util.List;

View File

@@ -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<KodikResponse> 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;
}
}

View File

@@ -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;

View File

@@ -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<String> 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<KodikResponse.Result> filter(List<KodikResponse.Result> target) {
return filter(target, new HashSet<>());
}
public List<KodikResponse.Result> filter(List<KodikResponse.Result> target, List<KodikResponse.Result> fullSeen) {
Set<String> seenIds = new HashSet<>();
for (KodikResponse.Result seen : fullSeen) {
seenIds.add(identifier(seen));
}
return filter(target, seenIds);
}
public List<KodikResponse.Result> filter(List<KodikResponse.Result> target, Set<String> seenIds) {
Objects.requireNonNull(target, "target cannot be null");
List<KodikResponse.Result> 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) {