diff --git a/README.md b/README.md index 32f33c1..1c03c44 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ -# MyWaifuWrapper -MyWaifuWrapper - An Asynchronous Java API Wrapper for MyWaifuList +

MyWaifuWrapper | An Asynchronous Java API Wrapper for MyWaifuList

+ +

+ + + + +

+

+ + + + + +

+ +# Summary + +This is an Asynchronous API Wrapper for [MyWaifuList](https://mywaifulist.moe/dash) + +# Download + +TODO + +# Usage + +TODO + + diff --git a/pom.xml b/pom.xml index 9349c21..aceb3d2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.goudham.me MyWaifuWrapper - 0.1 + 0.1.2 MyWaifuWrapper diff --git a/src/main/java/org/goudham/me/MyWaifuClient.java b/src/main/java/org/goudham/me/MyWaifuClient.java index 9fde196..ba2fb2f 100644 --- a/src/main/java/org/goudham/me/MyWaifuClient.java +++ b/src/main/java/org/goudham/me/MyWaifuClient.java @@ -1,5 +1,7 @@ package org.goudham.me; +import org.goudham.me.api.entity.waifu.Waifu; +import org.goudham.me.exception.APIResponseException; import org.jetbrains.annotations.NotNull; import javax.net.ssl.SSLParameters; @@ -47,12 +49,12 @@ public class MyWaifuClient { return myWaifuClient; } - public void getWaifu(String slug) { - myWaifuWrapper.getWaifu(httpClient, slug); + public Response getWaifu(String slug) throws APIResponseException { + return myWaifuWrapper.getWaifu(httpClient, slug); } - public void getWaifu(Integer id) { - myWaifuWrapper.getWaifu(httpClient, String.valueOf(id)); + public Response getWaifu(Integer id) throws APIResponseException { + return myWaifuWrapper.getWaifu(httpClient, String.valueOf(id)); } /** @@ -60,7 +62,7 @@ public class MyWaifuClient { * * @param httpClient HttpClient for executing API requests */ - public void setHttpClient(HttpClient httpClient) { + void setHttpClient(HttpClient httpClient) { this.httpClient = httpClient; } diff --git a/src/main/java/org/goudham/me/MyWaifuWrapper.java b/src/main/java/org/goudham/me/MyWaifuWrapper.java index 15dfa4c..662da1c 100644 --- a/src/main/java/org/goudham/me/MyWaifuWrapper.java +++ b/src/main/java/org/goudham/me/MyWaifuWrapper.java @@ -1,6 +1,10 @@ package org.goudham.me; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.goudham.me.api.entity.waifu.Waifu; +import org.goudham.me.exception.APIResponseException; import java.net.URI; import java.net.http.HttpClient; @@ -8,12 +12,13 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; /** * Returns API information to {@link MyWaifuClient} */ -class MyWaifuWrapper { +public class MyWaifuWrapper { private final String version = "1.0"; private static final String host = "https://mywaifulist.moe/api/v1/"; private final String apiKey; @@ -28,7 +33,13 @@ class MyWaifuWrapper { this.apiKey = apiKey; } - private void sendRequest(HttpClient httpClient, String param) { + /** + * + * + * @param httpClient The {@link HttpClient} to use for sending {@link HttpRequest}'s + * @param param The end of the endpoint appended onto the host + */ + private Result sendRequest(HttpClient httpClient, String param) throws APIResponseException { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(host + param)) .version(httpClient.version()) @@ -40,32 +51,38 @@ class MyWaifuWrapper { CompletableFuture> response = httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()); - System.out.println(response); + int responseCode; + String responseBody; + try { + responseCode = response.thenApply(HttpResponse::statusCode).get(); + responseBody = response.thenApply(HttpResponse::body).get(); + } catch (InterruptedException | ExecutionException exp) { + throw new APIResponseException(exp.getMessage(), exp); + } -// String resultBody = ""; -// int resultStatusCode = 0; -// try { -// resultBody = response.thenApply(HttpResponse::body).get(); -// resultStatusCode = response.thenApply(HttpResponse::statusCode).get(); -// -// } catch (InterruptedException | ExecutionException e) { -// e.printStackTrace(); -// } -// -// System.out.println(resultStatusCode); -// System.out.println(resultBody); -// -// try { -// JsonNode parent = objectMapper.readTree(resultBody); -// String waifuData = parent.get("data").toString(); -// Waifu waifu = objectMapper.readValue(waifuData, Waifu.class); -// System.out.println(waifu); -// } catch (JsonProcessingException e) { -// e.printStackTrace(); -// } + return new Result(responseCode, responseBody); } - void getWaifu(HttpClient httpClient, String param) { - sendRequest(httpClient, "waifu/" + param); + Response getWaifu(HttpClient httpClient, String param) throws APIResponseException { + Result waifuResult = sendRequest(httpClient, "waifu/" + param); + Integer statusCode = waifuResult.getStatusCode(); + String body = waifuResult.getBody(); + Waifu waifu = null; + + if (statusCode == 200) { + try { + JsonNode parent = objectMapper.readTree(body); + String waifuData = parent.get("data").toString(); + waifu = objectMapper.readValue(waifuData, Waifu.class); + } catch (JsonProcessingException jpe) { + jpe.printStackTrace(); + + statusCode = 100; + body = "{\"message\":\"If you are seeing this message, this is more than likely a fault in my logic. " + + "Please raise an issue with the printed stacktrace :D\",\"code\":Custom 100}"; + } + } + + return new Response<>(statusCode, body, waifu); } } diff --git a/src/main/java/org/goudham/me/Response.java b/src/main/java/org/goudham/me/Response.java new file mode 100644 index 0000000..c9e2e8e --- /dev/null +++ b/src/main/java/org/goudham/me/Response.java @@ -0,0 +1,30 @@ +package org.goudham.me; + +public class Response { + private T entity; + private final Integer responseCode; + private final String responseBody; + + Response(Integer responseCode, String responseBody, T entity) { + this.responseCode = responseCode; + this.responseBody = responseBody; + this.entity = entity; + } + + Response(Integer responseCode, String responseBody) { + this.responseCode = responseCode; + this.responseBody = responseBody; + } + + public T getEntity() { + return entity; + } + + public Integer getResponseCode() { + return responseCode; + } + + public String getResponseBody() { + return responseBody; + } +} diff --git a/src/main/java/org/goudham/me/Result.java b/src/main/java/org/goudham/me/Result.java new file mode 100644 index 0000000..483e752 --- /dev/null +++ b/src/main/java/org/goudham/me/Result.java @@ -0,0 +1,19 @@ +package org.goudham.me; + +class Result { + private final Integer statusCode; + private final String body; + + Result(Integer statusCode, String body) { + this.statusCode = statusCode; + this.body = body; + } + + Integer getStatusCode() { + return statusCode; + } + + String getBody() { + return body; + } +} diff --git a/src/main/java/org/goudham/me/api/entity/Studio.java b/src/main/java/org/goudham/me/api/entity/Studio.java index dbe47fa..29894bd 100644 --- a/src/main/java/org/goudham/me/api/entity/Studio.java +++ b/src/main/java/org/goudham/me/api/entity/Studio.java @@ -2,10 +2,7 @@ package org.goudham.me.api.entity; import javax.annotation.processing.Generated; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.*; import java.util.Objects; @@ -29,6 +26,12 @@ import java.util.Objects; }) @Generated("jsonschema2pojo") public class Studio { + + @JsonCreator + Studio(String name) { + this.name = name; + } + /** * {@link Studio} ID */ diff --git a/src/main/java/org/goudham/me/api/entity/series/Series.java b/src/main/java/org/goudham/me/api/entity/series/Series.java index 38dc544..f35546e 100644 --- a/src/main/java/org/goudham/me/api/entity/series/Series.java +++ b/src/main/java/org/goudham/me/api/entity/series/Series.java @@ -138,8 +138,7 @@ public class Series { /** * {@link Studio} - *

- * Contains information on a given animation or game development studio + *

Contains information on a given animation or game development studio

* */ @JsonProperty("studio") diff --git a/src/main/java/org/goudham/me/exception/APIResponseException.java b/src/main/java/org/goudham/me/exception/APIResponseException.java new file mode 100644 index 0000000..bfecdaf --- /dev/null +++ b/src/main/java/org/goudham/me/exception/APIResponseException.java @@ -0,0 +1,14 @@ +package org.goudham.me.exception; + + +import org.goudham.me.MyWaifuWrapper; + +/** + * Thrown when {@link MyWaifuWrapper} fails to return API information + * + */ +public class APIResponseException extends Throwable { + public APIResponseException(String errorMessage, Throwable error) { + super(errorMessage, error); + } +}