Move package com.backend.metadata.kodik.service to com.backend.metadata.kodik
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service;
|
package com.backend.metadata.kodik;
|
||||||
|
|
||||||
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service;
|
package com.backend.metadata.kodik;
|
||||||
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service.api;
|
package com.backend.metadata.kodik.api;
|
||||||
|
|
||||||
import jakarta.enterprise.context.ApplicationScoped;
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
|
||||||
@@ -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 io.github.easyretrofit.core.annotation.RetrofitBuilder;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
@@ -10,6 +10,21 @@ import retrofit2.http.POST;
|
|||||||
|
|
||||||
@RetrofitBuilder(baseUrl = "${kodik.api.url}", addConverterFactory = { JacksonConvertFactoryBuilder.class })
|
@RetrofitBuilder(baseUrl = "${kodik.api.url}", addConverterFactory = { JacksonConvertFactoryBuilder.class })
|
||||||
public interface KodikAPI {
|
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
|
@FormUrlEncoded
|
||||||
@POST("search")
|
@POST("search")
|
||||||
Call<KodikResponse> search(
|
Call<KodikResponse> search(
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service.api.model;
|
package com.backend.metadata.kodik.api.model;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -9,6 +9,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|||||||
public class KodikResponse {
|
public class KodikResponse {
|
||||||
public int total;
|
public int total;
|
||||||
public List<Result> results;
|
public List<Result> results;
|
||||||
|
@JsonProperty("prev_page")
|
||||||
|
public String previousPage;
|
||||||
|
@JsonProperty("next_page")
|
||||||
|
public String nextPage;
|
||||||
|
|
||||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
public static class Result {
|
public static class Result {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service.api.model;
|
package com.backend.metadata.kodik.api.model;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service.resource;
|
package com.backend.metadata.kodik.resource;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -6,10 +6,10 @@ import javax.naming.ServiceUnavailableException;
|
|||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
import com.backend.metadata.kodik.service.api.KodikAPI;
|
import com.backend.metadata.kodik.api.KodikAPI;
|
||||||
import com.backend.metadata.kodik.service.api.model.KodikResponse;
|
import com.backend.metadata.kodik.api.model.KodikResponse;
|
||||||
import com.backend.metadata.kodik.service.service.KodikAPITokenProvider;
|
import com.backend.metadata.kodik.service.KodikAPITokenProvider;
|
||||||
import com.backend.metadata.kodik.service.service.KodikSearchFilterService;
|
import com.backend.metadata.kodik.service.KodikSearchFilterService;
|
||||||
|
|
||||||
import io.quarkiverse.retrofit.runtime.EnableRetrofit;
|
import io.quarkiverse.retrofit.runtime.EnableRetrofit;
|
||||||
import jakarta.ws.rs.BadRequestException;
|
import jakarta.ws.rs.BadRequestException;
|
||||||
@@ -19,7 +19,7 @@ import jakarta.ws.rs.PathParam;
|
|||||||
import jakarta.ws.rs.QueryParam;
|
import jakarta.ws.rs.QueryParam;
|
||||||
import retrofit2.Response;
|
import retrofit2.Response;
|
||||||
|
|
||||||
@EnableRetrofit("com.backend.metadata.kodik.service.api")
|
@EnableRetrofit("com.backend.metadata.kodik.api")
|
||||||
@Path("/kodik")
|
@Path("/kodik")
|
||||||
public class SearchResource {
|
public class SearchResource {
|
||||||
private static final Logger LOG = Logger.getLogger(SearchResource.class);
|
private static final Logger LOG = Logger.getLogger(SearchResource.class);
|
||||||
@@ -34,6 +34,24 @@ public class SearchResource {
|
|||||||
this.searchFilterService = searchFilterService;
|
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
|
@GET
|
||||||
@Path("/search")
|
@Path("/search")
|
||||||
public KodikResponse search(@QueryParam("title") String title) throws ServiceUnavailableException {
|
public KodikResponse search(@QueryParam("title") String title) throws ServiceUnavailableException {
|
||||||
@@ -45,7 +63,7 @@ public class SearchResource {
|
|||||||
response.message());
|
response.message());
|
||||||
throw new BadRequestException("bad response, code: " + response.code());
|
throw new BadRequestException("bad response, code: " + response.code());
|
||||||
}
|
}
|
||||||
return searchFilterService.filter(response.body());
|
return filterResults(response.body());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("i/o error", e);
|
LOG.warn("i/o error", e);
|
||||||
throw new ServiceUnavailableException("i/o error");
|
throw new ServiceUnavailableException("i/o error");
|
||||||
@@ -63,7 +81,7 @@ public class SearchResource {
|
|||||||
response.code(), response.message());
|
response.code(), response.message());
|
||||||
throw new BadRequestException("bad response, code: " + response.code());
|
throw new BadRequestException("bad response, code: " + response.code());
|
||||||
}
|
}
|
||||||
return searchFilterService.filter(response.body());
|
return filterResults(response.body());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("i/o error", e);
|
LOG.warn("i/o error", e);
|
||||||
throw new ServiceUnavailableException("i/o error");
|
throw new ServiceUnavailableException("i/o error");
|
||||||
@@ -81,7 +99,7 @@ public class SearchResource {
|
|||||||
response.code(), response.message());
|
response.code(), response.message());
|
||||||
throw new BadRequestException("bad response, code: " + response.code());
|
throw new BadRequestException("bad response, code: " + response.code());
|
||||||
}
|
}
|
||||||
return searchFilterService.filter(response.body());
|
return filterResults(response.body());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("i/o error", e);
|
LOG.warn("i/o error", e);
|
||||||
throw new ServiceUnavailableException("i/o error");
|
throw new ServiceUnavailableException("i/o error");
|
||||||
@@ -99,7 +117,7 @@ public class SearchResource {
|
|||||||
response.code(), response.message());
|
response.code(), response.message());
|
||||||
throw new BadRequestException("bad response, code: " + response.code());
|
throw new BadRequestException("bad response, code: " + response.code());
|
||||||
}
|
}
|
||||||
return searchFilterService.filter(response.body());
|
return filterResults(response.body());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("i/o error", e);
|
LOG.warn("i/o error", e);
|
||||||
throw new ServiceUnavailableException("i/o error");
|
throw new ServiceUnavailableException("i/o error");
|
||||||
@@ -116,11 +134,16 @@ public class SearchResource {
|
|||||||
response.code(), response.message());
|
response.code(), response.message());
|
||||||
throw new BadRequestException("bad response, code: " + response.code());
|
throw new BadRequestException("bad response, code: " + response.code());
|
||||||
}
|
}
|
||||||
return searchFilterService.filter(response.body());
|
return filterResults(response.body());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.warn("i/o error", e);
|
LOG.warn("i/o error", e);
|
||||||
throw new ServiceUnavailableException("i/o error");
|
throw new ServiceUnavailableException("i/o error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private KodikResponse filterResults(KodikResponse response) {
|
||||||
|
response.results = searchFilterService.filter(response.results);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service.service;
|
package com.backend.metadata.kodik.service;
|
||||||
|
|
||||||
import jakarta.enterprise.context.ApplicationScoped;
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.backend.metadata.kodik.service.service;
|
package com.backend.metadata.kodik.service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -9,7 +9,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import org.jboss.logging.Logger;
|
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;
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
|
|
||||||
@@ -19,21 +19,28 @@ public class KodikSearchFilterService {
|
|||||||
private static final Logger LOG = Logger.getLogger(KodikSearchFilterService.class);
|
private static final Logger LOG = Logger.getLogger(KodikSearchFilterService.class);
|
||||||
private static final Set<String> ALLOWED_TYPES = Set.of("anime-serial", "anime");
|
private static final Set<String> ALLOWED_TYPES = Set.of("anime-serial", "anime");
|
||||||
|
|
||||||
public KodikResponse filter(KodikResponse body) {
|
public List<KodikResponse.Result> filter(List<KodikResponse.Result> target) {
|
||||||
Objects.requireNonNull(body, "KodikResponse body cannot be null");
|
return filter(target, new HashSet<>());
|
||||||
Objects.requireNonNull(body.results, "KodikResponse.results cannot be null");
|
}
|
||||||
|
|
||||||
|
public List<KodikResponse.Result> filter(List<KodikResponse.Result> target, List<KodikResponse.Result> fullSeen) {
|
||||||
Set<String> seenIds = new HashSet<>();
|
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<>();
|
List<KodikResponse.Result> filteredResults = new ArrayList<>();
|
||||||
|
|
||||||
for (KodikResponse.Result result : body.results) {
|
for (KodikResponse.Result result : target) {
|
||||||
if (isAllowedType(result) && isUnique(result, seenIds)) {
|
if (isAllowedType(result) && isUnique(result, seenIds)) {
|
||||||
filteredResults.add(result);
|
filteredResults.add(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return filteredResults;
|
||||||
body.results = filteredResults;
|
|
||||||
return body;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isAllowedType(KodikResponse.Result result) {
|
private boolean isAllowedType(KodikResponse.Result result) {
|
||||||
Reference in New Issue
Block a user