From 62c3e493d5143a0299be6d1943ee4422f1cb36d0 Mon Sep 17 00:00:00 2001 From: vivek-netision Date: Thu, 26 May 2022 10:45:55 +0530 Subject: [PATCH 001/112] Added new property in Result for RespHeaders. Updated Rest client to return resp headers for case success response (status=200). --- .../main/java/io/imagekit/sdk/models/results/Result.java | 9 +++++++++ .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 3 +++ 2 files changed, 12 insertions(+) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index 9b1fe71..b39836e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -13,6 +13,7 @@ public class Result extends BaseFile { private String message; private String help; private String raw; + private Map> headers; public Result() { @@ -189,4 +190,12 @@ public String toString() { ", fileType='" + fileType + '\'' + '}'; } + + public Map> getHeaders() { + return headers; + } + + public void setHeaders(Map> map) { + this.headers = map; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 76713ec..2e66ae2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -59,6 +59,9 @@ public Result upload(FileCreateRequest fileCreateRequest){ result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); result.setRaw(resp); + if (response.headers()!=null) { + result.setHeaders(response.headers().toMultimap()); + } } else if (response.code()==500) { result=new Result(); From a3484426e8001c03acaab9dbcbcfb08ef88fcce2 Mon Sep 17 00:00:00 2001 From: vivek-netision Date: Thu, 26 May 2022 10:54:38 +0530 Subject: [PATCH 002/112] adding headers for all possible status now.. --- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 2e66ae2..94d4b07 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -59,9 +59,6 @@ public Result upload(FileCreateRequest fileCreateRequest){ result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); result.setRaw(resp); - if (response.headers()!=null) { - result.setHeaders(response.headers().toMultimap()); - } } else if (response.code()==500) { result=new Result(); @@ -73,6 +70,9 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } + if (response.headers()!=null) { + result.setHeaders(response.headers().toMultimap()); + } } catch (IOException e) { e.printStackTrace(); } From 2c7256ad8d05ab9b267cd0ff17b56e6db644fa9b Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 26 May 2022 15:25:21 +0530 Subject: [PATCH 003/112] updated readme file for header response for internal api --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 800827b..41f8c3f 100644 --- a/README.md +++ b/README.md @@ -547,6 +547,15 @@ ImageKit.getInstance().pHashDistance("a4a65595ac94518b", "7838873e791f8400"); // output: 37 (dissimilar images) ``` +**HTTP response of Internal API** + +HTTP response headers of the internal API call can be accessed using the getHeaders function on the Result object. Example: + +```java +Result result = ImageKit.getInstance().upload(fileCreateRequest); +result.getHeaders(); +``` + ## Sample Code Instruction **1. First clone this repository to your system using git.** From 3301f025aa650deee748f18bb30b7b4eba0246e7 Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 27 May 2022 16:42:25 +0530 Subject: [PATCH 004/112] added responsemetadata to set headers, raw and statuscode of response for results object --- .../imagekit/sdk/models/ResponseMetaData.java | 39 +++++++++++++++++++ .../sdk/models/results/ResultList.java | 2 + .../io/imagekit/sdk/tasks/RestClient.java | 9 +++++ 3 files changed, 50 insertions(+) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java new file mode 100644 index 0000000..1f20628 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -0,0 +1,39 @@ +package io.imagekit.sdk.models; + + +import com.google.gson.JsonObject; + +import java.util.Map; + +import okhttp3.ResponseBody; + +public class ResponseMetaData { + + private ResponseBody raw; + private int httpStatusCode; + private Map headers; + + public ResponseBody getRaw() { + return raw; + } + + public void setRaw(ResponseBody raw) { + this.raw = raw; + } + + public int getHttpStatusCode() { + return httpStatusCode; + } + + public void setHttpStatusCode(int httpStatusCode) { + this.httpStatusCode = httpStatusCode; + } + + public Map getHeaders() { + return headers; + } + + public void setHeaders(Map headers) { + this.headers = headers; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index fa74208..3a09c23 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.ResponseMetaData; import java.util.ArrayList; import java.util.List; @@ -14,6 +15,7 @@ public class ResultList { private String help; private String raw; private List results; + public ResponseMetaData responseMetaData; public ResultList() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 94d4b07..76f615e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -160,6 +160,15 @@ else if (response.code()==500) { resultList=new Gson().fromJson(resp,ResultList.class); resultList.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = new HashMap<>(); + response.headers().toMultimap().forEach((key, value) -> value.forEach(k -> mappedHeader.put(key, k))); + resultList.responseMetaData.setHeaders(mappedHeader); + } + if (response.body()!=null) { + resultList.responseMetaData.setRaw(response.body()); + } + resultList.responseMetaData.setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } From 129f636dcdb746b7c16b59e434a01a4d60fba140 Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 27 May 2022 17:01:19 +0530 Subject: [PATCH 005/112] added small fix for rae --- .../main/java/io/imagekit/sdk/models/ResponseMetaData.java | 6 +++--- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 5 +---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java index 1f20628..732c385 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -9,15 +9,15 @@ public class ResponseMetaData { - private ResponseBody raw; + private String raw; private int httpStatusCode; private Map headers; - public ResponseBody getRaw() { + public String getRaw() { return raw; } - public void setRaw(ResponseBody raw) { + public void setRaw(String raw) { this.raw = raw; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 76f615e..cc1d7e1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -149,7 +149,7 @@ public ResultList getFileList(Map options){ List files=new Gson().fromJson(resp,new TypeToken>() {}.getType()); resultList.setResults(files); resultList.setSuccessful(true); - resultList.setRaw(resp); + resultList.responseMetaData.setRaw(resp); } else if (response.code()==500) { resultList.setSuccessful(false); @@ -165,9 +165,6 @@ else if (response.code()==500) { response.headers().toMultimap().forEach((key, value) -> value.forEach(k -> mappedHeader.put(key, k))); resultList.responseMetaData.setHeaders(mappedHeader); } - if (response.body()!=null) { - resultList.responseMetaData.setRaw(response.body()); - } resultList.responseMetaData.setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); From 8e063f3ffe72cd88e8a3d8b79627e44e81cf1c04 Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 27 May 2022 18:17:01 +0530 Subject: [PATCH 006/112] added changes regarding comments --- .../io/imagekit/sdk/models/ResponseMetaData.java | 6 +++--- .../imagekit/sdk/models/results/ResultList.java | 16 ++++++++-------- .../java/io/imagekit/sdk/tasks/RestClient.java | 10 +++++++--- .../io/imagekit/sdk/tasks/RestClientTest.java | 2 +- src/main/java/io/imagekit/sampleapp/App.java | 2 +- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java index 732c385..1b6c24e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -11,7 +11,7 @@ public class ResponseMetaData { private String raw; private int httpStatusCode; - private Map headers; + private String headers; public String getRaw() { return raw; @@ -29,11 +29,11 @@ public void setHttpStatusCode(int httpStatusCode) { this.httpStatusCode = httpStatusCode; } - public Map getHeaders() { + public String getHeaders() { return headers; } - public void setHeaders(Map headers) { + public void setHeaders(String headers) { this.headers = headers; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 3a09c23..05fdab8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -13,9 +13,8 @@ public class ResultList { private boolean isSuccessful; private String message; private String help; - private String raw; private List results; - public ResponseMetaData responseMetaData; + private ResponseMetaData responseMetaData; public ResultList() { @@ -48,17 +47,18 @@ public String getHelp() { public void setHelp(String help) { this.help = help; } - public String getRaw() { - return raw; + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; } - public void setRaw(String raw) { - this.raw = raw; + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; } public List> getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>>() { + if (null!=responseMetaData.getRaw()) { + return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>>() { }.getType()); } return new ArrayList>(); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index cc1d7e1..14f686f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -7,14 +7,17 @@ import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.ResponseMetaData; import io.imagekit.sdk.models.results.*; import okhttp3.*; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.stream.Collectors; public class RestClient { private ImageKit imageKit; @@ -144,12 +147,13 @@ public ResultList getFileList(Map options){ try { Response response = client.newCall(request).execute(); + resultList.setResponseMetaData(new ResponseMetaData()); if (response.code()==200){ String resp=response.body().string(); List files=new Gson().fromJson(resp,new TypeToken>() {}.getType()); resultList.setResults(files); resultList.setSuccessful(true); - resultList.responseMetaData.setRaw(resp); + resultList.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { resultList.setSuccessful(false); @@ -163,9 +167,9 @@ else if (response.code()==500) { if (response.headers()!=null) { Map mappedHeader = new HashMap<>(); response.headers().toMultimap().forEach((key, value) -> value.forEach(k -> mappedHeader.put(key, k))); - resultList.responseMetaData.setHeaders(mappedHeader); + resultList.getResponseMetaData().setHeaders(response.headers().toMultimap().values().stream().map(Object::toString).collect(Collectors.joining(","))); } - resultList.responseMetaData.setHttpStatusCode(response.code()); + resultList.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index 4d7afff..a5cb34c 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -268,7 +268,7 @@ public void valid_getFileList_expectSuccess() { assertEquals("https://api.imagekit.io/v1/files?limit=10&skip=0",SUT.request.url().toString()); - assertThat(resp,is(result.getRaw())); + assertThat(resp,is(result.getResponseMetaData().getRaw())); } @Test diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 685757f..70ac048 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -278,7 +278,7 @@ private static List getList(int skip, int limit) { System.out.println(">> No. of files in server: "+resultList.getResults().size()); System.out.println(">> FileIds: "+resultList.getResults().stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList())); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(resultList.getRaw()); + System.out.println(resultList.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(resultList.getMap()); System.out.println("\n\n"); From 86e5e92a033d807a68f009de245f1663f08549a2 Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 27 May 2022 18:45:46 +0530 Subject: [PATCH 007/112] added minor changes --- .../main/java/io/imagekit/sdk/models/ResponseMetaData.java | 6 +++--- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java index 1b6c24e..732c385 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -11,7 +11,7 @@ public class ResponseMetaData { private String raw; private int httpStatusCode; - private String headers; + private Map headers; public String getRaw() { return raw; @@ -29,11 +29,11 @@ public void setHttpStatusCode(int httpStatusCode) { this.httpStatusCode = httpStatusCode; } - public String getHeaders() { + public Map getHeaders() { return headers; } - public void setHeaders(String headers) { + public void setHeaders(Map headers) { this.headers = headers; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 14f686f..41cf1eb 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -167,7 +167,7 @@ else if (response.code()==500) { if (response.headers()!=null) { Map mappedHeader = new HashMap<>(); response.headers().toMultimap().forEach((key, value) -> value.forEach(k -> mappedHeader.put(key, k))); - resultList.getResponseMetaData().setHeaders(response.headers().toMultimap().values().stream().map(Object::toString).collect(Collectors.joining(","))); + resultList.getResponseMetaData().setHeaders(mappedHeader); } resultList.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { From b55740370a45b12364b87cc0a3b4195d87e8532c Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 28 May 2022 12:26:12 +0530 Subject: [PATCH 008/112] added response metadata changes for Result and define object in constructor --- .../imagekit/sdk/models/results/Result.java | 34 +++++++------------ .../sdk/models/results/ResultList.java | 2 +- .../io/imagekit/sdk/tasks/RestClient.java | 13 +++---- src/main/java/io/imagekit/sampleapp/App.java | 12 +++---- 4 files changed, 27 insertions(+), 34 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index b39836e..9b659d3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.ResponseMetaData; import java.util.HashMap; import java.util.List; @@ -12,11 +13,10 @@ public class Result extends BaseFile { private boolean isSuccessful; private String message; private String help; - private String raw; - private Map> headers; + private ResponseMetaData responseMetaData; public Result() { - + responseMetaData = new ResponseMetaData(); } public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType) { @@ -58,17 +58,9 @@ public void setHelp(String help) { this.help = help; } - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { + if (null!=getResponseMetaData().getRaw()) { + return new Gson().fromJson(getResponseMetaData().getRaw(), new TypeToken>() { }.getType()); } return new HashMap<>(); @@ -170,6 +162,14 @@ public void setFileType(String fileType) { this.fileType = fileType; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "Result{" + @@ -190,12 +190,4 @@ public String toString() { ", fileType='" + fileType + '\'' + '}'; } - - public Map> getHeaders() { - return headers; - } - - public void setHeaders(Map> map) { - this.headers = map; - } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 05fdab8..440b6a4 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -17,7 +17,7 @@ public class ResultList { private ResponseMetaData responseMetaData; public ResultList() { - + responseMetaData = new ResponseMetaData(); } public ResultList(List results) { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 41cf1eb..3c7bb6a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -61,7 +61,7 @@ public Result upload(FileCreateRequest fileCreateRequest){ String resp=response.body().string(); result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result=new Result(); @@ -74,7 +74,9 @@ else if (response.code()==500) { result.setSuccessful(false); } if (response.headers()!=null) { - result.setHeaders(response.headers().toMultimap()); + Map mappedHeader = new HashMap<>(); + response.headers().toMultimap().forEach((key, value) -> value.forEach(k -> mappedHeader.put(key, k))); + result.getResponseMetaData().setHeaders(mappedHeader); } } catch (IOException e) { e.printStackTrace(); @@ -102,7 +104,7 @@ public Result updateDetail(FileUpdateRequest fileUpdateRequest){ String resp=response.body().string(); result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result=new Result(); @@ -147,7 +149,6 @@ public ResultList getFileList(Map options){ try { Response response = client.newCall(request).execute(); - resultList.setResponseMetaData(new ResponseMetaData()); if (response.code()==200){ String resp=response.body().string(); List files=new Gson().fromJson(resp,new TypeToken>() {}.getType()); @@ -198,7 +199,7 @@ public Result getFileDetail(String fileId){ String resp=response.body().string(); result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -317,7 +318,7 @@ public Result deleteFile(String fileId){ result.setMessage("File deleted successfully!"); result.setFileId(fileId); result.setSuccessful(true); - result.setRaw(response.body().string()); + result.getResponseMetaData().setRaw(response.body().string()); } else if (response.code()==500) { result.setSuccessful(false); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 70ac048..70699a7 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -182,7 +182,7 @@ private static void deleteFile(String fileId) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -218,7 +218,7 @@ private static void updateDetails(String fileId) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -260,7 +260,7 @@ private static void getFileDetail(String fileId) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -317,7 +317,7 @@ private static void uploadFromURL() { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -335,7 +335,7 @@ private static void uploadFromBase64() { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -354,7 +354,7 @@ private static void uploadFromBytes() { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); From 07fe9f8c5202d78d2b950aa9d42b7954488a9e84 Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 28 May 2022 14:23:42 +0530 Subject: [PATCH 009/112] added changes to use responseMetadata for all result objects --- .../sdk/models/results/ResultCache.java | 24 +++---- .../sdk/models/results/ResultCacheStatus.java | 24 +++---- .../sdk/models/results/ResultFileDelete.java | 23 ++++--- .../sdk/models/results/ResultMetaData.java | 23 +++---- .../io/imagekit/sdk/tasks/RestClient.java | 62 +++++++++++++++---- .../java/io/imagekit/sdk/utils/Utils.java | 8 +++ src/main/java/io/imagekit/sampleapp/App.java | 10 +-- 7 files changed, 115 insertions(+), 59 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 31a37fe..2c3160a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -6,12 +6,14 @@ import java.util.HashMap; import java.util.Map; +import io.imagekit.sdk.models.ResponseMetaData; + public class ResultCache { private boolean isSuccessful; private String message; private String help; private String requestId; - private String raw; + private ResponseMetaData responseMetaData; public ResultCache() { } @@ -40,17 +42,9 @@ public void setHelp(String help) { this.help = help; } - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { + if (null!=responseMetaData.getRaw()) { + return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { }.getType()); } return new HashMap<>(); @@ -64,6 +58,14 @@ public void setRequestId(String requestId) { this.requestId = requestId; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "ResultCache{" + diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 957c092..8fe2379 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -6,12 +6,14 @@ import java.util.HashMap; import java.util.Map; +import io.imagekit.sdk.models.ResponseMetaData; + public class ResultCacheStatus { private boolean isSuccessful; private String message; private String help; private String status; - private String raw; + private ResponseMetaData responseMetaData; public ResultCacheStatus() { } @@ -40,17 +42,9 @@ public void setHelp(String help) { this.help = help; } - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { + if (null!=responseMetaData.getRaw()) { + return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { }.getType()); } return new HashMap<>(); @@ -64,6 +58,14 @@ public void setStatus(String status) { this.status = status; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "ResultCache{" + diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index de0dff8..2bf850b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -9,13 +9,15 @@ import java.util.List; import java.util.Map; +import io.imagekit.sdk.models.ResponseMetaData; + public class ResultFileDelete { private boolean isSuccessful; private String message; private String help; - private String raw; private List successfullyDeletedFileIds; private List missingFileIds; + private ResponseMetaData responseMetaData; public ResultFileDelete() { successfullyDeletedFileIds=new ArrayList<>(); @@ -45,17 +47,10 @@ public String getHelp() { public void setHelp(String help) { this.help = help; } - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { + if (null!=responseMetaData.getRaw()) { + return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { }.getType()); } return new HashMap<>(); @@ -77,6 +72,14 @@ public void setMissingFileIds(List missingFileIds) { this.missingFileIds = missingFileIds; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "ResultFileDelete{" + diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index 5d3ad61..3af8884 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.models.MetaData; +import io.imagekit.sdk.models.ResponseMetaData; import java.util.HashMap; import java.util.Map; @@ -12,8 +13,8 @@ public class ResultMetaData { private boolean isSuccessful; private String message; private String help; - private String raw; private MetaData results; + private ResponseMetaData responseMetaData; public ResultMetaData() { } @@ -42,17 +43,9 @@ public void setHelp(String help) { this.help = help; } - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { + if (null!=responseMetaData.getRaw()) { + return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { }.getType()); } return new HashMap<>(); @@ -66,6 +59,14 @@ public void setResults(MetaData results) { this.results = results; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "ResultMetaData{" + diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 3c7bb6a..6d9880d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -9,6 +9,7 @@ import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.ResponseMetaData; import io.imagekit.sdk.models.results.*; +import io.imagekit.sdk.utils.Utils; import okhttp3.*; import java.io.IOException; @@ -74,10 +75,10 @@ else if (response.code()==500) { result.setSuccessful(false); } if (response.headers()!=null) { - Map mappedHeader = new HashMap<>(); - response.headers().toMultimap().forEach((key, value) -> value.forEach(k -> mappedHeader.put(key, k))); - result.getResponseMetaData().setHeaders(mappedHeader); + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -116,6 +117,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -166,8 +172,7 @@ else if (response.code()==500) { resultList.setSuccessful(false); } if (response.headers()!=null) { - Map mappedHeader = new HashMap<>(); - response.headers().toMultimap().forEach((key, value) -> value.forEach(k -> mappedHeader.put(key, k))); + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); resultList.getResponseMetaData().setHeaders(mappedHeader); } resultList.getResponseMetaData().setHttpStatusCode(response.code()); @@ -210,6 +215,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -239,7 +249,7 @@ public ResultMetaData getFileMetaData(String fileId){ MetaData metaData =new Gson().fromJson(resp,MetaData.class); result.setResults(metaData); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -250,6 +260,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultMetaData.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -279,7 +294,7 @@ public ResultMetaData getRemoteFileMetaData(String url){ MetaData metaData =new Gson().fromJson(resp,MetaData.class); result.setResults(metaData); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -290,6 +305,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultMetaData.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -329,6 +349,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -360,12 +385,12 @@ public ResultFileDelete bulkDeleteFiles(List fileIds){ result=new Gson().fromJson(resp,ResultFileDelete.class); result.setMessage("File deleted successfully!"); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==404){ String resp=response.body().string(); result=new Gson().fromJson(resp,ResultFileDelete.class); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); result.setSuccessful(false); } else if (response.code()==500) { @@ -377,6 +402,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultFileDelete.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -405,7 +435,7 @@ public ResultCache purgeCache(String url){ String resp=response.body().string(); result =new Gson().fromJson(resp,ResultCache.class); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -416,6 +446,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultCache.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } @@ -444,7 +479,7 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId){ String resp=response.body().string(); result =new Gson().fromJson(resp,ResultCacheStatus.class); result.setSuccessful(true); - result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -455,6 +490,11 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultCacheStatus.class); result.setSuccessful(false); } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + result.getResponseMetaData().setHeaders(mappedHeader); + } + result.getResponseMetaData().setHttpStatusCode(response.code()); } catch (IOException e) { e.printStackTrace(); } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 380e3c0..e5587de 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -5,7 +5,9 @@ import java.io.*; import java.net.URL; import java.util.Base64; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; public class Utils { @@ -82,4 +84,10 @@ public static Configuration getSystemConfig(Class cls) throws IOException{ return config; } + public static Map mapListOfStringToString(Map> listMap) { + Map stringMap = new HashMap<>(); + listMap.forEach((key, value) -> value.forEach(k -> stringMap.put(key, k))); + return stringMap; + } + } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 70699a7..b677ca9 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -153,7 +153,7 @@ private static void getPurgeCacheStatus(String requestId) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -167,7 +167,7 @@ private static ResultCache purgeCache(String filePath) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -197,7 +197,7 @@ private static void deleteFiles(List files) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -232,7 +232,7 @@ private static void getFileMetaData(String fileId) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); @@ -246,7 +246,7 @@ private static void getRemoteFileMetaData(String url) { System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getRaw()); + System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getMap()); System.out.println("\n\n"); From f03803ae781acb5181531b460c648eecbec518bb Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 28 May 2022 14:33:18 +0530 Subject: [PATCH 010/112] initial value added --- .../main/java/io/imagekit/sdk/models/results/ResultCache.java | 1 + .../java/io/imagekit/sdk/models/results/ResultCacheStatus.java | 1 + .../java/io/imagekit/sdk/models/results/ResultFileDelete.java | 1 + .../main/java/io/imagekit/sdk/models/results/ResultMetaData.java | 1 + 4 files changed, 4 insertions(+) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 2c3160a..50999c0 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -16,6 +16,7 @@ public class ResultCache { private ResponseMetaData responseMetaData; public ResultCache() { + responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 8fe2379..098a11b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -16,6 +16,7 @@ public class ResultCacheStatus { private ResponseMetaData responseMetaData; public ResultCacheStatus() { + responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index 2bf850b..64ad36a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -22,6 +22,7 @@ public class ResultFileDelete { public ResultFileDelete() { successfullyDeletedFileIds=new ArrayList<>(); missingFileIds=new ArrayList<>(); + responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index 3af8884..185e769 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -17,6 +17,7 @@ public class ResultMetaData { private ResponseMetaData responseMetaData; public ResultMetaData() { + responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { From e4d866d5235305eb7a92ff9699017811c1e178fd Mon Sep 17 00:00:00 2001 From: amanforindia Date: Sat, 28 May 2022 17:24:00 +0530 Subject: [PATCH 011/112] Reduce code duplication --- .../imagekit/sdk/models/results/Result.java | 7 +- .../sdk/models/results/ResultCache.java | 3 +- .../sdk/models/results/ResultCacheStatus.java | 3 +- .../sdk/models/results/ResultFileDelete.java | 3 +- .../sdk/models/results/ResultList.java | 3 +- .../sdk/models/results/ResultMetaData.java | 3 +- .../io/imagekit/sdk/tasks/RestClient.java | 71 +++---------------- .../java/io/imagekit/sdk/utils/Utils.java | 22 +++++- 8 files changed, 40 insertions(+), 75 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index 9b659d3..04faaeb 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -13,10 +13,9 @@ public class Result extends BaseFile { private boolean isSuccessful; private String message; private String help; - private ResponseMetaData responseMetaData; + private ResponseMetaData responseMetaData = new ResponseMetaData(); public Result() { - responseMetaData = new ResponseMetaData(); } public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType) { @@ -59,8 +58,8 @@ public void setHelp(String help) { } public Map getMap(){ - if (null!=getResponseMetaData().getRaw()) { - return new Gson().fromJson(getResponseMetaData().getRaw(), new TypeToken>() { + if (null!=responseMetaData.getRaw()) { + return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { }.getType()); } return new HashMap<>(); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 50999c0..2c9986a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -13,10 +13,9 @@ public class ResultCache { private String message; private String help; private String requestId; - private ResponseMetaData responseMetaData; + private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultCache() { - responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 098a11b..0b3b44b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -13,10 +13,9 @@ public class ResultCacheStatus { private String message; private String help; private String status; - private ResponseMetaData responseMetaData; + private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultCacheStatus() { - responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index 64ad36a..abd3280 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -17,12 +17,11 @@ public class ResultFileDelete { private String help; private List successfullyDeletedFileIds; private List missingFileIds; - private ResponseMetaData responseMetaData; + private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultFileDelete() { successfullyDeletedFileIds=new ArrayList<>(); missingFileIds=new ArrayList<>(); - responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 440b6a4..1eda49f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -14,10 +14,9 @@ public class ResultList { private String message; private String help; private List results; - private ResponseMetaData responseMetaData; + private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultList() { - responseMetaData = new ResponseMetaData(); } public ResultList(List results) { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index 185e769..b153cbe 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -14,10 +14,9 @@ public class ResultMetaData { private String message; private String help; private MetaData results; - private ResponseMetaData responseMetaData; + private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultMetaData() { - responseMetaData = new ResponseMetaData(); } public boolean isSuccessful() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 6d9880d..51faee2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -58,11 +58,11 @@ public Result upload(FileCreateRequest fileCreateRequest){ try { Response response = client.newCall(request).execute(); + if (response.code()==200){ String resp=response.body().string(); result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result=new Result(); @@ -74,11 +74,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -105,7 +101,6 @@ public Result updateDetail(FileUpdateRequest fileUpdateRequest){ String resp=response.body().string(); result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result=new Result(); @@ -117,11 +112,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -160,7 +151,6 @@ public ResultList getFileList(Map options){ List files=new Gson().fromJson(resp,new TypeToken>() {}.getType()); resultList.setResults(files); resultList.setSuccessful(true); - resultList.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { resultList.setSuccessful(false); @@ -171,11 +161,7 @@ else if (response.code()==500) { resultList=new Gson().fromJson(resp,ResultList.class); resultList.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - resultList.getResponseMetaData().setHeaders(mappedHeader); - } - resultList.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(resultList.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -204,7 +190,6 @@ public Result getFileDetail(String fileId){ String resp=response.body().string(); result=new Gson().fromJson(resp,Result.class); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -215,11 +200,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -249,7 +230,6 @@ public ResultMetaData getFileMetaData(String fileId){ MetaData metaData =new Gson().fromJson(resp,MetaData.class); result.setResults(metaData); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -260,11 +240,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultMetaData.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -294,7 +270,6 @@ public ResultMetaData getRemoteFileMetaData(String url){ MetaData metaData =new Gson().fromJson(resp,MetaData.class); result.setResults(metaData); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -305,11 +280,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultMetaData.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -338,7 +309,6 @@ public Result deleteFile(String fileId){ result.setMessage("File deleted successfully!"); result.setFileId(fileId); result.setSuccessful(true); - result.getResponseMetaData().setRaw(response.body().string()); } else if (response.code()==500) { result.setSuccessful(false); @@ -349,11 +319,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -385,7 +351,6 @@ public ResultFileDelete bulkDeleteFiles(List fileIds){ result=new Gson().fromJson(resp,ResultFileDelete.class); result.setMessage("File deleted successfully!"); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==404){ String resp=response.body().string(); @@ -402,11 +367,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultFileDelete.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -435,7 +396,6 @@ public ResultCache purgeCache(String url){ String resp=response.body().string(); result =new Gson().fromJson(resp,ResultCache.class); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -446,11 +406,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultCache.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -479,7 +435,6 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId){ String resp=response.body().string(); result =new Gson().fromJson(resp,ResultCacheStatus.class); result.setSuccessful(true); - result.getResponseMetaData().setRaw(resp); } else if (response.code()==500) { result.setSuccessful(false); @@ -490,11 +445,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultCacheStatus.class); result.setSuccessful(false); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); - result.getResponseMetaData().setHeaders(mappedHeader); - } - result.getResponseMetaData().setHttpStatusCode(response.code()); + Utils.populateResponseMetadata(result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index e5587de..e0f6c43 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -1,6 +1,8 @@ package io.imagekit.sdk.utils; import io.imagekit.sdk.config.Configuration; +import io.imagekit.sdk.models.ResponseMetaData; +import okhttp3.Response; import java.io.*; import java.net.URL; @@ -8,7 +10,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Properties; +import java.util.Set; +import java.util.stream.Collectors; public class Utils { @@ -86,8 +91,23 @@ public static Configuration getSystemConfig(Class cls) throws IOException{ public static Map mapListOfStringToString(Map> listMap) { Map stringMap = new HashMap<>(); - listMap.forEach((key, value) -> value.forEach(k -> stringMap.put(key, k))); + Set>> listMapEntries = listMap.entrySet(); + for (Entry> entry : listMapEntries) { + stringMap.put(entry.getKey(), entry.getValue().stream().collect(Collectors.joining(","))); + + } return stringMap; } + + public static void populateResponseMetadata(ResponseMetaData responseMetadata, Response response) throws IOException { + if (response.code()==200){ + responseMetadata.setRaw(response.body().string()); + } + if (response.headers()!=null) { + Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + responseMetadata.setHeaders(mappedHeader); + } + responseMetadata.setHttpStatusCode(response.code()); + } } From f7ae5fd6104c9ba1ef845e132c35537afa8691cf Mon Sep 17 00:00:00 2001 From: amanforindia Date: Sat, 28 May 2022 17:29:22 +0530 Subject: [PATCH 012/112] Improve README documentation --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 41f8c3f..3349cd7 100644 --- a/README.md +++ b/README.md @@ -547,13 +547,15 @@ ImageKit.getInstance().pHashDistance("a4a65595ac94518b", "7838873e791f8400"); // output: 37 (dissimilar images) ``` -**HTTP response of Internal API** +**HTTP response metadata of Internal API** -HTTP response headers of the internal API call can be accessed using the getHeaders function on the Result object. Example: +HTTP response metadata of the internal API call can be accessed using the getResponseMetaData function on the Result (or ResultList, ResultCache etc.) object. Example: ```java Result result = ImageKit.getInstance().upload(fileCreateRequest); -result.getHeaders(); +result.getResponseMetaData().getRaw(); +result.getResponseMetaData().getHeaders(); +result.getResponseMetaData().getHttpStatusCode(); ``` ## Sample Code Instruction From 6865d8c6f5e0e1f10053a34656f4e35d68ac7b4a Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 28 May 2022 18:40:49 +0530 Subject: [PATCH 013/112] Add tags API --- .../main/java/io/imagekit/sdk/ImageKit.java | 9 +++++++ .../sdk/models/FileCreateRequest.java | 14 +++++++++++ .../io/imagekit/sdk/tasks/RestClient.java | 24 +++++++++++++++++++ src/main/java/io/imagekit/sampleapp/App.java | 15 ++++++++++++ 4 files changed, 62 insertions(+) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index cae48e4..7c2830b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -199,4 +199,13 @@ public Map getAuthenticationParameters(String token, long expire public int pHashDistance(String firstHex, String secondHex){ return Calculation.getHammingDistance(firstHex,secondHex); } + + /** + * + * @param fileCreateRequest is a object which contains fileIds and tags as a parameters + * @return ArrayList of String + */ + public List addTags(FileCreateRequest fileCreateRequest){ + return restClient.addTags(fileCreateRequest); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java index 19ad6f1..a3fc45d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java @@ -9,6 +9,7 @@ import java.util.List; public class FileCreateRequest { + public List fileIds; public URL url; public String base64; public byte[] bytes; @@ -38,6 +39,19 @@ public FileCreateRequest(byte[] bytes, String fileName) { this.useUniqueFileName=true; } + public FileCreateRequest(List fileIds, List tags) { + this.fileIds = fileIds; + this.tags = tags; + } + + public List getFileIds() { + return fileIds; + } + + public void setFileIds(List fileIds) { + this.fileIds = fileIds; + } + public String getFileName() { return fileName; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 51faee2..ca2681f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -451,4 +451,28 @@ else if (response.code()==500) { } return result; } + + public List addTags(FileCreateRequest fileCreateRequest){ + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + MultipartBody body=multipartBuilder.build(fileCreateRequest); + + request=new Request.Builder() + .url("https://upload.imagekit.io/api/v1/files/addTags") + .post(body) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("response:===> " + response); + } catch (IOException e) { + e.printStackTrace(); + } + return new ArrayList<>(); + } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index b677ca9..10c3023 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -30,6 +30,7 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); uploadFromBytes(); + addTags(); // // calculateDistance(); // generatingAuthParams(); @@ -359,4 +360,18 @@ private static void uploadFromBytes() { System.out.println(result.getMap()); System.out.println("\n\n"); } + + private static void addTags() { + List fileIds = new ArrayList<>(); + fileIds.add("62921726c53a6618d796e576"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + FileCreateRequest fileCreateRequest =new FileCreateRequest(fileIds, tags); + List result = ImageKit.getInstance().addTags(fileCreateRequest); + System.out.println(">> Add Tags done."); + System.out.println(Color.ANSI_GREEN+">> Response tags:"+Color.ANSI_RESET); + System.out.println(result); + System.out.println("\n\n"); + } } From 89a0e795873be491cf50e287ba520053dbbb45d6 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 30 May 2022 17:32:48 +0530 Subject: [PATCH 014/112] added few changes for add tags --- .../imagekit/sdk/models/FileCreateRequest.java | 18 +++++++++++------- .../imagekit/sdk/tasks/MultipartBuilder.java | 13 +++++++++---- .../java/io/imagekit/sdk/tasks/RestClient.java | 17 +++++++++++------ .../main/java/io/imagekit/sdk/utils/Utils.java | 16 ++++++++++++++-- src/main/java/io/imagekit/sampleapp/App.java | 4 ++-- 5 files changed, 47 insertions(+), 21 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java index a3fc45d..c43fffd 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java @@ -7,6 +7,7 @@ import java.net.URL; import java.util.List; +import java.util.stream.Collectors; public class FileCreateRequest { public List fileIds; @@ -111,13 +112,16 @@ public void setResponseFields(List responseFields) { @Override public String toString() { return "FileCreateRequest{" + - "fileName='" + fileName + '\'' + - ", useUniqueFileName=" + useUniqueFileName + - ", tags=" + tags + - ", folder='" + folder + '\'' + - ", isPrivateFile=" + isPrivateFile + - ", customCoordinates=" + customCoordinates + - ", responseFields=" + responseFields + +// "fileName='" + fileName + '\'' + +// ", useUniqueFileName=" + useUniqueFileName + + "fileIds=" + fileIds.stream().map(name -> ('"' + name + '"')) + .collect(Collectors.toList()) + + ", tags=" + tags.stream().map(name -> ('"' + name + '"')) + .collect(Collectors.toList()) + +// ", folder='" + folder + '\'' + +// ", isPrivateFile=" + isPrivateFile + +// ", customCoordinates=" + customCoordinates + +// ", responseFields=" + responseFields + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index bc6cc92..efd9298 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -11,6 +11,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; public class MultipartBuilder { public MultipartBody build(FileCreateRequest fileCreateRequest){ @@ -22,23 +23,27 @@ public MultipartBody build(FileCreateRequest fileCreateRequest){ builder.addFormDataPart("file", fileCreateRequest.base64); } else if (null!=fileCreateRequest.bytes){ builder.addFormDataPart("file", Utils.bytesToBase64(fileCreateRequest.bytes)); + } else if (null!=fileCreateRequest.fileIds){ + builder.addFormDataPart("fileIds", String.join(",", fileCreateRequest.fileIds)); } else { throw new RuntimeException("Error: File not provided."); } - if (null!=fileCreateRequest.fileName) { - builder.addFormDataPart("fileName", fileCreateRequest.fileName); + if (null!=fileCreateRequest.fileName || null !=fileCreateRequest.fileIds) { + if (fileCreateRequest.fileName != null) { + builder.addFormDataPart("fileName", fileCreateRequest.fileName); + } } else { throw new RuntimeException("Error: Filename not provided"); } if (fileCreateRequest.useUniqueFileName) { builder.addFormDataPart("useUniqueFileName", "true"); - }else { + } else { builder.addFormDataPart("useUniqueFileName", "false"); } if (null!=fileCreateRequest.tags) { - builder.addFormDataPart("tags", Utils.listToString(fileCreateRequest.tags)); + builder.addFormDataPart("tags", String.join(",", fileCreateRequest.tags)); } if (null!=fileCreateRequest.folder) { builder.addFormDataPart("folder", fileCreateRequest.folder); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index ca2681f..f6b1a8f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,6 +1,7 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; @@ -56,12 +57,14 @@ public Result upload(FileCreateRequest fileCreateRequest){ .headers(Headers.of(headers)) .build(); + + System.out.println("request upload:====> " + request); try { Response response = client.newCall(request).execute(); - + String respBody = ""; if (response.code()==200){ - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); + respBody=response.body().string(); + result=new Gson().fromJson(respBody,Result.class); result.setSuccessful(true); } else if (response.code()==500) { @@ -74,7 +77,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response); } catch (IOException e) { e.printStackTrace(); } @@ -460,14 +463,16 @@ public List addTags(FileCreateRequest fileCreateRequest){ headers.put("Authorization",credential); MultipartBody body=multipartBuilder.build(fileCreateRequest); - + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), String.valueOf(fileCreateRequest)); + System.out.println("FileCreateRequest:==>" + String.valueOf(fileCreateRequest)); request=new Request.Builder() - .url("https://upload.imagekit.io/api/v1/files/addTags") + .url("https://api.imagekit.io/v1/files/addTags") .post(body) .headers(Headers.of(headers)) .build(); try { + System.out.println("request:==> " + request); Response response = client.newCall(request).execute(); System.out.println("response:===> " + response); } catch (IOException e) { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index e0f6c43..fdf1dc9 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -98,10 +98,22 @@ public static Map mapListOfStringToString(Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + responseMetadata.setHeaders(mappedHeader); + } + responseMetadata.setHttpStatusCode(response.code()); + } + + public static void populateResponseMetadata(String respBody, ResponseMetaData responseMetadata, Response response) throws IOException { if (response.code()==200){ - responseMetadata.setRaw(response.body().string()); + responseMetadata.setRaw(respBody); } if (response.headers()!=null) { Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 10c3023..3d02a08 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -29,7 +29,7 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); - uploadFromBytes(); +// uploadFromBytes(); addTags(); // // calculateDistance(); @@ -363,7 +363,7 @@ private static void uploadFromBytes() { private static void addTags() { List fileIds = new ArrayList<>(); - fileIds.add("62921726c53a6618d796e576"); + fileIds.add("6294624d68c3b350325d37f0"); List tags = new ArrayList<>(); tags.add("tag1"); tags.add("tag2"); From a7e86bbabc448aa7aaa0715c43de3debd9f52880 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 10:15:14 +0530 Subject: [PATCH 015/112] added fix for 400 add tags api --- .../main/java/io/imagekit/sdk/ImageKit.java | 4 +- .../sdk/models/FileCreateRequest.java | 32 +++----------- .../io/imagekit/sdk/models/TagsRequest.java | 38 ++++++++++++++++ .../sdk/models/results/ResultTags.java | 44 +++++++++++++++++++ .../imagekit/sdk/tasks/MultipartBuilder.java | 13 ++---- .../io/imagekit/sdk/tasks/RestClient.java | 29 +++++++----- src/main/java/io/imagekit/sampleapp/App.java | 7 +-- 7 files changed, 116 insertions(+), 51 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 7c2830b..7781efc 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -205,7 +205,7 @@ public int pHashDistance(String firstHex, String secondHex){ * @param fileCreateRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public List addTags(FileCreateRequest fileCreateRequest){ - return restClient.addTags(fileCreateRequest); + public ResultTags addTags(TagsRequest tagsRequest){ + return restClient.addTags(tagsRequest); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java index c43fffd..19ad6f1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java @@ -7,10 +7,8 @@ import java.net.URL; import java.util.List; -import java.util.stream.Collectors; public class FileCreateRequest { - public List fileIds; public URL url; public String base64; public byte[] bytes; @@ -40,19 +38,6 @@ public FileCreateRequest(byte[] bytes, String fileName) { this.useUniqueFileName=true; } - public FileCreateRequest(List fileIds, List tags) { - this.fileIds = fileIds; - this.tags = tags; - } - - public List getFileIds() { - return fileIds; - } - - public void setFileIds(List fileIds) { - this.fileIds = fileIds; - } - public String getFileName() { return fileName; } @@ -112,16 +97,13 @@ public void setResponseFields(List responseFields) { @Override public String toString() { return "FileCreateRequest{" + -// "fileName='" + fileName + '\'' + -// ", useUniqueFileName=" + useUniqueFileName + - "fileIds=" + fileIds.stream().map(name -> ('"' + name + '"')) - .collect(Collectors.toList()) + - ", tags=" + tags.stream().map(name -> ('"' + name + '"')) - .collect(Collectors.toList()) + -// ", folder='" + folder + '\'' + -// ", isPrivateFile=" + isPrivateFile + -// ", customCoordinates=" + customCoordinates + -// ", responseFields=" + responseFields + + "fileName='" + fileName + '\'' + + ", useUniqueFileName=" + useUniqueFileName + + ", tags=" + tags + + ", folder='" + folder + '\'' + + ", isPrivateFile=" + isPrivateFile + + ", customCoordinates=" + customCoordinates + + ", responseFields=" + responseFields + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java new file mode 100644 index 0000000..0a5795b --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java @@ -0,0 +1,38 @@ +package io.imagekit.sdk.models; + +import java.util.List; +import java.util.stream.Collectors; + +public class TagsRequest { + public List fileIds; + public List tags; + + public TagsRequest(List fileIds, List tags) { + this.fileIds = fileIds; + this.tags = tags; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public List getFileIds() { + return fileIds; + } + + public void setFileIds(List fileIds) { + this.fileIds = fileIds; + } + + @Override + public String toString() { + return "TagsRequest{" + + "fileIds=" + fileIds.stream().map(name -> ('"' + name + '"')).collect(Collectors.toList()) + + ", tags=" + tags.stream().map(name -> ('"' + name + '"')).collect(Collectors.toList()) + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java new file mode 100644 index 0000000..b938b17 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java @@ -0,0 +1,44 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultTags { + private boolean isSuccessful; + private String message; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultTags() { + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultList{" + + "isSuccessful=" + isSuccessful + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index efd9298..bc6cc92 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -11,7 +11,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.stream.Collectors; public class MultipartBuilder { public MultipartBody build(FileCreateRequest fileCreateRequest){ @@ -23,27 +22,23 @@ public MultipartBody build(FileCreateRequest fileCreateRequest){ builder.addFormDataPart("file", fileCreateRequest.base64); } else if (null!=fileCreateRequest.bytes){ builder.addFormDataPart("file", Utils.bytesToBase64(fileCreateRequest.bytes)); - } else if (null!=fileCreateRequest.fileIds){ - builder.addFormDataPart("fileIds", String.join(",", fileCreateRequest.fileIds)); } else { throw new RuntimeException("Error: File not provided."); } - if (null!=fileCreateRequest.fileName || null !=fileCreateRequest.fileIds) { - if (fileCreateRequest.fileName != null) { - builder.addFormDataPart("fileName", fileCreateRequest.fileName); - } + if (null!=fileCreateRequest.fileName) { + builder.addFormDataPart("fileName", fileCreateRequest.fileName); } else { throw new RuntimeException("Error: Filename not provided"); } if (fileCreateRequest.useUniqueFileName) { builder.addFormDataPart("useUniqueFileName", "true"); - } else { + }else { builder.addFormDataPart("useUniqueFileName", "false"); } if (null!=fileCreateRequest.tags) { - builder.addFormDataPart("tags", String.join(",", fileCreateRequest.tags)); + builder.addFormDataPart("tags", Utils.listToString(fileCreateRequest.tags)); } if (null!=fileCreateRequest.folder) { builder.addFormDataPart("folder", fileCreateRequest.folder); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index f6b1a8f..f91183c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,25 +1,22 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; -import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; -import io.imagekit.sdk.models.ResponseMetaData; +import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; import okhttp3.*; import java.io.IOException; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.stream.Collectors; public class RestClient { private ImageKit imageKit; @@ -455,29 +452,37 @@ else if (response.code()==500) { return result; } - public List addTags(FileCreateRequest fileCreateRequest){ + public ResultTags addTags(TagsRequest tagsRequest) { + ResultTags result = new ResultTags(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); headers.put("Accept-Encoding","application/json"); headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - MultipartBody body=multipartBuilder.build(fileCreateRequest); - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), String.valueOf(fileCreateRequest)); - System.out.println("FileCreateRequest:==>" + String.valueOf(fileCreateRequest)); + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(tagsRequest)); request=new Request.Builder() .url("https://api.imagekit.io/v1/files/addTags") - .post(body) + .post(requestBody) .headers(Headers.of(headers)) .build(); try { - System.out.println("request:==> " + request); Response response = client.newCall(request).execute(); - System.out.println("response:===> " + response); + String resp = response.body().string(); + if (response.code() == 200) { + result =new Gson().fromJson(resp, ResultTags.class); + result.setSuccessful(true); + result.setMessage(response.message().equals("") ? response.message() : "Added Tags SuccessFully."); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response); + } catch (IOException e) { e.printStackTrace(); } - return new ArrayList<>(); + return result; } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 3d02a08..eca88e3 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -7,6 +7,7 @@ import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.tasks.UrlGen; import io.imagekit.sdk.utils.Utils; @@ -363,12 +364,12 @@ private static void uploadFromBytes() { private static void addTags() { List fileIds = new ArrayList<>(); - fileIds.add("6294624d68c3b350325d37f0"); + fileIds.add("62958deef33aa80bdadf7533"); List tags = new ArrayList<>(); tags.add("tag1"); tags.add("tag2"); - FileCreateRequest fileCreateRequest =new FileCreateRequest(fileIds, tags); - List result = ImageKit.getInstance().addTags(fileCreateRequest); + TagsRequest tagsRequest =new TagsRequest(fileIds, tags); + ResultTags result = ImageKit.getInstance().addTags(tagsRequest); System.out.println(">> Add Tags done."); System.out.println(Color.ANSI_GREEN+">> Response tags:"+Color.ANSI_RESET); System.out.println(result); From 8b71181daf2058297629f682af2c5eb8276f5adf Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 10:32:32 +0530 Subject: [PATCH 016/112] fix respBody regarding issue in util --- .../io/imagekit/sdk/tasks/RestClient.java | 68 +++++++++++-------- .../java/io/imagekit/sdk/utils/Utils.java | 13 ++-- 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 51faee2..390418f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -58,10 +58,10 @@ public Result upload(FileCreateRequest fileCreateRequest){ try { Response response = client.newCall(request).execute(); - + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); + respBody = response.body().string(); + result=new Gson().fromJson(respBody,Result.class); result.setSuccessful(true); } else if (response.code()==500) { @@ -74,7 +74,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -97,9 +97,10 @@ public Result updateDetail(FileUpdateRequest fileUpdateRequest){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); + respBody=response.body().string(); + result=new Gson().fromJson(respBody,Result.class); result.setSuccessful(true); } else if (response.code()==500) { @@ -112,7 +113,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -146,9 +147,10 @@ public ResultList getFileList(Map options){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - List files=new Gson().fromJson(resp,new TypeToken>() {}.getType()); + respBody=response.body().string(); + List files=new Gson().fromJson(respBody,new TypeToken>() {}.getType()); resultList.setResults(files); resultList.setSuccessful(true); } @@ -161,7 +163,7 @@ else if (response.code()==500) { resultList=new Gson().fromJson(resp,ResultList.class); resultList.setSuccessful(false); } - Utils.populateResponseMetadata(resultList.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -186,9 +188,10 @@ public Result getFileDetail(String fileId){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); + respBody=response.body().string(); + result=new Gson().fromJson(respBody,Result.class); result.setSuccessful(true); } else if (response.code()==500) { @@ -200,7 +203,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -225,9 +228,10 @@ public ResultMetaData getFileMetaData(String fileId){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - MetaData metaData =new Gson().fromJson(resp,MetaData.class); + respBody = response.body().string(); + MetaData metaData =new Gson().fromJson(respBody,MetaData.class); result.setResults(metaData); result.setSuccessful(true); } @@ -240,7 +244,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultMetaData.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -265,9 +269,10 @@ public ResultMetaData getRemoteFileMetaData(String url){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - MetaData metaData =new Gson().fromJson(resp,MetaData.class); + respBody=response.body().string(); + MetaData metaData =new Gson().fromJson(respBody,MetaData.class); result.setResults(metaData); result.setSuccessful(true); } @@ -280,7 +285,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultMetaData.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -305,7 +310,9 @@ public Result deleteFile(String fileId){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==204){ + respBody = response.body().string(); result.setMessage("File deleted successfully!"); result.setFileId(fileId); result.setSuccessful(true); @@ -319,7 +326,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -346,9 +353,10 @@ public ResultFileDelete bulkDeleteFiles(List fileIds){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - result=new Gson().fromJson(resp,ResultFileDelete.class); + respBody=response.body().string(); + result=new Gson().fromJson(respBody,ResultFileDelete.class); result.setMessage("File deleted successfully!"); result.setSuccessful(true); } @@ -367,7 +375,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultFileDelete.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -392,9 +400,10 @@ public ResultCache purgeCache(String url){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200 || response.code()==201){ - String resp=response.body().string(); - result =new Gson().fromJson(resp,ResultCache.class); + respBody=response.body().string(); + result =new Gson().fromJson(respBody,ResultCache.class); result.setSuccessful(true); } else if (response.code()==500) { @@ -406,7 +415,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultCache.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } @@ -431,9 +440,10 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId){ try { Response response = client.newCall(request).execute(); + String respBody=""; if (response.code()==200){ - String resp=response.body().string(); - result =new Gson().fromJson(resp,ResultCacheStatus.class); + respBody=response.body().string(); + result =new Gson().fromJson(respBody,ResultCacheStatus.class); result.setSuccessful(true); } else if (response.code()==500) { @@ -445,7 +455,7 @@ else if (response.code()==500) { result=new Gson().fromJson(resp,ResultCacheStatus.class); result.setSuccessful(false); } - Utils.populateResponseMetadata(result.getResponseMetaData(), response); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index e0f6c43..6071897 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -98,16 +98,15 @@ public static Map mapListOfStringToString(Map> responseHeaders) throws IOException { + if (responseCode==200){ + responseMetadata.setRaw(respBody); } - if (response.headers()!=null) { - Map mappedHeader = Utils.mapListOfStringToString(response.headers().toMultimap()); + if (responseHeaders!=null) { + Map mappedHeader = Utils.mapListOfStringToString(responseHeaders); responseMetadata.setHeaders(mappedHeader); } - responseMetadata.setHttpStatusCode(response.code()); + responseMetadata.setHttpStatusCode(responseCode); } } From dbdea98249f96325aca7741e08b6e9805411f391 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 10:39:54 +0530 Subject: [PATCH 017/112] removed extra diff --- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 94b2a7c..2e8bd8a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -54,11 +54,9 @@ public Result upload(FileCreateRequest fileCreateRequest){ .headers(Headers.of(headers)) .build(); - - System.out.println("request upload:====> " + request); try { Response response = client.newCall(request).execute(); - String respBody = ""; + String respBody=""; if (response.code()==200){ respBody = response.body().string(); result=new Gson().fromJson(respBody,Result.class); From 9d1dbc5368e6c5805043638825c9e5c7d416b4b0 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 10:49:33 +0530 Subject: [PATCH 018/112] added remove tags api --- .../src/main/java/io/imagekit/sdk/ImageKit.java | 13 +++++++++++-- .../java/io/imagekit/sdk/tasks/RestClient.java | 6 +++--- src/main/java/io/imagekit/sampleapp/App.java | 16 +++++++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 7781efc..c673d8b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -202,10 +202,19 @@ public int pHashDistance(String firstHex, String secondHex){ /** * - * @param fileCreateRequest is a object which contains fileIds and tags as a parameters + * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ public ResultTags addTags(TagsRequest tagsRequest){ - return restClient.addTags(tagsRequest); + return restClient.manageTags(tagsRequest, "addTags"); + } + + /** + * + * @param tagsRequest is a object which contains fileIds and tags as a parameters + * @return ArrayList of String + */ + public ResultTags removeTags(TagsRequest tagsRequest){ + return restClient.manageTags(tagsRequest, "removeTags"); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 2e8bd8a..e913984 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -460,7 +460,7 @@ else if (response.code()==500) { return result; } - public ResultTags addTags(TagsRequest tagsRequest) { + public ResultTags manageTags(TagsRequest tagsRequest, String action) { ResultTags result = new ResultTags(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -470,7 +470,7 @@ public ResultTags addTags(TagsRequest tagsRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(tagsRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/files/addTags") + .url(action.equals("removeTags") ? "https://api.imagekit.io/v1/files/removeTags" : "https://api.imagekit.io/v1/files/addTags") .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -482,7 +482,7 @@ public ResultTags addTags(TagsRequest tagsRequest) { respBody = response.body().string(); result =new Gson().fromJson(respBody, ResultTags.class); result.setSuccessful(true); - result.setMessage(response.message().equals("") ? response.message() : "Added Tags SuccessFully."); + result.setMessage(response.message().equals("") ? action.equals("removeTags") ? "Removed Tags SuccessFully." : "Added Tags SuccessFully." : response.message()); } else { result.setSuccessful(false); result.setMessage("Error: Internal server error."); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 51c6de7..d792c70 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -31,7 +31,7 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); uploadFromBytes(); - addTags(); + removeTags(); // // calculateDistance(); // generatingAuthParams(); @@ -375,4 +375,18 @@ private static void addTags() { System.out.println(result); System.out.println("\n\n"); } + + private static void removeTags() { + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + TagsRequest tagsRequest =new TagsRequest(fileIds, tags); + ResultTags result = ImageKit.getInstance().removeTags(tagsRequest); + System.out.println(">> Add Tags done."); + System.out.println(Color.ANSI_GREEN+">> Response tags:"+Color.ANSI_RESET); + System.out.println(result); + System.out.println("\n\n"); + } } From 75ab876cfac236b2c6e91ef3e8749dc50e20d94c Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 10:51:30 +0530 Subject: [PATCH 019/112] minor changes --- .../src/main/java/io/imagekit/sdk/utils/Utils.java | 1 - src/main/java/io/imagekit/sampleapp/App.java | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 30b4760..6071897 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -98,7 +98,6 @@ public static Map mapListOfStringToString(Map> responseHeaders) throws IOException { if (responseCode==200){ responseMetadata.setRaw(respBody); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index d792c70..5f67123 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -31,6 +31,7 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); uploadFromBytes(); + addTags(); removeTags(); // // calculateDistance(); @@ -371,7 +372,7 @@ private static void addTags() { TagsRequest tagsRequest =new TagsRequest(fileIds, tags); ResultTags result = ImageKit.getInstance().addTags(tagsRequest); System.out.println(">> Add Tags done."); - System.out.println(Color.ANSI_GREEN+">> Response tags:"+Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN+">> Response add tags:"+Color.ANSI_RESET); System.out.println(result); System.out.println("\n\n"); } @@ -381,11 +382,10 @@ private static void removeTags() { fileIds.add("62958deef33aa80bdadf7533"); List tags = new ArrayList<>(); tags.add("tag1"); - tags.add("tag2"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); ResultTags result = ImageKit.getInstance().removeTags(tagsRequest); - System.out.println(">> Add Tags done."); - System.out.println(Color.ANSI_GREEN+">> Response tags:"+Color.ANSI_RESET); + System.out.println(">> remove Tags done."); + System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); System.out.println(result); System.out.println("\n\n"); } From b3d7995d09de240a2c648017732d040368b1eb12 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 11:44:12 +0530 Subject: [PATCH 020/112] added test and readme file updated --- README.md | 36 ++++++++++++++ .../io/imagekit/sdk/tasks/RestClient.java | 1 + .../java/io/imagekit/sdk/ImageKitTest.java | 44 +++++++++++++++++ .../io/imagekit/sdk/tasks/RestClientTest.java | 48 ++++++++++++++++--- 4 files changed, 123 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3349cd7..f11da79 100644 --- a/README.md +++ b/README.md @@ -481,6 +481,42 @@ System.out.println(result.getRaw()); System.out.println("Map Response:"); System.out.println(result.getMap()); ``` + +**9. Add tags** + +Add tags using the FileIds and tags which we want to add in request as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) + +```java +List fileIds = new ArrayList<>(); +fileIds.add("FileId"); +List tags = new ArrayList<>(); +tags.add("tag1"); +tags.add("tag2"); +ResultCacheStatus result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "addTags"); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData.getRaw()); +``` + +**9. Remove tags** + +Removed tags using the FileIds and tags which we want to remove from request as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) + +```java +List fileIds = new ArrayList<>(); +fileIds.add("FileId"); +List tags = new ArrayList<>(); +tags.add("tag1"); +ResultCacheStatus result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "removeTags"); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData.getRaw()); +``` + ## Utility functions We have included the following commonly used utility functions in this package. diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index e913984..5278adc 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -477,6 +477,7 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { try { Response response = client.newCall(request).execute(); + System.out.println("response:==>" + response); String respBody=""; if (response.code() == 200) { respBody = response.body().string(); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 00ce54b..08d822c 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -5,6 +5,7 @@ import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.tasks.UrlGen; @@ -627,4 +628,47 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { assertFalse(matcher.group(3).trim().isEmpty()); assertFalse(matcher.group(4).trim().isEmpty()); } + + @Test + public void add_tags_expectedSuccessWith() { + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + ResultTags result=new ResultTags(); + result.setSuccessful(true); + result.setMessage("Added Tags SuccessFully."); + result.getResponseMetaData().setHttpStatusCode(200); + when(restClient.manageTags(tagsRequest, "addTags")).thenReturn(result); + + ResultTags resultTags = SUT.addTags(tagsRequest); + assertTrue(resultTags.isSuccessful()); + assertEquals(resultTags.getResponseMetaData().getHttpStatusCode(), 200); + assertEquals(result.getMessage(), "Added Tags SuccessFully."); + } + + @Test + public void remove_tags_expectedSuccessWith() { + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + ResultTags result=new ResultTags(); + result.setSuccessful(true); + result.setMessage("Removed Tags SuccessFully."); + result.getResponseMetaData().setHttpStatusCode(200); + when(restClient.manageTags(tagsRequest, "removeTags")).thenReturn(result); + + ResultTags resultTags = SUT.removeTags(tagsRequest); + assertTrue(resultTags.isSuccessful()); + assertEquals(resultTags.getResponseMetaData().getHttpStatusCode(), 200); + assertEquals(result.getMessage(), "Removed Tags SuccessFully."); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index a5cb34c..b373edb 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -6,6 +6,7 @@ import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; import okhttp3.*; @@ -164,7 +165,7 @@ public void valid_upload_with_network_issue_expectException() { FileCreateRequest fileCreateRequest=new FileCreateRequest("f06830ca9f1e3e90","demo.jpg"); clientStub.setTimeoutException(); Result result = SUT.upload(fileCreateRequest); - assertEquals(resp,result.getRaw()); + assertEquals(resp,result.getResponseMetaData().getRaw()); } @Test @@ -323,7 +324,7 @@ public void getFileDetails_valid_request_expect_success() { // Asserting endpoint sending to server assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/details",SUT.request.url().toString()); // Asserting mock response getting from server. - assertThat(resp, is(result.getRaw())); + assertThat(resp, is(result.getResponseMetaData().getRaw())); } @Test @@ -368,7 +369,7 @@ public void getFileMetaData_valid_request_expect_success() { SUT.setClient(clientStub); ResultMetaData result = SUT.getFileMetaData("598821f949c0a938d57563bd"); assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/metadata",SUT.request.url().toString()); - assertThat(resp, is(result.getRaw())); + assertThat(resp, is(result.getResponseMetaData().getRaw())); } @Test @@ -414,7 +415,7 @@ public void getRemoteFileMetaData_valid_request_expect_success() { ResultMetaData result = SUT.getRemoteFileMetaData("http://remote_url.example.com/demo.png"); assertEquals("https://api.imagekit.io/v1/metadata?url=http://remote_url.example.com/demo.png",SUT.request.url().toString()); - assertThat(resp, is(result.getRaw())); + assertThat(resp, is(result.getResponseMetaData().getRaw())); } @Test @@ -494,7 +495,7 @@ public void bulkDeleteFiles_valid_request_expect_success() { SUT.setClient(clientStub); ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); assertThat("File deleted successfully!", is(result.getMessage())); - assertThat(resp,is(result.getRaw())); + assertThat(resp,is(result.getResponseMetaData().getRaw())); } @Test @@ -517,7 +518,7 @@ public void bulkDeleteFiles_file_id_not_found() { SUT.setClient(clientStub); ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); assertThat("The requested file(s) does not exist.", is(result.getMessage())); - assertThat(resp,is(result.getRaw())); + assertThat(resp,is(result.getResponseMetaData().getRaw())); } @Test @@ -604,6 +605,41 @@ public void getPurgeCacheStatus_un_processable_entity() { assertNotNull(result.getMessage()); } + @Test + public void add_tags() { + JsonObject obj=new JsonObject(); + obj.addProperty("message","Tags added SuccessFully"); + + OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(),200, "Tags added SuccessFully"); + SUT.setClient(clientStub); + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + ResultTags result = SUT.manageTags(new TagsRequest(fileIds, tags), "addTags"); + assertNotNull(result.getMessage()); + assertEquals(result.getMessage(), "Tags added SuccessFully"); + assertTrue(result.isSuccessful()); + } + + @Test + public void remove_tags() { + JsonObject obj=new JsonObject(); + obj.addProperty("message","Tags removed SuccessFully"); + + OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(),200, "Tags removed SuccessFully"); + SUT.setClient(clientStub); + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + ResultTags result = SUT.manageTags(new TagsRequest(fileIds, tags), "removeTags"); + assertNotNull(result.getMessage()); + assertEquals(result.getMessage(), "Tags removed SuccessFully"); + assertTrue(result.isSuccessful()); + } + /** * Stub OkHttpClient for fake api call */ From bea48685a5de2ba3619132a55d2d40dc485c6ba5 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 15:39:51 +0530 Subject: [PATCH 021/112] added get custom metadata api --- .../main/java/io/imagekit/sdk/ImageKit.java | 8 ++ .../models/CustomMetaDataFieldRequest.java | 53 ++++++++++ .../CustomMetaDataFieldSchemaObject.java | 96 +++++++++++++++++++ .../results/CustomMetaDataResultList.java | 55 +++++++++++ .../io/imagekit/sdk/tasks/RestClient.java | 46 +++++++++ src/main/java/io/imagekit/sampleapp/App.java | 15 ++- 6 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index c673d8b..d2dbb6e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -217,4 +217,12 @@ public ResultTags addTags(TagsRequest tagsRequest){ public ResultTags removeTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "removeTags"); } + + /** + * + * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema + */ + public CustomMetaDataResultList getCustomMetaDataFields() { + return restClient.getCustomMetaDataFields(); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java new file mode 100644 index 0000000..fcb6a06 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java @@ -0,0 +1,53 @@ +package io.imagekit.sdk.models; + + +public class CustomMetaDataFieldRequest { + private String id; + private String name; + private String label; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + + public CustomMetaDataFieldRequest() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } + + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } + + @Override + public String toString() { + return "CustomMetaDataFieldRequest{" + + "name=" + name + + ", label=" + label + + ", schema=" + schema + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java new file mode 100644 index 0000000..9faa1f5 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -0,0 +1,96 @@ +package io.imagekit.sdk.models; + + +import java.util.List; + +public class CustomMetaDataFieldSchemaObject { + private String type; + private List selectOptions; + private String defaultValue; + private boolean isValueRequired; + private String minValue; + private String maxValue; + private int minLength; + private int maxLength; + + public CustomMetaDataFieldSchemaObject() { + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getSelectOptions() { + return selectOptions; + } + + public void setSelectOptions(List selectOptions) { + this.selectOptions = selectOptions; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public boolean isValueRequired() { + return isValueRequired; + } + + public void setValueRequired(boolean valueRequired) { + isValueRequired = valueRequired; + } + + public String getMinValue() { + return minValue; + } + + public void setMinValue(String minValue) { + this.minValue = minValue; + } + + public String getMaxValue() { + return maxValue; + } + + public void setMaxValue(String maxValue) { + this.maxValue = maxValue; + } + + public int getMinLength() { + return minLength; + } + + public void setMinLength(int minLength) { + this.minLength = minLength; + } + + public int getMaxLength() { + return maxLength; + } + + public void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } + + @Override + public String toString() { + return "CustomMetaDataFieldSchemaObject{" + + "type='" + type + + ", selectOptions=" + selectOptions + + ", defaultValue=" + defaultValue + + ", isValueRequired='" + isValueRequired + + ", minValue=" + minValue + + ", maxValue=" + maxValue + + ", minLength=" + minLength + + ", maxLength=" + maxLength + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java new file mode 100644 index 0000000..5ede26c --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java @@ -0,0 +1,55 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.ResponseMetaData; + +public class CustomMetaDataResultList { + private boolean isSuccessful; + private String message; + private CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public CustomMetaDataResultList() { + + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + public CustomMetaDataFieldRequest getCustomMetaDataFieldRequest() { + return customMetaDataFieldRequest; + } + + public void setCustomMetaDataFieldRequest(CustomMetaDataFieldRequest customMetaDataFieldRequest) { + this.customMetaDataFieldRequest = customMetaDataFieldRequest; + } + + @Override + public String toString() { + return "Result{" + + "isSuccessful=" + isSuccessful + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 5278adc..737ce15 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,9 +1,12 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; @@ -13,10 +16,12 @@ import okhttp3.*; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.stream.Collectors; public class RestClient { private ImageKit imageKit; @@ -495,4 +500,45 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { } return result; } + + public CustomMetaDataResultList getCustomMetaDataFields() { + CustomMetaDataResultList customMetaDataResultList = new CustomMetaDataResultList(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + request=new Request.Builder() + .url("https://api.imagekit.io/v1/customMetadataFields") + .get() + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + System.out.println("respBody: ===> " + respBody); + System.out.println("response:===> " + new Gson().fromJson(respBody, CustomMetaDataFieldRequest.class)); + customMetaDataResultList.setSuccessful(true); + } +// else if (response.code()==500) { +// customMetaDataResultList.setSuccessful(false); +// customMetaDataResultList.setMessage("Error: Internal server error."); +// } +// else { +// String resp=response.body().string(); +// customMetaDataResultList=new Gson().fromJson(resp,CustomMetaDataResultList.class); +// customMetaDataResultList.setSuccessful(false); +// } + Utils.populateResponseMetadata(respBody, customMetaDataResultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return customMetaDataResultList; + + } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 5f67123..682cea2 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -30,9 +30,10 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); - uploadFromBytes(); - addTags(); - removeTags(); +// uploadFromBytes(); +// addTags(); +// removeTags(); + getCustomMetaDataFields(); // // calculateDistance(); // generatingAuthParams(); @@ -389,4 +390,12 @@ private static void removeTags() { System.out.println(result); System.out.println("\n\n"); } + + private static void getCustomMetaDataFields() { + CustomMetaDataResultList result = ImageKit.getInstance().getCustomMetaDataFields(); + System.out.println(">> Fetch CustomMetaDataFields done."); + System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); + System.out.println(result); + System.out.println("\n\n"); + } } From cfc3e4ccc9a500899773d7c7599042b823d521c2 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 15:39:51 +0530 Subject: [PATCH 022/112] added get custom metadata api --- .../main/java/io/imagekit/sdk/ImageKit.java | 8 ++ .../models/CustomMetaDataFieldRequest.java | 53 ++++++++++ .../CustomMetaDataFieldSchemaObject.java | 96 +++++++++++++++++++ .../results/CustomMetaDataResultList.java | 55 +++++++++++ .../io/imagekit/sdk/tasks/RestClient.java | 46 +++++++++ src/main/java/io/imagekit/sampleapp/App.java | 15 ++- 6 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index c673d8b..d2dbb6e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -217,4 +217,12 @@ public ResultTags addTags(TagsRequest tagsRequest){ public ResultTags removeTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "removeTags"); } + + /** + * + * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema + */ + public CustomMetaDataResultList getCustomMetaDataFields() { + return restClient.getCustomMetaDataFields(); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java new file mode 100644 index 0000000..fcb6a06 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java @@ -0,0 +1,53 @@ +package io.imagekit.sdk.models; + + +public class CustomMetaDataFieldRequest { + private String id; + private String name; + private String label; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + + public CustomMetaDataFieldRequest() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } + + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } + + @Override + public String toString() { + return "CustomMetaDataFieldRequest{" + + "name=" + name + + ", label=" + label + + ", schema=" + schema + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java new file mode 100644 index 0000000..9faa1f5 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -0,0 +1,96 @@ +package io.imagekit.sdk.models; + + +import java.util.List; + +public class CustomMetaDataFieldSchemaObject { + private String type; + private List selectOptions; + private String defaultValue; + private boolean isValueRequired; + private String minValue; + private String maxValue; + private int minLength; + private int maxLength; + + public CustomMetaDataFieldSchemaObject() { + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getSelectOptions() { + return selectOptions; + } + + public void setSelectOptions(List selectOptions) { + this.selectOptions = selectOptions; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public boolean isValueRequired() { + return isValueRequired; + } + + public void setValueRequired(boolean valueRequired) { + isValueRequired = valueRequired; + } + + public String getMinValue() { + return minValue; + } + + public void setMinValue(String minValue) { + this.minValue = minValue; + } + + public String getMaxValue() { + return maxValue; + } + + public void setMaxValue(String maxValue) { + this.maxValue = maxValue; + } + + public int getMinLength() { + return minLength; + } + + public void setMinLength(int minLength) { + this.minLength = minLength; + } + + public int getMaxLength() { + return maxLength; + } + + public void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } + + @Override + public String toString() { + return "CustomMetaDataFieldSchemaObject{" + + "type='" + type + + ", selectOptions=" + selectOptions + + ", defaultValue=" + defaultValue + + ", isValueRequired='" + isValueRequired + + ", minValue=" + minValue + + ", maxValue=" + maxValue + + ", minLength=" + minLength + + ", maxLength=" + maxLength + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java new file mode 100644 index 0000000..5ede26c --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java @@ -0,0 +1,55 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.ResponseMetaData; + +public class CustomMetaDataResultList { + private boolean isSuccessful; + private String message; + private CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public CustomMetaDataResultList() { + + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + public CustomMetaDataFieldRequest getCustomMetaDataFieldRequest() { + return customMetaDataFieldRequest; + } + + public void setCustomMetaDataFieldRequest(CustomMetaDataFieldRequest customMetaDataFieldRequest) { + this.customMetaDataFieldRequest = customMetaDataFieldRequest; + } + + @Override + public String toString() { + return "Result{" + + "isSuccessful=" + isSuccessful + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 5278adc..737ce15 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,9 +1,12 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; @@ -13,10 +16,12 @@ import okhttp3.*; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.stream.Collectors; public class RestClient { private ImageKit imageKit; @@ -495,4 +500,45 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { } return result; } + + public CustomMetaDataResultList getCustomMetaDataFields() { + CustomMetaDataResultList customMetaDataResultList = new CustomMetaDataResultList(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + request=new Request.Builder() + .url("https://api.imagekit.io/v1/customMetadataFields") + .get() + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + System.out.println("respBody: ===> " + respBody); + System.out.println("response:===> " + new Gson().fromJson(respBody, CustomMetaDataFieldRequest.class)); + customMetaDataResultList.setSuccessful(true); + } +// else if (response.code()==500) { +// customMetaDataResultList.setSuccessful(false); +// customMetaDataResultList.setMessage("Error: Internal server error."); +// } +// else { +// String resp=response.body().string(); +// customMetaDataResultList=new Gson().fromJson(resp,CustomMetaDataResultList.class); +// customMetaDataResultList.setSuccessful(false); +// } + Utils.populateResponseMetadata(respBody, customMetaDataResultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return customMetaDataResultList; + + } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 5f67123..682cea2 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -30,9 +30,10 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); - uploadFromBytes(); - addTags(); - removeTags(); +// uploadFromBytes(); +// addTags(); +// removeTags(); + getCustomMetaDataFields(); // // calculateDistance(); // generatingAuthParams(); @@ -389,4 +390,12 @@ private static void removeTags() { System.out.println(result); System.out.println("\n\n"); } + + private static void getCustomMetaDataFields() { + CustomMetaDataResultList result = ImageKit.getInstance().getCustomMetaDataFields(); + System.out.println(">> Fetch CustomMetaDataFields done."); + System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); + System.out.println(result); + System.out.println("\n\n"); + } } From e672919dc517966fe4537e522a236ec1fc5be06c Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 16:05:05 +0530 Subject: [PATCH 023/112] Revert "added get custom metadata api" This reverts commit bea48685a5de2ba3619132a55d2d40dc485c6ba5. --- .../main/java/io/imagekit/sdk/ImageKit.java | 8 -- .../models/CustomMetaDataFieldRequest.java | 53 ---------- .../CustomMetaDataFieldSchemaObject.java | 96 ------------------- .../results/CustomMetaDataResultList.java | 55 ----------- .../io/imagekit/sdk/tasks/RestClient.java | 46 --------- src/main/java/io/imagekit/sampleapp/App.java | 15 +-- 6 files changed, 3 insertions(+), 270 deletions(-) delete mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java delete mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java delete mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index d2dbb6e..c673d8b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -217,12 +217,4 @@ public ResultTags addTags(TagsRequest tagsRequest){ public ResultTags removeTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "removeTags"); } - - /** - * - * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema - */ - public CustomMetaDataResultList getCustomMetaDataFields() { - return restClient.getCustomMetaDataFields(); - } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java deleted file mode 100644 index fcb6a06..0000000 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.imagekit.sdk.models; - - -public class CustomMetaDataFieldRequest { - private String id; - private String name; - private String label; - private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); - - public CustomMetaDataFieldRequest() { - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public CustomMetaDataFieldSchemaObject getSchema() { - return schema; - } - - public void setSchema(CustomMetaDataFieldSchemaObject schema) { - this.schema = schema; - } - - @Override - public String toString() { - return "CustomMetaDataFieldRequest{" + - "name=" + name + - ", label=" + label + - ", schema=" + schema + - '}'; - } -} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java deleted file mode 100644 index 9faa1f5..0000000 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java +++ /dev/null @@ -1,96 +0,0 @@ -package io.imagekit.sdk.models; - - -import java.util.List; - -public class CustomMetaDataFieldSchemaObject { - private String type; - private List selectOptions; - private String defaultValue; - private boolean isValueRequired; - private String minValue; - private String maxValue; - private int minLength; - private int maxLength; - - public CustomMetaDataFieldSchemaObject() { - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public List getSelectOptions() { - return selectOptions; - } - - public void setSelectOptions(List selectOptions) { - this.selectOptions = selectOptions; - } - - public String getDefaultValue() { - return defaultValue; - } - - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; - } - - public boolean isValueRequired() { - return isValueRequired; - } - - public void setValueRequired(boolean valueRequired) { - isValueRequired = valueRequired; - } - - public String getMinValue() { - return minValue; - } - - public void setMinValue(String minValue) { - this.minValue = minValue; - } - - public String getMaxValue() { - return maxValue; - } - - public void setMaxValue(String maxValue) { - this.maxValue = maxValue; - } - - public int getMinLength() { - return minLength; - } - - public void setMinLength(int minLength) { - this.minLength = minLength; - } - - public int getMaxLength() { - return maxLength; - } - - public void setMaxLength(int maxLength) { - this.maxLength = maxLength; - } - - @Override - public String toString() { - return "CustomMetaDataFieldSchemaObject{" + - "type='" + type + - ", selectOptions=" + selectOptions + - ", defaultValue=" + defaultValue + - ", isValueRequired='" + isValueRequired + - ", minValue=" + minValue + - ", maxValue=" + maxValue + - ", minLength=" + minLength + - ", maxLength=" + maxLength + - '}'; - } -} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java deleted file mode 100644 index 5ede26c..0000000 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.imagekit.sdk.models.results; - -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; -import io.imagekit.sdk.models.ResponseMetaData; - -public class CustomMetaDataResultList { - private boolean isSuccessful; - private String message; - private CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public CustomMetaDataResultList() { - - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - public CustomMetaDataFieldRequest getCustomMetaDataFieldRequest() { - return customMetaDataFieldRequest; - } - - public void setCustomMetaDataFieldRequest(CustomMetaDataFieldRequest customMetaDataFieldRequest) { - this.customMetaDataFieldRequest = customMetaDataFieldRequest; - } - - @Override - public String toString() { - return "Result{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - '}'; - } -} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 737ce15..5278adc 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,12 +1,9 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; @@ -16,12 +13,10 @@ import okhttp3.*; import java.io.IOException; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.stream.Collectors; public class RestClient { private ImageKit imageKit; @@ -500,45 +495,4 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { } return result; } - - public CustomMetaDataResultList getCustomMetaDataFields() { - CustomMetaDataResultList customMetaDataResultList = new CustomMetaDataResultList(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); - - request=new Request.Builder() - .url("https://api.imagekit.io/v1/customMetadataFields") - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - System.out.println("respBody: ===> " + respBody); - System.out.println("response:===> " + new Gson().fromJson(respBody, CustomMetaDataFieldRequest.class)); - customMetaDataResultList.setSuccessful(true); - } -// else if (response.code()==500) { -// customMetaDataResultList.setSuccessful(false); -// customMetaDataResultList.setMessage("Error: Internal server error."); -// } -// else { -// String resp=response.body().string(); -// customMetaDataResultList=new Gson().fromJson(resp,CustomMetaDataResultList.class); -// customMetaDataResultList.setSuccessful(false); -// } - Utils.populateResponseMetadata(respBody, customMetaDataResultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return customMetaDataResultList; - - } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 682cea2..5f67123 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -30,10 +30,9 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); -// uploadFromBytes(); -// addTags(); -// removeTags(); - getCustomMetaDataFields(); + uploadFromBytes(); + addTags(); + removeTags(); // // calculateDistance(); // generatingAuthParams(); @@ -390,12 +389,4 @@ private static void removeTags() { System.out.println(result); System.out.println("\n\n"); } - - private static void getCustomMetaDataFields() { - CustomMetaDataResultList result = ImageKit.getInstance().getCustomMetaDataFields(); - System.out.println(">> Fetch CustomMetaDataFields done."); - System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println("\n\n"); - } } From 22549757306a45b5e5828e5eecb08b85812f2c24 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 16:07:41 +0530 Subject: [PATCH 024/112] change file in doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f11da79..6dbdc28 100644 --- a/README.md +++ b/README.md @@ -485,7 +485,7 @@ System.out.println(result.getMap()); **9. Add tags** Add tags using the FileIds and tags which we want to add in request as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) +[API documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) ```java List fileIds = new ArrayList<>(); From ca4b0cc09417c790fbafacee58673c4317f17bd0 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 16:08:35 +0530 Subject: [PATCH 025/112] change file in doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6dbdc28..f7a718a 100644 --- a/README.md +++ b/README.md @@ -503,7 +503,7 @@ System.out.println(result.getResponseMetaData.getRaw()); **9. Remove tags** Removed tags using the FileIds and tags which we want to remove from request as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) +[API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) ```java List fileIds = new ArrayList<>(); From e9a18a1c73aa1621df1539d846ae7416f9f3c237 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 18:01:07 +0530 Subject: [PATCH 026/112] added fixes for get custommetadata --- .../main/java/io/imagekit/sdk/ImageKit.java | 2 +- .../CustomMetaDataFieldSchemaObject.java | 9 +++-- .../sdk/models/CustomMetaDataTypeEnum.java | 21 +++++++++++ ...ultList.java => ResultCustomMetaData.java} | 28 +++++--------- .../ResultCustomMetaDataField.java} | 8 ++-- .../io/imagekit/sdk/tasks/RestClient.java | 37 ++++++++----------- .../java/io/imagekit/sdk/ImageKitTest.java | 36 ++++++++++++++++-- .../io/imagekit/sdk/tasks/RestClientTest.java | 20 ++++++++++ src/main/java/io/imagekit/sampleapp/App.java | 2 +- 9 files changed, 110 insertions(+), 53 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java rename imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/{CustomMetaDataResultList.java => ResultCustomMetaData.java} (51%) rename imagekit-sdk/src/main/java/io/imagekit/sdk/models/{CustomMetaDataFieldRequest.java => results/ResultCustomMetaDataField.java} (84%) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index d2dbb6e..860cc67 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -222,7 +222,7 @@ public ResultTags removeTags(TagsRequest tagsRequest){ * * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema */ - public CustomMetaDataResultList getCustomMetaDataFields() { + public ResultCustomMetaData getCustomMetaDataFields() { return restClient.getCustomMetaDataFields(); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java index 9faa1f5..6bbc2db 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -4,7 +4,7 @@ import java.util.List; public class CustomMetaDataFieldSchemaObject { - private String type; + private CustomMetaDataTypeEnum type; private List selectOptions; private String defaultValue; private boolean isValueRequired; @@ -16,11 +16,11 @@ public class CustomMetaDataFieldSchemaObject { public CustomMetaDataFieldSchemaObject() { } - public String getType() { + public CustomMetaDataTypeEnum getType() { return type; } - public void setType(String type) { + public void setType(CustomMetaDataTypeEnum type) { this.type = type; } @@ -82,8 +82,9 @@ public void setMaxLength(int maxLength) { @Override public String toString() { + System.out.println("type.getCustomMetaDataTypeEnum().toUpperCase(Locale.ROOT):==> "+ type); return "CustomMetaDataFieldSchemaObject{" + - "type='" + type + + "type=" + type + ", selectOptions=" + selectOptions + ", defaultValue=" + defaultValue + ", isValueRequired='" + isValueRequired + diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java new file mode 100644 index 0000000..a1f3795 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java @@ -0,0 +1,21 @@ +package io.imagekit.sdk.models; + +import com.google.gson.annotations.SerializedName; + +public enum CustomMetaDataTypeEnum { + @SerializedName("Text") + TEXT, + @SerializedName("Textarea") + TEXTAREA, + @SerializedName("Number") + NUMBER, + @SerializedName("Date") + DATE, + @SerializedName("Boolean") + BOOLEAN, + @SerializedName("SingleSelect") + SINGLE_SELECT, + @SerializedName("MultiSelect Date") + MULTISELECT_DATE; + +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java similarity index 51% rename from imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java rename to imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java index 5ede26c..3ffa264 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/CustomMetaDataResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java @@ -1,17 +1,15 @@ package io.imagekit.sdk.models.results; -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import java.util.ArrayList; +import java.util.List; + import io.imagekit.sdk.models.ResponseMetaData; -public class CustomMetaDataResultList { +public class ResultCustomMetaData { private boolean isSuccessful; private String message; - private CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public CustomMetaDataResultList() { - - } + private List resultCustomMetaDataFields = new ArrayList<>(); public boolean isSuccessful() { return isSuccessful; @@ -37,19 +35,11 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { this.responseMetaData = responseMetaData; } - public CustomMetaDataFieldRequest getCustomMetaDataFieldRequest() { - return customMetaDataFieldRequest; - } - - public void setCustomMetaDataFieldRequest(CustomMetaDataFieldRequest customMetaDataFieldRequest) { - this.customMetaDataFieldRequest = customMetaDataFieldRequest; + public List getResultCustomMetaDataFields() { + return resultCustomMetaDataFields; } - @Override - public String toString() { - return "Result{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - '}'; + public void setResultCustomMetaDataFields(List resultCustomMetaDataFields) { + this.resultCustomMetaDataFields = resultCustomMetaDataFields; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java similarity index 84% rename from imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java rename to imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java index fcb6a06..69b948a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java @@ -1,13 +1,15 @@ -package io.imagekit.sdk.models; +package io.imagekit.sdk.models.results; -public class CustomMetaDataFieldRequest { +import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; + +public class ResultCustomMetaDataField { private String id; private String name; private String label; private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); - public CustomMetaDataFieldRequest() { + public ResultCustomMetaDataField() { } public String getId() { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 737ce15..98c177d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,12 +1,10 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.results.ResultCustomMetaDataField; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; @@ -21,7 +19,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.stream.Collectors; public class RestClient { private ImageKit imageKit; @@ -501,8 +498,8 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { return result; } - public CustomMetaDataResultList getCustomMetaDataFields() { - CustomMetaDataResultList customMetaDataResultList = new CustomMetaDataResultList(); + public ResultCustomMetaData getCustomMetaDataFields() { + ResultCustomMetaData resultCustomMetaData = new ResultCustomMetaData(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -521,24 +518,22 @@ public CustomMetaDataResultList getCustomMetaDataFields() { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - System.out.println("respBody: ===> " + respBody); - System.out.println("response:===> " + new Gson().fromJson(respBody, CustomMetaDataFieldRequest.class)); - customMetaDataResultList.setSuccessful(true); - } -// else if (response.code()==500) { -// customMetaDataResultList.setSuccessful(false); -// customMetaDataResultList.setMessage("Error: Internal server error."); -// } -// else { -// String resp=response.body().string(); -// customMetaDataResultList=new Gson().fromJson(resp,CustomMetaDataResultList.class); -// customMetaDataResultList.setSuccessful(false); -// } - Utils.populateResponseMetadata(respBody, customMetaDataResultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); + ResultCustomMetaDataField[] requests = new Gson().fromJson(respBody, ResultCustomMetaDataField[].class); + List resultCustomMetaDataFields = Arrays.asList(requests); + resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); + resultCustomMetaData.setSuccessful(true); + resultCustomMetaData.getResponseMetaData().setRaw(respBody); + resultCustomMetaData.setMessage(response.message().equals("") ? "Fetched customMetadata successFully" : response.message()); + } else { + resultCustomMetaData.setSuccessful(false); + resultCustomMetaData.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaData.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return customMetaDataResultList; + System.out.println("Here:==> " + resultCustomMetaData.getResultCustomMetaDataFields()); + return resultCustomMetaData; } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 08d822c..c1c4b79 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -3,18 +3,17 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.constants.Version; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; +import io.imagekit.sdk.models.CustomMetaDataTypeEnum; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.tasks.RestClient; -import io.imagekit.sdk.tasks.UrlGen; import io.imagekit.sdk.utils.Utils; -import org.hamcrest.CoreMatchers; -import org.hamcrest.Matcher; + import org.junit.Before; import org.junit.Test; -import org.mockito.Matchers; import java.util.*; import java.util.regex.Pattern; @@ -671,4 +670,33 @@ public void remove_tags_expectedSuccessWith() { assertEquals(resultTags.getResponseMetaData().getHttpStatusCode(), 200); assertEquals(result.getMessage(), "Removed Tags SuccessFully."); } + + @Test + public void get_custom_metadata_fields_expectedSuccessWith() { + CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.NUMBER); + customMetaDataFieldSchemaObject.setDefaultValue("defaultValue"); + customMetaDataFieldSchemaObject.setMinLength(10); + customMetaDataFieldSchemaObject.setMaxLength(10); + + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); + resultCustomMetaDataField.setId("id"); + resultCustomMetaDataField.setName("name"); + resultCustomMetaDataField.setLabel("label"); + resultCustomMetaDataField.setSchema(customMetaDataFieldSchemaObject); + + ResultCustomMetaData customMetaData=new ResultCustomMetaData(); + customMetaData.setSuccessful(true); + customMetaData.setMessage("Fetched CustomMetaData SuccessFully."); + customMetaData.getResponseMetaData().setHttpStatusCode(200); + customMetaData.setResultCustomMetaDataFields(Collections.singletonList(resultCustomMetaDataField)); + + when(restClient.getCustomMetaDataFields()).thenReturn(customMetaData); + + ResultCustomMetaData resultCustomMetaData = SUT.getCustomMetaDataFields(); + assertTrue(resultCustomMetaData.isSuccessful()); + assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); + assertEquals(customMetaData.getMessage(), "Fetched CustomMetaData SuccessFully."); + assertEquals(customMetaData.getResultCustomMetaDataFields(), Collections.singletonList(resultCustomMetaDataField)); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index b373edb..ea2b196 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -640,6 +640,26 @@ public void remove_tags() { assertTrue(result.isSuccessful()); } + @Test + public void getCustomMetaDataFields() { + JsonObject obj=new JsonObject(); + obj.addProperty("message","Fetched CustomMetaData SuccessFully"); + obj.addProperty("id", "id"); + obj.addProperty("name", "name"); + obj.addProperty("label", "label"); + + JsonArray jsonArray = new JsonArray(); + jsonArray.add(obj); + + OkHttpClientStub clientStub= new OkHttpClientStub(jsonArray.toString(),200, "Fetched CustomMetaData SuccessFully"); + SUT.setClient(clientStub); + ResultCustomMetaData resultCustomMetaData = SUT.getCustomMetaDataFields(); + assertNotNull(resultCustomMetaData.getMessage()); + assertEquals(resultCustomMetaData.getMessage(), "Fetched CustomMetaData SuccessFully"); + assertTrue(resultCustomMetaData.isSuccessful()); + assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); + } + /** * Stub OkHttpClient for fake api call */ diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 682cea2..ff2e7a0 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -392,7 +392,7 @@ private static void removeTags() { } private static void getCustomMetaDataFields() { - CustomMetaDataResultList result = ImageKit.getInstance().getCustomMetaDataFields(); + ResultCustomMetaData result = ImageKit.getInstance().getCustomMetaDataFields(); System.out.println(">> Fetch CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); System.out.println(result); From 34e51ecc412e7a39183792fc36a913edbfd18ceb Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 31 May 2022 18:47:39 +0530 Subject: [PATCH 027/112] added delete CustomMetaDataField api --- .../main/java/io/imagekit/sdk/ImageKit.java | 18 ++++ .../models/CustomMetaDataFieldRequest.java | 45 ++++++++++ .../CustomMetaDataFieldSchemaObject.java | 18 ++-- .../sdk/models/CustomMetaDataTypeEnum.java | 26 ++++-- .../results/ResultCustomMetaDataField.java | 4 +- .../io/imagekit/sdk/tasks/RestClient.java | 85 +++++++++++++++++++ .../java/io/imagekit/sdk/ImageKitTest.java | 12 +++ .../io/imagekit/sdk/tasks/RestClientTest.java | 16 ++++ src/main/java/io/imagekit/sampleapp/App.java | 37 +++++++- 9 files changed, 241 insertions(+), 20 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 860cc67..3c9e83f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -225,4 +225,22 @@ public ResultTags removeTags(TagsRequest tagsRequest){ public ResultCustomMetaData getCustomMetaDataFields() { return restClient.getCustomMetaDataFields(); } + + /** + * + * @param customMetaDataFieldRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength + * @return ResultCustomMetaData with ResultCustomMetaDataField + */ + public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldRequest customMetaDataFieldRequest) { + return restClient.createCustomMetaDataFields(customMetaDataFieldRequest); + } + + /** + * + * @param id is a id of customMetaDataFields + * @return Result class + */ + public Result deleteCustomMetaDataField(String id){ + return restClient.deleteCustomMetaDataField(id); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java new file mode 100644 index 0000000..823f082 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java @@ -0,0 +1,45 @@ +package io.imagekit.sdk.models; + + +public class CustomMetaDataFieldRequest { + private String name; + private String label; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + + public CustomMetaDataFieldRequest() { + + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } + + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } + + @Override + public String toString() { + return "CustomMetaDataFieldRequest{" + + "name=" + name + + ", label=" + label + + ", schema=" + schema + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java index 6bbc2db..ab984cb 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -83,15 +83,15 @@ public void setMaxLength(int maxLength) { @Override public String toString() { System.out.println("type.getCustomMetaDataTypeEnum().toUpperCase(Locale.ROOT):==> "+ type); - return "CustomMetaDataFieldSchemaObject{" + - "type=" + type + - ", selectOptions=" + selectOptions + - ", defaultValue=" + defaultValue + - ", isValueRequired='" + isValueRequired + - ", minValue=" + minValue + - ", maxValue=" + maxValue + - ", minLength=" + minLength + - ", maxLength=" + maxLength + + return "{" + + "type=" + '"' + type + '"' + + ", selectOptions=" + '"' + selectOptions + '"' + + ", defaultValue=" + '"' + defaultValue + '"' + + ", isValueRequired=" + '"' + isValueRequired + '"' + + ", minValue=" + '"' + minValue + '"' + + ", maxValue=" + '"' + maxValue + '"' + + ", minLength=" + '"' + minLength + '"' + + ", maxLength=" + '"' + maxLength + '"' + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java index a1f3795..c6b08e8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java @@ -4,18 +4,28 @@ public enum CustomMetaDataTypeEnum { @SerializedName("Text") - TEXT, + TEXT("Text"), @SerializedName("Textarea") - TEXTAREA, + TEXTAREA("Textarea"), @SerializedName("Number") - NUMBER, + NUMBER("Number"), @SerializedName("Date") - DATE, + DATE("Date"), @SerializedName("Boolean") - BOOLEAN, + BOOLEAN("Boolean"), @SerializedName("SingleSelect") - SINGLE_SELECT, + SINGLE_SELECT("SingleSelect"), @SerializedName("MultiSelect Date") - MULTISELECT_DATE; + MULTISELECT_DATE("MultiSelect Date"); -} + private String type; + + private CustomMetaDataTypeEnum(String s) { + type = s; + } + + public String getCustomMetaDataTypeEnum() { + return type; + } + + } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java index 69b948a..3e66dab 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java @@ -47,8 +47,8 @@ public void setSchema(CustomMetaDataFieldSchemaObject schema) { @Override public String toString() { return "CustomMetaDataFieldRequest{" + - "name=" + name + - ", label=" + label + + "name=" + '"' + name + '"' + + ", label=" + '"' + label + ", schema=" + schema + '}'; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 98c177d..af7be8f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -4,6 +4,7 @@ import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; import io.imagekit.sdk.models.results.ResultCustomMetaDataField; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; @@ -15,6 +16,7 @@ import java.io.IOException; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -534,6 +536,89 @@ public ResultCustomMetaData getCustomMetaDataFields() { } System.out.println("Here:==> " + resultCustomMetaData.getResultCustomMetaDataFields()); return resultCustomMetaData; + } + + public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldRequest customMetaDataFieldRequest) { + ResultCustomMetaData resultCustomMetaData = new ResultCustomMetaData(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + System.out.println("customMetaDataFieldRequest:--=====> " + customMetaDataFieldRequest); + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldRequest)); + request=new Request.Builder() + .url("https://api.imagekit.io/v1/customMetadataFields") + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("response in create:===> " + response); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + System.out.println("respBody:===> " + respBody); + ResultCustomMetaDataField requests = new Gson().fromJson(respBody, ResultCustomMetaDataField.class); + List resultCustomMetaDataFields = Collections.singletonList(requests); + resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); + resultCustomMetaData.setSuccessful(true); + resultCustomMetaData.getResponseMetaData().setRaw(respBody); + resultCustomMetaData.setMessage(response.message().equals("") ? "Fetched customMetadata successFully" : response.message()); + } else { + resultCustomMetaData.setSuccessful(false); + resultCustomMetaData.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaData.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + System.out.println("Here:==> " + resultCustomMetaData.getResultCustomMetaDataFields()); + return resultCustomMetaData; + } + public Result deleteCustomMetaDataField(String id) { + Result result=new Result(); + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + String url=String.format(Locale.US,"https://api.imagekit.io/v1/customMetadataFields/%s",id); + + request=new Request.Builder() + .url(url) + .delete() + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("response:===> " + response); + String respBody=""; + if (response.code()==204){ + respBody = response.body().string(); + System.out.println("respBody:====> " + respBody); + result.setSuccessful(true); + result.setMessage("CustomMetaDataField deleted successfully!"); + } + else if (response.code()==500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + else { + String resp=response.body().string(); + result=new Gson().fromJson(resp,Result.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index c1c4b79..6eb19d4 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -699,4 +699,16 @@ public void get_custom_metadata_fields_expectedSuccessWith() { assertEquals(customMetaData.getMessage(), "Fetched CustomMetaData SuccessFully."); assertEquals(customMetaData.getResultCustomMetaDataFields(), Collections.singletonList(resultCustomMetaDataField)); } + + @Test + public void deleteCustomMetaDataField_successExpected() { + Result result=new Result(); + result.setSuccessful(true); + result.getResponseMetaData().setHttpStatusCode(204); + when(restClient.deleteCustomMetaDataField(any(String.class))).thenReturn(result); + + Result result1=SUT.deleteFile("id"); + assertThat(result.isSuccessful(),is(result.isSuccessful())); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 204); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index ea2b196..dfe52d5 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -660,6 +660,22 @@ public void getCustomMetaDataFields() { assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); } + + + @Test + public void deleteCustomMetaDataField_valid_request_expect_success() { + JsonObject obj=new JsonObject(); + + OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), + 204, "Ok"); + SUT.setClient(clientStub); + Result result = SUT.deleteCustomMetaDataField("id"); + + assertEquals("https://api.imagekit.io/v1/customMetadataFields/id",SUT.request.url().toString()); + assertThat("CustomMetaDataField deleted successfully!", is(result.getMessage())); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 204); + } + /** * Stub OkHttpClient for fake api call */ diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index ff2e7a0..c2d5863 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -5,6 +5,9 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; +import io.imagekit.sdk.models.CustomMetaDataTypeEnum; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.TagsRequest; @@ -33,7 +36,9 @@ public static void main(String[] args) throws Exception{ // uploadFromBytes(); // addTags(); // removeTags(); - getCustomMetaDataFields(); +// createCustomMetaDataFields(); + deleteCustomMetaDataField("6296138e91fa57897758dc37"); +// getCustomMetaDataFields(); // // calculateDistance(); // generatingAuthParams(); @@ -398,4 +403,34 @@ private static void getCustomMetaDataFields() { System.out.println(result); System.out.println("\n\n"); } + + private static void createCustomMetaDataFields() { + CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); + schemaObject.setType(CustomMetaDataTypeEnum.NUMBER); + schemaObject.setMinLength(10); + schemaObject.setMaxLength(100); + + CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); + customMetaDataFieldRequest.setName("Name"); + customMetaDataFieldRequest.setLabel("Label"); + customMetaDataFieldRequest.setSchema(schemaObject); + + ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldRequest); + System.out.println(">> remove Tags done."); + System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); + System.out.println(resultCustomMetaData); + System.out.println("\n\n"); + } + + private static void deleteCustomMetaDataField(String id) { + Result result=ImageKit.getInstance().deleteCustomMetaDataField(id); + System.out.println(">> CustomMetaDataField deleted..."); + System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getMap()); + System.out.println("\n\n"); + } } From fadd88c9a1d03df0f522ec89d3f49cab3da466c3 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 1 Jun 2022 11:21:30 +0530 Subject: [PATCH 028/112] added changes for create custommetadata api --- .../models/CustomMetaDataFieldRequest.java | 4 +-- .../CustomMetaDataFieldSchemaObject.java | 14 +++++----- .../sdk/models/CustomMetaDataTypeEnum.java | 26 ++++++------------- .../io/imagekit/sdk/tasks/RestClient.java | 2 +- .../java/io/imagekit/sdk/ImageKitTest.java | 2 +- src/main/java/io/imagekit/sampleapp/App.java | 12 +++++---- 6 files changed, 26 insertions(+), 34 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java index 823f082..42f79bf 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java @@ -37,8 +37,8 @@ public void setSchema(CustomMetaDataFieldSchemaObject schema) { @Override public String toString() { return "CustomMetaDataFieldRequest{" + - "name=" + name + - ", label=" + label + + "name=" + '"' + name + '"' + + ", label=" + '"' + label + '"' + ", schema=" + schema + '}'; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java index ab984cb..000b840 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -85,13 +85,13 @@ public String toString() { System.out.println("type.getCustomMetaDataTypeEnum().toUpperCase(Locale.ROOT):==> "+ type); return "{" + "type=" + '"' + type + '"' + - ", selectOptions=" + '"' + selectOptions + '"' + - ", defaultValue=" + '"' + defaultValue + '"' + - ", isValueRequired=" + '"' + isValueRequired + '"' + - ", minValue=" + '"' + minValue + '"' + - ", maxValue=" + '"' + maxValue + '"' + - ", minLength=" + '"' + minLength + '"' + - ", maxLength=" + '"' + maxLength + '"' + +// ", selectOptions=" + '"' + selectOptions + '"' + +// ", defaultValue=" + '"' + defaultValue + '"' + +// ", isValueRequired=" + isValueRequired + + ", minValue=" + minValue + + ", maxValue=" + maxValue + + ", minLength=" + minLength + + ", maxLength=" + maxLength + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java index c6b08e8..89b8a99 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java @@ -4,28 +4,18 @@ public enum CustomMetaDataTypeEnum { @SerializedName("Text") - TEXT("Text"), + TEXT, @SerializedName("Textarea") - TEXTAREA("Textarea"), + TEXTAREA, @SerializedName("Number") - NUMBER("Number"), + Number, @SerializedName("Date") - DATE("Date"), + DATE, @SerializedName("Boolean") - BOOLEAN("Boolean"), + BOOLEAN, @SerializedName("SingleSelect") - SINGLE_SELECT("SingleSelect"), + SINGLE_SELECT, @SerializedName("MultiSelect Date") - MULTISELECT_DATE("MultiSelect Date"); + MULTISELECT_DATE; - private String type; - - private CustomMetaDataTypeEnum(String s) { - type = s; - } - - public String getCustomMetaDataTypeEnum() { - return type; - } - - } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index af7be8f..bf76730 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -547,7 +547,7 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldReques headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - System.out.println("customMetaDataFieldRequest:--=====> " + customMetaDataFieldRequest); + System.out.println("customMetaDataFieldRequest:--=====> " + new Gson().toJson(customMetaDataFieldRequest)); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldRequest)); request=new Request.Builder() .url("https://api.imagekit.io/v1/customMetadataFields") diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 6eb19d4..e6cf107 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -674,7 +674,7 @@ public void remove_tags_expectedSuccessWith() { @Test public void get_custom_metadata_fields_expectedSuccessWith() { CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.NUMBER); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); customMetaDataFieldSchemaObject.setDefaultValue("defaultValue"); customMetaDataFieldSchemaObject.setMinLength(10); customMetaDataFieldSchemaObject.setMaxLength(10); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index c2d5863..5401894 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -36,8 +36,8 @@ public static void main(String[] args) throws Exception{ // uploadFromBytes(); // addTags(); // removeTags(); -// createCustomMetaDataFields(); - deleteCustomMetaDataField("6296138e91fa57897758dc37"); + createCustomMetaDataFields(); +// deleteCustomMetaDataField("6296138e91fa57897758dc37"); // getCustomMetaDataFields(); // // calculateDistance(); @@ -406,13 +406,15 @@ private static void getCustomMetaDataFields() { private static void createCustomMetaDataFields() { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); - schemaObject.setType(CustomMetaDataTypeEnum.NUMBER); + schemaObject.setType(CustomMetaDataTypeEnum.Number); schemaObject.setMinLength(10); schemaObject.setMaxLength(100); + schemaObject.setMinValue("0"); + schemaObject.setMaxValue("100"); CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); - customMetaDataFieldRequest.setName("Name"); - customMetaDataFieldRequest.setLabel("Label"); + customMetaDataFieldRequest.setName("NameCustom"); + customMetaDataFieldRequest.setLabel("LabelCustom"); customMetaDataFieldRequest.setSchema(schemaObject); ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldRequest); From b215adca088f6bfd22deeb2944b3bb2c2244227a Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 1 Jun 2022 15:39:12 +0530 Subject: [PATCH 029/112] added changes for create metadata api --- .../models/CustomMetaDataFieldRequest.java | 1 - .../CustomMetaDataFieldSchemaObject.java | 56 +++++++------ .../sdk/models/CustomMetaDataTypeEnum.java | 14 ++-- .../models/results/ResultCustomMetaData.java | 8 ++ .../sdk/models/results/ResultTags.java | 12 +++ .../io/imagekit/sdk/tasks/RestClient.java | 17 ++-- .../java/io/imagekit/sdk/ImageKitTest.java | 80 ++++++++++++------- .../io/imagekit/sdk/tasks/RestClientTest.java | 19 ++++- src/main/java/io/imagekit/sampleapp/App.java | 15 ++-- 9 files changed, 142 insertions(+), 80 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java index 42f79bf..f1f7f4e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java @@ -1,6 +1,5 @@ package io.imagekit.sdk.models; - public class CustomMetaDataFieldRequest { private String name; private String label; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java index 000b840..f8e32b3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -7,13 +7,21 @@ public class CustomMetaDataFieldSchemaObject { private CustomMetaDataTypeEnum type; private List selectOptions; private String defaultValue; - private boolean isValueRequired; - private String minValue; - private String maxValue; - private int minLength; - private int maxLength; + private Boolean isValueRequired; + private Integer minValue; + private Integer maxValue; + private Integer minLength; + private Integer maxLength; public CustomMetaDataFieldSchemaObject() { + + } + + public CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum type, boolean isValueRequired, int minValue, int maxValue) { + this.type = type; + this.isValueRequired = isValueRequired; + this.minValue = minValue; + this.maxValue = maxValue; } public CustomMetaDataTypeEnum getType() { @@ -48,50 +56,48 @@ public void setValueRequired(boolean valueRequired) { isValueRequired = valueRequired; } - public String getMinValue() { + public Integer getMinValue() { return minValue; } - public void setMinValue(String minValue) { + public void setMinValue(Integer minValue) { this.minValue = minValue; } - public String getMaxValue() { + public Integer getMaxValue() { return maxValue; } - public void setMaxValue(String maxValue) { + public void setMaxValue(Integer maxValue) { this.maxValue = maxValue; } - public int getMinLength() { + public Integer getMinLength() { return minLength; } - public void setMinLength(int minLength) { + public void setMinLength(Integer minLength) { this.minLength = minLength; } - public int getMaxLength() { + public Integer getMaxLength() { return maxLength; } - public void setMaxLength(int maxLength) { + public void setMaxLength(Integer maxLength) { this.maxLength = maxLength; } @Override - public String toString() { - System.out.println("type.getCustomMetaDataTypeEnum().toUpperCase(Locale.ROOT):==> "+ type); - return "{" + - "type=" + '"' + type + '"' + -// ", selectOptions=" + '"' + selectOptions + '"' + -// ", defaultValue=" + '"' + defaultValue + '"' + -// ", isValueRequired=" + isValueRequired + - ", minValue=" + minValue + - ", maxValue=" + maxValue + - ", minLength=" + minLength + - ", maxLength=" + maxLength + - '}'; + public String toString() {return "{" + + "type=" + '"' + type + '"' + + ", selectOptions=" + '"' + selectOptions + '"' + + ", defaultValue=" + '"' + defaultValue + '"' + + ", isValueRequired=" + isValueRequired + + ", minValue=" + minValue + + ", maxValue=" + maxValue + + ", minLength=" + minLength + + ", maxLength=" + maxLength + + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java index 89b8a99..8fddaa8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java @@ -4,18 +4,18 @@ public enum CustomMetaDataTypeEnum { @SerializedName("Text") - TEXT, + Text, @SerializedName("Textarea") - TEXTAREA, + Textarea, @SerializedName("Number") Number, @SerializedName("Date") - DATE, + Date, @SerializedName("Boolean") - BOOLEAN, + Boolean, @SerializedName("SingleSelect") - SINGLE_SELECT, - @SerializedName("MultiSelect Date") - MULTISELECT_DATE; + SingleSelect, + @SerializedName("MultiSelect") + MultiSelect; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java index 3ffa264..4b29ee6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java @@ -42,4 +42,12 @@ public List getResultC public void setResultCustomMetaDataFields(List resultCustomMetaDataFields) { this.resultCustomMetaDataFields = resultCustomMetaDataFields; } + + @Override + public String toString() { + return "Result{" + + "isSuccessful=" + isSuccessful + + ", message='" + message + '\'' + + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java index b938b17..dc45db2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java @@ -1,10 +1,13 @@ package io.imagekit.sdk.models.results; +import java.util.List; + import io.imagekit.sdk.models.ResponseMetaData; public class ResultTags { private boolean isSuccessful; private String message; + public List successfullyUpdatedFileIds; private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultTags() { @@ -26,6 +29,14 @@ public void setMessage(String message) { this.message = message; } + public List getSuccessfullyUpdatedFileIds() { + return successfullyUpdatedFileIds; + } + + public void setSuccessfullyUpdatedFileIds(List successfullyUpdatedFileIds) { + this.successfullyUpdatedFileIds = successfullyUpdatedFileIds; + } + public ResponseMetaData getResponseMetaData() { return responseMetaData; } @@ -39,6 +50,7 @@ public String toString() { return "ResultList{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + + ", successfullyUpdatedFileIds=" + successfullyUpdatedFileIds + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index bf76730..7591007 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,6 +1,9 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; @@ -481,10 +484,10 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { try { Response response = client.newCall(request).execute(); - System.out.println("response:==>" + response); - String respBody=""; + + String respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultTags.class); if (response.code() == 200) { - respBody = response.body().string(); result =new Gson().fromJson(respBody, ResultTags.class); result.setSuccessful(true); result.setMessage(response.message().equals("") ? action.equals("removeTags") ? "Removed Tags SuccessFully." : "Added Tags SuccessFully." : response.message()); @@ -547,7 +550,6 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldReques headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - System.out.println("customMetaDataFieldRequest:--=====> " + new Gson().toJson(customMetaDataFieldRequest)); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldRequest)); request=new Request.Builder() .url("https://api.imagekit.io/v1/customMetadataFields") @@ -557,26 +559,23 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldReques try { Response response = client.newCall(request).execute(); - System.out.println("response in create:===> " + response); + JsonElement responseBody = new JsonParser().parse(response.body().string()); + resultCustomMetaData = new Gson().fromJson(responseBody, ResultCustomMetaData.class); String respBody=""; if (response.code()==200){ respBody=response.body().string(); - System.out.println("respBody:===> " + respBody); ResultCustomMetaDataField requests = new Gson().fromJson(respBody, ResultCustomMetaDataField.class); List resultCustomMetaDataFields = Collections.singletonList(requests); resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); resultCustomMetaData.setSuccessful(true); resultCustomMetaData.getResponseMetaData().setRaw(respBody); - resultCustomMetaData.setMessage(response.message().equals("") ? "Fetched customMetadata successFully" : response.message()); } else { resultCustomMetaData.setSuccessful(false); - resultCustomMetaData.setMessage("Error: Internal server error."); } Utils.populateResponseMetadata(respBody, resultCustomMetaData.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - System.out.println("Here:==> " + resultCustomMetaData.getResultCustomMetaDataFields()); return resultCustomMetaData; } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index e6cf107..bd39916 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -3,6 +3,7 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.constants.Version; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; import io.imagekit.sdk.models.FileCreateRequest; @@ -673,42 +674,67 @@ public void remove_tags_expectedSuccessWith() { @Test public void get_custom_metadata_fields_expectedSuccessWith() { - CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - customMetaDataFieldSchemaObject.setDefaultValue("defaultValue"); - customMetaDataFieldSchemaObject.setMinLength(10); - customMetaDataFieldSchemaObject.setMaxLength(10); - - ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - resultCustomMetaDataField.setId("id"); - resultCustomMetaDataField.setName("name"); - resultCustomMetaDataField.setLabel("label"); - resultCustomMetaDataField.setSchema(customMetaDataFieldSchemaObject); - - ResultCustomMetaData customMetaData=new ResultCustomMetaData(); - customMetaData.setSuccessful(true); - customMetaData.setMessage("Fetched CustomMetaData SuccessFully."); - customMetaData.getResponseMetaData().setHttpStatusCode(200); - customMetaData.setResultCustomMetaDataFields(Collections.singletonList(resultCustomMetaDataField)); - - when(restClient.getCustomMetaDataFields()).thenReturn(customMetaData); + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setDefaultValue("defaultValue"); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + mockCustomMetaDataFieldSchemaObject.setMaxLength(10); + + ResultCustomMetaDataField mockResultCustomMetaDataField = new ResultCustomMetaDataField(); + mockResultCustomMetaDataField.setId("id"); + mockResultCustomMetaDataField.setName("name"); + mockResultCustomMetaDataField.setLabel("label"); + mockResultCustomMetaDataField.setSchema(mockCustomMetaDataFieldSchemaObject); + + ResultCustomMetaData mockCustomMetaData=new ResultCustomMetaData(); + mockCustomMetaData.setSuccessful(true); + mockCustomMetaData.setMessage("Fetched CustomMetaData SuccessFully."); + mockCustomMetaData.getResponseMetaData().setHttpStatusCode(200); + mockCustomMetaData.setResultCustomMetaDataFields(Collections.singletonList(mockResultCustomMetaDataField)); + + when(restClient.getCustomMetaDataFields()).thenReturn(mockCustomMetaData); ResultCustomMetaData resultCustomMetaData = SUT.getCustomMetaDataFields(); assertTrue(resultCustomMetaData.isSuccessful()); assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); - assertEquals(customMetaData.getMessage(), "Fetched CustomMetaData SuccessFully."); - assertEquals(customMetaData.getResultCustomMetaDataFields(), Collections.singletonList(resultCustomMetaDataField)); + assertEquals(mockCustomMetaData.getMessage(), "Fetched CustomMetaData SuccessFully."); + assertEquals(mockCustomMetaData.getResultCustomMetaDataFields(), Collections.singletonList(mockResultCustomMetaDataField)); + } + + @Test + public void createCustomMetaDataFields_successExpected() { + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); + customMetaDataFieldRequest.setName("mockName"); + customMetaDataFieldRequest.setLabel("mockLabel"); + customMetaDataFieldRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + ResultCustomMetaData mockResultCustomMetaData = new ResultCustomMetaData(); + mockResultCustomMetaData.setSuccessful(true); + mockResultCustomMetaData.setMessage("CustomMetaData created..."); + mockResultCustomMetaData.getResponseMetaData().setHttpStatusCode(200); + + when(restClient.createCustomMetaDataFields(customMetaDataFieldRequest)).thenReturn(mockResultCustomMetaData); + + ResultCustomMetaData result=SUT.createCustomMetaDataFields(customMetaDataFieldRequest); + assertThat(result.isSuccessful(),is(mockResultCustomMetaData.isSuccessful())); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResultCustomMetaData.getResponseMetaData().getHttpStatusCode()); + assertEquals(result.getMessage(), mockResultCustomMetaData.getMessage()); } @Test public void deleteCustomMetaDataField_successExpected() { - Result result=new Result(); - result.setSuccessful(true); - result.getResponseMetaData().setHttpStatusCode(204); - when(restClient.deleteCustomMetaDataField(any(String.class))).thenReturn(result); + Result mockResult=new Result(); + mockResult.setSuccessful(true); + mockResult.getResponseMetaData().setHttpStatusCode(204); + when(restClient.deleteCustomMetaDataField(any(String.class))).thenReturn(mockResult); - Result result1=SUT.deleteFile("id"); - assertThat(result.isSuccessful(),is(result.isSuccessful())); + Result result=SUT.deleteCustomMetaDataField("id"); + assertThat(result.isSuccessful(),is(mockResult.isSuccessful())); assertEquals(result.getResponseMetaData().getHttpStatusCode(), 204); } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index dfe52d5..990cb6a 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -4,6 +4,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.models.CustomMetaDataFieldRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.TagsRequest; @@ -651,7 +652,7 @@ public void getCustomMetaDataFields() { JsonArray jsonArray = new JsonArray(); jsonArray.add(obj); - OkHttpClientStub clientStub= new OkHttpClientStub(jsonArray.toString(),200, "Fetched CustomMetaData SuccessFully"); + OkHttpClientStub clientStub= new OkHttpClientStub(jsonArray.toString(),200, "ok"); SUT.setClient(clientStub); ResultCustomMetaData resultCustomMetaData = SUT.getCustomMetaDataFields(); assertNotNull(resultCustomMetaData.getMessage()); @@ -660,7 +661,23 @@ public void getCustomMetaDataFields() { assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); } + @Test + public void createCustomMetaDataFields_valid_request_expect_success() { + JsonObject obj=new JsonObject(); + obj.addProperty("message","CustomMetaData created SuccessFully"); + OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), + 201, "ok"); + SUT.setClient(clientStub); + + CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); + ResultCustomMetaData resultCustomMetaData = SUT.createCustomMetaDataFields(customMetaDataFieldRequest); + + assertEquals("https://api.imagekit.io/v1/customMetadataFields",SUT.request.url().toString()); + System.out.println("resultCustomMetaData.getMessage():-->" + resultCustomMetaData.getMessage()); + assertEquals("CustomMetaData created SuccessFully", resultCustomMetaData.getMessage()); + assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 201); + } @Test public void deleteCustomMetaDataField_valid_request_expect_success() { diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 5401894..f45a6fc 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -34,7 +34,7 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); // uploadFromBytes(); -// addTags(); + addTags(); // removeTags(); createCustomMetaDataFields(); // deleteCustomMetaDataField("6296138e91fa57897758dc37"); @@ -405,17 +405,12 @@ private static void getCustomMetaDataFields() { } private static void createCustomMetaDataFields() { - CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); - schemaObject.setType(CustomMetaDataTypeEnum.Number); - schemaObject.setMinLength(10); - schemaObject.setMaxLength(100); - schemaObject.setMinValue("0"); - schemaObject.setMaxValue("100"); + CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100); CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); - customMetaDataFieldRequest.setName("NameCustom"); - customMetaDataFieldRequest.setLabel("LabelCustom"); - customMetaDataFieldRequest.setSchema(schemaObject); + customMetaDataFieldRequest.setName("NameCustom3"); + customMetaDataFieldRequest.setLabel("LabelCustom3"); + customMetaDataFieldRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldRequest); System.out.println(">> remove Tags done."); From 244240e17b12d87bfe50960b4846f0abdf09b2bf Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 1 Jun 2022 16:04:54 +0530 Subject: [PATCH 030/112] added minor changes for response --- .../imagekit/sdk/models/results/ResultCustomMetaData.java | 2 ++ .../sdk/models/results/ResultCustomMetaDataField.java | 5 +++-- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 7 +++---- src/main/java/io/imagekit/sampleapp/App.java | 5 +++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java index 4b29ee6..6e33891 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java @@ -48,6 +48,8 @@ public String toString() { return "Result{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + + ", responseMetaData=" + responseMetaData + + ", resultCustomMetaDataFields=" + resultCustomMetaDataFields + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java index 3e66dab..e484efb 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java @@ -47,8 +47,9 @@ public void setSchema(CustomMetaDataFieldSchemaObject schema) { @Override public String toString() { return "CustomMetaDataFieldRequest{" + - "name=" + '"' + name + '"' + - ", label=" + '"' + label + + "id=" + '"' + id + '"' + + ", name=" + '"' + name + '"' + + ", label=" + '"' + label + '"' + ", schema=" + schema + '}'; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 7591007..b0e786f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -559,11 +559,10 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldReques try { Response response = client.newCall(request).execute(); - JsonElement responseBody = new JsonParser().parse(response.body().string()); + String respBody=response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); resultCustomMetaData = new Gson().fromJson(responseBody, ResultCustomMetaData.class); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); + if (response.code()==201){ ResultCustomMetaDataField requests = new Gson().fromJson(respBody, ResultCustomMetaDataField.class); List resultCustomMetaDataFields = Collections.singletonList(requests); resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index f45a6fc..6024cc0 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -408,14 +408,15 @@ private static void createCustomMetaDataFields() { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100); CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); - customMetaDataFieldRequest.setName("NameCustom3"); - customMetaDataFieldRequest.setLabel("LabelCustom3"); + customMetaDataFieldRequest.setName("NameCustom8"); + customMetaDataFieldRequest.setLabel("LabelCustom8"); customMetaDataFieldRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldRequest); System.out.println(">> remove Tags done."); System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); System.out.println(resultCustomMetaData); + System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); System.out.println("\n\n"); } From 3b20182effc2d42b7ad9a9b2c6df819afab7629b Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 1 Jun 2022 18:45:47 +0530 Subject: [PATCH 031/112] added few changes in create customMetadata and added edit customMetadata api --- .../main/java/io/imagekit/sdk/ImageKit.java | 17 ++++-- ... => CustomMetaDataFieldCreateRequest.java} | 4 +- .../CustomMetaDataFieldUpdateRequest.java | 34 +++++++++++ .../io/imagekit/sdk/tasks/RestClient.java | 60 +++++++++++++++++-- .../java/io/imagekit/sdk/ImageKitTest.java | 14 ++--- .../io/imagekit/sdk/tasks/RestClientTest.java | 14 ++--- src/main/java/io/imagekit/sampleapp/App.java | 41 +++++++++---- 7 files changed, 143 insertions(+), 41 deletions(-) rename imagekit-sdk/src/main/java/io/imagekit/sdk/models/{CustomMetaDataFieldRequest.java => CustomMetaDataFieldCreateRequest.java} (90%) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 3c9e83f..52f0c08 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -7,8 +7,6 @@ import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.tasks.UrlGen; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -228,11 +226,11 @@ public ResultCustomMetaData getCustomMetaDataFields() { /** * - * @param customMetaDataFieldRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength + * @param customMetaDataFieldCreateRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength * @return ResultCustomMetaData with ResultCustomMetaDataField */ - public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldRequest customMetaDataFieldRequest) { - return restClient.createCustomMetaDataFields(customMetaDataFieldRequest); + public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } /** @@ -243,4 +241,13 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldReques public Result deleteCustomMetaDataField(String id){ return restClient.deleteCustomMetaDataField(id); } + + /** + * + * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's id, schema with type, minLength, maxLength + * @return ResultCustomMetaData with ResultCustomMetaDataField + */ + public ResultCustomMetaData updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { + return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldCreateRequest.java similarity index 90% rename from imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java rename to imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldCreateRequest.java index f1f7f4e..1939b18 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldCreateRequest.java @@ -1,11 +1,11 @@ package io.imagekit.sdk.models; -public class CustomMetaDataFieldRequest { +public class CustomMetaDataFieldCreateRequest { private String name; private String label; private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); - public CustomMetaDataFieldRequest() { + public CustomMetaDataFieldCreateRequest() { } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java new file mode 100644 index 0000000..848758a --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java @@ -0,0 +1,34 @@ +package io.imagekit.sdk.models; + +public class CustomMetaDataFieldUpdateRequest { + private String id; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + + public CustomMetaDataFieldUpdateRequest() { + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } + + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } + + @Override + public String toString() { + return "CustomMetaDataFieldRequest{" + + "id=" + '"' + id + '"' + + ", schema=" + schema + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index b0e786f..92f5a31 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,13 +1,13 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.results.ResultCustomMetaDataField; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; @@ -541,7 +541,13 @@ public ResultCustomMetaData getCustomMetaDataFields() { return resultCustomMetaData; } - public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldRequest customMetaDataFieldRequest) { + public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + if (customMetaDataFieldCreateRequest.getName() == null) { + throw new RuntimeException("Error: Name not provided."); + } + if (customMetaDataFieldCreateRequest.getLabel() == null) { + throw new RuntimeException("Error: Label not provided."); + } ResultCustomMetaData resultCustomMetaData = new ResultCustomMetaData(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -550,7 +556,7 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldReques headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldRequest)); + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldCreateRequest)); request=new Request.Builder() .url("https://api.imagekit.io/v1/customMetadataFields") .post(requestBody) @@ -568,6 +574,9 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldReques resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); resultCustomMetaData.setSuccessful(true); resultCustomMetaData.getResponseMetaData().setRaw(respBody); + if (resultCustomMetaData.getMessage() == null) { + resultCustomMetaData.setMessage("CustomMetaData Created SuccessFully."); + } } else { resultCustomMetaData.setSuccessful(false); } @@ -619,4 +628,47 @@ else if (response.code()==500) { } return result; } + + public ResultCustomMetaData updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { + ResultCustomMetaData resultCustomMetaData = new ResultCustomMetaData(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldUpdateRequest)); + String url=String.format(Locale.US,"https://api.imagekit.io/v1/customMetadataFields/%s",customMetaDataFieldUpdateRequest.getId()); + request=new Request.Builder() + .url(url) + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=response.body().string(); + System.out.println("respBody:==>" + response); + System.out.println("respBody:==>" + respBody); + JsonElement responseBody = new JsonParser().parse(respBody); + resultCustomMetaData = new Gson().fromJson(responseBody, ResultCustomMetaData.class); + if (response.code()==201){ + ResultCustomMetaDataField requests = new Gson().fromJson(respBody, ResultCustomMetaDataField.class); + List resultCustomMetaDataFields = Collections.singletonList(requests); + resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); + resultCustomMetaData.setSuccessful(true); + resultCustomMetaData.getResponseMetaData().setRaw(respBody); + if (resultCustomMetaData.getMessage() == null) { + resultCustomMetaData.setMessage("CustomMetaData Created SuccessFully."); + } + } else { + resultCustomMetaData.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaData.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultCustomMetaData; + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index bd39916..47ba250 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -3,7 +3,7 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.constants.Version; import io.imagekit.sdk.models.BaseFile; -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; import io.imagekit.sdk.models.FileCreateRequest; @@ -708,19 +708,19 @@ public void createCustomMetaDataFields_successExpected() { mockCustomMetaDataFieldSchemaObject.setMinValue(10); mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); - customMetaDataFieldRequest.setName("mockName"); - customMetaDataFieldRequest.setLabel("mockLabel"); - customMetaDataFieldRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); ResultCustomMetaData mockResultCustomMetaData = new ResultCustomMetaData(); mockResultCustomMetaData.setSuccessful(true); mockResultCustomMetaData.setMessage("CustomMetaData created..."); mockResultCustomMetaData.getResponseMetaData().setHttpStatusCode(200); - when(restClient.createCustomMetaDataFields(customMetaDataFieldRequest)).thenReturn(mockResultCustomMetaData); + when(restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest)).thenReturn(mockResultCustomMetaData); - ResultCustomMetaData result=SUT.createCustomMetaDataFields(customMetaDataFieldRequest); + ResultCustomMetaData result=SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); assertThat(result.isSuccessful(),is(mockResultCustomMetaData.isSuccessful())); assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResultCustomMetaData.getResponseMetaData().getHttpStatusCode()); assertEquals(result.getMessage(), mockResultCustomMetaData.getMessage()); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index 990cb6a..2694da8 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -1,20 +1,16 @@ package io.imagekit.sdk.tasks; -import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.imagekit.sdk.ImageKit; -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; import okhttp3.*; -import okhttp3.mockwebserver.Dispatcher; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; + import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -25,8 +21,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; @@ -670,8 +664,8 @@ public void createCustomMetaDataFields_valid_request_expect_success() { 201, "ok"); SUT.setClient(clientStub); - CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); - ResultCustomMetaData resultCustomMetaData = SUT.createCustomMetaDataFields(customMetaDataFieldRequest); + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + ResultCustomMetaData resultCustomMetaData = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); assertEquals("https://api.imagekit.io/v1/customMetadataFields",SUT.request.url().toString()); System.out.println("resultCustomMetaData.getMessage():-->" + resultCustomMetaData.getMessage()); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 6024cc0..87263dd 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -1,23 +1,20 @@ package io.imagekit.sampleapp; -import com.google.gson.Gson; import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; -import io.imagekit.sdk.models.CustomMetaDataFieldRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; +import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; -import io.imagekit.sdk.tasks.UrlGen; import io.imagekit.sdk.utils.Utils; import java.io.File; -import java.io.IOException; -import java.math.BigInteger; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; @@ -34,9 +31,10 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); // uploadFromBytes(); - addTags(); +// addTags(); // removeTags(); - createCustomMetaDataFields(); +// createCustomMetaDataFields(); + updateCustomMetaDataFields(); // deleteCustomMetaDataField("6296138e91fa57897758dc37"); // getCustomMetaDataFields(); // @@ -385,7 +383,7 @@ private static void addTags() { private static void removeTags() { List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); + fileIds.add("62975a6391fa57b6df7400e0"); List tags = new ArrayList<>(); tags.add("tag1"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); @@ -407,12 +405,12 @@ private static void getCustomMetaDataFields() { private static void createCustomMetaDataFields() { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100); - CustomMetaDataFieldRequest customMetaDataFieldRequest = new CustomMetaDataFieldRequest(); - customMetaDataFieldRequest.setName("NameCustom8"); - customMetaDataFieldRequest.setLabel("LabelCustom8"); - customMetaDataFieldRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("NameCustom91"); + customMetaDataFieldCreateRequest.setLabel("LabelCustom91"); + customMetaDataFieldCreateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); - ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldRequest); + ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); System.out.println(">> remove Tags done."); System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); System.out.println(resultCustomMetaData); @@ -431,4 +429,21 @@ private static void deleteCustomMetaDataField(String id) { System.out.println(result.getMap()); System.out.println("\n\n"); } + + private static void updateCustomMetaDataFields() { + CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); + schemaObject.setMinValue(0); + schemaObject.setMaxValue(100); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("62975a6391fa57b6df7400e0"); + customMetaDataFieldUpdateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); + + ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + System.out.println(">> remove Tags done."); + System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); + System.out.println(resultCustomMetaData); + System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); + System.out.println("\n\n"); + } } From 366874b214e88bd88a800b1e372cb1be5beb69a4 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 11:17:58 +0530 Subject: [PATCH 032/112] added edit api for custom metadata --- README.md | 14 ++++++++++ .../CustomMetaDataFieldUpdateRequest.java | 10 +++++++ .../io/imagekit/sdk/tasks/RestClient.java | 8 +++--- .../java/io/imagekit/sdk/ImageKitTest.java | 26 +++++++++++++++++++ .../io/imagekit/sdk/tasks/RestClientTest.java | 20 +++++++++++++- src/main/java/io/imagekit/sampleapp/App.java | 17 ++++++------ 6 files changed, 81 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f11da79..33ba0f2 100644 --- a/README.md +++ b/README.md @@ -517,6 +517,20 @@ System.out.println("Raw Response:"); System.out.println(result.getResponseMetaData.getRaw()); ``` +**10. Get CustomMetaDataFields** + +fetches the metadata as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) + +```java +ResultCustomMetaData result=ImageKit.getInstance().getCustomMetaDataFields(); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResultCustomMetaDataFields()); +``` + ## Utility functions We have included the following commonly used utility functions in this package. diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java index 848758a..f38117a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java @@ -2,6 +2,7 @@ public class CustomMetaDataFieldUpdateRequest { private String id; + private String label; private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); public CustomMetaDataFieldUpdateRequest() { @@ -16,6 +17,14 @@ public void setId(String id) { this.id = id; } + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + public CustomMetaDataFieldSchemaObject getSchema() { return schema; } @@ -28,6 +37,7 @@ public void setSchema(CustomMetaDataFieldSchemaObject schema) { public String toString() { return "CustomMetaDataFieldRequest{" + "id=" + '"' + id + '"' + + ", label=" + '"' + label + '"' + ", schema=" + schema + '}'; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 92f5a31..741f9c9 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -642,25 +642,23 @@ public ResultCustomMetaData updateCustomMetaDataFields(CustomMetaDataFieldUpdate String url=String.format(Locale.US,"https://api.imagekit.io/v1/customMetadataFields/%s",customMetaDataFieldUpdateRequest.getId()); request=new Request.Builder() .url(url) - .post(requestBody) + .patch(requestBody) .headers(Headers.of(headers)) .build(); try { Response response = client.newCall(request).execute(); String respBody=response.body().string(); - System.out.println("respBody:==>" + response); - System.out.println("respBody:==>" + respBody); JsonElement responseBody = new JsonParser().parse(respBody); resultCustomMetaData = new Gson().fromJson(responseBody, ResultCustomMetaData.class); - if (response.code()==201){ + if (response.code()==200){ ResultCustomMetaDataField requests = new Gson().fromJson(respBody, ResultCustomMetaDataField.class); List resultCustomMetaDataFields = Collections.singletonList(requests); resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); resultCustomMetaData.setSuccessful(true); resultCustomMetaData.getResponseMetaData().setRaw(respBody); if (resultCustomMetaData.getMessage() == null) { - resultCustomMetaData.setMessage("CustomMetaData Created SuccessFully."); + resultCustomMetaData.setMessage("CustomMetaData Edited SuccessFully."); } } else { resultCustomMetaData.setSuccessful(false); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 47ba250..fc950d2 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -5,6 +5,7 @@ import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; +import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; @@ -737,4 +738,29 @@ public void deleteCustomMetaDataField_successExpected() { assertThat(result.isSuccessful(),is(mockResult.isSuccessful())); assertEquals(result.getResponseMetaData().getHttpStatusCode(), 204); } + + @Test + public void updateCustomMetaDataFields_successExpected() { + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + ResultCustomMetaData mockResultCustomMetaData = new ResultCustomMetaData(); + mockResultCustomMetaData.setSuccessful(true); + mockResultCustomMetaData.setMessage("CustomMetaData updated..."); + mockResultCustomMetaData.getResponseMetaData().setHttpStatusCode(200); + + when(restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest)).thenReturn(mockResultCustomMetaData); + + ResultCustomMetaData result=SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + assertThat(result.isSuccessful(),is(mockResultCustomMetaData.isSuccessful())); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResultCustomMetaData.getResponseMetaData().getHttpStatusCode()); + assertEquals(result.getMessage(), mockResultCustomMetaData.getMessage()); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index 2694da8..95c7a2f 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.TagsRequest; @@ -668,7 +669,6 @@ public void createCustomMetaDataFields_valid_request_expect_success() { ResultCustomMetaData resultCustomMetaData = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); assertEquals("https://api.imagekit.io/v1/customMetadataFields",SUT.request.url().toString()); - System.out.println("resultCustomMetaData.getMessage():-->" + resultCustomMetaData.getMessage()); assertEquals("CustomMetaData created SuccessFully", resultCustomMetaData.getMessage()); assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 201); } @@ -687,6 +687,24 @@ public void deleteCustomMetaDataField_valid_request_expect_success() { assertEquals(result.getResponseMetaData().getHttpStatusCode(), 204); } + @Test + public void updateCustomMetaDataFields_valid_request_expect_success() { + JsonObject obj=new JsonObject(); + obj.addProperty("message","CustomMetaData edited SuccessFully"); + + OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), + 200, "ok"); + SUT.setClient(clientStub); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("mockId"); + ResultCustomMetaData resultCustomMetaData = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + + assertEquals("https://api.imagekit.io/v1/customMetadataFields/mockId",SUT.request.url().toString()); + assertEquals("CustomMetaData edited SuccessFully", resultCustomMetaData.getMessage()); + assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); + } + /** * Stub OkHttpClient for fake api call */ diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 87263dd..5a02138 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -411,8 +411,8 @@ private static void createCustomMetaDataFields() { customMetaDataFieldCreateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); - System.out.println(">> remove Tags done."); - System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); + System.out.println(">> Create CustomMetaDataFields done."); + System.out.println(Color.ANSI_GREEN+">> Response create CustomMetaDataFields :"+Color.ANSI_RESET); System.out.println(resultCustomMetaData); System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); System.out.println("\n\n"); @@ -432,16 +432,17 @@ private static void deleteCustomMetaDataField(String id) { private static void updateCustomMetaDataFields() { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); - schemaObject.setMinValue(0); - schemaObject.setMaxValue(100); + schemaObject.setMinValue(10); + schemaObject.setMaxValue(200); CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("62975a6391fa57b6df7400e0"); - customMetaDataFieldUpdateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); + customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808d"); + customMetaDataFieldUpdateRequest.setLabel("prices"); + customMetaDataFieldUpdateRequest.setSchema(schemaObject); ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - System.out.println(">> remove Tags done."); - System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); + System.out.println(">> Edit CustomMetaDataFields done."); + System.out.println(Color.ANSI_GREEN+">> Response edit CustomMetaDataFields :"+Color.ANSI_RESET); System.out.println(resultCustomMetaData); System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); System.out.println("\n\n"); From 919b6894c665f851f7aadcfaea7445779c43e80d Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 11:55:24 +0530 Subject: [PATCH 033/112] updated readme doc --- README.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae34f3b..f351ce3 100644 --- a/README.md +++ b/README.md @@ -500,7 +500,7 @@ System.out.println("Raw Response:"); System.out.println(result.getResponseMetaData.getRaw()); ``` -**9. Remove tags** +**10. Remove tags** Removed tags using the FileIds and tags which we want to remove from request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) @@ -517,7 +517,7 @@ System.out.println("Raw Response:"); System.out.println(result.getResponseMetaData.getRaw()); ``` -**10. Get CustomMetaDataFields** +**11. Get CustomMetaDataFields** fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) @@ -531,6 +531,65 @@ System.out.println(result.getResponseMetaData.getRaw()); System.out.println(result.getResultCustomMetaDataFields()); ``` +**12. Create CustomMetaDataFields** + +It creates the CustomMetaDataFields as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). +The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class which contains name, label, schema and then set the parameters to be created. + +```java +CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); +schemaObject.setMinValue(10); +schemaObject.setMaxValue(200); +CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new customMetaDataFieldCreateRequest(); +customMetaDataFieldCreateRequest.setName("Name"); +customMetaDataFieldCreateRequest.setLabel("Label"); +customMetaDataFieldCreateRequest.setSchema(schemaObject); +ResultCustomMetaData result=ImageKit.getInstance().createCustomMetaDataFields(); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResultCustomMetaDataFields()); +``` + +**13. Delete CustomMetaDataFields** + +It deletes the CustomMetaDataFields as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/delete-custom-metadata-field). +The argument to the `deleteCustomMetaDataField()` method accepts the id of customMetaDataField which we want to be deleted. + +```java +ResultCustomMetaData result=ImageKit.getInstance().deleteCustomMetaDataField("id"); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData.getRaw()); +``` + +**14. Edit CustomMetaDataFields** + +It edits the CustomMetaDataFields as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). +The argument to the `updateCustomMetaDataFields()` method is the object of `CustomMetaDataFieldUpdateRequest` class which contains id(id of customMetaDataFields which we want to update with), label, schema and then set the parameters to be updated. + +```java +CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); +schemaObject.setMinValue(10); +schemaObject.setMaxValue(200); + +CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); +customMetaDataFieldUpdateRequest.setId("id"); +customMetaDataFieldUpdateRequest.setLabel("label"); +customMetaDataFieldUpdateRequest.setSchema(schemaObject); +ResultCustomMetaData result=ImageKit.getInstance().updateCustomMetaDataFields(); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResultCustomMetaDataFields()); +``` + ## Utility functions We have included the following commonly used utility functions in this package. From dd86c65d458a40288063cce778fe44ea38940127 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 13:54:38 +0530 Subject: [PATCH 034/112] added changes for upload API param and getMap move to responseMeatData and changed it's usages --- README.md | 68 ++++++++++++------- .../sdk/models/FileCreateRequest.java | 43 ++++++++++++ .../imagekit/sdk/models/ResponseMetaData.java | 11 +++ .../imagekit/sdk/models/results/Result.java | 8 --- .../sdk/models/results/ResultCache.java | 8 --- .../sdk/models/results/ResultCacheStatus.java | 8 --- .../sdk/models/results/ResultFileDelete.java | 8 --- .../sdk/models/results/ResultList.java | 8 --- .../sdk/models/results/ResultMetaData.java | 8 --- .../imagekit/sdk/tasks/MultipartBuilder.java | 14 ++++ .../io/imagekit/sdk/tasks/RestClientTest.java | 4 ++ src/main/java/io/imagekit/sampleapp/App.java | 48 ++++++++----- 12 files changed, 146 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index f351ce3..184421e 100644 --- a/README.md +++ b/README.md @@ -323,13 +323,17 @@ List responseFields=new ArrayList<>(); responseFields.add("tags"); responseFields.add("customCoordinates"); fileCreateRequest.setResponseFields(responseFields); // optional +fileCreateRequest.setOverwriteFile(true); // optional +fileCreateRequest.setOverwriteAITags(true); // optional +fileCreateRequest.setOverwriteTags(true); // optional +fileCreateRequest.setOverwriteCustomMetadata(true); // optional Result result = ImageKit.getInstance().upload(fileCreateRequest); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` If the upload is successful, `getMessage()` will be `None`, and the result will be an object of `Result` class that contains the same all the parameters received from ImageKit's servers and `isSuccessful()` will return true. @@ -353,9 +357,9 @@ ResultList resultList=ImageKit.getInstance().getFileList(10,10); System.out.println("======FINAL RESULT======="); System.out.println(resultList); System.out.println("Raw Response:"); -System.out.println(resultList.getRaw()); +System.out.println(resultList.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(resultList.getMap()); +System.out.println(resultList.getResponseMetaData().getMap()); ``` **2. Get File Details** @@ -368,9 +372,9 @@ Result result=ImageKit.getInstance().getFileDetail(fileId); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` **3. Get File Metadata** @@ -382,9 +386,9 @@ ResultMetaData result=ImageKit.getInstance().getFileMetadata(fileId); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` Another way to get metadata from a remote file URL as per the [API documentation here](https://docs.imagekit.io/api-reference/metadata-api/get-image-metadata-from-remote-url). This file should be accessible over the ImageKit.io URL-endpoint. @@ -394,9 +398,9 @@ ResultMetaData result=ImageKit.getInstance().getRemoteFileMetadata(url); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` **4. Update File Details** @@ -413,9 +417,9 @@ Result result=ImageKit.getInstance().updateFileDetail(fileUpdateRequest); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` **5. Delete File** @@ -428,9 +432,9 @@ Result result=ImageKit.getInstance().deleteFile(fileId); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` **6. Delete files (bulk)** @@ -447,9 +451,9 @@ ResultFileDelete result=ImageKit.getInstance().bulkDeleteFiles(fileIds); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` **7. Purge Cache** @@ -461,9 +465,9 @@ ResultCache result=ImageKit.getInstance().purgeCache("https://ik.imagekit.io/ima System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` **8. Purge Cache Status** @@ -477,9 +481,9 @@ ResultCacheStatus result=ImageKit.getInstance().getPurgeCacheStatus(requestId); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` **9. Add tags** @@ -497,7 +501,9 @@ ResultCacheStatus result=ImageKit.getInstance().manageTags(new TagsRequest(fileI System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); ``` **10. Remove tags** @@ -514,7 +520,9 @@ ResultCacheStatus result=ImageKit.getInstance().manageTags(new TagsRequest(fileI System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); ``` **11. Get CustomMetaDataFields** @@ -527,7 +535,9 @@ ResultCustomMetaData result=ImageKit.getInstance().getCustomMetaDataFields(); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); System.out.println(result.getResultCustomMetaDataFields()); ``` @@ -549,7 +559,9 @@ ResultCustomMetaData result=ImageKit.getInstance().createCustomMetaDataFields(); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); System.out.println(result.getResultCustomMetaDataFields()); ``` @@ -564,7 +576,9 @@ ResultCustomMetaData result=ImageKit.getInstance().deleteCustomMetaDataField("id System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); ``` **14. Edit CustomMetaDataFields** @@ -586,7 +600,9 @@ ResultCustomMetaData result=ImageKit.getInstance().updateCustomMetaDataFields(); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData.getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); System.out.println(result.getResultCustomMetaDataFields()); ``` diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java index 19ad6f1..f4224d0 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java @@ -1,5 +1,8 @@ package io.imagekit.sdk.models; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + import io.imagekit.sdk.utils.Utils; import okhttp3.MediaType; import okhttp3.MultipartBody; @@ -19,6 +22,10 @@ public class FileCreateRequest { public boolean isPrivateFile; public String customCoordinates; public List responseFields; + public boolean overwriteFile; + public boolean overwriteAITags; + public boolean overwriteTags; + public boolean overwriteCustomMetadata; public FileCreateRequest(URL url, String fileName) { this.url = url; @@ -94,6 +101,38 @@ public void setResponseFields(List responseFields) { this.responseFields = responseFields; } + public boolean isOverwriteFile() { + return overwriteFile; + } + + public void setOverwriteFile(boolean overwriteFile) { + this.overwriteFile = overwriteFile; + } + + public boolean isOverwriteAITags() { + return overwriteAITags; + } + + public void setOverwriteAITags(boolean overwriteAITags) { + this.overwriteAITags = overwriteAITags; + } + + public boolean isOverwriteTags() { + return overwriteTags; + } + + public void setOverwriteTags(boolean overwriteTags) { + this.overwriteTags = overwriteTags; + } + + public boolean isOverwriteCustomMetadata() { + return overwriteCustomMetadata; + } + + public void setOverwriteCustomMetadata(boolean overwriteCustomMetadata) { + this.overwriteCustomMetadata = overwriteCustomMetadata; + } + @Override public String toString() { return "FileCreateRequest{" + @@ -104,6 +143,10 @@ public String toString() { ", isPrivateFile=" + isPrivateFile + ", customCoordinates=" + customCoordinates + ", responseFields=" + responseFields + + ", overwriteFile=" + overwriteFile + + ", overwriteAITags=" + overwriteAITags + + ", overwriteTags=" + overwriteTags + + ", overwriteCustomMetadata=" + overwriteCustomMetadata + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java index 732c385..aecd5b9 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -1,8 +1,11 @@ package io.imagekit.sdk.models; +import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; +import java.util.HashMap; import java.util.Map; import okhttp3.ResponseBody; @@ -36,4 +39,12 @@ public Map getHeaders() { public void setHeaders(Map headers) { this.headers = headers; } + + public Map getMap() { + if (null!=raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index 04faaeb..8f3f1c8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -57,14 +57,6 @@ public void setHelp(String help) { this.help = help; } - public Map getMap(){ - if (null!=responseMetaData.getRaw()) { - return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - public String getFileId() { return fileId; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 2c9986a..95a5ebf 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -42,14 +42,6 @@ public void setHelp(String help) { this.help = help; } - public Map getMap(){ - if (null!=responseMetaData.getRaw()) { - return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - public String getRequestId() { return requestId; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 0b3b44b..9b6bacd 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -42,14 +42,6 @@ public void setHelp(String help) { this.help = help; } - public Map getMap(){ - if (null!=responseMetaData.getRaw()) { - return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - public String getStatus() { return status; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index abd3280..cb36ea2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -48,14 +48,6 @@ public void setHelp(String help) { this.help = help; } - public Map getMap(){ - if (null!=responseMetaData.getRaw()) { - return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - public List getSuccessfullyDeletedFileIds() { return successfullyDeletedFileIds; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 1eda49f..d2dfaa3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -55,14 +55,6 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { this.responseMetaData = responseMetaData; } - public List> getMap(){ - if (null!=responseMetaData.getRaw()) { - return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>>() { - }.getType()); - } - return new ArrayList>(); - } - public List getResults() { return results; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index b153cbe..7de513b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -43,14 +43,6 @@ public void setHelp(String help) { this.help = help; } - public Map getMap(){ - if (null!=responseMetaData.getRaw()) { - return new Gson().fromJson(responseMetaData.getRaw(), new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - public MetaData getResults() { return results; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index bc6cc92..c3f11ab 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -1,6 +1,8 @@ package io.imagekit.sdk.tasks; import com.google.gson.Gson; +import com.google.gson.JsonParser; + import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.utils.Utils; @@ -52,6 +54,18 @@ public MultipartBody build(FileCreateRequest fileCreateRequest){ if (null!=fileCreateRequest.responseFields) { builder.addFormDataPart("responseFields", Utils.listToString(fileCreateRequest.responseFields)); } + if (fileCreateRequest.overwriteFile) { + builder.addFormDataPart("overwriteFile", "true"); + } + if (fileCreateRequest.overwriteAITags) { + builder.addFormDataPart("overwriteAITags", "true"); + } + if (fileCreateRequest.overwriteTags) { + builder.addFormDataPart("overwriteTags", "true"); + } + if (fileCreateRequest.overwriteCustomMetadata) { + builder.addFormDataPart("overwriteCustomMetadata", "true"); + } return builder.build(); } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index 95c7a2f..9f3e36f 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -52,6 +52,10 @@ public void valid_upload_expectSuccess() { FileCreateRequest fileCreateRequest=new FileCreateRequest("f06830ca9f1e3e90","demo.jpg"); fileCreateRequest.setPrivateFile(true); + fileCreateRequest.setOverwriteFile(true); + fileCreateRequest.setOverwriteAITags(true); + fileCreateRequest.setOverwriteTags(true); + fileCreateRequest.setOverwriteCustomMetadata(true); Result result = SUT.upload(fileCreateRequest); assertEquals(fileCreateRequest,ac.getValue()); } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 5a02138..2b5e959 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -1,6 +1,8 @@ package io.imagekit.sampleapp; +import com.google.gson.JsonObject; + import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; @@ -30,11 +32,11 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); -// uploadFromBytes(); + uploadFromBytes(); // addTags(); // removeTags(); // createCustomMetaDataFields(); - updateCustomMetaDataFields(); +// updateCustomMetaDataFields(); // deleteCustomMetaDataField("6296138e91fa57897758dc37"); // getCustomMetaDataFields(); // @@ -162,7 +164,7 @@ private static void getPurgeCacheStatus(String requestId) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -176,7 +178,7 @@ private static ResultCache purgeCache(String filePath) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); return result; } @@ -191,7 +193,7 @@ private static void deleteFile(String fileId) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -206,7 +208,7 @@ private static void deleteFiles(List files) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -227,7 +229,7 @@ private static void updateDetails(String fileId) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -241,7 +243,7 @@ private static void getFileMetaData(String fileId) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -255,7 +257,7 @@ private static void getRemoteFileMetaData(String url) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -269,7 +271,7 @@ private static void getFileDetail(String fileId) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -287,7 +289,7 @@ private static List getList(int skip, int limit) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(resultList.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultList.getMap()); + System.out.println(resultList.getResponseMetaData().getMap()); System.out.println("\n\n"); return resultList.getResults(); } @@ -326,7 +328,7 @@ private static void uploadFromURL() { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -344,7 +346,7 @@ private static void uploadFromBase64() { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -354,8 +356,12 @@ private static void uploadFromBytes() { URL url = App.class.getClassLoader().getResource("sample1.jpg"); File file=new File(url.getPath()); byte[] bytes= Utils.fileToBytes(file); - FileCreateRequest fileCreateRequest =new FileCreateRequest(bytes, "sample_image.jpg"); + FileCreateRequest fileCreateRequest =new FileCreateRequest(bytes, "sample_image_th.jpg"); fileCreateRequest.setUseUniqueFileName(false); + fileCreateRequest.setOverwriteFile(true); + fileCreateRequest.setOverwriteAITags(true); + fileCreateRequest.setOverwriteTags(true); + fileCreateRequest.setOverwriteCustomMetadata(true); Result result = ImageKit.getInstance().upload(fileCreateRequest); System.out.println(">> Uploading done."); System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); @@ -363,7 +369,7 @@ private static void uploadFromBytes() { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -377,6 +383,8 @@ private static void addTags() { ResultTags result = ImageKit.getInstance().addTags(tagsRequest); System.out.println(">> Add Tags done."); System.out.println(Color.ANSI_GREEN+">> Response add tags:"+Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); System.out.println(result); System.out.println("\n\n"); } @@ -390,6 +398,8 @@ private static void removeTags() { ResultTags result = ImageKit.getInstance().removeTags(tagsRequest); System.out.println(">> remove Tags done."); System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); System.out.println(result); System.out.println("\n\n"); } @@ -398,6 +408,8 @@ private static void getCustomMetaDataFields() { ResultCustomMetaData result = ImageKit.getInstance().getCustomMetaDataFields(); System.out.println(">> Fetch CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); System.out.println(result); System.out.println("\n\n"); } @@ -415,6 +427,8 @@ private static void createCustomMetaDataFields() { System.out.println(Color.ANSI_GREEN+">> Response create CustomMetaDataFields :"+Color.ANSI_RESET); System.out.println(resultCustomMetaData); System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(resultCustomMetaData.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -426,7 +440,7 @@ private static void deleteCustomMetaDataField(String id) { System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -445,6 +459,8 @@ private static void updateCustomMetaDataFields() { System.out.println(Color.ANSI_GREEN+">> Response edit CustomMetaDataFields :"+Color.ANSI_RESET); System.out.println(resultCustomMetaData); System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(resultCustomMetaData.getResponseMetaData().getMap()); System.out.println("\n\n"); } } From 370229a46e2b62f24927318bbcff41b4240cb268 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 14:20:53 +0530 Subject: [PATCH 035/112] added few fixes on getMap and removed extra model --- .../main/java/io/imagekit/sdk/ImageKit.java | 10 +- .../imagekit/sdk/models/results/Result.java | 4 - .../sdk/models/results/ResultCache.java | 6 -- .../sdk/models/results/ResultCacheStatus.java | 6 -- .../models/results/ResultCustomMetaData.java | 55 ----------- .../results/ResultCustomMetaDataField.java | 56 ----------- .../sdk/models/results/ResultFileDelete.java | 6 -- .../sdk/models/results/ResultList.java | 4 - .../sdk/models/results/ResultMetaData.java | 6 -- .../sdk/models/results/ResultTags.java | 56 ----------- .../io/imagekit/sdk/tasks/RestClient.java | 78 ++++++--------- .../java/io/imagekit/sdk/ImageKitTest.java | 98 +++++++++---------- .../io/imagekit/sdk/tasks/RestClientTest.java | 26 ++--- src/main/java/io/imagekit/sampleapp/App.java | 26 +++-- 14 files changed, 107 insertions(+), 330 deletions(-) delete mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java delete mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java delete mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 52f0c08..928412e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -203,7 +203,7 @@ public int pHashDistance(String firstHex, String secondHex){ * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags addTags(TagsRequest tagsRequest){ + public Result addTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "addTags"); } @@ -212,7 +212,7 @@ public ResultTags addTags(TagsRequest tagsRequest){ * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags removeTags(TagsRequest tagsRequest){ + public Result removeTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "removeTags"); } @@ -220,7 +220,7 @@ public ResultTags removeTags(TagsRequest tagsRequest){ * * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema */ - public ResultCustomMetaData getCustomMetaDataFields() { + public Result getCustomMetaDataFields() { return restClient.getCustomMetaDataFields(); } @@ -229,7 +229,7 @@ public ResultCustomMetaData getCustomMetaDataFields() { * @param customMetaDataFieldCreateRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength * @return ResultCustomMetaData with ResultCustomMetaDataField */ - public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } @@ -247,7 +247,7 @@ public Result deleteCustomMetaDataField(String id){ * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's id, schema with type, minLength, maxLength * @return ResultCustomMetaData with ResultCustomMetaDataField */ - public ResultCustomMetaData updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { + public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index 8f3f1c8..ea96e02 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -1,13 +1,9 @@ package io.imagekit.sdk.models.results; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.ResponseMetaData; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class Result extends BaseFile { private boolean isSuccessful; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 95a5ebf..1c89819 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -1,11 +1,5 @@ package io.imagekit.sdk.models.results; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import java.util.HashMap; -import java.util.Map; - import io.imagekit.sdk.models.ResponseMetaData; public class ResultCache { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 9b6bacd..3adf5ad 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -1,11 +1,5 @@ package io.imagekit.sdk.models.results; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import java.util.HashMap; -import java.util.Map; - import io.imagekit.sdk.models.ResponseMetaData; public class ResultCacheStatus { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java deleted file mode 100644 index 6e33891..0000000 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaData.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.imagekit.sdk.models.results; - -import java.util.ArrayList; -import java.util.List; - -import io.imagekit.sdk.models.ResponseMetaData; - -public class ResultCustomMetaData { - private boolean isSuccessful; - private String message; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - private List resultCustomMetaDataFields = new ArrayList<>(); - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - public List getResultCustomMetaDataFields() { - return resultCustomMetaDataFields; - } - - public void setResultCustomMetaDataFields(List resultCustomMetaDataFields) { - this.resultCustomMetaDataFields = resultCustomMetaDataFields; - } - - @Override - public String toString() { - return "Result{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", responseMetaData=" + responseMetaData + - ", resultCustomMetaDataFields=" + resultCustomMetaDataFields + - '}'; - } -} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java deleted file mode 100644 index e484efb..0000000 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.imagekit.sdk.models.results; - - -import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; - -public class ResultCustomMetaDataField { - private String id; - private String name; - private String label; - private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); - - public ResultCustomMetaDataField() { - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public CustomMetaDataFieldSchemaObject getSchema() { - return schema; - } - - public void setSchema(CustomMetaDataFieldSchemaObject schema) { - this.schema = schema; - } - - @Override - public String toString() { - return "CustomMetaDataFieldRequest{" + - "id=" + '"' + id + '"' + - ", name=" + '"' + name + '"' + - ", label=" + '"' + label + '"' + - ", schema=" + schema + - '}'; - } -} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index cb36ea2..6fe1407 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -1,13 +1,7 @@ package io.imagekit.sdk.models.results; -import com.google.gson.Gson; -import com.google.gson.internal.$Gson$Preconditions; -import com.google.gson.reflect.TypeToken; - import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import io.imagekit.sdk.models.ResponseMetaData; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index d2dfaa3..72a3102 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -1,13 +1,9 @@ package io.imagekit.sdk.models.results; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.ResponseMetaData; -import java.util.ArrayList; import java.util.List; -import java.util.Map; public class ResultList { private boolean isSuccessful; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index 7de513b..e5239c8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -1,14 +1,8 @@ package io.imagekit.sdk.models.results; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.ResponseMetaData; -import java.util.HashMap; -import java.util.Map; - - public class ResultMetaData { private boolean isSuccessful; private String message; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java deleted file mode 100644 index dc45db2..0000000 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.imagekit.sdk.models.results; - -import java.util.List; - -import io.imagekit.sdk.models.ResponseMetaData; - -public class ResultTags { - private boolean isSuccessful; - private String message; - public List successfullyUpdatedFileIds; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public ResultTags() { - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getSuccessfullyUpdatedFileIds() { - return successfullyUpdatedFileIds; - } - - public void setSuccessfullyUpdatedFileIds(List successfullyUpdatedFileIds) { - this.successfullyUpdatedFileIds = successfullyUpdatedFileIds; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultList{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", successfullyUpdatedFileIds=" + successfullyUpdatedFileIds + - '}'; - } -} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 741f9c9..e708bf3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -8,7 +8,6 @@ import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; -import io.imagekit.sdk.models.results.ResultCustomMetaDataField; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; @@ -18,8 +17,6 @@ import okhttp3.*; import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -467,8 +464,8 @@ else if (response.code()==500) { return result; } - public ResultTags manageTags(TagsRequest tagsRequest, String action) { - ResultTags result = new ResultTags(); + public Result manageTags(TagsRequest tagsRequest, String action) { + Result result = new Result(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); headers.put("Accept-Encoding","application/json"); @@ -486,9 +483,8 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { Response response = client.newCall(request).execute(); String respBody = response.body().string(); - result = new Gson().fromJson(respBody, ResultTags.class); + result = new Gson().fromJson(respBody, Result.class); if (response.code() == 200) { - result =new Gson().fromJson(respBody, ResultTags.class); result.setSuccessful(true); result.setMessage(response.message().equals("") ? action.equals("removeTags") ? "Removed Tags SuccessFully." : "Added Tags SuccessFully." : response.message()); } else { @@ -503,8 +499,8 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { return result; } - public ResultCustomMetaData getCustomMetaDataFields() { - ResultCustomMetaData resultCustomMetaData = new ResultCustomMetaData(); + public Result getCustomMetaDataFields() { + Result result = new Result(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -523,32 +519,28 @@ public ResultCustomMetaData getCustomMetaDataFields() { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - ResultCustomMetaDataField[] requests = new Gson().fromJson(respBody, ResultCustomMetaDataField[].class); - List resultCustomMetaDataFields = Arrays.asList(requests); - resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); - resultCustomMetaData.setSuccessful(true); - resultCustomMetaData.getResponseMetaData().setRaw(respBody); - resultCustomMetaData.setMessage(response.message().equals("") ? "Fetched customMetadata successFully" : response.message()); + result.setSuccessful(true); + result.getResponseMetaData().setRaw(respBody); + result.setMessage(response.message().equals("") ? "Fetched customMetadata successFully" : response.message()); } else { - resultCustomMetaData.setSuccessful(false); - resultCustomMetaData.setMessage("Error: Internal server error."); + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); } - Utils.populateResponseMetadata(respBody, resultCustomMetaData.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - System.out.println("Here:==> " + resultCustomMetaData.getResultCustomMetaDataFields()); - return resultCustomMetaData; + return result; } - public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { if (customMetaDataFieldCreateRequest.getName() == null) { throw new RuntimeException("Error: Name not provided."); } if (customMetaDataFieldCreateRequest.getLabel() == null) { throw new RuntimeException("Error: Label not provided."); } - ResultCustomMetaData resultCustomMetaData = new ResultCustomMetaData(); + Result result = new Result(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -567,24 +559,21 @@ public ResultCustomMetaData createCustomMetaDataFields(CustomMetaDataFieldCreate Response response = client.newCall(request).execute(); String respBody=response.body().string(); JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaData = new Gson().fromJson(responseBody, ResultCustomMetaData.class); + result = new Gson().fromJson(responseBody, Result.class); if (response.code()==201){ - ResultCustomMetaDataField requests = new Gson().fromJson(respBody, ResultCustomMetaDataField.class); - List resultCustomMetaDataFields = Collections.singletonList(requests); - resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); - resultCustomMetaData.setSuccessful(true); - resultCustomMetaData.getResponseMetaData().setRaw(respBody); - if (resultCustomMetaData.getMessage() == null) { - resultCustomMetaData.setMessage("CustomMetaData Created SuccessFully."); + result.setSuccessful(true); + result.getResponseMetaData().setRaw(respBody); + if (result.getMessage() == null) { + result.setMessage("CustomMetaData Created SuccessFully."); } } else { - resultCustomMetaData.setSuccessful(false); + result.setSuccessful(false); } - Utils.populateResponseMetadata(respBody, resultCustomMetaData.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return resultCustomMetaData; + return result; } public Result deleteCustomMetaDataField(String id) { @@ -629,8 +618,8 @@ else if (response.code()==500) { return result; } - public ResultCustomMetaData updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { - ResultCustomMetaData resultCustomMetaData = new ResultCustomMetaData(); + public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { + Result result = new Result(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -650,23 +639,20 @@ public ResultCustomMetaData updateCustomMetaDataFields(CustomMetaDataFieldUpdate Response response = client.newCall(request).execute(); String respBody=response.body().string(); JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaData = new Gson().fromJson(responseBody, ResultCustomMetaData.class); + result = new Gson().fromJson(responseBody, Result.class); if (response.code()==200){ - ResultCustomMetaDataField requests = new Gson().fromJson(respBody, ResultCustomMetaDataField.class); - List resultCustomMetaDataFields = Collections.singletonList(requests); - resultCustomMetaData.setResultCustomMetaDataFields(resultCustomMetaDataFields); - resultCustomMetaData.setSuccessful(true); - resultCustomMetaData.getResponseMetaData().setRaw(respBody); - if (resultCustomMetaData.getMessage() == null) { - resultCustomMetaData.setMessage("CustomMetaData Edited SuccessFully."); + result.setSuccessful(true); + result.getResponseMetaData().setRaw(respBody); + if (result.getMessage() == null) { + result.setMessage("CustomMetaData Edited SuccessFully."); } } else { - resultCustomMetaData.setSuccessful(false); + result.setSuccessful(false); } - Utils.populateResponseMetadata(respBody, resultCustomMetaData.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return resultCustomMetaData; + return result; } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index fc950d2..0a6a186 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -640,16 +640,16 @@ public void add_tags_expectedSuccessWith() { TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - ResultTags result=new ResultTags(); - result.setSuccessful(true); - result.setMessage("Added Tags SuccessFully."); - result.getResponseMetaData().setHttpStatusCode(200); - when(restClient.manageTags(tagsRequest, "addTags")).thenReturn(result); + Result mockResult=new Result(); + mockResult.setSuccessful(true); + mockResult.setMessage("Added Tags SuccessFully."); + mockResult.getResponseMetaData().setHttpStatusCode(200); + when(restClient.manageTags(tagsRequest, "addTags")).thenReturn(mockResult); - ResultTags resultTags = SUT.addTags(tagsRequest); - assertTrue(resultTags.isSuccessful()); - assertEquals(resultTags.getResponseMetaData().getHttpStatusCode(), 200); - assertEquals(result.getMessage(), "Added Tags SuccessFully."); + Result result = SUT.addTags(tagsRequest); + assertTrue(result.isSuccessful()); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); + assertEquals(mockResult.getMessage(), "Added Tags SuccessFully."); } @Test @@ -661,16 +661,16 @@ public void remove_tags_expectedSuccessWith() { TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - ResultTags result=new ResultTags(); - result.setSuccessful(true); - result.setMessage("Removed Tags SuccessFully."); - result.getResponseMetaData().setHttpStatusCode(200); - when(restClient.manageTags(tagsRequest, "removeTags")).thenReturn(result); + Result mockResult=new Result(); + mockResult.setSuccessful(true); + mockResult.setMessage("Removed Tags SuccessFully."); + mockResult.getResponseMetaData().setHttpStatusCode(200); + when(restClient.manageTags(tagsRequest, "removeTags")).thenReturn(mockResult); - ResultTags resultTags = SUT.removeTags(tagsRequest); - assertTrue(resultTags.isSuccessful()); - assertEquals(resultTags.getResponseMetaData().getHttpStatusCode(), 200); - assertEquals(result.getMessage(), "Removed Tags SuccessFully."); + Result result = SUT.removeTags(tagsRequest); + assertTrue(result.isSuccessful()); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); + assertEquals(mockResult.getMessage(), "Removed Tags SuccessFully."); } @Test @@ -681,25 +681,17 @@ public void get_custom_metadata_fields_expectedSuccessWith() { mockCustomMetaDataFieldSchemaObject.setMinLength(10); mockCustomMetaDataFieldSchemaObject.setMaxLength(10); - ResultCustomMetaDataField mockResultCustomMetaDataField = new ResultCustomMetaDataField(); - mockResultCustomMetaDataField.setId("id"); - mockResultCustomMetaDataField.setName("name"); - mockResultCustomMetaDataField.setLabel("label"); - mockResultCustomMetaDataField.setSchema(mockCustomMetaDataFieldSchemaObject); - - ResultCustomMetaData mockCustomMetaData=new ResultCustomMetaData(); - mockCustomMetaData.setSuccessful(true); - mockCustomMetaData.setMessage("Fetched CustomMetaData SuccessFully."); - mockCustomMetaData.getResponseMetaData().setHttpStatusCode(200); - mockCustomMetaData.setResultCustomMetaDataFields(Collections.singletonList(mockResultCustomMetaDataField)); + Result mockResult=new Result(); + mockResult.setSuccessful(true); + mockResult.setMessage("Fetched CustomMetaData SuccessFully."); + mockResult.getResponseMetaData().setHttpStatusCode(200); - when(restClient.getCustomMetaDataFields()).thenReturn(mockCustomMetaData); + when(restClient.getCustomMetaDataFields()).thenReturn(mockResult); - ResultCustomMetaData resultCustomMetaData = SUT.getCustomMetaDataFields(); - assertTrue(resultCustomMetaData.isSuccessful()); - assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); - assertEquals(mockCustomMetaData.getMessage(), "Fetched CustomMetaData SuccessFully."); - assertEquals(mockCustomMetaData.getResultCustomMetaDataFields(), Collections.singletonList(mockResultCustomMetaDataField)); + Result result = SUT.getCustomMetaDataFields(); + assertTrue(result.isSuccessful()); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); + assertEquals(mockResult.getMessage(), "Fetched CustomMetaData SuccessFully."); } @Test @@ -714,17 +706,17 @@ public void createCustomMetaDataFields_successExpected() { customMetaDataFieldCreateRequest.setLabel("mockLabel"); customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - ResultCustomMetaData mockResultCustomMetaData = new ResultCustomMetaData(); - mockResultCustomMetaData.setSuccessful(true); - mockResultCustomMetaData.setMessage("CustomMetaData created..."); - mockResultCustomMetaData.getResponseMetaData().setHttpStatusCode(200); + Result mockResult = new Result(); + mockResult.setSuccessful(true); + mockResult.setMessage("CustomMetaData created..."); + mockResult.getResponseMetaData().setHttpStatusCode(200); - when(restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest)).thenReturn(mockResultCustomMetaData); + when(restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest)).thenReturn(mockResult); - ResultCustomMetaData result=SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - assertThat(result.isSuccessful(),is(mockResultCustomMetaData.isSuccessful())); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResultCustomMetaData.getResponseMetaData().getHttpStatusCode()); - assertEquals(result.getMessage(), mockResultCustomMetaData.getMessage()); + Result result=SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + assertThat(result.isSuccessful(),is(mockResult.isSuccessful())); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResult.getResponseMetaData().getHttpStatusCode()); + assertEquals(result.getMessage(), mockResult.getMessage()); } @Test @@ -751,16 +743,16 @@ public void updateCustomMetaDataFields_successExpected() { customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - ResultCustomMetaData mockResultCustomMetaData = new ResultCustomMetaData(); - mockResultCustomMetaData.setSuccessful(true); - mockResultCustomMetaData.setMessage("CustomMetaData updated..."); - mockResultCustomMetaData.getResponseMetaData().setHttpStatusCode(200); + Result mockResult = new Result(); + mockResult.setSuccessful(true); + mockResult.setMessage("CustomMetaData updated..."); + mockResult.getResponseMetaData().setHttpStatusCode(200); - when(restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest)).thenReturn(mockResultCustomMetaData); + when(restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest)).thenReturn(mockResult); - ResultCustomMetaData result=SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - assertThat(result.isSuccessful(),is(mockResultCustomMetaData.isSuccessful())); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResultCustomMetaData.getResponseMetaData().getHttpStatusCode()); - assertEquals(result.getMessage(), mockResultCustomMetaData.getMessage()); + Result result=SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + assertThat(result.isSuccessful(),is(mockResult.isSuccessful())); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResult.getResponseMetaData().getHttpStatusCode()); + assertEquals(result.getMessage(), mockResult.getMessage()); } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index 9f3e36f..79138a0 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -617,7 +617,7 @@ public void add_tags() { List tags = new ArrayList<>(); tags.add("tag1"); tags.add("tag2"); - ResultTags result = SUT.manageTags(new TagsRequest(fileIds, tags), "addTags"); + Result result = SUT.manageTags(new TagsRequest(fileIds, tags), "addTags"); assertNotNull(result.getMessage()); assertEquals(result.getMessage(), "Tags added SuccessFully"); assertTrue(result.isSuccessful()); @@ -634,7 +634,7 @@ public void remove_tags() { fileIds.add("62958deef33aa80bdadf7533"); List tags = new ArrayList<>(); tags.add("tag1"); - ResultTags result = SUT.manageTags(new TagsRequest(fileIds, tags), "removeTags"); + Result result = SUT.manageTags(new TagsRequest(fileIds, tags), "removeTags"); assertNotNull(result.getMessage()); assertEquals(result.getMessage(), "Tags removed SuccessFully"); assertTrue(result.isSuccessful()); @@ -653,11 +653,11 @@ public void getCustomMetaDataFields() { OkHttpClientStub clientStub= new OkHttpClientStub(jsonArray.toString(),200, "ok"); SUT.setClient(clientStub); - ResultCustomMetaData resultCustomMetaData = SUT.getCustomMetaDataFields(); - assertNotNull(resultCustomMetaData.getMessage()); - assertEquals(resultCustomMetaData.getMessage(), "Fetched CustomMetaData SuccessFully"); - assertTrue(resultCustomMetaData.isSuccessful()); - assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); + Result result = SUT.getCustomMetaDataFields(); + assertNotNull(result.getMessage()); + assertEquals(result.getMessage(), "Fetched CustomMetaData SuccessFully"); + assertTrue(result.isSuccessful()); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); } @Test @@ -670,11 +670,11 @@ public void createCustomMetaDataFields_valid_request_expect_success() { SUT.setClient(clientStub); CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - ResultCustomMetaData resultCustomMetaData = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + Result result = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); assertEquals("https://api.imagekit.io/v1/customMetadataFields",SUT.request.url().toString()); - assertEquals("CustomMetaData created SuccessFully", resultCustomMetaData.getMessage()); - assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 201); + assertEquals("CustomMetaData created SuccessFully", result.getMessage()); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 201); } @Test @@ -702,11 +702,11 @@ public void updateCustomMetaDataFields_valid_request_expect_success() { CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); customMetaDataFieldUpdateRequest.setId("mockId"); - ResultCustomMetaData resultCustomMetaData = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + Result result = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); assertEquals("https://api.imagekit.io/v1/customMetadataFields/mockId",SUT.request.url().toString()); - assertEquals("CustomMetaData edited SuccessFully", resultCustomMetaData.getMessage()); - assertEquals(resultCustomMetaData.getResponseMetaData().getHttpStatusCode(), 200); + assertEquals("CustomMetaData edited SuccessFully", result.getMessage()); + assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); } /** diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 2b5e959..37dbc05 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -36,7 +36,7 @@ public static void main(String[] args) throws Exception{ // addTags(); // removeTags(); // createCustomMetaDataFields(); -// updateCustomMetaDataFields(); + updateCustomMetaDataFields(); // deleteCustomMetaDataField("6296138e91fa57897758dc37"); // getCustomMetaDataFields(); // @@ -380,7 +380,7 @@ private static void addTags() { tags.add("tag1"); tags.add("tag2"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); - ResultTags result = ImageKit.getInstance().addTags(tagsRequest); + Result result = ImageKit.getInstance().addTags(tagsRequest); System.out.println(">> Add Tags done."); System.out.println(Color.ANSI_GREEN+">> Response add tags:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); @@ -395,7 +395,7 @@ private static void removeTags() { List tags = new ArrayList<>(); tags.add("tag1"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); - ResultTags result = ImageKit.getInstance().removeTags(tagsRequest); + Result result = ImageKit.getInstance().removeTags(tagsRequest); System.out.println(">> remove Tags done."); System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); @@ -405,7 +405,7 @@ private static void removeTags() { } private static void getCustomMetaDataFields() { - ResultCustomMetaData result = ImageKit.getInstance().getCustomMetaDataFields(); + Result result = ImageKit.getInstance().getCustomMetaDataFields(); System.out.println(">> Fetch CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); @@ -422,13 +422,12 @@ private static void createCustomMetaDataFields() { customMetaDataFieldCreateRequest.setLabel("LabelCustom91"); customMetaDataFieldCreateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); - ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); + Result result = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); System.out.println(">> Create CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Response create CustomMetaDataFields :"+Color.ANSI_RESET); - System.out.println(resultCustomMetaData); - System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); + System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultCustomMetaData.getResponseMetaData().getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -446,21 +445,20 @@ private static void deleteCustomMetaDataField(String id) { private static void updateCustomMetaDataFields() { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); - schemaObject.setMinValue(10); + schemaObject.setMinValue(1); schemaObject.setMaxValue(200); CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808d"); - customMetaDataFieldUpdateRequest.setLabel("prices"); + customMetaDataFieldUpdateRequest.setLabel("priceLabel"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); - ResultCustomMetaData resultCustomMetaData = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + Result result = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); System.out.println(">> Edit CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Response edit CustomMetaDataFields :"+Color.ANSI_RESET); - System.out.println(resultCustomMetaData); - System.out.println(resultCustomMetaData.getResultCustomMetaDataFields()); + System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultCustomMetaData.getResponseMetaData().getMap()); + System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } } From ed3e12a01ae2780df71b37b8f0d9d929d8451aaf Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 14:58:21 +0530 Subject: [PATCH 036/112] fixed getList for getCustomMetaDataFields --- README.md | 6 +++--- .../sdk/models/CustomMetaDataTypeEnum.java | 7 ------- .../io/imagekit/sdk/models/ResponseMetaData.java | 14 +++++++++++--- src/main/java/io/imagekit/sampleapp/App.java | 8 ++++---- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 184421e..4d2789a 100644 --- a/README.md +++ b/README.md @@ -537,7 +537,7 @@ System.out.println(result); System.out.println("Raw Response:"); System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(result.getResponseMetaData().getList()); System.out.println(result.getResultCustomMetaDataFields()); ``` @@ -545,7 +545,7 @@ System.out.println(result.getResultCustomMetaDataFields()); It creates the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). -The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class which contains name, label, schema and then set the parameters to be created. +The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class. ```java CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); @@ -585,7 +585,7 @@ System.out.println(result.getResponseMetaData().getMap()); It edits the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). -The argument to the `updateCustomMetaDataFields()` method is the object of `CustomMetaDataFieldUpdateRequest` class which contains id(id of customMetaDataFields which we want to update with), label, schema and then set the parameters to be updated. +The argument to the `updateCustomMetaDataFields()` method is the object of `CustomMetaDataFieldUpdateRequest` class. ```java CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java index 8fddaa8..cabe7bb 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java @@ -3,19 +3,12 @@ import com.google.gson.annotations.SerializedName; public enum CustomMetaDataTypeEnum { - @SerializedName("Text") Text, - @SerializedName("Textarea") Textarea, - @SerializedName("Number") Number, - @SerializedName("Date") Date, - @SerializedName("Boolean") Boolean, - @SerializedName("SingleSelect") SingleSelect, - @SerializedName("MultiSelect") MultiSelect; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java index aecd5b9..5b9b98d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -2,14 +2,14 @@ import com.google.gson.Gson; -import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; -import okhttp3.ResponseBody; - public class ResponseMetaData { private String raw; @@ -47,4 +47,12 @@ public Map getMap() { } return new HashMap<>(); } + + public List getList() { + if (null!=raw) { + return new Gson().fromJson(raw, new TypeToken() { + }.getType()); + } + return new ArrayList<>(); + } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 37dbc05..d23fccd 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -32,13 +32,13 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); - uploadFromBytes(); +// uploadFromBytes(); // addTags(); // removeTags(); // createCustomMetaDataFields(); - updateCustomMetaDataFields(); +// updateCustomMetaDataFields(); // deleteCustomMetaDataField("6296138e91fa57897758dc37"); -// getCustomMetaDataFields(); + getCustomMetaDataFields(); // // calculateDistance(); // generatingAuthParams(); @@ -409,7 +409,7 @@ private static void getCustomMetaDataFields() { System.out.println(">> Fetch CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(result.getResponseMetaData().getList()); System.out.println(result); System.out.println("\n\n"); } From 8aa82e8d9ed01b1d9ef8f1f671e396f74d8613d1 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 15:15:18 +0530 Subject: [PATCH 037/112] added minor fixes --- README.md | 12 ++++---- .../io/imagekit/sdk/models/TagsRequest.java | 4 +-- src/main/java/io/imagekit/sampleapp/App.java | 29 ++++++++++--------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 4d2789a..5751e1b 100644 --- a/README.md +++ b/README.md @@ -497,7 +497,7 @@ fileIds.add("FileId"); List tags = new ArrayList<>(); tags.add("tag1"); tags.add("tag2"); -ResultCacheStatus result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "addTags"); +Result result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "addTags"); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); @@ -516,7 +516,7 @@ List fileIds = new ArrayList<>(); fileIds.add("FileId"); List tags = new ArrayList<>(); tags.add("tag1"); -ResultCacheStatus result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "removeTags"); +Result result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "removeTags"); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); @@ -531,7 +531,7 @@ fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) ```java -ResultCustomMetaData result=ImageKit.getInstance().getCustomMetaDataFields(); +Result result=ImageKit.getInstance().getCustomMetaDataFields(); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); @@ -555,7 +555,7 @@ CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new customMe customMetaDataFieldCreateRequest.setName("Name"); customMetaDataFieldCreateRequest.setLabel("Label"); customMetaDataFieldCreateRequest.setSchema(schemaObject); -ResultCustomMetaData result=ImageKit.getInstance().createCustomMetaDataFields(); +Result result=ImageKit.getInstance().createCustomMetaDataFields(); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); @@ -572,7 +572,7 @@ It deletes the CustomMetaDataFields as per the The argument to the `deleteCustomMetaDataField()` method accepts the id of customMetaDataField which we want to be deleted. ```java -ResultCustomMetaData result=ImageKit.getInstance().deleteCustomMetaDataField("id"); +Result result=ImageKit.getInstance().deleteCustomMetaDataField("id"); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); @@ -596,7 +596,7 @@ CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMe customMetaDataFieldUpdateRequest.setId("id"); customMetaDataFieldUpdateRequest.setLabel("label"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); -ResultCustomMetaData result=ImageKit.getInstance().updateCustomMetaDataFields(); +Result result=ImageKit.getInstance().updateCustomMetaDataFields(); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java index 0a5795b..0c6f077 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java @@ -31,8 +31,8 @@ public void setFileIds(List fileIds) { @Override public String toString() { return "TagsRequest{" + - "fileIds=" + fileIds.stream().map(name -> ('"' + name + '"')).collect(Collectors.toList()) + - ", tags=" + tags.stream().map(name -> ('"' + name + '"')).collect(Collectors.toList()) + + "fileIds=" + fileIds + + ", tags=" + tags + '}'; } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index d23fccd..1fd37ba 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -32,13 +32,13 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); -// uploadFromBytes(); + uploadFromBytes(); // addTags(); // removeTags(); // createCustomMetaDataFields(); // updateCustomMetaDataFields(); -// deleteCustomMetaDataField("6296138e91fa57897758dc37"); - getCustomMetaDataFields(); +// deleteCustomMetaDataField("62988431cd3d7878e486ccad"); +// getCustomMetaDataFields(); // // calculateDistance(); // generatingAuthParams(); @@ -375,10 +375,11 @@ private static void uploadFromBytes() { private static void addTags() { List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); + fileIds.add("6298833ad3c4405ddb9253c2"); + fileIds.add("629883933df4f9fb1d7cef52"); List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); + tags.add("tag3"); + tags.add("tag4"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); Result result = ImageKit.getInstance().addTags(tagsRequest); System.out.println(">> Add Tags done."); @@ -391,9 +392,11 @@ private static void addTags() { private static void removeTags() { List fileIds = new ArrayList<>(); - fileIds.add("62975a6391fa57b6df7400e0"); + fileIds.add("6298833ad3c4405ddb9253c2"); + fileIds.add("629883933df4f9fb1d7cef52"); List tags = new ArrayList<>(); - tags.add("tag1"); + tags.add("tag3"); + tags.add("tag4"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); Result result = ImageKit.getInstance().removeTags(tagsRequest); System.out.println(">> remove Tags done."); @@ -415,11 +418,9 @@ private static void getCustomMetaDataFields() { } private static void createCustomMetaDataFields() { - CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100); - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("NameCustom91"); - customMetaDataFieldCreateRequest.setLabel("LabelCustom91"); + customMetaDataFieldCreateRequest.setName("NameCus1"); + customMetaDataFieldCreateRequest.setLabel("LabelCm91"); customMetaDataFieldCreateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); Result result = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); @@ -449,8 +450,8 @@ private static void updateCustomMetaDataFields() { schemaObject.setMaxValue(200); CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808d"); - customMetaDataFieldUpdateRequest.setLabel("priceLabel"); + customMetaDataFieldUpdateRequest.setId("62988431cd3d7878e486ccad"); + customMetaDataFieldUpdateRequest.setLabel("labelPri01"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); Result result = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); From f0a4dbf1c5b1fe39e6ae9cfe5c996de410c0268c Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 16:53:55 +0530 Subject: [PATCH 038/112] added getRaw and getMap for all result object with @Deprecated annotation --- README.md | 6 ++--- .../imagekit/sdk/models/results/Result.java | 24 ++++++++++++++++++ .../sdk/models/results/ResultCache.java | 25 +++++++++++++++++++ .../sdk/models/results/ResultCacheStatus.java | 25 +++++++++++++++++++ .../sdk/models/results/ResultFileDelete.java | 24 ++++++++++++++++++ .../sdk/models/results/ResultList.java | 24 ++++++++++++++++++ .../sdk/models/results/ResultMetaData.java | 25 +++++++++++++++++++ .../io/imagekit/sdk/tasks/RestClient.java | 11 ++++++++ 8 files changed, 161 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5751e1b..a9e2f41 100644 --- a/README.md +++ b/README.md @@ -551,11 +551,11 @@ The argument to the `createCustomMetaDataFields()` method is the object of `Cust CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); schemaObject.setMinValue(10); schemaObject.setMaxValue(200); -CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new customMetaDataFieldCreateRequest(); +CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); customMetaDataFieldCreateRequest.setName("Name"); customMetaDataFieldCreateRequest.setLabel("Label"); customMetaDataFieldCreateRequest.setSchema(schemaObject); -Result result=ImageKit.getInstance().createCustomMetaDataFields(); +Result result=ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); @@ -596,7 +596,7 @@ CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMe customMetaDataFieldUpdateRequest.setId("id"); customMetaDataFieldUpdateRequest.setLabel("label"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); -Result result=ImageKit.getInstance().updateCustomMetaDataFields(); +Result result=ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); System.out.println("======FINAL RESULT======="); System.out.println(result); System.out.println("Raw Response:"); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index ea96e02..997c987 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -1,14 +1,21 @@ package io.imagekit.sdk.models.results; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.ResponseMetaData; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class Result extends BaseFile { private boolean isSuccessful; private String message; private String help; + @Deprecated + private String raw; private ResponseMetaData responseMetaData = new ResponseMetaData(); public Result() { @@ -49,6 +56,23 @@ public String getHelp() { return help; } + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap(){ + if (null!=raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + public void setHelp(String help) { this.help = help; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 1c89819..8f34cc8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -1,5 +1,11 @@ package io.imagekit.sdk.models.results; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.HashMap; +import java.util.Map; + import io.imagekit.sdk.models.ResponseMetaData; public class ResultCache { @@ -7,6 +13,8 @@ public class ResultCache { private String message; private String help; private String requestId; + @Deprecated + private String raw; private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultCache() { @@ -36,6 +44,23 @@ public void setHelp(String help) { this.help = help; } + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap(){ + if (null!=raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + public String getRequestId() { return requestId; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 3adf5ad..979c706 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -1,5 +1,11 @@ package io.imagekit.sdk.models.results; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.HashMap; +import java.util.Map; + import io.imagekit.sdk.models.ResponseMetaData; public class ResultCacheStatus { @@ -7,6 +13,8 @@ public class ResultCacheStatus { private String message; private String help; private String status; + @Deprecated + private String raw; private ResponseMetaData responseMetaData = new ResponseMetaData(); public ResultCacheStatus() { @@ -32,6 +40,23 @@ public String getHelp() { return help; } + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap(){ + if (null!=raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + public void setHelp(String help) { this.help = help; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index 6fe1407..37b68e5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -1,7 +1,12 @@ package io.imagekit.sdk.models.results; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import io.imagekit.sdk.models.ResponseMetaData; @@ -9,6 +14,8 @@ public class ResultFileDelete { private boolean isSuccessful; private String message; private String help; + @Deprecated + private String raw; private List successfullyDeletedFileIds; private List missingFileIds; private ResponseMetaData responseMetaData = new ResponseMetaData(); @@ -42,6 +49,23 @@ public void setHelp(String help) { this.help = help; } + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap(){ + if (null!=raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + public List getSuccessfullyDeletedFileIds() { return successfullyDeletedFileIds; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 72a3102..9e48e21 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -1,14 +1,21 @@ package io.imagekit.sdk.models.results; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.ResponseMetaData; +import java.util.ArrayList; import java.util.List; +import java.util.Map; public class ResultList { private boolean isSuccessful; private String message; private String help; + @Deprecated + private String raw; private List results; private ResponseMetaData responseMetaData = new ResponseMetaData(); @@ -43,6 +50,23 @@ public void setHelp(String help) { this.help = help; } + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public List> getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>>() { + }.getType()); + } + return new ArrayList>(); + } + public ResponseMetaData getResponseMetaData() { return responseMetaData; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index e5239c8..44935fa 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -1,5 +1,11 @@ package io.imagekit.sdk.models.results; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.HashMap; +import java.util.Map; + import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.ResponseMetaData; @@ -7,6 +13,8 @@ public class ResultMetaData { private boolean isSuccessful; private String message; private String help; + @Deprecated + private String raw; private MetaData results; private ResponseMetaData responseMetaData = new ResponseMetaData(); @@ -37,6 +45,23 @@ public void setHelp(String help) { this.help = help; } + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap(){ + if (null!=raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + public MetaData getResults() { return results; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index e708bf3..e339567 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -65,6 +65,7 @@ public Result upload(FileCreateRequest fileCreateRequest){ respBody = response.body().string(); result=new Gson().fromJson(respBody,Result.class); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result=new Result(); @@ -104,6 +105,7 @@ public Result updateDetail(FileUpdateRequest fileUpdateRequest){ respBody=response.body().string(); result=new Gson().fromJson(respBody,Result.class); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result=new Result(); @@ -155,6 +157,7 @@ public ResultList getFileList(Map options){ List files=new Gson().fromJson(respBody,new TypeToken>() {}.getType()); resultList.setResults(files); resultList.setSuccessful(true); + resultList.setRaw(respBody); } else if (response.code()==500) { resultList.setSuccessful(false); @@ -195,6 +198,7 @@ public Result getFileDetail(String fileId){ respBody=response.body().string(); result=new Gson().fromJson(respBody,Result.class); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result.setSuccessful(false); @@ -236,6 +240,7 @@ public ResultMetaData getFileMetaData(String fileId){ MetaData metaData =new Gson().fromJson(respBody,MetaData.class); result.setResults(metaData); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result.setSuccessful(false); @@ -277,6 +282,7 @@ public ResultMetaData getRemoteFileMetaData(String url){ MetaData metaData =new Gson().fromJson(respBody,MetaData.class); result.setResults(metaData); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result.setSuccessful(false); @@ -318,6 +324,7 @@ public Result deleteFile(String fileId){ result.setMessage("File deleted successfully!"); result.setFileId(fileId); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result.setSuccessful(false); @@ -361,10 +368,12 @@ public ResultFileDelete bulkDeleteFiles(List fileIds){ result=new Gson().fromJson(respBody,ResultFileDelete.class); result.setMessage("File deleted successfully!"); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==404){ String resp=response.body().string(); result=new Gson().fromJson(resp,ResultFileDelete.class); + result.setRaw(resp); result.getResponseMetaData().setRaw(resp); result.setSuccessful(false); } @@ -407,6 +416,7 @@ public ResultCache purgeCache(String url){ respBody=response.body().string(); result =new Gson().fromJson(respBody,ResultCache.class); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result.setSuccessful(false); @@ -447,6 +457,7 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId){ respBody=response.body().string(); result =new Gson().fromJson(respBody,ResultCacheStatus.class); result.setSuccessful(true); + result.setRaw(respBody); } else if (response.code()==500) { result.setSuccessful(false); From e0b9e84d9401bbc96f24dded148015851a0f84af Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 2 Jun 2022 18:43:06 +0530 Subject: [PATCH 039/112] added APIs for getBulkJobStatus, copy and move folder --- .../main/java/io/imagekit/sdk/ImageKit.java | 29 ++++- .../sdk/models/CopyFolderRequest.java | 40 ++++++ .../sdk/models/MoveFolderRequest.java | 30 +++++ .../io/imagekit/sdk/tasks/RestClient.java | 118 +++++++++++++++++- src/main/java/io/imagekit/sampleapp/App.java | 46 ++++++- 5 files changed, 256 insertions(+), 7 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 928412e..c747efa 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -245,9 +245,36 @@ public Result deleteCustomMetaDataField(String id){ /** * * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's id, schema with type, minLength, maxLength - * @return ResultCustomMetaData with ResultCustomMetaDataField + * @return Result class */ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } + + /** + * + * @param copyFolderRequest that contains sourceFolderPath, destinationPath, includeVersions + * @return Result class + */ + public Result copyFolder(CopyFolderRequest copyFolderRequest) { + return restClient.copyFolder(copyFolderRequest); + } + + /** + * + * @param moveFolderRequest that contains sourceFolderPath, destinationPath + * @return Result class + */ + public Result moveFolder(MoveFolderRequest moveFolderRequest) { + return restClient.moveFolder(moveFolderRequest); + } + + /** + * + * @param jobId + * @return a Result class + */ + public Result getBulkJobStatus(String jobId) { + return restClient.getBulkJobStatus(jobId); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java new file mode 100644 index 0000000..5e96ec8 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java @@ -0,0 +1,40 @@ +package io.imagekit.sdk.models; + +public class CopyFolderRequest { + public String sourceFolderPath; + public String destinationPath; + public Boolean includeVersions; + + public String getSourceFolderPath() { + return sourceFolderPath; + } + + public void setSourceFolderPath(String sourceFolderPath) { + this.sourceFolderPath = sourceFolderPath; + } + + public String getDestinationPath() { + return destinationPath; + } + + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } + + public Boolean getIncludeVersions() { + return includeVersions; + } + + public void setIncludeVersions(Boolean includeVersions) { + this.includeVersions = includeVersions; + } + + @Override + public String toString() { + return "TagsRequest{" + + "sourceFolderPath=" + sourceFolderPath + + ", destinationPath=" + destinationPath + + ", includeVersions=" + includeVersions + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java new file mode 100644 index 0000000..11f6afc --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java @@ -0,0 +1,30 @@ +package io.imagekit.sdk.models; + +public class MoveFolderRequest { + public String sourceFolderPath; + public String destinationPath; + + public String getSourceFolderPath() { + return sourceFolderPath; + } + + public void setSourceFolderPath(String sourceFolderPath) { + this.sourceFolderPath = sourceFolderPath; + } + + public String getDestinationPath() { + return destinationPath; + } + + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } + + @Override + public String toString() { + return "TagsRequest{" + + "sourceFolderPath=" + sourceFolderPath + + ", destinationPath=" + destinationPath + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index e339567..9d5a141 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -6,9 +6,11 @@ import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CopyFolderRequest; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.FileCreateRequest; +import io.imagekit.sdk.models.MoveFolderRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.TagsRequest; @@ -497,6 +499,7 @@ public Result manageTags(TagsRequest tagsRequest, String action) { result = new Gson().fromJson(respBody, Result.class); if (response.code() == 200) { result.setSuccessful(true); + result.setRaw(respBody); result.setMessage(response.message().equals("") ? action.equals("removeTags") ? "Removed Tags SuccessFully." : "Added Tags SuccessFully." : response.message()); } else { result.setSuccessful(false); @@ -531,7 +534,7 @@ public Result getCustomMetaDataFields() { if (response.code()==200){ respBody=response.body().string(); result.setSuccessful(true); - result.getResponseMetaData().setRaw(respBody); + result.setRaw(respBody); result.setMessage(response.message().equals("") ? "Fetched customMetadata successFully" : response.message()); } else { result.setSuccessful(false); @@ -573,7 +576,7 @@ public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest custom result = new Gson().fromJson(responseBody, Result.class); if (response.code()==201){ result.setSuccessful(true); - result.getResponseMetaData().setRaw(respBody); + result.setRaw(respBody); if (result.getMessage() == null) { result.setMessage("CustomMetaData Created SuccessFully."); } @@ -611,6 +614,7 @@ public Result deleteCustomMetaDataField(String id) { respBody = response.body().string(); System.out.println("respBody:====> " + respBody); result.setSuccessful(true); + result.setRaw(respBody); result.setMessage("CustomMetaDataField deleted successfully!"); } else if (response.code()==500) { @@ -653,7 +657,7 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom result = new Gson().fromJson(responseBody, Result.class); if (response.code()==200){ result.setSuccessful(true); - result.getResponseMetaData().setRaw(respBody); + result.setRaw(respBody); if (result.getMessage() == null) { result.setMessage("CustomMetaData Edited SuccessFully."); } @@ -666,4 +670,112 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom } return result; } + + public Result copyFolder(CopyFolderRequest copyFolderRequest) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFolderRequest)); + + request=new Request.Builder() + .url("https://api.imagekit.io/v1/bulkJobs/moveFolder") + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + result.setMessage(response.message().equals("") ? "Copy Folder successFully" : response.message()); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result moveFolder(MoveFolderRequest moveFolderRequest) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFolderRequest)); + + request=new Request.Builder() + .url("https://api.imagekit.io/v1/bulkJobs/moveFolder") + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + result.setMessage(response.message().equals("") ? "Move Folder successFully" : response.message()); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result getBulkJobStatus(String jobId) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + String url=String.format(Locale.US,"https://api.imagekit.io/v1/bulkJobs/%s", jobId); + + request=new Request.Builder() + .url(url) + .get() + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + result.setMessage(response.message().equals("") ? "Fetched bulk Job status successFully" : response.message()); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 1fd37ba..e516b1c 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -1,17 +1,17 @@ package io.imagekit.sampleapp; -import com.google.gson.JsonObject; - import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CopyFolderRequest; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.MoveFolderRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; @@ -32,7 +32,10 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); - uploadFromBytes(); +// uploadFromBytes(); +// getBulkJobStatus(); + copyFolder(); +// moveFolder(); // addTags(); // removeTags(); // createCustomMetaDataFields(); @@ -462,4 +465,41 @@ private static void updateCustomMetaDataFields() { System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } + + private static void copyFolder() { + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/Gallery/sub_folder"); + copyFolderRequest.setDestinationPath("/"); + Result result = ImageKit.getInstance().copyFolder(copyFolderRequest); + System.out.println(">> Copy folder done."); + System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void moveFolder() { + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/test"); + moveFolderRequest.setDestinationPath("/Gallery"); + Result result = ImageKit.getInstance().moveFolder(moveFolderRequest); + System.out.println(">>Move folder done."); + System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void getBulkJobStatus() { + String jobId = "629758a291fa57aff773d2c9"; + Result result = ImageKit.getInstance().getBulkJobStatus(jobId); + System.out.println(">> Fetch Bulk job status done."); + System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } } From 6767813de75124b40ebbfefa7103c1a109526d6e Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 3 Jun 2022 13:14:37 +0530 Subject: [PATCH 040/112] added more APIs which was pending --- .../main/java/io/imagekit/sdk/ImageKit.java | 72 +++++ .../imagekit/sdk/models/CopyFileRequest.java | 40 +++ .../sdk/models/CopyFolderRequest.java | 2 +- .../sdk/models/CreateFolderRequest.java | 30 ++ .../sdk/models/DeleteFileVersionRequest.java | 30 ++ .../sdk/models/DeleteFolderRequest.java | 20 ++ .../imagekit/sdk/models/MoveFileRequest.java | 30 ++ .../sdk/models/MoveFolderRequest.java | 2 +- .../sdk/models/RenameFileRequest.java | 40 +++ .../io/imagekit/sdk/tasks/RestClient.java | 306 ++++++++++++++++++ src/main/java/io/imagekit/sampleapp/App.java | 119 ++++++- 11 files changed, 688 insertions(+), 3 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index c747efa..f3a5731 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -251,6 +251,60 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } + /** + * + * @param deleteFileVersionRequest class + * @return Result class + */ + public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { + return restClient.deleteFileVersion(deleteFileVersionRequest); + } + + /** + * + * @param copyFileRequest class + * @return Result class + */ + public Result copyFile(CopyFileRequest copyFileRequest) { + return restClient.copyFile(copyFileRequest); + } + + /** + * + * @param moveFileRequest class + * @return Result class + */ + public Result moveFile(MoveFileRequest moveFileRequest) { + return restClient.moveFile(moveFileRequest); + } + + /** + * + * @param renameFileRequest class + * @return Result class + */ + public Result renameFile(RenameFileRequest renameFileRequest) { + return restClient.renameFile(renameFileRequest); + } + + /** + * + * @param createFolderRequest which contains folderPath that is full path to the folder you want to delete + * @return Result class + */ + public Result createFolder(CreateFolderRequest createFolderRequest) { + return restClient.createFolder(createFolderRequest); + } + + /** + * + * @param deleteFolderRequest which contains folderPath that is full path to the folder you want to delete + * @return Result class + */ + public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { + return restClient.deleteFolder(deleteFolderRequest); + } + /** * * @param copyFolderRequest that contains sourceFolderPath, destinationPath, includeVersions @@ -277,4 +331,22 @@ public Result moveFolder(MoveFolderRequest moveFolderRequest) { public Result getBulkJobStatus(String jobId) { return restClient.getBulkJobStatus(jobId); } + + /** + * + * @param fileId + * @return a Result class + */ + public Result getFileVersions(String fileId) { + return restClient.getFileVersions(fileId); + } + + /** + * + * @param fileId & versionId + * @return a Result class + */ + public Result getFileVersionDetails(String fileId, String versionId) { + return restClient.getFileVersionDetails(fileId, versionId); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java new file mode 100644 index 0000000..fde1de5 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java @@ -0,0 +1,40 @@ +package io.imagekit.sdk.models; + +public class CopyFileRequest { + public String sourceFilePath; + public String destinationPath; + public Boolean includeVersions; + + public String getSourceFilePath() { + return sourceFilePath; + } + + public void setSourceFilePath(String sourceFilePath) { + this.sourceFilePath = sourceFilePath; + } + + public String getDestinationPath() { + return destinationPath; + } + + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } + + public Boolean getIncludeVersions() { + return includeVersions; + } + + public void setIncludeVersions(Boolean includeVersions) { + this.includeVersions = includeVersions; + } + + @Override + public String toString() { + return "CopyFileRequest{" + + "sourceFilePath=" + sourceFilePath + + ", destinationPath=" + destinationPath + + ", includeVersions=" + includeVersions + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java index 5e96ec8..21b7406 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java @@ -31,7 +31,7 @@ public void setIncludeVersions(Boolean includeVersions) { @Override public String toString() { - return "TagsRequest{" + + return "CopyFolderRequest{" + "sourceFolderPath=" + sourceFolderPath + ", destinationPath=" + destinationPath + ", includeVersions=" + includeVersions + diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java new file mode 100644 index 0000000..ec3b915 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java @@ -0,0 +1,30 @@ +package io.imagekit.sdk.models; + +public class CreateFolderRequest { + public String folderName; + public String parentFolderPath; + + public String getFolderName() { + return folderName; + } + + public void setFolderName(String folderName) { + this.folderName = folderName; + } + + public String getParentFolderPath() { + return parentFolderPath; + } + + public void setParentFolderPath(String parentFolderPath) { + this.parentFolderPath = parentFolderPath; + } + + @Override + public String toString() { + return "DeleteFolderRequest{" + + "folderName=" + folderName + + "parentFolderPath=" + parentFolderPath + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java new file mode 100644 index 0000000..b6dfd08 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java @@ -0,0 +1,30 @@ +package io.imagekit.sdk.models; + +public class DeleteFileVersionRequest { + public String fileId; + public String versionId; + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getVersionId() { + return versionId; + } + + public void setVersionId(String versionId) { + this.versionId = versionId; + } + + @Override + public String toString() { + return "DeleteFileVersionRequest{" + + "fileId='" + fileId + '\'' + + ", versionId='" + versionId + '\'' + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java new file mode 100644 index 0000000..d98c112 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java @@ -0,0 +1,20 @@ +package io.imagekit.sdk.models; + +public class DeleteFolderRequest { + public String folderPath; + + public String getFolderPath() { + return folderPath; + } + + public void setFolderPath(String folderPath) { + this.folderPath = folderPath; + } + + @Override + public String toString() { + return "DeleteFolderRequest{" + + "folderPath=" + folderPath + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java new file mode 100644 index 0000000..1bc9e3e --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java @@ -0,0 +1,30 @@ +package io.imagekit.sdk.models; + +public class MoveFileRequest { + public String sourceFilePath; + public String destinationPath; + + public String getSourceFilePath() { + return sourceFilePath; + } + + public void setSourceFilePath(String sourceFilePath) { + this.sourceFilePath = sourceFilePath; + } + + public String getDestinationPath() { + return destinationPath; + } + + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } + + @Override + public String toString() { + return "MoveFileRequest{" + + "sourceFilePath=" + sourceFilePath + + ", destinationPath=" + destinationPath + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java index 11f6afc..880063c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java @@ -22,7 +22,7 @@ public void setDestinationPath(String destinationPath) { @Override public String toString() { - return "TagsRequest{" + + return "MoveFolderRequest{" + "sourceFolderPath=" + sourceFolderPath + ", destinationPath=" + destinationPath + '}'; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java new file mode 100644 index 0000000..0b64c1d --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java @@ -0,0 +1,40 @@ +package io.imagekit.sdk.models; + +public class RenameFileRequest { + public String filePath; + public String newFileName; + public Boolean purgeCache; + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getNewFileName() { + return newFileName; + } + + public void setNewFileName(String newFileName) { + this.newFileName = newFileName; + } + + public Boolean getPurgeCache() { + return purgeCache; + } + + public void setPurgeCache(Boolean purgeCache) { + this.purgeCache = purgeCache; + } + + @Override + public String toString() { + return "RenameFileRequest{" + + "filePath=" + filePath + + ", newFileName=" + newFileName + + ", purgeCache=" + purgeCache + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 9d5a141..c66e7e1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -6,13 +6,19 @@ import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CopyFileRequest; import io.imagekit.sdk.models.CopyFolderRequest; +import io.imagekit.sdk.models.CreateFolderRequest; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; +import io.imagekit.sdk.models.DeleteFileVersionRequest; +import io.imagekit.sdk.models.DeleteFolderRequest; import io.imagekit.sdk.models.FileCreateRequest; +import io.imagekit.sdk.models.MoveFileRequest; import io.imagekit.sdk.models.MoveFolderRequest; import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.RenameFileRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; @@ -671,6 +677,226 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom return result; } + public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/versions/%s", deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); + System.out.println("url:=> " + url); + request=new Request.Builder() + .url(url) + .delete() + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("response:=> " + response); + String respBody=""; + if (response.code()==204){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + if (result.getMessage() == null) { + result.setMessage("File Copied SuccessFully."); + } + } else { + String resp=response.body().string(); + result.setSuccessful(false); + result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result copyFile(CopyFileRequest copyFileRequest) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFileRequest)); + request=new Request.Builder() + .url("https://api.imagekit.io/v1/files/copy") + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==204){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + if (result.getMessage() == null) { + result.setMessage("File Copied SuccessFully."); + } + } else { + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result moveFile(MoveFileRequest moveFileRequest) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFileRequest)); + request=new Request.Builder() + .url("https://api.imagekit.io/v1/files/move") + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==204){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + if (result.getMessage() == null) { + result.setMessage("File Moved SuccessFully."); + } + } else { + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result renameFile(RenameFileRequest renameFileRequest) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(renameFileRequest)); + request=new Request.Builder() + .url("https://api.imagekit.io/v1/files/rename") + .put(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("response:==> "+ response); + String respBody=response.body().string(); + if (response.code()==200){ + result.setSuccessful(true); + result.setRaw(respBody); + if (result.getMessage() == null) { + result.setMessage("File Renamed SuccessFully."); + } + } else { + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result createFolder(CreateFolderRequest createFolderRequest) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(createFolderRequest)); + request=new Request.Builder() + .url("https://api.imagekit.io/v1/folder/") + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==201){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + if (result.getMessage() == null) { + result.setMessage("Folder Created SuccessFully."); + } + } else { + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { + Result result = new Result(); + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(deleteFolderRequest)); + System.out.println("requestBody:==> " + new Gson().toJson(deleteFolderRequest)); + request=new Request.Builder() + .url("https://api.imagekit.io/v1/folder/") + .delete(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody=""; + if (response.code()==204){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + result.setMessage(response.message().equals("") ? "Delete Folder successFully" : response.message()); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + public Result copyFolder(CopyFolderRequest copyFolderRequest) { Result result = new Result(); @@ -778,4 +1004,84 @@ public Result getBulkJobStatus(String jobId) { } return result; } + + public Result getFileVersions(String fileId) { + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/versions", fileId); + + request=new Request.Builder() + .url(url) + .get() + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("response:==> " + response); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + result.setMessage(response.message().equals("") ? "Fetched File versions successFully" : response.message()); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result getFileVersionDetails(String fileId, String versionId) { + if (fileId == null) { + throw new RuntimeException("Error: FileId not provided."); + } + if (versionId == null) { + throw new RuntimeException("Error: versionId not provided."); + } + Result result = new Result(); + + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/versions/%s", fileId, versionId); + + request=new Request.Builder() + .url(url) + .get() + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("response:==> " + response); + String respBody=""; + if (response.code()==200){ + respBody=response.body().string(); + result.setSuccessful(true); + result.setRaw(respBody); + result.setMessage(response.message().equals("") ? "Fetched file version details successFully" : response.message()); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index e516b1c..b123caa 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -4,14 +4,20 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CopyFileRequest; import io.imagekit.sdk.models.CopyFolderRequest; +import io.imagekit.sdk.models.CreateFolderRequest; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; +import io.imagekit.sdk.models.DeleteFileVersionRequest; +import io.imagekit.sdk.models.DeleteFolderRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.MoveFileRequest; import io.imagekit.sdk.models.MoveFolderRequest; +import io.imagekit.sdk.models.RenameFileRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; @@ -34,7 +40,15 @@ public static void main(String[] args) throws Exception{ // uploadFromBase64(); // uploadFromBytes(); // getBulkJobStatus(); - copyFolder(); +// deleteFileVersion(); +// getFileVersions(); + getFileVersionDetails(); +// copyFile(); +// moveFile(); +// renameFile(); +// createFolder(); +// deleteFolder(); +// copyFolder(); // moveFolder(); // addTags(); // removeTags(); @@ -466,6 +480,86 @@ private static void updateCustomMetaDataFields() { System.out.println("\n\n"); } + private static void deleteFileVersion() { + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("6299ae01f8b34e6009e32ef3"); + deleteFileVersionRequest.setVersionId("6299ae01f8b34e6009e32ef3"); + Result result = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); + System.out.println(">> Copy file done."); + System.out.println(Color.ANSI_GREEN+">> Response Copy File :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void copyFile() { + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/sample_imag1.jpg"); + copyFileRequest.setDestinationPath("/New_Folder/"); + copyFileRequest.setIncludeVersions(true); + Result result = ImageKit.getInstance().copyFile(copyFileRequest); + System.out.println(">> Copy file done."); + System.out.println(Color.ANSI_GREEN+">> Response Copy File :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void moveFile() { + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/sample_imag1.jpg"); + moveFileRequest.setDestinationPath("/New_Folder/"); + Result result = ImageKit.getInstance().moveFile(moveFileRequest); + System.out.println(">> Move File done."); + System.out.println(Color.ANSI_GREEN+">> Response Move File :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void renameFile() { + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/sample_image.jpg"); + renameFileRequest.setNewFileName("sample_image1.jpg"); + renameFileRequest.setPurgeCache(true); + Result result = ImageKit.getInstance().renameFile(renameFileRequest); + System.out.println(">> Rename file done."); + System.out.println(Color.ANSI_GREEN+">> Response Rename File :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void createFolder() { + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("test1"); + createFolderRequest.setParentFolderPath("/New_Folder"); + Result result = ImageKit.getInstance().createFolder(createFolderRequest); + System.out.println(">> Create folder done."); + System.out.println(Color.ANSI_GREEN+">> Response Create Folder :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void deleteFolder() { + String folderPath="/New_Folder"; + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath(folderPath); + Result result = ImageKit.getInstance().deleteFolder(deleteFolderRequest); + System.out.println(">> Delete folder done."); + System.out.println(Color.ANSI_GREEN+">> Response Delete Folder :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + private static void copyFolder() { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/Gallery/sub_folder"); @@ -502,4 +596,27 @@ private static void getBulkJobStatus() { System.out.println(result.getResponseMetaData().getMap()); System.out.println("\n\n"); } + + private static void getFileVersions() { + String fileId = "6299ae01f8b34e6009e32ef3"; + Result result = ImageKit.getInstance().getFileVersions(fileId); + System.out.println(">> Fetch Get file versions done."); + System.out.println(Color.ANSI_GREEN+">> Response Get file versions :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getList()); + System.out.println("\n\n"); + } + + private static void getFileVersionDetails() { + String fileId = "6299ae01f8b34e6009e32ef3"; + String versionId = "6299ae01f8b34e6009e32ef3"; + Result result = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); + System.out.println(">> Fetch Get file versions details done."); + System.out.println(Color.ANSI_GREEN+">> Response Get file versions details :"+Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } } From 1cfb45ddfea2afa6da78cdf0c6d90fbaac65e585 Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 4 Jun 2022 11:10:45 +0530 Subject: [PATCH 041/112] added API of AITags --- .../main/java/io/imagekit/sdk/ImageKit.java | 9 ++++ .../io/imagekit/sdk/models/AITagsRequest.java | 32 ++++++++++++++ .../io/imagekit/sdk/tasks/RestClient.java | 43 ++++++++++++++++--- src/main/java/io/imagekit/sampleapp/App.java | 21 ++++++++- 4 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index f3a5731..c8a17c3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -207,6 +207,15 @@ public Result addTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "addTags"); } + /** + * + * @param aiTagsRequest is a object which contains fileIds and tags as a parameters + * @return ArrayList of String + */ + public Result removeAITags(AITagsRequest aiTagsRequest){ + return restClient.removeAITags(aiTagsRequest); + } + /** * * @param tagsRequest is a object which contains fileIds and tags as a parameters diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java new file mode 100644 index 0000000..0eae547 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java @@ -0,0 +1,32 @@ +package io.imagekit.sdk.models; + +import java.util.List; + +public class AITagsRequest { + public List fileIds; + public List AITags; + + public List getFileIds() { + return fileIds; + } + + public void setFileIds(List fileIds) { + this.fileIds = fileIds; + } + + public List getAITags() { + return AITags; + } + + public void setAITags(List AITags) { + this.AITags = AITags; + } + + @Override + public String toString() { + return "AITagsRequest{" + + "fileIds=" + fileIds + + ", AITags=" + AITags + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index c66e7e1..9462de8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -5,6 +5,7 @@ import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; import io.imagekit.sdk.models.CopyFolderRequest; @@ -519,6 +520,42 @@ public Result manageTags(TagsRequest tagsRequest, String action) { return result; } + public Result removeAITags(AITagsRequest aiTagsRequest) { + Result result = new Result(); + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(aiTagsRequest)); + request=new Request.Builder() + .url("https://api.imagekit.io/v1/files/removeAITags") + .post(requestBody) + .headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + + String respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + if (response.code() == 200) { + result.setSuccessful(true); + result.setRaw(respBody); + result.setMessage("Removed AITags SuccessFully."); + } else { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + public Result getCustomMetaDataFields() { Result result = new Result(); @@ -614,11 +651,9 @@ public Result deleteCustomMetaDataField(String id) { try { Response response = client.newCall(request).execute(); - System.out.println("response:===> " + response); String respBody=""; if (response.code()==204){ respBody = response.body().string(); - System.out.println("respBody:====> " + respBody); result.setSuccessful(true); result.setRaw(respBody); result.setMessage("CustomMetaDataField deleted successfully!"); @@ -696,7 +731,6 @@ public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionReques try { Response response = client.newCall(request).execute(); - System.out.println("response:=> " + response); String respBody=""; if (response.code()==204){ respBody=response.body().string(); @@ -808,7 +842,6 @@ public Result renameFile(RenameFileRequest renameFileRequest) { try { Response response = client.newCall(request).execute(); - System.out.println("response:==> "+ response); String respBody=response.body().string(); if (response.code()==200){ result.setSuccessful(true); @@ -1024,7 +1057,6 @@ public Result getFileVersions(String fileId) { try { Response response = client.newCall(request).execute(); - System.out.println("response:==> " + response); String respBody=""; if (response.code()==200){ respBody=response.body().string(); @@ -1067,7 +1099,6 @@ public Result getFileVersionDetails(String fileId, String versionId) { try { Response response = client.newCall(request).execute(); - System.out.println("response:==> " + response); String respBody=""; if (response.code()==200){ respBody=response.body().string(); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index b123caa..4d3219f 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -3,6 +3,7 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; import io.imagekit.sdk.models.CopyFolderRequest; @@ -42,7 +43,7 @@ public static void main(String[] args) throws Exception{ // getBulkJobStatus(); // deleteFileVersion(); // getFileVersions(); - getFileVersionDetails(); +// getFileVersionDetails(); // copyFile(); // moveFile(); // renameFile(); @@ -52,6 +53,7 @@ public static void main(String[] args) throws Exception{ // moveFolder(); // addTags(); // removeTags(); + removeAITags(); // createCustomMetaDataFields(); // updateCustomMetaDataFields(); // deleteCustomMetaDataField("62988431cd3d7878e486ccad"); @@ -424,6 +426,23 @@ private static void removeTags() { System.out.println("\n\n"); } + private static void removeAITags() { + List fileIds = new ArrayList<>(); + fileIds.add("6299fe884af1071996cc62eb"); + List aiTags = new ArrayList<>(); + aiTags.add("Female"); + AITagsRequest aiTagsRequest =new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + Result result = ImageKit.getInstance().removeAITags(aiTagsRequest); + System.out.println(">> remove Tags done."); + System.out.println(Color.ANSI_GREEN+">> Response remove aiTags:"+Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println(result); + System.out.println("\n\n"); + } + private static void getCustomMetaDataFields() { Result result = ImageKit.getInstance().getCustomMetaDataFields(); System.out.println(">> Fetch CustomMetaDataFields done."); From 7c3fe62daade21c1bed24687e0c0ae01d074e997 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 6 Jun 2022 18:53:48 +0530 Subject: [PATCH 042/112] added tests changes for add tags --- .../java/io/imagekit/sdk/ImageKitTest.java | 30 +++++++++++-------- src/main/java/io/imagekit/sampleapp/App.java | 12 ++++---- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 0a6a186..9200aa5 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -13,10 +13,15 @@ import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.utils.Utils; +import okhttp3.HttpUrl; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; import org.junit.Before; import org.junit.Test; +import java.io.IOException; import java.util.*; import java.util.regex.Pattern; @@ -34,7 +39,7 @@ public class ImageKitTest { public void setUp() throws Exception { SUT=ImageKit.getInstance(); SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - restClient =mock(RestClient.class); + restClient = new RestClient(SUT); SUT.setRestClient(restClient); } @@ -631,7 +636,8 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { } @Test - public void add_tags_expectedSuccessWith() { + public void add_tags_expectedSuccessWith() throws IOException, InterruptedException { + List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); List tags = new ArrayList<>(); @@ -640,16 +646,16 @@ public void add_tags_expectedSuccessWith() { TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - Result mockResult=new Result(); - mockResult.setSuccessful(true); - mockResult.setMessage("Added Tags SuccessFully."); - mockResult.getResponseMetaData().setHttpStatusCode(200); - when(restClient.manageTags(tagsRequest, "addTags")).thenReturn(mockResult); - - Result result = SUT.addTags(tagsRequest); - assertTrue(result.isSuccessful()); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); - assertEquals(mockResult.getMessage(), "Added Tags SuccessFully."); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.addTags(tagsRequest); + RecordedRequest request1 = server.takeRequest(); + assertEquals("application/json; charset=utf-8", request1.getHeader("Content-Type")); } @Test diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 4d3219f..e944ce9 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -41,7 +41,7 @@ public static void main(String[] args) throws Exception{ // uploadFromBase64(); // uploadFromBytes(); // getBulkJobStatus(); -// deleteFileVersion(); + deleteFileVersion(); // getFileVersions(); // getFileVersionDetails(); // copyFile(); @@ -53,7 +53,7 @@ public static void main(String[] args) throws Exception{ // moveFolder(); // addTags(); // removeTags(); - removeAITags(); +// removeAITags(); // createCustomMetaDataFields(); // updateCustomMetaDataFields(); // deleteCustomMetaDataField("62988431cd3d7878e486ccad"); @@ -501,11 +501,11 @@ private static void updateCustomMetaDataFields() { private static void deleteFileVersion() { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("6299ae01f8b34e6009e32ef3"); - deleteFileVersionRequest.setVersionId("6299ae01f8b34e6009e32ef3"); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); Result result = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); - System.out.println(">> Copy file done."); - System.out.println(Color.ANSI_GREEN+">> Response Copy File :"+Color.ANSI_RESET); + System.out.println(">> delete file version done."); + System.out.println(Color.ANSI_GREEN+">> Response delete File version :"+Color.ANSI_RESET); System.out.println(result); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(result.getResponseMetaData().getMap()); From 4a403d0a1037213d477a1c4129c2f6832f21244e Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 7 Jun 2022 11:25:39 +0530 Subject: [PATCH 043/112] add tags test assert --- .../src/test/java/io/imagekit/sdk/ImageKitTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 9200aa5..f75519a 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -30,6 +30,8 @@ import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; +import com.google.gson.Gson; + public class ImageKitTest { private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern.compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)"); @@ -654,8 +656,14 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept config.setUrlEndpoint(String.valueOf(baseUrl)); SUT.setConfig(config); SUT.addTags(tagsRequest); - RecordedRequest request1 = server.takeRequest(); - assertEquals("application/json; charset=utf-8", request1.getHeader("Content-Type")); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = new Gson().toJson(tagsRequest); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); } @Test From 958799142315dd6afcfd77a27875d153dc8a0531 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 7 Jun 2022 14:06:26 +0530 Subject: [PATCH 044/112] minor fix in addTags test --- imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index f75519a..f24292b 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -658,7 +658,7 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept SUT.addTags(tagsRequest); RecordedRequest request = server.takeRequest(); - String tagsRequestJson = new Gson().toJson(tagsRequest); + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(tagsRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); From f4f6a375a3b83e653442ac0f73c45d00d3a0270e Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 7 Jun 2022 18:36:08 +0530 Subject: [PATCH 045/112] added test for pending APIs --- .../io/imagekit/sdk/tasks/RestClient.java | 3 - .../java/io/imagekit/sdk/ImageKitTest.java | 567 ++++++++++++++++-- .../io/imagekit/sdk/tasks/RestClientTest.java | 133 +--- 3 files changed, 524 insertions(+), 179 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 9462de8..d236ef5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -663,8 +663,6 @@ else if (response.code()==500) { result.setMessage("Error: Internal server error."); } else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); result.setSuccessful(false); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -904,7 +902,6 @@ public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { headers.put("Authorization",credential); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(deleteFolderRequest)); - System.out.println("requestBody:==> " + new Gson().toJson(deleteFolderRequest)); request=new Request.Builder() .url("https://api.imagekit.io/v1/folder/") .delete(requestBody) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index f24292b..3945399 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -2,13 +2,21 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.constants.Version; +import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; +import io.imagekit.sdk.models.CopyFileRequest; +import io.imagekit.sdk.models.CopyFolderRequest; +import io.imagekit.sdk.models.CreateFolderRequest; import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; +import io.imagekit.sdk.models.DeleteFolderRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.MoveFileRequest; +import io.imagekit.sdk.models.MoveFolderRequest; +import io.imagekit.sdk.models.RenameFileRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.tasks.RestClient; @@ -667,7 +675,8 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept } @Test - public void remove_tags_expectedSuccessWith() { + public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException { + List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); List tags = new ArrayList<>(); @@ -675,41 +684,83 @@ public void remove_tags_expectedSuccessWith() { TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - Result mockResult=new Result(); - mockResult.setSuccessful(true); - mockResult.setMessage("Removed Tags SuccessFully."); - mockResult.getResponseMetaData().setHttpStatusCode(200); - when(restClient.manageTags(tagsRequest, "removeTags")).thenReturn(mockResult); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.removeTags(tagsRequest); + RecordedRequest request = server.takeRequest(); - Result result = SUT.removeTags(tagsRequest); - assertTrue(result.isSuccessful()); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); - assertEquals(mockResult.getMessage(), "Removed Tags SuccessFully."); + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); } @Test - public void get_custom_metadata_fields_expectedSuccessWith() { - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - mockCustomMetaDataFieldSchemaObject.setDefaultValue("defaultValue"); - mockCustomMetaDataFieldSchemaObject.setMinLength(10); - mockCustomMetaDataFieldSchemaObject.setMaxLength(10); - - Result mockResult=new Result(); - mockResult.setSuccessful(true); - mockResult.setMessage("Fetched CustomMetaData SuccessFully."); - mockResult.getResponseMetaData().setHttpStatusCode(200); + public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException { - when(restClient.getCustomMetaDataFields()).thenReturn(mockResult); - - Result result = SUT.getCustomMetaDataFields(); - assertTrue(result.isSuccessful()); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); - assertEquals(mockResult.getMessage(), "Fetched CustomMetaData SuccessFully."); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + + " {\n" + + " \"id\": \"6291f00890ba008cc27f64d1\",\n" + + " \"name\": \"price\",\n" + + " \"label\": \"Amount\",\n" + + " \"schema\": {\n" + + " \"minValue\": 10,\n" + + " \"maxValue\": 200,\n" + + " \"type\": \"Number\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"id\": \"6296f91191fa57ccc36b15cf\",\n" + + " \"name\": \"Amount2\",\n" + + " \"label\": \"Amouunt\",\n" + + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + + " \"minValue\": 10,\n" + + " \"maxValue\": 1000\n" + + " }\n" + + " }\n" + + "]")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.getCustomMetaDataFields(); + RecordedRequest request = server.takeRequest(); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); } @Test - public void createCustomMetaDataFields_successExpected() { + public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" + + " \"name\": \"test1\",\n" + + " \"label\": \"test1\",\n" + + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + + " \"isValueRequired\": false,\n" + + " \"minValue\": 10,\n" + + " \"maxValue\": 1000\n" + + " }\n" + + "}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); mockCustomMetaDataFieldSchemaObject.setMinValue(10); @@ -720,53 +771,455 @@ public void createCustomMetaDataFields_successExpected() { customMetaDataFieldCreateRequest.setLabel("mockLabel"); customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - Result mockResult = new Result(); - mockResult.setSuccessful(true); - mockResult.setMessage("CustomMetaData created..."); - mockResult.getResponseMetaData().setHttpStatusCode(200); - - when(restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest)).thenReturn(mockResult); + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); - Result result=SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - assertThat(result.isSuccessful(),is(mockResult.isSuccessful())); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResult.getResponseMetaData().getHttpStatusCode()); - assertEquals(result.getMessage(), mockResult.getMessage()); + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); } @Test - public void deleteCustomMetaDataField_successExpected() { - Result mockResult=new Result(); - mockResult.setSuccessful(true); - mockResult.getResponseMetaData().setHttpStatusCode(204); - when(restClient.deleteCustomMetaDataField(any(String.class))).thenReturn(mockResult); + public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + + SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); + RecordedRequest request = server.takeRequest(); - Result result=SUT.deleteCustomMetaDataField("id"); - assertThat(result.isSuccessful(),is(mockResult.isSuccessful())); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 204); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl.toString().concat("629f2e2f7eb0fe2eb25f9988"), request.getRequestUrl().toString()); } @Test - public void updateCustomMetaDataFields_successExpected() { + public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"id\": \"6296fd7091fa5768106b808d\",\n" + + " \"name\": \"Amount3\",\n" + + " \"label\": \"testPrices\",\n" + + " \"schema\": {\n" + + " \"minValue\": 0,\n" + + " \"maxValue\": 10,\n" + + " \"type\": \"Number\"\n" + + " }\n" + + "}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); mockCustomMetaDataFieldSchemaObject.setMinValue(10); mockCustomMetaDataFieldSchemaObject.setMaxValue(100); CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808d"); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - Result mockResult = new Result(); - mockResult.setSuccessful(true); - mockResult.setMessage("CustomMetaData updated..."); - mockResult.getResponseMetaData().setHttpStatusCode(200); + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PATCH /628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl.toString().concat("628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); + } + + @Test + public void removeAITags_successExpected() throws InterruptedException, IOException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.removeAITags(aiTagsRequest); + RecordedRequest request = server.takeRequest(); + + String aiTagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"AITags\":[\"Font\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(aiTagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); + } + + @Test + public void copyFile_successExpected() throws InterruptedException, IOException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/car_false.jpeg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.copyFile(copyFileRequest); + RecordedRequest request = server.takeRequest(); + + String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); + } + + @Test + public void moveFile_successExpected() throws InterruptedException, IOException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/new_la.jpg"); + moveFileRequest.setDestinationPath("test"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.moveFile(moveFileRequest); + RecordedRequest request = server.takeRequest(); + + String moveFileRequestJson = "{\"sourceFilePath\":\"/new_la.jpg\",\"destinationPath\":\"test\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); + } + + @Test + public void renameFile_successExpected() throws InterruptedException, IOException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/car_false.jpeg"); + renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.renameFile(renameFileRequest); + RecordedRequest request = server.takeRequest(); + + String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(renameFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); + } + + @Test + public void createFolder_successExpected() throws InterruptedException, IOException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.createFolder(createFolderRequest); + RecordedRequest request = server.takeRequest(); + + String createFolderRequestJson = "{\"folderName\":\"testFolder\",\"parentFolderPath\":\"/\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(createFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); + } + + @Test + public void deleteFolder_successExpected() throws InterruptedException, IOException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.deleteFolder(deleteFolderRequest); + RecordedRequest request = server.takeRequest(); + + String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(deleteFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("DELETE / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); + } + + @Test + public void copyFolder_successExpected() throws InterruptedException, IOException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/Gallery"); + copyFolderRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + + "}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.copyFolder(copyFolderRequest); + RecordedRequest request = server.takeRequest(); - when(restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest)).thenReturn(mockResult); + String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); + } + + @Test + public void moveFolder_successExpected() throws InterruptedException, IOException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + + "}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.moveFolder(moveFolderRequest); + RecordedRequest request = server.takeRequest(); - Result result=SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - assertThat(result.isSuccessful(),is(mockResult.isSuccessful())); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), mockResult.getResponseMetaData().getHttpStatusCode()); - assertEquals(result.getMessage(), mockResult.getMessage()); + String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST / HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl, request.getRequestUrl()); } + + @Test + public void getBulkJobStatus_successExpected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" + + " \"type\": \"MOVE_FOLDER\",\n" + + " \"status\": \"Completed\"\n" + + "}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl.toString().concat("629f44ac7eb0fe8173622d4b"), request.getRequestUrl().toString()); + } + + @Test + public void getFileVersions_successExpected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + + " {\n" + + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + + " \"tags\": [\n" + + " \"tag10\"\n" + + " ],\n" + + " \"AITags\": [\n" + + " {\n" + + " \"name\": \"Colorfulness\",\n" + + " \"confidence\": 96.19,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Purple\",\n" + + " \"confidence\": 86.05,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Violet\",\n" + + " \"confidence\": 81.08,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Rectangle\",\n" + + " \"confidence\": 80.99,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + + " ],\n" + + " \"versionInfo\": {\n" + + " \"id\": \"629f3de17eb0fe4053615450\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + + " \"ImageWidth\": 1006,\n" + + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + + " },\n" + + " \"customCoordinates\": null,\n" + + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + + " \"filePath\": \"/w2_image.png\",\n" + + " \"height\": 467,\n" + + " \"width\": 1006,\n" + + " \"size\": 47579,\n" + + " \"hasAlpha\": true,\n" + + " \"mime\": \"image/png\"\n" + + " }\n" + + "]")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.getFileVersions("629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl.toString().concat("629f3de17eb0fe4053615450/versions"), request.getRequestUrl().toString()); + } + + @Test + public void getFileVersionDetails_successExpected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + + " \"tags\": [\n" + + " \"tag10\"\n" + + " ],\n" + + " \"AITags\": [\n" + + " {\n" + + " \"name\": \"Colorfulness\",\n" + + " \"confidence\": 96.19,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Purple\",\n" + + " \"confidence\": 86.05,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Violet\",\n" + + " \"confidence\": 81.08,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Rectangle\",\n" + + " \"confidence\": 80.99,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + + " ],\n" + + " \"versionInfo\": {\n" + + " \"id\": \"629f3de17eb0fe4053615450\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + + " \"ImageWidth\": 1006,\n" + + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + + " },\n" + + " \"customCoordinates\": null,\n" + + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + + " \"filePath\": \"/w2_image.png\",\n" + + " \"height\": 467,\n" + + " \"width\": 1006,\n" + + " \"size\": 47579,\n" + + " \"hasAlpha\": true,\n" + + " \"mime\": \"image/png\"\n" + + "}")); + server.start(); + HttpUrl baseUrl = server.url("/"); + Configuration config = SUT.getConfig(); + config.setUrlEndpoint(String.valueOf(baseUrl)); + SUT.setConfig(config); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", request.getRequestLine()); + assertEquals(baseUrl.toString().concat("629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), request.getRequestUrl().toString()); + } + + + } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index 79138a0..4d7afff 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -1,17 +1,18 @@ package io.imagekit.sdk.tasks; +import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.imagekit.sdk.ImageKit; -import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; -import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; -import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; import okhttp3.*; - +import okhttp3.mockwebserver.Dispatcher; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -22,6 +23,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; @@ -52,10 +55,6 @@ public void valid_upload_expectSuccess() { FileCreateRequest fileCreateRequest=new FileCreateRequest("f06830ca9f1e3e90","demo.jpg"); fileCreateRequest.setPrivateFile(true); - fileCreateRequest.setOverwriteFile(true); - fileCreateRequest.setOverwriteAITags(true); - fileCreateRequest.setOverwriteTags(true); - fileCreateRequest.setOverwriteCustomMetadata(true); Result result = SUT.upload(fileCreateRequest); assertEquals(fileCreateRequest,ac.getValue()); } @@ -165,7 +164,7 @@ public void valid_upload_with_network_issue_expectException() { FileCreateRequest fileCreateRequest=new FileCreateRequest("f06830ca9f1e3e90","demo.jpg"); clientStub.setTimeoutException(); Result result = SUT.upload(fileCreateRequest); - assertEquals(resp,result.getResponseMetaData().getRaw()); + assertEquals(resp,result.getRaw()); } @Test @@ -269,7 +268,7 @@ public void valid_getFileList_expectSuccess() { assertEquals("https://api.imagekit.io/v1/files?limit=10&skip=0",SUT.request.url().toString()); - assertThat(resp,is(result.getResponseMetaData().getRaw())); + assertThat(resp,is(result.getRaw())); } @Test @@ -324,7 +323,7 @@ public void getFileDetails_valid_request_expect_success() { // Asserting endpoint sending to server assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/details",SUT.request.url().toString()); // Asserting mock response getting from server. - assertThat(resp, is(result.getResponseMetaData().getRaw())); + assertThat(resp, is(result.getRaw())); } @Test @@ -369,7 +368,7 @@ public void getFileMetaData_valid_request_expect_success() { SUT.setClient(clientStub); ResultMetaData result = SUT.getFileMetaData("598821f949c0a938d57563bd"); assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/metadata",SUT.request.url().toString()); - assertThat(resp, is(result.getResponseMetaData().getRaw())); + assertThat(resp, is(result.getRaw())); } @Test @@ -415,7 +414,7 @@ public void getRemoteFileMetaData_valid_request_expect_success() { ResultMetaData result = SUT.getRemoteFileMetaData("http://remote_url.example.com/demo.png"); assertEquals("https://api.imagekit.io/v1/metadata?url=http://remote_url.example.com/demo.png",SUT.request.url().toString()); - assertThat(resp, is(result.getResponseMetaData().getRaw())); + assertThat(resp, is(result.getRaw())); } @Test @@ -495,7 +494,7 @@ public void bulkDeleteFiles_valid_request_expect_success() { SUT.setClient(clientStub); ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); assertThat("File deleted successfully!", is(result.getMessage())); - assertThat(resp,is(result.getResponseMetaData().getRaw())); + assertThat(resp,is(result.getRaw())); } @Test @@ -518,7 +517,7 @@ public void bulkDeleteFiles_file_id_not_found() { SUT.setClient(clientStub); ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); assertThat("The requested file(s) does not exist.", is(result.getMessage())); - assertThat(resp,is(result.getResponseMetaData().getRaw())); + assertThat(resp,is(result.getRaw())); } @Test @@ -605,110 +604,6 @@ public void getPurgeCacheStatus_un_processable_entity() { assertNotNull(result.getMessage()); } - @Test - public void add_tags() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Tags added SuccessFully"); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(),200, "Tags added SuccessFully"); - SUT.setClient(clientStub); - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); - Result result = SUT.manageTags(new TagsRequest(fileIds, tags), "addTags"); - assertNotNull(result.getMessage()); - assertEquals(result.getMessage(), "Tags added SuccessFully"); - assertTrue(result.isSuccessful()); - } - - @Test - public void remove_tags() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Tags removed SuccessFully"); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(),200, "Tags removed SuccessFully"); - SUT.setClient(clientStub); - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - Result result = SUT.manageTags(new TagsRequest(fileIds, tags), "removeTags"); - assertNotNull(result.getMessage()); - assertEquals(result.getMessage(), "Tags removed SuccessFully"); - assertTrue(result.isSuccessful()); - } - - @Test - public void getCustomMetaDataFields() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Fetched CustomMetaData SuccessFully"); - obj.addProperty("id", "id"); - obj.addProperty("name", "name"); - obj.addProperty("label", "label"); - - JsonArray jsonArray = new JsonArray(); - jsonArray.add(obj); - - OkHttpClientStub clientStub= new OkHttpClientStub(jsonArray.toString(),200, "ok"); - SUT.setClient(clientStub); - Result result = SUT.getCustomMetaDataFields(); - assertNotNull(result.getMessage()); - assertEquals(result.getMessage(), "Fetched CustomMetaData SuccessFully"); - assertTrue(result.isSuccessful()); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); - } - - @Test - public void createCustomMetaDataFields_valid_request_expect_success() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","CustomMetaData created SuccessFully"); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 201, "ok"); - SUT.setClient(clientStub); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - Result result = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - - assertEquals("https://api.imagekit.io/v1/customMetadataFields",SUT.request.url().toString()); - assertEquals("CustomMetaData created SuccessFully", result.getMessage()); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 201); - } - - @Test - public void deleteCustomMetaDataField_valid_request_expect_success() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 204, "Ok"); - SUT.setClient(clientStub); - Result result = SUT.deleteCustomMetaDataField("id"); - - assertEquals("https://api.imagekit.io/v1/customMetadataFields/id",SUT.request.url().toString()); - assertThat("CustomMetaDataField deleted successfully!", is(result.getMessage())); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 204); - } - - @Test - public void updateCustomMetaDataFields_valid_request_expect_success() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","CustomMetaData edited SuccessFully"); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 200, "ok"); - SUT.setClient(clientStub); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("mockId"); - Result result = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - - assertEquals("https://api.imagekit.io/v1/customMetadataFields/mockId",SUT.request.url().toString()); - assertEquals("CustomMetaData edited SuccessFully", result.getMessage()); - assertEquals(result.getResponseMetaData().getHttpStatusCode(), 200); - } - /** * Stub OkHttpClient for fake api call */ From 862f657fc5c41f0b2e102b6091c6f3f7e968188f Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 8 Jun 2022 18:44:53 +0530 Subject: [PATCH 046/112] added test regarding changes and added public url in restClient --- .../io/imagekit/sdk/tasks/RestClient.java | 43 +-- .../java/io/imagekit/sdk/ImageKitTest.java | 259 +++++++++--------- .../io/imagekit/sdk/tasks/RestClientTest.java | 125 --------- src/main/java/io/imagekit/sampleapp/App.java | 54 ++-- 4 files changed, 179 insertions(+), 302 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index d236ef5..a526c12 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -32,6 +32,10 @@ import java.util.Map; public class RestClient { + + public static String API_BASE_URL = "https://api.imagekit.io/"; + public static String UPLOAD_BASE_URL = "https://upload.imagekit.io/"; + private ImageKit imageKit; Request request; OkHttpClient client; @@ -62,7 +66,7 @@ public Result upload(FileCreateRequest fileCreateRequest){ MultipartBody body=multipartBuilder.build(fileCreateRequest); request=new Request.Builder() - .url("https://upload.imagekit.io/api/v1/files/upload") + .url(UPLOAD_BASE_URL.concat("api/v1/files/upload")) .post(body) .headers(Headers.of(headers)) .build(); @@ -494,7 +498,7 @@ public Result manageTags(TagsRequest tagsRequest, String action) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(tagsRequest)); request=new Request.Builder() - .url(action.equals("removeTags") ? "https://api.imagekit.io/v1/files/removeTags" : "https://api.imagekit.io/v1/files/addTags") + .url(action.equals("removeTags") ? API_BASE_URL.concat("v1/files/removeTags") : API_BASE_URL.concat("v1/files/addTags")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -530,7 +534,7 @@ public Result removeAITags(AITagsRequest aiTagsRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(aiTagsRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/files/removeAITags") + .url(API_BASE_URL.concat("v1/files/removeAITags")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -566,7 +570,7 @@ public Result getCustomMetaDataFields() { headers.put("Authorization",credential); request=new Request.Builder() - .url("https://api.imagekit.io/v1/customMetadataFields") + .url(API_BASE_URL.concat("v1/customMetadataFields")) .get() .headers(Headers.of(headers)) .build(); @@ -607,7 +611,7 @@ public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest custom RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldCreateRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/customMetadataFields") + .url(API_BASE_URL.concat("v1/customMetadataFields")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -641,7 +645,7 @@ public Result deleteCustomMetaDataField(String id) { headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - String url=String.format(Locale.US,"https://api.imagekit.io/v1/customMetadataFields/%s",id); + String url=String.format(Locale.US,API_BASE_URL.concat("v1/customMetadataFields/%s"),id); request=new Request.Builder() .url(url) @@ -682,7 +686,7 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom headers.put("Authorization",credential); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldUpdateRequest)); - String url=String.format(Locale.US,"https://api.imagekit.io/v1/customMetadataFields/%s",customMetaDataFieldUpdateRequest.getId()); + String url=String.format(Locale.US,API_BASE_URL.concat("v1/customMetadataFields/%s"),customMetaDataFieldUpdateRequest.getId()); request=new Request.Builder() .url(url) .patch(requestBody) @@ -719,8 +723,7 @@ public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionReques headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/versions/%s", deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); - System.out.println("url:=> " + url); + String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions/%s"), deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); request=new Request.Builder() .url(url) .delete() @@ -735,7 +738,7 @@ public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionReques result.setSuccessful(true); result.setRaw(respBody); if (result.getMessage() == null) { - result.setMessage("File Copied SuccessFully."); + result.setMessage("File version Deleted SuccessFully."); } } else { String resp=response.body().string(); @@ -761,7 +764,7 @@ public Result copyFile(CopyFileRequest copyFileRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFileRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/files/copy") + .url(API_BASE_URL.concat("v1/files/copy")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -797,7 +800,7 @@ public Result moveFile(MoveFileRequest moveFileRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFileRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/files/move") + .url(API_BASE_URL.concat("v1/files/move")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -833,7 +836,7 @@ public Result renameFile(RenameFileRequest renameFileRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(renameFileRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/files/rename") + .url(API_BASE_URL.concat("v1/files/rename")) .put(requestBody) .headers(Headers.of(headers)) .build(); @@ -868,7 +871,7 @@ public Result createFolder(CreateFolderRequest createFolderRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(createFolderRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/folder/") + .url(API_BASE_URL.concat("v1/folder/")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -903,7 +906,7 @@ public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(deleteFolderRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/folder/") + .url(API_BASE_URL.concat("v1/folder/")) .delete(requestBody) .headers(Headers.of(headers)) .build(); @@ -939,7 +942,7 @@ public Result copyFolder(CopyFolderRequest copyFolderRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFolderRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/bulkJobs/moveFolder") + .url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -975,7 +978,7 @@ public Result moveFolder(MoveFolderRequest moveFolderRequest) { RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFolderRequest)); request=new Request.Builder() - .url("https://api.imagekit.io/v1/bulkJobs/moveFolder") + .url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")) .post(requestBody) .headers(Headers.of(headers)) .build(); @@ -1008,7 +1011,7 @@ public Result getBulkJobStatus(String jobId) { headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - String url=String.format(Locale.US,"https://api.imagekit.io/v1/bulkJobs/%s", jobId); + String url=String.format(Locale.US,API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); request=new Request.Builder() .url(url) @@ -1044,7 +1047,7 @@ public Result getFileVersions(String fileId) { headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/versions", fileId); + String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions"), fileId); request=new Request.Builder() .url(url) @@ -1086,7 +1089,7 @@ public Result getFileVersionDetails(String fileId, String versionId) { headers.put("Content-Type","application/json"); headers.put("Authorization",credential); - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/versions/%s", fileId, versionId); + String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); request=new Request.Builder() .url(url) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 3945399..338cd2c 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -11,6 +11,7 @@ import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; import io.imagekit.sdk.models.CustomMetaDataTypeEnum; +import io.imagekit.sdk.models.DeleteFileVersionRequest; import io.imagekit.sdk.models.DeleteFolderRequest; import io.imagekit.sdk.models.FileCreateRequest; import io.imagekit.sdk.models.FileUpdateRequest; @@ -19,6 +20,7 @@ import io.imagekit.sdk.models.RenameFileRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; +import io.imagekit.sdk.tasks.MultipartBuilder; import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.utils.Utils; import okhttp3.HttpUrl; @@ -29,7 +31,11 @@ import org.junit.Before; import org.junit.Test; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URL; import java.util.*; import java.util.regex.Pattern; @@ -38,7 +44,10 @@ import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; +import static java.nio.charset.StandardCharsets.UTF_8; + import com.google.gson.Gson; +import com.google.gson.JsonParser; public class ImageKitTest { private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern.compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)"); @@ -440,34 +449,56 @@ public void getUrl_with_time_expire() { // Test Case for Upload @Test - public void imageKit_upload_returnSuccess() { - FileCreateRequest fileCreateRequest =mock(FileCreateRequest.class); - Result result=new Result(); - result.setSuccessful(true); - result.setFilePath("/myfile.jpg"); - when(restClient.upload(any(FileCreateRequest.class))).thenReturn(result); - Result result1 = SUT.upload(fileCreateRequest); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test - public void imageKit_imageUpload_returnFalse() { - FileCreateRequest fileCreateRequest =mock(FileCreateRequest.class); - Result result=new Result(); - result.setSuccessful(false); - when(restClient.upload(any(FileCreateRequest.class))).thenReturn(result); - Result result1 = SUT.upload(fileCreateRequest); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } + public void imageKit_upload_returnSuccess() throws IOException, InterruptedException { + String imageUrl="https://homepages.cae.wisc.edu/~ece533/images/cat.png"; + URL url = URI.create(imageUrl).toURL(); + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); + List tags=new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + fileCreateRequest.setFolder("demo1"); + String customCoordinates="10,10,20,20"; + fileCreateRequest.setCustomCoordinates(customCoordinates); + + List responseFields=new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); + + fileCreateRequest.setResponseFields(responseFields); + fileCreateRequest.setUseUniqueFileName(false); + fileCreateRequest.setPrivateFile(false); + fileCreateRequest.setOverwriteFile(false); + fileCreateRequest.setOverwriteAITags(false); + fileCreateRequest.setOverwriteTags(false); + fileCreateRequest.setOverwriteCustomMetadata(false); - @Test(expected = RuntimeException.class) - public void imageKit_imageUpload_throwNetworkException() { - FileCreateRequest fileCreateRequest =mock(FileCreateRequest.class); - Result result=new Result(); - result.setSuccessful(false); - when(restClient.upload(any(FileCreateRequest.class))).thenThrow(new RuntimeException()); - Result result1 = SUT.upload(fileCreateRequest); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"fileId\": \"62a066c427854b7abeacc73b\",\n" + + " \"name\": \"sample-cat-image.png\",\n" + + " \"size\": 51085,\n" + + " \"versionInfo\": {\n" + + " \"id\": \"62a066c427854b7abeacc73b\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"filePath\": \"/demo1/sample-cat-image.png\",\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/demo1/sample-cat-image.png\",\n" + + " \"fileType\": \"image\",\n" + + " \"height\": 300,\n" + + " \"width\": 300,\n" + + " \"orientation\": 1,\n" + + " \"thumbnailUrl\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/demo1/sample-cat-image.png\",\n" + + " \"AITags\": null\n" + + "}")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + RecordedRequest request = server.takeRequest(); + assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); } @Test @@ -659,10 +690,7 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.addTags(tagsRequest); RecordedRequest request = server.takeRequest(); @@ -670,8 +698,8 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept String utf8RequestBody = request.getBody().readUtf8(); assertEquals(tagsRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); } @Test @@ -687,10 +715,7 @@ public void remove_tags_expectedSuccessWith() throws IOException, InterruptedExc MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.removeTags(tagsRequest); RecordedRequest request = server.takeRequest(); @@ -698,8 +723,8 @@ public void remove_tags_expectedSuccessWith() throws IOException, InterruptedExc String utf8RequestBody = request.getBody().readUtf8(); assertEquals(tagsRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); } @Test @@ -729,15 +754,12 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, " }\n" + "]")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.getCustomMetaDataFields(); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("GET /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); } @Test @@ -756,10 +778,7 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep " }\n" + "}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); @@ -778,8 +797,8 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep String utf8RequestBody = request.getBody().readUtf8(); assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); } @Test @@ -787,10 +806,7 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); RecordedRequest request = server.takeRequest(); @@ -798,8 +814,8 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte String utf8RequestBody = request.getBody().readUtf8(); assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl.toString().concat("629f2e2f7eb0fe2eb25f9988"), request.getRequestUrl().toString()); + assertEquals("DELETE /v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), request.getRequestUrl().toString()); } @Test @@ -817,10 +833,7 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep " }\n" + "}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); @@ -839,8 +852,8 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep String utf8RequestBody = request.getBody().readUtf8(); assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PATCH /628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl.toString().concat("628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); + assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); } @Test @@ -858,10 +871,7 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.removeAITags(aiTagsRequest); RecordedRequest request = server.takeRequest(); @@ -869,8 +879,8 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept String utf8RequestBody = request.getBody().readUtf8(); assertEquals(aiTagsRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); } @Test @@ -884,10 +894,7 @@ public void copyFile_successExpected() throws InterruptedException, IOException MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.copyFile(copyFileRequest); RecordedRequest request = server.takeRequest(); @@ -895,8 +902,8 @@ public void copyFile_successExpected() throws InterruptedException, IOException String utf8RequestBody = request.getBody().readUtf8(); assertEquals(copyFileRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); } @Test @@ -909,10 +916,7 @@ public void moveFile_successExpected() throws InterruptedException, IOException MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.moveFile(moveFileRequest); RecordedRequest request = server.takeRequest(); @@ -920,8 +924,8 @@ public void moveFile_successExpected() throws InterruptedException, IOException String utf8RequestBody = request.getBody().readUtf8(); assertEquals(moveFileRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); } @Test @@ -935,10 +939,7 @@ public void renameFile_successExpected() throws InterruptedException, IOExceptio MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.renameFile(renameFileRequest); RecordedRequest request = server.takeRequest(); @@ -946,8 +947,8 @@ public void renameFile_successExpected() throws InterruptedException, IOExceptio String utf8RequestBody = request.getBody().readUtf8(); assertEquals(renameFileRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PUT / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); } @Test @@ -960,10 +961,7 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.createFolder(createFolderRequest); RecordedRequest request = server.takeRequest(); @@ -971,8 +969,8 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept String utf8RequestBody = request.getBody().readUtf8(); assertEquals(createFolderRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); } @Test @@ -984,10 +982,7 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.deleteFolder(deleteFolderRequest); RecordedRequest request = server.takeRequest(); @@ -995,8 +990,8 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept String utf8RequestBody = request.getBody().readUtf8(); assertEquals(deleteFolderRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("DELETE / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); } @Test @@ -1012,10 +1007,7 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + "}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.copyFolder(copyFolderRequest); RecordedRequest request = server.takeRequest(); @@ -1023,8 +1015,8 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio String utf8RequestBody = request.getBody().readUtf8(); assertEquals(copyFolderRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); } @Test @@ -1039,10 +1031,7 @@ public void moveFolder_successExpected() throws InterruptedException, IOExceptio " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + "}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.moveFolder(moveFolderRequest); RecordedRequest request = server.takeRequest(); @@ -1050,8 +1039,8 @@ public void moveFolder_successExpected() throws InterruptedException, IOExceptio String utf8RequestBody = request.getBody().readUtf8(); assertEquals(moveFolderRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST / HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl, request.getRequestUrl()); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); } @Test @@ -1064,16 +1053,13 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx " \"status\": \"Completed\"\n" + "}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl.toString().concat("629f44ac7eb0fe8173622d4b"), request.getRequestUrl().toString()); + assertEquals("GET /v1/bulkJobs/629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), request.getRequestUrl().toString()); } @Test @@ -1137,16 +1123,13 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc " }\n" + "]")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.getFileVersions("629f3de17eb0fe4053615450"); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl.toString().concat("629f3de17eb0fe4053615450/versions"), request.getRequestUrl().toString()); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), request.getRequestUrl().toString()); } @Test @@ -1208,16 +1191,34 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, " \"mime\": \"image/png\"\n" + "}")); server.start(); - HttpUrl baseUrl = server.url("/"); - Configuration config = SUT.getConfig(); - config.setUrlEndpoint(String.valueOf(baseUrl)); - SUT.setConfig(config); + RestClient.API_BASE_URL = server.url("/").toString(); SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", request.getRequestLine()); - assertEquals(baseUrl.toString().concat("629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), request.getRequestUrl().toString()); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), request.getRequestUrl().toString()); + } + + @Test + public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), request.getRequestUrl().toString()); } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index 4d7afff..abd7dd2 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -42,131 +42,6 @@ public void setUp() throws Exception { SUT=new RestClient(imageKit); } - @Test - public void valid_upload_expectSuccess() { - OkHttpClientStub clientStub= new OkHttpClientStub("{}", 200, "Ok"); - SUT.setClient(clientStub); - - MultipartBuilder multipartBuilder=mock(MultipartBuilder.class); - MultipartBody body=new MultipartBody.Builder().addFormDataPart("","").build(); - ArgumentCaptor ac=ArgumentCaptor.forClass(FileCreateRequest.class); - when(multipartBuilder.build(ac.capture())).thenReturn(body); - SUT.setMultipartBuilder(multipartBuilder); - - FileCreateRequest fileCreateRequest=new FileCreateRequest("f06830ca9f1e3e90","demo.jpg"); - fileCreateRequest.setPrivateFile(true); - Result result = SUT.upload(fileCreateRequest); - assertEquals(fileCreateRequest,ac.getValue()); - } - - @Test - public void valid_upload_with_all_params_expectSuccess() { - String resp="{\n" + - " \"fileId\" : \"598821f949c0a938d57563bd\"," + - " \"name\": \"demo.jpg\"," + - " \"url\": \"https://ik.imagekit.io/your_imagekit_id/images/products/demo_xdf231.jpg\"," + - " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/images/products/demo_xdf231.jpg\"," + - " \"height\" : \"200\"," + - " \"width\" : \"200\"," + - " \"size\" : \"83622\"," + - " \"filePath\": \"/images/products/demo.jpg\"," + - " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2020\"]," + - " \"isPrivateFile\" : true," + - " \"customCoordinates\" : \"10,10,200,200\"," + - " \"fileType\": \"image\"" + - "}"; - - OkHttpClientStub clientStub= new OkHttpClientStub(resp, 200, "Ok"); - SUT.setClient(clientStub); - - MultipartBuilder multipartBuilder=mock(MultipartBuilder.class); - MultipartBody body=new MultipartBody.Builder().addFormDataPart("","").build(); - ArgumentCaptor ac=ArgumentCaptor.forClass(FileCreateRequest.class); - when(multipartBuilder.build(ac.capture())).thenReturn(body); - SUT.setMultipartBuilder(multipartBuilder); - - FileCreateRequest fileCreateRequest=new FileCreateRequest("f06830ca9f1e3e90","demo.jpg"); - fileCreateRequest.setFolder("/images/products"); - fileCreateRequest.setPrivateFile(true); - fileCreateRequest.setCustomCoordinates("10,10,200,200"); - List tags=new ArrayList<>(); - tags.add("t-shirt"); - tags.add("round-neck"); - tags.add("sale2020"); - fileCreateRequest.setTags(tags); - - Result result = SUT.upload(fileCreateRequest); - assertEquals(fileCreateRequest,ac.getValue()); - } - - @Test - public void invalid_upload_expectFailed() { - JsonObject json=new JsonObject(); - json.addProperty("message","Un-processable Entity"); - OkHttpClientStub clientStub= new OkHttpClientStub(json.toString(), - 422, "Un-processable Entity"); - SUT.setClient(clientStub); - FileCreateRequest fileCreateRequest=new FileCreateRequest("http://localhost","demo.jpg"); - Result result = SUT.upload(fileCreateRequest); - assertThat("Un-processable Entity",is(result.getMessage())); - } - - @Test - public void internalServerError_upload_expectFailed() { - JsonObject json=new JsonObject(); - json.addProperty("message","Error: Internal server error."); - OkHttpClientStub clientStub= new OkHttpClientStub(json.toString(), - 500, "Internal Server Error."); - SUT.setClient(clientStub); - FileCreateRequest fileCreateRequest=new FileCreateRequest("http://localhost","demo.jpg"); - Result result = SUT.upload(fileCreateRequest); - assertThat("Error: Internal server error.",is(result.getMessage())); - } - - @Test(expected = RuntimeException.class) - public void ioException_upload_with_empty_file_expectFailed() { - JsonObject json=new JsonObject(); - json.addProperty("message","Error message"); - OkHttpClientStub clientStub= new OkHttpClientStub(json.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - - MultipartBuilder multipartBuilder=mock(MultipartBuilder.class); - MultipartBody body=new MultipartBody.Builder().addFormDataPart("","").build(); - ArgumentCaptor ac=ArgumentCaptor.forClass(FileCreateRequest.class); - doThrow(new IOException()).when(multipartBuilder.build(ac.capture())); - SUT.setMultipartBuilder(multipartBuilder); - - FileCreateRequest fileCreateRequest=new FileCreateRequest("",""); - Result result = SUT.upload(fileCreateRequest); - assertNotNull(result.getMessage()); - } - - @Test(expected = RuntimeException.class) - public void valid_upload_with_network_issue_expectException() { - String resp="{\n" + - " \"fileId\" : \"598821f949c0a938d57563bd\"," + - " \"name\": \"demo.jpg\"," + - " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo_xdf231.jpg\"," + - " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo_xdf231.jpg\"," + - " \"height\" : \"300\"," + - " \"width\" : \"200\"," + - " \"size\" : \"83622\"," + - " \"filePath\": \"/demo.jpg\"," + - " \"tags\": null," + - " \"isPrivateFile\" : false," + - " \"customCoordinates\" : null," + - " \"fileType\": \"image\"" + - "}"; - OkHttpClientStub clientStub= new OkHttpClientStub(resp, - 200, "Ok"); - SUT.setClient(clientStub); - FileCreateRequest fileCreateRequest=new FileCreateRequest("f06830ca9f1e3e90","demo.jpg"); - clientStub.setTimeoutException(); - Result result = SUT.upload(fileCreateRequest); - assertEquals(resp,result.getRaw()); - } - @Test public void valid_updateDetail_expectSuccess() { String resp="{\n" + diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index e944ce9..5f83eac 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -56,7 +56,7 @@ public static void main(String[] args) throws Exception{ // removeAITags(); // createCustomMetaDataFields(); // updateCustomMetaDataFields(); -// deleteCustomMetaDataField("62988431cd3d7878e486ccad"); +// deleteCustomMetaDataField("6296f91191fa57ccc36b15cf"); // getCustomMetaDataFields(); // // calculateDistance(); @@ -394,8 +394,7 @@ private static void uploadFromBytes() { private static void addTags() { List fileIds = new ArrayList<>(); - fileIds.add("6298833ad3c4405ddb9253c2"); - fileIds.add("629883933df4f9fb1d7cef52"); + fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); tags.add("tag3"); tags.add("tag4"); @@ -411,8 +410,7 @@ private static void addTags() { private static void removeTags() { List fileIds = new ArrayList<>(); - fileIds.add("6298833ad3c4405ddb9253c2"); - fileIds.add("629883933df4f9fb1d7cef52"); + fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); tags.add("tag3"); tags.add("tag4"); @@ -428,9 +426,9 @@ private static void removeTags() { private static void removeAITags() { List fileIds = new ArrayList<>(); - fileIds.add("6299fe884af1071996cc62eb"); + fileIds.add("629f3de17eb0fe4053615450"); List aiTags = new ArrayList<>(); - aiTags.add("Female"); + aiTags.add("Rectangle"); AITagsRequest aiTagsRequest =new AITagsRequest(); aiTagsRequest.setFileIds(fileIds); aiTagsRequest.setAITags(aiTags); @@ -455,8 +453,8 @@ private static void getCustomMetaDataFields() { private static void createCustomMetaDataFields() { CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("NameCus1"); - customMetaDataFieldCreateRequest.setLabel("LabelCm91"); + customMetaDataFieldCreateRequest.setName("NameCus2"); + customMetaDataFieldCreateRequest.setLabel("LabelCm2"); customMetaDataFieldCreateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); Result result = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); @@ -486,8 +484,8 @@ private static void updateCustomMetaDataFields() { schemaObject.setMaxValue(200); CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("62988431cd3d7878e486ccad"); - customMetaDataFieldUpdateRequest.setLabel("labelPri01"); + customMetaDataFieldUpdateRequest.setId("62a0425ac10d49989f6d1996"); + customMetaDataFieldUpdateRequest.setLabel("LabelCM200"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); Result result = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); @@ -501,8 +499,8 @@ private static void updateCustomMetaDataFields() { private static void deleteFileVersion() { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); + deleteFileVersionRequest.setFileId("629d95278482ba129fd17c97"); + deleteFileVersionRequest.setVersionId("629d953ebd24e8ceca911a66"); Result result = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); System.out.println(">> delete file version done."); System.out.println(Color.ANSI_GREEN+">> Response delete File version :"+Color.ANSI_RESET); @@ -514,8 +512,8 @@ private static void deleteFileVersion() { private static void copyFile() { CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/sample_imag1.jpg"); - copyFileRequest.setDestinationPath("/New_Folder/"); + copyFileRequest.setSourceFilePath("/w2_image.png"); + copyFileRequest.setDestinationPath("/Gallery/"); copyFileRequest.setIncludeVersions(true); Result result = ImageKit.getInstance().copyFile(copyFileRequest); System.out.println(">> Copy file done."); @@ -528,8 +526,8 @@ private static void copyFile() { private static void moveFile() { MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/sample_imag1.jpg"); - moveFileRequest.setDestinationPath("/New_Folder/"); + moveFileRequest.setSourceFilePath("/Gallery/w2_image.png"); + moveFileRequest.setDestinationPath("/"); Result result = ImageKit.getInstance().moveFile(moveFileRequest); System.out.println(">> Move File done."); System.out.println(Color.ANSI_GREEN+">> Response Move File :"+Color.ANSI_RESET); @@ -541,8 +539,8 @@ private static void moveFile() { private static void renameFile() { RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/sample_image.jpg"); - renameFileRequest.setNewFileName("sample_image1.jpg"); + renameFileRequest.setFilePath("/w2_image.png"); + renameFileRequest.setNewFileName("w2_image_s.png"); renameFileRequest.setPurgeCache(true); Result result = ImageKit.getInstance().renameFile(renameFileRequest); System.out.println(">> Rename file done."); @@ -556,7 +554,7 @@ private static void renameFile() { private static void createFolder() { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("test1"); - createFolderRequest.setParentFolderPath("/New_Folder"); + createFolderRequest.setParentFolderPath("/"); Result result = ImageKit.getInstance().createFolder(createFolderRequest); System.out.println(">> Create folder done."); System.out.println(Color.ANSI_GREEN+">> Response Create Folder :"+Color.ANSI_RESET); @@ -567,7 +565,7 @@ private static void createFolder() { } private static void deleteFolder() { - String folderPath="/New_Folder"; + String folderPath="/test1"; DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath(folderPath); Result result = ImageKit.getInstance().deleteFolder(deleteFolderRequest); @@ -581,7 +579,7 @@ private static void deleteFolder() { private static void copyFolder() { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/Gallery/sub_folder"); + copyFolderRequest.setSourceFolderPath("/Gallery/test"); copyFolderRequest.setDestinationPath("/"); Result result = ImageKit.getInstance().copyFolder(copyFolderRequest); System.out.println(">> Copy folder done."); @@ -594,8 +592,8 @@ private static void copyFolder() { private static void moveFolder() { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/test"); - moveFolderRequest.setDestinationPath("/Gallery"); + moveFolderRequest.setSourceFolderPath("/Gallery/test"); + moveFolderRequest.setDestinationPath("/"); Result result = ImageKit.getInstance().moveFolder(moveFolderRequest); System.out.println(">>Move folder done."); System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); @@ -606,7 +604,7 @@ private static void moveFolder() { } private static void getBulkJobStatus() { - String jobId = "629758a291fa57aff773d2c9"; + String jobId = "629f44ac7eb0fe8173622d4b"; Result result = ImageKit.getInstance().getBulkJobStatus(jobId); System.out.println(">> Fetch Bulk job status done."); System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); @@ -617,7 +615,7 @@ private static void getBulkJobStatus() { } private static void getFileVersions() { - String fileId = "6299ae01f8b34e6009e32ef3"; + String fileId = "62a04834c10d49825c6de9e8"; Result result = ImageKit.getInstance().getFileVersions(fileId); System.out.println(">> Fetch Get file versions done."); System.out.println(Color.ANSI_GREEN+">> Response Get file versions :"+Color.ANSI_RESET); @@ -628,8 +626,8 @@ private static void getFileVersions() { } private static void getFileVersionDetails() { - String fileId = "6299ae01f8b34e6009e32ef3"; - String versionId = "6299ae01f8b34e6009e32ef3"; + String fileId = "62a04834c10d49825c6de9e8"; + String versionId = "62a04834c10d49825c6de9e8"; Result result = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); System.out.println(">> Fetch Get file versions details done."); System.out.println(Color.ANSI_GREEN+">> Response Get file versions details :"+Color.ANSI_RESET); From 2812d40a4a9c7f3f439b81eab4ba0dcea47a0dc6 Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 11 Jun 2022 15:32:23 +0530 Subject: [PATCH 047/112] added fileupload more params --- .../java/io/imagekit/sdk/models/BaseFile.java | 61 ++++++- .../sdk/models/FileCreateRequest.java | 54 +++++-- .../imagekit/sdk/models/results/Result.java | 14 +- .../imagekit/sdk/tasks/MultipartBuilder.java | 23 ++- .../io/imagekit/sdk/tasks/RestClient.java | 2 + .../java/io/imagekit/sdk/ImageKitTest.java | 152 +++++++++++++++--- .../io/imagekit/sdk/models/BaseFileTest.java | 5 +- src/main/java/io/imagekit/sampleapp/App.java | 26 ++- 8 files changed, 293 insertions(+), 44 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java index 5783947..210e15a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java @@ -1,5 +1,8 @@ package io.imagekit.sdk.models; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + import java.util.List; public class BaseFile { @@ -15,11 +18,16 @@ public class BaseFile { protected boolean isPrivateFile; protected String customCoordinates; protected String fileType; + protected JsonArray aiTags; + protected JsonObject versionInfo; + protected JsonObject customMetadata; + protected JsonObject embeddedMetadata; + protected JsonObject extensionStatus; public BaseFile() { } - public BaseFile(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType) { + public BaseFile(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus) { this.fileId = fileId; this.name = name; this.url = url; @@ -32,6 +40,12 @@ public BaseFile(String fileId, String name, String url, String thumbnail, int he this.isPrivateFile = isPrivateFile; this.customCoordinates = customCoordinates; this.fileType = fileType; + this.aiTags = aiTags; + this.versionInfo = versionInfo; + this.customMetadata = customMetadata; + this.embeddedMetadata = embeddedMetadata; + this.extensionStatus = extensionStatus; + } public String getFileId() { @@ -130,6 +144,46 @@ public void setFileType(String fileType) { this.fileType = fileType; } + public JsonArray getAiTags() { + return aiTags; + } + + public void setAiTags(JsonArray aiTags) { + this.aiTags = aiTags; + } + + public JsonObject getVersionInfo() { + return versionInfo; + } + + public void setVersionInfo(JsonObject versionInfo) { + this.versionInfo = versionInfo; + } + + public JsonObject getCustomMetadata() { + return customMetadata; + } + + public void setCustomMetadata(JsonObject customMetadata) { + this.customMetadata = customMetadata; + } + + public JsonObject getEmbeddedMetadata() { + return embeddedMetadata; + } + + public void setEmbeddedMetadata(JsonObject embeddedMetadata) { + this.embeddedMetadata = embeddedMetadata; + } + + public JsonObject getExtensionStatus() { + return extensionStatus; + } + + public void setExtensionStatus(JsonObject extensionStatus) { + this.extensionStatus = extensionStatus; + } + @Override public String toString() { return "BaseFile{" + @@ -145,6 +199,11 @@ public String toString() { ", isPrivateFile=" + isPrivateFile + ", customCoordinates='" + customCoordinates +'\''+ ", fileType='" + fileType + '\'' + + ", aiTags=" + aiTags + + ", versionInfo=" + versionInfo + + ", customMetadata=" + customMetadata + + ", embeddedMetadata=" + embeddedMetadata + + ", extensionStatus=" + extensionStatus + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java index f4224d0..1388776 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java @@ -22,10 +22,13 @@ public class FileCreateRequest { public boolean isPrivateFile; public String customCoordinates; public List responseFields; - public boolean overwriteFile; - public boolean overwriteAITags; - public boolean overwriteTags; - public boolean overwriteCustomMetadata; + public JsonArray extensions; + public String webhookUrl; + public Boolean overwriteFile; + public Boolean overwriteAITags; + public Boolean overwriteTags; + public Boolean overwriteCustomMetadata; + public JsonObject customMetadata; public FileCreateRequest(URL url, String fileName) { this.url = url; @@ -101,38 +104,62 @@ public void setResponseFields(List responseFields) { this.responseFields = responseFields; } - public boolean isOverwriteFile() { + public JsonArray getExtensions() { + return extensions; + } + + public void setExtensions(JsonArray extensions) { + this.extensions = extensions; + } + + public String getWebhookUrl() { + return webhookUrl; + } + + public void setWebhookUrl(String webhookUrl) { + this.webhookUrl = webhookUrl; + } + + public Boolean isOverwriteFile() { return overwriteFile; } - public void setOverwriteFile(boolean overwriteFile) { + public void setOverwriteFile(Boolean overwriteFile) { this.overwriteFile = overwriteFile; } - public boolean isOverwriteAITags() { + public Boolean isOverwriteAITags() { return overwriteAITags; } - public void setOverwriteAITags(boolean overwriteAITags) { + public void setOverwriteAITags(Boolean overwriteAITags) { this.overwriteAITags = overwriteAITags; } - public boolean isOverwriteTags() { + public Boolean isOverwriteTags() { return overwriteTags; } - public void setOverwriteTags(boolean overwriteTags) { + public void setOverwriteTags(Boolean overwriteTags) { this.overwriteTags = overwriteTags; } - public boolean isOverwriteCustomMetadata() { + public Boolean isOverwriteCustomMetadata() { return overwriteCustomMetadata; } - public void setOverwriteCustomMetadata(boolean overwriteCustomMetadata) { + public void setOverwriteCustomMetadata(Boolean overwriteCustomMetadata) { this.overwriteCustomMetadata = overwriteCustomMetadata; } + public JsonObject getCustomMetadata() { + return customMetadata; + } + + public void setCustomMetadata(JsonObject customMetadata) { + this.customMetadata = customMetadata; + } + @Override public String toString() { return "FileCreateRequest{" + @@ -143,10 +170,13 @@ public String toString() { ", isPrivateFile=" + isPrivateFile + ", customCoordinates=" + customCoordinates + ", responseFields=" + responseFields + + ", extensions=" + extensions + + ", webhookUrl='" + webhookUrl + '\'' + ", overwriteFile=" + overwriteFile + ", overwriteAITags=" + overwriteAITags + ", overwriteTags=" + overwriteTags + ", overwriteCustomMetadata=" + overwriteCustomMetadata + + ", customMetadata=" + customMetadata + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index 997c987..ae2c6f2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -1,6 +1,8 @@ package io.imagekit.sdk.models.results; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.models.BaseFile; @@ -21,7 +23,7 @@ public class Result extends BaseFile { public Result() { } - public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType) { + public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus) { this.fileId = fileId; this.name = name; this.url = url; @@ -34,6 +36,11 @@ public Result(String fileId, String name, String url, String thumbnail, int heig this.isPrivateFile = isPrivateFile; this.customCoordinates = customCoordinates; this.fileType = fileType; + this.aiTags = aiTags; + this.versionInfo = versionInfo; + this.customMetadata = customMetadata; + this.embeddedMetadata = embeddedMetadata; + this.extensionStatus = extensionStatus; } public boolean isSuccessful() { @@ -199,6 +206,11 @@ public String toString() { ", isPrivateFile=" + isPrivateFile + ", customCoordinates='" + customCoordinates +'\''+ ", fileType='" + fileType + '\'' + + ", aiTags=" + aiTags + + ", versionInfo=" + versionInfo + + ", customMetadata=" + customMetadata + + ", embeddedMetadata=" + embeddedMetadata + + ", extensionStatus=" + extensionStatus + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index c3f11ab..64f4cdb 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -16,7 +16,7 @@ public class MultipartBuilder { public MultipartBody build(FileCreateRequest fileCreateRequest){ - MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); + MultipartBody.Builder builder = new MultipartBody.Builder("boundary").setType(MultipartBody.FORM); if (null!=fileCreateRequest.url){ builder.addFormDataPart("file",fileCreateRequest.url.toString()); @@ -54,18 +54,27 @@ public MultipartBody build(FileCreateRequest fileCreateRequest){ if (null!=fileCreateRequest.responseFields) { builder.addFormDataPart("responseFields", Utils.listToString(fileCreateRequest.responseFields)); } - if (fileCreateRequest.overwriteFile) { - builder.addFormDataPart("overwriteFile", "true"); + if (fileCreateRequest.overwriteFile != null && !fileCreateRequest.overwriteFile) { + builder.addFormDataPart("overwriteFile", String.valueOf(true)); } - if (fileCreateRequest.overwriteAITags) { - builder.addFormDataPart("overwriteAITags", "true"); + if (fileCreateRequest.overwriteAITags != null && !fileCreateRequest.overwriteAITags) { + builder.addFormDataPart("overwriteAITags", String.valueOf(Boolean.TRUE)); } - if (fileCreateRequest.overwriteTags) { + if (fileCreateRequest.overwriteTags != null && !fileCreateRequest.overwriteTags) { builder.addFormDataPart("overwriteTags", "true"); } - if (fileCreateRequest.overwriteCustomMetadata) { + if (fileCreateRequest.overwriteCustomMetadata != null && !fileCreateRequest.overwriteCustomMetadata) { builder.addFormDataPart("overwriteCustomMetadata", "true"); } + if (null!=fileCreateRequest.extensions) { + builder.addFormDataPart("extensions", fileCreateRequest.extensions.toString()); + } + if (null!=fileCreateRequest.webhookUrl) { + builder.addFormDataPart("webhookUrl", fileCreateRequest.webhookUrl); + } + if (null!=fileCreateRequest.customMetadata) { + builder.addFormDataPart("customMetadata", String.valueOf(new JsonParser().parse(String.valueOf(fileCreateRequest.customMetadata)))); + } return builder.build(); } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index a526c12..4d8a353 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -63,6 +63,8 @@ public Result upload(FileCreateRequest fileCreateRequest){ headers.put("Content-Type","application/json"); headers.put("Authorization",credential); + System.out.println("Auth:==> " + credential); + MultipartBody body=multipartBuilder.build(fileCreateRequest); request=new Request.Builder() diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 338cd2c..a897ade 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -20,10 +20,8 @@ import io.imagekit.sdk.models.RenameFileRequest; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; -import io.imagekit.sdk.tasks.MultipartBuilder; import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.utils.Utils; -import okhttp3.HttpUrl; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; @@ -31,9 +29,7 @@ import org.junit.Before; import org.junit.Test; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; import java.net.URI; import java.net.URL; import java.util.*; @@ -44,15 +40,14 @@ import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; -import static java.nio.charset.StandardCharsets.UTF_8; - -import com.google.gson.Gson; -import com.google.gson.JsonParser; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; public class ImageKitTest { private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern.compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)"); private ImageKit SUT; + RestClient restClient; @Before public void setUp() throws Exception { @@ -468,35 +463,154 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep responseFields.add("customCoordinates"); fileCreateRequest.setResponseFields(responseFields); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 10); + innerObject2.addProperty("maxTags", 5); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); fileCreateRequest.setUseUniqueFileName(false); fileCreateRequest.setPrivateFile(false); fileCreateRequest.setOverwriteFile(false); fileCreateRequest.setOverwriteAITags(false); fileCreateRequest.setOverwriteTags(false); fileCreateRequest.setOverwriteCustomMetadata(false); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + - " \"fileId\": \"62a066c427854b7abeacc73b\",\n" + - " \"name\": \"sample-cat-image.png\",\n" + - " \"size\": 51085,\n" + + " \"fileId\": \"62a465d245a84a0ef3852968\",\n" + + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"size\": 23023,\n" + " \"versionInfo\": {\n" + - " \"id\": \"62a066c427854b7abeacc73b\",\n" + + " \"id\": \"62a465d245a84a0ef3852968\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + - " \"filePath\": \"/demo1/sample-cat-image.png\",\n" + - " \"url\": \"https://ik.imagekit.io/xyxt2lnil/demo1/sample-cat-image.png\",\n" + + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + " \"fileType\": \"image\",\n" + - " \"height\": 300,\n" + - " \"width\": 300,\n" + - " \"orientation\": 1,\n" + - " \"thumbnailUrl\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/demo1/sample-cat-image.png\",\n" + - " \"AITags\": null\n" + + " \"height\": 354,\n" + + " \"width\": 236,\n" + + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"AITags\": [\n" + + " {\n" + + " \"name\": \"Clothing\",\n" + + " \"confidence\": 98.77,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Plant\",\n" + + " \"confidence\": 96.51,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Smile\",\n" + + " \"confidence\": 95.31,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Shoe\",\n" + + " \"confidence\": 95.2,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Street light\",\n" + + " \"confidence\": 91.05,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + + " ],\n" + + " \"extensionStatus\": {\n" + + " \"remove-bg\": \"pending\",\n" + + " \"google-auto-tagging\": \"success\"\n" + + " }\n" + "}")); server.start(); RestClient.UPLOAD_BASE_URL = server.url("/").toString(); SUT.upload(fileCreateRequest); RecordedRequest request = server.takeRequest(); + String json = "--boundary\r\n" + + "Content-Disposition: form-data; name=\"file\"\r\n" + + "Content-Length: 53\r\n" + + "\r\n" + + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"fileName\"\r\n" + + "Content-Length: 20\r\n" + + "\r\n" + + "sample-cat-image.png\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "false\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"tags\"\r\n" + + "Content-Length: 27\r\n" + + "\r\n" + + "Software,Developer,Engineer\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"folder\"\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "demo1\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + + "Content-Length: 11\r\n" + + "\r\n" + + "10,10,20,20\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + + "Content-Length: 32\r\n" + + "\r\n" + + "thumbnail,tags,customCoordinates\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + + "Content-Length: 4\r\n" + + "\r\n" + + "true\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + + "Content-Length: 4\r\n" + + "\r\n" + + "true\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + + "Content-Length: 4\r\n" + + "\r\n" + + "true\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + + "Content-Length: 4\r\n" + + "\r\n" + + "true\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"extensions\"\r\n" + + "Content-Length: 114\r\n" + + "\r\n" + + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + + "Content-Length: 57\r\n" + + "\r\n" + + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" + + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + + "Content-Length: 12\r\n" + + "\r\n" + + "{\"test1\":10}\r\n" + + "--boundary--"; + assertEquals(json, request.getBody().readUtf8().trim()); +// System.out.println("request.getBody().readUtf8().trim():==> " + request.getBody().readUtf8().trim()); assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java index 6285d07..560ccb7 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java @@ -8,6 +8,9 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.mock; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + public class BaseFileTest { private BaseFile SUT; @@ -19,7 +22,7 @@ public void setUp() throws Exception { @Test public void constructor_test() { List tags=mock(List.class); - SUT=new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags,true, "0,0,10,20", "image"); + SUT=new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags,true, "0,0,10,20", "image", new JsonArray(), new JsonObject(), new JsonObject(), new JsonObject(), new JsonObject()); assertNotNull(SUT); } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 5f83eac..1b029ae 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -1,6 +1,9 @@ package io.imagekit.sampleapp; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.models.AITagsRequest; @@ -39,9 +42,9 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); -// uploadFromBytes(); + uploadFromBytes(); // getBulkJobStatus(); - deleteFileVersion(); +// deleteFileVersion(); // getFileVersions(); // getFileVersionDetails(); // copyFile(); @@ -372,15 +375,32 @@ private static void uploadFromBase64() { private static void uploadFromBytes() { System.out.println(Color.ANSI_CYAN+">> Uploading Image from file:"+Color.ANSI_RESET); System.out.println(">> Start uploading..."); - URL url = App.class.getClassLoader().getResource("sample1.jpg"); + URL url = App.class.getClassLoader().getResource("i1.jpg"); File file=new File(url.getPath()); byte[] bytes= Utils.fileToBytes(file); FileCreateRequest fileCreateRequest =new FileCreateRequest(bytes, "sample_image_th.jpg"); fileCreateRequest.setUseUniqueFileName(false); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 10); + innerObject2.addProperty("maxTags", 5); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); fileCreateRequest.setOverwriteFile(true); fileCreateRequest.setOverwriteAITags(true); fileCreateRequest.setOverwriteTags(true); fileCreateRequest.setOverwriteCustomMetadata(true); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); Result result = ImageKit.getInstance().upload(fileCreateRequest); System.out.println(">> Uploading done."); System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); From eb41adcc48cfc450ebdc0e652ed3d91ba5d1fde2 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 13 Jun 2022 15:45:10 +0530 Subject: [PATCH 048/112] added param regarding changes and test for expected exception --- .../java/io/imagekit/sdk/models/BaseFile.java | 63 ++++++++++++++++++- .../imagekit/sdk/models/results/Result.java | 13 +++- .../java/io/imagekit/sdk/ImageKitTest.java | 35 ++++++++++- .../io/imagekit/sdk/models/BaseFileTest.java | 3 +- src/main/java/io/imagekit/sampleapp/App.java | 2 +- 5 files changed, 109 insertions(+), 7 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java index 210e15a..7433a20 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java @@ -2,7 +2,9 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.sun.org.apache.xpath.internal.operations.Bool; +import java.util.Date; import java.util.List; public class BaseFile { @@ -23,11 +25,16 @@ public class BaseFile { protected JsonObject customMetadata; protected JsonObject embeddedMetadata; protected JsonObject extensionStatus; + protected String type; + protected String mime; + protected Boolean hasAlpha; + protected Date createdAt; + protected Date updatedAt; public BaseFile() { } - public BaseFile(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus) { + public BaseFile(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { this.fileId = fileId; this.name = name; this.url = url; @@ -45,7 +52,11 @@ public BaseFile(String fileId, String name, String url, String thumbnail, int he this.customMetadata = customMetadata; this.embeddedMetadata = embeddedMetadata; this.extensionStatus = extensionStatus; - + this.type = type; + this.mime = mime; + this.hasAlpha = hasAlpha; + this.createdAt = createdAt; + this.updatedAt = updatedAt; } public String getFileId() { @@ -184,6 +195,47 @@ public void setExtensionStatus(JsonObject extensionStatus) { this.extensionStatus = extensionStatus; } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getMime() { + return mime; + } + + public void setMime(String mime) { + this.mime = mime; + } + + public Boolean getHasAlpha() { + return hasAlpha; + } + + public void setHasAlpha(Boolean hasAlpha) { + this.hasAlpha = hasAlpha; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override public String toString() { return "BaseFile{" + @@ -204,6 +256,13 @@ public String toString() { ", customMetadata=" + customMetadata + ", embeddedMetadata=" + embeddedMetadata + ", extensionStatus=" + extensionStatus + + ", type='" + type + '\'' + + ", mime='" + mime + '\'' + + ", hasAlpha=" + hasAlpha + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + '}'; } + + } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index ae2c6f2..f39db1c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -8,6 +8,7 @@ import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.ResponseMetaData; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,7 +24,7 @@ public class Result extends BaseFile { public Result() { } - public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus) { + public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { this.fileId = fileId; this.name = name; this.url = url; @@ -41,6 +42,11 @@ public Result(String fileId, String name, String url, String thumbnail, int heig this.customMetadata = customMetadata; this.embeddedMetadata = embeddedMetadata; this.extensionStatus = extensionStatus; + this.type = type; + this.mime = mime; + this.hasAlpha = hasAlpha; + this.createdAt = createdAt; + this.updatedAt = updatedAt; } public boolean isSuccessful() { @@ -211,6 +217,11 @@ public String toString() { ", customMetadata=" + customMetadata + ", embeddedMetadata=" + embeddedMetadata + ", extensionStatus=" + extensionStatus + + ", type='" + type + '\'' + + ", mime='" + mime + '\'' + + ", hasAlpha=" + hasAlpha + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + '}'; } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index a897ade..5e2c70b 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -30,8 +30,12 @@ import org.junit.Test; import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URI; import java.net.URL; +import java.net.URLConnection; +import java.net.UnknownHostException; import java.util.*; import java.util.regex.Pattern; @@ -443,10 +447,38 @@ public void getUrl_with_time_expire() { // Test Case for Upload + @Test(expected = UnknownHostException.class) + public void imageKit_upload_expect_UnknownHostException() throws UnknownHostException { + String imageUrl="https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; + try { + URL url = new URL(imageUrl); + + HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection(); + urlConnect.getContent(); + + } catch (UnknownHostException e) { + e.printStackTrace(); + throw e; + } catch (IOException e) { + e.printStackTrace(); + } + } + @Test public void imageKit_upload_returnSuccess() throws IOException, InterruptedException { String imageUrl="https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url = URI.create(imageUrl).toURL(); + URL url = null; + try { + //make a URL to a known source + url = new URL(imageUrl); + + HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection(); + Object objData = urlConnect.getContent(); + + } catch (UnknownHostException e) { + System.out.println("CONNECTION FAILED:==> " + e); + e.printStackTrace(); + } FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); List tags=new ArrayList<>(); tags.add("Software"); @@ -610,7 +642,6 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep "{\"test1\":10}\r\n" + "--boundary--"; assertEquals(json, request.getBody().readUtf8().trim()); -// System.out.println("request.getBody().readUtf8().trim():==> " + request.getBody().readUtf8().trim()); assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java index 560ccb7..3e46cd4 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java @@ -3,6 +3,7 @@ import org.junit.Before; import org.junit.Test; +import java.util.Date; import java.util.List; import static org.junit.Assert.*; @@ -22,7 +23,7 @@ public void setUp() throws Exception { @Test public void constructor_test() { List tags=mock(List.class); - SUT=new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags,true, "0,0,10,20", "image", new JsonArray(), new JsonObject(), new JsonObject(), new JsonObject(), new JsonObject()); + SUT=new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags,true, "0,0,10,20", "image", new JsonArray(), new JsonObject(), new JsonObject(), new JsonObject(), new JsonObject(), "file", "image/jpeg", false, new Date(), new Date()); assertNotNull(SUT); } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 1b029ae..8ca8a5e 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -375,7 +375,7 @@ private static void uploadFromBase64() { private static void uploadFromBytes() { System.out.println(Color.ANSI_CYAN+">> Uploading Image from file:"+Color.ANSI_RESET); System.out.println(">> Start uploading..."); - URL url = App.class.getClassLoader().getResource("i1.jpg"); + URL url = App.class.getClassLoader().getResource("sample1.jpg"); File file=new File(url.getPath()); byte[] bytes= Utils.fileToBytes(file); FileCreateRequest fileCreateRequest =new FileCreateRequest(bytes, "sample_image_th.jpg"); From fcc67cb53426b3e809c446a1d77c88c0ef3d22a4 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 13 Jun 2022 17:29:22 +0530 Subject: [PATCH 049/112] added addTags test for 400 --- .../io/imagekit/sdk/tasks/RestClient.java | 2 +- .../java/io/imagekit/sdk/ImageKitTest.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 4d8a353..4881dc5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -509,8 +509,8 @@ public Result manageTags(TagsRequest tagsRequest, String action) { Response response = client.newCall(request).execute(); String respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); if (response.code() == 200) { + result = new Gson().fromJson(respBody, Result.class); result.setSuccessful(true); result.setRaw(respBody); result.setMessage(response.message().equals("") ? action.equals("removeTags") ? "Removed Tags SuccessFully." : "Added Tags SuccessFully." : response.message()); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 5e2c70b..317d5aa 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -44,6 +44,7 @@ import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; +import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -821,6 +822,39 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { assertFalse(matcher.group(4).trim().isEmpty()); } + @Test + public void add_tags_expected_400_bad_request() throws IOException, InterruptedException { + + List fileIds = new ArrayList<>(); + fileIds.add("mockFileIds"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + + " \"message\": \"mockFileIds is not a valid fileId.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody(tagsResponseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.addTags(tagsRequest); + + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"tags\":[\"tag1\",\"tag2\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); + } + @Test public void add_tags_expectedSuccessWith() throws IOException, InterruptedException { From b31a7a7a5280bc3a827aa3d8fb558342ec07ad7e Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 13 Jun 2022 18:32:12 +0530 Subject: [PATCH 050/112] added test with expected 400 as a response code --- .../io/imagekit/sdk/tasks/RestClient.java | 19 ++- .../java/io/imagekit/sdk/ImageKitTest.java | 157 ++++++++++++++++++ 2 files changed, 168 insertions(+), 8 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 4881dc5..3105d92 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -544,9 +544,10 @@ public Result removeAITags(AITagsRequest aiTagsRequest) { try { Response response = client.newCall(request).execute(); - String respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); + String respBody = ""; if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); result.setSuccessful(true); result.setRaw(respBody); result.setMessage("Removed AITags SuccessFully."); @@ -620,10 +621,11 @@ public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest custom try { Response response = client.newCall(request).execute(); - String respBody=response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - result = new Gson().fromJson(responseBody, Result.class); + String respBody=""; if (response.code()==201){ + respBody = response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + result = new Gson().fromJson(responseBody, Result.class); result.setSuccessful(true); result.setRaw(respBody); if (result.getMessage() == null) { @@ -697,10 +699,11 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom try { Response response = client.newCall(request).execute(); - String respBody=response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - result = new Gson().fromJson(responseBody, Result.class); + String respBody=""; if (response.code()==200){ + respBody=response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + result = new Gson().fromJson(responseBody, Result.class); result.setSuccessful(true); result.setRaw(respBody); if (result.getMessage() == null) { diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 317d5aa..15b5a26 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -881,6 +881,36 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); } + @Test + public void remove_tags_expected_400_bad_request() throws IOException, InterruptedException { + + List fileIds = new ArrayList<>(); + fileIds.add("mockFileIds"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + + " \"message\": \"mockFileIds is not a valid fileId.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody(tagsResponseJson)); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.removeTags(tagsRequest); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"tags\":[\"tag1\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); + } + @Test public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException { @@ -941,6 +971,44 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); } + @Test + public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"A custom metadata field with this name already exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + Result result = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + System.out.println("res:--> " + result.getRaw() ); + System.out.println("res 1:--> " + result.getMap() ); + System.out.println("res 2:--> " + result.getResponseMetaData().getRaw()); + System.out.println("res 3:--> " + result.getResponseMetaData().getMap()); + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + @Test public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException { @@ -980,6 +1048,28 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); } + @Test + public void deleteCustomMetaDataField_400_Expected() throws IOException, InterruptedException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"Your request contains invalid ID parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + Result result = SUT.deleteCustomMetaDataField("fileId"); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/customMetadataFields/fileId HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/fileId"), request.getRequestUrl().toString()); + } + @Test public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException { MockWebServer server = new MockWebServer(); @@ -997,6 +1087,41 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), request.getRequestUrl().toString()); } + @Test + public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"errors\": {\n" + + " \"minLength\": \"not allowed for this type\"\n" + + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + Result result = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"minLength\":10}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); + } + @Test public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException { @@ -1035,6 +1160,38 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); } + @Test + public void removeAITags_400_Expected() throws InterruptedException, IOException { + + List fileIds = new ArrayList<>(); + fileIds.add("mockFileIds"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"mockFileIds is not a valid fileId.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.removeAITags(aiTagsRequest); + RecordedRequest request = server.takeRequest(); + + String aiTagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"AITags\":[\"Font\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(aiTagsRequestJson, utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); + } + @Test public void removeAITags_successExpected() throws InterruptedException, IOException { From f6cc291207ffa9d339d5d749156f9adb6cb0c29a Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 14 Jun 2022 13:00:32 +0530 Subject: [PATCH 051/112] added more test for failure cases --- .../java/io/imagekit/sdk/ImageKitTest.java | 283 ++++++++++++++++++ 1 file changed, 283 insertions(+) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 15b5a26..c7dd2a9 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -1219,6 +1219,35 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); } + @Test + public void copyFile_404_Expected() throws InterruptedException, IOException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/car.jpeg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"No file found with filePath /sample_image.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.copyFile(copyFileRequest); + RecordedRequest request = server.takeRequest(); + + String copyFileRequestJson = "{\"sourceFilePath\":\"/car.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFileRequestJson, utf8RequestBody); + assertEquals(404, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); + } + @Test public void copyFile_successExpected() throws InterruptedException, IOException { @@ -1242,6 +1271,34 @@ public void copyFile_successExpected() throws InterruptedException, IOException assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); } + @Test + public void moveFile_400_Expected() throws InterruptedException, IOException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/"); + moveFileRequest.setDestinationPath("test"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"sourceFilePath parameter is missing.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"MISSING_PARAMETER\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.moveFile(moveFileRequest); + RecordedRequest request = server.takeRequest(); + + String moveFileRequestJson = "{\"sourceFilePath\":\"/\",\"destinationPath\":\"test\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); + } + @Test public void moveFile_successExpected() throws InterruptedException, IOException { @@ -1264,6 +1321,35 @@ public void moveFile_successExpected() throws InterruptedException, IOException assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); } + @Test + public void renameFile_400_Expected() throws InterruptedException, IOException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/"); + renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"Your request is missing filePath parameter\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"MISSING_PARAMETER\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.renameFile(renameFileRequest); + RecordedRequest request = server.takeRequest(); + + String renameFileRequestJson = "{\"filePath\":\"/\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(renameFileRequestJson, utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); + } + @Test public void renameFile_successExpected() throws InterruptedException, IOException { @@ -1287,6 +1373,33 @@ public void renameFile_successExpected() throws InterruptedException, IOExceptio assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); } + @Test + public void createFolder_400_Expected() throws InterruptedException, IOException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("/testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"folderName parameter cannot have a slash.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.createFolder(createFolderRequest); + RecordedRequest request = server.takeRequest(); + + String createFolderRequestJson = "{\"folderName\":\"/testFolder\",\"parentFolderPath\":\"/\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(createFolderRequestJson, utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + @Test public void createFolder_successExpected() throws InterruptedException, IOException { @@ -1309,6 +1422,33 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); } + @Test + public void deleteFolder_404_Expected() throws InterruptedException, IOException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"No folder found with folderPath test/\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FOLDER_NOT_FOUND\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.deleteFolder(deleteFolderRequest); + RecordedRequest request = server.takeRequest(); + + String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(deleteFolderRequestJson, utf8RequestBody); + assertEquals(404, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + @Test public void deleteFolder_successExpected() throws InterruptedException, IOException { @@ -1330,6 +1470,35 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); } + @Test + public void copyFolder_400_Expected() throws InterruptedException, IOException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/"); + copyFolderRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"The parent directory of source and destination folder should be different.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SAME_SOURCE_AND_DESTINATION\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.copyFolder(copyFolderRequest); + RecordedRequest request = server.takeRequest(); + + String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFolderRequestJson, utf8RequestBody); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } + @Test public void copyFolder_successExpected() throws InterruptedException, IOException { @@ -1355,6 +1524,34 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); } + @Test + public void moveFolder_404_Expected() throws InterruptedException, IOException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder/"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"No files & folder found at sourceFolderPath /testFolder/\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.moveFolder(moveFolderRequest); + RecordedRequest request = server.takeRequest(); + + String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder/\",\"destinationPath\":\"/Gallery\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFolderRequestJson, utf8RequestBody); + assertEquals(404, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } + @Test public void moveFolder_successExpected() throws InterruptedException, IOException { @@ -1379,6 +1576,26 @@ public void moveFolder_successExpected() throws InterruptedException, IOExceptio assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); } + @Test + public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(500)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"We have experienced an internal error while processing your request.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.getBulkJobStatus("jobId"); + RecordedRequest request = server.takeRequest(); + + assertEquals(500, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/bulkJobs/jobId HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/jobId"), request.getRequestUrl().toString()); + } + @Test public void getBulkJobStatus_successExpected() throws InterruptedException, IOException { @@ -1398,6 +1615,26 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), request.getRequestUrl().toString()); } + @Test + public void getFileVersions_400_Expected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.getFileVersions("id"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("GET /v1/files/id/versions HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/id/versions"), request.getRequestUrl().toString()); + } + @Test public void getFileVersions_successExpected() throws InterruptedException, IOException { @@ -1468,6 +1705,26 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), request.getRequestUrl().toString()); } + @Test + public void getFileVersionDetails_400_Expected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"Your request contains invalid versionId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "id"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/id HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/id"), request.getRequestUrl().toString()); + } + @Test public void getFileVersionDetails_successExpected() throws InterruptedException, IOException { @@ -1536,6 +1793,32 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), request.getRequestUrl().toString()); } + @Test + public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("id"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue(new MockResponse().setBody("{\n" + + " \"message\": \"The requested file version does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Result result = SUT.deleteFileVersion(deleteFileVersionRequest); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/id HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/id"), request.getRequestUrl().toString()); + } + @Test public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException { From af8d197653aa8e5a75b8105394b007b6d890311c Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 14 Jun 2022 14:34:33 +0530 Subject: [PATCH 052/112] updated readme file --- README.md | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 248 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a9e2f41..5a999ed 100644 --- a/README.md +++ b/README.md @@ -323,10 +323,25 @@ List responseFields=new ArrayList<>(); responseFields.add("tags"); responseFields.add("customCoordinates"); fileCreateRequest.setResponseFields(responseFields); // optional +JsonObject innerObject1 = new JsonObject(); +innerObject1.addProperty("name", "remove-bg"); +innerObject1.add("options", optionsInnerObject); +JsonObject innerObject2 = new JsonObject(); +innerObject2.addProperty("name", "google-auto-tagging"); +innerObject2.addProperty("minConfidence", 10); +innerObject2.addProperty("maxTags", 5); +JsonArray jsonArray = new JsonArray(); +jsonArray.add(innerObject1); +jsonArray.add(innerObject2); +fileCreateRequest.setExtensions(jsonArray); // optional +fileCreateRequest.setWebhookUrl("Your webhook url"); // optional fileCreateRequest.setOverwriteFile(true); // optional fileCreateRequest.setOverwriteAITags(true); // optional fileCreateRequest.setOverwriteTags(true); // optional fileCreateRequest.setOverwriteCustomMetadata(true); // optional +JsonObject jsonObjectCustomMetadata = new JsonObject(); +jsonObjectCustomMetadata.addProperty("test1", 10); +fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); // optional Result result = ImageKit.getInstance().upload(fileCreateRequest); System.out.println("======FINAL RESULT======="); System.out.println(result); @@ -525,7 +540,29 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -**11. Get CustomMetaDataFields** +**11. Remove AI tags** + +Removed AITags using the FileIds and AITags which we want to remove from request as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) + +```java +List fileIds = new ArrayList<>(); +fileIds.add("629f3de17eb0fe4053615450"); +List aiTags = new ArrayList<>(); +aiTags.add("Rectangle"); +AITagsRequest aiTagsRequest =new AITagsRequest(); +aiTagsRequest.setFileIds(fileIds); +aiTagsRequest.setAITags(aiTags); +Result result = ImageKit.getInstance().removeAITags(aiTagsRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**12. Get CustomMetaDataFields** fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) @@ -541,7 +578,7 @@ System.out.println(result.getResponseMetaData().getList()); System.out.println(result.getResultCustomMetaDataFields()); ``` -**12. Create CustomMetaDataFields** +**13. Create CustomMetaDataFields** It creates the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). @@ -565,7 +602,7 @@ System.out.println(result.getResponseMetaData().getMap()); System.out.println(result.getResultCustomMetaDataFields()); ``` -**13. Delete CustomMetaDataFields** +**14. Delete CustomMetaDataFields** It deletes the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/delete-custom-metadata-field). @@ -581,7 +618,7 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -**14. Edit CustomMetaDataFields** +**15. Edit CustomMetaDataFields** It edits the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). @@ -606,6 +643,213 @@ System.out.println(result.getResponseMetaData().getMap()); System.out.println(result.getResultCustomMetaDataFields()); ``` +**16. Delete FileVersion** + +It deletes the FileVersion as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version). +The argument to the `deleteFileVersion()` method accepts the id of file and versionID to delete particular version of the file except current version which we want to be deleted. + +```java +DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); +deleteFileVersionRequest.setFileId("629d95278482ba129fd17c97"); +deleteFileVersionRequest.setVersionId("629d953ebd24e8ceca911a66"); +Result result = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**17. Copy file** + +It Copies the File as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file). +The argument to the `copyFile()` method accepts the sourceFilePath and destinationPath that where we want to be copied it. + +```java +CopyFileRequest copyFileRequest = new CopyFileRequest(); +copyFileRequest.setSourceFilePath("/w2_image.png"); +copyFileRequest.setDestinationPath("/Gallery/"); +copyFileRequest.setIncludeVersions(true); +Result result = ImageKit.getInstance().copyFile(copyFileRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**18. Move file** + +It Moves the File as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/move-file). +The argument to the `moveFile()` method accepts the sourceFilePath and destinationPath that where we want to be moved it. + +```java +MoveFileRequest moveFileRequest = new MoveFileRequest(); +moveFileRequest.setSourceFilePath("/Gallery/w2_image.png"); +moveFileRequest.setDestinationPath("/"); +Result result = ImageKit.getInstance().moveFile(moveFileRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**19. Rename file** + +It Renames the File as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file). +The argument to the `renameFile()` method accepts the filePath for which you wants to rename and newFileName that with which you want to renamed it with purgeCache boolean. + +```java +RenameFileRequest renameFileRequest = new RenameFileRequest(); +renameFileRequest.setFilePath("/w2_image.png"); +renameFileRequest.setNewFileName("w2_image_s.png"); +renameFileRequest.setPurgeCache(true); +Result result = ImageKit.getInstance().renameFile(renameFileRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**20. Create Folder** + +It Creates the Folder as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder). +The argument to the `createFolder()` method accepts the folderName and parentFolderPath. + +```java +RenameFileRequest renameFileRequest = new RenameFileRequest(); +renameFileRequest.setFilePath("/w2_image.png"); +renameFileRequest.setNewFileName("w2_image_s.png"); +renameFileRequest.setPurgeCache(true); +Result result = ImageKit.getInstance().renameFile(renameFileRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**21. Delete Folder** + +It Deletes the Folder as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder). +The argument to the `deleteFolder()` method accepts the folderPath for which the folder has to be deleted. + +```java +DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); +deleteFolderRequest.setFolderPath("/test1"); +Result result = ImageKit.getInstance().deleteFolder(deleteFolderRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**22. Copy Folder** + +It Copies the Folder as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder). +The argument to the `copyFolder()` method accepts the sourceFolderPath, destinationPath and includeVersions for which the folder has to be copied. + +```java +CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); +copyFolderRequest.setSourceFolderPath("/Gallery/test"); +copyFolderRequest.setDestinationPath("/"); +Result result = ImageKit.getInstance().copyFolder(copyFolderRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**23. Move Folder** + +It Moves the Folder as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder). +The argument to the `moveFolder()` method accepts the sourceFolderPath, destinationPath for which the folder has to be moved. + +```java +MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); +moveFolderRequest.setSourceFolderPath("/Gallery/test"); +moveFolderRequest.setDestinationPath("/"); +Result result = ImageKit.getInstance().moveFolder(moveFolderRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**24. Get Bulk Job Status** + +It Gets the Job status as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-move-folder-status). +The argument to the `getBulkJobStatus()` method accepts the jobId for which job has to be get or Fetched the status. + +```java +String jobId = "629f44ac7eb0fe8173622d4b"; +Result result = ImageKit.getInstance().getBulkJobStatus(jobId); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**25. Get File Versions** + +It Gets the File versions as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-versions). +The argument to the `getFileVersions()` method accepts the fileId for which file has to be get or Fetched the versions. + +```java +String fileId = "62a04834c10d49825c6de9e8"; +Result result = ImageKit.getInstance().getFileVersions(fileId); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**26. Get File Version details** + +It Gets the File version details as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-version-details). +The argument to the `getFileVersionDetails()` method accepts the fileId and versionId for which file has to be get or Fetched with particular version. + +```java +String fileId = "62a04834c10d49825c6de9e8"; +String versionId = "62a04834c10d49825c6de9e8"; +Result result = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + + ## Utility functions We have included the following commonly used utility functions in this package. From d197f6d8470f970277b74ccdf217c74778af7f66 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 14 Jun 2022 18:00:39 +0530 Subject: [PATCH 053/112] added changes for fox --- .../main/java/io/imagekit/sdk/ImageKit.java | 4 ++-- .../io/imagekit/sdk/tasks/RestClient.java | 4 ++-- .../java/io/imagekit/sdk/ImageKitTest.java | 2 +- src/main/java/io/imagekit/sampleapp/App.java | 21 +++++++++++++------ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index c8a17c3..4d13c3f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -229,8 +229,8 @@ public Result removeTags(TagsRequest tagsRequest){ * * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema */ - public Result getCustomMetaDataFields() { - return restClient.getCustomMetaDataFields(); + public Result getCustomMetaDataFields(boolean includeDeleted) { + return restClient.getCustomMetaDataFields(includeDeleted); } /** diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 3105d92..7eda119 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -563,7 +563,7 @@ public Result removeAITags(AITagsRequest aiTagsRequest) { return result; } - public Result getCustomMetaDataFields() { + public Result getCustomMetaDataFields(boolean includeDeleted) { Result result = new Result(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -573,7 +573,7 @@ public Result getCustomMetaDataFields() { headers.put("Authorization",credential); request=new Request.Builder() - .url(API_BASE_URL.concat("v1/customMetadataFields")) + .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)) .get() .headers(Headers.of(headers)) .build(); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index c7dd2a9..d621a55 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -964,7 +964,7 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, "]")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getCustomMetaDataFields(); + SUT.getCustomMetaDataFields(false); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals("GET /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 8ca8a5e..f96635f 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -42,7 +42,7 @@ public static void main(String[] args) throws Exception{ // uploadFromURL(); // uploadFromBase64(); - uploadFromBytes(); +// uploadFromBytes(); // getBulkJobStatus(); // deleteFileVersion(); // getFileVersions(); @@ -60,7 +60,7 @@ public static void main(String[] args) throws Exception{ // createCustomMetaDataFields(); // updateCustomMetaDataFields(); // deleteCustomMetaDataField("6296f91191fa57ccc36b15cf"); -// getCustomMetaDataFields(); + getCustomMetaDataFields(); // // calculateDistance(); // generatingAuthParams(); @@ -382,13 +382,14 @@ private static void uploadFromBytes() { fileCreateRequest.setUseUniqueFileName(false); JsonObject optionsInnerObject = new JsonObject(); optionsInnerObject.addProperty("add_shadow", true); + optionsInnerObject.addProperty("bg_colour", "green"); JsonObject innerObject1 = new JsonObject(); innerObject1.addProperty("name", "remove-bg"); innerObject1.add("options", optionsInnerObject); JsonObject innerObject2 = new JsonObject(); innerObject2.addProperty("name", "google-auto-tagging"); - innerObject2.addProperty("minConfidence", 10); - innerObject2.addProperty("maxTags", 5); + innerObject2.addProperty("minConfidence", 5); + innerObject2.addProperty("maxTags", 95); JsonArray jsonArray = new JsonArray(); jsonArray.add(innerObject1); jsonArray.add(innerObject2); @@ -419,6 +420,8 @@ private static void addTags() { tags.add("tag3"); tags.add("tag4"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); + tagsRequest.setFileIds(fileIds); + tagsRequest.setTags(tags); Result result = ImageKit.getInstance().addTags(tagsRequest); System.out.println(">> Add Tags done."); System.out.println(Color.ANSI_GREEN+">> Response add tags:"+Color.ANSI_RESET); @@ -462,7 +465,7 @@ private static void removeAITags() { } private static void getCustomMetaDataFields() { - Result result = ImageKit.getInstance().getCustomMetaDataFields(); + Result result = ImageKit.getInstance().getCustomMetaDataFields(false); System.out.println(">> Fetch CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); @@ -472,10 +475,16 @@ private static void getCustomMetaDataFields() { } private static void createCustomMetaDataFields() { + CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + customMetaDataFieldSchemaObject.setValueRequired(false); + customMetaDataFieldSchemaObject.setMaxValue(2); + customMetaDataFieldSchemaObject.setMinValue(29); + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); customMetaDataFieldCreateRequest.setName("NameCus2"); customMetaDataFieldCreateRequest.setLabel("LabelCm2"); - customMetaDataFieldCreateRequest.setSchema(new CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum.Number, false, 0, 100)); + customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); Result result = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); System.out.println(">> Create CustomMetaDataFields done."); From 1c6003046adc9dd954a4149577d9e46126adfd3b Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 15 Jun 2022 18:51:11 +0530 Subject: [PATCH 054/112] added static model for response --- .../main/java/io/imagekit/sdk/ImageKit.java | 24 +- .../models/results/ResultBulkJobStatus.java | 52 ++++ .../sdk/models/results/ResultEmptyBlock.java | 22 ++ .../results/ResultFileVersionDetails.java | 237 ++++++++++++++++++ .../models/results/ResultFileVersions.java | 35 +++ .../sdk/models/results/ResultNoContent.java | 22 ++ .../models/results/ResultOfFolderActions.java | 32 +++ .../sdk/models/results/ResultRenameFile.java | 32 +++ .../sdk/models/results/ResultTags.java | 34 +++ .../io/imagekit/sdk/tasks/RestClient.java | 201 +++++---------- .../java/io/imagekit/sdk/utils/Utils.java | 2 +- .../java/io/imagekit/sdk/ImageKitTest.java | 48 ++-- src/main/java/io/imagekit/sampleapp/App.java | 104 ++++---- 13 files changed, 623 insertions(+), 222 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 4d13c3f..38661c6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -203,7 +203,7 @@ public int pHashDistance(String firstHex, String secondHex){ * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public Result addTags(TagsRequest tagsRequest){ + public ResultTags addTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "addTags"); } @@ -212,7 +212,7 @@ public Result addTags(TagsRequest tagsRequest){ * @param aiTagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public Result removeAITags(AITagsRequest aiTagsRequest){ + public ResultTags removeAITags(AITagsRequest aiTagsRequest){ return restClient.removeAITags(aiTagsRequest); } @@ -221,7 +221,7 @@ public Result removeAITags(AITagsRequest aiTagsRequest){ * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public Result removeTags(TagsRequest tagsRequest){ + public ResultTags removeTags(TagsRequest tagsRequest){ return restClient.manageTags(tagsRequest, "removeTags"); } @@ -265,7 +265,7 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom * @param deleteFileVersionRequest class * @return Result class */ - public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { return restClient.deleteFileVersion(deleteFileVersionRequest); } @@ -274,7 +274,7 @@ public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionReques * @param copyFileRequest class * @return Result class */ - public Result copyFile(CopyFileRequest copyFileRequest) { + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) { return restClient.copyFile(copyFileRequest); } @@ -283,7 +283,7 @@ public Result copyFile(CopyFileRequest copyFileRequest) { * @param moveFileRequest class * @return Result class */ - public Result moveFile(MoveFileRequest moveFileRequest) { + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) { return restClient.moveFile(moveFileRequest); } @@ -292,7 +292,7 @@ public Result moveFile(MoveFileRequest moveFileRequest) { * @param renameFileRequest class * @return Result class */ - public Result renameFile(RenameFileRequest renameFileRequest) { + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) { return restClient.renameFile(renameFileRequest); } @@ -301,7 +301,7 @@ public Result renameFile(RenameFileRequest renameFileRequest) { * @param createFolderRequest which contains folderPath that is full path to the folder you want to delete * @return Result class */ - public Result createFolder(CreateFolderRequest createFolderRequest) { + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { return restClient.createFolder(createFolderRequest); } @@ -310,7 +310,7 @@ public Result createFolder(CreateFolderRequest createFolderRequest) { * @param deleteFolderRequest which contains folderPath that is full path to the folder you want to delete * @return Result class */ - public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) { return restClient.deleteFolder(deleteFolderRequest); } @@ -319,7 +319,7 @@ public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { * @param copyFolderRequest that contains sourceFolderPath, destinationPath, includeVersions * @return Result class */ - public Result copyFolder(CopyFolderRequest copyFolderRequest) { + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) { return restClient.copyFolder(copyFolderRequest); } @@ -328,7 +328,7 @@ public Result copyFolder(CopyFolderRequest copyFolderRequest) { * @param moveFolderRequest that contains sourceFolderPath, destinationPath * @return Result class */ - public Result moveFolder(MoveFolderRequest moveFolderRequest) { + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) { return restClient.moveFolder(moveFolderRequest); } @@ -337,7 +337,7 @@ public Result moveFolder(MoveFolderRequest moveFolderRequest) { * @param jobId * @return a Result class */ - public Result getBulkJobStatus(String jobId) { + public ResultBulkJobStatus getBulkJobStatus(String jobId) { return restClient.getBulkJobStatus(jobId); } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java new file mode 100644 index 0000000..5e97071 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java @@ -0,0 +1,52 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultBulkJobStatus { + private String jobId; + private String type; + private String status; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultBulkJobStatus{" + + "jobId='" + jobId + '\'' + + ", type='" + type + '\'' + + ", status='" + status + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java new file mode 100644 index 0000000..32f14fe --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java @@ -0,0 +1,22 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultEmptyBlock { + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultEmptyBlock{" + + "responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java new file mode 100644 index 0000000..7dc5096 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java @@ -0,0 +1,237 @@ +package io.imagekit.sdk.models.results; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.List; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultFileVersionDetails { + + protected String type; + protected String name; + protected String createdAt; + protected String updatedAt; + protected String fileId; + protected List tags; + protected JsonArray aiTags; + protected JsonObject versionInfo; + protected JsonObject embeddedMetadata; + protected String customCoordinates; + protected JsonObject customMetadata; + protected boolean isPrivateFile; + protected String url; + protected String thumbnail; + protected String fileType; + protected String filePath; + protected int height; + protected int width; + protected long size; + protected Boolean hasAlpha; + protected String mime; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public JsonArray getAiTags() { + return aiTags; + } + + public void setAiTags(JsonArray aiTags) { + this.aiTags = aiTags; + } + + public JsonObject getVersionInfo() { + return versionInfo; + } + + public void setVersionInfo(JsonObject versionInfo) { + this.versionInfo = versionInfo; + } + + public JsonObject getEmbeddedMetadata() { + return embeddedMetadata; + } + + public void setEmbeddedMetadata(JsonObject embeddedMetadata) { + this.embeddedMetadata = embeddedMetadata; + } + + public String getCustomCoordinates() { + return customCoordinates; + } + + public void setCustomCoordinates(String customCoordinates) { + this.customCoordinates = customCoordinates; + } + + public JsonObject getCustomMetadata() { + return customMetadata; + } + + public void setCustomMetadata(JsonObject customMetadata) { + this.customMetadata = customMetadata; + } + + public boolean isPrivateFile() { + return isPrivateFile; + } + + public void setPrivateFile(boolean privateFile) { + isPrivateFile = privateFile; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public Boolean getHasAlpha() { + return hasAlpha; + } + + public void setHasAlpha(Boolean hasAlpha) { + this.hasAlpha = hasAlpha; + } + + public String getMime() { + return mime; + } + + public void setMime(String mime) { + this.mime = mime; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultFileVersion{" + + "type='" + type + '\'' + + ", name='" + name + '\'' + + ", createdAt='" + createdAt + '\'' + + ", updatedAt='" + updatedAt + '\'' + + ", fileId='" + fileId + '\'' + + ", tags=" + tags + + ", aiTags=" + aiTags + + ", versionInfo=" + versionInfo + + ", embeddedMetadata=" + embeddedMetadata + + ", customCoordinates='" + customCoordinates + '\'' + + ", customMetadata=" + customMetadata + + ", isPrivateFile=" + isPrivateFile + + ", url='" + url + '\'' + + ", thumbnail='" + thumbnail + '\'' + + ", fileType='" + fileType + '\'' + + ", filePath='" + filePath + '\'' + + ", height=" + height + + ", width=" + width + + ", size=" + size + + ", hasAlpha=" + hasAlpha + + ", mime='" + mime + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java new file mode 100644 index 0000000..e0eea2c --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java @@ -0,0 +1,35 @@ +package io.imagekit.sdk.models.results; + +import java.util.ArrayList; +import java.util.List; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultFileVersions { + List resultFileVersionDetailsList = new ArrayList<>(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public List getResultFileVersionDetailsList() { + return resultFileVersionDetailsList; + } + + public void setResultFileVersionDetailsList(List resultFileVersionDetailsList) { + this.resultFileVersionDetailsList = resultFileVersionDetailsList; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultFileVersions{" + + "resultFileVersionDetailsList=" + resultFileVersionDetailsList + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java new file mode 100644 index 0000000..b7fa135 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java @@ -0,0 +1,22 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultNoContent { + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultNoContent{" + + "responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java new file mode 100644 index 0000000..bdc5c58 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java @@ -0,0 +1,32 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultOfFolderActions { + private String jobId; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultOfFolderActions{" + + "jobId='" + jobId + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java new file mode 100644 index 0000000..7fc5018 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java @@ -0,0 +1,32 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultRenameFile { + private String purgeRequestId; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public String getPurgeRequestId() { + return purgeRequestId; + } + + public void setPurgeRequestId(String purgeRequestId) { + this.purgeRequestId = purgeRequestId; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultRenameFile{" + + "purgeRequestId='" + purgeRequestId + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java new file mode 100644 index 0000000..681aab8 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java @@ -0,0 +1,34 @@ +package io.imagekit.sdk.models.results; + +import java.util.List; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultTags { + private List successfullyUpdatedFileIds; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public List getSuccessfullyUpdatedFileIds() { + return successfullyUpdatedFileIds; + } + + public void setSuccessfullyUpdatedFileIds(List successfullyUpdatedFileIds) { + this.successfullyUpdatedFileIds = successfullyUpdatedFileIds; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultTags{" + + "successfullyUpdatedFileIds=" + successfullyUpdatedFileIds + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 7eda119..e61abc1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -490,8 +490,8 @@ else if (response.code()==500) { return result; } - public Result manageTags(TagsRequest tagsRequest, String action) { - Result result = new Result(); + public ResultTags manageTags(TagsRequest tagsRequest, String action) { + ResultTags resultTags = new ResultTags(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); headers.put("Accept-Encoding","application/json"); @@ -507,27 +507,21 @@ public Result manageTags(TagsRequest tagsRequest, String action) { try { Response response = client.newCall(request).execute(); - - String respBody = response.body().string(); - if (response.code() == 200) { - result = new Gson().fromJson(respBody, Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? action.equals("removeTags") ? "Removed Tags SuccessFully." : "Added Tags SuccessFully." : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + String respBody = ""; + if (response.code() == 200 || response.code() == 207) { + respBody = response.body().string(); + resultTags = new Gson().fromJson(respBody, ResultTags.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultTags; } - public Result removeAITags(AITagsRequest aiTagsRequest) { - Result result = new Result(); + public ResultTags removeAITags(AITagsRequest aiTagsRequest) { + ResultTags resultTags = new ResultTags(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); headers.put("Accept-Encoding","application/json"); @@ -543,24 +537,17 @@ public Result removeAITags(AITagsRequest aiTagsRequest) { try { Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { + if (response.code() == 200 || response.code() == 207) { respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage("Removed AITags SuccessFully."); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + resultTags = new Gson().fromJson(respBody, ResultTags.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultTags; } public Result getCustomMetaDataFields(boolean includeDeleted) { @@ -719,8 +706,8 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom return result; } - public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { - Result result = new Result(); + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { + ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -739,27 +726,18 @@ public Result deleteFileVersion(DeleteFileVersionRequest deleteFileVersionReques Response response = client.newCall(request).execute(); String respBody=""; if (response.code()==204){ - respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - if (result.getMessage() == null) { - result.setMessage("File version Deleted SuccessFully."); - } - } else { - String resp=response.body().string(); - result.setSuccessful(false); - result.setRaw(resp); - result.getResponseMetaData().setRaw(resp); + String respString = response.body().string(); + respBody = respString == null ? "" : respString; } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultNoContent; } - public Result copyFile(CopyFileRequest copyFileRequest) { - Result result = new Result(); + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) { + ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -778,24 +756,18 @@ public Result copyFile(CopyFileRequest copyFileRequest) { Response response = client.newCall(request).execute(); String respBody=""; if (response.code()==204){ - respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - if (result.getMessage() == null) { - result.setMessage("File Copied SuccessFully."); - } - } else { - result.setSuccessful(false); + String respString = response.body().string(); + respBody = respString == null ? "" : respString ; } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultNoContent; } - public Result moveFile(MoveFileRequest moveFileRequest) { - Result result = new Result(); + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) { + ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -814,24 +786,18 @@ public Result moveFile(MoveFileRequest moveFileRequest) { Response response = client.newCall(request).execute(); String respBody=""; if (response.code()==204){ - respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - if (result.getMessage() == null) { - result.setMessage("File Moved SuccessFully."); - } - } else { - result.setSuccessful(false); + String respString = response.body().string(); + respBody = respString == null ? "" : respString ; } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultNoContent; } - public Result renameFile(RenameFileRequest renameFileRequest) { - Result result = new Result(); + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) { + ResultRenameFile resultRenameFile = new ResultRenameFile(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -848,25 +814,21 @@ public Result renameFile(RenameFileRequest renameFileRequest) { try { Response response = client.newCall(request).execute(); - String respBody=response.body().string(); + String respBody=""; if (response.code()==200){ - result.setSuccessful(true); - result.setRaw(respBody); - if (result.getMessage() == null) { - result.setMessage("File Renamed SuccessFully."); - } - } else { - result.setSuccessful(false); + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString; + resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultRenameFile; } - public Result createFolder(CreateFolderRequest createFolderRequest) { - Result result = new Result(); + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { + ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -885,24 +847,18 @@ public Result createFolder(CreateFolderRequest createFolderRequest) { Response response = client.newCall(request).execute(); String respBody=""; if (response.code()==201){ - respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - if (result.getMessage() == null) { - result.setMessage("Folder Created SuccessFully."); - } - } else { - result.setSuccessful(false); + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString ; } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultEmptyBlock; } - public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { - Result result = new Result(); + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) { + ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); headers.put("Accept-Encoding","application/json"); @@ -920,23 +876,18 @@ public Result deleteFolder(DeleteFolderRequest deleteFolderRequest) { Response response = client.newCall(request).execute(); String respBody=""; if (response.code()==204){ - respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? "Delete Folder successFully" : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + String respString = response.body().string(); + respBody = respString == null ? "" : respString; } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultNoContent; } - public Result copyFolder(CopyFolderRequest copyFolderRequest) { - Result result = new Result(); + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -957,22 +908,17 @@ public Result copyFolder(CopyFolderRequest copyFolderRequest) { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? "Copy Folder successFully" : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultOfFolderActions; } - public Result moveFolder(MoveFolderRequest moveFolderRequest) { - Result result = new Result(); + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -993,22 +939,17 @@ public Result moveFolder(MoveFolderRequest moveFolderRequest) { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? "Move Folder successFully" : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultOfFolderActions; } - public Result getBulkJobStatus(String jobId) { - Result result = new Result(); + public ResultBulkJobStatus getBulkJobStatus(String jobId) { + ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -1029,26 +970,20 @@ public Result getBulkJobStatus(String jobId) { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? "Fetched bulk Job status successFully" : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultBulkJobStatus; } public Result getFileVersions(String fileId) { Result result = new Result(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); + Map headers=new HashMap<>();headers.put("Accept-Encoding","application/json"); headers.put("Content-Type","application/json"); headers.put("Authorization",credential); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 6071897..d078d51 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -99,7 +99,7 @@ public static Map mapListOfStringToString(Map> responseHeaders) throws IOException { - if (responseCode==200){ + if (responseCode==200 || responseCode==201 || responseCode==204){ responseMetadata.setRaw(respBody); } if (responseHeaders!=null) { diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index d621a55..fc63714 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -842,14 +842,14 @@ public void add_tags_expected_400_bad_request() throws IOException, InterruptedE server.enqueue(new MockResponse().setBody(tagsResponseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.addTags(tagsRequest); + ResultTags resultTags = SUT.addTags(tagsRequest); RecordedRequest request = server.takeRequest(); String tagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"tags\":[\"tag1\",\"tag2\"]}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultTags.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); @@ -899,13 +899,13 @@ public void remove_tags_expected_400_bad_request() throws IOException, Interrupt server.enqueue(new MockResponse().setResponseCode(400)); server.enqueue(new MockResponse().setBody(tagsResponseJson)); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.removeTags(tagsRequest); + ResultTags resultTags = SUT.removeTags(tagsRequest); RecordedRequest request = server.takeRequest(); String tagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"tags\":[\"tag1\"]}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultTags.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); @@ -1180,13 +1180,13 @@ public void removeAITags_400_Expected() throws InterruptedException, IOException "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.removeAITags(aiTagsRequest); + ResultTags resultTags = SUT.removeAITags(aiTagsRequest); RecordedRequest request = server.takeRequest(); String aiTagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"AITags\":[\"Font\"]}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(aiTagsRequestJson, utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultTags.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); @@ -1236,13 +1236,13 @@ public void copyFile_404_Expected() throws InterruptedException, IOException { "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.copyFile(copyFileRequest); + ResultNoContent resultNoContent = SUT.copyFile(copyFileRequest); RecordedRequest request = server.takeRequest(); String copyFileRequestJson = "{\"sourceFilePath\":\"/car.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(copyFileRequestJson, utf8RequestBody); - assertEquals(404, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(404, resultNoContent.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); @@ -1287,14 +1287,14 @@ public void moveFile_400_Expected() throws InterruptedException, IOException { "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.moveFile(moveFileRequest); + ResultNoContent resultNoContent = SUT.moveFile(moveFileRequest); RecordedRequest request = server.takeRequest(); String moveFileRequestJson = "{\"sourceFilePath\":\"/\",\"destinationPath\":\"test\"}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(moveFileRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultNoContent.getResponseMetaData().getHttpStatusCode()); assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); } @@ -1338,13 +1338,13 @@ public void renameFile_400_Expected() throws InterruptedException, IOException { "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.renameFile(renameFileRequest); + ResultRenameFile resultRenameFile = SUT.renameFile(renameFileRequest); RecordedRequest request = server.takeRequest(); String renameFileRequestJson = "{\"filePath\":\"/\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(renameFileRequestJson, utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultRenameFile.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); @@ -1388,13 +1388,13 @@ public void createFolder_400_Expected() throws InterruptedException, IOException "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.createFolder(createFolderRequest); + ResultEmptyBlock resultEmptyBlock = SUT.createFolder(createFolderRequest); RecordedRequest request = server.takeRequest(); String createFolderRequestJson = "{\"folderName\":\"/testFolder\",\"parentFolderPath\":\"/\"}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(createFolderRequestJson, utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultEmptyBlock.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); @@ -1437,13 +1437,13 @@ public void deleteFolder_404_Expected() throws InterruptedException, IOException "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.deleteFolder(deleteFolderRequest); + ResultNoContent resultNoContent = SUT.deleteFolder(deleteFolderRequest); RecordedRequest request = server.takeRequest(); String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(deleteFolderRequestJson, utf8RequestBody); - assertEquals(404, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(404, resultNoContent.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); @@ -1487,13 +1487,13 @@ public void copyFolder_400_Expected() throws InterruptedException, IOException { "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.copyFolder(copyFolderRequest); + ResultOfFolderActions resultOfFolderActions = SUT.copyFolder(copyFolderRequest); RecordedRequest request = server.takeRequest(); String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/\",\"includeVersions\":true}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(copyFolderRequestJson, utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultOfFolderActions.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); @@ -1540,13 +1540,13 @@ public void moveFolder_404_Expected() throws InterruptedException, IOException { "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.moveFolder(moveFolderRequest); + ResultOfFolderActions resultOfFolderActions = SUT.moveFolder(moveFolderRequest); RecordedRequest request = server.takeRequest(); String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder/\",\"destinationPath\":\"/Gallery\"}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(moveFolderRequestJson, utf8RequestBody); - assertEquals(404, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(404, resultOfFolderActions.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); @@ -1587,10 +1587,10 @@ public void getBulkJobStatus_500_Expected() throws InterruptedException, IOExcep "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.getBulkJobStatus("jobId"); + ResultBulkJobStatus resultBulkJobStatus = SUT.getBulkJobStatus("jobId"); RecordedRequest request = server.takeRequest(); - assertEquals(500, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(500, resultBulkJobStatus.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals("GET /v1/bulkJobs/jobId HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/jobId"), request.getRequestUrl().toString()); @@ -1808,13 +1808,13 @@ public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedE "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.deleteFileVersion(deleteFileVersionRequest); + ResultNoContent resultNoContent = SUT.deleteFileVersion(deleteFileVersionRequest); RecordedRequest request = server.takeRequest(); String utf8RequestBody = request.getBody().readUtf8(); assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultNoContent.getResponseMetaData().getHttpStatusCode()); assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/id HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/id"), request.getRequestUrl().toString()); } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index f96635f..5fc1cc8 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -1,6 +1,7 @@ package io.imagekit.sampleapp; +import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -44,7 +45,7 @@ public static void main(String[] args) throws Exception{ // uploadFromBase64(); // uploadFromBytes(); // getBulkJobStatus(); -// deleteFileVersion(); + deleteFileVersion(); // getFileVersions(); // getFileVersionDetails(); // copyFile(); @@ -60,7 +61,7 @@ public static void main(String[] args) throws Exception{ // createCustomMetaDataFields(); // updateCustomMetaDataFields(); // deleteCustomMetaDataField("6296f91191fa57ccc36b15cf"); - getCustomMetaDataFields(); +// getCustomMetaDataFields(); // // calculateDistance(); // generatingAuthParams(); @@ -415,19 +416,18 @@ private static void uploadFromBytes() { private static void addTags() { List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); + fileIds.add("62a46afc0997a24ac1385502"); List tags = new ArrayList<>(); - tags.add("tag3"); - tags.add("tag4"); + tags.add("tag-to-add-4"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); tagsRequest.setFileIds(fileIds); tagsRequest.setTags(tags); - Result result = ImageKit.getInstance().addTags(tagsRequest); + ResultTags resultTags = ImageKit.getInstance().addTags(tagsRequest); System.out.println(">> Add Tags done."); System.out.println(Color.ANSI_GREEN+">> Response add tags:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println(result); + System.out.println(resultTags.getResponseMetaData().getMap()); + System.out.println(resultTags); System.out.println("\n\n"); } @@ -438,12 +438,12 @@ private static void removeTags() { tags.add("tag3"); tags.add("tag4"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); - Result result = ImageKit.getInstance().removeTags(tagsRequest); + ResultTags resultTags = ImageKit.getInstance().removeTags(tagsRequest); System.out.println(">> remove Tags done."); System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println(result); + System.out.println(resultTags.getResponseMetaData().getMap()); + System.out.println(resultTags); System.out.println("\n\n"); } @@ -455,12 +455,12 @@ private static void removeAITags() { AITagsRequest aiTagsRequest =new AITagsRequest(); aiTagsRequest.setFileIds(fileIds); aiTagsRequest.setAITags(aiTags); - Result result = ImageKit.getInstance().removeAITags(aiTagsRequest); + ResultTags resultTags = ImageKit.getInstance().removeAITags(aiTagsRequest); System.out.println(">> remove Tags done."); System.out.println(Color.ANSI_GREEN+">> Response remove aiTags:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println(result); + System.out.println(resultTags.getResponseMetaData().getMap()); + System.out.println(resultTags); System.out.println("\n\n"); } @@ -528,55 +528,55 @@ private static void updateCustomMetaDataFields() { private static void deleteFileVersion() { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d95278482ba129fd17c97"); - deleteFileVersionRequest.setVersionId("629d953ebd24e8ceca911a66"); - Result result = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); + deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); + deleteFileVersionRequest.setVersionId("62a9b446663ef731105951c0"); + ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); System.out.println(">> delete file version done."); System.out.println(Color.ANSI_GREEN+">> Response delete File version :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultNoContent); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultNoContent.getResponseMetaData().getMap()); System.out.println("\n\n"); } private static void copyFile() { CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/w2_image.png"); - copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setSourceFilePath("/new_car.jpg"); + copyFileRequest.setDestinationPath("/demo1/"); copyFileRequest.setIncludeVersions(true); - Result result = ImageKit.getInstance().copyFile(copyFileRequest); + ResultNoContent resultNoContent = ImageKit.getInstance().copyFile(copyFileRequest); System.out.println(">> Copy file done."); System.out.println(Color.ANSI_GREEN+">> Response Copy File :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultNoContent); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultNoContent.getResponseMetaData().getMap()); System.out.println("\n\n"); } private static void moveFile() { MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/Gallery/w2_image.png"); + moveFileRequest.setSourceFilePath("/demo1/new_car.jpg"); moveFileRequest.setDestinationPath("/"); - Result result = ImageKit.getInstance().moveFile(moveFileRequest); + ResultNoContent resultNoContent = ImageKit.getInstance().moveFile(moveFileRequest); System.out.println(">> Move File done."); System.out.println(Color.ANSI_GREEN+">> Response Move File :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultNoContent); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultNoContent.getResponseMetaData().getMap()); System.out.println("\n\n"); } private static void renameFile() { RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/w2_image.png"); - renameFileRequest.setNewFileName("w2_image_s.png"); + renameFileRequest.setFilePath("/new.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); renameFileRequest.setPurgeCache(true); - Result result = ImageKit.getInstance().renameFile(renameFileRequest); + ResultRenameFile resultRenameFile = ImageKit.getInstance().renameFile(renameFileRequest); System.out.println(">> Rename file done."); System.out.println(Color.ANSI_GREEN+">> Response Rename File :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultRenameFile); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultRenameFile.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -584,12 +584,12 @@ private static void createFolder() { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("test1"); createFolderRequest.setParentFolderPath("/"); - Result result = ImageKit.getInstance().createFolder(createFolderRequest); + ResultEmptyBlock resultEmptyBlock = ImageKit.getInstance().createFolder(createFolderRequest); System.out.println(">> Create folder done."); System.out.println(Color.ANSI_GREEN+">> Response Create Folder :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultEmptyBlock); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -597,49 +597,49 @@ private static void deleteFolder() { String folderPath="/test1"; DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath(folderPath); - Result result = ImageKit.getInstance().deleteFolder(deleteFolderRequest); + ResultNoContent resultNoContent = ImageKit.getInstance().deleteFolder(deleteFolderRequest); System.out.println(">> Delete folder done."); System.out.println(Color.ANSI_GREEN+">> Response Delete Folder :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultNoContent); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultNoContent.getResponseMetaData().getMap()); System.out.println("\n\n"); } private static void copyFolder() { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/Gallery/test"); - copyFolderRequest.setDestinationPath("/"); - Result result = ImageKit.getInstance().copyFolder(copyFolderRequest); + copyFolderRequest.setSourceFolderPath("/test1"); + copyFolderRequest.setDestinationPath("/demo1"); + ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().copyFolder(copyFolderRequest); System.out.println(">> Copy folder done."); System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultOfFolderActions); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); System.out.println("\n\n"); } private static void moveFolder() { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/Gallery/test"); + moveFolderRequest.setSourceFolderPath("/demo1/test1"); moveFolderRequest.setDestinationPath("/"); - Result result = ImageKit.getInstance().moveFolder(moveFolderRequest); + ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().moveFolder(moveFolderRequest); System.out.println(">>Move folder done."); System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultOfFolderActions); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); System.out.println("\n\n"); } private static void getBulkJobStatus() { - String jobId = "629f44ac7eb0fe8173622d4b"; - Result result = ImageKit.getInstance().getBulkJobStatus(jobId); + String jobId = "62a9b9d5663ef7fd985c6fcb"; + ResultBulkJobStatus resultBulkJobStatus = ImageKit.getInstance().getBulkJobStatus(jobId); System.out.println(">> Fetch Bulk job status done."); System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultBulkJobStatus); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); System.out.println("\n\n"); } From f7d80a61f3a104c71a77385b5a0fe3b70bd35d08 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 16 Jun 2022 12:45:59 +0530 Subject: [PATCH 055/112] added pending APIs static response model and updated readme for all APIs --- README.md | 162 +++++++++--------- .../main/java/io/imagekit/sdk/ImageKit.java | 12 +- .../results/ResultCustomMetaDataField.java | 67 ++++++++ .../ResultCustomMetaDataFieldList.java | 35 ++++ .../io/imagekit/sdk/tasks/RestClient.java | 103 ++++------- .../java/io/imagekit/sdk/utils/Utils.java | 2 +- .../java/io/imagekit/sdk/ImageKitTest.java | 30 ++-- src/main/java/io/imagekit/sampleapp/App.java | 60 +++---- 8 files changed, 267 insertions(+), 204 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java diff --git a/README.md b/README.md index 5a999ed..abbfddc 100644 --- a/README.md +++ b/README.md @@ -510,15 +510,15 @@ Add tags using the FileIds and tags which we want to add in request as per the List fileIds = new ArrayList<>(); fileIds.add("FileId"); List tags = new ArrayList<>(); -tags.add("tag1"); -tags.add("tag2"); -Result result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "addTags"); +tags.add("tag-to-add-1"); +tags.add("tag-to-add-2"); +ResultTags resultTags=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "addTags"); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultTags); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultTags.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultTags.getResponseMetaData().getMap()); ``` **10. Remove tags** @@ -530,14 +530,15 @@ Removed tags using the FileIds and tags which we want to remove from request as List fileIds = new ArrayList<>(); fileIds.add("FileId"); List tags = new ArrayList<>(); -tags.add("tag1"); -Result result=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "removeTags"); +tags.add("tag-to-remove-1"); +tags.add("tag-to-remove-2"); +ResultTags resultTags=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "removeTags"); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultTags); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultTags.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultTags.getResponseMetaData().getMap()); ``` **11. Remove AI tags** @@ -553,13 +554,13 @@ aiTags.add("Rectangle"); AITagsRequest aiTagsRequest =new AITagsRequest(); aiTagsRequest.setFileIds(fileIds); aiTagsRequest.setAITags(aiTags); -Result result = ImageKit.getInstance().removeAITags(aiTagsRequest); +ResultTags resultTags = ImageKit.getInstance().removeAITags(aiTagsRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultTags); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultTags.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultTags.getResponseMetaData().getMap()); ``` **12. Get CustomMetaDataFields** @@ -568,14 +569,14 @@ fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) ```java -Result result=ImageKit.getInstance().getCustomMetaDataFields(); +ResultCustomMetaDataFieldList resultCustomMetaDataFieldList=ImageKit.getInstance().getCustomMetaDataFields(false); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultCustomMetaDataFieldList); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getList()); -System.out.println(result.getResultCustomMetaDataFields()); +System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList()); +System.out.println(resultCustomMetaDataFieldList.getResultCustomMetaDataFields()); ``` **13. Create CustomMetaDataFields** @@ -592,14 +593,13 @@ CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMe customMetaDataFieldCreateRequest.setName("Name"); customMetaDataFieldCreateRequest.setLabel("Label"); customMetaDataFieldCreateRequest.setSchema(schemaObject); -Result result=ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); +ResultCustomMetaDataField resultCustomMetaDataField=ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultCustomMetaDataField); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); -System.out.println(result.getResultCustomMetaDataFields()); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); ``` **14. Delete CustomMetaDataFields** @@ -609,13 +609,13 @@ It deletes the CustomMetaDataFields as per the The argument to the `deleteCustomMetaDataField()` method accepts the id of customMetaDataField which we want to be deleted. ```java -Result result=ImageKit.getInstance().deleteCustomMetaDataField("id"); +ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField("id"); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultNoContent); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultNoContent.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` **15. Edit CustomMetaDataFields** @@ -633,14 +633,13 @@ CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMe customMetaDataFieldUpdateRequest.setId("id"); customMetaDataFieldUpdateRequest.setLabel("label"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); -Result result=ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); +ResultCustomMetaDataField resultCustomMetaDataField=ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultCustomMetaDataField); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); -System.out.println(result.getResultCustomMetaDataFields()); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); ``` **16. Delete FileVersion** @@ -653,13 +652,13 @@ The argument to the `deleteFileVersion()` method accepts the id of file and vers DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d95278482ba129fd17c97"); deleteFileVersionRequest.setVersionId("629d953ebd24e8ceca911a66"); -Result result = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); +ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultNoContent); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultNoContent.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` **17. Copy file** @@ -673,13 +672,13 @@ CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/w2_image.png"); copyFileRequest.setDestinationPath("/Gallery/"); copyFileRequest.setIncludeVersions(true); -Result result = ImageKit.getInstance().copyFile(copyFileRequest); +ResultNoContent resultNoContent = ImageKit.getInstance().copyFile(copyFileRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultNoContent); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultNoContent.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` **18. Move file** @@ -692,13 +691,13 @@ The argument to the `moveFile()` method accepts the sourceFilePath and destinati MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/Gallery/w2_image.png"); moveFileRequest.setDestinationPath("/"); -Result result = ImageKit.getInstance().moveFile(moveFileRequest); +ResultNoContent resultNoContent = ImageKit.getInstance().moveFile(moveFileRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultNoContent); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultNoContent.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` **19. Rename file** @@ -712,13 +711,13 @@ RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/w2_image.png"); renameFileRequest.setNewFileName("w2_image_s.png"); renameFileRequest.setPurgeCache(true); -Result result = ImageKit.getInstance().renameFile(renameFileRequest); +ResultRenameFile resultRenameFile = ImageKit.getInstance().renameFile(renameFileRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultRenameFile); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultRenameFile.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultRenameFile.getResponseMetaData().getMap()); ``` **20. Create Folder** @@ -728,17 +727,16 @@ It Creates the Folder as per the The argument to the `createFolder()` method accepts the folderName and parentFolderPath. ```java -RenameFileRequest renameFileRequest = new RenameFileRequest(); -renameFileRequest.setFilePath("/w2_image.png"); -renameFileRequest.setNewFileName("w2_image_s.png"); -renameFileRequest.setPurgeCache(true); -Result result = ImageKit.getInstance().renameFile(renameFileRequest); +CreateFolderRequest createFolderRequest = new CreateFolderRequest(); +createFolderRequest.setFolderName("test1"); +createFolderRequest.setParentFolderPath("/"); +ResultEmptyBlock resultEmptyBlock = ImageKit.getInstance().createFolder(createFolderRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultEmptyBlock); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultEmptyBlock.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); ``` **21. Delete Folder** @@ -750,13 +748,13 @@ The argument to the `deleteFolder()` method accepts the folderPath for which the ```java DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("/test1"); -Result result = ImageKit.getInstance().deleteFolder(deleteFolderRequest); +ResultNoContent resultNoContent = ImageKit.getInstance().deleteFolder(deleteFolderRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultNoContent); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultNoContent.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` **22. Copy Folder** @@ -769,13 +767,13 @@ The argument to the `copyFolder()` method accepts the sourceFolderPath, destinat CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/Gallery/test"); copyFolderRequest.setDestinationPath("/"); -Result result = ImageKit.getInstance().copyFolder(copyFolderRequest); +ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().copyFolder(copyFolderRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultOfFolderActions); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultOfFolderActions.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); ``` **23. Move Folder** @@ -788,13 +786,13 @@ The argument to the `moveFolder()` method accepts the sourceFolderPath, destinat MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/Gallery/test"); moveFolderRequest.setDestinationPath("/"); -Result result = ImageKit.getInstance().moveFolder(moveFolderRequest); +ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().moveFolder(moveFolderRequest); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultOfFolderActions); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultOfFolderActions.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); ``` **24. Get Bulk Job Status** @@ -805,13 +803,13 @@ The argument to the `getBulkJobStatus()` method accepts the jobId for which job ```java String jobId = "629f44ac7eb0fe8173622d4b"; -Result result = ImageKit.getInstance().getBulkJobStatus(jobId); +ResultBulkJobStatus resultBulkJobStatus = ImageKit.getInstance().getBulkJobStatus(jobId); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultBulkJobStatus); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultBulkJobStatus.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); ``` **25. Get File Versions** @@ -822,13 +820,13 @@ The argument to the `getFileVersions()` method accepts the fileId for which file ```java String fileId = "62a04834c10d49825c6de9e8"; -Result result = ImageKit.getInstance().getFileVersions(fileId); +ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultFileVersions); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultFileVersions.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultFileVersions.getResponseMetaData().getMap()); ``` **26. Get File Version details** @@ -840,13 +838,13 @@ The argument to the `getFileVersionDetails()` method accepts the fileId and vers ```java String fileId = "62a04834c10d49825c6de9e8"; String versionId = "62a04834c10d49825c6de9e8"; -Result result = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); +ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultFileVersionDetails); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultFileVersionDetails.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); ``` diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 38661c6..35d6165 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -229,7 +229,7 @@ public ResultTags removeTags(TagsRequest tagsRequest){ * * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema */ - public Result getCustomMetaDataFields(boolean includeDeleted) { + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { return restClient.getCustomMetaDataFields(includeDeleted); } @@ -238,7 +238,7 @@ public Result getCustomMetaDataFields(boolean includeDeleted) { * @param customMetaDataFieldCreateRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength * @return ResultCustomMetaData with ResultCustomMetaDataField */ - public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } @@ -247,7 +247,7 @@ public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest custom * @param id is a id of customMetaDataFields * @return Result class */ - public Result deleteCustomMetaDataField(String id){ + public ResultNoContent deleteCustomMetaDataField(String id){ return restClient.deleteCustomMetaDataField(id); } @@ -256,7 +256,7 @@ public Result deleteCustomMetaDataField(String id){ * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's id, schema with type, minLength, maxLength * @return Result class */ - public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { + public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } @@ -346,7 +346,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) { * @param fileId * @return a Result class */ - public Result getFileVersions(String fileId) { + public ResultFileVersions getFileVersions(String fileId) { return restClient.getFileVersions(fileId); } @@ -355,7 +355,7 @@ public Result getFileVersions(String fileId) { * @param fileId & versionId * @return a Result class */ - public Result getFileVersionDetails(String fileId, String versionId) { + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) { return restClient.getFileVersionDetails(fileId, versionId); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java new file mode 100644 index 0000000..e7d12d3 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java @@ -0,0 +1,67 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultCustomMetaDataField { + private String id; + private String name; + private String label; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultCustomMetaDataField() { + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } + + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultCustomMetaDataField{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", label='" + label + '\'' + + ", schema=" + schema + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java new file mode 100644 index 0000000..eafc7f7 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java @@ -0,0 +1,35 @@ +package io.imagekit.sdk.models.results; + +import java.util.List; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultCustomMetaDataFieldList { + + private List resultCustomMetaDataFieldList; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public List getResultCustomMetaDataFieldList() { + return resultCustomMetaDataFieldList; + } + + public void setResultCustomMetaDataFieldList(List resultCustomMetaDataFieldList) { + this.resultCustomMetaDataFieldList = resultCustomMetaDataFieldList; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultCustomMetaDataFieldList{" + + "resultCustomMetaDataFieldList=" + resultCustomMetaDataFieldList + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index e61abc1..fe5a184 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -550,8 +550,8 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) { return resultTags; } - public Result getCustomMetaDataFields(boolean includeDeleted) { - Result result = new Result(); + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { + ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -570,28 +570,24 @@ public Result getCustomMetaDataFields(boolean includeDeleted) { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? "Fetched customMetadata successFully" : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + List resultCustomMetaDataFields=new Gson().fromJson(respBody, new TypeToken>() {}.getType()); + resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultCustomMetaDataFieldList; } - public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { if (customMetaDataFieldCreateRequest.getName() == null) { throw new RuntimeException("Error: Name not provided."); } if (customMetaDataFieldCreateRequest.getLabel() == null) { throw new RuntimeException("Error: Label not provided."); } - Result result = new Result(); + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -612,24 +608,17 @@ public Result createCustomMetaDataFields(CustomMetaDataFieldCreateRequest custom if (response.code()==201){ respBody = response.body().string(); JsonElement responseBody = new JsonParser().parse(respBody); - result = new Gson().fromJson(responseBody, Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - if (result.getMessage() == null) { - result.setMessage("CustomMetaData Created SuccessFully."); - } - } else { - result.setSuccessful(false); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultCustomMetaDataField; } - public Result deleteCustomMetaDataField(String id) { - Result result=new Result(); + public ResultNoContent deleteCustomMetaDataField(String id) { + ResultNoContent resultNoContent=new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); headers.put("Accept-Encoding","application/json"); @@ -648,27 +637,18 @@ public Result deleteCustomMetaDataField(String id) { Response response = client.newCall(request).execute(); String respBody=""; if (response.code()==204){ - respBody = response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage("CustomMetaDataField deleted successfully!"); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - result.setSuccessful(false); + String respString = response.body().string(); + respBody = respString == null ? "" : respString; } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultNoContent; } - public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { - Result result = new Result(); + public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { + ResultCustomMetaDataField result = new ResultCustomMetaDataField(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -686,18 +666,12 @@ public Result updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest custom try { Response response = client.newCall(request).execute(); + System.out.println("response:==> " + response); String respBody=""; if (response.code()==200){ respBody=response.body().string(); JsonElement responseBody = new JsonParser().parse(respBody); - result = new Gson().fromJson(responseBody, Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - if (result.getMessage() == null) { - result.setMessage("CustomMetaData Edited SuccessFully."); - } - } else { - result.setSuccessful(false); + result = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -815,7 +789,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) { try { Response response = client.newCall(request).execute(); String respBody=""; - if (response.code()==200){ + if (response.code()==200 || response.code() == 207){ String respString = response.body().string(); respBody = respString == null || respString.equals("") ? "{}" : respString; resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); @@ -979,8 +953,8 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) { return resultBulkJobStatus; } - public Result getFileVersions(String fileId) { - Result result = new Result(); + public ResultFileVersions getFileVersions(String fileId) { + ResultFileVersions resultFileVersions = new ResultFileVersions(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>();headers.put("Accept-Encoding","application/json"); @@ -1000,28 +974,26 @@ public Result getFileVersions(String fileId) { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? "Fetched File versions successFully" : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + List resultFileVersionDetailsList=new Gson().fromJson(respBody,new TypeToken>() {}.getType()); + resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); + System.out.println("ALL:-->" + resultFileVersions.getResultFileVersionDetailsList()); + System.out.println("1 from ALL:-->" + resultFileVersions.getResultFileVersionDetailsList().get(0)); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultFileVersions; } - public Result getFileVersionDetails(String fileId, String versionId) { + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) { if (fileId == null) { throw new RuntimeException("Error: FileId not provided."); } if (versionId == null) { throw new RuntimeException("Error: versionId not provided."); } - Result result = new Result(); + ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -1042,17 +1014,12 @@ public Result getFileVersionDetails(String fileId, String versionId) { String respBody=""; if (response.code()==200){ respBody=response.body().string(); - result.setSuccessful(true); - result.setRaw(respBody); - result.setMessage(response.message().equals("") ? "Fetched file version details successFully" : response.message()); - } else { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); + resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultFileVersionDetails; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index d078d51..661e602 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -99,7 +99,7 @@ public static Map mapListOfStringToString(Map> responseHeaders) throws IOException { - if (responseCode==200 || responseCode==201 || responseCode==204){ + if (responseCode==200 || responseCode==201 || responseCode==204 || responseCode==207){ responseMetadata.setRaw(respBody); } if (responseHeaders!=null) { diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index fc63714..9717588 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -882,7 +882,7 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept } @Test - public void remove_tags_expected_400_bad_request() throws IOException, InterruptedException { + public void remove_tags_expected_400_bad_request() throws InterruptedException { List fileIds = new ArrayList<>(); fileIds.add("mockFileIds"); @@ -967,8 +967,8 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, SUT.getCustomMetaDataFields(false); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + assertEquals("GET /v1/customMetadataFields?includeDeleted=false HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), request.getRequestUrl().toString()); } @Test @@ -994,15 +994,11 @@ public void createCustomMetaDataFields_expected_400() throws InterruptedExceptio customMetaDataFieldCreateRequest.setLabel("mockLabel"); customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - Result result = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + ResultCustomMetaDataField resultCustomMetaDataField = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); RecordedRequest request = server.takeRequest(); - System.out.println("res:--> " + result.getRaw() ); - System.out.println("res 1:--> " + result.getMap() ); - System.out.println("res 2:--> " + result.getResponseMetaData().getRaw()); - System.out.println("res 3:--> " + result.getResponseMetaData().getMap()); String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); @@ -1059,12 +1055,12 @@ public void deleteCustomMetaDataField_400_Expected() throws IOException, Interru server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.deleteCustomMetaDataField("fileId"); + ResultNoContent resultNoContent = SUT.deleteCustomMetaDataField("fileId"); RecordedRequest request = server.takeRequest(); String utf8RequestBody = request.getBody().readUtf8(); assertEquals("", utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultNoContent.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals("DELETE /v1/customMetadataFields/fileId HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/fileId"), request.getRequestUrl().toString()); @@ -1110,13 +1106,13 @@ public void updateCustomMetaDataFields_400_Expected() throws InterruptedExceptio customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - Result result = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + ResultCustomMetaDataField resultCustomMetaDataField = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); RecordedRequest request = server.takeRequest(); String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"minLength\":10}}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); @@ -1626,11 +1622,11 @@ public void getFileVersions_400_Expected() throws InterruptedException, IOExcept "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.getFileVersions("id"); + ResultFileVersions resultFileVersions = SUT.getFileVersions("id"); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultFileVersions.getResponseMetaData().getHttpStatusCode()); assertEquals("GET /v1/files/id/versions HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/id/versions"), request.getRequestUrl().toString()); } @@ -1716,11 +1712,11 @@ public void getFileVersionDetails_400_Expected() throws InterruptedException, IO "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Result result = SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "id"); + ResultFileVersionDetails resultFileVersionDetails = SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "id"); RecordedRequest request = server.takeRequest(); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals(400, result.getResponseMetaData().getHttpStatusCode()); + assertEquals(400, resultFileVersionDetails.getResponseMetaData().getHttpStatusCode()); assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/id HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/id"), request.getRequestUrl().toString()); } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 5fc1cc8..a048667 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -45,9 +45,9 @@ public static void main(String[] args) throws Exception{ // uploadFromBase64(); // uploadFromBytes(); // getBulkJobStatus(); - deleteFileVersion(); +// deleteFileVersion(); // getFileVersions(); -// getFileVersionDetails(); + getFileVersionDetails(); // copyFile(); // moveFile(); // renameFile(); @@ -465,12 +465,12 @@ private static void removeAITags() { } private static void getCustomMetaDataFields() { - Result result = ImageKit.getInstance().getCustomMetaDataFields(false); + ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = ImageKit.getInstance().getCustomMetaDataFields(false); System.out.println(">> Fetch CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getList()); - System.out.println(result); + System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList()); + System.out.println(resultCustomMetaDataFieldList); System.out.println("\n\n"); } @@ -478,32 +478,32 @@ private static void createCustomMetaDataFields() { CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); customMetaDataFieldSchemaObject.setValueRequired(false); - customMetaDataFieldSchemaObject.setMaxValue(2); - customMetaDataFieldSchemaObject.setMinValue(29); + customMetaDataFieldSchemaObject.setMinValue(10); + customMetaDataFieldSchemaObject.setMaxValue(100); CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("NameCus2"); - customMetaDataFieldCreateRequest.setLabel("LabelCm2"); + customMetaDataFieldCreateRequest.setName("NameHe"); + customMetaDataFieldCreateRequest.setLabel("LabelHe"); customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); - Result result = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); + ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); System.out.println(">> Create CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Response create CustomMetaDataFields :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultCustomMetaDataField.get); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); System.out.println("\n\n"); } private static void deleteCustomMetaDataField(String id) { - Result result=ImageKit.getInstance().deleteCustomMetaDataField(id); + ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField(id); System.out.println(">> CustomMetaDataField deleted..."); System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultNoContent); System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(resultNoContent.getResponseMetaData().getRaw()); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultNoContent.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -513,16 +513,16 @@ private static void updateCustomMetaDataFields() { schemaObject.setMaxValue(200); CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("62a0425ac10d49989f6d1996"); - customMetaDataFieldUpdateRequest.setLabel("LabelCM200"); + customMetaDataFieldUpdateRequest.setId("62aab5a9db4851797a8f8ff9"); + customMetaDataFieldUpdateRequest.setLabel("LabelHE200"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); - Result result = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); System.out.println(">> Edit CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Response edit CustomMetaDataFields :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultCustomMetaDataField); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); System.out.println("\n\n"); } @@ -644,25 +644,25 @@ private static void getBulkJobStatus() { } private static void getFileVersions() { - String fileId = "62a04834c10d49825c6de9e8"; - Result result = ImageKit.getInstance().getFileVersions(fileId); + String fileId = "62a9b446663ef7b5c15951ba"; + ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); System.out.println(">> Fetch Get file versions done."); System.out.println(Color.ANSI_GREEN+">> Response Get file versions :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultFileVersions); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getList()); + System.out.println(resultFileVersions.getResponseMetaData().getList()); System.out.println("\n\n"); } private static void getFileVersionDetails() { - String fileId = "62a04834c10d49825c6de9e8"; - String versionId = "62a04834c10d49825c6de9e8"; - Result result = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); + String fileId = "62a9b446663ef7b5c15951ba"; + String versionId = "62a9b446663ef7b5c15951ba"; + ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); System.out.println(">> Fetch Get file versions details done."); System.out.println(Color.ANSI_GREEN+">> Response Get file versions details :"+Color.ANSI_RESET); - System.out.println(result); + System.out.println(resultFileVersionDetails); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); + System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); System.out.println("\n\n"); } } From b12bca92fc819824ce077e640d58974be7aa8be3 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 16 Jun 2022 18:35:02 +0530 Subject: [PATCH 056/112] added changes for exception based on status code --- .../main/java/io/imagekit/sdk/ImageKit.java | 34 ++-- .../sdk/exceptions/BadRequestException.java | 26 +++ .../sdk/exceptions/ConflictException.java | 26 +++ .../sdk/exceptions/NotFoundException.java | 26 +++ .../exceptions/PartialSuccessException.java | 26 +++ .../imagekit/sdk/models/ResponseMetaData.java | 9 + .../io/imagekit/sdk/tasks/RestClient.java | 178 +++++++++++++++--- .../java/io/imagekit/sdk/utils/Utils.java | 2 +- .../java/io/imagekit/sdk/ImageKitTest.java | 68 +++---- src/main/java/io/imagekit/sampleapp/App.java | 69 +++---- 10 files changed, 356 insertions(+), 108 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 35d6165..f4cf69f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -1,6 +1,10 @@ package io.imagekit.sdk; import io.imagekit.sdk.config.Configuration; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; import io.imagekit.sdk.models.*; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.tasks.Calculation; @@ -203,7 +207,7 @@ public int pHashDistance(String firstHex, String secondHex){ * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags addTags(TagsRequest tagsRequest){ + public ResultTags addTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException { return restClient.manageTags(tagsRequest, "addTags"); } @@ -212,7 +216,7 @@ public ResultTags addTags(TagsRequest tagsRequest){ * @param aiTagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags removeAITags(AITagsRequest aiTagsRequest){ + public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException { return restClient.removeAITags(aiTagsRequest); } @@ -221,7 +225,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest){ * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags removeTags(TagsRequest tagsRequest){ + public ResultTags removeTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException { return restClient.manageTags(tagsRequest, "removeTags"); } @@ -238,7 +242,7 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele * @param customMetaDataFieldCreateRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength * @return ResultCustomMetaData with ResultCustomMetaDataField */ - public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException { return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } @@ -247,7 +251,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldC * @param id is a id of customMetaDataFields * @return Result class */ - public ResultNoContent deleteCustomMetaDataField(String id){ + public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException { return restClient.deleteCustomMetaDataField(id); } @@ -256,7 +260,7 @@ public ResultNoContent deleteCustomMetaDataField(String id){ * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's id, schema with type, minLength, maxLength * @return Result class */ - public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { + public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException { return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } @@ -265,7 +269,7 @@ public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldU * @param deleteFileVersionRequest class * @return Result class */ - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException { return restClient.deleteFileVersion(deleteFileVersionRequest); } @@ -274,7 +278,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers * @param copyFileRequest class * @return Result class */ - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) { + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException { return restClient.copyFile(copyFileRequest); } @@ -283,7 +287,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) { * @param moveFileRequest class * @return Result class */ - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) { + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException { return restClient.moveFile(moveFileRequest); } @@ -292,7 +296,7 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) { * @param renameFileRequest class * @return Result class */ - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) { + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws ConflictException, PartialSuccessException, NotFoundException { return restClient.renameFile(renameFileRequest); } @@ -310,7 +314,7 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { * @param deleteFolderRequest which contains folderPath that is full path to the folder you want to delete * @return Result class */ - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) { + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException { return restClient.deleteFolder(deleteFolderRequest); } @@ -319,7 +323,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) { * @param copyFolderRequest that contains sourceFolderPath, destinationPath, includeVersions * @return Result class */ - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) { + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException { return restClient.copyFolder(copyFolderRequest); } @@ -328,7 +332,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) { * @param moveFolderRequest that contains sourceFolderPath, destinationPath * @return Result class */ - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) { + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException { return restClient.moveFolder(moveFolderRequest); } @@ -346,7 +350,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) { * @param fileId * @return a Result class */ - public ResultFileVersions getFileVersions(String fileId) { + public ResultFileVersions getFileVersions(String fileId) throws NotFoundException { return restClient.getFileVersions(fileId); } @@ -355,7 +359,7 @@ public ResultFileVersions getFileVersions(String fileId) { * @param fileId & versionId * @return a Result class */ - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) { + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException { return restClient.getFileVersionDetails(fileId, versionId); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java new file mode 100644 index 0000000..7695fdf --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java @@ -0,0 +1,26 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class BadRequestException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public BadRequestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "BadRequestException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java new file mode 100644 index 0000000..6b4b46d --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java @@ -0,0 +1,26 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ConflictException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public ConflictException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ConflictException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java new file mode 100644 index 0000000..f90af51 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java @@ -0,0 +1,26 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class NotFoundException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public NotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "NotFoundException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java new file mode 100644 index 0000000..dfd9907 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java @@ -0,0 +1,26 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class PartialSuccessException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public PartialSuccessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "PartialSuccessException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java index 5b9b98d..67a2efe 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -55,4 +55,13 @@ public List getList() { } return new ArrayList<>(); } + + @Override + public String toString() { + return "ResponseMetaData{" + + "raw='" + raw + '\'' + + ", httpStatusCode=" + httpStatusCode + + ", headers=" + headers + + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index fe5a184..c2ce311 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -5,6 +5,10 @@ import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; @@ -20,6 +24,7 @@ import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.RenameFileRequest; +import io.imagekit.sdk.models.ResponseMetaData; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; @@ -490,7 +495,7 @@ else if (response.code()==500) { return result; } - public ResultTags manageTags(TagsRequest tagsRequest, String action) { + public ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotFoundException, PartialSuccessException { ResultTags resultTags = new ResultTags(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -508,19 +513,30 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) { try { Response response = client.newCall(request).execute(); String respBody = ""; - if (response.code() == 200 || response.code() == 207) { + if (response.code() == 200) { respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else { + if (response.code() == 207 || response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + if (response.code() == 207) { + throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + } } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { e.printStackTrace(); } return resultTags; } - public ResultTags removeAITags(AITagsRequest aiTagsRequest) { + public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException { ResultTags resultTags = new ResultTags(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -538,9 +554,21 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) { try { Response response = client.newCall(request).execute(); String respBody = ""; - if (response.code() == 200 || response.code() == 207) { + if (response.code() == 200) { respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else { + if (response.code() == 207 || response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + if (response.code() == 207) { + throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + } } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -580,7 +608,7 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele return resultCustomMetaDataFieldList; } - public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) { + public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException { if (customMetaDataFieldCreateRequest.getName() == null) { throw new RuntimeException("Error: Name not provided."); } @@ -609,6 +637,13 @@ public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldC respBody = response.body().string(); JsonElement responseBody = new JsonParser().parse(respBody); resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + if (response.code() == 400) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -617,7 +652,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldC return resultCustomMetaDataField; } - public ResultNoContent deleteCustomMetaDataField(String id) { + public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException { ResultNoContent resultNoContent=new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -639,6 +674,13 @@ public ResultNoContent deleteCustomMetaDataField(String id) { if (response.code()==204){ String respString = response.body().string(); respBody = respString == null ? "" : respString; + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -647,8 +689,8 @@ public ResultNoContent deleteCustomMetaDataField(String id) { return resultNoContent; } - public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) { - ResultCustomMetaDataField result = new ResultCustomMetaDataField(); + public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException { + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -671,16 +713,28 @@ public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldU if (response.code()==200){ respBody=response.body().string(); JsonElement responseBody = new JsonParser().parse(respBody); - result = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + if (response.code() == 400 || response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + } } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); } - return result; + return resultCustomMetaDataField; } - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) { + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException { ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -702,6 +756,18 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers if (response.code()==204){ String respString = response.body().string(); respBody = respString == null ? "" : respString; + } else { + if (response.code() == 400 || response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + } } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -710,7 +776,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers return resultNoContent; } - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) { + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException { ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -732,6 +798,13 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) { if (response.code()==204){ String respString = response.body().string(); respBody = respString == null ? "" : respString ; + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -740,7 +813,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) { return resultNoContent; } - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) { + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException { ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -762,6 +835,13 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) { if (response.code()==204){ String respString = response.body().string(); respBody = respString == null ? "" : respString ; + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -770,7 +850,7 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) { return resultNoContent; } - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) { + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws PartialSuccessException, ConflictException, NotFoundException { ResultRenameFile resultRenameFile = new ResultRenameFile(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -789,10 +869,25 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) { try { Response response = client.newCall(request).execute(); String respBody=""; - if (response.code()==200 || response.code() == 207){ + if (response.code()==200){ String respString = response.body().string(); respBody = respString == null || respString.equals("") ? "{}" : respString; resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); + } else { + if (response.code() == 207 || response.code() == 404 || response.code() == 409) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + if (response.code() == 207) { + throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 409) { + throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + } } Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -831,7 +926,7 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { return resultEmptyBlock; } - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) { + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException { ResultNoContent resultNoContent = new ResultNoContent(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); Map headers=new HashMap<>(); @@ -852,7 +947,14 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) { if (response.code()==204){ String respString = response.body().string(); respBody = respString == null ? "" : respString; - } + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { e.printStackTrace(); @@ -860,7 +962,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) { return resultNoContent; } - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) { + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException { ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -883,6 +985,13 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) { if (response.code()==200){ respBody=response.body().string(); resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -891,7 +1000,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) { return resultOfFolderActions; } - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) { + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException { ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -914,6 +1023,13 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) { if (response.code()==200){ respBody=response.body().string(); resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -953,7 +1069,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) { return resultBulkJobStatus; } - public ResultFileVersions getFileVersions(String fileId) { + public ResultFileVersions getFileVersions(String fileId) throws NotFoundException { ResultFileVersions resultFileVersions = new ResultFileVersions(); String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); @@ -976,8 +1092,13 @@ public ResultFileVersions getFileVersions(String fileId) { respBody=response.body().string(); List resultFileVersionDetailsList=new Gson().fromJson(respBody,new TypeToken>() {}.getType()); resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); - System.out.println("ALL:-->" + resultFileVersions.getResultFileVersionDetailsList()); - System.out.println("1 from ALL:-->" + resultFileVersions.getResultFileVersionDetailsList().get(0)); + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -986,7 +1107,7 @@ public ResultFileVersions getFileVersions(String fileId) { return resultFileVersions; } - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) { + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException { if (fileId == null) { throw new RuntimeException("Error: FileId not provided."); } @@ -1015,6 +1136,13 @@ public ResultFileVersionDetails getFileVersionDetails(String fileId, String vers if (response.code()==200){ respBody=response.body().string(); resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); + } else { + if (response.code() == 404) { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 661e602..d078d51 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -99,7 +99,7 @@ public static Map mapListOfStringToString(Map> responseHeaders) throws IOException { - if (responseCode==200 || responseCode==201 || responseCode==204 || responseCode==207){ + if (responseCode==200 || responseCode==201 || responseCode==204){ responseMetadata.setRaw(respBody); } if (responseHeaders!=null) { diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 9717588..66a6daf 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -2,6 +2,10 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.constants.Version; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; @@ -31,10 +35,7 @@ import java.io.IOException; import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URI; import java.net.URL; -import java.net.URLConnection; import java.net.UnknownHostException; import java.util.*; import java.util.regex.Pattern; @@ -44,7 +45,6 @@ import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; -import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -823,7 +823,7 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { } @Test - public void add_tags_expected_400_bad_request() throws IOException, InterruptedException { + public void add_tags_expected_400_bad_request() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); fileIds.add("mockFileIds"); @@ -856,7 +856,7 @@ public void add_tags_expected_400_bad_request() throws IOException, InterruptedE } @Test - public void add_tags_expectedSuccessWith() throws IOException, InterruptedException { + public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -882,7 +882,7 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept } @Test - public void remove_tags_expected_400_bad_request() throws InterruptedException { + public void remove_tags_expected_400_bad_request() throws InterruptedException, NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); fileIds.add("mockFileIds"); @@ -912,7 +912,7 @@ public void remove_tags_expected_400_bad_request() throws InterruptedException { } @Test - public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException { + public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -972,7 +972,7 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, } @Test - public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException { + public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + @@ -1006,7 +1006,7 @@ public void createCustomMetaDataFields_expected_400() throws InterruptedExceptio } @Test - public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException { + public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + @@ -1045,7 +1045,7 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep } @Test - public void deleteCustomMetaDataField_400_Expected() throws IOException, InterruptedException { + public void deleteCustomMetaDataField_400_Expected() throws IOException, InterruptedException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400)); server.enqueue(new MockResponse().setBody("{\n" + @@ -1067,7 +1067,7 @@ public void deleteCustomMetaDataField_400_Expected() throws IOException, Interru } @Test - public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException { + public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); @@ -1084,7 +1084,7 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte } @Test - public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException { + public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400)); @@ -1119,7 +1119,7 @@ public void updateCustomMetaDataFields_400_Expected() throws InterruptedExceptio } @Test - public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException { + public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + @@ -1157,7 +1157,7 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep } @Test - public void removeAITags_400_Expected() throws InterruptedException, IOException { + public void removeAITags_400_Expected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException { List fileIds = new ArrayList<>(); fileIds.add("mockFileIds"); @@ -1189,7 +1189,7 @@ public void removeAITags_400_Expected() throws InterruptedException, IOException } @Test - public void removeAITags_successExpected() throws InterruptedException, IOException { + public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1216,7 +1216,7 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept } @Test - public void copyFile_404_Expected() throws InterruptedException, IOException { + public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/car.jpeg"); @@ -1245,7 +1245,7 @@ public void copyFile_404_Expected() throws InterruptedException, IOException { } @Test - public void copyFile_successExpected() throws InterruptedException, IOException { + public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/car_false.jpeg"); @@ -1268,7 +1268,7 @@ public void copyFile_successExpected() throws InterruptedException, IOException } @Test - public void moveFile_400_Expected() throws InterruptedException, IOException { + public void moveFile_400_Expected() throws InterruptedException, IOException, NotFoundException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/"); @@ -1296,7 +1296,7 @@ public void moveFile_400_Expected() throws InterruptedException, IOException { } @Test - public void moveFile_successExpected() throws InterruptedException, IOException { + public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_la.jpg"); @@ -1318,7 +1318,7 @@ public void moveFile_successExpected() throws InterruptedException, IOException } @Test - public void renameFile_400_Expected() throws InterruptedException, IOException { + public void renameFile_400_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/"); @@ -1347,7 +1347,7 @@ public void renameFile_400_Expected() throws InterruptedException, IOException { } @Test - public void renameFile_successExpected() throws InterruptedException, IOException { + public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/car_false.jpeg"); @@ -1419,7 +1419,7 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept } @Test - public void deleteFolder_404_Expected() throws InterruptedException, IOException { + public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("testFolder"); @@ -1446,7 +1446,7 @@ public void deleteFolder_404_Expected() throws InterruptedException, IOException } @Test - public void deleteFolder_successExpected() throws InterruptedException, IOException { + public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("testFolder"); @@ -1467,7 +1467,7 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept } @Test - public void copyFolder_400_Expected() throws InterruptedException, IOException { + public void copyFolder_400_Expected() throws InterruptedException, IOException, NotFoundException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1496,7 +1496,7 @@ public void copyFolder_400_Expected() throws InterruptedException, IOException { } @Test - public void copyFolder_successExpected() throws InterruptedException, IOException { + public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1521,7 +1521,7 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio } @Test - public void moveFolder_404_Expected() throws InterruptedException, IOException { + public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder/"); @@ -1549,7 +1549,7 @@ public void moveFolder_404_Expected() throws InterruptedException, IOException { } @Test - public void moveFolder_successExpected() throws InterruptedException, IOException { + public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder"); @@ -1612,7 +1612,7 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx } @Test - public void getFileVersions_400_Expected() throws InterruptedException, IOException { + public void getFileVersions_400_Expected() throws InterruptedException, IOException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400)); @@ -1632,7 +1632,7 @@ public void getFileVersions_400_Expected() throws InterruptedException, IOExcept } @Test - public void getFileVersions_successExpected() throws InterruptedException, IOException { + public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + @@ -1702,7 +1702,7 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc } @Test - public void getFileVersionDetails_400_Expected() throws InterruptedException, IOException { + public void getFileVersionDetails_400_Expected() throws InterruptedException, IOException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400)); @@ -1722,7 +1722,7 @@ public void getFileVersionDetails_400_Expected() throws InterruptedException, IO } @Test - public void getFileVersionDetails_successExpected() throws InterruptedException, IOException { + public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + @@ -1790,7 +1790,7 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, } @Test - public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException { + public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1816,7 +1816,7 @@ public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedE } @Test - public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException { + public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index a048667..5e857d2 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -1,12 +1,15 @@ package io.imagekit.sampleapp; -import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; @@ -47,7 +50,7 @@ public static void main(String[] args) throws Exception{ // getBulkJobStatus(); // deleteFileVersion(); // getFileVersions(); - getFileVersionDetails(); +// getFileVersionDetails(); // copyFile(); // moveFile(); // renameFile(); @@ -60,7 +63,7 @@ public static void main(String[] args) throws Exception{ // removeAITags(); // createCustomMetaDataFields(); // updateCustomMetaDataFields(); -// deleteCustomMetaDataField("6296f91191fa57ccc36b15cf"); + deleteCustomMetaDataField("629f3de17eb0fe4053615450"); // getCustomMetaDataFields(); // // calculateDistance(); @@ -414,9 +417,9 @@ private static void uploadFromBytes() { System.out.println("\n\n"); } - private static void addTags() { + private static void addTags() throws NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); - fileIds.add("62a46afc0997a24ac1385502"); + fileIds.add("62a9b446663ef7b5c15951ba"); List tags = new ArrayList<>(); tags.add("tag-to-add-4"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); @@ -431,12 +434,11 @@ private static void addTags() { System.out.println("\n\n"); } - private static void removeTags() { + private static void removeTags() throws NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); - tags.add("tag3"); - tags.add("tag4"); + tags.add("tag-to-add-4"); TagsRequest tagsRequest =new TagsRequest(fileIds, tags); ResultTags resultTags = ImageKit.getInstance().removeTags(tagsRequest); System.out.println(">> remove Tags done."); @@ -447,11 +449,11 @@ private static void removeTags() { System.out.println("\n\n"); } - private static void removeAITags() { + private static void removeAITags() throws PartialSuccessException, NotFoundException { List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); + fileIds.add("62a9b446663ef7b5c15951ba"); List aiTags = new ArrayList<>(); - aiTags.add("Rectangle"); + aiTags.add("Shoe"); AITagsRequest aiTagsRequest =new AITagsRequest(); aiTagsRequest.setFileIds(fileIds); aiTagsRequest.setAITags(aiTags); @@ -474,7 +476,7 @@ private static void getCustomMetaDataFields() { System.out.println("\n\n"); } - private static void createCustomMetaDataFields() { + private static void createCustomMetaDataFields() throws BadRequestException { CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); customMetaDataFieldSchemaObject.setValueRequired(false); @@ -482,20 +484,20 @@ private static void createCustomMetaDataFields() { customMetaDataFieldSchemaObject.setMaxValue(100); CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("NameHe"); - customMetaDataFieldCreateRequest.setLabel("LabelHe"); + customMetaDataFieldCreateRequest.setName("NameHe1"); + customMetaDataFieldCreateRequest.setLabel("LabelHe1"); customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); System.out.println(">> Create CustomMetaDataFields done."); System.out.println(Color.ANSI_GREEN+">> Response create CustomMetaDataFields :"+Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField.get); + System.out.println(resultCustomMetaDataField); System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); System.out.println("\n\n"); } - private static void deleteCustomMetaDataField(String id) { + private static void deleteCustomMetaDataField(String id) throws NotFoundException { ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField(id); System.out.println(">> CustomMetaDataField deleted..."); System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); @@ -507,14 +509,15 @@ private static void deleteCustomMetaDataField(String id) { System.out.println("\n\n"); } - private static void updateCustomMetaDataFields() { + private static void updateCustomMetaDataFields() throws BadRequestException, NotFoundException { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); schemaObject.setMinValue(1); schemaObject.setMaxValue(200); + schemaObject.setMinLength(1); CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); customMetaDataFieldUpdateRequest.setId("62aab5a9db4851797a8f8ff9"); - customMetaDataFieldUpdateRequest.setLabel("LabelHE200"); + customMetaDataFieldUpdateRequest.setLabel("LabelHE100"); customMetaDataFieldUpdateRequest.setSchema(schemaObject); ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); @@ -526,10 +529,10 @@ private static void updateCustomMetaDataFields() { System.out.println("\n\n"); } - private static void deleteFileVersion() { + private static void deleteFileVersion() throws BadRequestException, NotFoundException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); - deleteFileVersionRequest.setVersionId("62a9b446663ef731105951c0"); + deleteFileVersionRequest.setVersionId("62aac9b47db937233eee762f"); ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); System.out.println(">> delete file version done."); System.out.println(Color.ANSI_GREEN+">> Response delete File version :"+Color.ANSI_RESET); @@ -539,9 +542,9 @@ private static void deleteFileVersion() { System.out.println("\n\n"); } - private static void copyFile() { + private static void copyFile() throws NotFoundException { CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/new_car.jpg"); + copyFileRequest.setSourceFilePath("/new_car11.jpg"); copyFileRequest.setDestinationPath("/demo1/"); copyFileRequest.setIncludeVersions(true); ResultNoContent resultNoContent = ImageKit.getInstance().copyFile(copyFileRequest); @@ -553,10 +556,10 @@ private static void copyFile() { System.out.println("\n\n"); } - private static void moveFile() { + private static void moveFile() throws NotFoundException { MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/demo1/new_car.jpg"); - moveFileRequest.setDestinationPath("/"); + moveFileRequest.setSourceFilePath("/new_car11.jpg"); + moveFileRequest.setDestinationPath("/demo1"); ResultNoContent resultNoContent = ImageKit.getInstance().moveFile(moveFileRequest); System.out.println(">> Move File done."); System.out.println(Color.ANSI_GREEN+">> Response Move File :"+Color.ANSI_RESET); @@ -566,9 +569,9 @@ private static void moveFile() { System.out.println("\n\n"); } - private static void renameFile() { + private static void renameFile() throws ConflictException, PartialSuccessException, NotFoundException { RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/new.jpg"); + renameFileRequest.setFilePath("/new12.jpg"); renameFileRequest.setNewFileName("new_car.jpg"); renameFileRequest.setPurgeCache(true); ResultRenameFile resultRenameFile = ImageKit.getInstance().renameFile(renameFileRequest); @@ -593,7 +596,7 @@ private static void createFolder() { System.out.println("\n\n"); } - private static void deleteFolder() { + private static void deleteFolder() throws NotFoundException { String folderPath="/test1"; DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath(folderPath); @@ -606,7 +609,7 @@ private static void deleteFolder() { System.out.println("\n\n"); } - private static void copyFolder() { + private static void copyFolder() throws NotFoundException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/test1"); copyFolderRequest.setDestinationPath("/demo1"); @@ -619,7 +622,7 @@ private static void copyFolder() { System.out.println("\n\n"); } - private static void moveFolder() { + private static void moveFolder() throws NotFoundException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/demo1/test1"); moveFolderRequest.setDestinationPath("/"); @@ -643,8 +646,8 @@ private static void getBulkJobStatus() { System.out.println("\n\n"); } - private static void getFileVersions() { - String fileId = "62a9b446663ef7b5c15951ba"; + private static void getFileVersions() throws NotFoundException { + String fileId = "629f3de17eb0fe4053615450"; ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); System.out.println(">> Fetch Get file versions done."); System.out.println(Color.ANSI_GREEN+">> Response Get file versions :"+Color.ANSI_RESET); @@ -654,7 +657,7 @@ private static void getFileVersions() { System.out.println("\n\n"); } - private static void getFileVersionDetails() { + private static void getFileVersionDetails() throws NotFoundException { String fileId = "62a9b446663ef7b5c15951ba"; String versionId = "62a9b446663ef7b5c15951ba"; ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); From c8b0150b5900ae4ddc113a155f87edbafc96efd6 Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 17 Jun 2022 12:27:51 +0530 Subject: [PATCH 057/112] added exception regarding changes in all APIs test --- .../java/io/imagekit/sdk/ImageKitTest.java | 398 ++++++++---------- 1 file changed, 172 insertions(+), 226 deletions(-) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 66a6daf..570e69b 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -822,11 +822,11 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { assertFalse(matcher.group(4).trim().isEmpty()); } - @Test - public void add_tags_expected_400_bad_request() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { + @Test(expected = NotFoundException.class) + public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); - fileIds.add("mockFileIds"); + fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); tags.add("tag1"); tags.add("tag2"); @@ -835,24 +835,18 @@ public void add_tags_expected_400_bad_request() throws IOException, InterruptedE MockWebServer server = new MockWebServer(); String tagsResponseJson = "{\n" + - " \"message\": \"mockFileIds is not a valid fileId.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + + " \"629f3de17eb0fe4053615450\"\n" + + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody(tagsResponseJson)); + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultTags resultTags = SUT.addTags(tagsRequest); - - RecordedRequest request = server.takeRequest(); + SUT.addTags(tagsRequest); - String tagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"tags\":[\"tag1\",\"tag2\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals(400, resultTags.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); + server.takeRequest(); } @Test @@ -881,11 +875,11 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); } - @Test - public void remove_tags_expected_400_bad_request() throws InterruptedException, NotFoundException, PartialSuccessException { + @Test(expected = NotFoundException.class) + public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, PartialSuccessException { List fileIds = new ArrayList<>(); - fileIds.add("mockFileIds"); + fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); tags.add("tag1"); @@ -893,22 +887,16 @@ public void remove_tags_expected_400_bad_request() throws InterruptedException, MockWebServer server = new MockWebServer(); String tagsResponseJson = "{\n" + - " \"message\": \"mockFileIds is not a valid fileId.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + + " \"629f3de17eb0fe4053615450\"\n" + + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody(tagsResponseJson)); + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); RestClient.API_BASE_URL = server.url("/").toString(); - ResultTags resultTags = SUT.removeTags(tagsRequest); - RecordedRequest request = server.takeRequest(); - - String tagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"tags\":[\"tag1\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals(400, resultTags.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); + SUT.removeTags(tagsRequest); + server.takeRequest(); } @Test @@ -971,21 +959,24 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), request.getRequestUrl().toString()); } - @Test + @Test(expected = BadRequestException.class) public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + - " \"message\": \"A custom metadata field with this name already exists\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"errors\": {\n" + + " \"minValue\": \"not allowed for this type\",\n" + + " \"maxValue\": \"not allowed for this type\"\n" + + " }\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody(responseJson)); + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); mockCustomMetaDataFieldSchemaObject.setMinValue(10); mockCustomMetaDataFieldSchemaObject.setMaxValue(100); @@ -1044,26 +1035,18 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); } - @Test - public void deleteCustomMetaDataField_400_Expected() throws IOException, InterruptedException, NotFoundException { + @Test(expected = NotFoundException.class) + public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException { MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"Your request contains invalid ID parameter.\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"No such custom metadata field exists\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultNoContent resultNoContent = SUT.deleteCustomMetaDataField("fileId"); - RecordedRequest request = server.takeRequest(); - - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals(400, resultNoContent.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/customMetadataFields/fileId HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/fileId"), request.getRequestUrl().toString()); + SUT.deleteCustomMetaDataField("6296fd7091fa5768106b808E"); + server.takeRequest(); } @Test @@ -1083,12 +1066,34 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), request.getRequestUrl().toString()); } - @Test + @Test(expected = NotFoundException.class) + public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"No such custom metadata field exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808E"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); + } + + @Test(expected = BadRequestException.class) public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException { MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + + server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + " \"message\": \"Invalid schema object\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"errors\": {\n" + @@ -1106,16 +1111,8 @@ public void updateCustomMetaDataFields_400_Expected() throws InterruptedExceptio customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - ResultCustomMetaDataField resultCustomMetaDataField = SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - RecordedRequest request = server.takeRequest(); - - String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"minLength\":10}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); - assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); } @Test @@ -1156,11 +1153,11 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); } - @Test - public void removeAITags_400_Expected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException { + @Test(expected = NotFoundException.class) + public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException { List fileIds = new ArrayList<>(); - fileIds.add("mockFileIds"); + fileIds.add("629f3de17eb0fe4053615450"); List aiTags = new ArrayList<>(); aiTags.add("Font"); @@ -1169,23 +1166,17 @@ public void removeAITags_400_Expected() throws InterruptedException, IOException aiTagsRequest.setAITags(aiTags); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"mockFileIds is not a valid fileId.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + + " \"629f3de17eb0fe4053615450\"\n" + + " ]\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultTags resultTags = SUT.removeAITags(aiTagsRequest); - RecordedRequest request = server.takeRequest(); - - String aiTagsRequestJson = "{\"fileIds\":[\"mockFileIds\"],\"AITags\":[\"Font\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(aiTagsRequestJson, utf8RequestBody); - assertEquals(400, resultTags.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); + SUT.removeAITags(aiTagsRequest); + server.takeRequest(); } @Test @@ -1215,33 +1206,24 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); } - @Test + @Test(expected = NotFoundException.class) public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException { CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/car.jpeg"); + copyFileRequest.setSourceFilePath("/sample_image.jpg"); copyFileRequest.setDestinationPath("/Gallery/"); copyFileRequest.setIncludeVersions(true); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - server.enqueue(new MockResponse().setBody("{\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + " \"message\": \"No file found with filePath /sample_image.jpg\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultNoContent resultNoContent = SUT.copyFile(copyFileRequest); - RecordedRequest request = server.takeRequest(); - - String copyFileRequestJson = "{\"sourceFilePath\":\"/car.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFileRequestJson, utf8RequestBody); - assertEquals(404, resultNoContent.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); + SUT.copyFile(copyFileRequest); + server.takeRequest(); } @Test @@ -1267,32 +1249,23 @@ public void copyFile_successExpected() throws InterruptedException, IOException, assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); } - @Test - public void moveFile_400_Expected() throws InterruptedException, IOException, NotFoundException { + @Test(expected = NotFoundException.class) + public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException { MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/"); - moveFileRequest.setDestinationPath("test"); + moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); + moveFileRequest.setDestinationPath("/"); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"sourceFilePath parameter is missing.\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"No file found with filePath /demo1/sample_image_th.jpg\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"MISSING_PARAMETER\"\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultNoContent resultNoContent = SUT.moveFile(moveFileRequest); - RecordedRequest request = server.takeRequest(); - - String moveFileRequestJson = "{\"sourceFilePath\":\"/\",\"destinationPath\":\"test\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals(400, resultNoContent.getResponseMetaData().getHttpStatusCode()); - assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); + SUT.moveFile(moveFileRequest); + server.takeRequest(); } @Test @@ -1317,33 +1290,44 @@ public void moveFile_successExpected() throws InterruptedException, IOException, assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); } - @Test - public void renameFile_400_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { + @Test(expected = NotFoundException.class) + public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/"); - renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setFilePath("/sample_image_th.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); renameFileRequest.setPurgeCache(true); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"Your request is missing filePath parameter\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"No file found in media library with filePath /sample_image_th.jpg\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"MISSING_PARAMETER\"\n" + + " \"reason\": \"FILE_MISSING\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultRenameFile resultRenameFile = SUT.renameFile(renameFileRequest); - RecordedRequest request = server.takeRequest(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); + } - String renameFileRequestJson = "{\"filePath\":\"/\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(renameFileRequestJson, utf8RequestBody); - assertEquals(400, resultRenameFile.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); + @Test(expected = ConflictException.class) + public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/new1.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(409).setBody("{\n" + + " \"message\": \"File with name new_car.jpg already exists at the same location.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FILE_ALREADY_EXISTS\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); } @Test @@ -1384,16 +1368,8 @@ public void createFolder_400_Expected() throws InterruptedException, IOException "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultEmptyBlock resultEmptyBlock = SUT.createFolder(createFolderRequest); - RecordedRequest request = server.takeRequest(); - - String createFolderRequestJson = "{\"folderName\":\"/testFolder\",\"parentFolderPath\":\"/\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(createFolderRequestJson, utf8RequestBody); - assertEquals(400, resultEmptyBlock.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + SUT.createFolder(createFolderRequest); + server.takeRequest(); } @Test @@ -1418,31 +1394,22 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); } - @Test + @Test(expected = NotFoundException.class) public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath("testFolder"); + deleteFolderRequest.setFolderPath("/testFolder"); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"No folder found with folderPath test/\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"No folder found with folderPath testFolder/\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"reason\": \"FOLDER_NOT_FOUND\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultNoContent resultNoContent = SUT.deleteFolder(deleteFolderRequest); - RecordedRequest request = server.takeRequest(); - - String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(deleteFolderRequestJson, utf8RequestBody); - assertEquals(404, resultNoContent.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + SUT.deleteFolder(deleteFolderRequest); + server.takeRequest(); } @Test @@ -1466,33 +1433,24 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); } - @Test - public void copyFolder_400_Expected() throws InterruptedException, IOException, NotFoundException { + @Test(expected = NotFoundException.class) + public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); - copyFolderRequest.setDestinationPath("/"); + copyFolderRequest.setDestinationPath("/test"); copyFolderRequest.setIncludeVersions(true); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"The parent directory of source and destination folder should be different.\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"SAME_SOURCE_AND_DESTINATION\"\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultOfFolderActions resultOfFolderActions = SUT.copyFolder(copyFolderRequest); - RecordedRequest request = server.takeRequest(); - - String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/\",\"includeVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFolderRequestJson, utf8RequestBody); - assertEquals(400, resultOfFolderActions.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + SUT.copyFolder(copyFolderRequest); + server.takeRequest(); } @Test @@ -1520,7 +1478,7 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); } - @Test + @Test(expected = NotFoundException.class) public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); @@ -1528,24 +1486,15 @@ public void moveFolder_404_Expected() throws InterruptedException, IOException, moveFolderRequest.setDestinationPath("/Gallery"); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"No files & folder found at sourceFolderPath /testFolder/\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultOfFolderActions resultOfFolderActions = SUT.moveFolder(moveFolderRequest); - RecordedRequest request = server.takeRequest(); - - String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder/\",\"destinationPath\":\"/Gallery\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFolderRequestJson, utf8RequestBody); - assertEquals(404, resultOfFolderActions.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + SUT.moveFolder(moveFolderRequest); + server.takeRequest(); } @Test @@ -1611,25 +1560,18 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), request.getRequestUrl().toString()); } - @Test - public void getFileVersions_400_Expected() throws InterruptedException, IOException, NotFoundException { + @Test(expected = NotFoundException.class) + public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException { MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"The requested asset does not exist.\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultFileVersions resultFileVersions = SUT.getFileVersions("id"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals(400, resultFileVersions.getResponseMetaData().getHttpStatusCode()); - assertEquals("GET /v1/files/id/versions HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/id/versions"), request.getRequestUrl().toString()); - } + SUT.getFileVersions("id"); + server.takeRequest();} @Test public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException { @@ -1701,24 +1643,18 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), request.getRequestUrl().toString()); } - @Test - public void getFileVersionDetails_400_Expected() throws InterruptedException, IOException, NotFoundException { + @Test(expected = NotFoundException.class) + public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException { MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"Your request contains invalid versionId parameter.\",\n" + + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"The requested asset does not exist.\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultFileVersionDetails resultFileVersionDetails = SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "id"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals(400, resultFileVersionDetails.getResponseMetaData().getHttpStatusCode()); - assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/id HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/id"), request.getRequestUrl().toString()); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + server.takeRequest(); } @Test @@ -1789,7 +1725,7 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), request.getRequestUrl().toString()); } - @Test + @Test(expected = BadRequestException.class) public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); @@ -1797,22 +1733,32 @@ public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedE deleteFileVersionRequest.setVersionId("id"); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"The requested file version does not exist.\",\n" + + server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + + " \"message\": \"Your request contains invalid versionId parameter.\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - ResultNoContent resultNoContent = SUT.deleteFileVersion(deleteFileVersionRequest); - RecordedRequest request = server.takeRequest(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); + } - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals(400, resultNoContent.getResponseMetaData().getHttpStatusCode()); - assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/id HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/id"), request.getRequestUrl().toString()); + @Test(expected = NotFoundException.class) + public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("62a9c403d89eedb81721102b"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"The requested file version does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); } @Test From 740bf734e0fb10dea4181613bd09e4f025821362 Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 18 Jun 2022 14:27:23 +0530 Subject: [PATCH 058/112] added changes for code refactoring --- .../main/java/io/imagekit/sdk/ImageKit.java | 30 +- .../java/io/imagekit/sdk/models/BaseFile.java | 1 - .../io/imagekit/sdk/tasks/RestClient.java | 329 +++--------------- .../java/io/imagekit/sdk/utils/Utils.java | 37 +- .../java/io/imagekit/sdk/ImageKitTest.java | 66 ++-- src/main/java/io/imagekit/sampleapp/App.java | 92 +++-- 6 files changed, 179 insertions(+), 376 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index f4cf69f..d229157 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -207,7 +207,7 @@ public int pHashDistance(String firstHex, String secondHex){ * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags addTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException { + public ResultTags addTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { return restClient.manageTags(tagsRequest, "addTags"); } @@ -216,7 +216,7 @@ public ResultTags addTags(TagsRequest tagsRequest) throws NotFoundException, Par * @param aiTagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException { + public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { return restClient.removeAITags(aiTagsRequest); } @@ -225,7 +225,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSucces * @param tagsRequest is a object which contains fileIds and tags as a parameters * @return ArrayList of String */ - public ResultTags removeTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException { + public ResultTags removeTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { return restClient.manageTags(tagsRequest, "removeTags"); } @@ -242,7 +242,7 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele * @param customMetaDataFieldCreateRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength * @return ResultCustomMetaData with ResultCustomMetaDataField */ - public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException { + public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } @@ -251,7 +251,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldC * @param id is a id of customMetaDataFields * @return Result class */ - public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException { + public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { return restClient.deleteCustomMetaDataField(id); } @@ -260,7 +260,7 @@ public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundExcep * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's id, schema with type, minLength, maxLength * @return Result class */ - public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException { + public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } @@ -269,7 +269,7 @@ public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldU * @param deleteFileVersionRequest class * @return Result class */ - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException { + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { return restClient.deleteFileVersion(deleteFileVersionRequest); } @@ -278,7 +278,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers * @param copyFileRequest class * @return Result class */ - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException { + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { return restClient.copyFile(copyFileRequest); } @@ -287,7 +287,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFound * @param moveFileRequest class * @return Result class */ - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException { + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { return restClient.moveFile(moveFileRequest); } @@ -296,7 +296,7 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFound * @param renameFileRequest class * @return Result class */ - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws ConflictException, PartialSuccessException, NotFoundException { + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { return restClient.renameFile(renameFileRequest); } @@ -314,7 +314,7 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { * @param deleteFolderRequest which contains folderPath that is full path to the folder you want to delete * @return Result class */ - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException { + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { return restClient.deleteFolder(deleteFolderRequest); } @@ -323,7 +323,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) thr * @param copyFolderRequest that contains sourceFolderPath, destinationPath, includeVersions * @return Result class */ - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException { + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { return restClient.copyFolder(copyFolderRequest); } @@ -332,7 +332,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) thr * @param moveFolderRequest that contains sourceFolderPath, destinationPath * @return Result class */ - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException { + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { return restClient.moveFolder(moveFolderRequest); } @@ -350,7 +350,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) { * @param fileId * @return a Result class */ - public ResultFileVersions getFileVersions(String fileId) throws NotFoundException { + public ResultFileVersions getFileVersions(String fileId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { return restClient.getFileVersions(fileId); } @@ -359,7 +359,7 @@ public ResultFileVersions getFileVersions(String fileId) throws NotFoundExceptio * @param fileId & versionId * @return a Result class */ - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException { + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { return restClient.getFileVersionDetails(fileId, versionId); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java index 7433a20..ccf5e4f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java @@ -2,7 +2,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.sun.org.apache.xpath.internal.operations.Bool; import java.util.Date; import java.util.List; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index c2ce311..a69da77 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -24,14 +24,12 @@ import io.imagekit.sdk.models.MetaData; import io.imagekit.sdk.models.FileUpdateRequest; import io.imagekit.sdk.models.RenameFileRequest; -import io.imagekit.sdk.models.ResponseMetaData; import io.imagekit.sdk.models.TagsRequest; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.utils.Utils; import okhttp3.*; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -62,13 +60,7 @@ public void setMultipartBuilder(MultipartBuilder builder){ public Result upload(FileCreateRequest fileCreateRequest){ Result result=null; - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); - - System.out.println("Auth:==> " + credential); + Map headers=Utils.getHeaders(imageKit); MultipartBody body=multipartBuilder.build(fileCreateRequest); @@ -106,11 +98,7 @@ else if (response.code()==500) { public Result updateDetail(FileUpdateRequest fileUpdateRequest){ Result result=null; - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/details",fileUpdateRequest.getFileId()); request=new Request.Builder() .url(url) @@ -146,11 +134,7 @@ else if (response.code()==500) { public ResultList getFileList(Map options){ ResultList resultList=new ResultList(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); QueryMaker queryMaker=new QueryMaker(); @@ -197,11 +181,7 @@ else if (response.code()==500) { public Result getFileDetail(String fileId){ Result result=new Result(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/details",fileId); @@ -238,11 +218,7 @@ else if (response.code()==500) { public ResultMetaData getFileMetaData(String fileId){ ResultMetaData result=new ResultMetaData(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/metadata",fileId); @@ -280,11 +256,7 @@ else if (response.code()==500) { public ResultMetaData getRemoteFileMetaData(String url){ ResultMetaData result=new ResultMetaData(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String apiURL="https://api.imagekit.io/v1/metadata?url="+url; @@ -322,11 +294,7 @@ else if (response.code()==500) { public Result deleteFile(String fileId){ Result result=new Result(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s",fileId); @@ -364,11 +332,7 @@ else if (response.code()==500) { public ResultFileDelete bulkDeleteFiles(List fileIds){ ResultFileDelete result=new ResultFileDelete(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url="https://api.imagekit.io/v1/files/batch/deleteByFileIds"; @@ -415,11 +379,7 @@ else if (response.code()==500) { public ResultCache purgeCache(String url){ ResultCache result=new ResultCache(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); request=new Request.Builder() .url("https://api.imagekit.io/v1/files/purge") @@ -456,11 +416,7 @@ else if (response.code()==500) { public ResultCacheStatus getPurgeCacheStatus(String requestId){ ResultCacheStatus result=new ResultCacheStatus(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/purge/%s",requestId); @@ -495,13 +451,9 @@ else if (response.code()==500) { return result; } - public ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotFoundException, PartialSuccessException { + public ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { ResultTags resultTags = new ResultTags(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(tagsRequest)); request=new Request.Builder() @@ -517,17 +469,7 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotF respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); } else { - if (response.code() == 207 || response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - if (response.code() == 207) { - throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 404) { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -536,13 +478,9 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotF return resultTags; } - public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException { + public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { ResultTags resultTags = new ResultTags(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(aiTagsRequest)); request=new Request.Builder() @@ -558,17 +496,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSucces respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); } else { - if (response.code() == 207 || response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - if (response.code() == 207) { - throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 404) { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -581,11 +509,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSucces public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); request=new Request.Builder() .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)) @@ -608,7 +532,7 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele return resultCustomMetaDataFieldList; } - public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException { + public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { if (customMetaDataFieldCreateRequest.getName() == null) { throw new RuntimeException("Error: Name not provided."); } @@ -616,12 +540,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldC throw new RuntimeException("Error: Label not provided."); } ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldCreateRequest)); request=new Request.Builder() @@ -638,12 +557,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldC JsonElement responseBody = new JsonParser().parse(respBody); resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); } else { - if (response.code() == 400) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -652,13 +566,9 @@ public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldC return resultCustomMetaDataField; } - public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException { + public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { ResultNoContent resultNoContent=new ResultNoContent(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,API_BASE_URL.concat("v1/customMetadataFields/%s"),id); @@ -675,12 +585,7 @@ public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundExcep String respString = response.body().string(); respBody = respString == null ? "" : respString; } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -689,14 +594,10 @@ public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundExcep return resultNoContent; } - public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException { + public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldUpdateRequest)); String url=String.format(Locale.US,API_BASE_URL.concat("v1/customMetadataFields/%s"),customMetaDataFieldUpdateRequest.getId()); @@ -708,24 +609,13 @@ public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldU try { Response response = client.newCall(request).execute(); - System.out.println("response:==> " + response); String respBody=""; if (response.code()==200){ respBody=response.body().string(); JsonElement responseBody = new JsonParser().parse(respBody); resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); } else { - if (response.code() == 400 || response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - if (response.code() == 400) { - throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 404) { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -734,14 +624,10 @@ public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldU return resultCustomMetaDataField; } - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException { + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { ResultNoContent resultNoContent = new ResultNoContent(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions/%s"), deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); request=new Request.Builder() @@ -757,17 +643,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers String respString = response.body().string(); respBody = respString == null ? "" : respString; } else { - if (response.code() == 400 || response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - if (response.code() == 400) { - throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 404) { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -776,14 +652,9 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers return resultNoContent; } - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException { + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { ResultNoContent resultNoContent = new ResultNoContent(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFileRequest)); request=new Request.Builder() @@ -799,12 +670,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFound String respString = response.body().string(); respBody = respString == null ? "" : respString ; } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -813,14 +679,9 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFound return resultNoContent; } - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException { + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { ResultNoContent resultNoContent = new ResultNoContent(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFileRequest)); request=new Request.Builder() @@ -836,12 +697,7 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFound String respString = response.body().string(); respBody = respString == null ? "" : respString ; } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -850,14 +706,9 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFound return resultNoContent; } - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws PartialSuccessException, ConflictException, NotFoundException { + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws PartialSuccessException, ConflictException, NotFoundException, BadRequestException { ResultRenameFile resultRenameFile = new ResultRenameFile(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(renameFileRequest)); request=new Request.Builder() @@ -874,20 +725,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws P respBody = respString == null || respString.equals("") ? "{}" : respString; resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); } else { - if (response.code() == 207 || response.code() == 404 || response.code() == 409) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - if (response.code() == 207) { - throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 404) { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 409) { - throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -898,12 +736,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws P public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(createFolderRequest)); request=new Request.Builder() @@ -926,13 +759,9 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { return resultEmptyBlock; } - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException { + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { ResultNoContent resultNoContent = new ResultNoContent(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(deleteFolderRequest)); request=new Request.Builder() @@ -948,12 +777,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) thr String respString = response.body().string(); respBody = respString == null ? "" : respString; } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -962,14 +786,9 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) thr return resultNoContent; } - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException { + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFolderRequest)); @@ -986,12 +805,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) thr respBody=response.body().string(); resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -1000,14 +814,9 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) thr return resultOfFolderActions; } - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException { + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFolderRequest)); @@ -1024,12 +833,7 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) thr respBody=response.body().string(); resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -1041,11 +845,7 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) thr public ResultBulkJobStatus getBulkJobStatus(String jobId) { ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); @@ -1069,13 +869,9 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) { return resultBulkJobStatus; } - public ResultFileVersions getFileVersions(String fileId) throws NotFoundException { + public ResultFileVersions getFileVersions(String fileId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { ResultFileVersions resultFileVersions = new ResultFileVersions(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>();headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions"), fileId); @@ -1093,12 +889,7 @@ public ResultFileVersions getFileVersions(String fileId) throws NotFoundExceptio List resultFileVersionDetailsList=new Gson().fromJson(respBody,new TypeToken>() {}.getType()); resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { @@ -1107,7 +898,7 @@ public ResultFileVersions getFileVersions(String fileId) throws NotFoundExceptio return resultFileVersions; } - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException { + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { if (fileId == null) { throw new RuntimeException("Error: FileId not provided."); } @@ -1115,12 +906,7 @@ public ResultFileVersionDetails getFileVersionDetails(String fileId, String vers throw new RuntimeException("Error: versionId not provided."); } ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); - - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); + Map headers=Utils.getHeaders(imageKit); String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); @@ -1137,12 +923,7 @@ public ResultFileVersionDetails getFileVersionDetails(String fileId, String vers respBody=response.body().string(); resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); } else { - if (response.code() == 404) { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - Utils.populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } + Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index d078d51..b5af3a5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -1,11 +1,19 @@ package io.imagekit.sdk.utils; +import com.google.gson.Gson; + +import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.config.Configuration; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; import io.imagekit.sdk.models.ResponseMetaData; +import io.imagekit.sdk.models.results.ResultCache; +import okhttp3.Credentials; import okhttp3.Response; import java.io.*; -import java.net.URL; import java.util.Base64; import java.util.HashMap; import java.util.List; @@ -109,4 +117,31 @@ public static void populateResponseMetadata(String respBody, ResponseMetaData re responseMetadata.setHttpStatusCode(responseCode); } + public static Map getHeaders(ImageKit imageKit) { + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); + Map headers=new HashMap<>(); + headers.put("Accept-Encoding","application/json"); + headers.put("Content-Type","application/json"); + headers.put("Authorization",credential); + return headers; + } + + public static void throwException(Response response) throws IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + if (response.code() == 207) { + throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 409) { + throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } + } + } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 570e69b..4ad9c40 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -823,7 +823,7 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { } @Test(expected = NotFoundException.class) - public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { + public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -850,7 +850,7 @@ public void add_tags_expected_404() throws IOException, InterruptedException, No } @Test - public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { + public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -876,7 +876,7 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept } @Test(expected = NotFoundException.class) - public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, PartialSuccessException { + public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -900,7 +900,7 @@ public void remove_tags_expected_404_bad_request() throws InterruptedException, } @Test - public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException { + public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -960,7 +960,7 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, } @Test(expected = BadRequestException.class) - public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException { + public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException, PartialSuccessException, NotFoundException, ConflictException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + @@ -997,7 +997,7 @@ public void createCustomMetaDataFields_expected_400() throws InterruptedExceptio } @Test - public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException { + public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException, PartialSuccessException, NotFoundException, ConflictException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + @@ -1036,7 +1036,7 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep } @Test(expected = NotFoundException.class) - public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException { + public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" + @@ -1050,7 +1050,7 @@ public void deleteCustomMetaDataField_404_Expected() throws IOException, Interru } @Test - public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException { + public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); @@ -1067,7 +1067,7 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte } @Test(expected = NotFoundException.class) - public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException { + public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + @@ -1090,7 +1090,7 @@ public void updateCustomMetaDataFields_404_Expected() throws InterruptedExceptio } @Test(expected = BadRequestException.class) - public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException { + public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + @@ -1116,7 +1116,7 @@ public void updateCustomMetaDataFields_400_Expected() throws InterruptedExceptio } @Test - public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException, NotFoundException { + public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + @@ -1154,7 +1154,7 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep } @Test(expected = NotFoundException.class) - public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException { + public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1180,7 +1180,7 @@ public void removeAITags_404_Expected() throws InterruptedException, IOException } @Test - public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException { + public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1207,7 +1207,7 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept } @Test(expected = NotFoundException.class) - public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException { + public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/sample_image.jpg"); @@ -1227,7 +1227,7 @@ public void copyFile_404_Expected() throws InterruptedException, IOException, No } @Test - public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException { + public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/car_false.jpeg"); @@ -1250,7 +1250,7 @@ public void copyFile_successExpected() throws InterruptedException, IOException, } @Test(expected = NotFoundException.class) - public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException { + public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); @@ -1269,7 +1269,7 @@ public void moveFile_404_Expected() throws InterruptedException, IOException, No } @Test - public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException { + public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_la.jpg"); @@ -1291,7 +1291,7 @@ public void moveFile_successExpected() throws InterruptedException, IOException, } @Test(expected = NotFoundException.class) - public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { + public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException, BadRequestException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/sample_image_th.jpg"); @@ -1311,7 +1311,7 @@ public void renameFile_404_Expected() throws InterruptedException, IOException, } @Test(expected = ConflictException.class) - public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { + public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException, BadRequestException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/new1.jpg"); @@ -1331,7 +1331,7 @@ public void renameFile_409_Expected() throws InterruptedException, IOException, } @Test - public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException { + public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException, BadRequestException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/car_false.jpeg"); @@ -1395,7 +1395,7 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept } @Test(expected = NotFoundException.class) - public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { + public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("/testFolder"); @@ -1413,7 +1413,7 @@ public void deleteFolder_404_Expected() throws InterruptedException, IOException } @Test - public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException { + public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("testFolder"); @@ -1434,7 +1434,7 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept } @Test(expected = NotFoundException.class) - public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { + public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1454,7 +1454,7 @@ public void copyFolder_404_Expected() throws InterruptedException, IOException, } @Test - public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException { + public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1479,7 +1479,7 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio } @Test(expected = NotFoundException.class) - public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException { + public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder/"); @@ -1498,7 +1498,7 @@ public void moveFolder_404_Expected() throws InterruptedException, IOException, } @Test - public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException { + public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder"); @@ -1561,7 +1561,7 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx } @Test(expected = NotFoundException.class) - public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException { + public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + @@ -1574,7 +1574,7 @@ public void getFileVersions_404_Expected() throws InterruptedException, IOExcept server.takeRequest();} @Test - public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException { + public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + @@ -1644,7 +1644,7 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc } @Test(expected = NotFoundException.class) - public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException { + public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + @@ -1658,7 +1658,7 @@ public void getFileVersionDetails_404_Expected() throws InterruptedException, IO } @Test - public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException { + public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + @@ -1726,7 +1726,7 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, } @Test(expected = BadRequestException.class) - public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException { + public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1744,7 +1744,7 @@ public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedE } @Test(expected = NotFoundException.class) - public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException { + public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1762,7 +1762,7 @@ public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedE } @Test - public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException { + public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 5e857d2..7efec76 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -44,7 +44,8 @@ public static void main(String[] args) throws Exception{ Configuration config = Utils.getSystemConfig(App.class); imageKit.setConfig(config); -// uploadFromURL(); +// generateUrl(); + uploadFromURL(); // uploadFromBase64(); // uploadFromBytes(); // getBulkJobStatus(); @@ -63,7 +64,7 @@ public static void main(String[] args) throws Exception{ // removeAITags(); // createCustomMetaDataFields(); // updateCustomMetaDataFields(); - deleteCustomMetaDataField("629f3de17eb0fe4053615450"); +// deleteCustomMetaDataField("629f3de17eb0fe4053615450"); // getCustomMetaDataFields(); // // calculateDistance(); @@ -78,19 +79,19 @@ public static void main(String[] args) throws Exception{ // ResultCache resultCache = purgeCache(files.get(0).getUrl()); // getPurgeCacheStatus(resultCache.getRequestId()); // generateUrl(files.get(0)); -// -// // System.out.println(Color.ANSI_CYAN+"Do you want to delete uploaded files? (yes/No): "+Color.ANSI_BLUE); -// // String choice=new Scanner(System.in).nextLine(); -// // if (!"yes".equalsIgnoreCase(choice.trim().toLowerCase())){ -// // System.exit(0); -// // } + + // System.out.println(Color.ANSI_CYAN+"Do you want to delete uploaded files? (yes/No): "+Color.ANSI_BLUE); + // String choice=new Scanner(System.in).nextLine(); + // if (!"yes".equalsIgnoreCase(choice.trim().toLowerCase())){ + // System.exit(0); + // } // System.out.println(Color.ANSI_RESET); // deleteFile(files.get(0).getFileId()); // files.remove(0); // deleteFiles(files); // } - System.exit(0); +// System.exit(0); } private static void generatingAuthParams() { @@ -101,41 +102,31 @@ private static void generatingAuthParams() { System.out.println("\n\n"); } - private static void generateUrl(BaseFile baseFile) { + private static void generateUrl() { System.out.println(Color.ANSI_CYAN+">> URL Generation:"+Color.ANSI_RESET); -// String urlEndpoint=ImageKit.getInstance().getConfig().getUrlEndpoint(); - String urlEndpoint="https://ik.imagekit.io/bowstring/"; + String urlEndpoint=ImageKit.getInstance().getConfig().getUrlEndpoint(); +// String urlEndpoint="https://ik.imagekit.io/bowstring/"; Map queryParam=new HashMap<>(); queryParam.put("v","123"); List> transformation=new ArrayList>(); Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); + scale.put("height","300"); + scale.put("width","300"); transformation.add(scale); - Map rotate=new HashMap<>(); - rotate.put("rotation","90"); - transformation.add(rotate); - - Map format=new HashMap<>(); - format.put("format","jpg"); - format.put("progressive","true"); - format.put("effectSharpen","-"); - format.put("effectContrast","1"); - format.put("blur","5%"); - - transformation.add(format); - - + Map overlay=new HashMap<>(); + overlay.put("overlayImage","logo-white_SJwqB4Nfe.png"); + transformation.add(overlay); Map options=new HashMap(); - options.put("path",baseFile.getFilePath()); + options.put("path", "/default-image.jpg"); options.put("transformation", transformation); - String url1=ImageKit.getInstance().getUrl(options); + String image_url=ImageKit.getInstance().getUrl(options); + System.out.println("url1:==> " + image_url); options.clear(); - options.put("path",baseFile.getFilePath()); + options.put("path", "/default-image.jpg"); options.put("urlEndpoint",urlEndpoint); options.put("queryParameters",queryParam); options.put("transformation", transformation); @@ -149,14 +140,14 @@ private static void generateUrl(BaseFile baseFile) { String url3 = ImageKit.getInstance().getUrl(options); options.clear(); - options.put("src",baseFile.getUrl()); + options.put("src","https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); options.put("queryParameters",queryParam); options.put("transformation",transformation); String url4 = ImageKit.getInstance().getUrl(options); - System.out.println(">> Generated URL #1:\t"+url1); + System.out.println(">> Generated URL #1:\t"+image_url); System.out.println(">> Generated URL #2:\t"+url2); System.out.println(">> Generated URL #3:\t"+url3); System.out.println(">> Generated URL #4:\t"+url4); @@ -330,10 +321,7 @@ private static void uploadFromURL() { } catch (MalformedURLException e) { e.printStackTrace(); } - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-image.jpg"); - fileCreateRequest.setFolder("demo1"); - String customCoordinates="10,10,20,20"; - fileCreateRequest.setCustomCoordinates(customCoordinates); + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-image11.jpg"); List tags=new ArrayList<>(); tags.add("Software"); tags.add("Developer"); @@ -417,7 +405,7 @@ private static void uploadFromBytes() { System.out.println("\n\n"); } - private static void addTags() throws NotFoundException, PartialSuccessException { + private static void addTags() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("62a9b446663ef7b5c15951ba"); List tags = new ArrayList<>(); @@ -434,7 +422,7 @@ private static void addTags() throws NotFoundException, PartialSuccessException System.out.println("\n\n"); } - private static void removeTags() throws NotFoundException, PartialSuccessException { + private static void removeTags() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); @@ -449,7 +437,7 @@ private static void removeTags() throws NotFoundException, PartialSuccessExcepti System.out.println("\n\n"); } - private static void removeAITags() throws PartialSuccessException, NotFoundException { + private static void removeAITags() throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { List fileIds = new ArrayList<>(); fileIds.add("62a9b446663ef7b5c15951ba"); List aiTags = new ArrayList<>(); @@ -476,7 +464,7 @@ private static void getCustomMetaDataFields() { System.out.println("\n\n"); } - private static void createCustomMetaDataFields() throws BadRequestException { + private static void createCustomMetaDataFields() throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); customMetaDataFieldSchemaObject.setValueRequired(false); @@ -497,7 +485,7 @@ private static void createCustomMetaDataFields() throws BadRequestException { System.out.println("\n\n"); } - private static void deleteCustomMetaDataField(String id) throws NotFoundException { + private static void deleteCustomMetaDataField(String id) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField(id); System.out.println(">> CustomMetaDataField deleted..."); System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); @@ -509,7 +497,7 @@ private static void deleteCustomMetaDataField(String id) throws NotFoundExceptio System.out.println("\n\n"); } - private static void updateCustomMetaDataFields() throws BadRequestException, NotFoundException { + private static void updateCustomMetaDataFields() throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); schemaObject.setMinValue(1); schemaObject.setMaxValue(200); @@ -529,7 +517,7 @@ private static void updateCustomMetaDataFields() throws BadRequestException, Not System.out.println("\n\n"); } - private static void deleteFileVersion() throws BadRequestException, NotFoundException { + private static void deleteFileVersion() throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); deleteFileVersionRequest.setVersionId("62aac9b47db937233eee762f"); @@ -542,7 +530,7 @@ private static void deleteFileVersion() throws BadRequestException, NotFoundExce System.out.println("\n\n"); } - private static void copyFile() throws NotFoundException { + private static void copyFile() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/new_car11.jpg"); copyFileRequest.setDestinationPath("/demo1/"); @@ -556,7 +544,7 @@ private static void copyFile() throws NotFoundException { System.out.println("\n\n"); } - private static void moveFile() throws NotFoundException { + private static void moveFile() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_car11.jpg"); moveFileRequest.setDestinationPath("/demo1"); @@ -569,7 +557,7 @@ private static void moveFile() throws NotFoundException { System.out.println("\n\n"); } - private static void renameFile() throws ConflictException, PartialSuccessException, NotFoundException { + private static void renameFile() throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/new12.jpg"); renameFileRequest.setNewFileName("new_car.jpg"); @@ -596,7 +584,7 @@ private static void createFolder() { System.out.println("\n\n"); } - private static void deleteFolder() throws NotFoundException { + private static void deleteFolder() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { String folderPath="/test1"; DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath(folderPath); @@ -609,7 +597,7 @@ private static void deleteFolder() throws NotFoundException { System.out.println("\n\n"); } - private static void copyFolder() throws NotFoundException { + private static void copyFolder() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/test1"); copyFolderRequest.setDestinationPath("/demo1"); @@ -622,7 +610,7 @@ private static void copyFolder() throws NotFoundException { System.out.println("\n\n"); } - private static void moveFolder() throws NotFoundException { + private static void moveFolder() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/demo1/test1"); moveFolderRequest.setDestinationPath("/"); @@ -646,7 +634,7 @@ private static void getBulkJobStatus() { System.out.println("\n\n"); } - private static void getFileVersions() throws NotFoundException { + private static void getFileVersions() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { String fileId = "629f3de17eb0fe4053615450"; ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); System.out.println(">> Fetch Get file versions done."); @@ -657,7 +645,7 @@ private static void getFileVersions() throws NotFoundException { System.out.println("\n\n"); } - private static void getFileVersionDetails() throws NotFoundException { + private static void getFileVersionDetails() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { String fileId = "62a9b446663ef7b5c15951ba"; String versionId = "62a9b446663ef7b5c15951ba"; ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); From 72fb47ba3921019f5f5bdce6a4a881c41b06e7a6 Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 18 Jun 2022 14:57:15 +0530 Subject: [PATCH 059/112] format all files --- .../main/java/io/imagekit/sdk/ImageKit.java | 726 ++-- .../sdk/exceptions/BadRequestException.java | 32 +- .../sdk/exceptions/ConflictException.java | 32 +- .../sdk/exceptions/NotFoundException.java | 34 +- .../exceptions/PartialSuccessException.java | 32 +- .../io/imagekit/sdk/models/AITagsRequest.java | 39 +- .../java/io/imagekit/sdk/models/BaseFile.java | 497 ++- .../imagekit/sdk/models/CopyFileRequest.java | 69 +- .../sdk/models/CopyFolderRequest.java | 69 +- .../sdk/models/CreateFolderRequest.java | 39 +- .../CustomMetaDataFieldCreateRequest.java | 77 +- .../CustomMetaDataFieldSchemaObject.java | 188 +- .../CustomMetaDataFieldUpdateRequest.java | 77 +- .../sdk/models/CustomMetaDataTypeEnum.java | 8 +- .../sdk/models/DeleteFileVersionRequest.java | 39 +- .../sdk/models/DeleteFolderRequest.java | 24 +- .../sdk/models/FileCreateRequest.java | 324 +- .../imagekit/sdk/models/MoveFileRequest.java | 39 +- .../sdk/models/MoveFolderRequest.java | 40 +- .../sdk/models/RenameFileRequest.java | 69 +- .../imagekit/sdk/models/ResponseMetaData.java | 102 +- .../io/imagekit/sdk/models/TagsRequest.java | 59 +- .../imagekit/sdk/models/results/Result.java | 405 +- .../models/results/ResultBulkJobStatus.java | 88 +- .../sdk/models/results/ResultCache.java | 150 +- .../sdk/models/results/ResultCacheStatus.java | 150 +- .../results/ResultCustomMetaDataField.java | 89 +- .../ResultCustomMetaDataFieldList.java | 50 +- .../sdk/models/results/ResultEmptyBlock.java | 24 +- .../sdk/models/results/ResultFileDelete.java | 174 +- .../results/ResultFileVersionDetails.java | 436 ++- .../models/results/ResultFileVersions.java | 50 +- .../sdk/models/results/ResultList.java | 158 +- .../sdk/models/results/ResultMetaData.java | 150 +- .../sdk/models/results/ResultNoContent.java | 24 +- .../models/results/ResultOfFolderActions.java | 39 +- .../sdk/models/results/ResultRenameFile.java | 40 +- .../sdk/models/results/ResultTags.java | 50 +- .../imagekit/sdk/tasks/MultipartBuilder.java | 155 +- .../io/imagekit/sdk/tasks/RestClient.java | 1734 +++++---- .../java/io/imagekit/sdk/utils/Utils.java | 228 +- .../java/io/imagekit/sdk/ImageKitTest.java | 3333 ++++++++--------- .../io/imagekit/sdk/models/BaseFileTest.java | 86 +- .../io/imagekit/sdk/tasks/RestClientTest.java | 980 +++-- src/main/java/io/imagekit/sampleapp/App.java | 1170 +++--- 45 files changed, 6019 insertions(+), 6359 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index d229157..b16b623 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -15,351 +15,383 @@ import java.util.Map; public final class ImageKit { - private static ImageKit imageKit; - private Configuration configuration; - private RestClient restClient; - private ImageKit(){ - configuration=new Configuration(); - } - - /** - * getInstance() method will return single instance all over the application - * @return object ImageKit - */ - public static synchronized ImageKit getInstance(){ - if (imageKit==null) { - imageKit = new ImageKit(); - imageKit.restClient =new RestClient(imageKit); - } - return imageKit; - } - - /** - * setRestClient(RestClient restClient) it takes object of RestClient class - * @param restClient to set restClient - */ - void setRestClient(RestClient restClient){ - this.restClient = restClient; - } - - /** - * setConfig(Configuration config) - * @param config will save new configuration - */ - public void setConfig(Configuration config){ - this.configuration=config; - } - - /** - * getConfig() - * @return it will return current configuration - */ - public Configuration getConfig() { - return configuration; - } - - /** - * - * @param options is a HashMap of Objects it can contains following keys - - * ["path","src","urlEndpoint","transformation", - * "transformationPosition","queryParameters", - * "signed","expireSeconds"] - * where transformation is an List of HashMap, signed is boolean and expireSeconds is integer. - * @return String new generated url - */ - - public String getUrl(Map options){ - return UrlGen.getUrl(options); - } - - - /** - * - * @param fileCreateRequest is a object which contains file and other parameters - * @return object of Result class - */ - public Result upload(FileCreateRequest fileCreateRequest){ - return restClient.upload(fileCreateRequest); - } - - /** - * - * @param fileUpdateRequest is a object which contains parameters and fileId - * @return object of Result class - */ - public Result updateFileDetail(FileUpdateRequest fileUpdateRequest){ - return restClient.updateDetail(fileUpdateRequest); - } - - - /** - * - * @param options is an map it may contain keys [ - * "path", "fileType", "tags", "includeFolder", "name", "limit", "skip"] - * @return ResultList class that contains list of BaseFile - */ - public ResultList getFileList(Map options){ - return restClient.getFileList(options); - } - - /** - * - * @param fileId is a unique file id - * @return Result class - */ - public Result getFileDetail(String fileId){ - return restClient.getFileDetail(fileId); - } - - /** - * - * @param fileId is a unique file id - * @return ResultMetaData class - */ - public ResultMetaData getFileMetadata(String fileId){ - return restClient.getFileMetaData(fileId); - } - - /** - * - * @param url is a remote image url - * @return ResultMetaData class - */ - public ResultMetaData getRemoteFileMetadata(String url){ - return restClient.getRemoteFileMetaData(url); - } - - /** - * - * @param fileId is a unique file id - * @return Result class - */ - public Result deleteFile(String fileId){ - return restClient.deleteFile(fileId); - } - - /** - * - * @param fileIds is a list of unique file id - * @return Result class - */ - public ResultFileDelete bulkDeleteFiles(List fileIds){ - return restClient.bulkDeleteFiles(fileIds); - } - - /** - * - * @param url is image url - * @return ResultCache class - */ - public ResultCache purgeCache(String url){ - return restClient.purgeCache(url); - } - - /** - * - * @param requestId is cache request id - * @return ResultCacheStatus class - */ - public ResultCacheStatus getPurgeCacheStatus(String requestId){ - return restClient.getPurgeCacheStatus(requestId); - } - - /** - * - * @return a map that contains token, expire and signature - */ - public Map getAuthenticationParameters(){ - return Calculation.getAuthenticatedParams(null,0,configuration.getPrivateKey()); - } - - /** - * - * @param token take as a argument - * @return a map that contains token, expire and signature - */ - public Map getAuthenticationParameters(String token){ - return Calculation.getAuthenticatedParams(token,0,configuration.getPrivateKey()); - } - - /** - * - * @param token take as first argument - * @param expire is a Timestamp in milliseconds take as second argument - * @return a map that contains token, expire and signature - */ - public Map getAuthenticationParameters(String token, long expire){ - return Calculation.getAuthenticatedParams(token,expire,configuration.getPrivateKey()); - } - - /** - * firstHex and secondHex must have equal length - * @param firstHex take Hex as a String argument - * @param secondHex take Hex as a String argument - * @return it's distance - */ - public int pHashDistance(String firstHex, String secondHex){ - return Calculation.getHammingDistance(firstHex,secondHex); - } - - /** - * - * @param tagsRequest is a object which contains fileIds and tags as a parameters - * @return ArrayList of String - */ - public ResultTags addTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - return restClient.manageTags(tagsRequest, "addTags"); - } - - /** - * - * @param aiTagsRequest is a object which contains fileIds and tags as a parameters - * @return ArrayList of String - */ - public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { - return restClient.removeAITags(aiTagsRequest); - } - - /** - * - * @param tagsRequest is a object which contains fileIds and tags as a parameters - * @return ArrayList of String - */ - public ResultTags removeTags(TagsRequest tagsRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - return restClient.manageTags(tagsRequest, "removeTags"); - } - - /** - * - * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, label, schema - */ - public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { - return restClient.getCustomMetaDataFields(includeDeleted); - } - - /** - * - * @param customMetaDataFieldCreateRequest that contains CustomMetaDataField's name, label, schema with type, minLength, maxLength - * @return ResultCustomMetaData with ResultCustomMetaDataField - */ - public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { - return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - } - - /** - * - * @param id is a id of customMetaDataFields - * @return Result class - */ - public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - return restClient.deleteCustomMetaDataField(id); - } - - /** - * - * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's id, schema with type, minLength, maxLength - * @return Result class - */ - public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - } - - /** - * - * @param deleteFileVersionRequest class - * @return Result class - */ - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - return restClient.deleteFileVersion(deleteFileVersionRequest); - } - - /** - * - * @param copyFileRequest class - * @return Result class - */ - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - return restClient.copyFile(copyFileRequest); - } - - /** - * - * @param moveFileRequest class - * @return Result class - */ - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - return restClient.moveFile(moveFileRequest); - } - - /** - * - * @param renameFileRequest class - * @return Result class - */ - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { - return restClient.renameFile(renameFileRequest); - } - - /** - * - * @param createFolderRequest which contains folderPath that is full path to the folder you want to delete - * @return Result class - */ - public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { - return restClient.createFolder(createFolderRequest); - } - - /** - * - * @param deleteFolderRequest which contains folderPath that is full path to the folder you want to delete - * @return Result class - */ - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - return restClient.deleteFolder(deleteFolderRequest); - } - - /** - * - * @param copyFolderRequest that contains sourceFolderPath, destinationPath, includeVersions - * @return Result class - */ - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - return restClient.copyFolder(copyFolderRequest); - } - - /** - * - * @param moveFolderRequest that contains sourceFolderPath, destinationPath - * @return Result class - */ - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - return restClient.moveFolder(moveFolderRequest); - } - - /** - * - * @param jobId - * @return a Result class - */ - public ResultBulkJobStatus getBulkJobStatus(String jobId) { - return restClient.getBulkJobStatus(jobId); - } - - /** - * - * @param fileId - * @return a Result class - */ - public ResultFileVersions getFileVersions(String fileId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - return restClient.getFileVersions(fileId); - } - - /** - * - * @param fileId & versionId - * @return a Result class - */ - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - return restClient.getFileVersionDetails(fileId, versionId); - } + private static ImageKit imageKit; + private Configuration configuration; + private RestClient restClient; + + private ImageKit() { + configuration = new Configuration(); + } + + /** + * getInstance() method will return single instance all over the application + * + * @return object ImageKit + */ + public static synchronized ImageKit getInstance() { + if (imageKit == null) { + imageKit = new ImageKit(); + imageKit.restClient = new RestClient(imageKit); + } + return imageKit; + } + + /** + * setRestClient(RestClient restClient) it takes object of RestClient class + * + * @param restClient to set restClient + */ + void setRestClient(RestClient restClient) { + this.restClient = restClient; + } + + /** + * setConfig(Configuration config) + * + * @param config will save new configuration + */ + public void setConfig(Configuration config) { + this.configuration = config; + } + + /** + * getConfig() + * + * @return it will return current configuration + */ + public Configuration getConfig() { + return configuration; + } + + /** + * + * @param options is a HashMap of Objects it can contains following keys - + * ["path","src","urlEndpoint","transformation", + * "transformationPosition","queryParameters", + * "signed","expireSeconds"] where transformation is an List of + * HashMap, signed is boolean and expireSeconds is integer. + * @return String new generated url + */ + + public String getUrl(Map options) { + return UrlGen.getUrl(options); + } + + /** + * + * @param fileCreateRequest is a object which contains file and other parameters + * @return object of Result class + */ + public Result upload(FileCreateRequest fileCreateRequest) { + return restClient.upload(fileCreateRequest); + } + + /** + * + * @param fileUpdateRequest is a object which contains parameters and fileId + * @return object of Result class + */ + public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) { + return restClient.updateDetail(fileUpdateRequest); + } + + /** + * + * @param options is an map it may contain keys [ "path", "fileType", "tags", + * "includeFolder", "name", "limit", "skip"] + * @return ResultList class that contains list of BaseFile + */ + public ResultList getFileList(Map options) { + return restClient.getFileList(options); + } + + /** + * + * @param fileId is a unique file id + * @return Result class + */ + public Result getFileDetail(String fileId) { + return restClient.getFileDetail(fileId); + } + + /** + * + * @param fileId is a unique file id + * @return ResultMetaData class + */ + public ResultMetaData getFileMetadata(String fileId) { + return restClient.getFileMetaData(fileId); + } + + /** + * + * @param url is a remote image url + * @return ResultMetaData class + */ + public ResultMetaData getRemoteFileMetadata(String url) { + return restClient.getRemoteFileMetaData(url); + } + + /** + * + * @param fileId is a unique file id + * @return Result class + */ + public Result deleteFile(String fileId) { + return restClient.deleteFile(fileId); + } + + /** + * + * @param fileIds is a list of unique file id + * @return Result class + */ + public ResultFileDelete bulkDeleteFiles(List fileIds) { + return restClient.bulkDeleteFiles(fileIds); + } + + /** + * + * @param url is image url + * @return ResultCache class + */ + public ResultCache purgeCache(String url) { + return restClient.purgeCache(url); + } + + /** + * + * @param requestId is cache request id + * @return ResultCacheStatus class + */ + public ResultCacheStatus getPurgeCacheStatus(String requestId) { + return restClient.getPurgeCacheStatus(requestId); + } + + /** + * + * @return a map that contains token, expire and signature + */ + public Map getAuthenticationParameters() { + return Calculation.getAuthenticatedParams(null, 0, configuration.getPrivateKey()); + } + + /** + * + * @param token take as a argument + * @return a map that contains token, expire and signature + */ + public Map getAuthenticationParameters(String token) { + return Calculation.getAuthenticatedParams(token, 0, configuration.getPrivateKey()); + } + + /** + * + * @param token take as first argument + * @param expire is a Timestamp in milliseconds take as second argument + * @return a map that contains token, expire and signature + */ + public Map getAuthenticationParameters(String token, long expire) { + return Calculation.getAuthenticatedParams(token, expire, configuration.getPrivateKey()); + } + + /** + * firstHex and secondHex must have equal length + * + * @param firstHex take Hex as a String argument + * @param secondHex take Hex as a String argument + * @return it's distance + */ + public int pHashDistance(String firstHex, String secondHex) { + return Calculation.getHammingDistance(firstHex, secondHex); + } + + /** + * + * @param tagsRequest is a object which contains fileIds and tags as a + * parameters + * @return ArrayList of String + */ + public ResultTags addTags(TagsRequest tagsRequest) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + return restClient.manageTags(tagsRequest, "addTags"); + } + + /** + * + * @param aiTagsRequest is a object which contains fileIds and tags as a + * parameters + * @return ArrayList of String + */ + public ResultTags removeAITags(AITagsRequest aiTagsRequest) + throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + return restClient.removeAITags(aiTagsRequest); + } + + /** + * + * @param tagsRequest is a object which contains fileIds and tags as a + * parameters + * @return ArrayList of String + */ + public ResultTags removeTags(TagsRequest tagsRequest) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + return restClient.manageTags(tagsRequest, "removeTags"); + } + + /** + * + * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, + * label, schema + */ + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { + return restClient.getCustomMetaDataFields(includeDeleted); + } + + /** + * + * @param customMetaDataFieldCreateRequest that contains CustomMetaDataField's + * name, label, schema with type, + * minLength, maxLength + * @return ResultCustomMetaData with ResultCustomMetaDataField + */ + public ResultCustomMetaDataField createCustomMetaDataFields( + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) + throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { + return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + } + + /** + * + * @param id is a id of customMetaDataFields + * @return Result class + */ + public ResultNoContent deleteCustomMetaDataField(String id) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + return restClient.deleteCustomMetaDataField(id); + } + + /** + * + * @param customMetaDataFieldUpdateRequest that contains CustomMetaDataField's + * id, schema with type, minLength, + * maxLength + * @return Result class + */ + public ResultCustomMetaDataField updateCustomMetaDataFields( + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + } + + /** + * + * @param deleteFileVersionRequest class + * @return Result class + */ + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + return restClient.deleteFileVersion(deleteFileVersionRequest); + } + + /** + * + * @param copyFileRequest class + * @return Result class + */ + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + return restClient.copyFile(copyFileRequest); + } + + /** + * + * @param moveFileRequest class + * @return Result class + */ + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + return restClient.moveFile(moveFileRequest); + } + + /** + * + * @param renameFileRequest class + * @return Result class + */ + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) + throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { + return restClient.renameFile(renameFileRequest); + } + + /** + * + * @param createFolderRequest which contains folderPath that is full path to the + * folder you want to delete + * @return Result class + */ + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { + return restClient.createFolder(createFolderRequest); + } + + /** + * + * @param deleteFolderRequest which contains folderPath that is full path to the + * folder you want to delete + * @return Result class + */ + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + return restClient.deleteFolder(deleteFolderRequest); + } + + /** + * + * @param copyFolderRequest that contains sourceFolderPath, destinationPath, + * includeVersions + * @return Result class + */ + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + return restClient.copyFolder(copyFolderRequest); + } + + /** + * + * @param moveFolderRequest that contains sourceFolderPath, destinationPath + * @return Result class + */ + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + return restClient.moveFolder(moveFolderRequest); + } + + /** + * + * @param jobId + * @return a Result class + */ + public ResultBulkJobStatus getBulkJobStatus(String jobId) { + return restClient.getBulkJobStatus(jobId); + } + + /** + * + * @param fileId + * @return a Result class + */ + public ResultFileVersions getFileVersions(String fileId) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + return restClient.getFileVersions(fileId); + } + + /** + * + * @param fileId & versionId + * @return a Result class + */ + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + return restClient.getFileVersionDetails(fileId, versionId); + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java index 7695fdf..e96571d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java @@ -4,23 +4,21 @@ public class BadRequestException extends Exception { - private String message; - private String help; - private ResponseMetaData responseMetaData; + private String message; + private String help; + private ResponseMetaData responseMetaData; - public BadRequestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { - super(message, cause, enableSuppression, writableStackTrace); - this.message = message1; - this.help = help; - this.responseMetaData = responseMetaData; - } + public BadRequestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "BadRequestException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "BadRequestException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" + + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java index 6b4b46d..2734bab 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ConflictException.java @@ -4,23 +4,21 @@ public class ConflictException extends Exception { - private String message; - private String help; - private ResponseMetaData responseMetaData; + private String message; + private String help; + private ResponseMetaData responseMetaData; - public ConflictException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { - super(message, cause, enableSuppression, writableStackTrace); - this.message = message1; - this.help = help; - this.responseMetaData = responseMetaData; - } + public ConflictException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "ConflictException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "ConflictException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" + + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java index f90af51..7e79429 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java @@ -3,24 +3,22 @@ import io.imagekit.sdk.models.ResponseMetaData; public class NotFoundException extends Exception { - - private String message; - private String help; - private ResponseMetaData responseMetaData; - public NotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { - super(message, cause, enableSuppression, writableStackTrace); - this.message = message1; - this.help = help; - this.responseMetaData = responseMetaData; - } + private String message; + private String help; + private ResponseMetaData responseMetaData; - @Override - public String toString() { - return "NotFoundException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + public NotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "NotFoundException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" + + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java index dfd9907..667e2f4 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java @@ -4,23 +4,21 @@ public class PartialSuccessException extends Exception { - private String message; - private String help; - private ResponseMetaData responseMetaData; + private String message; + private String help; + private ResponseMetaData responseMetaData; - public PartialSuccessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { - super(message, cause, enableSuppression, writableStackTrace); - this.message = message1; - this.help = help; - this.responseMetaData = responseMetaData; - } + public PartialSuccessException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "PartialSuccessException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "PartialSuccessException{" + "message='" + message + '\'' + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java index 0eae547..fb2c714 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/AITagsRequest.java @@ -3,30 +3,27 @@ import java.util.List; public class AITagsRequest { - public List fileIds; - public List AITags; + public List fileIds; + public List AITags; - public List getFileIds() { - return fileIds; - } + public List getFileIds() { + return fileIds; + } - public void setFileIds(List fileIds) { - this.fileIds = fileIds; - } + public void setFileIds(List fileIds) { + this.fileIds = fileIds; + } - public List getAITags() { - return AITags; - } + public List getAITags() { + return AITags; + } - public void setAITags(List AITags) { - this.AITags = AITags; - } + public void setAITags(List AITags) { + this.AITags = AITags; + } - @Override - public String toString() { - return "AITagsRequest{" + - "fileIds=" + fileIds + - ", AITags=" + AITags + - '}'; - } + @Override + public String toString() { + return "AITagsRequest{" + "fileIds=" + fileIds + ", AITags=" + AITags + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java index ccf5e4f..f65f5d0 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java @@ -7,261 +7,246 @@ import java.util.List; public class BaseFile { - protected String fileId; - protected String name; - protected String url; - protected String thumbnail; - protected int height; - protected int width; - protected long size; - protected String filePath; - protected List tags; - protected boolean isPrivateFile; - protected String customCoordinates; - protected String fileType; - protected JsonArray aiTags; - protected JsonObject versionInfo; - protected JsonObject customMetadata; - protected JsonObject embeddedMetadata; - protected JsonObject extensionStatus; - protected String type; - protected String mime; - protected Boolean hasAlpha; - protected Date createdAt; - protected Date updatedAt; - - public BaseFile() { - } - - public BaseFile(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { - this.fileId = fileId; - this.name = name; - this.url = url; - this.thumbnail = thumbnail; - this.height = height; - this.width = width; - this.size = size; - this.filePath = filePath; - this.tags = tags; - this.isPrivateFile = isPrivateFile; - this.customCoordinates = customCoordinates; - this.fileType = fileType; - this.aiTags = aiTags; - this.versionInfo = versionInfo; - this.customMetadata = customMetadata; - this.embeddedMetadata = embeddedMetadata; - this.extensionStatus = extensionStatus; - this.type = type; - this.mime = mime; - this.hasAlpha = hasAlpha; - this.createdAt = createdAt; - this.updatedAt = updatedAt; - } - - public String getFileId() { - return fileId; - } - - public void setFileId(String fileId) { - this.fileId = fileId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getThumbnail() { - return thumbnail; - } - - public void setThumbnail(String thumbnail) { - this.thumbnail = thumbnail; - } - - public int getHeight() { - return height; - } - - public void setHeight(int height) { - this.height = height; - } - - public int getWidth() { - return width; - } - - public void setWidth(int width) { - this.width = width; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public boolean isPrivateFile() { - return isPrivateFile; - } - - public void setPrivateFile(boolean privateFile) { - isPrivateFile = privateFile; - } - - public String getCustomCoordinates() { - return customCoordinates; - } - - public void setCustomCoordinates(String customCoordinates) { - this.customCoordinates = customCoordinates; - } - - public String getFileType() { - return fileType; - } - - public void setFileType(String fileType) { - this.fileType = fileType; - } - - public JsonArray getAiTags() { - return aiTags; - } - - public void setAiTags(JsonArray aiTags) { - this.aiTags = aiTags; - } - - public JsonObject getVersionInfo() { - return versionInfo; - } - - public void setVersionInfo(JsonObject versionInfo) { - this.versionInfo = versionInfo; - } - - public JsonObject getCustomMetadata() { - return customMetadata; - } - - public void setCustomMetadata(JsonObject customMetadata) { - this.customMetadata = customMetadata; - } - - public JsonObject getEmbeddedMetadata() { - return embeddedMetadata; - } - - public void setEmbeddedMetadata(JsonObject embeddedMetadata) { - this.embeddedMetadata = embeddedMetadata; - } - - public JsonObject getExtensionStatus() { - return extensionStatus; - } - - public void setExtensionStatus(JsonObject extensionStatus) { - this.extensionStatus = extensionStatus; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getMime() { - return mime; - } - - public void setMime(String mime) { - this.mime = mime; - } - - public Boolean getHasAlpha() { - return hasAlpha; - } - - public void setHasAlpha(Boolean hasAlpha) { - this.hasAlpha = hasAlpha; - } - - public Date getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - public Date getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(Date updatedAt) { - this.updatedAt = updatedAt; - } - - - @Override - public String toString() { - return "BaseFile{" + - "fileId='" + fileId + '\'' + - ", name='" + name + '\'' + - ", url='" + url + '\'' + - ", thumbnail='" + thumbnail + '\'' + - ", height=" + height + - ", width=" + width + - ", size=" + size + - ", filePath='" + filePath + '\'' + - ", tags='" + tags +'\''+ - ", isPrivateFile=" + isPrivateFile + - ", customCoordinates='" + customCoordinates +'\''+ - ", fileType='" + fileType + '\'' + - ", aiTags=" + aiTags + - ", versionInfo=" + versionInfo + - ", customMetadata=" + customMetadata + - ", embeddedMetadata=" + embeddedMetadata + - ", extensionStatus=" + extensionStatus + - ", type='" + type + '\'' + - ", mime='" + mime + '\'' + - ", hasAlpha=" + hasAlpha + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + - '}'; - } - + protected String fileId; + protected String name; + protected String url; + protected String thumbnail; + protected int height; + protected int width; + protected long size; + protected String filePath; + protected List tags; + protected boolean isPrivateFile; + protected String customCoordinates; + protected String fileType; + protected JsonArray aiTags; + protected JsonObject versionInfo; + protected JsonObject customMetadata; + protected JsonObject embeddedMetadata; + protected JsonObject extensionStatus; + protected String type; + protected String mime; + protected Boolean hasAlpha; + protected Date createdAt; + protected Date updatedAt; + + public BaseFile() { + } + + public BaseFile(String fileId, String name, String url, String thumbnail, int height, int width, long size, + String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, + JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, + JsonObject extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { + this.fileId = fileId; + this.name = name; + this.url = url; + this.thumbnail = thumbnail; + this.height = height; + this.width = width; + this.size = size; + this.filePath = filePath; + this.tags = tags; + this.isPrivateFile = isPrivateFile; + this.customCoordinates = customCoordinates; + this.fileType = fileType; + this.aiTags = aiTags; + this.versionInfo = versionInfo; + this.customMetadata = customMetadata; + this.embeddedMetadata = embeddedMetadata; + this.extensionStatus = extensionStatus; + this.type = type; + this.mime = mime; + this.hasAlpha = hasAlpha; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public boolean isPrivateFile() { + return isPrivateFile; + } + + public void setPrivateFile(boolean privateFile) { + isPrivateFile = privateFile; + } + + public String getCustomCoordinates() { + return customCoordinates; + } + + public void setCustomCoordinates(String customCoordinates) { + this.customCoordinates = customCoordinates; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public JsonArray getAiTags() { + return aiTags; + } + + public void setAiTags(JsonArray aiTags) { + this.aiTags = aiTags; + } + + public JsonObject getVersionInfo() { + return versionInfo; + } + + public void setVersionInfo(JsonObject versionInfo) { + this.versionInfo = versionInfo; + } + + public JsonObject getCustomMetadata() { + return customMetadata; + } + + public void setCustomMetadata(JsonObject customMetadata) { + this.customMetadata = customMetadata; + } + + public JsonObject getEmbeddedMetadata() { + return embeddedMetadata; + } + + public void setEmbeddedMetadata(JsonObject embeddedMetadata) { + this.embeddedMetadata = embeddedMetadata; + } + + public JsonObject getExtensionStatus() { + return extensionStatus; + } + + public void setExtensionStatus(JsonObject extensionStatus) { + this.extensionStatus = extensionStatus; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getMime() { + return mime; + } + + public void setMime(String mime) { + this.mime = mime; + } + + public Boolean getHasAlpha() { + return hasAlpha; + } + + public void setHasAlpha(Boolean hasAlpha) { + this.hasAlpha = hasAlpha; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return "BaseFile{" + "fileId='" + fileId + '\'' + ", name='" + name + '\'' + ", url='" + url + '\'' + + ", thumbnail='" + thumbnail + '\'' + ", height=" + height + ", width=" + width + ", size=" + size + + ", filePath='" + filePath + '\'' + ", tags='" + tags + '\'' + ", isPrivateFile=" + isPrivateFile + + ", customCoordinates='" + customCoordinates + '\'' + ", fileType='" + fileType + '\'' + ", aiTags=" + + aiTags + ", versionInfo=" + versionInfo + ", customMetadata=" + customMetadata + ", embeddedMetadata=" + + embeddedMetadata + ", extensionStatus=" + extensionStatus + ", type='" + type + '\'' + ", mime='" + + mime + '\'' + ", hasAlpha=" + hasAlpha + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt + + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java index fde1de5..93d022b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java @@ -1,40 +1,37 @@ package io.imagekit.sdk.models; public class CopyFileRequest { - public String sourceFilePath; - public String destinationPath; - public Boolean includeVersions; - - public String getSourceFilePath() { - return sourceFilePath; - } - - public void setSourceFilePath(String sourceFilePath) { - this.sourceFilePath = sourceFilePath; - } - - public String getDestinationPath() { - return destinationPath; - } - - public void setDestinationPath(String destinationPath) { - this.destinationPath = destinationPath; - } - - public Boolean getIncludeVersions() { - return includeVersions; - } - - public void setIncludeVersions(Boolean includeVersions) { - this.includeVersions = includeVersions; - } - - @Override - public String toString() { - return "CopyFileRequest{" + - "sourceFilePath=" + sourceFilePath + - ", destinationPath=" + destinationPath + - ", includeVersions=" + includeVersions + - '}'; - } + public String sourceFilePath; + public String destinationPath; + public Boolean includeVersions; + + public String getSourceFilePath() { + return sourceFilePath; + } + + public void setSourceFilePath(String sourceFilePath) { + this.sourceFilePath = sourceFilePath; + } + + public String getDestinationPath() { + return destinationPath; + } + + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } + + public Boolean getIncludeVersions() { + return includeVersions; + } + + public void setIncludeVersions(Boolean includeVersions) { + this.includeVersions = includeVersions; + } + + @Override + public String toString() { + return "CopyFileRequest{" + "sourceFilePath=" + sourceFilePath + ", destinationPath=" + destinationPath + + ", includeVersions=" + includeVersions + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java index 21b7406..8a468f6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java @@ -1,40 +1,37 @@ package io.imagekit.sdk.models; public class CopyFolderRequest { - public String sourceFolderPath; - public String destinationPath; - public Boolean includeVersions; - - public String getSourceFolderPath() { - return sourceFolderPath; - } - - public void setSourceFolderPath(String sourceFolderPath) { - this.sourceFolderPath = sourceFolderPath; - } - - public String getDestinationPath() { - return destinationPath; - } - - public void setDestinationPath(String destinationPath) { - this.destinationPath = destinationPath; - } - - public Boolean getIncludeVersions() { - return includeVersions; - } - - public void setIncludeVersions(Boolean includeVersions) { - this.includeVersions = includeVersions; - } - - @Override - public String toString() { - return "CopyFolderRequest{" + - "sourceFolderPath=" + sourceFolderPath + - ", destinationPath=" + destinationPath + - ", includeVersions=" + includeVersions + - '}'; - } + public String sourceFolderPath; + public String destinationPath; + public Boolean includeVersions; + + public String getSourceFolderPath() { + return sourceFolderPath; + } + + public void setSourceFolderPath(String sourceFolderPath) { + this.sourceFolderPath = sourceFolderPath; + } + + public String getDestinationPath() { + return destinationPath; + } + + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } + + public Boolean getIncludeVersions() { + return includeVersions; + } + + public void setIncludeVersions(Boolean includeVersions) { + this.includeVersions = includeVersions; + } + + @Override + public String toString() { + return "CopyFolderRequest{" + "sourceFolderPath=" + sourceFolderPath + ", destinationPath=" + destinationPath + + ", includeVersions=" + includeVersions + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java index ec3b915..077d8d2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CreateFolderRequest.java @@ -1,30 +1,27 @@ package io.imagekit.sdk.models; public class CreateFolderRequest { - public String folderName; - public String parentFolderPath; + public String folderName; + public String parentFolderPath; - public String getFolderName() { - return folderName; - } + public String getFolderName() { + return folderName; + } - public void setFolderName(String folderName) { - this.folderName = folderName; - } + public void setFolderName(String folderName) { + this.folderName = folderName; + } - public String getParentFolderPath() { - return parentFolderPath; - } + public String getParentFolderPath() { + return parentFolderPath; + } - public void setParentFolderPath(String parentFolderPath) { - this.parentFolderPath = parentFolderPath; - } + public void setParentFolderPath(String parentFolderPath) { + this.parentFolderPath = parentFolderPath; + } - @Override - public String toString() { - return "DeleteFolderRequest{" + - "folderName=" + folderName + - "parentFolderPath=" + parentFolderPath + - '}'; - } + @Override + public String toString() { + return "DeleteFolderRequest{" + "folderName=" + folderName + "parentFolderPath=" + parentFolderPath + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldCreateRequest.java index 1939b18..fc6d3a0 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldCreateRequest.java @@ -1,44 +1,41 @@ package io.imagekit.sdk.models; public class CustomMetaDataFieldCreateRequest { - private String name; - private String label; - private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); - - public CustomMetaDataFieldCreateRequest() { - - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public CustomMetaDataFieldSchemaObject getSchema() { - return schema; - } - - public void setSchema(CustomMetaDataFieldSchemaObject schema) { - this.schema = schema; - } - - @Override - public String toString() { - return "CustomMetaDataFieldRequest{" + - "name=" + '"' + name + '"' + - ", label=" + '"' + label + '"' + - ", schema=" + schema + - '}'; - } + private String name; + private String label; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + + public CustomMetaDataFieldCreateRequest() { + + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } + + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } + + @Override + public String toString() { + return "CustomMetaDataFieldRequest{" + "name=" + '"' + name + '"' + ", label=" + '"' + label + '"' + ", schema=" + + schema + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java index f8e32b3..e1e9f11 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -1,103 +1,97 @@ package io.imagekit.sdk.models; - import java.util.List; public class CustomMetaDataFieldSchemaObject { - private CustomMetaDataTypeEnum type; - private List selectOptions; - private String defaultValue; - private Boolean isValueRequired; - private Integer minValue; - private Integer maxValue; - private Integer minLength; - private Integer maxLength; - - public CustomMetaDataFieldSchemaObject() { - - } - - public CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum type, boolean isValueRequired, int minValue, int maxValue) { - this.type = type; - this.isValueRequired = isValueRequired; - this.minValue = minValue; - this.maxValue = maxValue; - } - - public CustomMetaDataTypeEnum getType() { - return type; - } - - public void setType(CustomMetaDataTypeEnum type) { - this.type = type; - } - - public List getSelectOptions() { - return selectOptions; - } - - public void setSelectOptions(List selectOptions) { - this.selectOptions = selectOptions; - } - - public String getDefaultValue() { - return defaultValue; - } - - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; - } - - public boolean isValueRequired() { - return isValueRequired; - } - - public void setValueRequired(boolean valueRequired) { - isValueRequired = valueRequired; - } - - public Integer getMinValue() { - return minValue; - } - - public void setMinValue(Integer minValue) { - this.minValue = minValue; - } - - public Integer getMaxValue() { - return maxValue; - } - - public void setMaxValue(Integer maxValue) { - this.maxValue = maxValue; - } - - public Integer getMinLength() { - return minLength; - } - - public void setMinLength(Integer minLength) { - this.minLength = minLength; - } - - public Integer getMaxLength() { - return maxLength; - } - - public void setMaxLength(Integer maxLength) { - this.maxLength = maxLength; - } - - @Override - public String toString() {return "{" + - "type=" + '"' + type + '"' + - ", selectOptions=" + '"' + selectOptions + '"' + - ", defaultValue=" + '"' + defaultValue + '"' + - ", isValueRequired=" + isValueRequired + - ", minValue=" + minValue + - ", maxValue=" + maxValue + - ", minLength=" + minLength + - ", maxLength=" + maxLength + - '}'; - } + private CustomMetaDataTypeEnum type; + private List selectOptions; + private String defaultValue; + private Boolean isValueRequired; + private Integer minValue; + private Integer maxValue; + private Integer minLength; + private Integer maxLength; + + public CustomMetaDataFieldSchemaObject() { + + } + + public CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum type, boolean isValueRequired, int minValue, + int maxValue) { + this.type = type; + this.isValueRequired = isValueRequired; + this.minValue = minValue; + this.maxValue = maxValue; + } + + public CustomMetaDataTypeEnum getType() { + return type; + } + + public void setType(CustomMetaDataTypeEnum type) { + this.type = type; + } + + public List getSelectOptions() { + return selectOptions; + } + + public void setSelectOptions(List selectOptions) { + this.selectOptions = selectOptions; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public boolean isValueRequired() { + return isValueRequired; + } + + public void setValueRequired(boolean valueRequired) { + isValueRequired = valueRequired; + } + + public Integer getMinValue() { + return minValue; + } + + public void setMinValue(Integer minValue) { + this.minValue = minValue; + } + + public Integer getMaxValue() { + return maxValue; + } + + public void setMaxValue(Integer maxValue) { + this.maxValue = maxValue; + } + + public Integer getMinLength() { + return minLength; + } + + public void setMinLength(Integer minLength) { + this.minLength = minLength; + } + + public Integer getMaxLength() { + return maxLength; + } + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + @Override + public String toString() { + return "{" + "type=" + '"' + type + '"' + ", selectOptions=" + '"' + selectOptions + '"' + ", defaultValue=" + + '"' + defaultValue + '"' + ", isValueRequired=" + isValueRequired + ", minValue=" + minValue + + ", maxValue=" + maxValue + ", minLength=" + minLength + ", maxLength=" + maxLength + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java index f38117a..6945a8e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldUpdateRequest.java @@ -1,44 +1,41 @@ package io.imagekit.sdk.models; public class CustomMetaDataFieldUpdateRequest { - private String id; - private String label; - private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); - - public CustomMetaDataFieldUpdateRequest() { - - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public CustomMetaDataFieldSchemaObject getSchema() { - return schema; - } - - public void setSchema(CustomMetaDataFieldSchemaObject schema) { - this.schema = schema; - } - - @Override - public String toString() { - return "CustomMetaDataFieldRequest{" + - "id=" + '"' + id + '"' + - ", label=" + '"' + label + '"' + - ", schema=" + schema + - '}'; - } + private String id; + private String label; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + + public CustomMetaDataFieldUpdateRequest() { + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } + + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } + + @Override + public String toString() { + return "CustomMetaDataFieldRequest{" + "id=" + '"' + id + '"' + ", label=" + '"' + label + '"' + ", schema=" + + schema + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java index cabe7bb..092a491 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java @@ -3,12 +3,6 @@ import com.google.gson.annotations.SerializedName; public enum CustomMetaDataTypeEnum { - Text, - Textarea, - Number, - Date, - Boolean, - SingleSelect, - MultiSelect; + Text, Textarea, Number, Date, Boolean, SingleSelect, MultiSelect; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java index b6dfd08..8b5b3e3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFileVersionRequest.java @@ -1,30 +1,27 @@ package io.imagekit.sdk.models; public class DeleteFileVersionRequest { - public String fileId; - public String versionId; + public String fileId; + public String versionId; - public String getFileId() { - return fileId; - } + public String getFileId() { + return fileId; + } - public void setFileId(String fileId) { - this.fileId = fileId; - } + public void setFileId(String fileId) { + this.fileId = fileId; + } - public String getVersionId() { - return versionId; - } + public String getVersionId() { + return versionId; + } - public void setVersionId(String versionId) { - this.versionId = versionId; - } + public void setVersionId(String versionId) { + this.versionId = versionId; + } - @Override - public String toString() { - return "DeleteFileVersionRequest{" + - "fileId='" + fileId + '\'' + - ", versionId='" + versionId + '\'' + - '}'; - } + @Override + public String toString() { + return "DeleteFileVersionRequest{" + "fileId='" + fileId + '\'' + ", versionId='" + versionId + '\'' + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java index d98c112..2447fdf 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/DeleteFolderRequest.java @@ -1,20 +1,18 @@ package io.imagekit.sdk.models; public class DeleteFolderRequest { - public String folderPath; + public String folderPath; - public String getFolderPath() { - return folderPath; - } + public String getFolderPath() { + return folderPath; + } - public void setFolderPath(String folderPath) { - this.folderPath = folderPath; - } + public void setFolderPath(String folderPath) { + this.folderPath = folderPath; + } - @Override - public String toString() { - return "DeleteFolderRequest{" + - "folderPath=" + folderPath + - '}'; - } + @Override + public String toString() { + return "DeleteFolderRequest{" + "folderPath=" + folderPath + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java index 1388776..4b39425 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileCreateRequest.java @@ -12,171 +12,161 @@ import java.util.List; public class FileCreateRequest { - public URL url; - public String base64; - public byte[] bytes; - public String fileName; - public boolean useUniqueFileName; - public List tags; - public String folder; - public boolean isPrivateFile; - public String customCoordinates; - public List responseFields; - public JsonArray extensions; - public String webhookUrl; - public Boolean overwriteFile; - public Boolean overwriteAITags; - public Boolean overwriteTags; - public Boolean overwriteCustomMetadata; - public JsonObject customMetadata; - - public FileCreateRequest(URL url, String fileName) { - this.url = url; - this.fileName = fileName; - this.useUniqueFileName=true; - } - - public FileCreateRequest(String base64, String fileName) { - this.base64 = base64; - this.fileName = fileName; - this.useUniqueFileName=true; - } - - public FileCreateRequest(byte[] bytes, String fileName) { - this.bytes = bytes; - this.fileName = fileName; - this.useUniqueFileName=true; - } - - public String getFileName() { - return fileName; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public boolean isUseUniqueFileName() { - return useUniqueFileName; - } - - public void setUseUniqueFileName(boolean useUniqueFileName) { - this.useUniqueFileName = useUniqueFileName; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public String getFolder() { - return folder; - } - - public void setFolder(String folder) { - this.folder = folder; - } - - public boolean isPrivateFile() { - return isPrivateFile; - } - - public void setPrivateFile(boolean privateFile) { - isPrivateFile = privateFile; - } - - public String getCustomCoordinates() { - return customCoordinates; - } - - public void setCustomCoordinates(String customCoordinates) { - this.customCoordinates = customCoordinates; - } - - public List getResponseFields() { - return responseFields; - } - - public void setResponseFields(List responseFields) { - this.responseFields = responseFields; - } - - public JsonArray getExtensions() { - return extensions; - } - - public void setExtensions(JsonArray extensions) { - this.extensions = extensions; - } - - public String getWebhookUrl() { - return webhookUrl; - } - - public void setWebhookUrl(String webhookUrl) { - this.webhookUrl = webhookUrl; - } - - public Boolean isOverwriteFile() { - return overwriteFile; - } - - public void setOverwriteFile(Boolean overwriteFile) { - this.overwriteFile = overwriteFile; - } - - public Boolean isOverwriteAITags() { - return overwriteAITags; - } - - public void setOverwriteAITags(Boolean overwriteAITags) { - this.overwriteAITags = overwriteAITags; - } - - public Boolean isOverwriteTags() { - return overwriteTags; - } - - public void setOverwriteTags(Boolean overwriteTags) { - this.overwriteTags = overwriteTags; - } - - public Boolean isOverwriteCustomMetadata() { - return overwriteCustomMetadata; - } - - public void setOverwriteCustomMetadata(Boolean overwriteCustomMetadata) { - this.overwriteCustomMetadata = overwriteCustomMetadata; - } - - public JsonObject getCustomMetadata() { - return customMetadata; - } - - public void setCustomMetadata(JsonObject customMetadata) { - this.customMetadata = customMetadata; - } - - @Override - public String toString() { - return "FileCreateRequest{" + - "fileName='" + fileName + '\'' + - ", useUniqueFileName=" + useUniqueFileName + - ", tags=" + tags + - ", folder='" + folder + '\'' + - ", isPrivateFile=" + isPrivateFile + - ", customCoordinates=" + customCoordinates + - ", responseFields=" + responseFields + - ", extensions=" + extensions + - ", webhookUrl='" + webhookUrl + '\'' + - ", overwriteFile=" + overwriteFile + - ", overwriteAITags=" + overwriteAITags + - ", overwriteTags=" + overwriteTags + - ", overwriteCustomMetadata=" + overwriteCustomMetadata + - ", customMetadata=" + customMetadata + - '}'; - } + public URL url; + public String base64; + public byte[] bytes; + public String fileName; + public boolean useUniqueFileName; + public List tags; + public String folder; + public boolean isPrivateFile; + public String customCoordinates; + public List responseFields; + public JsonArray extensions; + public String webhookUrl; + public Boolean overwriteFile; + public Boolean overwriteAITags; + public Boolean overwriteTags; + public Boolean overwriteCustomMetadata; + public JsonObject customMetadata; + + public FileCreateRequest(URL url, String fileName) { + this.url = url; + this.fileName = fileName; + this.useUniqueFileName = true; + } + + public FileCreateRequest(String base64, String fileName) { + this.base64 = base64; + this.fileName = fileName; + this.useUniqueFileName = true; + } + + public FileCreateRequest(byte[] bytes, String fileName) { + this.bytes = bytes; + this.fileName = fileName; + this.useUniqueFileName = true; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public boolean isUseUniqueFileName() { + return useUniqueFileName; + } + + public void setUseUniqueFileName(boolean useUniqueFileName) { + this.useUniqueFileName = useUniqueFileName; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public String getFolder() { + return folder; + } + + public void setFolder(String folder) { + this.folder = folder; + } + + public boolean isPrivateFile() { + return isPrivateFile; + } + + public void setPrivateFile(boolean privateFile) { + isPrivateFile = privateFile; + } + + public String getCustomCoordinates() { + return customCoordinates; + } + + public void setCustomCoordinates(String customCoordinates) { + this.customCoordinates = customCoordinates; + } + + public List getResponseFields() { + return responseFields; + } + + public void setResponseFields(List responseFields) { + this.responseFields = responseFields; + } + + public JsonArray getExtensions() { + return extensions; + } + + public void setExtensions(JsonArray extensions) { + this.extensions = extensions; + } + + public String getWebhookUrl() { + return webhookUrl; + } + + public void setWebhookUrl(String webhookUrl) { + this.webhookUrl = webhookUrl; + } + + public Boolean isOverwriteFile() { + return overwriteFile; + } + + public void setOverwriteFile(Boolean overwriteFile) { + this.overwriteFile = overwriteFile; + } + + public Boolean isOverwriteAITags() { + return overwriteAITags; + } + + public void setOverwriteAITags(Boolean overwriteAITags) { + this.overwriteAITags = overwriteAITags; + } + + public Boolean isOverwriteTags() { + return overwriteTags; + } + + public void setOverwriteTags(Boolean overwriteTags) { + this.overwriteTags = overwriteTags; + } + + public Boolean isOverwriteCustomMetadata() { + return overwriteCustomMetadata; + } + + public void setOverwriteCustomMetadata(Boolean overwriteCustomMetadata) { + this.overwriteCustomMetadata = overwriteCustomMetadata; + } + + public JsonObject getCustomMetadata() { + return customMetadata; + } + + public void setCustomMetadata(JsonObject customMetadata) { + this.customMetadata = customMetadata; + } + + @Override + public String toString() { + return "FileCreateRequest{" + "fileName='" + fileName + '\'' + ", useUniqueFileName=" + useUniqueFileName + + ", tags=" + tags + ", folder='" + folder + '\'' + ", isPrivateFile=" + isPrivateFile + + ", customCoordinates=" + customCoordinates + ", responseFields=" + responseFields + ", extensions=" + + extensions + ", webhookUrl='" + webhookUrl + '\'' + ", overwriteFile=" + overwriteFile + + ", overwriteAITags=" + overwriteAITags + ", overwriteTags=" + overwriteTags + + ", overwriteCustomMetadata=" + overwriteCustomMetadata + ", customMetadata=" + customMetadata + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java index 1bc9e3e..2d015a5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFileRequest.java @@ -1,30 +1,27 @@ package io.imagekit.sdk.models; public class MoveFileRequest { - public String sourceFilePath; - public String destinationPath; + public String sourceFilePath; + public String destinationPath; - public String getSourceFilePath() { - return sourceFilePath; - } + public String getSourceFilePath() { + return sourceFilePath; + } - public void setSourceFilePath(String sourceFilePath) { - this.sourceFilePath = sourceFilePath; - } + public void setSourceFilePath(String sourceFilePath) { + this.sourceFilePath = sourceFilePath; + } - public String getDestinationPath() { - return destinationPath; - } + public String getDestinationPath() { + return destinationPath; + } - public void setDestinationPath(String destinationPath) { - this.destinationPath = destinationPath; - } + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } - @Override - public String toString() { - return "MoveFileRequest{" + - "sourceFilePath=" + sourceFilePath + - ", destinationPath=" + destinationPath + - '}'; - } + @Override + public String toString() { + return "MoveFileRequest{" + "sourceFilePath=" + sourceFilePath + ", destinationPath=" + destinationPath + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java index 880063c..900a97f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/MoveFolderRequest.java @@ -1,30 +1,28 @@ package io.imagekit.sdk.models; public class MoveFolderRequest { - public String sourceFolderPath; - public String destinationPath; + public String sourceFolderPath; + public String destinationPath; - public String getSourceFolderPath() { - return sourceFolderPath; - } + public String getSourceFolderPath() { + return sourceFolderPath; + } - public void setSourceFolderPath(String sourceFolderPath) { - this.sourceFolderPath = sourceFolderPath; - } + public void setSourceFolderPath(String sourceFolderPath) { + this.sourceFolderPath = sourceFolderPath; + } - public String getDestinationPath() { - return destinationPath; - } + public String getDestinationPath() { + return destinationPath; + } - public void setDestinationPath(String destinationPath) { - this.destinationPath = destinationPath; - } + public void setDestinationPath(String destinationPath) { + this.destinationPath = destinationPath; + } - @Override - public String toString() { - return "MoveFolderRequest{" + - "sourceFolderPath=" + sourceFolderPath + - ", destinationPath=" + destinationPath + - '}'; - } + @Override + public String toString() { + return "MoveFolderRequest{" + "sourceFolderPath=" + sourceFolderPath + ", destinationPath=" + destinationPath + + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java index 0b64c1d..85d5fc9 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/RenameFileRequest.java @@ -1,40 +1,37 @@ package io.imagekit.sdk.models; public class RenameFileRequest { - public String filePath; - public String newFileName; - public Boolean purgeCache; - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - public String getNewFileName() { - return newFileName; - } - - public void setNewFileName(String newFileName) { - this.newFileName = newFileName; - } - - public Boolean getPurgeCache() { - return purgeCache; - } - - public void setPurgeCache(Boolean purgeCache) { - this.purgeCache = purgeCache; - } - - @Override - public String toString() { - return "RenameFileRequest{" + - "filePath=" + filePath + - ", newFileName=" + newFileName + - ", purgeCache=" + purgeCache + - '}'; - } + public String filePath; + public String newFileName; + public Boolean purgeCache; + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getNewFileName() { + return newFileName; + } + + public void setNewFileName(String newFileName) { + this.newFileName = newFileName; + } + + public Boolean getPurgeCache() { + return purgeCache; + } + + public void setPurgeCache(Boolean purgeCache) { + this.purgeCache = purgeCache; + } + + @Override + public String toString() { + return "RenameFileRequest{" + "filePath=" + filePath + ", newFileName=" + newFileName + ", purgeCache=" + + purgeCache + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java index 67a2efe..57f1859 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/ResponseMetaData.java @@ -1,6 +1,5 @@ package io.imagekit.sdk.models; - import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -12,56 +11,53 @@ public class ResponseMetaData { - private String raw; - private int httpStatusCode; - private Map headers; - - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - - public int getHttpStatusCode() { - return httpStatusCode; - } - - public void setHttpStatusCode(int httpStatusCode) { - this.httpStatusCode = httpStatusCode; - } - - public Map getHeaders() { - return headers; - } - - public void setHeaders(Map headers) { - this.headers = headers; - } - - public Map getMap() { - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - - public List getList() { - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken() { - }.getType()); - } - return new ArrayList<>(); - } - - @Override - public String toString() { - return "ResponseMetaData{" + - "raw='" + raw + '\'' + - ", httpStatusCode=" + httpStatusCode + - ", headers=" + headers + - '}'; - } + private String raw; + private int httpStatusCode; + private Map headers; + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + public int getHttpStatusCode() { + return httpStatusCode; + } + + public void setHttpStatusCode(int httpStatusCode) { + this.httpStatusCode = httpStatusCode; + } + + public Map getHeaders() { + return headers; + } + + public void setHeaders(Map headers) { + this.headers = headers; + } + + public Map getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + + public List getList() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken() { + }.getType()); + } + return new ArrayList<>(); + } + + @Override + public String toString() { + return "ResponseMetaData{" + "raw='" + raw + '\'' + ", httpStatusCode=" + httpStatusCode + ", headers=" + + headers + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java index 0c6f077..7653c8a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/TagsRequest.java @@ -4,35 +4,32 @@ import java.util.stream.Collectors; public class TagsRequest { - public List fileIds; - public List tags; - - public TagsRequest(List fileIds, List tags) { - this.fileIds = fileIds; - this.tags = tags; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public List getFileIds() { - return fileIds; - } - - public void setFileIds(List fileIds) { - this.fileIds = fileIds; - } - - @Override - public String toString() { - return "TagsRequest{" + - "fileIds=" + fileIds + - ", tags=" + tags + - '}'; - } + public List fileIds; + public List tags; + + public TagsRequest(List fileIds, List tags) { + this.fileIds = fileIds; + this.tags = tags; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public List getFileIds() { + return fileIds; + } + + public void setFileIds(List fileIds) { + this.fileIds = fileIds; + } + + @Override + public String toString() { + return "TagsRequest{" + "fileIds=" + fileIds + ", tags=" + tags + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index f39db1c..ca1997e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -14,214 +14,199 @@ import java.util.Map; public class Result extends BaseFile { - private boolean isSuccessful; - private String message; - private String help; - @Deprecated - private String raw; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public Result() { - } - - public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, JsonObject extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { - this.fileId = fileId; - this.name = name; - this.url = url; - this.thumbnail = thumbnail; - this.height = height; - this.width = width; - this.size = size; - this.filePath = filePath; - this.tags = tags; - this.isPrivateFile = isPrivateFile; - this.customCoordinates = customCoordinates; - this.fileType = fileType; - this.aiTags = aiTags; - this.versionInfo = versionInfo; - this.customMetadata = customMetadata; - this.embeddedMetadata = embeddedMetadata; - this.extensionStatus = extensionStatus; - this.type = type; - this.mime = mime; - this.hasAlpha = hasAlpha; - this.createdAt = createdAt; - this.updatedAt = updatedAt; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getHelp() { - return help; - } - - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - - @Deprecated - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - - public void setHelp(String help) { - this.help = help; - } - - public String getFileId() { - return fileId; - } - - public void setFileId(String fileId) { - this.fileId = fileId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getThumbnail() { - return thumbnail; - } - - public void setThumbnail(String thumbnail) { - this.thumbnail = thumbnail; - } - - public int getHeight() { - return height; - } - - public void setHeight(int height) { - this.height = height; - } - - public int getWidth() { - return width; - } - - public void setWidth(int width) { - this.width = width; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public boolean isPrivateFile() { - return isPrivateFile; - } - - public void setPrivateFile(boolean privateFile) { - isPrivateFile = privateFile; - } - - public String getCustomCoordinates() { - return customCoordinates; - } - - public void setCustomCoordinates(String customCoordinates) { - this.customCoordinates = customCoordinates; - } - - public String getFileType() { - return fileType; - } - - public void setFileType(String fileType) { - this.fileType = fileType; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "Result{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", help='" + help + '\'' + - ", fileId='" + fileId + '\'' + - ", name='" + name + '\'' + - ", url='" + url + '\'' + - ", thumbnail='" + thumbnail + '\'' + - ", height=" + height + - ", width=" + width + - ", size=" + size + - ", filePath='" + filePath + '\'' + - ", tags='" + tags +'\''+ - ", isPrivateFile=" + isPrivateFile + - ", customCoordinates='" + customCoordinates +'\''+ - ", fileType='" + fileType + '\'' + - ", aiTags=" + aiTags + - ", versionInfo=" + versionInfo + - ", customMetadata=" + customMetadata + - ", embeddedMetadata=" + embeddedMetadata + - ", extensionStatus=" + extensionStatus + - ", type='" + type + '\'' + - ", mime='" + mime + '\'' + - ", hasAlpha=" + hasAlpha + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + - '}'; - } + private boolean isSuccessful; + private String message; + private String help; + @Deprecated + private String raw; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public Result() { + } + + public Result(String fileId, String name, String url, String thumbnail, int height, int width, long size, + String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, + JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, + JsonObject extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { + this.fileId = fileId; + this.name = name; + this.url = url; + this.thumbnail = thumbnail; + this.height = height; + this.width = width; + this.size = size; + this.filePath = filePath; + this.tags = tags; + this.isPrivateFile = isPrivateFile; + this.customCoordinates = customCoordinates; + this.fileType = fileType; + this.aiTags = aiTags; + this.versionInfo = versionInfo; + this.customMetadata = customMetadata; + this.embeddedMetadata = embeddedMetadata; + this.extensionStatus = extensionStatus; + this.type = type; + this.mime = mime; + this.hasAlpha = hasAlpha; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHelp() { + return help; + } + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + + public void setHelp(String help) { + this.help = help; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public boolean isPrivateFile() { + return isPrivateFile; + } + + public void setPrivateFile(boolean privateFile) { + isPrivateFile = privateFile; + } + + public String getCustomCoordinates() { + return customCoordinates; + } + + public void setCustomCoordinates(String customCoordinates) { + this.customCoordinates = customCoordinates; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "Result{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help + '\'' + + ", fileId='" + fileId + '\'' + ", name='" + name + '\'' + ", url='" + url + '\'' + ", thumbnail='" + + thumbnail + '\'' + ", height=" + height + ", width=" + width + ", size=" + size + ", filePath='" + + filePath + '\'' + ", tags='" + tags + '\'' + ", isPrivateFile=" + isPrivateFile + + ", customCoordinates='" + customCoordinates + '\'' + ", fileType='" + fileType + '\'' + ", aiTags=" + + aiTags + ", versionInfo=" + versionInfo + ", customMetadata=" + customMetadata + ", embeddedMetadata=" + + embeddedMetadata + ", extensionStatus=" + extensionStatus + ", type='" + type + '\'' + ", mime='" + + mime + '\'' + ", hasAlpha=" + hasAlpha + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt + + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java index 5e97071..644755d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultBulkJobStatus.java @@ -3,50 +3,46 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultBulkJobStatus { - private String jobId; - private String type; - private String status; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public String getJobId() { - return jobId; - } - - public void setJobId(String jobId) { - this.jobId = jobId; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultBulkJobStatus{" + - "jobId='" + jobId + '\'' + - ", type='" + type + '\'' + - ", status='" + status + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + private String jobId; + private String type; + private String status; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultBulkJobStatus{" + "jobId='" + jobId + '\'' + ", type='" + type + '\'' + ", status='" + status + + '\'' + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 8f34cc8..8f0f353 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -9,81 +9,77 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultCache { - private boolean isSuccessful; - private String message; - private String help; - private String requestId; - @Deprecated - private String raw; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public ResultCache() { - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getHelp() { - return help; - } - - public void setHelp(String help) { - this.help = help; - } - - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - - @Deprecated - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultCache{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", help='" + help + '\'' + - ", requestId='" + requestId + '\'' + - '}'; - } + private boolean isSuccessful; + private String message; + private String help; + private String requestId; + @Deprecated + private String raw; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultCache() { + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHelp() { + return help; + } + + public void setHelp(String help) { + this.help = help; + } + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultCache{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help + + '\'' + ", requestId='" + requestId + '\'' + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 979c706..a17d92c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -9,81 +9,77 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultCacheStatus { - private boolean isSuccessful; - private String message; - private String help; - private String status; - @Deprecated - private String raw; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public ResultCacheStatus() { - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getHelp() { - return help; - } - - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - - @Deprecated - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - - public void setHelp(String help) { - this.help = help; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultCache{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", help='" + help + '\'' + - ", status='" + status + '\'' + - '}'; - } + private boolean isSuccessful; + private String message; + private String help; + private String status; + @Deprecated + private String raw; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultCacheStatus() { + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHelp() { + return help; + } + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + + public void setHelp(String help) { + this.help = help; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultCache{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help + + '\'' + ", status='" + status + '\'' + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java index e7d12d3..2dc6836 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataField.java @@ -4,64 +4,59 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultCustomMetaDataField { - private String id; - private String name; - private String label; - private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); - private ResponseMetaData responseMetaData = new ResponseMetaData(); + private String id; + private String name; + private String label; + private CustomMetaDataFieldSchemaObject schema = new CustomMetaDataFieldSchemaObject(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); - public ResultCustomMetaDataField() { + public ResultCustomMetaDataField() { - } + } - public String getId() { - return id; - } + public String getId() { + return id; + } - public void setId(String id) { - this.id = id; - } + public void setId(String id) { + this.id = id; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public String getLabel() { - return label; - } + public String getLabel() { + return label; + } - public void setLabel(String label) { - this.label = label; - } + public void setLabel(String label) { + this.label = label; + } - public CustomMetaDataFieldSchemaObject getSchema() { - return schema; - } + public CustomMetaDataFieldSchemaObject getSchema() { + return schema; + } - public void setSchema(CustomMetaDataFieldSchemaObject schema) { - this.schema = schema; - } + public void setSchema(CustomMetaDataFieldSchemaObject schema) { + this.schema = schema; + } - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "ResultCustomMetaDataField{" + - "id='" + id + '\'' + - ", name='" + name + '\'' + - ", label='" + label + '\'' + - ", schema=" + schema + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "ResultCustomMetaDataField{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", label='" + label + '\'' + + ", schema=" + schema + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java index eafc7f7..1528c21 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCustomMetaDataFieldList.java @@ -6,30 +6,28 @@ public class ResultCustomMetaDataFieldList { - private List resultCustomMetaDataFieldList; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public List getResultCustomMetaDataFieldList() { - return resultCustomMetaDataFieldList; - } - - public void setResultCustomMetaDataFieldList(List resultCustomMetaDataFieldList) { - this.resultCustomMetaDataFieldList = resultCustomMetaDataFieldList; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultCustomMetaDataFieldList{" + - "resultCustomMetaDataFieldList=" + resultCustomMetaDataFieldList + - ", responseMetaData=" + responseMetaData + - '}'; - } + private List resultCustomMetaDataFieldList; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public List getResultCustomMetaDataFieldList() { + return resultCustomMetaDataFieldList; + } + + public void setResultCustomMetaDataFieldList(List resultCustomMetaDataFieldList) { + this.resultCustomMetaDataFieldList = resultCustomMetaDataFieldList; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultCustomMetaDataFieldList{" + "resultCustomMetaDataFieldList=" + resultCustomMetaDataFieldList + + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java index 32f14fe..ce1cf4a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultEmptyBlock.java @@ -3,20 +3,18 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultEmptyBlock { - private ResponseMetaData responseMetaData = new ResponseMetaData(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "ResultEmptyBlock{" + - "responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "ResultEmptyBlock{" + "responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index 37b68e5..4c6e2a9 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -11,93 +11,89 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultFileDelete { - private boolean isSuccessful; - private String message; - private String help; - @Deprecated - private String raw; - private List successfullyDeletedFileIds; - private List missingFileIds; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public ResultFileDelete() { - successfullyDeletedFileIds=new ArrayList<>(); - missingFileIds=new ArrayList<>(); - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getHelp() { - return help; - } - - public void setHelp(String help) { - this.help = help; - } - - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - - @Deprecated - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - - public List getSuccessfullyDeletedFileIds() { - return successfullyDeletedFileIds; - } - - public void setSuccessfullyDeletedFileIds(List successfullyDeletedFileIds) { - this.successfullyDeletedFileIds = successfullyDeletedFileIds; - } - - public List getMissingFileIds() { - return missingFileIds; - } - - public void setMissingFileIds(List missingFileIds) { - this.missingFileIds = missingFileIds; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultFileDelete{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", help='" + help + '\'' + - ", successfullyDeletedFileIds=" + successfullyDeletedFileIds + - ", missingFileIds=" + missingFileIds + - '}'; - } + private boolean isSuccessful; + private String message; + private String help; + @Deprecated + private String raw; + private List successfullyDeletedFileIds; + private List missingFileIds; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultFileDelete() { + successfullyDeletedFileIds = new ArrayList<>(); + missingFileIds = new ArrayList<>(); + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHelp() { + return help; + } + + public void setHelp(String help) { + this.help = help; + } + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + + public List getSuccessfullyDeletedFileIds() { + return successfullyDeletedFileIds; + } + + public void setSuccessfullyDeletedFileIds(List successfullyDeletedFileIds) { + this.successfullyDeletedFileIds = successfullyDeletedFileIds; + } + + public List getMissingFileIds() { + return missingFileIds; + } + + public void setMissingFileIds(List missingFileIds) { + this.missingFileIds = missingFileIds; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultFileDelete{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help + + '\'' + ", successfullyDeletedFileIds=" + successfullyDeletedFileIds + ", missingFileIds=" + + missingFileIds + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java index 7dc5096..f9f83c2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersionDetails.java @@ -8,230 +8,214 @@ public class ResultFileVersionDetails { - protected String type; - protected String name; - protected String createdAt; - protected String updatedAt; - protected String fileId; - protected List tags; - protected JsonArray aiTags; - protected JsonObject versionInfo; - protected JsonObject embeddedMetadata; - protected String customCoordinates; - protected JsonObject customMetadata; - protected boolean isPrivateFile; - protected String url; - protected String thumbnail; - protected String fileType; - protected String filePath; - protected int height; - protected int width; - protected long size; - protected Boolean hasAlpha; - protected String mime; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - public String getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(String updatedAt) { - this.updatedAt = updatedAt; - } - - public String getFileId() { - return fileId; - } - - public void setFileId(String fileId) { - this.fileId = fileId; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public JsonArray getAiTags() { - return aiTags; - } - - public void setAiTags(JsonArray aiTags) { - this.aiTags = aiTags; - } - - public JsonObject getVersionInfo() { - return versionInfo; - } - - public void setVersionInfo(JsonObject versionInfo) { - this.versionInfo = versionInfo; - } - - public JsonObject getEmbeddedMetadata() { - return embeddedMetadata; - } - - public void setEmbeddedMetadata(JsonObject embeddedMetadata) { - this.embeddedMetadata = embeddedMetadata; - } - - public String getCustomCoordinates() { - return customCoordinates; - } - - public void setCustomCoordinates(String customCoordinates) { - this.customCoordinates = customCoordinates; - } - - public JsonObject getCustomMetadata() { - return customMetadata; - } - - public void setCustomMetadata(JsonObject customMetadata) { - this.customMetadata = customMetadata; - } - - public boolean isPrivateFile() { - return isPrivateFile; - } - - public void setPrivateFile(boolean privateFile) { - isPrivateFile = privateFile; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getThumbnail() { - return thumbnail; - } - - public void setThumbnail(String thumbnail) { - this.thumbnail = thumbnail; - } - - public String getFileType() { - return fileType; - } - - public void setFileType(String fileType) { - this.fileType = fileType; - } - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - public int getHeight() { - return height; - } - - public void setHeight(int height) { - this.height = height; - } - - public int getWidth() { - return width; - } - - public void setWidth(int width) { - this.width = width; - } - - public long getSize() { - return size; - } - - public void setSize(long size) { - this.size = size; - } - - public Boolean getHasAlpha() { - return hasAlpha; - } - - public void setHasAlpha(Boolean hasAlpha) { - this.hasAlpha = hasAlpha; - } - - public String getMime() { - return mime; - } - - public void setMime(String mime) { - this.mime = mime; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultFileVersion{" + - "type='" + type + '\'' + - ", name='" + name + '\'' + - ", createdAt='" + createdAt + '\'' + - ", updatedAt='" + updatedAt + '\'' + - ", fileId='" + fileId + '\'' + - ", tags=" + tags + - ", aiTags=" + aiTags + - ", versionInfo=" + versionInfo + - ", embeddedMetadata=" + embeddedMetadata + - ", customCoordinates='" + customCoordinates + '\'' + - ", customMetadata=" + customMetadata + - ", isPrivateFile=" + isPrivateFile + - ", url='" + url + '\'' + - ", thumbnail='" + thumbnail + '\'' + - ", fileType='" + fileType + '\'' + - ", filePath='" + filePath + '\'' + - ", height=" + height + - ", width=" + width + - ", size=" + size + - ", hasAlpha=" + hasAlpha + - ", mime='" + mime + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + protected String type; + protected String name; + protected String createdAt; + protected String updatedAt; + protected String fileId; + protected List tags; + protected JsonArray aiTags; + protected JsonObject versionInfo; + protected JsonObject embeddedMetadata; + protected String customCoordinates; + protected JsonObject customMetadata; + protected boolean isPrivateFile; + protected String url; + protected String thumbnail; + protected String fileType; + protected String filePath; + protected int height; + protected int width; + protected long size; + protected Boolean hasAlpha; + protected String mime; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + public String getFileId() { + return fileId; + } + + public void setFileId(String fileId) { + this.fileId = fileId; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public JsonArray getAiTags() { + return aiTags; + } + + public void setAiTags(JsonArray aiTags) { + this.aiTags = aiTags; + } + + public JsonObject getVersionInfo() { + return versionInfo; + } + + public void setVersionInfo(JsonObject versionInfo) { + this.versionInfo = versionInfo; + } + + public JsonObject getEmbeddedMetadata() { + return embeddedMetadata; + } + + public void setEmbeddedMetadata(JsonObject embeddedMetadata) { + this.embeddedMetadata = embeddedMetadata; + } + + public String getCustomCoordinates() { + return customCoordinates; + } + + public void setCustomCoordinates(String customCoordinates) { + this.customCoordinates = customCoordinates; + } + + public JsonObject getCustomMetadata() { + return customMetadata; + } + + public void setCustomMetadata(JsonObject customMetadata) { + this.customMetadata = customMetadata; + } + + public boolean isPrivateFile() { + return isPrivateFile; + } + + public void setPrivateFile(boolean privateFile) { + isPrivateFile = privateFile; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public Boolean getHasAlpha() { + return hasAlpha; + } + + public void setHasAlpha(Boolean hasAlpha) { + this.hasAlpha = hasAlpha; + } + + public String getMime() { + return mime; + } + + public void setMime(String mime) { + this.mime = mime; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultFileVersion{" + "type='" + type + '\'' + ", name='" + name + '\'' + ", createdAt='" + createdAt + + '\'' + ", updatedAt='" + updatedAt + '\'' + ", fileId='" + fileId + '\'' + ", tags=" + tags + + ", aiTags=" + aiTags + ", versionInfo=" + versionInfo + ", embeddedMetadata=" + embeddedMetadata + + ", customCoordinates='" + customCoordinates + '\'' + ", customMetadata=" + customMetadata + + ", isPrivateFile=" + isPrivateFile + ", url='" + url + '\'' + ", thumbnail='" + thumbnail + '\'' + + ", fileType='" + fileType + '\'' + ", filePath='" + filePath + '\'' + ", height=" + height + + ", width=" + width + ", size=" + size + ", hasAlpha=" + hasAlpha + ", mime='" + mime + '\'' + + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java index e0eea2c..3e2a232 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileVersions.java @@ -6,30 +6,28 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultFileVersions { - List resultFileVersionDetailsList = new ArrayList<>(); - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public List getResultFileVersionDetailsList() { - return resultFileVersionDetailsList; - } - - public void setResultFileVersionDetailsList(List resultFileVersionDetailsList) { - this.resultFileVersionDetailsList = resultFileVersionDetailsList; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultFileVersions{" + - "resultFileVersionDetailsList=" + resultFileVersionDetailsList + - ", responseMetaData=" + responseMetaData + - '}'; - } + List resultFileVersionDetailsList = new ArrayList<>(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public List getResultFileVersionDetailsList() { + return resultFileVersionDetailsList; + } + + public void setResultFileVersionDetailsList(List resultFileVersionDetailsList) { + this.resultFileVersionDetailsList = resultFileVersionDetailsList; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultFileVersions{" + "resultFileVersionDetailsList=" + resultFileVersionDetailsList + + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 9e48e21..52e1dbf 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -11,85 +11,81 @@ import java.util.Map; public class ResultList { - private boolean isSuccessful; - private String message; - private String help; - @Deprecated - private String raw; - private List results; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public ResultList() { - } - - public ResultList(List results) { - this.results = results; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getHelp() { - return help; - } - - public void setHelp(String help) { - this.help = help; - } - - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - - @Deprecated - public List> getMap() { - if (null != raw) { - return new Gson().fromJson(raw, new TypeToken>>() { - }.getType()); - } - return new ArrayList>(); - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - public List getResults() { - return results; - } - - public void setResults(List results) { - this.results = results; - } - - @Override - public String toString() { - return "ResultList{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", help='" + help + '\'' + - ", results=" + results + - '}'; - } + private boolean isSuccessful; + private String message; + private String help; + @Deprecated + private String raw; + private List results; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultList() { + } + + public ResultList(List results) { + this.results = results; + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHelp() { + return help; + } + + public void setHelp(String help) { + this.help = help; + } + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public List> getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>>() { + }.getType()); + } + return new ArrayList>(); + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + public List getResults() { + return results; + } + + public void setResults(List results) { + this.results = results; + } + + @Override + public String toString() { + return "ResultList{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help + + '\'' + ", results=" + results + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index 44935fa..bd3fbf6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -10,81 +10,77 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultMetaData { - private boolean isSuccessful; - private String message; - private String help; - @Deprecated - private String raw; - private MetaData results; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public ResultMetaData() { - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public String getHelp() { - return help; - } - - public void setHelp(String help) { - this.help = help; - } - - public String getRaw() { - return raw; - } - - public void setRaw(String raw) { - this.raw = raw; - } - - @Deprecated - public Map getMap(){ - if (null!=raw) { - return new Gson().fromJson(raw, new TypeToken>() { - }.getType()); - } - return new HashMap<>(); - } - - public MetaData getResults() { - return results; - } - - public void setResults(MetaData results) { - this.results = results; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultMetaData{" + - "isSuccessful=" + isSuccessful + - ", message='" + message + '\'' + - ", help='" + help + '\'' + - ", results=" + results + - '}'; - } + private boolean isSuccessful; + private String message; + private String help; + @Deprecated + private String raw; + private MetaData results; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultMetaData() { + } + + public boolean isSuccessful() { + return isSuccessful; + } + + public void setSuccessful(boolean successful) { + isSuccessful = successful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHelp() { + return help; + } + + public void setHelp(String help) { + this.help = help; + } + + public String getRaw() { + return raw; + } + + public void setRaw(String raw) { + this.raw = raw; + } + + @Deprecated + public Map getMap() { + if (null != raw) { + return new Gson().fromJson(raw, new TypeToken>() { + }.getType()); + } + return new HashMap<>(); + } + + public MetaData getResults() { + return results; + } + + public void setResults(MetaData results) { + this.results = results; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultMetaData{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help + + '\'' + ", results=" + results + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java index b7fa135..439cb61 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultNoContent.java @@ -3,20 +3,18 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultNoContent { - private ResponseMetaData responseMetaData = new ResponseMetaData(); + private ResponseMetaData responseMetaData = new ResponseMetaData(); - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "ResultNoContent{" + - "responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "ResultNoContent{" + "responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java index bdc5c58..905f43b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultOfFolderActions.java @@ -3,30 +3,27 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultOfFolderActions { - private String jobId; - private ResponseMetaData responseMetaData = new ResponseMetaData(); + private String jobId; + private ResponseMetaData responseMetaData = new ResponseMetaData(); - public String getJobId() { - return jobId; - } + public String getJobId() { + return jobId; + } - public void setJobId(String jobId) { - this.jobId = jobId; - } + public void setJobId(String jobId) { + this.jobId = jobId; + } - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "ResultOfFolderActions{" + - "jobId='" + jobId + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "ResultOfFolderActions{" + "jobId='" + jobId + '\'' + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java index 7fc5018..fdc0686 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultRenameFile.java @@ -3,30 +3,28 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultRenameFile { - private String purgeRequestId; - private ResponseMetaData responseMetaData = new ResponseMetaData(); + private String purgeRequestId; + private ResponseMetaData responseMetaData = new ResponseMetaData(); - public String getPurgeRequestId() { - return purgeRequestId; - } + public String getPurgeRequestId() { + return purgeRequestId; + } - public void setPurgeRequestId(String purgeRequestId) { - this.purgeRequestId = purgeRequestId; - } + public void setPurgeRequestId(String purgeRequestId) { + this.purgeRequestId = purgeRequestId; + } - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "ResultRenameFile{" + - "purgeRequestId='" + purgeRequestId + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "ResultRenameFile{" + "purgeRequestId='" + purgeRequestId + '\'' + ", responseMetaData=" + + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java index 681aab8..88499df 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultTags.java @@ -5,30 +5,28 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultTags { - private List successfullyUpdatedFileIds; - private ResponseMetaData responseMetaData = new ResponseMetaData(); - - public List getSuccessfullyUpdatedFileIds() { - return successfullyUpdatedFileIds; - } - - public void setSuccessfullyUpdatedFileIds(List successfullyUpdatedFileIds) { - this.successfullyUpdatedFileIds = successfullyUpdatedFileIds; - } - - public ResponseMetaData getResponseMetaData() { - return responseMetaData; - } - - public void setResponseMetaData(ResponseMetaData responseMetaData) { - this.responseMetaData = responseMetaData; - } - - @Override - public String toString() { - return "ResultTags{" + - "successfullyUpdatedFileIds=" + successfullyUpdatedFileIds + - ", responseMetaData=" + responseMetaData + - '}'; - } + private List successfullyUpdatedFileIds; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public List getSuccessfullyUpdatedFileIds() { + return successfullyUpdatedFileIds; + } + + public void setSuccessfullyUpdatedFileIds(List successfullyUpdatedFileIds) { + this.successfullyUpdatedFileIds = successfullyUpdatedFileIds; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultTags{" + "successfullyUpdatedFileIds=" + successfullyUpdatedFileIds + ", responseMetaData=" + + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index 64f4cdb..b8f52bd 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -15,85 +15,84 @@ import java.util.Map; public class MultipartBuilder { - public MultipartBody build(FileCreateRequest fileCreateRequest){ - MultipartBody.Builder builder = new MultipartBody.Builder("boundary").setType(MultipartBody.FORM); + public MultipartBody build(FileCreateRequest fileCreateRequest) { + MultipartBody.Builder builder = new MultipartBody.Builder("boundary").setType(MultipartBody.FORM); - if (null!=fileCreateRequest.url){ - builder.addFormDataPart("file",fileCreateRequest.url.toString()); - } else if (null!=fileCreateRequest.base64) { - builder.addFormDataPart("file", fileCreateRequest.base64); - } else if (null!=fileCreateRequest.bytes){ - builder.addFormDataPart("file", Utils.bytesToBase64(fileCreateRequest.bytes)); - } - else { - throw new RuntimeException("Error: File not provided."); - } - if (null!=fileCreateRequest.fileName) { - builder.addFormDataPart("fileName", fileCreateRequest.fileName); - } - else { - throw new RuntimeException("Error: Filename not provided"); - } - if (fileCreateRequest.useUniqueFileName) { - builder.addFormDataPart("useUniqueFileName", "true"); - }else { - builder.addFormDataPart("useUniqueFileName", "false"); - } - if (null!=fileCreateRequest.tags) { - builder.addFormDataPart("tags", Utils.listToString(fileCreateRequest.tags)); - } - if (null!=fileCreateRequest.folder) { - builder.addFormDataPart("folder", fileCreateRequest.folder); - } - if (fileCreateRequest.isPrivateFile) { - builder.addFormDataPart("isPrivateFile", "true"); - } - if (null!=fileCreateRequest.customCoordinates) { - builder.addFormDataPart("customCoordinates", fileCreateRequest.customCoordinates); - } - if (null!=fileCreateRequest.responseFields) { - builder.addFormDataPart("responseFields", Utils.listToString(fileCreateRequest.responseFields)); - } - if (fileCreateRequest.overwriteFile != null && !fileCreateRequest.overwriteFile) { - builder.addFormDataPart("overwriteFile", String.valueOf(true)); - } - if (fileCreateRequest.overwriteAITags != null && !fileCreateRequest.overwriteAITags) { - builder.addFormDataPart("overwriteAITags", String.valueOf(Boolean.TRUE)); - } - if (fileCreateRequest.overwriteTags != null && !fileCreateRequest.overwriteTags) { - builder.addFormDataPart("overwriteTags", "true"); - } - if (fileCreateRequest.overwriteCustomMetadata != null && !fileCreateRequest.overwriteCustomMetadata) { - builder.addFormDataPart("overwriteCustomMetadata", "true"); - } - if (null!=fileCreateRequest.extensions) { - builder.addFormDataPart("extensions", fileCreateRequest.extensions.toString()); - } - if (null!=fileCreateRequest.webhookUrl) { - builder.addFormDataPart("webhookUrl", fileCreateRequest.webhookUrl); - } - if (null!=fileCreateRequest.customMetadata) { - builder.addFormDataPart("customMetadata", String.valueOf(new JsonParser().parse(String.valueOf(fileCreateRequest.customMetadata)))); - } - return builder.build(); - } + if (null != fileCreateRequest.url) { + builder.addFormDataPart("file", fileCreateRequest.url.toString()); + } else if (null != fileCreateRequest.base64) { + builder.addFormDataPart("file", fileCreateRequest.base64); + } else if (null != fileCreateRequest.bytes) { + builder.addFormDataPart("file", Utils.bytesToBase64(fileCreateRequest.bytes)); + } else { + throw new RuntimeException("Error: File not provided."); + } + if (null != fileCreateRequest.fileName) { + builder.addFormDataPart("fileName", fileCreateRequest.fileName); + } else { + throw new RuntimeException("Error: Filename not provided"); + } + if (fileCreateRequest.useUniqueFileName) { + builder.addFormDataPart("useUniqueFileName", "true"); + } else { + builder.addFormDataPart("useUniqueFileName", "false"); + } + if (null != fileCreateRequest.tags) { + builder.addFormDataPart("tags", Utils.listToString(fileCreateRequest.tags)); + } + if (null != fileCreateRequest.folder) { + builder.addFormDataPart("folder", fileCreateRequest.folder); + } + if (fileCreateRequest.isPrivateFile) { + builder.addFormDataPart("isPrivateFile", "true"); + } + if (null != fileCreateRequest.customCoordinates) { + builder.addFormDataPart("customCoordinates", fileCreateRequest.customCoordinates); + } + if (null != fileCreateRequest.responseFields) { + builder.addFormDataPart("responseFields", Utils.listToString(fileCreateRequest.responseFields)); + } + if (fileCreateRequest.overwriteFile != null && !fileCreateRequest.overwriteFile) { + builder.addFormDataPart("overwriteFile", String.valueOf(true)); + } + if (fileCreateRequest.overwriteAITags != null && !fileCreateRequest.overwriteAITags) { + builder.addFormDataPart("overwriteAITags", String.valueOf(Boolean.TRUE)); + } + if (fileCreateRequest.overwriteTags != null && !fileCreateRequest.overwriteTags) { + builder.addFormDataPart("overwriteTags", "true"); + } + if (fileCreateRequest.overwriteCustomMetadata != null && !fileCreateRequest.overwriteCustomMetadata) { + builder.addFormDataPart("overwriteCustomMetadata", "true"); + } + if (null != fileCreateRequest.extensions) { + builder.addFormDataPart("extensions", fileCreateRequest.extensions.toString()); + } + if (null != fileCreateRequest.webhookUrl) { + builder.addFormDataPart("webhookUrl", fileCreateRequest.webhookUrl); + } + if (null != fileCreateRequest.customMetadata) { + builder.addFormDataPart("customMetadata", + String.valueOf(new JsonParser().parse(String.valueOf(fileCreateRequest.customMetadata)))); + } + return builder.build(); + } - public RequestBody build(FileUpdateRequest fileUpdateRequest){ - if (fileUpdateRequest.getFileId()==null){ - throw new RuntimeException("Error: File Id not provided."); - } - if (fileUpdateRequest.getFileId().trim().length()<1){ - throw new RuntimeException("Error: File Id not provided."); - } - return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(fileUpdateRequest)); - } + public RequestBody build(FileUpdateRequest fileUpdateRequest) { + if (fileUpdateRequest.getFileId() == null) { + throw new RuntimeException("Error: File Id not provided."); + } + if (fileUpdateRequest.getFileId().trim().length() < 1) { + throw new RuntimeException("Error: File Id not provided."); + } + return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), + new Gson().toJson(fileUpdateRequest)); + } - public RequestBody build(String json){ - if (json==null){ - throw new RuntimeException("Error: You can't send null body."); - } - else { - return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json); - } - } + public RequestBody build(String json) { + if (json == null) { + throw new RuntimeException("Error: You can't send null body."); + } else { + return RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json); + } + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index a69da77..408f0de 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; + import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.exceptions.BadRequestException; import io.imagekit.sdk.exceptions.ConflictException; @@ -36,899 +37,846 @@ public class RestClient { - public static String API_BASE_URL = "https://api.imagekit.io/"; - public static String UPLOAD_BASE_URL = "https://upload.imagekit.io/"; - - private ImageKit imageKit; - Request request; - OkHttpClient client; - MultipartBuilder multipartBuilder; - - public RestClient(ImageKit imageKit) { - this.imageKit=imageKit; - this.client=new OkHttpClient(); - this.multipartBuilder=new MultipartBuilder(); - } - - public void setClient(OkHttpClient client) { - this.client = client; - } - - public void setMultipartBuilder(MultipartBuilder builder){ - this.multipartBuilder=builder; - } - - public Result upload(FileCreateRequest fileCreateRequest){ - Result result=null; - Map headers=Utils.getHeaders(imageKit); - - MultipartBody body=multipartBuilder.build(fileCreateRequest); - - request=new Request.Builder() - .url(UPLOAD_BASE_URL.concat("api/v1/files/upload")) - .post(body) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody = response.body().string(); - result=new Gson().fromJson(respBody,Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result=new Result(); - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public Result updateDetail(FileUpdateRequest fileUpdateRequest){ - Result result=null; - Map headers=Utils.getHeaders(imageKit); - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/details",fileUpdateRequest.getFileId()); - request=new Request.Builder() - .url(url) - .patch(multipartBuilder.build(fileUpdateRequest)) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - result=new Gson().fromJson(respBody,Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result=new Result(); - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultList getFileList(Map options){ - ResultList resultList=new ResultList(); - Map headers=Utils.getHeaders(imageKit); - - QueryMaker queryMaker=new QueryMaker(); - - for (Map.Entry entry:options.entrySet()){ - queryMaker.put(String.format("%s=%s",entry.getKey(),entry.getValue())); - } - - - - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files?%s",queryMaker.get()); + public static String API_BASE_URL = "https://api.imagekit.io/"; + public static String UPLOAD_BASE_URL = "https://upload.imagekit.io/"; + + private ImageKit imageKit; + Request request; + OkHttpClient client; + MultipartBuilder multipartBuilder; + + public RestClient(ImageKit imageKit) { + this.imageKit = imageKit; + this.client = new OkHttpClient(); + this.multipartBuilder = new MultipartBuilder(); + } + + public void setClient(OkHttpClient client) { + this.client = client; + } + + public void setMultipartBuilder(MultipartBuilder builder) { + this.multipartBuilder = builder; + } + + public Result upload(FileCreateRequest fileCreateRequest) { + Result result = null; + Map headers = Utils.getHeaders(imageKit); + + MultipartBody body = multipartBuilder.build(fileCreateRequest); + + request = new Request.Builder().url(UPLOAD_BASE_URL.concat("api/v1/files/upload")).post(body) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result = new Result(); + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, Result.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result updateDetail(FileUpdateRequest fileUpdateRequest) { + Result result = null; + Map headers = Utils.getHeaders(imageKit); + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", + fileUpdateRequest.getFileId()); + request = new Request.Builder().url(url).patch(multipartBuilder.build(fileUpdateRequest)) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result = new Result(); + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, Result.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultList getFileList(Map options) { + ResultList resultList = new ResultList(); + Map headers = Utils.getHeaders(imageKit); + + QueryMaker queryMaker = new QueryMaker(); + + for (Map.Entry entry : options.entrySet()) { + queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); + } + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files?%s", queryMaker.get()); // System.out.println(url); - request=new Request.Builder() - .url(url) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - List files=new Gson().fromJson(respBody,new TypeToken>() {}.getType()); - resultList.setResults(files); - resultList.setSuccessful(true); - resultList.setRaw(respBody); - } - else if (response.code()==500) { - resultList.setSuccessful(false); - resultList.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - resultList=new Gson().fromJson(resp,ResultList.class); - resultList.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultList; - } - - public Result getFileDetail(String fileId){ - Result result=new Result(); - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/details",fileId); - - request=new Request.Builder() - .url(url) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - result=new Gson().fromJson(respBody,Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultMetaData getFileMetaData(String fileId){ - ResultMetaData result=new ResultMetaData(); - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s/metadata",fileId); - - request=new Request.Builder() - .url(url) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody = response.body().string(); - MetaData metaData =new Gson().fromJson(respBody,MetaData.class); - result.setResults(metaData); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,ResultMetaData.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultMetaData getRemoteFileMetaData(String url){ - ResultMetaData result=new ResultMetaData(); - Map headers=Utils.getHeaders(imageKit); - - String apiURL="https://api.imagekit.io/v1/metadata?url="+url; - - request=new Request.Builder() - .url(apiURL) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - MetaData metaData =new Gson().fromJson(respBody,MetaData.class); - result.setResults(metaData); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,ResultMetaData.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public Result deleteFile(String fileId){ - Result result=new Result(); - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/%s",fileId); - - request=new Request.Builder() - .url(url) - .delete() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==204){ - respBody = response.body().string(); - result.setMessage("File deleted successfully!"); - result.setFileId(fileId); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultFileDelete bulkDeleteFiles(List fileIds){ - ResultFileDelete result=new ResultFileDelete(); - Map headers=Utils.getHeaders(imageKit); - - String url="https://api.imagekit.io/v1/files/batch/deleteByFileIds"; - - request=new Request.Builder() - .url(url) - .post( - multipartBuilder.build(String.format("{\"fileIds\":%s}",new Gson().toJson(fileIds))) - ) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - result=new Gson().fromJson(respBody,ResultFileDelete.class); - result.setMessage("File deleted successfully!"); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==404){ - String resp=response.body().string(); - result=new Gson().fromJson(resp,ResultFileDelete.class); - result.setRaw(resp); - result.getResponseMetaData().setRaw(resp); - result.setSuccessful(false); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,ResultFileDelete.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultCache purgeCache(String url){ - ResultCache result=new ResultCache(); - Map headers=Utils.getHeaders(imageKit); - - request=new Request.Builder() - .url("https://api.imagekit.io/v1/files/purge") - .post( - multipartBuilder.build(String.format("{\"url\":\"%s\"}",url)) - ) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200 || response.code()==201){ - respBody=response.body().string(); - result =new Gson().fromJson(respBody,ResultCache.class); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,ResultCache.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultCacheStatus getPurgeCacheStatus(String requestId){ - ResultCacheStatus result=new ResultCacheStatus(); - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,"https://api.imagekit.io/v1/files/purge/%s",requestId); - - request=new Request.Builder() - .url(url) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - result =new Gson().fromJson(respBody,ResultCacheStatus.class); - result.setSuccessful(true); - result.setRaw(respBody); - } - else if (response.code()==500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } - else { - String resp=response.body().string(); - result=new Gson().fromJson(resp,ResultCacheStatus.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - ResultTags resultTags = new ResultTags(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(tagsRequest)); - request=new Request.Builder() - .url(action.equals("removeTags") ? API_BASE_URL.concat("v1/files/removeTags") : API_BASE_URL.concat("v1/files/addTags")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultTags; - } - - public ResultTags removeAITags(AITagsRequest aiTagsRequest) throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { - ResultTags resultTags = new ResultTags(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(aiTagsRequest)); - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/files/removeAITags")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); - - } catch (IOException e) { - e.printStackTrace(); - } - return resultTags; - } - - public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { - ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); - - Map headers=Utils.getHeaders(imageKit); - - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - List resultCustomMetaDataFields=new Gson().fromJson(respBody, new TypeToken>() {}.getType()); - resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultCustomMetaDataFieldList; - } - - public ResultCustomMetaDataField createCustomMetaDataFields(CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { - if (customMetaDataFieldCreateRequest.getName() == null) { - throw new RuntimeException("Error: Name not provided."); - } - if (customMetaDataFieldCreateRequest.getLabel() == null) { - throw new RuntimeException("Error: Label not provided."); - } - ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldCreateRequest)); - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/customMetadataFields")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==201){ - respBody = response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultCustomMetaDataField; - } - - public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - ResultNoContent resultNoContent=new ResultNoContent(); - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,API_BASE_URL.concat("v1/customMetadataFields/%s"),id); - - request=new Request.Builder() - .url(url) - .delete() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==204){ - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultCustomMetaDataField updateCustomMetaDataFields(CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(customMetaDataFieldUpdateRequest)); - String url=String.format(Locale.US,API_BASE_URL.concat("v1/customMetadataFields/%s"),customMetaDataFieldUpdateRequest.getId()); - request=new Request.Builder() - .url(url) - .patch(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultCustomMetaDataField; - } - - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - ResultNoContent resultNoContent = new ResultNoContent(); - - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions/%s"), deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); - request=new Request.Builder() - .url(url) - .delete() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==204){ - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFileRequest)); - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/files/copy")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==204){ - String respString = response.body().string(); - respBody = respString == null ? "" : respString ; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFileRequest)); - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/files/move")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==204){ - String respString = response.body().string(); - respBody = respString == null ? "" : respString ; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws PartialSuccessException, ConflictException, NotFoundException, BadRequestException { - ResultRenameFile resultRenameFile = new ResultRenameFile(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(renameFileRequest)); - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/files/rename")) - .put(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - String respString = response.body().string(); - respBody = respString == null || respString.equals("") ? "{}" : respString; - resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultRenameFile; - } - - public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { - ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(createFolderRequest)); - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/folder/")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==201){ - String respString = response.body().string(); - respBody = respString == null || respString.equals("") ? "{}" : respString ; - } - Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultEmptyBlock; - } - - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(deleteFolderRequest)); - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/folder/")) - .delete(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==204){ - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(copyFolderRequest)); - - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultOfFolderActions; - } - - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - Map headers=Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), new Gson().toJson(moveFolderRequest)); - - request=new Request.Builder() - .url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")) - .post(requestBody) - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultOfFolderActions; - } - - public ResultBulkJobStatus getBulkJobStatus(String jobId) { - ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); - - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); - - request=new Request.Builder() - .url(url) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); - } - Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultBulkJobStatus; - } - - public ResultFileVersions getFileVersions(String fileId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultFileVersions resultFileVersions = new ResultFileVersions(); - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions"), fileId); - - request=new Request.Builder() - .url(url) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - List resultFileVersionDetailsList=new Gson().fromJson(respBody,new TypeToken>() {}.getType()); - resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultFileVersions; - } - - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - if (fileId == null) { - throw new RuntimeException("Error: FileId not provided."); - } - if (versionId == null) { - throw new RuntimeException("Error: versionId not provided."); - } - ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); - Map headers=Utils.getHeaders(imageKit); - - String url=String.format(Locale.US,API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); - - request=new Request.Builder() - .url(url) - .get() - .headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody=""; - if (response.code()==200){ - respBody=response.body().string(); - resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultFileVersionDetails; - } + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List files = new Gson().fromJson(respBody, new TypeToken>() { + }.getType()); + resultList.setResults(files); + resultList.setSuccessful(true); + resultList.setRaw(respBody); + } else if (response.code() == 500) { + resultList.setSuccessful(false); + resultList.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + resultList = new Gson().fromJson(resp, ResultList.class); + resultList.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultList; + } + + public Result getFileDetail(String fileId) { + Result result = new Result(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, Result.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultMetaData getFileMetaData(String fileId) { + ResultMetaData result = new ResultMetaData(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/metadata", fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + MetaData metaData = new Gson().fromJson(respBody, MetaData.class); + result.setResults(metaData); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, ResultMetaData.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultMetaData getRemoteFileMetaData(String url) { + ResultMetaData result = new ResultMetaData(); + Map headers = Utils.getHeaders(imageKit); + + String apiURL = "https://api.imagekit.io/v1/metadata?url=" + url; + + request = new Request.Builder().url(apiURL).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + MetaData metaData = new Gson().fromJson(respBody, MetaData.class); + result.setResults(metaData); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, ResultMetaData.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result deleteFile(String fileId) { + Result result = new Result(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s", fileId); + + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + respBody = response.body().string(); + result.setMessage("File deleted successfully!"); + result.setFileId(fileId); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, Result.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultFileDelete bulkDeleteFiles(List fileIds) { + ResultFileDelete result = new ResultFileDelete(); + Map headers = Utils.getHeaders(imageKit); + + String url = "https://api.imagekit.io/v1/files/batch/deleteByFileIds"; + + request = new Request.Builder().url(url) + .post(multipartBuilder.build(String.format("{\"fileIds\":%s}", new Gson().toJson(fileIds)))) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultFileDelete.class); + result.setMessage("File deleted successfully!"); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 404) { + String resp = response.body().string(); + result = new Gson().fromJson(resp, ResultFileDelete.class); + result.setRaw(resp); + result.getResponseMetaData().setRaw(resp); + result.setSuccessful(false); + } else if (response.code() == 500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, ResultFileDelete.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultCache purgeCache(String url) { + ResultCache result = new ResultCache(); + Map headers = Utils.getHeaders(imageKit); + + request = new Request.Builder().url("https://api.imagekit.io/v1/files/purge") + .post(multipartBuilder.build(String.format("{\"url\":\"%s\"}", url))).headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200 || response.code() == 201) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultCache.class); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, ResultCache.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultCacheStatus getPurgeCacheStatus(String requestId) { + ResultCacheStatus result = new ResultCacheStatus(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/purge/%s", requestId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultCacheStatus.class); + result.setSuccessful(true); + result.setRaw(respBody); + } else if (response.code() == 500) { + result.setSuccessful(false); + result.setMessage("Error: Internal server error."); + } else { + String resp = response.body().string(); + result = new Gson().fromJson(resp, ResultCacheStatus.class); + result.setSuccessful(false); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultTags manageTags(TagsRequest tagsRequest, String action) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + ResultTags resultTags = new ResultTags(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(tagsRequest)); + request = new Request.Builder() + .url(action.equals("removeTags") ? API_BASE_URL.concat("v1/files/removeTags") + : API_BASE_URL.concat("v1/files/addTags")) + .post(requestBody).headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultTags; + } + + public ResultTags removeAITags(AITagsRequest aiTagsRequest) + throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + ResultTags resultTags = new ResultTags(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(aiTagsRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/removeAITags")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + + } catch (IOException e) { + e.printStackTrace(); + } + return resultTags; + } + + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { + ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); + + Map headers = Utils.getHeaders(imageKit); + + request = new Request.Builder() + .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)).get() + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List resultCustomMetaDataFields = new Gson().fromJson(respBody, + new TypeToken>() { + }.getType()); + resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), + response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultCustomMetaDataFieldList; + } + + public ResultCustomMetaDataField createCustomMetaDataFields( + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) + throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { + if (customMetaDataFieldCreateRequest.getName() == null) { + throw new RuntimeException("Error: Name not provided."); + } + if (customMetaDataFieldCreateRequest.getLabel() == null) { + throw new RuntimeException("Error: Label not provided."); + } + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(customMetaDataFieldCreateRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/customMetadataFields")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 201) { + respBody = response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultCustomMetaDataField; + } + + public ResultNoContent deleteCustomMetaDataField(String id) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), id); + + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultCustomMetaDataField updateCustomMetaDataFields( + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); + + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(customMetaDataFieldUpdateRequest)); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), + customMetaDataFieldUpdateRequest.getId()); + request = new Request.Builder().url(url).patch(requestBody).headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultCustomMetaDataField; + } + + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + ResultNoContent resultNoContent = new ResultNoContent(); + + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), + deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(copyFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/copy")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(moveFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/move")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) + throws PartialSuccessException, ConflictException, NotFoundException, BadRequestException { + ResultRenameFile resultRenameFile = new ResultRenameFile(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(renameFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/rename")).put(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString; + resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultRenameFile; + } + + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { + ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(createFolderRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 201) { + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString; + } + Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultEmptyBlock; + } + + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(deleteFolderRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).delete(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(copyFolderRequest)); + + request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultOfFolderActions; + } + + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(moveFolderRequest)); + + request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultOfFolderActions; + } + + public ResultBulkJobStatus getBulkJobStatus(String jobId) { + ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); + + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); + } + Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultBulkJobStatus; + } + + public ResultFileVersions getFileVersions(String fileId) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + ResultFileVersions resultFileVersions = new ResultFileVersions(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions"), fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List resultFileVersionDetailsList = new Gson().fromJson(respBody, + new TypeToken>() { + }.getType()); + resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultFileVersions; + } + + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + if (fileId == null) { + throw new RuntimeException("Error: FileId not provided."); + } + if (versionId == null) { + throw new RuntimeException("Error: versionId not provided."); + } + ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultFileVersionDetails; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index b5af3a5..c2fefa0 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -25,123 +25,129 @@ public class Utils { - public static String listToString(List list){ - StringBuilder builder=new StringBuilder(); - for (int i=0; i list) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < list.size(); i++) { + if (null != list.get(i)) { + builder.append(list.get(i)); + if (i < list.size() - 1) { + builder.append(","); + } + } + } + return builder.toString(); + } - public static String fileToBase64(File file){ - String base64File = ""; - try (FileInputStream imageInFile = new FileInputStream(file)) { - // Reading a file from file system - byte fileData[] = new byte[(int) file.length()]; - imageInFile.read(fileData); - base64File = Base64.getEncoder().encodeToString(fileData); - } catch (FileNotFoundException e) { - System.out.println("File not found" + e); - } catch (IOException ioe) { - System.out.println("Exception while reading the file " + ioe); - } - return base64File; - } + public static String fileToBase64(File file) { + String base64File = ""; + try (FileInputStream imageInFile = new FileInputStream(file)) { + // Reading a file from file system + byte fileData[] = new byte[(int) file.length()]; + imageInFile.read(fileData); + base64File = Base64.getEncoder().encodeToString(fileData); + } catch (FileNotFoundException e) { + System.out.println("File not found" + e); + } catch (IOException ioe) { + System.out.println("Exception while reading the file " + ioe); + } + return base64File; + } - public static byte[] fileToBytes(File file) { - byte[] bytes=null; - try (FileInputStream imageInFile = new FileInputStream(file)) { - // Reading a file from file system - bytes = new byte[(int) file.length()]; - imageInFile.read(bytes); - } catch (FileNotFoundException e) { - System.out.println("File not found" + e); - } catch (IOException ioe) { - System.out.println("Exception while reading the file " + ioe); - } - return bytes; - } + public static byte[] fileToBytes(File file) { + byte[] bytes = null; + try (FileInputStream imageInFile = new FileInputStream(file)) { + // Reading a file from file system + bytes = new byte[(int) file.length()]; + imageInFile.read(bytes); + } catch (FileNotFoundException e) { + System.out.println("File not found" + e); + } catch (IOException ioe) { + System.out.println("Exception while reading the file " + ioe); + } + return bytes; + } - public static String bytesToBase64(byte[] fileData){ - String base64File = ""; - base64File = Base64.getEncoder().encodeToString(fileData); - return base64File; - } + public static String bytesToBase64(byte[] fileData) { + String base64File = ""; + base64File = Base64.getEncoder().encodeToString(fileData); + return base64File; + } - /** - * - * @param cls is a Class name from which this method will invoke - * @return it will return object of Configuration class - * @throws IOException if config.properties file doesn't exists - */ - public static Configuration getSystemConfig(Class cls) throws IOException{ - Properties properties=new Properties(); - String configFile="config.properties"; - InputStream is=cls.getClassLoader().getResourceAsStream(configFile); - if (null!=is){ - properties.load(is); - } - else { - throw new FileNotFoundException("Property file '"+configFile+"' not found in classpath"); - } - Configuration config=new Configuration(); - config.setUrlEndpoint(properties.getProperty("UrlEndpoint")); - config.setPublicKey(properties.getProperty("PublicKey")); - config.setPrivateKey(properties.getProperty("PrivateKey")); - config.validate(); - return config; - } + /** + * + * @param cls is a Class name from which this method will invoke + * @return it will return object of Configuration class + * @throws IOException if config.properties file doesn't exists + */ + public static Configuration getSystemConfig(Class cls) throws IOException { + Properties properties = new Properties(); + String configFile = "config.properties"; + InputStream is = cls.getClassLoader().getResourceAsStream(configFile); + if (null != is) { + properties.load(is); + } else { + throw new FileNotFoundException("Property file '" + configFile + "' not found in classpath"); + } + Configuration config = new Configuration(); + config.setUrlEndpoint(properties.getProperty("UrlEndpoint")); + config.setPublicKey(properties.getProperty("PublicKey")); + config.setPrivateKey(properties.getProperty("PrivateKey")); + config.validate(); + return config; + } - public static Map mapListOfStringToString(Map> listMap) { - Map stringMap = new HashMap<>(); - Set>> listMapEntries = listMap.entrySet(); - for (Entry> entry : listMapEntries) { - stringMap.put(entry.getKey(), entry.getValue().stream().collect(Collectors.joining(","))); - - } - return stringMap; - } - public static void populateResponseMetadata(String respBody, ResponseMetaData responseMetadata, int responseCode, Map> responseHeaders) throws IOException { - if (responseCode==200 || responseCode==201 || responseCode==204){ - responseMetadata.setRaw(respBody); - } - if (responseHeaders!=null) { - Map mappedHeader = Utils.mapListOfStringToString(responseHeaders); - responseMetadata.setHeaders(mappedHeader); - } - responseMetadata.setHttpStatusCode(responseCode); - } + public static Map mapListOfStringToString(Map> listMap) { + Map stringMap = new HashMap<>(); + Set>> listMapEntries = listMap.entrySet(); + for (Entry> entry : listMapEntries) { + stringMap.put(entry.getKey(), entry.getValue().stream().collect(Collectors.joining(","))); - public static Map getHeaders(ImageKit imageKit) { - String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(),""); - Map headers=new HashMap<>(); - headers.put("Accept-Encoding","application/json"); - headers.put("Content-Type","application/json"); - headers.put("Authorization",credential); - return headers; - } + } + return stringMap; + } - public static void throwException(Response response) throws IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { - String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); - populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - if (response.code() == 207) { - throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 400) { - throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 404) { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 409) { - throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - } + public static void populateResponseMetadata(String respBody, ResponseMetaData responseMetadata, int responseCode, + Map> responseHeaders) throws IOException { + if (responseCode == 200 || responseCode == 201 || responseCode == 204) { + responseMetadata.setRaw(respBody); + } + if (responseHeaders != null) { + Map mappedHeader = Utils.mapListOfStringToString(responseHeaders); + responseMetadata.setHeaders(mappedHeader); + } + responseMetadata.setHttpStatusCode(responseCode); + } + + public static Map getHeaders(ImageKit imageKit) { + String credential = Credentials.basic(imageKit.getConfig().getPrivateKey(), ""); + Map headers = new HashMap<>(); + headers.put("Accept-Encoding", "application/json"); + headers.put("Content-Type", "application/json"); + headers.put("Authorization", credential); + return headers; + } + + public static void throwException(Response response) + throws IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + String resp = response.body().string(); + ResultCache result = new Gson().fromJson(resp, ResultCache.class); + populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + if (response.code() == 207) { + throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } + if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); + } + if (response.code() == 409) { + throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); + } + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 4ad9c40..e3729bc 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -49,1739 +49,1604 @@ import com.google.gson.JsonObject; public class ImageKitTest { - private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern.compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)"); - - private ImageKit SUT; - - RestClient restClient; - @Before - public void setUp() throws Exception { - SUT=ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - restClient = new RestClient(SUT); - SUT.setRestClient(restClient); - } - - @Test - public void imageKit_configurationTest() { - Configuration config=new Configuration(); - config.setPrivateKey("private_Key"); - config.setPublicKey("public_key"); - config.setUrlEndpoint("url_end_point"); - ImageKit.getInstance().setConfig(config); - assertEquals(config.toString(),ImageKit.getInstance().getConfig().toString()); - } - - @Test - public void getUrl_with_height_width_options() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("transformation",transformation); - String url=SUT.getUrl(options); - - assertThat(SUT.getConfig().getUrlEndpoint()+"tr:w-400,h-600/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE,is(url)); - } - - @Test - public void getUrl_with_height_width_options_url_version_check() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("transformation",transformation); - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"tr:w-400,h-600/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE,is(url)); - assertTrue(url.contains("ik-sdk-version="+Version.VERSION_CODE)); - } - - @Test - public void getUrl_with_new_transformation_params_options() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - Map newParams=new HashMap<>(); - newParams.put("myparam","40"); - transformation.add(newParams); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("transformation",transformation); - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"tr:w-400,h-600:myparam-40/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE,is(url)); - } - - @Test - public void getUrl_with_slash_in_path() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("transformation",transformation); - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"tr:w-400,h-600/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE,is(url)); - } - - @Test - public void getUrl_without_slash_in_path() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - Map options=new HashMap<>(); - options.put("path","default-image.jpg"); - options.put("transformation",transformation); - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"tr:w-400,h-600/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE,is(url)); - } - - @Test - public void getUrl_with_overriding_urlEndpoint() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("urlEndpoint","https://ik.imagekit.io/your_override_imagekit_id"); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_override_imagekit_id/tr:w-400,h-600/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE,is(url)); - } - - @Test - public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("urlEndpoint","https://ik.imagekit.io/your_override_imagekit_id"); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_override_imagekit_id/tr:w-400,h-600/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE,is(url)); - } - - @Test - public void getUrl_with_options_as_query() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - options.put("transformationPosition","query"); - - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE+"&v=123&tr=w-400,h-600",is(url)); - } - - @Test - public void getUrl_with_options_as_path() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"tr:w-400,h-600/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE+"&v=123",is(url)); - } - - @Test - public void getUrl_with_chained_transformation_options_as_query() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - Map rotate=new HashMap<>(); - rotate.put("rotation","90"); - transformation.add(rotate); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - options.put("transformationPosition","query"); - - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE+"&v=123&tr=w-400,h-600:rt-90",is(url)); - } - - @Test - public void getUrl_with_chained_transformation_options_as_path() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - Map rotate=new HashMap<>(); - rotate.put("rotation","90"); - transformation.add(rotate); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint()+"tr:w-400,h-600:rt-90/default-image.jpg?ik-sdk-version="+ Version.VERSION_CODE+"&v=123",is(url)); - } - - @Test - public void getUrl_with_multiple_query_params_addition_check() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - queryParams.put("z","234"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("src","https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version="+Version.VERSION_CODE+"&q=abc&v=123&z=234&tr=w-400,h-600",is(url)); - } - - @Test - public void getUrl_with_double_and_check() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - queryParams.put("z","234"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("src","https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&&"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version="+Version.VERSION_CODE+"&q=abc&v=123&z=234&tr=w-400,h-600",is(url)); - } - - @Test - public void getUrl_with_double_question_mark_check() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - queryParams.put("z","234"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("src","https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg??"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version="+Version.VERSION_CODE+"&v=123&z=234&tr=w-400,h-600",is(url)); - } - - @Test - public void getUrl_with_src() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("src","https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version="+Version.VERSION_CODE+"&tr=w-400,h-600",is(url)); - } - - @Test - public void getUrl_src_with_query_params() { - Map queryParams=new HashMap<>(); - queryParams.put("v","123"); - queryParams.put("z","234"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("src","https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue"); - options.put("queryParameters",queryParams); - options.put("transformation",transformation); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version="+Version.VERSION_CODE+"&srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600",is(url)); - } - - @Test - public void getUrl_src_with_query_params_but_transformationPosition_is_path() { - Map queryParam=new HashMap<>(); - queryParam.put("v","123"); - queryParam.put("z","234"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - - Map options=new HashMap<>(); - options.put("src","https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("queryParameters",queryParam); - options.put("transformation",transformation); - options.put("transformationPosition","path"); - - String url=SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version="+Version.VERSION_CODE+"&v=123&z=234&tr=w-400,h-600",is(url)); - } - - @Test - public void getUrl_with_signature() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("width", "100"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/test-signed-url.png"); - options.put("transformation", transformation); - options.put("signed", true); - options.put("expireSeconds", 1000); - - String url = SUT.getUrl(options); - - assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); - } - - @Test - public void getUrl_with_signature_src_noTransform() { - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("transformation", Collections.emptyList()); - options.put("signed", true); - options.put("expireSeconds", 1000); - - String url = SUT.getUrl(options); - - assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url); - } - - @Test - public void getUrl_with_time_expire() { - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","600"); - scale.put("width","400"); - transformation.add(scale); - Map rotate=new HashMap<>(); - rotate.put("rotation","90"); - transformation.add(rotate); - - Map options=new HashMap<>(); - options.put("path","/default-image.jpg"); - options.put("transformation",transformation); - options.put("expireSeconds",100); - options.put("signed",true); - - String url=SUT.getUrl(options); - assertTrue(url.contains("ik-t")); - } - - // Test Case for Upload - - @Test(expected = UnknownHostException.class) - public void imageKit_upload_expect_UnknownHostException() throws UnknownHostException { - String imageUrl="https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; - try { - URL url = new URL(imageUrl); - - HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection(); - urlConnect.getContent(); - - } catch (UnknownHostException e) { - e.printStackTrace(); - throw e; - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void imageKit_upload_returnSuccess() throws IOException, InterruptedException { - String imageUrl="https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url = null; - try { - //make a URL to a known source - url = new URL(imageUrl); - - HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection(); - Object objData = urlConnect.getContent(); - - } catch (UnknownHostException e) { - System.out.println("CONNECTION FAILED:==> " + e); - e.printStackTrace(); - } - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); - List tags=new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileCreateRequest.setTags(tags); - fileCreateRequest.setFolder("demo1"); - String customCoordinates="10,10,20,20"; - fileCreateRequest.setCustomCoordinates(customCoordinates); - - List responseFields=new ArrayList<>(); - responseFields.add("thumbnail"); - responseFields.add("tags"); - responseFields.add("customCoordinates"); - - fileCreateRequest.setResponseFields(responseFields); - JsonObject optionsInnerObject = new JsonObject(); - optionsInnerObject.addProperty("add_shadow", true); - JsonObject innerObject1 = new JsonObject(); - innerObject1.addProperty("name", "remove-bg"); - innerObject1.add("options", optionsInnerObject); - JsonObject innerObject2 = new JsonObject(); - innerObject2.addProperty("name", "google-auto-tagging"); - innerObject2.addProperty("minConfidence", 10); - innerObject2.addProperty("maxTags", 5); - JsonArray jsonArray = new JsonArray(); - jsonArray.add(innerObject1); - jsonArray.add(innerObject2); - fileCreateRequest.setExtensions(jsonArray); - fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); - fileCreateRequest.setUseUniqueFileName(false); - fileCreateRequest.setPrivateFile(false); - fileCreateRequest.setOverwriteFile(false); - fileCreateRequest.setOverwriteAITags(false); - fileCreateRequest.setOverwriteTags(false); - fileCreateRequest.setOverwriteCustomMetadata(false); - JsonObject jsonObjectCustomMetadata = new JsonObject(); - jsonObjectCustomMetadata.addProperty("test1", 10); - fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"fileId\": \"62a465d245a84a0ef3852968\",\n" + - " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + - " \"size\": 23023,\n" + - " \"versionInfo\": {\n" + - " \"id\": \"62a465d245a84a0ef3852968\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + - " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + - " \"fileType\": \"image\",\n" + - " \"height\": 354,\n" + - " \"width\": 236,\n" + - " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + - " \"AITags\": [\n" + - " {\n" + - " \"name\": \"Clothing\",\n" + - " \"confidence\": 98.77,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Plant\",\n" + - " \"confidence\": 96.51,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Smile\",\n" + - " \"confidence\": 95.31,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Shoe\",\n" + - " \"confidence\": 95.2,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Street light\",\n" + - " \"confidence\": 91.05,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " }\n" + - " ],\n" + - " \"extensionStatus\": {\n" + - " \"remove-bg\": \"pending\",\n" + - " \"google-auto-tagging\": \"success\"\n" + - " }\n" + - "}")); - server.start(); - RestClient.UPLOAD_BASE_URL = server.url("/").toString(); - SUT.upload(fileCreateRequest); - RecordedRequest request = server.takeRequest(); - String json = "--boundary\r\n" + - "Content-Disposition: form-data; name=\"file\"\r\n" + - "Content-Length: 53\r\n" + - "\r\n" + - "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"fileName\"\r\n" + - "Content-Length: 20\r\n" + - "\r\n" + - "sample-cat-image.png\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + - "Content-Length: 5\r\n" + - "\r\n" + - "false\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"tags\"\r\n" + - "Content-Length: 27\r\n" + - "\r\n" + - "Software,Developer,Engineer\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"folder\"\r\n" + - "Content-Length: 5\r\n" + - "\r\n" + - "demo1\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + - "Content-Length: 11\r\n" + - "\r\n" + - "10,10,20,20\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"responseFields\"\r\n" + - "Content-Length: 32\r\n" + - "\r\n" + - "thumbnail,tags,customCoordinates\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + - "Content-Length: 4\r\n" + - "\r\n" + - "true\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + - "Content-Length: 4\r\n" + - "\r\n" + - "true\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + - "Content-Length: 4\r\n" + - "\r\n" + - "true\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + - "Content-Length: 4\r\n" + - "\r\n" + - "true\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"extensions\"\r\n" + - "Content-Length: 114\r\n" + - "\r\n" + - "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + - "Content-Length: 57\r\n" + - "\r\n" + - "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" + - "--boundary\r\n" + - "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + - "Content-Length: 12\r\n" + - "\r\n" + - "{\"test1\":10}\r\n" + - "--boundary--"; - assertEquals(json, request.getBody().readUtf8().trim()); - assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); - } - - @Test - public void imageKit_updateDetails_returnTrue() { - FileUpdateRequest fileUpdateRequest=new FileUpdateRequest("file_id"); - Result result=new Result(); - result.setSuccessful(true); - when(restClient.updateDetail(any(FileUpdateRequest.class))).thenReturn(result); - - Result result1=SUT.updateFileDetail(fileUpdateRequest); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test(expected = NullPointerException.class) - public void imageKit_updateDetails_throwException() { - FileUpdateRequest fileUpdateRequest=new FileUpdateRequest("file_id"); - Result result=new Result(); - result.setSuccessful(true); - when(restClient.updateDetail(any(FileUpdateRequest.class))).thenThrow(new NullPointerException()); - - Result result1=SUT.updateFileDetail(fileUpdateRequest); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test - public void imageKit_getFileList_returnList() { - ResultList resultList=new ResultList(); - List list= new ArrayList<>(10); - resultList.setResults(list); - when(restClient.getFileList(any())).thenReturn(resultList); - - Map options=new HashMap<>(); - options.put("skip","0"); - options.put("limit", "10"); - - ResultList resultList1=SUT.getFileList(options); - assertThat(resultList1.getResults().size(),is(resultList.getResults().size())); - } - - @Test - public void imageKit_getFileDetail_successExpected() { - Result result=new Result(); - result.setSuccessful(true); - when(restClient.getFileDetail(any(String.class))).thenReturn(result); - - Result result1=SUT.getFileDetail("fileId"); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test - public void imageKit_getFileMetaData_successExpected() { - ResultMetaData result=new ResultMetaData(); - result.setSuccessful(true); - when(restClient.getFileMetaData(any(String.class))).thenReturn(result); - - ResultMetaData result1=SUT.getFileMetadata("fileId"); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test - public void imageKit_getRemoteFileMetaData_successExpected() { - ResultMetaData result=new ResultMetaData(); - result.setSuccessful(true); - when(restClient.getRemoteFileMetaData(any(String.class))).thenReturn(result); - - ResultMetaData result1=SUT.getRemoteFileMetadata("remote_url"); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test - public void imageKit_deleteFile_successExpected() { - Result result=new Result(); - result.setSuccessful(true); - when(restClient.deleteFile(any(String.class))).thenReturn(result); - - Result result1=SUT.deleteFile("fileId"); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test - public void imageKit_bulkDeleteFiles_successExpected() { - List fileIds = new ArrayList<>(); - fileIds.add("file_id_1"); - fileIds.add("file_id_2"); - fileIds.add("file_id_3"); - - ResultFileDelete result=new ResultFileDelete(); - result.setSuccessfullyDeletedFileIds(fileIds); - result.setSuccessful(true); - when(restClient.bulkDeleteFiles(any())).thenReturn(result); - ResultFileDelete result1=SUT.bulkDeleteFiles(fileIds); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - } - - @Test - public void imageKit_purgeCache_successExpected() { - ResultCache result=new ResultCache(); - result.setSuccessful(true); - result.setRequestId("requestId"); - when(restClient.purgeCache(any(String.class))).thenReturn(result); - - ResultCache result1=SUT.purgeCache("fileId"); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - assertThat(result1.getRequestId(),is(result.getRequestId())); - } - - @Test - public void imageKit_getPurgeCacheStatus_successExpected() { - ResultCacheStatus result=new ResultCacheStatus(); - result.setSuccessful(true); - result.setStatus("Complete"); - when(restClient.getPurgeCacheStatus(any(String.class))).thenReturn(result); - - ResultCacheStatus result1=SUT.getPurgeCacheStatus("requestId"); - assertThat(result1.isSuccessful(),is(result.isSuccessful())); - assertThat(result1.getStatus(),is(result.getStatus())); - } - - @Test - public void withoutToken_getAuthenticationParameters_successExpected() { - Map auth = SUT.getAuthenticationParameters(); - assertNotNull(auth); - } - - @Test(expected = RuntimeException.class) - public void withoutPrivateKey_getAuthenticationParameters_successExpected() { - SUT.getConfig().setPrivateKey(null); - Map auth = SUT.getAuthenticationParameters(); - assertNotNull(auth); - } - - @Test - public void withTokenAndExpire_getAuthenticationParameters_successExpected() { - Map auth = SUT.getAuthenticationParameters("your_token",1582269249); - assertNotNull(auth); - assertEquals("your_token",auth.get("token")); - assertEquals("1582269249",auth.get("expire")); - assertEquals("e71bcd6031016b060d349d212e23e85c791decdd",auth.get("signature")); - } - - @Test - public void sameImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); - assertEquals(0,hammingDistance); - } - - @Test - public void similarImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("33699c96619cc69e", "968e978414fe04ea"); - assertEquals(30,hammingDistance); - } - - @Test - public void dissimilarImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518b", "7838873e791f8400"); - assertEquals(37,hammingDistance); - } - - @Test(expected = RuntimeException.class) - public void invalidHash_getHammingDistance_throwException() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518Z", "7838873e791f8400"); - } - - @Test(expected = RuntimeException.class) - public void differentLength_getHammingDistance_throwException() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400"); - } - - private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { - java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl); - assertTrue(actualUrl + " does not look like a signed url", matcher.matches()); - assertEquals(expectedBaseUrl, matcher.group(1)); - assertEquals(Version.VERSION_CODE, matcher.group(2)); - assertFalse(matcher.group(3).trim().isEmpty()); - assertFalse(matcher.group(4).trim().isEmpty()); - } - - @Test(expected = NotFoundException.class) - public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + - " \"message\": \"The requested file(s) does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"missingFileIds\": [\n" + - " \"629f3de17eb0fe4053615450\"\n" + - " ]\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.addTags(tagsRequest); - - server.takeRequest(); - } - - @Test - public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.addTags(tagsRequest); - RecordedRequest request = server.takeRequest(); - - String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag1"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + - " \"message\": \"The requested file(s) does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"missingFileIds\": [\n" + - " \"629f3de17eb0fe4053615450\"\n" + - " ]\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeTags(tagsRequest); - server.takeRequest(); - } - - @Test - public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeTags(tagsRequest); - RecordedRequest request = server.takeRequest(); - - String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); - } - - @Test - public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("[\n" + - " {\n" + - " \"id\": \"6291f00890ba008cc27f64d1\",\n" + - " \"name\": \"price\",\n" + - " \"label\": \"Amount\",\n" + - " \"schema\": {\n" + - " \"minValue\": 10,\n" + - " \"maxValue\": 200,\n" + - " \"type\": \"Number\"\n" + - " }\n" + - " },\n" + - " {\n" + - " \"id\": \"6296f91191fa57ccc36b15cf\",\n" + - " \"name\": \"Amount2\",\n" + - " \"label\": \"Amouunt\",\n" + - " \"schema\": {\n" + - " \"type\": \"Number\",\n" + - " \"minValue\": 10,\n" + - " \"maxValue\": 1000\n" + - " }\n" + - " }\n" + - "]")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getCustomMetaDataFields(false); - RecordedRequest request = server.takeRequest(); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/customMetadataFields?includeDeleted=false HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException, PartialSuccessException, NotFoundException, ConflictException { - - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"Invalid schema object\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"errors\": {\n" + - " \"minValue\": \"not allowed for this type\",\n" + - " \"maxValue\": \"not allowed for this type\"\n" + - " }\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("mockName"); - customMetaDataFieldCreateRequest.setLabel("mockLabel"); - customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - ResultCustomMetaDataField resultCustomMetaDataField = SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - RecordedRequest request = server.takeRequest(); - String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); - assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); - } - - @Test - public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException, PartialSuccessException, NotFoundException, ConflictException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" + - " \"name\": \"test1\",\n" + - " \"label\": \"test1\",\n" + - " \"schema\": {\n" + - " \"type\": \"Number\",\n" + - " \"isValueRequired\": false,\n" + - " \"minValue\": 10,\n" + - " \"maxValue\": 1000\n" + - " }\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("mockName"); - customMetaDataFieldCreateRequest.setLabel("mockLabel"); - customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - RecordedRequest request = server.takeRequest(); - - String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No such custom metadata field exists\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - SUT.deleteCustomMetaDataField("6296fd7091fa5768106b808E"); - server.takeRequest(); - } - - @Test - public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); - RecordedRequest request = server.takeRequest(); - - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No such custom metadata field exists\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setMinLength(10); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808E"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - server.takeRequest(); - } - - @Test(expected = BadRequestException.class) - public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + - " \"message\": \"Invalid schema object\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"errors\": {\n" + - " \"minLength\": \"not allowed for this type\"\n" + - " }\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setMinLength(10); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - server.takeRequest(); - } - - @Test - public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"id\": \"6296fd7091fa5768106b808d\",\n" + - " \"name\": \"Amount3\",\n" + - " \"label\": \"testPrices\",\n" + - " \"schema\": {\n" + - " \"minValue\": 0,\n" + - " \"maxValue\": 10,\n" + - " \"type\": \"Number\"\n" + - " }\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - RecordedRequest request = server.takeRequest(); - - String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List aiTags = new ArrayList<>(); - aiTags.add("Font"); - - AITagsRequest aiTagsRequest = new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"The requested file(s) does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"missingFileIds\": [\n" + - " \"629f3de17eb0fe4053615450\"\n" + - " ]\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeAITags(aiTagsRequest); - server.takeRequest(); - } - - @Test - public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List aiTags = new ArrayList<>(); - aiTags.add("Font"); - - AITagsRequest aiTagsRequest = new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeAITags(aiTagsRequest); - RecordedRequest request = server.takeRequest(); - - String aiTagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"AITags\":[\"Font\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(aiTagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/sample_image.jpg"); - copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No file found with filePath /sample_image.jpg\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"SOURCE_FILE_MISSING\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFile(copyFileRequest); - server.takeRequest(); - } - - @Test - public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/car_false.jpeg"); - copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFile(copyFileRequest); - RecordedRequest request = server.takeRequest(); - - String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); - moveFileRequest.setDestinationPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No file found with filePath /demo1/sample_image_th.jpg\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"SOURCE_FILE_MISSING\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFile(moveFileRequest); - server.takeRequest(); - } - - @Test - public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/new_la.jpg"); - moveFileRequest.setDestinationPath("test"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFile(moveFileRequest); - RecordedRequest request = server.takeRequest(); - - String moveFileRequestJson = "{\"sourceFilePath\":\"/new_la.jpg\",\"destinationPath\":\"test\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException, BadRequestException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/sample_image_th.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No file found in media library with filePath /sample_image_th.jpg\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"FILE_MISSING\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - server.takeRequest(); - } - - @Test(expected = ConflictException.class) - public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException, BadRequestException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/new1.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(409).setBody("{\n" + - " \"message\": \"File with name new_car.jpg already exists at the same location.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"FILE_ALREADY_EXISTS\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - server.takeRequest(); - } - - @Test - public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, PartialSuccessException, NotFoundException, BadRequestException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/car_false.jpeg"); - renameFileRequest.setNewFileName("new_car.jpeg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - RecordedRequest request = server.takeRequest(); - - String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(renameFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); - } - - @Test - public void createFolder_400_Expected() throws InterruptedException, IOException { - - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("/testFolder"); - createFolderRequest.setParentFolderPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"folderName parameter cannot have a slash.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.createFolder(createFolderRequest); - server.takeRequest(); - } - - @Test - public void createFolder_successExpected() throws InterruptedException, IOException { - - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("testFolder"); - createFolderRequest.setParentFolderPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.createFolder(createFolderRequest); - RecordedRequest request = server.takeRequest(); - - String createFolderRequestJson = "{\"folderName\":\"testFolder\",\"parentFolderPath\":\"/\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(createFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath("/testFolder"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No folder found with folderPath testFolder/\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"FOLDER_NOT_FOUND\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFolder(deleteFolderRequest); - server.takeRequest(); - } - - @Test - public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath("testFolder"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFolder(deleteFolderRequest); - RecordedRequest request = server.takeRequest(); - - String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(deleteFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/testFolder"); - copyFolderRequest.setDestinationPath("/test"); - copyFolderRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"NO_FILES_FOLDER\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFolder(copyFolderRequest); - server.takeRequest(); - } - - @Test - public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/testFolder"); - copyFolderRequest.setDestinationPath("/Gallery"); - copyFolderRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFolder(copyFolderRequest); - RecordedRequest request = server.takeRequest(); - - String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/testFolder/"); - moveFolderRequest.setDestinationPath("/Gallery"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"NO_FILES_FOLDER\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFolder(moveFolderRequest); - server.takeRequest(); - } - - @Test - public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/testFolder"); - moveFolderRequest.setDestinationPath("/Gallery"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFolder(moveFolderRequest); - RecordedRequest request = server.takeRequest(); - - String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); - } - - @Test - public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(500)); - server.enqueue(new MockResponse().setBody("{\n" + - " \"message\": \"We have experienced an internal error while processing your request.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - ResultBulkJobStatus resultBulkJobStatus = SUT.getBulkJobStatus("jobId"); - RecordedRequest request = server.takeRequest(); - - assertEquals(500, resultBulkJobStatus.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/bulkJobs/jobId HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/jobId"), request.getRequestUrl().toString()); - } - - @Test - public void getBulkJobStatus_successExpected() throws InterruptedException, IOException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" + - " \"type\": \"MOVE_FOLDER\",\n" + - " \"status\": \"Completed\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/bulkJobs/629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"The requested asset does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersions("id"); - server.takeRequest();} - - @Test - public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("[\n" + - " {\n" + - " \"type\": \"file\",\n" + - " \"name\": \"w2_image.png\",\n" + - " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + - " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + - " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + - " \"tags\": [\n" + - " \"tag10\"\n" + - " ],\n" + - " \"AITags\": [\n" + - " {\n" + - " \"name\": \"Colorfulness\",\n" + - " \"confidence\": 96.19,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Purple\",\n" + - " \"confidence\": 86.05,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Violet\",\n" + - " \"confidence\": 81.08,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Rectangle\",\n" + - " \"confidence\": 80.99,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " }\n" + - " ],\n" + - " \"versionInfo\": {\n" + - " \"id\": \"629f3de17eb0fe4053615450\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"embeddedMetadata\": {\n" + - " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + - " \"ImageWidth\": 1006,\n" + - " \"ImageHeight\": 467,\n" + - " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + - " },\n" + - " \"customCoordinates\": null,\n" + - " \"customMetadata\": {},\n" + - " \"isPrivateFile\": false,\n" + - " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + - " \"fileType\": \"image\",\n" + - " \"filePath\": \"/w2_image.png\",\n" + - " \"height\": 467,\n" + - " \"width\": 1006,\n" + - " \"size\": 47579,\n" + - " \"hasAlpha\": true,\n" + - " \"mime\": \"image/png\"\n" + - " }\n" + - "]")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersions("629f3de17eb0fe4053615450"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"The requested asset does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); - server.takeRequest(); - } - - @Test - public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"type\": \"file\",\n" + - " \"name\": \"w2_image.png\",\n" + - " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + - " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + - " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + - " \"tags\": [\n" + - " \"tag10\"\n" + - " ],\n" + - " \"AITags\": [\n" + - " {\n" + - " \"name\": \"Colorfulness\",\n" + - " \"confidence\": 96.19,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Purple\",\n" + - " \"confidence\": 86.05,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Violet\",\n" + - " \"confidence\": 81.08,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " },\n" + - " {\n" + - " \"name\": \"Rectangle\",\n" + - " \"confidence\": 80.99,\n" + - " \"source\": \"google-auto-tagging\"\n" + - " }\n" + - " ],\n" + - " \"versionInfo\": {\n" + - " \"id\": \"629f3de17eb0fe4053615450\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"embeddedMetadata\": {\n" + - " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + - " \"ImageWidth\": 1006,\n" + - " \"ImageHeight\": 467,\n" + - " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + - " },\n" + - " \"customCoordinates\": null,\n" + - " \"customMetadata\": {},\n" + - " \"isPrivateFile\": false,\n" + - " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + - " \"fileType\": \"image\",\n" + - " \"filePath\": \"/w2_image.png\",\n" + - " \"height\": 467,\n" + - " \"width\": 1006,\n" + - " \"size\": 47579,\n" + - " \"hasAlpha\": true,\n" + - " \"mime\": \"image/png\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("id"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + - " \"message\": \"Your request contains invalid versionId parameter.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - server.takeRequest(); - } - - @Test(expected = NotFoundException.class) - public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("62a9c403d89eedb81721102b"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"The requested file version does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - server.takeRequest(); - } - - @Test - public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - RecordedRequest request = server.takeRequest(); - - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), request.getRequestUrl().toString()); - } - - + private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern + .compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)"); + + private ImageKit SUT; + + RestClient restClient; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + restClient = new RestClient(SUT); + SUT.setRestClient(restClient); + } + + @Test + public void imageKit_configurationTest() { + Configuration config = new Configuration(); + config.setPrivateKey("private_Key"); + config.setPublicKey("public_key"); + config.setUrlEndpoint("url_end_point"); + ImageKit.getInstance().setConfig(config); + assertEquals(config.toString(), ImageKit.getInstance().getConfig().toString()); + } + + @Test + public void getUrl_with_height_width_options() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + + assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE, is(url)); + } + + @Test + public void getUrl_with_height_width_options_url_version_check() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE, is(url)); + assertTrue(url.contains("ik-sdk-version=" + Version.VERSION_CODE)); + } + + @Test + public void getUrl_with_new_transformation_params_options() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map newParams = new HashMap<>(); + newParams.put("myparam", "40"); + transformation.add(newParams); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600:myparam-40/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE, is(url)); + } + + @Test + public void getUrl_with_slash_in_path() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE, is(url)); + } + + @Test + public void getUrl_without_slash_in_path() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map options = new HashMap<>(); + options.put("path", "default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE, is(url)); + } + + @Test + public void getUrl_with_overriding_urlEndpoint() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_override_imagekit_id"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_override_imagekit_id/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE, is(url)); + } + + @Test + public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_override_imagekit_id"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_override_imagekit_id/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE, is(url)); + } + + @Test + public void getUrl_with_options_as_query() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + options.put("transformationPosition", "query"); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "default-image.jpg?ik-sdk-version=" + Version.VERSION_CODE + + "&v=123&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_options_as_path() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&v=123", is(url)); + } + + @Test + public void getUrl_with_chained_transformation_options_as_query() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + options.put("transformationPosition", "query"); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "default-image.jpg?ik-sdk-version=" + Version.VERSION_CODE + + "&v=123&tr=w-400,h-600:rt-90", is(url)); + } + + @Test + public void getUrl_with_chained_transformation_options_as_path() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600:rt-90/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&v=123", is(url)); + } + + @Test + public void getUrl_with_multiple_query_params_addition_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&q=abc&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_double_and_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&&"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&q=abc&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_double_question_mark_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg??"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_src() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_src_with_query_params() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_src_with_query_params_but_transformationPosition_is_path() { + Map queryParam = new HashMap<>(); + queryParam.put("v", "123"); + queryParam.put("z", "234"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("queryParameters", queryParam); + options.put("transformation", transformation); + options.put("transformationPosition", "path"); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" + + Version.VERSION_CODE + "&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_signature() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("width", "100"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/test-signed-url.png"); + options.put("transformation", transformation); + options.put("signed", true); + options.put("expireSeconds", 1000); + + String url = SUT.getUrl(options); + + assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); + } + + @Test + public void getUrl_with_signature_src_noTransform() { + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("transformation", Collections.emptyList()); + options.put("signed", true); + options.put("expireSeconds", 1000); + + String url = SUT.getUrl(options); + + assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url); + } + + @Test + public void getUrl_with_time_expire() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + options.put("expireSeconds", 100); + options.put("signed", true); + + String url = SUT.getUrl(options); + assertTrue(url.contains("ik-t")); + } + + // Test Case for Upload + + @Test(expected = UnknownHostException.class) + public void imageKit_upload_expect_UnknownHostException() throws UnknownHostException { + String imageUrl = "https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; + try { + URL url = new URL(imageUrl); + + HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); + urlConnect.getContent(); + + } catch (UnknownHostException e) { + e.printStackTrace(); + throw e; + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void imageKit_upload_returnSuccess() throws IOException, InterruptedException { + String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; + URL url = null; + try { + // make a URL to a known source + url = new URL(imageUrl); + + HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); + Object objData = urlConnect.getContent(); + + } catch (UnknownHostException e) { + System.out.println("CONNECTION FAILED:==> " + e); + e.printStackTrace(); + } + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + fileCreateRequest.setFolder("demo1"); + String customCoordinates = "10,10,20,20"; + fileCreateRequest.setCustomCoordinates(customCoordinates); + + List responseFields = new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); + + fileCreateRequest.setResponseFields(responseFields); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 10); + innerObject2.addProperty("maxTags", 5); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + fileCreateRequest.setUseUniqueFileName(false); + fileCreateRequest.setPrivateFile(false); + fileCreateRequest.setOverwriteFile(false); + fileCreateRequest.setOverwriteAITags(false); + fileCreateRequest.setOverwriteTags(false); + fileCreateRequest.setOverwriteCustomMetadata(false); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"fileId\": \"62a465d245a84a0ef3852968\",\n" + + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + " \"size\": 23023,\n" + + " \"versionInfo\": {\n" + " \"id\": \"62a465d245a84a0ef3852968\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"height\": 354,\n" + " \"width\": 236,\n" + + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"AITags\": [\n" + " {\n" + " \"name\": \"Clothing\",\n" + + " \"confidence\": 98.77,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Plant\",\n" + + " \"confidence\": 96.51,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Smile\",\n" + + " \"confidence\": 95.31,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Shoe\",\n" + + " \"confidence\": 95.2,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Street light\",\n" + + " \"confidence\": 91.05,\n" + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + " ],\n" + " \"extensionStatus\": {\n" + " \"remove-bg\": \"pending\",\n" + + " \"google-auto-tagging\": \"success\"\n" + " }\n" + "}")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + RecordedRequest request = server.takeRequest(); + String json = "--boundary\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" + "Content-Length: 53\r\n" + + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"fileName\"\r\n" + "Content-Length: 20\r\n" + "\r\n" + + "sample-cat-image.png\r\n" + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + + "false\r\n" + "--boundary\r\n" + "Content-Disposition: form-data; name=\"tags\"\r\n" + + "Content-Length: 27\r\n" + "\r\n" + "Software,Developer,Engineer\r\n" + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" + + "--boundary\r\n" + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + + "Content-Length: 11\r\n" + "\r\n" + "10,10,20,20\r\n" + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" + + "thumbnail,tags,customCoordinates\r\n" + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "true\r\n" + "--boundary\r\n" + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "true\r\n" + "--boundary\r\n" + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--boundary\r\n" + + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" + + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + + "--boundary\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" + + "--boundary\r\n" + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + + "Content-Length: 12\r\n" + "\r\n" + "{\"test1\":10}\r\n" + "--boundary--"; + assertEquals(json, request.getBody().readUtf8().trim()); + assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); + } + + @Test + public void imageKit_updateDetails_returnTrue() { + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("file_id"); + Result result = new Result(); + result.setSuccessful(true); + when(restClient.updateDetail(any(FileUpdateRequest.class))).thenReturn(result); + + Result result1 = SUT.updateFileDetail(fileUpdateRequest); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + } + + @Test(expected = NullPointerException.class) + public void imageKit_updateDetails_throwException() { + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("file_id"); + Result result = new Result(); + result.setSuccessful(true); + when(restClient.updateDetail(any(FileUpdateRequest.class))).thenThrow(new NullPointerException()); + + Result result1 = SUT.updateFileDetail(fileUpdateRequest); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + } + + @Test + public void imageKit_getFileList_returnList() { + ResultList resultList = new ResultList(); + List list = new ArrayList<>(10); + resultList.setResults(list); + when(restClient.getFileList(any())).thenReturn(resultList); + + Map options = new HashMap<>(); + options.put("skip", "0"); + options.put("limit", "10"); + + ResultList resultList1 = SUT.getFileList(options); + assertThat(resultList1.getResults().size(), is(resultList.getResults().size())); + } + + @Test + public void imageKit_getFileDetail_successExpected() { + Result result = new Result(); + result.setSuccessful(true); + when(restClient.getFileDetail(any(String.class))).thenReturn(result); + + Result result1 = SUT.getFileDetail("fileId"); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + } + + @Test + public void imageKit_getFileMetaData_successExpected() { + ResultMetaData result = new ResultMetaData(); + result.setSuccessful(true); + when(restClient.getFileMetaData(any(String.class))).thenReturn(result); + + ResultMetaData result1 = SUT.getFileMetadata("fileId"); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + } + + @Test + public void imageKit_getRemoteFileMetaData_successExpected() { + ResultMetaData result = new ResultMetaData(); + result.setSuccessful(true); + when(restClient.getRemoteFileMetaData(any(String.class))).thenReturn(result); + + ResultMetaData result1 = SUT.getRemoteFileMetadata("remote_url"); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + } + + @Test + public void imageKit_deleteFile_successExpected() { + Result result = new Result(); + result.setSuccessful(true); + when(restClient.deleteFile(any(String.class))).thenReturn(result); + + Result result1 = SUT.deleteFile("fileId"); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + } + + @Test + public void imageKit_bulkDeleteFiles_successExpected() { + List fileIds = new ArrayList<>(); + fileIds.add("file_id_1"); + fileIds.add("file_id_2"); + fileIds.add("file_id_3"); + + ResultFileDelete result = new ResultFileDelete(); + result.setSuccessfullyDeletedFileIds(fileIds); + result.setSuccessful(true); + when(restClient.bulkDeleteFiles(any())).thenReturn(result); + ResultFileDelete result1 = SUT.bulkDeleteFiles(fileIds); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + } + + @Test + public void imageKit_purgeCache_successExpected() { + ResultCache result = new ResultCache(); + result.setSuccessful(true); + result.setRequestId("requestId"); + when(restClient.purgeCache(any(String.class))).thenReturn(result); + + ResultCache result1 = SUT.purgeCache("fileId"); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + assertThat(result1.getRequestId(), is(result.getRequestId())); + } + + @Test + public void imageKit_getPurgeCacheStatus_successExpected() { + ResultCacheStatus result = new ResultCacheStatus(); + result.setSuccessful(true); + result.setStatus("Complete"); + when(restClient.getPurgeCacheStatus(any(String.class))).thenReturn(result); + + ResultCacheStatus result1 = SUT.getPurgeCacheStatus("requestId"); + assertThat(result1.isSuccessful(), is(result.isSuccessful())); + assertThat(result1.getStatus(), is(result.getStatus())); + } + + @Test + public void withoutToken_getAuthenticationParameters_successExpected() { + Map auth = SUT.getAuthenticationParameters(); + assertNotNull(auth); + } + + @Test(expected = RuntimeException.class) + public void withoutPrivateKey_getAuthenticationParameters_successExpected() { + SUT.getConfig().setPrivateKey(null); + Map auth = SUT.getAuthenticationParameters(); + assertNotNull(auth); + } + + @Test + public void withTokenAndExpire_getAuthenticationParameters_successExpected() { + Map auth = SUT.getAuthenticationParameters("your_token", 1582269249); + assertNotNull(auth); + assertEquals("your_token", auth.get("token")); + assertEquals("1582269249", auth.get("expire")); + assertEquals("e71bcd6031016b060d349d212e23e85c791decdd", auth.get("signature")); + } + + @Test + public void sameImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); + assertEquals(0, hammingDistance); + } + + @Test + public void similarImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("33699c96619cc69e", "968e978414fe04ea"); + assertEquals(30, hammingDistance); + } + + @Test + public void dissimilarImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518b", "7838873e791f8400"); + assertEquals(37, hammingDistance); + } + + @Test(expected = RuntimeException.class) + public void invalidHash_getHammingDistance_throwException() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518Z", "7838873e791f8400"); + } + + @Test(expected = RuntimeException.class) + public void differentLength_getHammingDistance_throwException() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400"); + } + + private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { + java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl); + assertTrue(actualUrl + " does not look like a signed url", matcher.matches()); + assertEquals(expectedBaseUrl, matcher.group(1)); + assertEquals(Version.VERSION_CODE, matcher.group(2)); + assertFalse(matcher.group(3).trim().isEmpty()); + assertFalse(matcher.group(4).trim().isEmpty()); + } + + @Test(expected = NotFoundException.class) + public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.addTags(tagsRequest); + + server.takeRequest(); + } + + @Test + public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.addTags(tagsRequest); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeTags(tagsRequest); + server.takeRequest(); + } + + @Test + public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeTags(tagsRequest); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); + } + + @Test + public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" + + " \"name\": \"price\",\n" + " \"label\": \"Amount\",\n" + " \"schema\": {\n" + + " \"minValue\": 10,\n" + " \"maxValue\": 200,\n" + + " \"type\": \"Number\"\n" + " }\n" + " },\n" + " {\n" + + " \"id\": \"6296f91191fa57ccc36b15cf\",\n" + " \"name\": \"Amount2\",\n" + + " \"label\": \"Amouunt\",\n" + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + " \"minValue\": 10,\n" + + " \"maxValue\": 1000\n" + " }\n" + " }\n" + "]")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getCustomMetaDataFields(false); + RecordedRequest request = server.takeRequest(); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/customMetadataFields?includeDeleted=false HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), + request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException, + PartialSuccessException, NotFoundException, ConflictException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"errors\": {\n" + + " \"minValue\": \"not allowed for this type\",\n" + + " \"maxValue\": \"not allowed for this type\"\n" + " }\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + ResultCustomMetaDataField resultCustomMetaDataField = SUT + .createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test + public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, + BadRequestException, PartialSuccessException, NotFoundException, ConflictException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" + + " \"name\": \"test1\",\n" + " \"label\": \"test1\",\n" + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + " \"isValueRequired\": false,\n" + + " \"minValue\": 10,\n" + " \"maxValue\": 1000\n" + " }\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + SUT.deleteCustomMetaDataField("6296fd7091fa5768106b808E"); + server.takeRequest(); + } + + @Test + public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, + NotFoundException, PartialSuccessException, ConflictException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808E"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); + } + + @Test(expected = BadRequestException.class) + public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, + NotFoundException, PartialSuccessException, ConflictException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"errors\": {\n" + " \"minLength\": \"not allowed for this type\"\n" + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); + } + + @Test + public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, + BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse() + .setBody("{\n" + " \"id\": \"6296fd7091fa5768106b808d\",\n" + " \"name\": \"Amount3\",\n" + + " \"label\": \"testPrices\",\n" + " \"schema\": {\n" + " \"minValue\": 0,\n" + + " \"maxValue\": 10,\n" + " \"type\": \"Number\"\n" + " }\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, + NotFoundException, BadRequestException, ConflictException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeAITags(aiTagsRequest); + server.takeRequest(); + } + + @Test + public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, + NotFoundException, BadRequestException, ConflictException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeAITags(aiTagsRequest); + RecordedRequest request = server.takeRequest(); + + String aiTagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"AITags\":[\"Font\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(aiTagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/sample_image.jpg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No file found with filePath /sample_image.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFile(copyFileRequest); + server.takeRequest(); + } + + @Test + public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/car_false.jpeg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFile(copyFileRequest); + RecordedRequest request = server.takeRequest(); + + String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); + moveFileRequest.setDestinationPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No file found with filePath /demo1/sample_image_th.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFile(moveFileRequest); + server.takeRequest(); + } + + @Test + public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/new_la.jpg"); + moveFileRequest.setDestinationPath("test"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFile(moveFileRequest); + RecordedRequest request = server.takeRequest(); + + String moveFileRequestJson = "{\"sourceFilePath\":\"/new_la.jpg\",\"destinationPath\":\"test\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/sample_image_th.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + + " \"message\": \"No file found in media library with filePath /sample_image_th.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); + } + + @Test(expected = ConflictException.class) + public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/new1.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(409) + .setBody("{\n" + + " \"message\": \"File with name new_car.jpg already exists at the same location.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FILE_ALREADY_EXISTS\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); + } + + @Test + public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/car_false.jpeg"); + renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + RecordedRequest request = server.takeRequest(); + + String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(renameFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); + } + + @Test + public void createFolder_400_Expected() throws InterruptedException, IOException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("/testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue( + new MockResponse().setBody("{\n" + " \"message\": \"folderName parameter cannot have a slash.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.createFolder(createFolderRequest); + server.takeRequest(); + } + + @Test + public void createFolder_successExpected() throws InterruptedException, IOException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.createFolder(createFolderRequest); + RecordedRequest request = server.takeRequest(); + + String createFolderRequestJson = "{\"folderName\":\"testFolder\",\"parentFolderPath\":\"/\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(createFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("/testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No folder found with folderPath testFolder/\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FOLDER_NOT_FOUND\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFolder(deleteFolderRequest); + server.takeRequest(); + } + + @Test + public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFolder(deleteFolderRequest); + RecordedRequest request = server.takeRequest(); + + String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(deleteFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/test"); + copyFolderRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + server.takeRequest(); + } + + @Test + public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/Gallery"); + copyFolderRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + RecordedRequest request = server.takeRequest(); + + String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder/"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFolder(moveFolderRequest); + server.takeRequest(); + } + + @Test + public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFolder(moveFolderRequest); + RecordedRequest request = server.takeRequest(); + + String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } + + @Test + public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(500)); + server.enqueue(new MockResponse().setBody( + "{\n" + " \"message\": \"We have experienced an internal error while processing your request.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + ResultBulkJobStatus resultBulkJobStatus = SUT.getBulkJobStatus("jobId"); + RecordedRequest request = server.takeRequest(); + + assertEquals(500, resultBulkJobStatus.getResponseMetaData().getHttpStatusCode()); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/bulkJobs/jobId HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/jobId"), request.getRequestUrl().toString()); + } + + @Test + public void getBulkJobStatus_successExpected() throws InterruptedException, IOException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" + + " \"type\": \"MOVE_FOLDER\",\n" + " \"status\": \"Completed\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/bulkJobs/629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersions("id"); + server.takeRequest(); + } + + @Test + public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + + " \"tag10\"\n" + " ],\n" + " \"AITags\": [\n" + " {\n" + + " \"name\": \"Colorfulness\",\n" + " \"confidence\": 96.19,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Purple\",\n" + " \"confidence\": 86.05,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Violet\",\n" + " \"confidence\": 81.08,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Rectangle\",\n" + " \"confidence\": 80.99,\n" + + " \"source\": \"google-auto-tagging\"\n" + " }\n" + " ],\n" + + " \"versionInfo\": {\n" + " \"id\": \"629f3de17eb0fe4053615450\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + " \"ImageWidth\": 1006,\n" + + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + + " \"height\": 467,\n" + " \"width\": 1006,\n" + " \"size\": 47579,\n" + + " \"hasAlpha\": true,\n" + " \"mime\": \"image/png\"\n" + " }\n" + "]")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersions("629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + server.takeRequest(); + } + + @Test + public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException, + ConflictException, PartialSuccessException, BadRequestException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + " \"tag10\"\n" + + " ],\n" + " \"AITags\": [\n" + " {\n" + " \"name\": \"Colorfulness\",\n" + + " \"confidence\": 96.19,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Purple\",\n" + + " \"confidence\": 86.05,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Violet\",\n" + + " \"confidence\": 81.08,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Rectangle\",\n" + + " \"confidence\": 80.99,\n" + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + " ],\n" + " \"versionInfo\": {\n" + + " \"id\": \"629f3de17eb0fe4053615450\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + + " \"embeddedMetadata\": {\n" + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + + " \"ImageWidth\": 1006,\n" + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + " \"height\": 467,\n" + + " \"width\": 1006,\n" + " \"size\": 47579,\n" + " \"hasAlpha\": true,\n" + + " \"mime\": \"image/png\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), + request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, + NotFoundException, PartialSuccessException, ConflictException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("id"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + " \"message\": \"Your request contains invalid versionId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); + } + + @Test(expected = NotFoundException.class) + public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, + NotFoundException, PartialSuccessException, ConflictException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("62a9c403d89eedb81721102b"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested file version does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); + } + + @Test + public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, + NotFoundException, PartialSuccessException, ConflictException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2 HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), + request.getRequestUrl().toString()); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java index 3e46cd4..2e41210 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java @@ -13,47 +13,49 @@ import com.google.gson.JsonObject; public class BaseFileTest { - private BaseFile SUT; - - @Before - public void setUp() throws Exception { - SUT=new BaseFile(); - } - - @Test - public void constructor_test() { - List tags=mock(List.class); - SUT=new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags,true, "0,0,10,20", "image", new JsonArray(), new JsonObject(), new JsonObject(), new JsonObject(), new JsonObject(), "file", "image/jpeg", false, new Date(), new Date()); - assertNotNull(SUT); - } - - @Test - public void test_getter_setter() { - List tags=mock(List.class); + private BaseFile SUT; + + @Before + public void setUp() throws Exception { + SUT = new BaseFile(); + } + + @Test + public void constructor_test() { + List tags = mock(List.class); + SUT = new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags, true, "0,0,10,20", + "image", new JsonArray(), new JsonObject(), new JsonObject(), new JsonObject(), new JsonObject(), + "file", "image/jpeg", false, new Date(), new Date()); + assertNotNull(SUT); + } + + @Test + public void test_getter_setter() { + List tags = mock(List.class); // SUT=new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags,true, "0,0,10,20", "fileType"); - SUT.setFileId("fileId"); - SUT.setName("name"); - SUT.setUrl("url"); - SUT.setThumbnail("thumbnail"); - SUT.setHeight(10); - SUT.setWidth(20); - SUT.setSize(30); - SUT.setFilePath("filePath"); - SUT.setTags(tags); - SUT.setPrivateFile(true); - SUT.setCustomCoordinates("0,0,10,20"); - SUT.setFileType("image"); - assertEquals("fileId",SUT.getFileId()); - assertEquals("name",SUT.getName()); - assertEquals("url",SUT.getUrl()); - assertEquals("thumbnail",SUT.getThumbnail()); - assertEquals(10,SUT.getHeight()); - assertEquals(20,SUT.getWidth()); - assertEquals(30,SUT.getSize()); - assertEquals("filePath",SUT.getFilePath()); - assertEquals(tags,SUT.getTags()); - assertEquals(true,SUT.isPrivateFile()); - assertEquals("0,0,10,20",SUT.getCustomCoordinates()); - assertEquals("image",SUT.getFileType()); - } + SUT.setFileId("fileId"); + SUT.setName("name"); + SUT.setUrl("url"); + SUT.setThumbnail("thumbnail"); + SUT.setHeight(10); + SUT.setWidth(20); + SUT.setSize(30); + SUT.setFilePath("filePath"); + SUT.setTags(tags); + SUT.setPrivateFile(true); + SUT.setCustomCoordinates("0,0,10,20"); + SUT.setFileType("image"); + assertEquals("fileId", SUT.getFileId()); + assertEquals("name", SUT.getName()); + assertEquals("url", SUT.getUrl()); + assertEquals("thumbnail", SUT.getThumbnail()); + assertEquals(10, SUT.getHeight()); + assertEquals(20, SUT.getWidth()); + assertEquals(30, SUT.getSize()); + assertEquals("filePath", SUT.getFilePath()); + assertEquals(tags, SUT.getTags()); + assertEquals(true, SUT.isPrivateFile()); + assertEquals("0,0,10,20", SUT.getCustomCoordinates()); + assertEquals("image", SUT.getFileType()); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java index abd7dd2..7f9e42b 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java @@ -33,520 +33,468 @@ public class RestClientTest { - RestClient SUT; - - @Before - public void setUp() throws Exception { - ImageKit imageKit=ImageKit.getInstance(); - imageKit.setConfig(Utils.getSystemConfig(RestClientTest.class)); - SUT=new RestClient(imageKit); - } - - @Test - public void valid_updateDetail_expectSuccess() { - String resp="{\n" + - " \"fileId\" : \"598821f949c0a938d57563bd\"," + - " \"type\": \"file\"," + - " \"name\": \"demo.jpg\",\n" + - " \"filePath\": \"/demo.jpg\",\n" + - " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + - " \"isPrivateFile\" : false,\n" + - " \"customCoordinates\" : null,\n" + - " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\",\n" + - " \"fileType\": \"image\"\n" + - "}"; - OkHttpClientStub clientStub= new OkHttpClientStub(resp, - 200, "Ok"); - SUT.setClient(clientStub); - - MultipartBuilder multipartBuilder=mock(MultipartBuilder.class); - MultipartBody body=new MultipartBody.Builder().addFormDataPart("","").build(); - ArgumentCaptor ac=ArgumentCaptor.forClass(FileUpdateRequest.class); - when(multipartBuilder.build(ac.capture())).thenReturn(body); - SUT.setMultipartBuilder(multipartBuilder); - - FileUpdateRequest fileUpdateRequest=new FileUpdateRequest("598821f949c0a938d57563bd"); - List tags=new ArrayList<>(); - tags.add("t-shirt"); - tags.add("round-neck"); - tags.add("sale2020"); - fileUpdateRequest.setTags(tags); - Result result = SUT.updateDetail(fileUpdateRequest); - assertEquals(fileUpdateRequest,ac.getValue()); - } - - @Test - public void internalServerError_updateDetail_expectFailed() { - JsonObject json=new JsonObject(); - json.addProperty("message","Internal Server Error"); - OkHttpClientStub clientStub= new OkHttpClientStub(json.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - FileUpdateRequest fileUpdateRequest=new FileUpdateRequest("my_file_id"); - Result result = SUT.updateDetail(fileUpdateRequest); - assertNotNull(result.getMessage()); - } - - @Test - public void unprocessable_updateDetail_expectFailed() { - JsonObject json=new JsonObject(); - json.addProperty("message","Internal Server Error"); - OkHttpClientStub clientStub= new OkHttpClientStub(json.toString(), - 422, "Un-processable Entity"); - SUT.setClient(clientStub); - FileUpdateRequest fileUpdateRequest=new FileUpdateRequest("my_file_id"); - Result result = SUT.updateDetail(fileUpdateRequest); - assertNotNull(result.getMessage()); - } - - @Test(expected = RuntimeException.class) - public void timeOutException_updateDetail_expectFailed() { - JsonObject json=new JsonObject(); - json.addProperty("message","Internal Server Error"); - OkHttpClientStub clientStub= new OkHttpClientStub(json.toString(), - 422, "Un-processable Entity"); - SUT.setClient(clientStub); - clientStub.setTimeoutException(); - FileUpdateRequest fileUpdateRequest=new FileUpdateRequest("my_file_id"); - Result result = SUT.updateDetail(fileUpdateRequest); - assertNotNull(result.getMessage()); - } - - @Test - public void valid_getFileList_expectSuccess() { - String resp="[\n" + - "\t{\n" + - "\t \"fileId\" : \"598821f949c0a938d57563bd\",\n" + - " \"type\": \"file\",\n" + - " \"name\": \"demo.jpg\",\n" + - " \"filePath\": \"/demo.jpg\",\n" + - " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + - " \"isPrivateFile\" : false,\n" + - " \"customCoordinates\" : null,\n" + - " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\"," + - " \"fileType\": \"image\"" + - " }" + - "]"; - - OkHttpClientStub clientStub= new OkHttpClientStub(resp, 200, "Ok"); - - SUT.setClient(clientStub); - - Map options=new HashMap<>(); - options.put("skip","0"); - options.put("limit", "10"); - - ResultList result = SUT.getFileList(options); - - - assertEquals("https://api.imagekit.io/v1/files?limit=10&skip=0",SUT.request.url().toString()); - - assertThat(resp,is(result.getRaw())); - } - - @Test - public void unProcessableEntity_getFileList_expectFailed() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Un-processable Entity"); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 422, "Un-processable Entity"); - SUT.setClient(clientStub); - Map options=new HashMap<>(); - options.put("skip","0"); - options.put("limit", "10"); - ResultList result = SUT.getFileList(options); - assertNotNull(result.getMessage()); - } - - @Test - public void internalServerError_getFileList_expectFailed() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Internal Server Error"); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - Map options=new HashMap<>(); - options.put("skip","0"); - options.put("limit", "10"); - ResultList result = SUT.getFileList(options); - assertNotNull(result.getMessage()); - } - - @Test - public void getFileDetails_valid_request_expect_success() { - String resp="{\n" + - " \"fileId\" : \"598821f949c0a938d57563bd\"," + - " \"type\": \"file\"," + - " \"name\": \"demo.jpg\",\n" + - " \"filePath\": \"/demo.jpg\",\n" + - " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + - " \"isPrivateFile\" : false,\n" + - " \"customCoordinates\" : null,\n" + - " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\",\n" + - " \"fileType\": \"image\"\n" + - "}"; - - OkHttpClientStub clientStub= new OkHttpClientStub(resp, - 200, "Ok"); - SUT.setClient(clientStub); - Result result = SUT.getFileDetail("598821f949c0a938d57563bd"); - // Asserting endpoint sending to server - assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/details",SUT.request.url().toString()); - // Asserting mock response getting from server. - assertThat(resp, is(result.getRaw())); - } - - @Test - public void getFileDetails_internal_server_error() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - Result result = SUT.getFileDetail("fileId"); - assertNotNull( result.getMessage()); - } - - @Test - public void getFileDetails_un_processable_entity() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Un-processable Entity."); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 433, "Un-processable Entity"); - SUT.setClient(clientStub); - Result result = SUT.getFileDetail("fileId"); - assertNotNull( result.getMessage()); - } - - @Test - public void getFileMetaData_valid_request_expect_success() { - String resp="{" + - "\"height\":68, \"width\":100, \"size\":7749, \"format\":\"jpg\", \"hasColorProfile\":true, \"quality\":0, \"density\":72, \"hasTransparency\":false, \"pHash\":\"f06830ca9f1e3e90\", \"exif\":{" + - "\"image\":{" + - "\"Make\":\"Canon\", \"Model\":\"CanonEOS40D\", \"Orientation\":1, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"Software\":\"GIMP2.4.5\", \"ModifyDate\":\"2008:07:3110:38:11\", \"YCbCrPositioning\":2, \"ExifOffset\":214, \"GPSInfo\":978" + - "}, \"thumbnail\":{" + - "\"Compression\":6, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"ThumbnailOffset\":1090, \"ThumbnailLength\":1378" + - "}, \"exif\":{" + - "\"ExposureTime\":0.00625, \"FNumber\":7.1, \"ExposureProgram\":1, \"ISO\":100, \"ExifVersion\":\"0221\", \"DateTimeOriginal\":\"2008:05:3015:56:01\", \"CreateDate\":\"2008:05:3015:56:01\", \"ShutterSpeedValue\":7.375, \"ApertureValue\":5.625, \"ExposureCompensation\":0, \"MeteringMode\":5, \"Flash\":9, \"FocalLength\":135, \"SubSecTime\":\"00\", \"SubSecTimeOriginal\":\"00\", \"SubSecTimeDigitized\":\"00\", \"FlashpixVersion\":\"0100\", \"ColorSpace\":1, \"ExifImageWidth\":100, \"ExifImageHeight\":68, \"InteropOffset\":948, \"FocalPlaneXResolution\":4438.356164383562, \"FocalPlaneYResolution\":4445.969125214408, \"FocalPlaneResolutionUnit\":2, \"CustomRendered\":0, \"ExposureMode\":1, \"WhiteBalance\":0, \"SceneCaptureType\":0" + - "}, \"gps\":{" + - "\"GPSVersionID\":[" + "2, 2, 0, 0" + "]" + - "}, \"interoperability\":{" + "\"InteropIndex\":\"R98\", \"InteropVersion\":\"0100\"" + "}, \"makernote\":{}" + "}" + "}"; - - OkHttpClientStub clientStub= new OkHttpClientStub(resp, - 200, "Ok"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getFileMetaData("598821f949c0a938d57563bd"); - assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/metadata",SUT.request.url().toString()); - assertThat(resp, is(result.getRaw())); - } - - @Test - public void getFileMetaData_internal_server_error() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getFileMetaData("fileId"); - assertNotNull( result.getMessage()); - } - - @Test - public void getFileMetaData_un_processable_entity() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Un-processable Entity."); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getFileMetaData("fileId"); - assertNotNull( result.getMessage()); - } - - @Test - public void getRemoteFileMetaData_valid_request_expect_success() { - String resp="{" + - "\"height\":68, \"width\":100, \"size\":7749, \"format\":\"jpg\", \"hasColorProfile\":true, \"quality\":0, \"density\":72, \"hasTransparency\":false, \"pHash\":\"f06830ca9f1e3e90\", \"exif\":{" + - "\"image\":{" + - "\"Make\":\"Canon\", \"Model\":\"CanonEOS40D\", \"Orientation\":1, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"Software\":\"GIMP2.4.5\", \"ModifyDate\":\"2008:07:3110:38:11\", \"YCbCrPositioning\":2, \"ExifOffset\":214, \"GPSInfo\":978" + - "}, \"thumbnail\":{" + - "\"Compression\":6, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"ThumbnailOffset\":1090, \"ThumbnailLength\":1378" + - "}, \"exif\":{" + - "\"ExposureTime\":0.00625, \"FNumber\":7.1, \"ExposureProgram\":1, \"ISO\":100, \"ExifVersion\":\"0221\", \"DateTimeOriginal\":\"2008:05:3015:56:01\", \"CreateDate\":\"2008:05:3015:56:01\", \"ShutterSpeedValue\":7.375, \"ApertureValue\":5.625, \"ExposureCompensation\":0, \"MeteringMode\":5, \"Flash\":9, \"FocalLength\":135, \"SubSecTime\":\"00\", \"SubSecTimeOriginal\":\"00\", \"SubSecTimeDigitized\":\"00\", \"FlashpixVersion\":\"0100\", \"ColorSpace\":1, \"ExifImageWidth\":100, \"ExifImageHeight\":68, \"InteropOffset\":948, \"FocalPlaneXResolution\":4438.356164383562, \"FocalPlaneYResolution\":4445.969125214408, \"FocalPlaneResolutionUnit\":2, \"CustomRendered\":0, \"ExposureMode\":1, \"WhiteBalance\":0, \"SceneCaptureType\":0" + - "}, \"gps\":{" + - "\"GPSVersionID\":[" + "2, 2, 0, 0" + "]" + - "}, \"interoperability\":{" + "\"InteropIndex\":\"R98\", \"InteropVersion\":\"0100\"" + "}, \"makernote\":{}" + "}" + "}"; - - OkHttpClientStub clientStub= new OkHttpClientStub(resp, - 200, "Ok"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getRemoteFileMetaData("http://remote_url.example.com/demo.png"); - - assertEquals("https://api.imagekit.io/v1/metadata?url=http://remote_url.example.com/demo.png",SUT.request.url().toString()); - assertThat(resp, is(result.getRaw())); - } - - @Test - public void getRemoteFileMetaData_internal_server_error() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getRemoteFileMetaData("remote_url"); - assertNotNull( result.getMessage()); - } - - @Test - public void getRemoteFileMetaData_un_processable_entity() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Un-processable Entity."); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getRemoteFileMetaData("remote_url"); - assertNotNull( result.getMessage()); - } - - @Test - public void deleteFile_valid_request_expect_success() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 204, "Ok"); - SUT.setClient(clientStub); - Result result = SUT.deleteFile("598821f949c0a938d57563bd"); - - assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd",SUT.request.url().toString()); - assertThat("File deleted successfully!", is(result.getMessage())); - } - - @Test - public void deleteFile_internal_server_error() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - Result result = SUT.deleteFile("fileId"); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void deleteFile_un_processable_entity() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Un-processable Entity."); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 433, "Un-processable Entity"); - SUT.setClient(clientStub); - Result result = SUT.deleteFile("fileId"); - assertNotNull( result.getMessage()); - } - - @Test - public void bulkDeleteFiles_valid_request_expect_success() { - String resp="{\n" + - " \"successfullyDeletedFileIds\": [\n" + - " \"5e1c13d0c55ec3437c451406\",\n" + - " \"561c13d0c533c3437x434409\",\n" + - " \"561c13d0c533c3437x434411\",\n" + - " ]\n" + - "}"; - List fileIds = new ArrayList<>(); - fileIds.add("5e1c13d0c55ec3437c451406"); - fileIds.add("561c13d0c533c3437x434409"); - fileIds.add("561c13d0c533c3437x434411"); - OkHttpClientStub clientStub= new OkHttpClientStub(resp, - 200, "Ok"); - SUT.setClient(clientStub); - ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); - assertThat("File deleted successfully!", is(result.getMessage())); - assertThat(resp,is(result.getRaw())); - } - - @Test - public void bulkDeleteFiles_file_id_not_found() { - String resp="{\n" + - " \"message\": \"The requested file(s) does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"missingFileIds\": [\n" + - " \"5e1c13d0c55ec3437c451406\",\n" + - " \"561c13d0c533c3437x434409\",\n" + - " \"561c13d0c533c3437x434411\"\n" + - " ]" + - "}"; - List fileIds = new ArrayList<>(); - fileIds.add("5e1c13d0c55ec3437c451406"); - fileIds.add("561c13d0c533c3437x434409"); - fileIds.add("561c13d0c533c3437x434411"); - OkHttpClientStub clientStub= new OkHttpClientStub(resp, - 404, "Not found"); - SUT.setClient(clientStub); - ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); - assertThat("The requested file(s) does not exist.", is(result.getMessage())); - assertThat(resp,is(result.getRaw())); - } - - @Test - public void bulkDeleteFiles_internal_server_error() { - JsonObject obj=new JsonObject(); - List fileIds = new ArrayList<>(); - fileIds.add("file_id_1"); - fileIds.add("file_id_2"); - fileIds.add("file_id_3"); - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Ok"); - SUT.setClient(clientStub); - ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void purgeCache_valid_request_expect_success() { - JsonObject obj=new JsonObject(); - obj.addProperty("requestId","my_request_id"); - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 200, "Ok"); - SUT.setClient(clientStub); - ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); - assertThat("my_request_id", is(result.getRequestId())); - } - - @Test - public void purgeCache_internal_server_error() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void purgeCache_un_processable_entity() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Un-processable Entity."); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); - assertNotNull( result.getMessage()); - } - - @Test - public void getPurgeCacheStatus_valid_request_expect_success() { - JsonObject obj=new JsonObject(); - obj.addProperty("status","Complete"); - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 200, "Ok"); - SUT.setClient(clientStub); - ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); - - assertEquals("https://api.imagekit.io/v1/files/purge/requestId",SUT.request.url().toString()); - assertThat("Complete", is(result.getStatus())); - } - - @Test - public void getPurgeCacheStatus_internal_server_error() { - JsonObject obj=new JsonObject(); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void getPurgeCacheStatus_un_processable_entity() { - JsonObject obj=new JsonObject(); - obj.addProperty("message","Un-processable Entity."); - - OkHttpClientStub clientStub= new OkHttpClientStub(obj.toString(), - 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); - assertNotNull(result.getMessage()); - } - - /** - * Stub OkHttpClient for fake api call - */ - private static class OkHttpClientStub extends OkHttpClient{ - private Response.Builder builder; - private boolean timeout; - - public OkHttpClientStub(String response, int code, String message) { - this.builder=new Response.Builder(); - builder.code(code) - .message(message) - .protocol(Protocol.HTTP_1_1) - .body(ResponseBody.create(MediaType.parse("application/json"),response)); - } - @Override - public Call newCall(Request request) { - Call call=new Call() { - @Override - public Request request() { - return request; - } - - @Override - public Response execute() throws IOException { - String credential=request.headers().get("Authorization"); - if (credential==null){ - builder.body(ResponseBody.create(MediaType.parse("application/json"),"{\"message\":\"Your request does not contain private API key.\",\"help\":\"For support kindly contact us at support@imagekit.io .\"}")); - } - else if (!credential.contains("Basic")){ - builder.body(ResponseBody.create(MediaType.parse("application/json"),"{\"message\":\"Your request does not contain private API key.\",\"help\":\"For support kindly contact us at support@imagekit.io .\"}")); - } - - builder.request(request); - if (timeout) { - throw new RuntimeException(new SocketTimeoutException()); - } - return builder.build(); - } - - @Override - public void enqueue(Callback callback) { - - } - - @Override - public void cancel() { - - } - - @Override - public boolean isExecuted() { - return false; - } - - @Override - public boolean isCanceled() { - return false; - } - - @Override - public Call clone() { - return null; - } - }; - return call; - } - public void setTimeoutException() { - this.timeout = true; - } - } + RestClient SUT; + + @Before + public void setUp() throws Exception { + ImageKit imageKit = ImageKit.getInstance(); + imageKit.setConfig(Utils.getSystemConfig(RestClientTest.class)); + SUT = new RestClient(imageKit); + } + + @Test + public void valid_updateDetail_expectSuccess() { + String resp = "{\n" + " \"fileId\" : \"598821f949c0a938d57563bd\"," + " \"type\": \"file\"," + + " \"name\": \"demo.jpg\",\n" + " \"filePath\": \"/demo.jpg\",\n" + + " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + " \"isPrivateFile\" : false,\n" + + " \"customCoordinates\" : null,\n" + + " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\",\n" + + " \"fileType\": \"image\"\n" + "}"; + OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); + SUT.setClient(clientStub); + + MultipartBuilder multipartBuilder = mock(MultipartBuilder.class); + MultipartBody body = new MultipartBody.Builder().addFormDataPart("", "").build(); + ArgumentCaptor ac = ArgumentCaptor.forClass(FileUpdateRequest.class); + when(multipartBuilder.build(ac.capture())).thenReturn(body); + SUT.setMultipartBuilder(multipartBuilder); + + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("598821f949c0a938d57563bd"); + List tags = new ArrayList<>(); + tags.add("t-shirt"); + tags.add("round-neck"); + tags.add("sale2020"); + fileUpdateRequest.setTags(tags); + Result result = SUT.updateDetail(fileUpdateRequest); + assertEquals(fileUpdateRequest, ac.getValue()); + } + + @Test + public void internalServerError_updateDetail_expectFailed() { + JsonObject json = new JsonObject(); + json.addProperty("message", "Internal Server Error"); + OkHttpClientStub clientStub = new OkHttpClientStub(json.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("my_file_id"); + Result result = SUT.updateDetail(fileUpdateRequest); + assertNotNull(result.getMessage()); + } + + @Test + public void unprocessable_updateDetail_expectFailed() { + JsonObject json = new JsonObject(); + json.addProperty("message", "Internal Server Error"); + OkHttpClientStub clientStub = new OkHttpClientStub(json.toString(), 422, "Un-processable Entity"); + SUT.setClient(clientStub); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("my_file_id"); + Result result = SUT.updateDetail(fileUpdateRequest); + assertNotNull(result.getMessage()); + } + + @Test(expected = RuntimeException.class) + public void timeOutException_updateDetail_expectFailed() { + JsonObject json = new JsonObject(); + json.addProperty("message", "Internal Server Error"); + OkHttpClientStub clientStub = new OkHttpClientStub(json.toString(), 422, "Un-processable Entity"); + SUT.setClient(clientStub); + clientStub.setTimeoutException(); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("my_file_id"); + Result result = SUT.updateDetail(fileUpdateRequest); + assertNotNull(result.getMessage()); + } + + @Test + public void valid_getFileList_expectSuccess() { + String resp = "[\n" + "\t{\n" + "\t \"fileId\" : \"598821f949c0a938d57563bd\",\n" + + " \"type\": \"file\",\n" + " \"name\": \"demo.jpg\",\n" + + " \"filePath\": \"/demo.jpg\",\n" + + " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + + " \"isPrivateFile\" : false,\n" + " \"customCoordinates\" : null,\n" + + " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\"," + + " \"fileType\": \"image\"" + " }" + "]"; + + OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); + + SUT.setClient(clientStub); + + Map options = new HashMap<>(); + options.put("skip", "0"); + options.put("limit", "10"); + + ResultList result = SUT.getFileList(options); + + assertEquals("https://api.imagekit.io/v1/files?limit=10&skip=0", SUT.request.url().toString()); + + assertThat(resp, is(result.getRaw())); + } + + @Test + public void unProcessableEntity_getFileList_expectFailed() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Un-processable Entity"); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 422, "Un-processable Entity"); + SUT.setClient(clientStub); + Map options = new HashMap<>(); + options.put("skip", "0"); + options.put("limit", "10"); + ResultList result = SUT.getFileList(options); + assertNotNull(result.getMessage()); + } + + @Test + public void internalServerError_getFileList_expectFailed() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Internal Server Error"); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + Map options = new HashMap<>(); + options.put("skip", "0"); + options.put("limit", "10"); + ResultList result = SUT.getFileList(options); + assertNotNull(result.getMessage()); + } + + @Test + public void getFileDetails_valid_request_expect_success() { + String resp = "{\n" + " \"fileId\" : \"598821f949c0a938d57563bd\"," + " \"type\": \"file\"," + + " \"name\": \"demo.jpg\",\n" + " \"filePath\": \"/demo.jpg\",\n" + + " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + " \"isPrivateFile\" : false,\n" + + " \"customCoordinates\" : null,\n" + + " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\",\n" + + " \"fileType\": \"image\"\n" + "}"; + + OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); + SUT.setClient(clientStub); + Result result = SUT.getFileDetail("598821f949c0a938d57563bd"); + // Asserting endpoint sending to server + assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/details", SUT.request.url().toString()); + // Asserting mock response getting from server. + assertThat(resp, is(result.getRaw())); + } + + @Test + public void getFileDetails_internal_server_error() { + JsonObject obj = new JsonObject(); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + Result result = SUT.getFileDetail("fileId"); + assertNotNull(result.getMessage()); + } + + @Test + public void getFileDetails_un_processable_entity() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Un-processable Entity."); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); + SUT.setClient(clientStub); + Result result = SUT.getFileDetail("fileId"); + assertNotNull(result.getMessage()); + } + + @Test + public void getFileMetaData_valid_request_expect_success() { + String resp = "{" + + "\"height\":68, \"width\":100, \"size\":7749, \"format\":\"jpg\", \"hasColorProfile\":true, \"quality\":0, \"density\":72, \"hasTransparency\":false, \"pHash\":\"f06830ca9f1e3e90\", \"exif\":{" + + "\"image\":{" + + "\"Make\":\"Canon\", \"Model\":\"CanonEOS40D\", \"Orientation\":1, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"Software\":\"GIMP2.4.5\", \"ModifyDate\":\"2008:07:3110:38:11\", \"YCbCrPositioning\":2, \"ExifOffset\":214, \"GPSInfo\":978" + + "}, \"thumbnail\":{" + + "\"Compression\":6, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"ThumbnailOffset\":1090, \"ThumbnailLength\":1378" + + "}, \"exif\":{" + + "\"ExposureTime\":0.00625, \"FNumber\":7.1, \"ExposureProgram\":1, \"ISO\":100, \"ExifVersion\":\"0221\", \"DateTimeOriginal\":\"2008:05:3015:56:01\", \"CreateDate\":\"2008:05:3015:56:01\", \"ShutterSpeedValue\":7.375, \"ApertureValue\":5.625, \"ExposureCompensation\":0, \"MeteringMode\":5, \"Flash\":9, \"FocalLength\":135, \"SubSecTime\":\"00\", \"SubSecTimeOriginal\":\"00\", \"SubSecTimeDigitized\":\"00\", \"FlashpixVersion\":\"0100\", \"ColorSpace\":1, \"ExifImageWidth\":100, \"ExifImageHeight\":68, \"InteropOffset\":948, \"FocalPlaneXResolution\":4438.356164383562, \"FocalPlaneYResolution\":4445.969125214408, \"FocalPlaneResolutionUnit\":2, \"CustomRendered\":0, \"ExposureMode\":1, \"WhiteBalance\":0, \"SceneCaptureType\":0" + + "}, \"gps\":{" + "\"GPSVersionID\":[" + "2, 2, 0, 0" + "]" + "}, \"interoperability\":{" + + "\"InteropIndex\":\"R98\", \"InteropVersion\":\"0100\"" + "}, \"makernote\":{}" + "}" + "}"; + + OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); + SUT.setClient(clientStub); + ResultMetaData result = SUT.getFileMetaData("598821f949c0a938d57563bd"); + assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/metadata", + SUT.request.url().toString()); + assertThat(resp, is(result.getRaw())); + } + + @Test + public void getFileMetaData_internal_server_error() { + JsonObject obj = new JsonObject(); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + ResultMetaData result = SUT.getFileMetaData("fileId"); + assertNotNull(result.getMessage()); + } + + @Test + public void getFileMetaData_un_processable_entity() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Un-processable Entity."); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); + SUT.setClient(clientStub); + ResultMetaData result = SUT.getFileMetaData("fileId"); + assertNotNull(result.getMessage()); + } + + @Test + public void getRemoteFileMetaData_valid_request_expect_success() { + String resp = "{" + + "\"height\":68, \"width\":100, \"size\":7749, \"format\":\"jpg\", \"hasColorProfile\":true, \"quality\":0, \"density\":72, \"hasTransparency\":false, \"pHash\":\"f06830ca9f1e3e90\", \"exif\":{" + + "\"image\":{" + + "\"Make\":\"Canon\", \"Model\":\"CanonEOS40D\", \"Orientation\":1, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"Software\":\"GIMP2.4.5\", \"ModifyDate\":\"2008:07:3110:38:11\", \"YCbCrPositioning\":2, \"ExifOffset\":214, \"GPSInfo\":978" + + "}, \"thumbnail\":{" + + "\"Compression\":6, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"ThumbnailOffset\":1090, \"ThumbnailLength\":1378" + + "}, \"exif\":{" + + "\"ExposureTime\":0.00625, \"FNumber\":7.1, \"ExposureProgram\":1, \"ISO\":100, \"ExifVersion\":\"0221\", \"DateTimeOriginal\":\"2008:05:3015:56:01\", \"CreateDate\":\"2008:05:3015:56:01\", \"ShutterSpeedValue\":7.375, \"ApertureValue\":5.625, \"ExposureCompensation\":0, \"MeteringMode\":5, \"Flash\":9, \"FocalLength\":135, \"SubSecTime\":\"00\", \"SubSecTimeOriginal\":\"00\", \"SubSecTimeDigitized\":\"00\", \"FlashpixVersion\":\"0100\", \"ColorSpace\":1, \"ExifImageWidth\":100, \"ExifImageHeight\":68, \"InteropOffset\":948, \"FocalPlaneXResolution\":4438.356164383562, \"FocalPlaneYResolution\":4445.969125214408, \"FocalPlaneResolutionUnit\":2, \"CustomRendered\":0, \"ExposureMode\":1, \"WhiteBalance\":0, \"SceneCaptureType\":0" + + "}, \"gps\":{" + "\"GPSVersionID\":[" + "2, 2, 0, 0" + "]" + "}, \"interoperability\":{" + + "\"InteropIndex\":\"R98\", \"InteropVersion\":\"0100\"" + "}, \"makernote\":{}" + "}" + "}"; + + OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); + SUT.setClient(clientStub); + ResultMetaData result = SUT.getRemoteFileMetaData("http://remote_url.example.com/demo.png"); + + assertEquals("https://api.imagekit.io/v1/metadata?url=http://remote_url.example.com/demo.png", + SUT.request.url().toString()); + assertThat(resp, is(result.getRaw())); + } + + @Test + public void getRemoteFileMetaData_internal_server_error() { + JsonObject obj = new JsonObject(); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + ResultMetaData result = SUT.getRemoteFileMetaData("remote_url"); + assertNotNull(result.getMessage()); + } + + @Test + public void getRemoteFileMetaData_un_processable_entity() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Un-processable Entity."); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); + SUT.setClient(clientStub); + ResultMetaData result = SUT.getRemoteFileMetaData("remote_url"); + assertNotNull(result.getMessage()); + } + + @Test + public void deleteFile_valid_request_expect_success() { + JsonObject obj = new JsonObject(); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 204, "Ok"); + SUT.setClient(clientStub); + Result result = SUT.deleteFile("598821f949c0a938d57563bd"); + + assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd", SUT.request.url().toString()); + assertThat("File deleted successfully!", is(result.getMessage())); + } + + @Test + public void deleteFile_internal_server_error() { + JsonObject obj = new JsonObject(); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + Result result = SUT.deleteFile("fileId"); + assertThat("Error: Internal server error.", is(result.getMessage())); + } + + @Test + public void deleteFile_un_processable_entity() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Un-processable Entity."); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); + SUT.setClient(clientStub); + Result result = SUT.deleteFile("fileId"); + assertNotNull(result.getMessage()); + } + + @Test + public void bulkDeleteFiles_valid_request_expect_success() { + String resp = "{\n" + " \"successfullyDeletedFileIds\": [\n" + " \"5e1c13d0c55ec3437c451406\",\n" + + " \"561c13d0c533c3437x434409\",\n" + " \"561c13d0c533c3437x434411\",\n" + " ]\n" + + "}"; + List fileIds = new ArrayList<>(); + fileIds.add("5e1c13d0c55ec3437c451406"); + fileIds.add("561c13d0c533c3437x434409"); + fileIds.add("561c13d0c533c3437x434411"); + OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); + SUT.setClient(clientStub); + ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); + assertThat("File deleted successfully!", is(result.getMessage())); + assertThat(resp, is(result.getRaw())); + } + + @Test + public void bulkDeleteFiles_file_id_not_found() { + String resp = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"5e1c13d0c55ec3437c451406\",\n" + + " \"561c13d0c533c3437x434409\",\n" + " \"561c13d0c533c3437x434411\"\n" + " ]" + "}"; + List fileIds = new ArrayList<>(); + fileIds.add("5e1c13d0c55ec3437c451406"); + fileIds.add("561c13d0c533c3437x434409"); + fileIds.add("561c13d0c533c3437x434411"); + OkHttpClientStub clientStub = new OkHttpClientStub(resp, 404, "Not found"); + SUT.setClient(clientStub); + ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); + assertThat("The requested file(s) does not exist.", is(result.getMessage())); + assertThat(resp, is(result.getRaw())); + } + + @Test + public void bulkDeleteFiles_internal_server_error() { + JsonObject obj = new JsonObject(); + List fileIds = new ArrayList<>(); + fileIds.add("file_id_1"); + fileIds.add("file_id_2"); + fileIds.add("file_id_3"); + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Ok"); + SUT.setClient(clientStub); + ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); + assertThat("Error: Internal server error.", is(result.getMessage())); + } + + @Test + public void purgeCache_valid_request_expect_success() { + JsonObject obj = new JsonObject(); + obj.addProperty("requestId", "my_request_id"); + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 200, "Ok"); + SUT.setClient(clientStub); + ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); + assertThat("my_request_id", is(result.getRequestId())); + } + + @Test + public void purgeCache_internal_server_error() { + JsonObject obj = new JsonObject(); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); + assertThat("Error: Internal server error.", is(result.getMessage())); + } + + @Test + public void purgeCache_un_processable_entity() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Un-processable Entity."); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); + SUT.setClient(clientStub); + ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); + assertNotNull(result.getMessage()); + } + + @Test + public void getPurgeCacheStatus_valid_request_expect_success() { + JsonObject obj = new JsonObject(); + obj.addProperty("status", "Complete"); + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 200, "Ok"); + SUT.setClient(clientStub); + ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); + + assertEquals("https://api.imagekit.io/v1/files/purge/requestId", SUT.request.url().toString()); + assertThat("Complete", is(result.getStatus())); + } + + @Test + public void getPurgeCacheStatus_internal_server_error() { + JsonObject obj = new JsonObject(); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); + SUT.setClient(clientStub); + ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); + assertThat("Error: Internal server error.", is(result.getMessage())); + } + + @Test + public void getPurgeCacheStatus_un_processable_entity() { + JsonObject obj = new JsonObject(); + obj.addProperty("message", "Un-processable Entity."); + + OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); + SUT.setClient(clientStub); + ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); + assertNotNull(result.getMessage()); + } + + /** + * Stub OkHttpClient for fake api call + */ + private static class OkHttpClientStub extends OkHttpClient { + private Response.Builder builder; + private boolean timeout; + + public OkHttpClientStub(String response, int code, String message) { + this.builder = new Response.Builder(); + builder.code(code).message(message).protocol(Protocol.HTTP_1_1) + .body(ResponseBody.create(MediaType.parse("application/json"), response)); + } + + @Override + public Call newCall(Request request) { + Call call = new Call() { + @Override + public Request request() { + return request; + } + + @Override + public Response execute() throws IOException { + String credential = request.headers().get("Authorization"); + if (credential == null) { + builder.body(ResponseBody.create(MediaType.parse("application/json"), + "{\"message\":\"Your request does not contain private API key.\",\"help\":\"For support kindly contact us at support@imagekit.io .\"}")); + } else if (!credential.contains("Basic")) { + builder.body(ResponseBody.create(MediaType.parse("application/json"), + "{\"message\":\"Your request does not contain private API key.\",\"help\":\"For support kindly contact us at support@imagekit.io .\"}")); + } + + builder.request(request); + if (timeout) { + throw new RuntimeException(new SocketTimeoutException()); + } + return builder.build(); + } + + @Override + public void enqueue(Callback callback) { + + } + + @Override + public void cancel() { + + } + + @Override + public boolean isExecuted() { + return false; + } + + @Override + public boolean isCanceled() { + return false; + } + + @Override + public Call clone() { + return null; + } + }; + return call; + } + + public void setTimeoutException() { + this.timeout = true; + } + } } \ No newline at end of file diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 7efec76..2250654 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -1,6 +1,5 @@ package io.imagekit.sampleapp; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -37,15 +36,15 @@ import java.util.*; import java.util.stream.Collectors; -class App{ - public static void main(String[] args) throws Exception{ - ImageKit imageKit=ImageKit.getInstance(); - //getSystemConfig(Class cls) method need current class as parameter - Configuration config = Utils.getSystemConfig(App.class); - imageKit.setConfig(config); +class App { + public static void main(String[] args) throws Exception { + ImageKit imageKit = ImageKit.getInstance(); + // getSystemConfig(Class cls) method need current class as parameter + Configuration config = Utils.getSystemConfig(App.class); + imageKit.setConfig(config); // generateUrl(); - uploadFromURL(); + uploadFromURL(); // uploadFromBase64(); // uploadFromBytes(); // getBulkJobStatus(); @@ -80,580 +79,599 @@ public static void main(String[] args) throws Exception{ // getPurgeCacheStatus(resultCache.getRequestId()); // generateUrl(files.get(0)); - // System.out.println(Color.ANSI_CYAN+"Do you want to delete uploaded files? (yes/No): "+Color.ANSI_BLUE); - // String choice=new Scanner(System.in).nextLine(); - // if (!"yes".equalsIgnoreCase(choice.trim().toLowerCase())){ - // System.exit(0); - // } + // System.out.println(Color.ANSI_CYAN+"Do you want to delete uploaded files? + // (yes/No): "+Color.ANSI_BLUE); + // String choice=new Scanner(System.in).nextLine(); + // if (!"yes".equalsIgnoreCase(choice.trim().toLowerCase())){ + // System.exit(0); + // } // System.out.println(Color.ANSI_RESET); // deleteFile(files.get(0).getFileId()); // files.remove(0); // deleteFiles(files); // } - + // System.exit(0); - } - - private static void generatingAuthParams() { - System.out.println(Color.ANSI_CYAN+">> Generating Authentication Parameters:"+Color.ANSI_RESET); - Map authenticationParameters = ImageKit.getInstance().getAuthenticationParameters(); - System.out.println(Color.ANSI_GREEN+">> Results:"+Color.ANSI_RESET); - System.out.println(authenticationParameters); - System.out.println("\n\n"); - } - - private static void generateUrl() { - System.out.println(Color.ANSI_CYAN+">> URL Generation:"+Color.ANSI_RESET); - String urlEndpoint=ImageKit.getInstance().getConfig().getUrlEndpoint(); + } + + private static void generatingAuthParams() { + System.out.println(Color.ANSI_CYAN + ">> Generating Authentication Parameters:" + Color.ANSI_RESET); + Map authenticationParameters = ImageKit.getInstance().getAuthenticationParameters(); + System.out.println(Color.ANSI_GREEN + ">> Results:" + Color.ANSI_RESET); + System.out.println(authenticationParameters); + System.out.println("\n\n"); + } + + private static void generateUrl() { + System.out.println(Color.ANSI_CYAN + ">> URL Generation:" + Color.ANSI_RESET); + String urlEndpoint = ImageKit.getInstance().getConfig().getUrlEndpoint(); // String urlEndpoint="https://ik.imagekit.io/bowstring/"; - Map queryParam=new HashMap<>(); - queryParam.put("v","123"); - - List> transformation=new ArrayList>(); - Map scale=new HashMap<>(); - scale.put("height","300"); - scale.put("width","300"); - transformation.add(scale); - Map overlay=new HashMap<>(); - overlay.put("overlayImage","logo-white_SJwqB4Nfe.png"); - transformation.add(overlay); - Map options=new HashMap(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - - String image_url=ImageKit.getInstance().getUrl(options); - - System.out.println("url1:==> " + image_url); - options.clear(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint",urlEndpoint); - options.put("queryParameters",queryParam); - options.put("transformation", transformation); - options.put("transformationPosition", "query"); - options.put("signed",true); - options.put("expireSeconds",10); - - String url2 = ImageKit.getInstance().getUrl(options); - - options.remove("transformationPosition"); - String url3 = ImageKit.getInstance().getUrl(options); - - options.clear(); - options.put("src","https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); - options.put("queryParameters",queryParam); - options.put("transformation",transformation); - - String url4 = ImageKit.getInstance().getUrl(options); - - - System.out.println(">> Generated URL #1:\t"+image_url); - System.out.println(">> Generated URL #2:\t"+url2); - System.out.println(">> Generated URL #3:\t"+url3); - System.out.println(">> Generated URL #4:\t"+url4); - System.out.println("\n\n"); - } - - private static void calculateDistance() { - System.out.println(Color.ANSI_CYAN+">> Calculating pHash Distance:"+Color.ANSI_RESET); - int d1 = ImageKit.getInstance().pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); - System.out.println(">> Distance 1: "+d1); - // output: 0 (same images) - - int d2 = ImageKit.getInstance().pHashDistance("2d5ad3936d2e015b", "2d6ed293db36a4fb"); - System.out.println(">> Distance 2: "+d2); - // output: 17 (similar images) - - int d3 = ImageKit.getInstance().pHashDistance("a4a65595ac94518b", "7838873e791f8400"); - System.out.println(">> Distance 3: "+d3); - // output: 37 (dissimilar images) - System.out.println("\n\n"); - } - - - private static void getPurgeCacheStatus(String requestId) { - System.out.println(Color.ANSI_CYAN+">> Fetching cache status:"+Color.ANSI_RESET); - System.out.println(">> Sending request..."); - ResultCacheStatus result=ImageKit.getInstance().getPurgeCacheStatus(requestId); - System.out.println(">> Request complete..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static ResultCache purgeCache(String filePath) { - System.out.println(Color.ANSI_CYAN+">> Purging cache:"+Color.ANSI_RESET); - System.out.println(">> Sending request..."); - ResultCache result=ImageKit.getInstance().purgeCache(filePath); - System.out.println(">> Request complete..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - return result; - } - - private static void deleteFile(String fileId) { - System.out.println(Color.ANSI_CYAN+">> Deleting file:"+Color.ANSI_RESET); - System.out.println(">> Sending file id: "+fileId); - Result result=ImageKit.getInstance().deleteFile(fileId); - System.out.println(">> File deleted..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteFiles(List files) { - List fileIds=files.stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList()); - System.out.println(Color.ANSI_CYAN+">> Deleting file:"+Color.ANSI_RESET); - System.out.println(">> Sending file id: "+fileIds); - ResultFileDelete result=ImageKit.getInstance().bulkDeleteFiles(fileIds); - System.out.println(">> File deleted..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void updateDetails(String fileId) { - System.out.println(Color.ANSI_CYAN+">> Updating file details:"+Color.ANSI_RESET); - System.out.println(">> Updating file details..."); - List tags=new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - FileUpdateRequest fileUpdateRequest =new FileUpdateRequest(fileId); - fileUpdateRequest.setTags(tags); - fileUpdateRequest.setCustomCoordinates("10,10,40,40"); - Result result=ImageKit.getInstance().updateFileDetail(fileUpdateRequest); - System.out.println(">> Updating done..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getFileMetaData(String fileId) { - System.out.println(Color.ANSI_CYAN+">> Get file Metadata:"+Color.ANSI_RESET); - System.out.println(">> Fetching Metadata..."); - ResultMetaData result=ImageKit.getInstance().getFileMetadata(fileId); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getRemoteFileMetaData(String url) { - System.out.println(Color.ANSI_CYAN+">> Get Remote file Metadata:"+Color.ANSI_RESET); - System.out.println(">> Fetching Metadata..."); - ResultMetaData result=ImageKit.getInstance().getRemoteFileMetadata(url); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getFileDetail(String fileId) { - System.out.println(Color.ANSI_CYAN+">> Get file details:"+Color.ANSI_RESET); - System.out.println(">> Fetching details..."); - Result result=ImageKit.getInstance().getFileDetail(fileId); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static List getList(int skip, int limit) { - System.out.println(Color.ANSI_CYAN+">> Get Uploaded file as List:"+Color.ANSI_RESET); - System.out.println(">> Fetching list..."); - Map options=new HashMap<>(); - options.put("skip",""+skip); - options.put("limit", ""+limit); - ResultList resultList=ImageKit.getInstance().getFileList(options); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(">> No. of files in server: "+resultList.getResults().size()); - System.out.println(">> FileIds: "+resultList.getResults().stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList())); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(resultList.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultList.getResponseMetaData().getMap()); - System.out.println("\n\n"); - return resultList.getResults(); - } - - private static void uploadFromURL() { - System.out.println(Color.ANSI_CYAN+">> Uploading from URL:"+Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - String imageUrl="https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url= null; - try { - url = URI.create(imageUrl).toURL(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-image11.jpg"); - List tags=new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileCreateRequest.setTags(tags); - - List responseFields=new ArrayList<>(); - responseFields.add("thumbnail"); - responseFields.add("tags"); - responseFields.add("customCoordinates"); - - fileCreateRequest.setResponseFields(responseFields); - System.out.println(">> Ref: URL= "+imageUrl); - Result result = ImageKit.getInstance().upload(fileCreateRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void uploadFromBase64() { - System.out.println(Color.ANSI_CYAN+">> Uploading Base64 Image:"+Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - URL url = App.class.getClassLoader().getResource("sample1.jpg"); - File file=new File(url.getPath()); - String base64= Utils.fileToBase64(file); - FileCreateRequest fileCreateRequest =new FileCreateRequest(base64, "sample_base64_image.jpg"); - Result result = ImageKit.getInstance().upload(fileCreateRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void uploadFromBytes() { - System.out.println(Color.ANSI_CYAN+">> Uploading Image from file:"+Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - URL url = App.class.getClassLoader().getResource("sample1.jpg"); - File file=new File(url.getPath()); - byte[] bytes= Utils.fileToBytes(file); - FileCreateRequest fileCreateRequest =new FileCreateRequest(bytes, "sample_image_th.jpg"); - fileCreateRequest.setUseUniqueFileName(false); - JsonObject optionsInnerObject = new JsonObject(); - optionsInnerObject.addProperty("add_shadow", true); - optionsInnerObject.addProperty("bg_colour", "green"); - JsonObject innerObject1 = new JsonObject(); - innerObject1.addProperty("name", "remove-bg"); - innerObject1.add("options", optionsInnerObject); - JsonObject innerObject2 = new JsonObject(); - innerObject2.addProperty("name", "google-auto-tagging"); - innerObject2.addProperty("minConfidence", 5); - innerObject2.addProperty("maxTags", 95); - JsonArray jsonArray = new JsonArray(); - jsonArray.add(innerObject1); - jsonArray.add(innerObject2); - fileCreateRequest.setExtensions(jsonArray); - fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); - fileCreateRequest.setOverwriteFile(true); - fileCreateRequest.setOverwriteAITags(true); - fileCreateRequest.setOverwriteTags(true); - fileCreateRequest.setOverwriteCustomMetadata(true); - JsonObject jsonObjectCustomMetadata = new JsonObject(); - jsonObjectCustomMetadata.addProperty("test1", 10); - fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); - Result result = ImageKit.getInstance().upload(fileCreateRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void addTags() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - List fileIds = new ArrayList<>(); - fileIds.add("62a9b446663ef7b5c15951ba"); - List tags = new ArrayList<>(); - tags.add("tag-to-add-4"); - TagsRequest tagsRequest =new TagsRequest(fileIds, tags); - tagsRequest.setFileIds(fileIds); - tagsRequest.setTags(tags); - ResultTags resultTags = ImageKit.getInstance().addTags(tagsRequest); - System.out.println(">> Add Tags done."); - System.out.println(Color.ANSI_GREEN+">> Response add tags:"+Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultTags.getResponseMetaData().getMap()); - System.out.println(resultTags); - System.out.println("\n\n"); - } - - private static void removeTags() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag-to-add-4"); - TagsRequest tagsRequest =new TagsRequest(fileIds, tags); - ResultTags resultTags = ImageKit.getInstance().removeTags(tagsRequest); - System.out.println(">> remove Tags done."); - System.out.println(Color.ANSI_GREEN+">> Response remove tags:"+Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultTags.getResponseMetaData().getMap()); - System.out.println(resultTags); - System.out.println("\n\n"); - } - - private static void removeAITags() throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { - List fileIds = new ArrayList<>(); - fileIds.add("62a9b446663ef7b5c15951ba"); - List aiTags = new ArrayList<>(); - aiTags.add("Shoe"); - AITagsRequest aiTagsRequest =new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - ResultTags resultTags = ImageKit.getInstance().removeAITags(aiTagsRequest); - System.out.println(">> remove Tags done."); - System.out.println(Color.ANSI_GREEN+">> Response remove aiTags:"+Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultTags.getResponseMetaData().getMap()); - System.out.println(resultTags); - System.out.println("\n\n"); - } - - private static void getCustomMetaDataFields() { - ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = ImageKit.getInstance().getCustomMetaDataFields(false); - System.out.println(">> Fetch CustomMetaDataFields done."); - System.out.println(Color.ANSI_GREEN+">> Fetch CustomMetaDataFields Response:"+Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList()); - System.out.println(resultCustomMetaDataFieldList); - System.out.println("\n\n"); - } - - private static void createCustomMetaDataFields() throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { - CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - customMetaDataFieldSchemaObject.setValueRequired(false); - customMetaDataFieldSchemaObject.setMinValue(10); - customMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("NameHe1"); - customMetaDataFieldCreateRequest.setLabel("LabelHe1"); - customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); - - ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); - System.out.println(">> Create CustomMetaDataFields done."); - System.out.println(Color.ANSI_GREEN+">> Response create CustomMetaDataFields :"+Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteCustomMetaDataField(String id) throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField(id); - System.out.println(">> CustomMetaDataField deleted..."); - System.out.println(Color.ANSI_GREEN+">> Response:"+Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN+">> Raw Response:"+Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void updateCustomMetaDataFields() throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); - schemaObject.setMinValue(1); - schemaObject.setMaxValue(200); - schemaObject.setMinLength(1); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("62aab5a9db4851797a8f8ff9"); - customMetaDataFieldUpdateRequest.setLabel("LabelHE100"); - customMetaDataFieldUpdateRequest.setSchema(schemaObject); - - ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - System.out.println(">> Edit CustomMetaDataFields done."); - System.out.println(Color.ANSI_GREEN+">> Response edit CustomMetaDataFields :"+Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteFileVersion() throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); - deleteFileVersionRequest.setVersionId("62aac9b47db937233eee762f"); - ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); - System.out.println(">> delete file version done."); - System.out.println(Color.ANSI_GREEN+">> Response delete File version :"+Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void copyFile() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/new_car11.jpg"); - copyFileRequest.setDestinationPath("/demo1/"); - copyFileRequest.setIncludeVersions(true); - ResultNoContent resultNoContent = ImageKit.getInstance().copyFile(copyFileRequest); - System.out.println(">> Copy file done."); - System.out.println(Color.ANSI_GREEN+">> Response Copy File :"+Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void moveFile() throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/new_car11.jpg"); - moveFileRequest.setDestinationPath("/demo1"); - ResultNoContent resultNoContent = ImageKit.getInstance().moveFile(moveFileRequest); - System.out.println(">> Move File done."); - System.out.println(Color.ANSI_GREEN+">> Response Move File :"+Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void renameFile() throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/new12.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); - ResultRenameFile resultRenameFile = ImageKit.getInstance().renameFile(renameFileRequest); - System.out.println(">> Rename file done."); - System.out.println(Color.ANSI_GREEN+">> Response Rename File :"+Color.ANSI_RESET); - System.out.println(resultRenameFile); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultRenameFile.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void createFolder() { - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("test1"); - createFolderRequest.setParentFolderPath("/"); - ResultEmptyBlock resultEmptyBlock = ImageKit.getInstance().createFolder(createFolderRequest); - System.out.println(">> Create folder done."); - System.out.println(Color.ANSI_GREEN+">> Response Create Folder :"+Color.ANSI_RESET); - System.out.println(resultEmptyBlock); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteFolder() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - String folderPath="/test1"; - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath(folderPath); - ResultNoContent resultNoContent = ImageKit.getInstance().deleteFolder(deleteFolderRequest); - System.out.println(">> Delete folder done."); - System.out.println(Color.ANSI_GREEN+">> Response Delete Folder :"+Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void copyFolder() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/test1"); - copyFolderRequest.setDestinationPath("/demo1"); - ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().copyFolder(copyFolderRequest); - System.out.println(">> Copy folder done."); - System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); - System.out.println(resultOfFolderActions); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void moveFolder() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/demo1/test1"); - moveFolderRequest.setDestinationPath("/"); - ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().moveFolder(moveFolderRequest); - System.out.println(">>Move folder done."); - System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); - System.out.println(resultOfFolderActions); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getBulkJobStatus() { - String jobId = "62a9b9d5663ef7fd985c6fcb"; - ResultBulkJobStatus resultBulkJobStatus = ImageKit.getInstance().getBulkJobStatus(jobId); - System.out.println(">> Fetch Bulk job status done."); - System.out.println(Color.ANSI_GREEN+">> Response Bulk job status :"+Color.ANSI_RESET); - System.out.println(resultBulkJobStatus); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getFileVersions() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - String fileId = "629f3de17eb0fe4053615450"; - ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); - System.out.println(">> Fetch Get file versions done."); - System.out.println(Color.ANSI_GREEN+">> Response Get file versions :"+Color.ANSI_RESET); - System.out.println(resultFileVersions); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultFileVersions.getResponseMetaData().getList()); - System.out.println("\n\n"); - } - - private static void getFileVersionDetails() throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - String fileId = "62a9b446663ef7b5c15951ba"; - String versionId = "62a9b446663ef7b5c15951ba"; - ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); - System.out.println(">> Fetch Get file versions details done."); - System.out.println(Color.ANSI_GREEN+">> Response Get file versions details :"+Color.ANSI_RESET); - System.out.println(resultFileVersionDetails); - System.out.println(Color.ANSI_GREEN+">> Map Response:"+Color.ANSI_RESET); - System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } + Map queryParam = new HashMap<>(); + queryParam.put("v", "123"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "300"); + scale.put("width", "300"); + transformation.add(scale); + Map overlay = new HashMap<>(); + overlay.put("overlayImage", "logo-white_SJwqB4Nfe.png"); + transformation.add(overlay); + Map options = new HashMap(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + + String image_url = ImageKit.getInstance().getUrl(options); + + System.out.println("url1:==> " + image_url); + options.clear(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", urlEndpoint); + options.put("queryParameters", queryParam); + options.put("transformation", transformation); + options.put("transformationPosition", "query"); + options.put("signed", true); + options.put("expireSeconds", 10); + + String url2 = ImageKit.getInstance().getUrl(options); + + options.remove("transformationPosition"); + String url3 = ImageKit.getInstance().getUrl(options); + + options.clear(); + options.put("src", "https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); + options.put("queryParameters", queryParam); + options.put("transformation", transformation); + + String url4 = ImageKit.getInstance().getUrl(options); + + System.out.println(">> Generated URL #1:\t" + image_url); + System.out.println(">> Generated URL #2:\t" + url2); + System.out.println(">> Generated URL #3:\t" + url3); + System.out.println(">> Generated URL #4:\t" + url4); + System.out.println("\n\n"); + } + + private static void calculateDistance() { + System.out.println(Color.ANSI_CYAN + ">> Calculating pHash Distance:" + Color.ANSI_RESET); + int d1 = ImageKit.getInstance().pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); + System.out.println(">> Distance 1: " + d1); + // output: 0 (same images) + + int d2 = ImageKit.getInstance().pHashDistance("2d5ad3936d2e015b", "2d6ed293db36a4fb"); + System.out.println(">> Distance 2: " + d2); + // output: 17 (similar images) + + int d3 = ImageKit.getInstance().pHashDistance("a4a65595ac94518b", "7838873e791f8400"); + System.out.println(">> Distance 3: " + d3); + // output: 37 (dissimilar images) + System.out.println("\n\n"); + } + + private static void getPurgeCacheStatus(String requestId) { + System.out.println(Color.ANSI_CYAN + ">> Fetching cache status:" + Color.ANSI_RESET); + System.out.println(">> Sending request..."); + ResultCacheStatus result = ImageKit.getInstance().getPurgeCacheStatus(requestId); + System.out.println(">> Request complete..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static ResultCache purgeCache(String filePath) { + System.out.println(Color.ANSI_CYAN + ">> Purging cache:" + Color.ANSI_RESET); + System.out.println(">> Sending request..."); + ResultCache result = ImageKit.getInstance().purgeCache(filePath); + System.out.println(">> Request complete..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + return result; + } + + private static void deleteFile(String fileId) { + System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); + System.out.println(">> Sending file id: " + fileId); + Result result = ImageKit.getInstance().deleteFile(fileId); + System.out.println(">> File deleted..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void deleteFiles(List files) { + List fileIds = files.stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList()); + System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); + System.out.println(">> Sending file id: " + fileIds); + ResultFileDelete result = ImageKit.getInstance().bulkDeleteFiles(fileIds); + System.out.println(">> File deleted..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void updateDetails(String fileId) { + System.out.println(Color.ANSI_CYAN + ">> Updating file details:" + Color.ANSI_RESET); + System.out.println(">> Updating file details..."); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest(fileId); + fileUpdateRequest.setTags(tags); + fileUpdateRequest.setCustomCoordinates("10,10,40,40"); + Result result = ImageKit.getInstance().updateFileDetail(fileUpdateRequest); + System.out.println(">> Updating done..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void getFileMetaData(String fileId) { + System.out.println(Color.ANSI_CYAN + ">> Get file Metadata:" + Color.ANSI_RESET); + System.out.println(">> Fetching Metadata..."); + ResultMetaData result = ImageKit.getInstance().getFileMetadata(fileId); + System.out.println(">> Fetching done..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void getRemoteFileMetaData(String url) { + System.out.println(Color.ANSI_CYAN + ">> Get Remote file Metadata:" + Color.ANSI_RESET); + System.out.println(">> Fetching Metadata..."); + ResultMetaData result = ImageKit.getInstance().getRemoteFileMetadata(url); + System.out.println(">> Fetching done..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void getFileDetail(String fileId) { + System.out.println(Color.ANSI_CYAN + ">> Get file details:" + Color.ANSI_RESET); + System.out.println(">> Fetching details..."); + Result result = ImageKit.getInstance().getFileDetail(fileId); + System.out.println(">> Fetching done..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static List getList(int skip, int limit) { + System.out.println(Color.ANSI_CYAN + ">> Get Uploaded file as List:" + Color.ANSI_RESET); + System.out.println(">> Fetching list..."); + Map options = new HashMap<>(); + options.put("skip", "" + skip); + options.put("limit", "" + limit); + ResultList resultList = ImageKit.getInstance().getFileList(options); + System.out.println(">> Fetching done..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(">> No. of files in server: " + resultList.getResults().size()); + System.out.println(">> FileIds: " + + resultList.getResults().stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList())); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(resultList.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultList.getResponseMetaData().getMap()); + System.out.println("\n\n"); + return resultList.getResults(); + } + + private static void uploadFromURL() { + System.out.println(Color.ANSI_CYAN + ">> Uploading from URL:" + Color.ANSI_RESET); + System.out.println(">> Start uploading..."); + String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; + URL url = null; + try { + url = URI.create(imageUrl).toURL(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-image11.jpg"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + + List responseFields = new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); + + fileCreateRequest.setResponseFields(responseFields); + System.out.println(">> Ref: URL= " + imageUrl); + Result result = ImageKit.getInstance().upload(fileCreateRequest); + System.out.println(">> Uploading done."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void uploadFromBase64() { + System.out.println(Color.ANSI_CYAN + ">> Uploading Base64 Image:" + Color.ANSI_RESET); + System.out.println(">> Start uploading..."); + URL url = App.class.getClassLoader().getResource("sample1.jpg"); + File file = new File(url.getPath()); + String base64 = Utils.fileToBase64(file); + FileCreateRequest fileCreateRequest = new FileCreateRequest(base64, "sample_base64_image.jpg"); + Result result = ImageKit.getInstance().upload(fileCreateRequest); + System.out.println(">> Uploading done."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void uploadFromBytes() { + System.out.println(Color.ANSI_CYAN + ">> Uploading Image from file:" + Color.ANSI_RESET); + System.out.println(">> Start uploading..."); + URL url = App.class.getClassLoader().getResource("sample1.jpg"); + File file = new File(url.getPath()); + byte[] bytes = Utils.fileToBytes(file); + FileCreateRequest fileCreateRequest = new FileCreateRequest(bytes, "sample_image_th.jpg"); + fileCreateRequest.setUseUniqueFileName(false); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + optionsInnerObject.addProperty("bg_colour", "green"); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 5); + innerObject2.addProperty("maxTags", 95); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + fileCreateRequest.setOverwriteFile(true); + fileCreateRequest.setOverwriteAITags(true); + fileCreateRequest.setOverwriteTags(true); + fileCreateRequest.setOverwriteCustomMetadata(true); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); + Result result = ImageKit.getInstance().upload(fileCreateRequest); + System.out.println(">> Uploading done."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void addTags() + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + List fileIds = new ArrayList<>(); + fileIds.add("62a9b446663ef7b5c15951ba"); + List tags = new ArrayList<>(); + tags.add("tag-to-add-4"); + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + tagsRequest.setFileIds(fileIds); + tagsRequest.setTags(tags); + ResultTags resultTags = ImageKit.getInstance().addTags(tagsRequest); + System.out.println(">> Add Tags done."); + System.out.println(Color.ANSI_GREEN + ">> Response add tags:" + Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultTags.getResponseMetaData().getMap()); + System.out.println(resultTags); + System.out.println("\n\n"); + } + + private static void removeTags() + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List tags = new ArrayList<>(); + tags.add("tag-to-add-4"); + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + ResultTags resultTags = ImageKit.getInstance().removeTags(tagsRequest); + System.out.println(">> remove Tags done."); + System.out.println(Color.ANSI_GREEN + ">> Response remove tags:" + Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultTags.getResponseMetaData().getMap()); + System.out.println(resultTags); + System.out.println("\n\n"); + } + + private static void removeAITags() + throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + List fileIds = new ArrayList<>(); + fileIds.add("62a9b446663ef7b5c15951ba"); + List aiTags = new ArrayList<>(); + aiTags.add("Shoe"); + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + ResultTags resultTags = ImageKit.getInstance().removeAITags(aiTagsRequest); + System.out.println(">> remove Tags done."); + System.out.println(Color.ANSI_GREEN + ">> Response remove aiTags:" + Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultTags.getResponseMetaData().getMap()); + System.out.println(resultTags); + System.out.println("\n\n"); + } + + private static void getCustomMetaDataFields() { + ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = ImageKit.getInstance() + .getCustomMetaDataFields(false); + System.out.println(">> Fetch CustomMetaDataFields done."); + System.out.println(Color.ANSI_GREEN + ">> Fetch CustomMetaDataFields Response:" + Color.ANSI_RESET); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList()); + System.out.println(resultCustomMetaDataFieldList); + System.out.println("\n\n"); + } + + private static void createCustomMetaDataFields() + throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { + CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + customMetaDataFieldSchemaObject.setValueRequired(false); + customMetaDataFieldSchemaObject.setMinValue(10); + customMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("NameHe1"); + customMetaDataFieldCreateRequest.setLabel("LabelHe1"); + customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); + + ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() + .createCustomMetaDataFields(customMetaDataFieldCreateRequest); + System.out.println(">> Create CustomMetaDataFields done."); + System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); + System.out.println(resultCustomMetaDataField); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void deleteCustomMetaDataField(String id) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + ResultNoContent resultNoContent = ImageKit.getInstance().deleteCustomMetaDataField(id); + System.out.println(">> CustomMetaDataField deleted..."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(resultNoContent); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(resultNoContent.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultNoContent.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void updateCustomMetaDataFields() + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); + schemaObject.setMinValue(1); + schemaObject.setMaxValue(200); + schemaObject.setMinLength(1); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("62aab5a9db4851797a8f8ff9"); + customMetaDataFieldUpdateRequest.setLabel("LabelHE100"); + customMetaDataFieldUpdateRequest.setSchema(schemaObject); + + ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() + .updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + System.out.println(">> Edit CustomMetaDataFields done."); + System.out.println(Color.ANSI_GREEN + ">> Response edit CustomMetaDataFields :" + Color.ANSI_RESET); + System.out.println(resultCustomMetaDataField); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void deleteFileVersion() + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); + deleteFileVersionRequest.setVersionId("62aac9b47db937233eee762f"); + ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); + System.out.println(">> delete file version done."); + System.out.println(Color.ANSI_GREEN + ">> Response delete File version :" + Color.ANSI_RESET); + System.out.println(resultNoContent); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultNoContent.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void copyFile() + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/new_car11.jpg"); + copyFileRequest.setDestinationPath("/demo1/"); + copyFileRequest.setIncludeVersions(true); + ResultNoContent resultNoContent = ImageKit.getInstance().copyFile(copyFileRequest); + System.out.println(">> Copy file done."); + System.out.println(Color.ANSI_GREEN + ">> Response Copy File :" + Color.ANSI_RESET); + System.out.println(resultNoContent); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultNoContent.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void moveFile() + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/new_car11.jpg"); + moveFileRequest.setDestinationPath("/demo1"); + ResultNoContent resultNoContent = ImageKit.getInstance().moveFile(moveFileRequest); + System.out.println(">> Move File done."); + System.out.println(Color.ANSI_GREEN + ">> Response Move File :" + Color.ANSI_RESET); + System.out.println(resultNoContent); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultNoContent.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void renameFile() + throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/new12.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(true); + ResultRenameFile resultRenameFile = ImageKit.getInstance().renameFile(renameFileRequest); + System.out.println(">> Rename file done."); + System.out.println(Color.ANSI_GREEN + ">> Response Rename File :" + Color.ANSI_RESET); + System.out.println(resultRenameFile); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultRenameFile.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void createFolder() { + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("test1"); + createFolderRequest.setParentFolderPath("/"); + ResultEmptyBlock resultEmptyBlock = ImageKit.getInstance().createFolder(createFolderRequest); + System.out.println(">> Create folder done."); + System.out.println(Color.ANSI_GREEN + ">> Response Create Folder :" + Color.ANSI_RESET); + System.out.println(resultEmptyBlock); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void deleteFolder() + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + String folderPath = "/test1"; + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath(folderPath); + ResultNoContent resultNoContent = ImageKit.getInstance().deleteFolder(deleteFolderRequest); + System.out.println(">> Delete folder done."); + System.out.println(Color.ANSI_GREEN + ">> Response Delete Folder :" + Color.ANSI_RESET); + System.out.println(resultNoContent); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultNoContent.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void copyFolder() + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/test1"); + copyFolderRequest.setDestinationPath("/demo1"); + ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().copyFolder(copyFolderRequest); + System.out.println(">> Copy folder done."); + System.out.println(Color.ANSI_GREEN + ">> Response Bulk job status :" + Color.ANSI_RESET); + System.out.println(resultOfFolderActions); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void moveFolder() + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/demo1/test1"); + moveFolderRequest.setDestinationPath("/"); + ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().moveFolder(moveFolderRequest); + System.out.println(">>Move folder done."); + System.out.println(Color.ANSI_GREEN + ">> Response Bulk job status :" + Color.ANSI_RESET); + System.out.println(resultOfFolderActions); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void getBulkJobStatus() { + String jobId = "62a9b9d5663ef7fd985c6fcb"; + ResultBulkJobStatus resultBulkJobStatus = ImageKit.getInstance().getBulkJobStatus(jobId); + System.out.println(">> Fetch Bulk job status done."); + System.out.println(Color.ANSI_GREEN + ">> Response Bulk job status :" + Color.ANSI_RESET); + System.out.println(resultBulkJobStatus); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + private static void getFileVersions() + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + String fileId = "629f3de17eb0fe4053615450"; + ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); + System.out.println(">> Fetch Get file versions done."); + System.out.println(Color.ANSI_GREEN + ">> Response Get file versions :" + Color.ANSI_RESET); + System.out.println(resultFileVersions); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultFileVersions.getResponseMetaData().getList()); + System.out.println("\n\n"); + } + + private static void getFileVersionDetails() + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + String fileId = "62a9b446663ef7b5c15951ba"; + String versionId = "62a9b446663ef7b5c15951ba"; + ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, + versionId); + System.out.println(">> Fetch Get file versions details done."); + System.out.println(Color.ANSI_GREEN + ">> Response Get file versions details :" + Color.ANSI_RESET); + System.out.println(resultFileVersionDetails); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } } From ba292fb62d5ed228e8741e5e5a16412ea115e9e6 Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 18 Jun 2022 18:36:07 +0530 Subject: [PATCH 060/112] added exception throw for ols APIs too and message and isTrue boolean removed from old result object --- .../main/java/io/imagekit/sdk/ImageKit.java | 61 +- .../sdk/exceptions/ForbiddenException.java | 27 + .../exceptions/InternalServerException.java | 27 + .../exceptions/TooManyRequestsException.java | 27 + .../sdk/exceptions/UnauthorizedException.java | 27 + .../sdk/exceptions/UnknownException.java | 27 + .../imagekit/sdk/models/results/Result.java | 54 +- .../sdk/models/results/ResultCache.java | 26 +- .../sdk/models/results/ResultCacheStatus.java | 26 +- .../sdk/models/results/ResultException.java | 45 + .../sdk/models/results/ResultFileDelete.java | 28 +- .../sdk/models/results/ResultList.java | 26 +- .../sdk/models/results/ResultMetaData.java | 26 +- .../imagekit/sdk/tasks/MultipartBuilder.java | 3 +- .../io/imagekit/sdk/tasks/RestClient.java | 1622 ++++++++--------- .../java/io/imagekit/sdk/utils/Utils.java | 34 +- .../java/io/imagekit/sdk/ImageKitTest.java | 370 ++-- .../io/imagekit/sdk/tasks/RestClientTest.java | 500 ----- src/main/java/io/imagekit/sampleapp/App.java | 65 +- 19 files changed, 1336 insertions(+), 1685 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java delete mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index b16b623..2528f80 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -3,8 +3,13 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.exceptions.BadRequestException; import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; import io.imagekit.sdk.exceptions.NotFoundException; import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; import io.imagekit.sdk.models.*; import io.imagekit.sdk.models.results.*; import io.imagekit.sdk.tasks.Calculation; @@ -82,7 +87,7 @@ public String getUrl(Map options) { * @param fileCreateRequest is a object which contains file and other parameters * @return object of Result class */ - public Result upload(FileCreateRequest fileCreateRequest) { + public Result upload(FileCreateRequest fileCreateRequest) throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.upload(fileCreateRequest); } @@ -91,7 +96,7 @@ public Result upload(FileCreateRequest fileCreateRequest) { * @param fileUpdateRequest is a object which contains parameters and fileId * @return object of Result class */ - public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) { + public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.updateDetail(fileUpdateRequest); } @@ -101,7 +106,7 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) { * "includeFolder", "name", "limit", "skip"] * @return ResultList class that contains list of BaseFile */ - public ResultList getFileList(Map options) { + public ResultList getFileList(Map options) throws NotFoundException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getFileList(options); } @@ -110,7 +115,7 @@ public ResultList getFileList(Map options) { * @param fileId is a unique file id * @return Result class */ - public Result getFileDetail(String fileId) { + public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.getFileDetail(fileId); } @@ -119,7 +124,7 @@ public Result getFileDetail(String fileId) { * @param fileId is a unique file id * @return ResultMetaData class */ - public ResultMetaData getFileMetadata(String fileId) { + public ResultMetaData getFileMetadata(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.getFileMetaData(fileId); } @@ -128,7 +133,7 @@ public ResultMetaData getFileMetadata(String fileId) { * @param url is a remote image url * @return ResultMetaData class */ - public ResultMetaData getRemoteFileMetadata(String url) { + public ResultMetaData getRemoteFileMetadata(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.getRemoteFileMetaData(url); } @@ -137,7 +142,7 @@ public ResultMetaData getRemoteFileMetadata(String url) { * @param fileId is a unique file id * @return Result class */ - public Result deleteFile(String fileId) { + public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.deleteFile(fileId); } @@ -146,7 +151,7 @@ public Result deleteFile(String fileId) { * @param fileIds is a list of unique file id * @return Result class */ - public ResultFileDelete bulkDeleteFiles(List fileIds) { + public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.bulkDeleteFiles(fileIds); } @@ -155,7 +160,7 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) { * @param url is image url * @return ResultCache class */ - public ResultCache purgeCache(String url) { + public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.purgeCache(url); } @@ -164,7 +169,7 @@ public ResultCache purgeCache(String url) { * @param requestId is cache request id * @return ResultCacheStatus class */ - public ResultCacheStatus getPurgeCacheStatus(String requestId) { + public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.getPurgeCacheStatus(requestId); } @@ -213,7 +218,7 @@ public int pHashDistance(String firstHex, String secondHex) { * @return ArrayList of String */ public ResultTags addTags(TagsRequest tagsRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.manageTags(tagsRequest, "addTags"); } @@ -224,7 +229,7 @@ public ResultTags addTags(TagsRequest tagsRequest) * @return ArrayList of String */ public ResultTags removeAITags(AITagsRequest aiTagsRequest) - throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.removeAITags(aiTagsRequest); } @@ -235,7 +240,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) * @return ArrayList of String */ public ResultTags removeTags(TagsRequest tagsRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.manageTags(tagsRequest, "removeTags"); } @@ -244,7 +249,7 @@ public ResultTags removeTags(TagsRequest tagsRequest) * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, * label, schema */ - public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.getCustomMetaDataFields(includeDeleted); } @@ -257,7 +262,7 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele */ public ResultCustomMetaDataField createCustomMetaDataFields( CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) - throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { + throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } @@ -267,7 +272,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields( * @return Result class */ public ResultNoContent deleteCustomMetaDataField(String id) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.deleteCustomMetaDataField(id); } @@ -280,7 +285,7 @@ public ResultNoContent deleteCustomMetaDataField(String id) */ public ResultCustomMetaDataField updateCustomMetaDataFields( CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } @@ -290,7 +295,7 @@ public ResultCustomMetaDataField updateCustomMetaDataFields( * @return Result class */ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.deleteFileVersion(deleteFileVersionRequest); } @@ -300,7 +305,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers * @return Result class */ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.copyFile(copyFileRequest); } @@ -310,7 +315,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) * @return Result class */ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.moveFile(moveFileRequest); } @@ -320,7 +325,7 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) * @return Result class */ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) - throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { + throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.renameFile(renameFileRequest); } @@ -330,7 +335,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) * folder you want to delete * @return Result class */ - public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.createFolder(createFolderRequest); } @@ -341,7 +346,7 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { * @return Result class */ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.deleteFolder(deleteFolderRequest); } @@ -352,7 +357,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) * @return Result class */ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.copyFolder(copyFolderRequest); } @@ -362,7 +367,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) * @return Result class */ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.moveFolder(moveFolderRequest); } @@ -371,7 +376,7 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) * @param jobId * @return a Result class */ - public ResultBulkJobStatus getBulkJobStatus(String jobId) { + public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.getBulkJobStatus(jobId); } @@ -381,7 +386,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) { * @return a Result class */ public ResultFileVersions getFileVersions(String fileId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.getFileVersions(fileId); } @@ -391,7 +396,7 @@ public ResultFileVersions getFileVersions(String fileId) * @return a Result class */ public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.getFileVersionDetails(fileId, versionId); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java new file mode 100644 index 0000000..f1e30b1 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java @@ -0,0 +1,27 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ForbiddenException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public ForbiddenException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ForbiddenException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java new file mode 100644 index 0000000..09277f4 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java @@ -0,0 +1,27 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class InternalServerException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public InternalServerException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "InternalServerException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java new file mode 100644 index 0000000..b252b8f --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java @@ -0,0 +1,27 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class TooManyRequestsException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public TooManyRequestsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "TooManyRequestsException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java new file mode 100644 index 0000000..5c7a785 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java @@ -0,0 +1,27 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class UnauthorizedException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public UnauthorizedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "UnauthorizedException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java new file mode 100644 index 0000000..19fee86 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java @@ -0,0 +1,27 @@ +package io.imagekit.sdk.exceptions; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class UnknownException extends Exception { + + private String message; + private String help; + private ResponseMetaData responseMetaData; + + public UnknownException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "UnknownException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index ca1997e..eaff384 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -14,8 +14,6 @@ import java.util.Map; public class Result extends BaseFile { - private boolean isSuccessful; - private String message; private String help; @Deprecated private String raw; @@ -52,22 +50,6 @@ public Result(String fileId, String name, String url, String thumbnail, int heig this.updatedAt = updatedAt; } - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - public String getHelp() { return help; } @@ -199,14 +181,32 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "Result{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help + '\'' - + ", fileId='" + fileId + '\'' + ", name='" + name + '\'' + ", url='" + url + '\'' + ", thumbnail='" - + thumbnail + '\'' + ", height=" + height + ", width=" + width + ", size=" + size + ", filePath='" - + filePath + '\'' + ", tags='" + tags + '\'' + ", isPrivateFile=" + isPrivateFile - + ", customCoordinates='" + customCoordinates + '\'' + ", fileType='" + fileType + '\'' + ", aiTags=" - + aiTags + ", versionInfo=" + versionInfo + ", customMetadata=" + customMetadata + ", embeddedMetadata=" - + embeddedMetadata + ", extensionStatus=" + extensionStatus + ", type='" + type + '\'' + ", mime='" - + mime + '\'' + ", hasAlpha=" + hasAlpha + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt - + '}'; + return "Result{" + + "fileId='" + fileId + '\'' + + ", name='" + name + '\'' + + ", url='" + url + '\'' + + ", thumbnail='" + thumbnail + '\'' + + ", height=" + height + + ", width=" + width + + ", size=" + size + + ", filePath='" + filePath + '\'' + + ", tags=" + tags + + ", isPrivateFile=" + isPrivateFile + + ", customCoordinates='" + customCoordinates + '\'' + + ", fileType='" + fileType + '\'' + + ", aiTags=" + aiTags + + ", versionInfo=" + versionInfo + + ", customMetadata=" + customMetadata + + ", embeddedMetadata=" + embeddedMetadata + + ", extensionStatus=" + extensionStatus + + ", type='" + type + '\'' + + ", mime='" + mime + '\'' + + ", hasAlpha=" + hasAlpha + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + ", help='" + help + '\'' + + ", raw='" + raw + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index 8f0f353..d427234 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -9,8 +9,6 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultCache { - private boolean isSuccessful; - private String message; private String help; private String requestId; @Deprecated @@ -20,22 +18,6 @@ public class ResultCache { public ResultCache() { } - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - public String getHelp() { return help; } @@ -79,7 +61,11 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultCache{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help - + '\'' + ", requestId='" + requestId + '\'' + '}'; + return "ResultCache{" + + "help='" + help + '\'' + + ", requestId='" + requestId + '\'' + + ", raw='" + raw + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index a17d92c..0f6d71a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -9,8 +9,6 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultCacheStatus { - private boolean isSuccessful; - private String message; private String help; private String status; @Deprecated @@ -20,22 +18,6 @@ public class ResultCacheStatus { public ResultCacheStatus() { } - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - public String getHelp() { return help; } @@ -79,7 +61,11 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultCache{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help - + '\'' + ", status='" + status + '\'' + '}'; + return "ResultCacheStatus{" + + "help='" + help + '\'' + + ", status='" + status + '\'' + + ", raw='" + raw + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java new file mode 100644 index 0000000..7ef31f7 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java @@ -0,0 +1,45 @@ +package io.imagekit.sdk.models.results; + +import io.imagekit.sdk.models.ResponseMetaData; + +public class ResultException { + private String message; + private String help; + private ResponseMetaData responseMetaData = new ResponseMetaData(); + + public ResultException() { + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getHelp() { + return help; + } + + public void setHelp(String help) { + this.help = help; + } + + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + + @Override + public String toString() { + return "ResultException{" + + "message='" + message + '\'' + + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index 4c6e2a9..121bf39 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -11,8 +11,6 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultFileDelete { - private boolean isSuccessful; - private String message; private String help; @Deprecated private String raw; @@ -25,22 +23,6 @@ public ResultFileDelete() { missingFileIds = new ArrayList<>(); } - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - public String getHelp() { return help; } @@ -92,8 +74,12 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultFileDelete{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help - + '\'' + ", successfullyDeletedFileIds=" + successfullyDeletedFileIds + ", missingFileIds=" - + missingFileIds + '}'; + return "ResultFileDelete{" + + "help='" + help + '\'' + + ", raw='" + raw + '\'' + + ", successfullyDeletedFileIds=" + successfullyDeletedFileIds + + ", missingFileIds=" + missingFileIds + + ", responseMetaData=" + responseMetaData + + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 52e1dbf..9c3a280 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -11,8 +11,6 @@ import java.util.Map; public class ResultList { - private boolean isSuccessful; - private String message; private String help; @Deprecated private String raw; @@ -26,22 +24,6 @@ public ResultList(List results) { this.results = results; } - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - public String getHelp() { return help; } @@ -85,7 +67,11 @@ public void setResults(List results) { @Override public String toString() { - return "ResultList{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help - + '\'' + ", results=" + results + '}'; + return "ResultList{" + + "help='" + help + '\'' + + ", raw='" + raw + '\'' + + ", results=" + results + + ", responseMetaData=" + responseMetaData + + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index bd3fbf6..29f0a6f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -10,8 +10,6 @@ import io.imagekit.sdk.models.ResponseMetaData; public class ResultMetaData { - private boolean isSuccessful; - private String message; private String help; @Deprecated private String raw; @@ -21,22 +19,6 @@ public class ResultMetaData { public ResultMetaData() { } - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - public String getHelp() { return help; } @@ -80,7 +62,11 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultMetaData{" + "isSuccessful=" + isSuccessful + ", message='" + message + '\'' + ", help='" + help - + '\'' + ", results=" + results + '}'; + return "ResultMetaData{" + + "help='" + help + '\'' + + ", raw='" + raw + '\'' + + ", results=" + results + + ", responseMetaData=" + responseMetaData + + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index b8f52bd..cb788b7 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -15,8 +15,9 @@ import java.util.Map; public class MultipartBuilder { + private static final String RANDOM_BOUNDARY = "randomBoundary-------------------"; public MultipartBody build(FileCreateRequest fileCreateRequest) { - MultipartBody.Builder builder = new MultipartBody.Builder("boundary").setType(MultipartBody.FORM); + MultipartBody.Builder builder = new MultipartBody.Builder(RANDOM_BOUNDARY).setType(MultipartBody.FORM); if (null != fileCreateRequest.url) { builder.addFormDataPart("file", fileCreateRequest.url.toString()); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 408f0de..01f7f67 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -8,8 +8,13 @@ import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.exceptions.BadRequestException; import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; import io.imagekit.sdk.exceptions.NotFoundException; import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; @@ -37,846 +42,783 @@ public class RestClient { - public static String API_BASE_URL = "https://api.imagekit.io/"; - public static String UPLOAD_BASE_URL = "https://upload.imagekit.io/"; - - private ImageKit imageKit; - Request request; - OkHttpClient client; - MultipartBuilder multipartBuilder; - - public RestClient(ImageKit imageKit) { - this.imageKit = imageKit; - this.client = new OkHttpClient(); - this.multipartBuilder = new MultipartBuilder(); - } - - public void setClient(OkHttpClient client) { - this.client = client; - } - - public void setMultipartBuilder(MultipartBuilder builder) { - this.multipartBuilder = builder; - } - - public Result upload(FileCreateRequest fileCreateRequest) { - Result result = null; - Map headers = Utils.getHeaders(imageKit); - - MultipartBody body = multipartBuilder.build(fileCreateRequest); - - request = new Request.Builder().url(UPLOAD_BASE_URL.concat("api/v1/files/upload")).post(body) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result = new Result(); - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public Result updateDetail(FileUpdateRequest fileUpdateRequest) { - Result result = null; - Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", - fileUpdateRequest.getFileId()); - request = new Request.Builder().url(url).patch(multipartBuilder.build(fileUpdateRequest)) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result = new Result(); - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultList getFileList(Map options) { - ResultList resultList = new ResultList(); - Map headers = Utils.getHeaders(imageKit); - - QueryMaker queryMaker = new QueryMaker(); - - for (Map.Entry entry : options.entrySet()) { - queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); - } - - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files?%s", queryMaker.get()); + public static String API_BASE_URL = "https://api.imagekit.io/"; + public static String UPLOAD_BASE_URL = "https://upload.imagekit.io/"; + + private ImageKit imageKit; + Request request; + OkHttpClient client; + MultipartBuilder multipartBuilder; + + public RestClient(ImageKit imageKit) { + this.imageKit = imageKit; + this.client = new OkHttpClient(); + this.multipartBuilder = new MultipartBuilder(); + } + + public void setClient(OkHttpClient client) { + this.client = client; + } + + public void setMultipartBuilder(MultipartBuilder builder) { + this.multipartBuilder = builder; + } + + public Result upload(FileCreateRequest fileCreateRequest) throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + Result result = null; + Map headers = Utils.getHeaders(imageKit); + + MultipartBody body = multipartBuilder.build(fileCreateRequest); + + request = new Request.Builder().url(UPLOAD_BASE_URL.concat("api/v1/files/upload")).post(body) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + Result result = null; + Map headers = Utils.getHeaders(imageKit); + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", + fileUpdateRequest.getFileId()); + request = new Request.Builder().url(url).patch(multipartBuilder.build(fileUpdateRequest)) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultList resultList = new ResultList(); + Map headers = Utils.getHeaders(imageKit); + + QueryMaker queryMaker = new QueryMaker(); + + for (Map.Entry entry : options.entrySet()) { + queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); + } + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files?%s", queryMaker.get()); // System.out.println(url); - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - List files = new Gson().fromJson(respBody, new TypeToken>() { - }.getType()); - resultList.setResults(files); - resultList.setSuccessful(true); - resultList.setRaw(respBody); - } else if (response.code() == 500) { - resultList.setSuccessful(false); - resultList.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - resultList = new Gson().fromJson(resp, ResultList.class); - resultList.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultList; - } - - public Result getFileDetail(String fileId) { - Result result = new Result(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", fileId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultMetaData getFileMetaData(String fileId) { - ResultMetaData result = new ResultMetaData(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/metadata", fileId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - MetaData metaData = new Gson().fromJson(respBody, MetaData.class); - result.setResults(metaData); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, ResultMetaData.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultMetaData getRemoteFileMetaData(String url) { - ResultMetaData result = new ResultMetaData(); - Map headers = Utils.getHeaders(imageKit); - - String apiURL = "https://api.imagekit.io/v1/metadata?url=" + url; - - request = new Request.Builder().url(apiURL).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - MetaData metaData = new Gson().fromJson(respBody, MetaData.class); - result.setResults(metaData); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, ResultMetaData.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public Result deleteFile(String fileId) { - Result result = new Result(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s", fileId); - - request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - respBody = response.body().string(); - result.setMessage("File deleted successfully!"); - result.setFileId(fileId); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, Result.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultFileDelete bulkDeleteFiles(List fileIds) { - ResultFileDelete result = new ResultFileDelete(); - Map headers = Utils.getHeaders(imageKit); - - String url = "https://api.imagekit.io/v1/files/batch/deleteByFileIds"; - - request = new Request.Builder().url(url) - .post(multipartBuilder.build(String.format("{\"fileIds\":%s}", new Gson().toJson(fileIds)))) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, ResultFileDelete.class); - result.setMessage("File deleted successfully!"); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 404) { - String resp = response.body().string(); - result = new Gson().fromJson(resp, ResultFileDelete.class); - result.setRaw(resp); - result.getResponseMetaData().setRaw(resp); - result.setSuccessful(false); - } else if (response.code() == 500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, ResultFileDelete.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultCache purgeCache(String url) { - ResultCache result = new ResultCache(); - Map headers = Utils.getHeaders(imageKit); - - request = new Request.Builder().url("https://api.imagekit.io/v1/files/purge") - .post(multipartBuilder.build(String.format("{\"url\":\"%s\"}", url))).headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200 || response.code() == 201) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, ResultCache.class); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, ResultCache.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultCacheStatus getPurgeCacheStatus(String requestId) { - ResultCacheStatus result = new ResultCacheStatus(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/purge/%s", requestId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, ResultCacheStatus.class); - result.setSuccessful(true); - result.setRaw(respBody); - } else if (response.code() == 500) { - result.setSuccessful(false); - result.setMessage("Error: Internal server error."); - } else { - String resp = response.body().string(); - result = new Gson().fromJson(resp, ResultCacheStatus.class); - result.setSuccessful(false); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return result; - } - - public ResultTags manageTags(TagsRequest tagsRequest, String action) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - ResultTags resultTags = new ResultTags(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(tagsRequest)); - request = new Request.Builder() - .url(action.equals("removeTags") ? API_BASE_URL.concat("v1/files/removeTags") - : API_BASE_URL.concat("v1/files/addTags")) - .post(requestBody).headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultTags; - } - - public ResultTags removeAITags(AITagsRequest aiTagsRequest) - throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { - ResultTags resultTags = new ResultTags(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(aiTagsRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/removeAITags")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - - } catch (IOException e) { - e.printStackTrace(); - } - return resultTags; - } - - public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) { - ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); - - Map headers = Utils.getHeaders(imageKit); - - request = new Request.Builder() - .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)).get() - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - List resultCustomMetaDataFields = new Gson().fromJson(respBody, - new TypeToken>() { - }.getType()); - resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), - response.code(), response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultCustomMetaDataFieldList; - } - - public ResultCustomMetaDataField createCustomMetaDataFields( - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) - throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { - if (customMetaDataFieldCreateRequest.getName() == null) { - throw new RuntimeException("Error: Name not provided."); - } - if (customMetaDataFieldCreateRequest.getLabel() == null) { - throw new RuntimeException("Error: Label not provided."); - } - ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(customMetaDataFieldCreateRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/customMetadataFields")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 201) { - respBody = response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultCustomMetaDataField; - } - - public ResultNoContent deleteCustomMetaDataField(String id) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), id); - - request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultCustomMetaDataField updateCustomMetaDataFields( - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(customMetaDataFieldUpdateRequest)); - String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), - customMetaDataFieldUpdateRequest.getId()); - request = new Request.Builder().url(url).patch(requestBody).headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultCustomMetaDataField; - } - - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { - ResultNoContent resultNoContent = new ResultNoContent(); - - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), - deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); - request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(copyFileRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/copy")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(moveFileRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/move")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) - throws PartialSuccessException, ConflictException, NotFoundException, BadRequestException { - ResultRenameFile resultRenameFile = new ResultRenameFile(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(renameFileRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/rename")).put(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - String respString = response.body().string(); - respBody = respString == null || respString.equals("") ? "{}" : respString; - resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultRenameFile; - } - - public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) { - ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(createFolderRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 201) { - String respString = response.body().string(); - respBody = respString == null || respString.equals("") ? "{}" : respString; - } - Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultEmptyBlock; - } - - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(deleteFolderRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).delete(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultNoContent; - } - - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(copyFolderRequest)); - - request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultOfFolderActions; - } - - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(moveFolderRequest)); - - request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultOfFolderActions; - } - - public ResultBulkJobStatus getBulkJobStatus(String jobId) { - ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); - - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); - } - Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultBulkJobStatus; - } - - public ResultFileVersions getFileVersions(String fileId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - ResultFileVersions resultFileVersions = new ResultFileVersions(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions"), fileId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - List resultFileVersionDetailsList = new Gson().fromJson(respBody, - new TypeToken>() { - }.getType()); - resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultFileVersions; - } - - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { - if (fileId == null) { - throw new RuntimeException("Error: FileId not provided."); - } - if (versionId == null) { - throw new RuntimeException("Error: versionId not provided."); - } - ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); - } else { - Utils.throwException(response); - } - Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - e.printStackTrace(); - } - return resultFileVersionDetails; - } + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("here res:==> " + response); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List files = new Gson().fromJson(respBody, new TypeToken>() { + }.getType()); + resultList.setResults(files); + resultList.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultList; + } + + public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + Result result = new Result(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultMetaData result = new ResultMetaData(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/metadata", fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + MetaData metaData = new Gson().fromJson(respBody, MetaData.class); + result.setResults(metaData); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultMetaData result = new ResultMetaData(); + Map headers = Utils.getHeaders(imageKit); + + String apiURL = "https://api.imagekit.io/v1/metadata?url=" + url; + + request = new Request.Builder().url(apiURL).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + MetaData metaData = new Gson().fromJson(respBody, MetaData.class); + result.setResults(metaData); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + Result result = new Result(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s", fileId); + + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + respBody = response.body().string(); + result.setFileId(fileId); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultFileDelete result = new ResultFileDelete(); + Map headers = Utils.getHeaders(imageKit); + + String url = "https://api.imagekit.io/v1/files/batch/deleteByFileIds"; + + request = new Request.Builder().url(url) + .post(multipartBuilder.build(String.format("{\"fileIds\":%s}", new Gson().toJson(fileIds)))) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultFileDelete.class); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultCache result = new ResultCache(); + Map headers = Utils.getHeaders(imageKit); + + request = new Request.Builder().url("https://api.imagekit.io/v1/files/purge") + .post(multipartBuilder.build(String.format("{\"url\":\"%s\"}", url))).headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200 || response.code() == 201) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultCache.class); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultCacheStatus result = new ResultCacheStatus(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/purge/%s", requestId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultCacheStatus.class); + result.setRaw(respBody); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + public ResultTags manageTags(TagsRequest tagsRequest, String action) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultTags resultTags = new ResultTags(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(tagsRequest)); + request = new Request.Builder() + .url(action.equals("removeTags") ? API_BASE_URL.concat("v1/files/removeTags") + : API_BASE_URL.concat("v1/files/addTags")) + .post(requestBody).headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultTags; + } + + public ResultTags removeAITags(AITagsRequest aiTagsRequest) + throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultTags resultTags = new ResultTags(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(aiTagsRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/removeAITags")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + + } catch (IOException e) { + e.printStackTrace(); + } + return resultTags; + } + + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); + + Map headers = Utils.getHeaders(imageKit); + + request = new Request.Builder() + .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)).get() + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List resultCustomMetaDataFields = new Gson().fromJson(respBody, + new TypeToken>() { + }.getType()); + resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), + response.code(), response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultCustomMetaDataFieldList; + } + + public ResultCustomMetaDataField createCustomMetaDataFields( + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) + throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + if (customMetaDataFieldCreateRequest.getName() == null) { + throw new RuntimeException("Error: Name not provided."); + } + if (customMetaDataFieldCreateRequest.getLabel() == null) { + throw new RuntimeException("Error: Label not provided."); + } + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(customMetaDataFieldCreateRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/customMetadataFields")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 201) { + respBody = response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultCustomMetaDataField; + } + + public ResultNoContent deleteCustomMetaDataField(String id) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), id); + + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultCustomMetaDataField updateCustomMetaDataFields( + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); + + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(customMetaDataFieldUpdateRequest)); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), + customMetaDataFieldUpdateRequest.getId()); + request = new Request.Builder().url(url).patch(requestBody).headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultCustomMetaDataField; + } + + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), + deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(copyFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/copy")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(moveFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/move")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) + throws PartialSuccessException, ConflictException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultRenameFile resultRenameFile = new ResultRenameFile(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(renameFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/rename")).put(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString; + resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultRenameFile; + } + + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(createFolderRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 201) { + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultEmptyBlock; + } + + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(deleteFolderRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).delete(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultNoContent; + } + + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(copyFolderRequest)); + + request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultOfFolderActions; + } + + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(moveFolderRequest)); + + request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultOfFolderActions; + } + + public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); + + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultBulkJobStatus; + } + + public ResultFileVersions getFileVersions(String fileId) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultFileVersions resultFileVersions = new ResultFileVersions(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions"), fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List resultFileVersionDetailsList = new Gson().fromJson(respBody, + new TypeToken>() { + }.getType()); + resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultFileVersions; + } + + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + if (fileId == null) { + throw new RuntimeException("Error: FileId not provided."); + } + if (versionId == null) { + throw new RuntimeException("Error: versionId not provided."); + } + ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); + } else { + Utils.throwException(response); + } + Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + e.printStackTrace(); + } + return resultFileVersionDetails; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index c2fefa0..0294176 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -6,10 +6,16 @@ import io.imagekit.sdk.config.Configuration; import io.imagekit.sdk.exceptions.BadRequestException; import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; import io.imagekit.sdk.exceptions.NotFoundException; import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; import io.imagekit.sdk.models.ResponseMetaData; import io.imagekit.sdk.models.results.ResultCache; +import io.imagekit.sdk.models.results.ResultException; import okhttp3.Credentials; import okhttp3.Response; @@ -128,25 +134,37 @@ public static Map getHeaders(ImageKit imageKit) { } public static void throwException(Response response) - throws IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + throws IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, UnauthorizedException, ForbiddenException, TooManyRequestsException { String resp = response.body().string(); - ResultCache result = new Gson().fromJson(resp, ResultCache.class); + ResultException result = new Gson().fromJson(resp, ResultException.class); populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); if (response.code() == 207) { throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 400) { + } else if (response.code() == 400) { throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 404) { + } else if (response.code() == 401) { + throw new UnauthorizedException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else if (response.code() == 403) { + throw new ForbiddenException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else if (response.code() == 404) { throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } - if (response.code() == 409) { + } else if (response.code() == 409) { throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } else if (response.code() == 429) { + throw new TooManyRequestsException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); + } else if (response.code() == 500 || response.code() == 502 || response.code() == 503 || response.code() == 504) { + throw new InternalServerException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); + } else { + throw new UnknownException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index e3729bc..1f5bea1 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -4,8 +4,13 @@ import io.imagekit.sdk.constants.Version; import io.imagekit.sdk.exceptions.BadRequestException; import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; import io.imagekit.sdk.exceptions.NotFoundException; import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; @@ -485,7 +490,7 @@ public void imageKit_upload_expect_UnknownHostException() throws UnknownHostExce } @Test - public void imageKit_upload_returnSuccess() throws IOException, InterruptedException { + public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; URL url = null; try { @@ -564,150 +569,215 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep RestClient.UPLOAD_BASE_URL = server.url("/").toString(); SUT.upload(fileCreateRequest); RecordedRequest request = server.takeRequest(); - String json = "--boundary\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" + "Content-Length: 53\r\n" - + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + "--boundary\r\n" + String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" + "Content-Length: 53\r\n" + + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"fileName\"\r\n" + "Content-Length: 20\r\n" + "\r\n" - + "sample-cat-image.png\r\n" + "--boundary\r\n" + + "sample-cat-image.png\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" - + "false\r\n" + "--boundary\r\n" + "Content-Disposition: form-data; name=\"tags\"\r\n" - + "Content-Length: 27\r\n" + "\r\n" + "Software,Developer,Engineer\r\n" + "--boundary\r\n" + + "false\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"tags\"\r\n" + + "Content-Length: 27\r\n" + "\r\n" + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" - + "--boundary\r\n" + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" - + "Content-Length: 11\r\n" + "\r\n" + "10,10,20,20\r\n" + "--boundary\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + + "Content-Length: 11\r\n" + "\r\n" + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" - + "thumbnail,tags,customCoordinates\r\n" + "--boundary\r\n" + + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--boundary\r\n" + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" - + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--boundary\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--boundary\r\n" + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" - + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--boundary\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" - + "--boundary\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" - + "--boundary\r\n" + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" - + "Content-Length: 12\r\n" + "\r\n" + "{\"test1\":10}\r\n" + "--boundary--"; + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + + "Content-Length: 12\r\n" + "\r\n" + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; assertEquals(json, request.getBody().readUtf8().trim()); assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); } - @Test - public void imageKit_updateDetails_returnTrue() { - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("file_id"); - Result result = new Result(); - result.setSuccessful(true); - when(restClient.updateDetail(any(FileUpdateRequest.class))).thenReturn(result); - - Result result1 = SUT.updateFileDetail(fileUpdateRequest); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); - } - - @Test(expected = NullPointerException.class) - public void imageKit_updateDetails_throwException() { - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("file_id"); - Result result = new Result(); - result.setSuccessful(true); - when(restClient.updateDetail(any(FileUpdateRequest.class))).thenThrow(new NullPointerException()); + @Test(expected = NotFoundException.class) + public void imageKit_updateDetails_expected_404() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - Result result1 = SUT.updateFileDetail(fileUpdateRequest); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.updateFileDetail(fileUpdateRequest); + server.takeRequest(); } @Test - public void imageKit_getFileList_returnList() { - ResultList resultList = new ResultList(); - List list = new ArrayList<>(10); - resultList.setResults(list); - when(restClient.getFileList(any())).thenReturn(resultList); - - Map options = new HashMap<>(); - options.put("skip", "0"); - options.put("limit", "10"); + public void imageKit_updateDetails_returnTrue() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultList resultList1 = SUT.getFileList(options); - assertThat(resultList1.getResults().size(), is(resultList.getResults().size())); - } - - @Test - public void imageKit_getFileDetail_successExpected() { - Result result = new Result(); - result.setSuccessful(true); - when(restClient.getFileDetail(any(String.class))).thenReturn(result); - Result result1 = SUT.getFileDetail("fileId"); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); - } + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"type\": \"file\",\n" + + " \"name\": \"new_car.jpg\",\n" + + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + + " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" + + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + + " \"tags\": [\n" + + " \"tagg\",\n" + + " \"tagg1\"\n" + + " ],\n" + + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + + " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"embeddedMetadata\": {\n" + + " \"XResolution\": 250,\n" + + " \"YResolution\": 250,\n" + + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + + " },\n" + + " \"customCoordinates\": \"10,10,20,20\",\n" + + " \"customMetadata\": {\n" + + " \"test100\": 10\n" + + " },\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + + " \"fileType\": \"image\",\n" + + " \"filePath\": \"/new_car.jpg\",\n" + + " \"height\": 354,\n" + + " \"width\": 236,\n" + + " \"size\": 23023,\n" + + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileUpdateRequest.setTags(tags); - @Test - public void imageKit_getFileMetaData_successExpected() { - ResultMetaData result = new ResultMetaData(); - result.setSuccessful(true); - when(restClient.getFileMetaData(any(String.class))).thenReturn(result); + SUT.updateFileDetail(fileUpdateRequest); + RecordedRequest request = server.takeRequest(); - ResultMetaData result1 = SUT.getFileMetadata("fileId"); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + System.out.println("utf8RequestBody:--> " + utf8RequestBody); +// assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), request.getRequestUrl().toString()); } - @Test - public void imageKit_getRemoteFileMetaData_successExpected() { - ResultMetaData result = new ResultMetaData(); - result.setSuccessful(true); - when(restClient.getRemoteFileMetaData(any(String.class))).thenReturn(result); - - ResultMetaData result1 = SUT.getRemoteFileMetadata("remote_url"); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); - } + @Test(expected = NotFoundException.class) + public void imageKit_getFileList_returnList() throws InterruptedException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException { - @Test - public void imageKit_deleteFile_successExpected() { - Result result = new Result(); - result.setSuccessful(true); - when(restClient.deleteFile(any(String.class))).thenReturn(result); + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Map options = new HashMap<>(); + options.put("skip", "" + 0); + options.put("limit", "" + 10); + SUT.getFileList(options); - Result result1 = SUT.deleteFile("fileId"); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); + server.takeRequest(); } - @Test - public void imageKit_bulkDeleteFiles_successExpected() { - List fileIds = new ArrayList<>(); - fileIds.add("file_id_1"); - fileIds.add("file_id_2"); - fileIds.add("file_id_3"); - - ResultFileDelete result = new ResultFileDelete(); - result.setSuccessfullyDeletedFileIds(fileIds); - result.setSuccessful(true); - when(restClient.bulkDeleteFiles(any())).thenReturn(result); - ResultFileDelete result1 = SUT.bulkDeleteFiles(fileIds); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); - } +// @Test +// public void imageKit_getFileDetail_successExpected() { +// Result result = new Result(); +// result.setSuccessful(true); +// when(restClient.getFileDetail(any(String.class))).thenReturn(result); +// +// Result result1 = SUT.getFileDetail("fileId"); +// assertThat(result1.isSuccessful(), is(result.isSuccessful())); +// } + +// @Test +// public void imageKit_getFileMetaData_successExpected() { +// ResultMetaData result = new ResultMetaData(); +// result.setSuccessful(true); +// when(restClient.getFileMetaData(any(String.class))).thenReturn(result); +// +// ResultMetaData result1 = SUT.getFileMetadata("fileId"); +// assertThat(result1.isSuccessful(), is(result.isSuccessful())); +// } @Test - public void imageKit_purgeCache_successExpected() { - ResultCache result = new ResultCache(); - result.setSuccessful(true); - result.setRequestId("requestId"); - when(restClient.purgeCache(any(String.class))).thenReturn(result); + public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getRemoteFileMetadata("remote_url"); - ResultCache result1 = SUT.purgeCache("fileId"); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); - assertThat(result1.getRequestId(), is(result.getRequestId())); + server.takeRequest(); } - @Test - public void imageKit_getPurgeCacheStatus_successExpected() { - ResultCacheStatus result = new ResultCacheStatus(); - result.setSuccessful(true); - result.setStatus("Complete"); - when(restClient.getPurgeCacheStatus(any(String.class))).thenReturn(result); - - ResultCacheStatus result1 = SUT.getPurgeCacheStatus("requestId"); - assertThat(result1.isSuccessful(), is(result.isSuccessful())); - assertThat(result1.getStatus(), is(result.getStatus())); - } +// @Test +// public void imageKit_deleteFile_successExpected() { +// Result result = new Result(); +// result.setSuccessful(true); +// when(restClient.deleteFile(any(String.class))).thenReturn(result); +// +// Result result1 = SUT.deleteFile("fileId"); +// assertThat(result1.isSuccessful(), is(result.isSuccessful())); +// } + +// @Test +// public void imageKit_bulkDeleteFiles_successExpected() { +// List fileIds = new ArrayList<>(); +// fileIds.add("file_id_1"); +// fileIds.add("file_id_2"); +// fileIds.add("file_id_3"); +// +// ResultFileDelete result = new ResultFileDelete(); +// result.setSuccessfullyDeletedFileIds(fileIds); +// result.setSuccessful(true); +// when(restClient.bulkDeleteFiles(any())).thenReturn(result); +// ResultFileDelete result1 = SUT.bulkDeleteFiles(fileIds); +// assertThat(result1.isSuccessful(), is(result.isSuccessful())); +// } + +// @Test +// public void imageKit_purgeCache_successExpected() { +// ResultCache result = new ResultCache(); +// result.setSuccessful(true); +// result.setRequestId("requestId"); +// when(restClient.purgeCache(any(String.class))).thenReturn(result); +// +// ResultCache result1 = SUT.purgeCache("fileId"); +// assertThat(result1.isSuccessful(), is(result.isSuccessful())); +// assertThat(result1.getRequestId(), is(result.getRequestId())); +// } + +// @Test +// public void imageKit_getPurgeCacheStatus_successExpected() { +// ResultCacheStatus result = new ResultCacheStatus(); +// result.setSuccessful(true); +// result.setStatus("Complete"); +// when(restClient.getPurgeCacheStatus(any(String.class))).thenReturn(result); +// +// ResultCacheStatus result1 = SUT.getPurgeCacheStatus("requestId"); +// assertThat(result1.isSuccessful(), is(result.isSuccessful())); +// assertThat(result1.getStatus(), is(result.getStatus())); +// } @Test public void withoutToken_getAuthenticationParameters_successExpected() { @@ -770,7 +840,7 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { @Test(expected = NotFoundException.class) public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -794,7 +864,7 @@ public void add_tags_expected_404() throws IOException, InterruptedException, No @Test public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -821,7 +891,7 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept @Test(expected = NotFoundException.class) public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -842,7 +912,7 @@ public void remove_tags_expected_404_bad_request() throws InterruptedException, @Test public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -867,7 +937,7 @@ public void remove_tags_expectedSuccessWith() throws IOException, InterruptedExc } @Test - public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException { + public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" @@ -890,7 +960,7 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, @Test(expected = BadRequestException.class) public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException, - PartialSuccessException, NotFoundException, ConflictException { + PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" @@ -925,7 +995,7 @@ public void createCustomMetaDataFields_expected_400() throws InterruptedExceptio @Test public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, - BadRequestException, PartialSuccessException, NotFoundException, ConflictException { + BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" @@ -958,7 +1028,7 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep @Test(expected = NotFoundException.class) public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" @@ -972,7 +1042,7 @@ public void deleteCustomMetaDataField_404_Expected() throws IOException, Interru @Test public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); @@ -991,7 +1061,7 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte @Test(expected = NotFoundException.class) public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException { + NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1014,7 +1084,7 @@ public void updateCustomMetaDataFields_404_Expected() throws InterruptedExceptio @Test(expected = BadRequestException.class) public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException { + NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400) @@ -1039,7 +1109,7 @@ public void updateCustomMetaDataFields_400_Expected() throws InterruptedExceptio @Test public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, - BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse() @@ -1073,7 +1143,7 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep @Test(expected = NotFoundException.class) public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, ConflictException { + NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1097,7 +1167,7 @@ public void removeAITags_404_Expected() throws InterruptedException, IOException @Test public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, ConflictException { + NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1125,7 +1195,7 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept @Test(expected = NotFoundException.class) public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/sample_image.jpg"); @@ -1145,7 +1215,7 @@ public void copyFile_404_Expected() throws InterruptedException, IOException, No @Test public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/car_false.jpeg"); @@ -1169,7 +1239,7 @@ public void copyFile_successExpected() throws InterruptedException, IOException, @Test(expected = NotFoundException.class) public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); @@ -1188,7 +1258,7 @@ public void moveFile_404_Expected() throws InterruptedException, IOException, No @Test public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException { + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_la.jpg"); @@ -1211,7 +1281,7 @@ public void moveFile_successExpected() throws InterruptedException, IOException, @Test(expected = NotFoundException.class) public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException { + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/sample_image_th.jpg"); @@ -1232,7 +1302,7 @@ public void renameFile_404_Expected() throws InterruptedException, IOException, @Test(expected = ConflictException.class) public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException { + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/new1.jpg"); @@ -1253,7 +1323,7 @@ public void renameFile_409_Expected() throws InterruptedException, IOException, @Test public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException { + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/car_false.jpeg"); @@ -1276,7 +1346,7 @@ public void renameFile_successExpected() throws InterruptedException, IOExceptio } @Test - public void createFolder_400_Expected() throws InterruptedException, IOException { + public void createFolder_400_Expected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("/testFolder"); @@ -1294,7 +1364,7 @@ public void createFolder_400_Expected() throws InterruptedException, IOException } @Test - public void createFolder_successExpected() throws InterruptedException, IOException { + public void createFolder_successExpected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("testFolder"); @@ -1317,7 +1387,7 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept @Test(expected = NotFoundException.class) public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("/testFolder"); @@ -1335,7 +1405,7 @@ public void deleteFolder_404_Expected() throws InterruptedException, IOException @Test public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("testFolder"); @@ -1357,7 +1427,7 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept @Test(expected = NotFoundException.class) public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1377,7 +1447,7 @@ public void copyFolder_404_Expected() throws InterruptedException, IOException, @Test public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1401,7 +1471,7 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio @Test(expected = NotFoundException.class) public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder/"); @@ -1420,7 +1490,7 @@ public void moveFolder_404_Expected() throws InterruptedException, IOException, @Test public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder"); @@ -1442,7 +1512,7 @@ public void moveFolder_successExpected() throws InterruptedException, IOExceptio } @Test - public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException { + public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(500)); @@ -1461,7 +1531,7 @@ public void getBulkJobStatus_500_Expected() throws InterruptedException, IOExcep } @Test - public void getBulkJobStatus_successExpected() throws InterruptedException, IOException { + public void getBulkJobStatus_successExpected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" @@ -1479,7 +1549,7 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx @Test(expected = NotFoundException.class) public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1493,7 +1563,7 @@ public void getFileVersions_404_Expected() throws InterruptedException, IOExcept @Test public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" @@ -1534,7 +1604,7 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc @Test(expected = NotFoundException.class) public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1548,7 +1618,7 @@ public void getFileVersionDetails_404_Expected() throws InterruptedException, IO @Test public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException { + ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" @@ -1590,7 +1660,7 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, @Test(expected = BadRequestException.class) public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException { + NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1608,7 +1678,7 @@ public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedE @Test(expected = NotFoundException.class) public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException { + NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1626,7 +1696,7 @@ public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedE @Test public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException { + NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java deleted file mode 100644 index 7f9e42b..0000000 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/tasks/RestClientTest.java +++ /dev/null @@ -1,500 +0,0 @@ -package io.imagekit.sdk.tasks; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import io.imagekit.sdk.ImageKit; -import io.imagekit.sdk.models.FileCreateRequest; -import io.imagekit.sdk.models.FileUpdateRequest; -import io.imagekit.sdk.models.results.*; -import io.imagekit.sdk.utils.Utils; -import okhttp3.*; -import okhttp3.mockwebserver.Dispatcher; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; - -import java.io.IOException; -import java.net.SocketTimeoutException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.*; - -public class RestClientTest { - - RestClient SUT; - - @Before - public void setUp() throws Exception { - ImageKit imageKit = ImageKit.getInstance(); - imageKit.setConfig(Utils.getSystemConfig(RestClientTest.class)); - SUT = new RestClient(imageKit); - } - - @Test - public void valid_updateDetail_expectSuccess() { - String resp = "{\n" + " \"fileId\" : \"598821f949c0a938d57563bd\"," + " \"type\": \"file\"," - + " \"name\": \"demo.jpg\",\n" + " \"filePath\": \"/demo.jpg\",\n" - + " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + " \"isPrivateFile\" : false,\n" - + " \"customCoordinates\" : null,\n" - + " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\",\n" - + " \"fileType\": \"image\"\n" + "}"; - OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); - SUT.setClient(clientStub); - - MultipartBuilder multipartBuilder = mock(MultipartBuilder.class); - MultipartBody body = new MultipartBody.Builder().addFormDataPart("", "").build(); - ArgumentCaptor ac = ArgumentCaptor.forClass(FileUpdateRequest.class); - when(multipartBuilder.build(ac.capture())).thenReturn(body); - SUT.setMultipartBuilder(multipartBuilder); - - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("598821f949c0a938d57563bd"); - List tags = new ArrayList<>(); - tags.add("t-shirt"); - tags.add("round-neck"); - tags.add("sale2020"); - fileUpdateRequest.setTags(tags); - Result result = SUT.updateDetail(fileUpdateRequest); - assertEquals(fileUpdateRequest, ac.getValue()); - } - - @Test - public void internalServerError_updateDetail_expectFailed() { - JsonObject json = new JsonObject(); - json.addProperty("message", "Internal Server Error"); - OkHttpClientStub clientStub = new OkHttpClientStub(json.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("my_file_id"); - Result result = SUT.updateDetail(fileUpdateRequest); - assertNotNull(result.getMessage()); - } - - @Test - public void unprocessable_updateDetail_expectFailed() { - JsonObject json = new JsonObject(); - json.addProperty("message", "Internal Server Error"); - OkHttpClientStub clientStub = new OkHttpClientStub(json.toString(), 422, "Un-processable Entity"); - SUT.setClient(clientStub); - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("my_file_id"); - Result result = SUT.updateDetail(fileUpdateRequest); - assertNotNull(result.getMessage()); - } - - @Test(expected = RuntimeException.class) - public void timeOutException_updateDetail_expectFailed() { - JsonObject json = new JsonObject(); - json.addProperty("message", "Internal Server Error"); - OkHttpClientStub clientStub = new OkHttpClientStub(json.toString(), 422, "Un-processable Entity"); - SUT.setClient(clientStub); - clientStub.setTimeoutException(); - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("my_file_id"); - Result result = SUT.updateDetail(fileUpdateRequest); - assertNotNull(result.getMessage()); - } - - @Test - public void valid_getFileList_expectSuccess() { - String resp = "[\n" + "\t{\n" + "\t \"fileId\" : \"598821f949c0a938d57563bd\",\n" - + " \"type\": \"file\",\n" + " \"name\": \"demo.jpg\",\n" - + " \"filePath\": \"/demo.jpg\",\n" - + " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" - + " \"isPrivateFile\" : false,\n" + " \"customCoordinates\" : null,\n" - + " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\"," - + " \"fileType\": \"image\"" + " }" + "]"; - - OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); - - SUT.setClient(clientStub); - - Map options = new HashMap<>(); - options.put("skip", "0"); - options.put("limit", "10"); - - ResultList result = SUT.getFileList(options); - - assertEquals("https://api.imagekit.io/v1/files?limit=10&skip=0", SUT.request.url().toString()); - - assertThat(resp, is(result.getRaw())); - } - - @Test - public void unProcessableEntity_getFileList_expectFailed() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Un-processable Entity"); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 422, "Un-processable Entity"); - SUT.setClient(clientStub); - Map options = new HashMap<>(); - options.put("skip", "0"); - options.put("limit", "10"); - ResultList result = SUT.getFileList(options); - assertNotNull(result.getMessage()); - } - - @Test - public void internalServerError_getFileList_expectFailed() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Internal Server Error"); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - Map options = new HashMap<>(); - options.put("skip", "0"); - options.put("limit", "10"); - ResultList result = SUT.getFileList(options); - assertNotNull(result.getMessage()); - } - - @Test - public void getFileDetails_valid_request_expect_success() { - String resp = "{\n" + " \"fileId\" : \"598821f949c0a938d57563bd\"," + " \"type\": \"file\"," - + " \"name\": \"demo.jpg\",\n" + " \"filePath\": \"/demo.jpg\",\n" - + " \"tags\": [\"t-shirt\",\"round-neck\",\"sale2019\"],\n" + " \"isPrivateFile\" : false,\n" - + " \"customCoordinates\" : null,\n" - + " \"url\": \"https://ik.imagekit.io/your_imagekit_id/demo.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/your_imagekit_id/tr:n-media_library_thumbnail/demo.jpg\",\n" - + " \"fileType\": \"image\"\n" + "}"; - - OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); - SUT.setClient(clientStub); - Result result = SUT.getFileDetail("598821f949c0a938d57563bd"); - // Asserting endpoint sending to server - assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/details", SUT.request.url().toString()); - // Asserting mock response getting from server. - assertThat(resp, is(result.getRaw())); - } - - @Test - public void getFileDetails_internal_server_error() { - JsonObject obj = new JsonObject(); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - Result result = SUT.getFileDetail("fileId"); - assertNotNull(result.getMessage()); - } - - @Test - public void getFileDetails_un_processable_entity() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Un-processable Entity."); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); - SUT.setClient(clientStub); - Result result = SUT.getFileDetail("fileId"); - assertNotNull(result.getMessage()); - } - - @Test - public void getFileMetaData_valid_request_expect_success() { - String resp = "{" - + "\"height\":68, \"width\":100, \"size\":7749, \"format\":\"jpg\", \"hasColorProfile\":true, \"quality\":0, \"density\":72, \"hasTransparency\":false, \"pHash\":\"f06830ca9f1e3e90\", \"exif\":{" - + "\"image\":{" - + "\"Make\":\"Canon\", \"Model\":\"CanonEOS40D\", \"Orientation\":1, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"Software\":\"GIMP2.4.5\", \"ModifyDate\":\"2008:07:3110:38:11\", \"YCbCrPositioning\":2, \"ExifOffset\":214, \"GPSInfo\":978" - + "}, \"thumbnail\":{" - + "\"Compression\":6, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"ThumbnailOffset\":1090, \"ThumbnailLength\":1378" - + "}, \"exif\":{" - + "\"ExposureTime\":0.00625, \"FNumber\":7.1, \"ExposureProgram\":1, \"ISO\":100, \"ExifVersion\":\"0221\", \"DateTimeOriginal\":\"2008:05:3015:56:01\", \"CreateDate\":\"2008:05:3015:56:01\", \"ShutterSpeedValue\":7.375, \"ApertureValue\":5.625, \"ExposureCompensation\":0, \"MeteringMode\":5, \"Flash\":9, \"FocalLength\":135, \"SubSecTime\":\"00\", \"SubSecTimeOriginal\":\"00\", \"SubSecTimeDigitized\":\"00\", \"FlashpixVersion\":\"0100\", \"ColorSpace\":1, \"ExifImageWidth\":100, \"ExifImageHeight\":68, \"InteropOffset\":948, \"FocalPlaneXResolution\":4438.356164383562, \"FocalPlaneYResolution\":4445.969125214408, \"FocalPlaneResolutionUnit\":2, \"CustomRendered\":0, \"ExposureMode\":1, \"WhiteBalance\":0, \"SceneCaptureType\":0" - + "}, \"gps\":{" + "\"GPSVersionID\":[" + "2, 2, 0, 0" + "]" + "}, \"interoperability\":{" - + "\"InteropIndex\":\"R98\", \"InteropVersion\":\"0100\"" + "}, \"makernote\":{}" + "}" + "}"; - - OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getFileMetaData("598821f949c0a938d57563bd"); - assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd/metadata", - SUT.request.url().toString()); - assertThat(resp, is(result.getRaw())); - } - - @Test - public void getFileMetaData_internal_server_error() { - JsonObject obj = new JsonObject(); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getFileMetaData("fileId"); - assertNotNull(result.getMessage()); - } - - @Test - public void getFileMetaData_un_processable_entity() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Un-processable Entity."); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getFileMetaData("fileId"); - assertNotNull(result.getMessage()); - } - - @Test - public void getRemoteFileMetaData_valid_request_expect_success() { - String resp = "{" - + "\"height\":68, \"width\":100, \"size\":7749, \"format\":\"jpg\", \"hasColorProfile\":true, \"quality\":0, \"density\":72, \"hasTransparency\":false, \"pHash\":\"f06830ca9f1e3e90\", \"exif\":{" - + "\"image\":{" - + "\"Make\":\"Canon\", \"Model\":\"CanonEOS40D\", \"Orientation\":1, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"Software\":\"GIMP2.4.5\", \"ModifyDate\":\"2008:07:3110:38:11\", \"YCbCrPositioning\":2, \"ExifOffset\":214, \"GPSInfo\":978" - + "}, \"thumbnail\":{" - + "\"Compression\":6, \"XResolution\":72, \"YResolution\":72, \"ResolutionUnit\":2, \"ThumbnailOffset\":1090, \"ThumbnailLength\":1378" - + "}, \"exif\":{" - + "\"ExposureTime\":0.00625, \"FNumber\":7.1, \"ExposureProgram\":1, \"ISO\":100, \"ExifVersion\":\"0221\", \"DateTimeOriginal\":\"2008:05:3015:56:01\", \"CreateDate\":\"2008:05:3015:56:01\", \"ShutterSpeedValue\":7.375, \"ApertureValue\":5.625, \"ExposureCompensation\":0, \"MeteringMode\":5, \"Flash\":9, \"FocalLength\":135, \"SubSecTime\":\"00\", \"SubSecTimeOriginal\":\"00\", \"SubSecTimeDigitized\":\"00\", \"FlashpixVersion\":\"0100\", \"ColorSpace\":1, \"ExifImageWidth\":100, \"ExifImageHeight\":68, \"InteropOffset\":948, \"FocalPlaneXResolution\":4438.356164383562, \"FocalPlaneYResolution\":4445.969125214408, \"FocalPlaneResolutionUnit\":2, \"CustomRendered\":0, \"ExposureMode\":1, \"WhiteBalance\":0, \"SceneCaptureType\":0" - + "}, \"gps\":{" + "\"GPSVersionID\":[" + "2, 2, 0, 0" + "]" + "}, \"interoperability\":{" - + "\"InteropIndex\":\"R98\", \"InteropVersion\":\"0100\"" + "}, \"makernote\":{}" + "}" + "}"; - - OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getRemoteFileMetaData("http://remote_url.example.com/demo.png"); - - assertEquals("https://api.imagekit.io/v1/metadata?url=http://remote_url.example.com/demo.png", - SUT.request.url().toString()); - assertThat(resp, is(result.getRaw())); - } - - @Test - public void getRemoteFileMetaData_internal_server_error() { - JsonObject obj = new JsonObject(); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getRemoteFileMetaData("remote_url"); - assertNotNull(result.getMessage()); - } - - @Test - public void getRemoteFileMetaData_un_processable_entity() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Un-processable Entity."); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultMetaData result = SUT.getRemoteFileMetaData("remote_url"); - assertNotNull(result.getMessage()); - } - - @Test - public void deleteFile_valid_request_expect_success() { - JsonObject obj = new JsonObject(); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 204, "Ok"); - SUT.setClient(clientStub); - Result result = SUT.deleteFile("598821f949c0a938d57563bd"); - - assertEquals("https://api.imagekit.io/v1/files/598821f949c0a938d57563bd", SUT.request.url().toString()); - assertThat("File deleted successfully!", is(result.getMessage())); - } - - @Test - public void deleteFile_internal_server_error() { - JsonObject obj = new JsonObject(); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - Result result = SUT.deleteFile("fileId"); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void deleteFile_un_processable_entity() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Un-processable Entity."); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); - SUT.setClient(clientStub); - Result result = SUT.deleteFile("fileId"); - assertNotNull(result.getMessage()); - } - - @Test - public void bulkDeleteFiles_valid_request_expect_success() { - String resp = "{\n" + " \"successfullyDeletedFileIds\": [\n" + " \"5e1c13d0c55ec3437c451406\",\n" - + " \"561c13d0c533c3437x434409\",\n" + " \"561c13d0c533c3437x434411\",\n" + " ]\n" - + "}"; - List fileIds = new ArrayList<>(); - fileIds.add("5e1c13d0c55ec3437c451406"); - fileIds.add("561c13d0c533c3437x434409"); - fileIds.add("561c13d0c533c3437x434411"); - OkHttpClientStub clientStub = new OkHttpClientStub(resp, 200, "Ok"); - SUT.setClient(clientStub); - ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); - assertThat("File deleted successfully!", is(result.getMessage())); - assertThat(resp, is(result.getRaw())); - } - - @Test - public void bulkDeleteFiles_file_id_not_found() { - String resp = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"5e1c13d0c55ec3437c451406\",\n" - + " \"561c13d0c533c3437x434409\",\n" + " \"561c13d0c533c3437x434411\"\n" + " ]" + "}"; - List fileIds = new ArrayList<>(); - fileIds.add("5e1c13d0c55ec3437c451406"); - fileIds.add("561c13d0c533c3437x434409"); - fileIds.add("561c13d0c533c3437x434411"); - OkHttpClientStub clientStub = new OkHttpClientStub(resp, 404, "Not found"); - SUT.setClient(clientStub); - ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); - assertThat("The requested file(s) does not exist.", is(result.getMessage())); - assertThat(resp, is(result.getRaw())); - } - - @Test - public void bulkDeleteFiles_internal_server_error() { - JsonObject obj = new JsonObject(); - List fileIds = new ArrayList<>(); - fileIds.add("file_id_1"); - fileIds.add("file_id_2"); - fileIds.add("file_id_3"); - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Ok"); - SUT.setClient(clientStub); - ResultFileDelete result = SUT.bulkDeleteFiles(fileIds); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void purgeCache_valid_request_expect_success() { - JsonObject obj = new JsonObject(); - obj.addProperty("requestId", "my_request_id"); - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 200, "Ok"); - SUT.setClient(clientStub); - ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); - assertThat("my_request_id", is(result.getRequestId())); - } - - @Test - public void purgeCache_internal_server_error() { - JsonObject obj = new JsonObject(); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void purgeCache_un_processable_entity() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Un-processable Entity."); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultCache result = SUT.purgeCache("https://ik.imagekit.io/your_imagekit_id/default-image.jpg"); - assertNotNull(result.getMessage()); - } - - @Test - public void getPurgeCacheStatus_valid_request_expect_success() { - JsonObject obj = new JsonObject(); - obj.addProperty("status", "Complete"); - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 200, "Ok"); - SUT.setClient(clientStub); - ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); - - assertEquals("https://api.imagekit.io/v1/files/purge/requestId", SUT.request.url().toString()); - assertThat("Complete", is(result.getStatus())); - } - - @Test - public void getPurgeCacheStatus_internal_server_error() { - JsonObject obj = new JsonObject(); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 500, "Internal Server Error"); - SUT.setClient(clientStub); - ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); - assertThat("Error: Internal server error.", is(result.getMessage())); - } - - @Test - public void getPurgeCacheStatus_un_processable_entity() { - JsonObject obj = new JsonObject(); - obj.addProperty("message", "Un-processable Entity."); - - OkHttpClientStub clientStub = new OkHttpClientStub(obj.toString(), 433, "Un-processable Entity"); - SUT.setClient(clientStub); - ResultCacheStatus result = SUT.getPurgeCacheStatus("requestId"); - assertNotNull(result.getMessage()); - } - - /** - * Stub OkHttpClient for fake api call - */ - private static class OkHttpClientStub extends OkHttpClient { - private Response.Builder builder; - private boolean timeout; - - public OkHttpClientStub(String response, int code, String message) { - this.builder = new Response.Builder(); - builder.code(code).message(message).protocol(Protocol.HTTP_1_1) - .body(ResponseBody.create(MediaType.parse("application/json"), response)); - } - - @Override - public Call newCall(Request request) { - Call call = new Call() { - @Override - public Request request() { - return request; - } - - @Override - public Response execute() throws IOException { - String credential = request.headers().get("Authorization"); - if (credential == null) { - builder.body(ResponseBody.create(MediaType.parse("application/json"), - "{\"message\":\"Your request does not contain private API key.\",\"help\":\"For support kindly contact us at support@imagekit.io .\"}")); - } else if (!credential.contains("Basic")) { - builder.body(ResponseBody.create(MediaType.parse("application/json"), - "{\"message\":\"Your request does not contain private API key.\",\"help\":\"For support kindly contact us at support@imagekit.io .\"}")); - } - - builder.request(request); - if (timeout) { - throw new RuntimeException(new SocketTimeoutException()); - } - return builder.build(); - } - - @Override - public void enqueue(Callback callback) { - - } - - @Override - public void cancel() { - - } - - @Override - public boolean isExecuted() { - return false; - } - - @Override - public boolean isCanceled() { - return false; - } - - @Override - public Call clone() { - return null; - } - }; - return call; - } - - public void setTimeoutException() { - this.timeout = true; - } - } -} \ No newline at end of file diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 2250654..2665e16 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -7,8 +7,13 @@ import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.exceptions.BadRequestException; import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; import io.imagekit.sdk.exceptions.NotFoundException; import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; import io.imagekit.sdk.models.AITagsRequest; import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; @@ -169,7 +174,7 @@ private static void calculateDistance() { System.out.println("\n\n"); } - private static void getPurgeCacheStatus(String requestId) { + private static void getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Fetching cache status:" + Color.ANSI_RESET); System.out.println(">> Sending request..."); ResultCacheStatus result = ImageKit.getInstance().getPurgeCacheStatus(requestId); @@ -183,7 +188,7 @@ private static void getPurgeCacheStatus(String requestId) { System.out.println("\n\n"); } - private static ResultCache purgeCache(String filePath) { + private static ResultCache purgeCache(String filePath) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Purging cache:" + Color.ANSI_RESET); System.out.println(">> Sending request..."); ResultCache result = ImageKit.getInstance().purgeCache(filePath); @@ -198,7 +203,7 @@ private static ResultCache purgeCache(String filePath) { return result; } - private static void deleteFile(String fileId) { + private static void deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); System.out.println(">> Sending file id: " + fileId); Result result = ImageKit.getInstance().deleteFile(fileId); @@ -212,7 +217,7 @@ private static void deleteFile(String fileId) { System.out.println("\n\n"); } - private static void deleteFiles(List files) { + private static void deleteFiles(List files) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { List fileIds = files.stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList()); System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); System.out.println(">> Sending file id: " + fileIds); @@ -227,7 +232,7 @@ private static void deleteFiles(List files) { System.out.println("\n\n"); } - private static void updateDetails(String fileId) { + private static void updateDetails(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Updating file details:" + Color.ANSI_RESET); System.out.println(">> Updating file details..."); List tags = new ArrayList<>(); @@ -248,7 +253,7 @@ private static void updateDetails(String fileId) { System.out.println("\n\n"); } - private static void getFileMetaData(String fileId) { + private static void getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get file Metadata:" + Color.ANSI_RESET); System.out.println(">> Fetching Metadata..."); ResultMetaData result = ImageKit.getInstance().getFileMetadata(fileId); @@ -262,7 +267,7 @@ private static void getFileMetaData(String fileId) { System.out.println("\n\n"); } - private static void getRemoteFileMetaData(String url) { + private static void getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get Remote file Metadata:" + Color.ANSI_RESET); System.out.println(">> Fetching Metadata..."); ResultMetaData result = ImageKit.getInstance().getRemoteFileMetadata(url); @@ -276,7 +281,7 @@ private static void getRemoteFileMetaData(String url) { System.out.println("\n\n"); } - private static void getFileDetail(String fileId) { + private static void getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get file details:" + Color.ANSI_RESET); System.out.println(">> Fetching details..."); Result result = ImageKit.getInstance().getFileDetail(fileId); @@ -290,7 +295,7 @@ private static void getFileDetail(String fileId) { System.out.println("\n\n"); } - private static List getList(int skip, int limit) { + private static List getList(int skip, int limit) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get Uploaded file as List:" + Color.ANSI_RESET); System.out.println(">> Fetching list..."); Map options = new HashMap<>(); @@ -310,7 +315,7 @@ private static List getList(int skip, int limit) { return resultList.getResults(); } - private static void uploadFromURL() { + private static void uploadFromURL() throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { System.out.println(Color.ANSI_CYAN + ">> Uploading from URL:" + Color.ANSI_RESET); System.out.println(">> Start uploading..."); String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; @@ -345,7 +350,7 @@ private static void uploadFromURL() { System.out.println("\n\n"); } - private static void uploadFromBase64() { + private static void uploadFromBase64() throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { System.out.println(Color.ANSI_CYAN + ">> Uploading Base64 Image:" + Color.ANSI_RESET); System.out.println(">> Start uploading..."); URL url = App.class.getClassLoader().getResource("sample1.jpg"); @@ -363,7 +368,7 @@ private static void uploadFromBase64() { System.out.println("\n\n"); } - private static void uploadFromBytes() { + private static void uploadFromBytes() throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { System.out.println(Color.ANSI_CYAN + ">> Uploading Image from file:" + Color.ANSI_RESET); System.out.println(">> Start uploading..."); URL url = App.class.getClassLoader().getResource("sample1.jpg"); @@ -405,7 +410,7 @@ private static void uploadFromBytes() { } private static void addTags() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62a9b446663ef7b5c15951ba"); List tags = new ArrayList<>(); @@ -423,7 +428,7 @@ private static void addTags() } private static void removeTags() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); @@ -439,7 +444,7 @@ private static void removeTags() } private static void removeAITags() - throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException { + throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62a9b446663ef7b5c15951ba"); List aiTags = new ArrayList<>(); @@ -456,7 +461,7 @@ private static void removeAITags() System.out.println("\n\n"); } - private static void getCustomMetaDataFields() { + private static void getCustomMetaDataFields() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = ImageKit.getInstance() .getCustomMetaDataFields(false); System.out.println(">> Fetch CustomMetaDataFields done."); @@ -468,7 +473,7 @@ private static void getCustomMetaDataFields() { } private static void createCustomMetaDataFields() - throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException { + throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); customMetaDataFieldSchemaObject.setValueRequired(false); @@ -491,7 +496,7 @@ private static void createCustomMetaDataFields() } private static void deleteCustomMetaDataField(String id) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultNoContent resultNoContent = ImageKit.getInstance().deleteCustomMetaDataField(id); System.out.println(">> CustomMetaDataField deleted..."); System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); @@ -504,7 +509,7 @@ private static void deleteCustomMetaDataField(String id) } private static void updateCustomMetaDataFields() - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); schemaObject.setMinValue(1); schemaObject.setMaxValue(200); @@ -526,7 +531,7 @@ private static void updateCustomMetaDataFields() } private static void deleteFileVersion() - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException { + throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); deleteFileVersionRequest.setVersionId("62aac9b47db937233eee762f"); @@ -540,7 +545,7 @@ private static void deleteFileVersion() } private static void copyFile() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/new_car11.jpg"); copyFileRequest.setDestinationPath("/demo1/"); @@ -555,7 +560,7 @@ private static void copyFile() } private static void moveFile() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException { + throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_car11.jpg"); moveFileRequest.setDestinationPath("/demo1"); @@ -569,7 +574,7 @@ private static void moveFile() } private static void renameFile() - throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException { + throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/new12.jpg"); renameFileRequest.setNewFileName("new_car.jpg"); @@ -583,7 +588,7 @@ private static void renameFile() System.out.println("\n\n"); } - private static void createFolder() { + private static void createFolder() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("test1"); createFolderRequest.setParentFolderPath("/"); @@ -597,7 +602,7 @@ private static void createFolder() { } private static void deleteFolder() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String folderPath = "/test1"; DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath(folderPath); @@ -611,7 +616,7 @@ private static void deleteFolder() } private static void copyFolder() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/test1"); copyFolderRequest.setDestinationPath("/demo1"); @@ -625,7 +630,7 @@ private static void copyFolder() } private static void moveFolder() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/demo1/test1"); moveFolderRequest.setDestinationPath("/"); @@ -638,7 +643,7 @@ private static void moveFolder() System.out.println("\n\n"); } - private static void getBulkJobStatus() { + private static void getBulkJobStatus() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { String jobId = "62a9b9d5663ef7fd985c6fcb"; ResultBulkJobStatus resultBulkJobStatus = ImageKit.getInstance().getBulkJobStatus(jobId); System.out.println(">> Fetch Bulk job status done."); @@ -650,7 +655,7 @@ private static void getBulkJobStatus() { } private static void getFileVersions() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String fileId = "629f3de17eb0fe4053615450"; ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); System.out.println(">> Fetch Get file versions done."); @@ -662,7 +667,7 @@ private static void getFileVersions() } private static void getFileVersionDetails() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException { + throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String fileId = "62a9b446663ef7b5c15951ba"; String versionId = "62a9b446663ef7b5c15951ba"; ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, From a78f6ba5407e542847c0bc4f34c2978cf7218d24 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 20 Jun 2022 13:03:24 +0530 Subject: [PATCH 061/112] added test regarding changes and few comment regarding fixes --- .../imagekit/sdk/tasks/MultipartBuilder.java | 7 +- .../io/imagekit/sdk/tasks/RestClient.java | 19 +- .../java/io/imagekit/sdk/ImageKitTest.java | 360 ++++++++++++++---- src/main/java/io/imagekit/sampleapp/App.java | 7 +- 4 files changed, 292 insertions(+), 101 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index cb788b7..7627828 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -54,10 +54,10 @@ public MultipartBody build(FileCreateRequest fileCreateRequest) { builder.addFormDataPart("responseFields", Utils.listToString(fileCreateRequest.responseFields)); } if (fileCreateRequest.overwriteFile != null && !fileCreateRequest.overwriteFile) { - builder.addFormDataPart("overwriteFile", String.valueOf(true)); + builder.addFormDataPart("overwriteFile", "true"); } if (fileCreateRequest.overwriteAITags != null && !fileCreateRequest.overwriteAITags) { - builder.addFormDataPart("overwriteAITags", String.valueOf(Boolean.TRUE)); + builder.addFormDataPart("overwriteAITags", "true"); } if (fileCreateRequest.overwriteTags != null && !fileCreateRequest.overwriteTags) { builder.addFormDataPart("overwriteTags", "true"); @@ -72,8 +72,7 @@ public MultipartBody build(FileCreateRequest fileCreateRequest) { builder.addFormDataPart("webhookUrl", fileCreateRequest.webhookUrl); } if (null != fileCreateRequest.customMetadata) { - builder.addFormDataPart("customMetadata", - String.valueOf(new JsonParser().parse(String.valueOf(fileCreateRequest.customMetadata)))); + builder.addFormDataPart("customMetadata", fileCreateRequest.customMetadata.toString()); } return builder.build(); } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 01f7f67..5d05b49 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -94,7 +94,7 @@ public Result upload(FileCreateRequest fileCreateRequest) throws ConflictExcepti public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { Result result = null; Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), fileUpdateRequest.getFileId()); request = new Request.Builder().url(url).patch(multipartBuilder.build(fileUpdateRequest)) .headers(Headers.of(headers)).build(); @@ -127,14 +127,12 @@ public ResultList getFileList(Map options) throws ForbiddenExcep queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); } - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files?%s", queryMaker.get()); -// System.out.println(url); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files?%s"), queryMaker.get()); request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); try { Response response = client.newCall(request).execute(); - System.out.println("here res:==> " + response); String respBody = ""; if (response.code() == 200) { respBody = response.body().string(); @@ -157,7 +155,7 @@ public Result getFileDetail(String fileId) throws ForbiddenException, TooManyReq Result result = new Result(); Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/details", fileId); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), fileId); request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); @@ -210,7 +208,7 @@ public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenExceptio ResultMetaData result = new ResultMetaData(); Map headers = Utils.getHeaders(imageKit); - String apiURL = "https://api.imagekit.io/v1/metadata?url=" + url; + String apiURL = API_BASE_URL.concat("v1/metadata?url=") + url; request = new Request.Builder().url(apiURL).get().headers(Headers.of(headers)).build(); @@ -237,7 +235,7 @@ public Result deleteFile(String fileId) throws ForbiddenException, TooManyReques Result result = new Result(); Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s", fileId); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s"), fileId); request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); @@ -263,7 +261,7 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenEx ResultFileDelete result = new ResultFileDelete(); Map headers = Utils.getHeaders(imageKit); - String url = "https://api.imagekit.io/v1/files/batch/deleteByFileIds"; + String url = API_BASE_URL.concat("v1/files/batch/deleteByFileIds"); request = new Request.Builder().url(url) .post(multipartBuilder.build(String.format("{\"fileIds\":%s}", new Gson().toJson(fileIds)))) @@ -291,12 +289,13 @@ public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequ ResultCache result = new ResultCache(); Map headers = Utils.getHeaders(imageKit); - request = new Request.Builder().url("https://api.imagekit.io/v1/files/purge") + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/purge")) .post(multipartBuilder.build(String.format("{\"url\":\"%s\"}", url))).headers(Headers.of(headers)) .build(); try { Response response = client.newCall(request).execute(); + System.out.println("res:==> " + response.request().body()); String respBody = ""; if (response.code() == 200 || response.code() == 201) { respBody = response.body().string(); @@ -317,7 +316,7 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenE ResultCacheStatus result = new ResultCacheStatus(); Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/purge/%s", requestId); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/purge/%s"), requestId); request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 1f5bea1..a4bbd9b 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -12,7 +12,6 @@ import io.imagekit.sdk.exceptions.UnauthorizedException; import io.imagekit.sdk.exceptions.UnknownException; import io.imagekit.sdk.models.AITagsRequest; -import io.imagekit.sdk.models.BaseFile; import io.imagekit.sdk.models.CopyFileRequest; import io.imagekit.sdk.models.CopyFolderRequest; import io.imagekit.sdk.models.CreateFolderRequest; @@ -47,8 +46,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; -import static org.mockito.Matchers.*; -import static org.mockito.Mockito.*; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -608,7 +605,7 @@ public void imageKit_updateDetails_expected_404() throws IOException, Interrupte " \"message\": \"The requested file does not exist.\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); SUT.updateFileDetail(fileUpdateRequest); @@ -669,60 +666,160 @@ public void imageKit_updateDetails_returnTrue() throws IOException, InterruptedE SUT.updateFileDetail(fileUpdateRequest); RecordedRequest request = server.takeRequest(); - String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; + String requestJson = "{\"fileId\":\"62a9c3ccd875ec6fd658c854\",\"tags\":[\"Software\",\"Developer\",\"Engineer\"]}"; String utf8RequestBody = request.getBody().readUtf8(); - System.out.println("utf8RequestBody:--> " + utf8RequestBody); -// assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals(requestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); + assertEquals("PATCH /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), request.getRequestUrl().toString()); } - @Test(expected = NotFoundException.class) + @Test public void imageKit_getFileList_returnList() throws InterruptedException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException { MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + String responseJson = "[\n" + + " {\n" + + " \"type\": \"file\",\n" + + " \"name\": \"default-image.jpg\",\n" + + " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" + + " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" + + " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + + " \"tags\": null,\n" + + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + + " \"id\": \"62a4439bce686814dfcce65c\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" + + " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + + " },\n" + + " \"customCoordinates\": null,\n" + + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" + + " \"fileType\": \"image\",\n" + + " \"filePath\": \"/default-image.jpg\",\n" + + " \"height\": 1000,\n" + + " \"width\": 1000,\n" + + " \"size\": 147022,\n" + + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + + " }\n" + + "]"; + server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); Map options = new HashMap<>(); - options.put("skip", "" + 0); - options.put("limit", "" + 10); + options.put("limit", "" + 1); SUT.getFileList(options); + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files?limit=1 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files?limit=1"), request.getRequestUrl().toString()); + + } + + @Test(expected = NotFoundException.class) + public void imageKit_getFileDetail__expected_404() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileDetail("629f3de17eb0fe4053615450"); + server.takeRequest(); } -// @Test -// public void imageKit_getFileDetail_successExpected() { -// Result result = new Result(); -// result.setSuccessful(true); -// when(restClient.getFileDetail(any(String.class))).thenReturn(result); -// -// Result result1 = SUT.getFileDetail("fileId"); -// assertThat(result1.isSuccessful(), is(result.isSuccessful())); -// } - -// @Test -// public void imageKit_getFileMetaData_successExpected() { -// ResultMetaData result = new ResultMetaData(); -// result.setSuccessful(true); -// when(restClient.getFileMetaData(any(String.class))).thenReturn(result); -// -// ResultMetaData result1 = SUT.getFileMetadata("fileId"); -// assertThat(result1.isSuccessful(), is(result.isSuccessful())); -// } + @Test + public void imageKit_getFileDetail_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"type\": \"file\",\n" + + " \"name\": \"sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"createdAt\": \"2022-06-20T05:00:41.830Z\",\n" + + " \"updatedAt\": \"2022-06-20T05:00:43.263Z\",\n" + + " \"fileId\": \"62affef97db937b028f3b47a\",\n" + + " \"tags\": [\n" + + " \"Software\",\n" + + " \"Developer\",\n" + + " \"Engineer\"\n" + + " ],\n" + + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + + " \"id\": \"62affef97db937b028f3b47a\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"embeddedMetadata\": {},\n" + + " \"customCoordinates\": null,\n" + + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/demo/img/static-file-1.png\",\n" + + " \"fileType\": \"non-image\",\n" + + " \"filePath\": \"/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"size\": 169170\n" + + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileDetail("62affef97db937b028f3b47a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/62affef97db937b028f3b47a/details HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a/details"), request.getRequestUrl().toString()); + } @Test + public void imageKit_getFileMetaData_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"height\": 1000,\n" + + " \"width\": 1000,\n" + + " \"size\": 147022,\n" + + " \"format\": \"jpg\",\n" + + " \"hasColorProfile\": false,\n" + + " \"quality\": 0,\n" + + " \"density\": 72,\n" + + " \"hasTransparency\": false,\n" + + " \"exif\": {},\n" + + " \"pHash\": \"e0d52b612ad538f6\"\n" + + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getRemoteFileMetadata("https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg"), request.getRequestUrl().toString()); + + } + + @Test(expected = NotFoundException.class) public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); SUT.getRemoteFileMetadata("remote_url"); @@ -730,54 +827,149 @@ public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenExcept server.takeRequest(); } -// @Test -// public void imageKit_deleteFile_successExpected() { -// Result result = new Result(); -// result.setSuccessful(true); -// when(restClient.deleteFile(any(String.class))).thenReturn(result); -// -// Result result1 = SUT.deleteFile("fileId"); -// assertThat(result1.isSuccessful(), is(result.isSuccessful())); -// } - -// @Test -// public void imageKit_bulkDeleteFiles_successExpected() { -// List fileIds = new ArrayList<>(); -// fileIds.add("file_id_1"); -// fileIds.add("file_id_2"); -// fileIds.add("file_id_3"); -// -// ResultFileDelete result = new ResultFileDelete(); -// result.setSuccessfullyDeletedFileIds(fileIds); -// result.setSuccessful(true); -// when(restClient.bulkDeleteFiles(any())).thenReturn(result); -// ResultFileDelete result1 = SUT.bulkDeleteFiles(fileIds); -// assertThat(result1.isSuccessful(), is(result.isSuccessful())); -// } - -// @Test -// public void imageKit_purgeCache_successExpected() { -// ResultCache result = new ResultCache(); -// result.setSuccessful(true); -// result.setRequestId("requestId"); -// when(restClient.purgeCache(any(String.class))).thenReturn(result); -// -// ResultCache result1 = SUT.purgeCache("fileId"); -// assertThat(result1.isSuccessful(), is(result.isSuccessful())); -// assertThat(result1.getRequestId(), is(result.getRequestId())); -// } - -// @Test -// public void imageKit_getPurgeCacheStatus_successExpected() { -// ResultCacheStatus result = new ResultCacheStatus(); -// result.setSuccessful(true); -// result.setStatus("Complete"); -// when(restClient.getPurgeCacheStatus(any(String.class))).thenReturn(result); -// -// ResultCacheStatus result1 = SUT.getPurgeCacheStatus("requestId"); -// assertThat(result1.isSuccessful(), is(result.isSuccessful())); -// assertThat(result1.getStatus(), is(result.getStatus())); -// } + @Test(expected = NotFoundException.class) + public void imageKit_deleteFile_404_Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFile("629f3de17eb0fe4053615450"); + + server.takeRequest(); + } + + @Test + public void imageKit_deleteFile_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = ""; + server.enqueue(new MockResponse().setResponseCode(204).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFile("62affef97db937b028f3b47a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/files/62affef97db937b028f3b47a HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { + List fileIds = new ArrayList<>(); + fileIds.add("file_id_1"); + fileIds.add("file_id_2"); + fileIds.add("file_id_3"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + + " \"62ad9ece7db937e35ef18dda\"\n" + + " ]\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.bulkDeleteFiles(fileIds); + + server.takeRequest(); + } + + @Test + public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { + List fileIds = new ArrayList<>(); + fileIds.add("62ad9ece7db937e35ef18dda"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"successfullyDeletedFileIds\": [\n" + + " \"62ad9ece7db937e35ef18dda\"\n" + + " ]\n" + + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.bulkDeleteFiles(fileIds); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("{\"fileIds\":[\"62ad9ece7db937e35ef18dda\"]}", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/batch/deleteByFileIds HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/batch/deleteByFileIds"), request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void imageKit_purgeCache_404Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"Invalid url\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.purgeCache("url"); + + server.takeRequest(); + } + + @Test + public void imageKit_purgeCache_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.purgeCache("https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("{\"url\":\"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\"}", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/purge HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge"), request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void imageKit_getPurgeCacheStatus_400Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"No request found for this requestId.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0b"); + + server.takeRequest(); + } + + @Test + public void imageKit_getPurgeCacheStatus_successExpected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"status\": \"Completed\"\n" + + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/purge/62b01f15214dfbdf3692dd0a HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge/62b01f15214dfbdf3692dd0a"), request.getRequestUrl().toString()); + } @Test public void withoutToken_getAuthenticationParameters_successExpected() { diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index 2665e16..bc0bae8 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -48,6 +48,7 @@ public static void main(String[] args) throws Exception { Configuration config = Utils.getSystemConfig(App.class); imageKit.setConfig(config); +// getRemoteFileMetaData("https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); // generateUrl(); uploadFromURL(); // uploadFromBase64(); @@ -374,7 +375,7 @@ private static void uploadFromBytes() throws ConflictException, InternalServerEx URL url = App.class.getClassLoader().getResource("sample1.jpg"); File file = new File(url.getPath()); byte[] bytes = Utils.fileToBytes(file); - FileCreateRequest fileCreateRequest = new FileCreateRequest(bytes, "sample_image_th.jpg"); + FileCreateRequest fileCreateRequest = new FileCreateRequest(bytes, "sample_image_To.jpg"); fileCreateRequest.setUseUniqueFileName(false); JsonObject optionsInnerObject = new JsonObject(); optionsInnerObject.addProperty("add_shadow", true); @@ -389,14 +390,14 @@ private static void uploadFromBytes() throws ConflictException, InternalServerEx JsonArray jsonArray = new JsonArray(); jsonArray.add(innerObject1); jsonArray.add(innerObject2); - fileCreateRequest.setExtensions(jsonArray); +// fileCreateRequest.setExtensions(jsonArray); fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); fileCreateRequest.setOverwriteFile(true); fileCreateRequest.setOverwriteAITags(true); fileCreateRequest.setOverwriteTags(true); fileCreateRequest.setOverwriteCustomMetadata(true); JsonObject jsonObjectCustomMetadata = new JsonObject(); - jsonObjectCustomMetadata.addProperty("test1", 10); + jsonObjectCustomMetadata.addProperty("test10", 10); fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); Result result = ImageKit.getInstance().upload(fileCreateRequest); System.out.println(">> Uploading done."); From aa2f08b2d175624b5b8f0f9e797698b2ea4bb148 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 20 Jun 2022 14:16:18 +0530 Subject: [PATCH 062/112] added throw in catch of IOException for all APIs --- .../sdk/exceptions/UnknownException.java | 4 ++ .../io/imagekit/sdk/tasks/RestClient.java | 62 ++++++++----------- src/main/java/io/imagekit/sampleapp/App.java | 2 +- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java index 19fee86..ce9750e 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java @@ -8,6 +8,10 @@ public class UnknownException extends Exception { private String help; private ResponseMetaData responseMetaData; + public UnknownException(String message, Throwable cause) { + super(message, cause); + } + public UnknownException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { super(message, cause, enableSuppression, writableStackTrace); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 5d05b49..2ed7cea 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -56,14 +56,6 @@ public RestClient(ImageKit imageKit) { this.multipartBuilder = new MultipartBuilder(); } - public void setClient(OkHttpClient client) { - this.client = client; - } - - public void setMultipartBuilder(MultipartBuilder builder) { - this.multipartBuilder = builder; - } - public Result upload(FileCreateRequest fileCreateRequest) throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { Result result = null; Map headers = Utils.getHeaders(imageKit); @@ -86,7 +78,7 @@ public Result upload(FileCreateRequest fileCreateRequest) throws ConflictExcepti Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -112,7 +104,7 @@ public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws Forbidden Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -146,7 +138,7 @@ public ResultList getFileList(Map options) throws ForbiddenExcep Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultList; } @@ -172,7 +164,7 @@ public Result getFileDetail(String fileId) throws ForbiddenException, TooManyReq Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -199,7 +191,7 @@ public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -226,7 +218,7 @@ public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenExceptio Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -252,7 +244,7 @@ public Result deleteFile(String fileId) throws ForbiddenException, TooManyReques Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -280,7 +272,7 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenEx Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -307,7 +299,7 @@ public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequ Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -333,7 +325,7 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenE Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return result; } @@ -362,7 +354,7 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultTags; } @@ -390,7 +382,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultTags; } @@ -419,7 +411,7 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultCustomMetaDataFieldList; } @@ -454,7 +446,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields( Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultCustomMetaDataField; } @@ -480,7 +472,7 @@ public ResultNoContent deleteCustomMetaDataField(String id) Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultNoContent; } @@ -511,7 +503,7 @@ public ResultCustomMetaDataField updateCustomMetaDataFields( Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultCustomMetaDataField; } @@ -538,7 +530,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultNoContent; } @@ -565,7 +557,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultNoContent; } @@ -592,7 +584,7 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultNoContent; } @@ -620,7 +612,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultRenameFile; } @@ -646,7 +638,7 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) th Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultEmptyBlock; } @@ -673,7 +665,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultNoContent; } @@ -701,7 +693,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultOfFolderActions; } @@ -729,7 +721,7 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultOfFolderActions; } @@ -755,7 +747,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenExcept Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultBulkJobStatus; } @@ -784,7 +776,7 @@ public ResultFileVersions getFileVersions(String fileId) Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultFileVersions; } @@ -816,7 +808,7 @@ public ResultFileVersionDetails getFileVersionDetails(String fileId, String vers Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - e.printStackTrace(); + throw new UnknownException(e.getCause().getMessage(), e.getCause()); } return resultFileVersionDetails; } diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index bc0bae8..a10d1f0 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -390,7 +390,7 @@ private static void uploadFromBytes() throws ConflictException, InternalServerEx JsonArray jsonArray = new JsonArray(); jsonArray.add(innerObject1); jsonArray.add(innerObject2); -// fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setExtensions(jsonArray); fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); fileCreateRequest.setOverwriteFile(true); fileCreateRequest.setOverwriteAITags(true); From 399cae113b21d03882e81453f4902b6796196012 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 20 Jun 2022 18:40:06 +0530 Subject: [PATCH 063/112] added exception regarding changes --- .../main/java/io/imagekit/sdk/ImageKit.java | 56 +++-- .../io/imagekit/sdk/tasks/RestClient.java | 227 +++++++++++------- .../java/io/imagekit/sdk/utils/Utils.java | 43 ++-- 3 files changed, 199 insertions(+), 127 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 2528f80..b1e4d1a 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -87,7 +87,7 @@ public String getUrl(Map options) { * @param fileCreateRequest is a object which contains file and other parameters * @return object of Result class */ - public Result upload(FileCreateRequest fileCreateRequest) throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.upload(fileCreateRequest); } @@ -96,7 +96,7 @@ public Result upload(FileCreateRequest fileCreateRequest) throws ConflictExcepti * @param fileUpdateRequest is a object which contains parameters and fileId * @return object of Result class */ - public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.updateDetail(fileUpdateRequest); } @@ -106,7 +106,7 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws Forbi * "includeFolder", "name", "limit", "skip"] * @return ResultList class that contains list of BaseFile */ - public ResultList getFileList(Map options) throws NotFoundException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, BadRequestException, UnknownException { + public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getFileList(options); } @@ -115,7 +115,7 @@ public ResultList getFileList(Map options) throws NotFoundExcept * @param fileId is a unique file id * @return Result class */ - public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getFileDetail(fileId); } @@ -124,7 +124,7 @@ public Result getFileDetail(String fileId) throws ForbiddenException, TooManyReq * @param fileId is a unique file id * @return ResultMetaData class */ - public ResultMetaData getFileMetadata(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultMetaData getFileMetadata(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getFileMetaData(fileId); } @@ -133,7 +133,7 @@ public ResultMetaData getFileMetadata(String fileId) throws ForbiddenException, * @param url is a remote image url * @return ResultMetaData class */ - public ResultMetaData getRemoteFileMetadata(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultMetaData getRemoteFileMetadata(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getRemoteFileMetaData(url); } @@ -142,7 +142,7 @@ public ResultMetaData getRemoteFileMetadata(String url) throws ForbiddenExceptio * @param fileId is a unique file id * @return Result class */ - public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.deleteFile(fileId); } @@ -151,7 +151,7 @@ public Result deleteFile(String fileId) throws ForbiddenException, TooManyReques * @param fileIds is a list of unique file id * @return Result class */ - public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.bulkDeleteFiles(fileIds); } @@ -160,7 +160,7 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenEx * @param url is image url * @return ResultCache class */ - public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.purgeCache(url); } @@ -169,7 +169,7 @@ public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequ * @param requestId is cache request id * @return ResultCacheStatus class */ - public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getPurgeCacheStatus(requestId); } @@ -218,7 +218,7 @@ public int pHashDistance(String firstHex, String secondHex) { * @return ArrayList of String */ public ResultTags addTags(TagsRequest tagsRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.manageTags(tagsRequest, "addTags"); } @@ -229,7 +229,7 @@ public ResultTags addTags(TagsRequest tagsRequest) * @return ArrayList of String */ public ResultTags removeAITags(AITagsRequest aiTagsRequest) - throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.removeAITags(aiTagsRequest); } @@ -240,7 +240,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) * @return ArrayList of String */ public ResultTags removeTags(TagsRequest tagsRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.manageTags(tagsRequest, "removeTags"); } @@ -249,7 +249,7 @@ public ResultTags removeTags(TagsRequest tagsRequest) * @return a CustomMetaDataResultList that contains CustomMetaDataField's name, * label, schema */ - public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws UnknownException { return restClient.getCustomMetaDataFields(includeDeleted); } @@ -261,8 +261,7 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele * @return ResultCustomMetaData with ResultCustomMetaDataField */ public ResultCustomMetaDataField createCustomMetaDataFields( - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) - throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException, UnknownException { return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } @@ -271,8 +270,7 @@ public ResultCustomMetaDataField createCustomMetaDataFields( * @param id is a id of customMetaDataFields * @return Result class */ - public ResultNoContent deleteCustomMetaDataField(String id) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, UnknownException { return restClient.deleteCustomMetaDataField(id); } @@ -285,7 +283,7 @@ public ResultNoContent deleteCustomMetaDataField(String id) */ public ResultCustomMetaDataField updateCustomMetaDataFields( CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, NotFoundException, UnknownException { return restClient.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); } @@ -295,7 +293,7 @@ public ResultCustomMetaDataField updateCustomMetaDataFields( * @return Result class */ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.deleteFileVersion(deleteFileVersionRequest); } @@ -305,7 +303,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers * @return Result class */ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.copyFile(copyFileRequest); } @@ -315,7 +313,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) * @return Result class */ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.moveFile(moveFileRequest); } @@ -335,7 +333,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) * folder you want to delete * @return Result class */ - public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws UnknownException { return restClient.createFolder(createFolderRequest); } @@ -346,7 +344,7 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) th * @return Result class */ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.deleteFolder(deleteFolderRequest); } @@ -357,7 +355,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) * @return Result class */ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.copyFolder(copyFolderRequest); } @@ -367,7 +365,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) * @return Result class */ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.moveFolder(moveFolderRequest); } @@ -376,7 +374,7 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) * @param jobId * @return a Result class */ - public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getBulkJobStatus(jobId); } @@ -386,7 +384,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenExcept * @return a Result class */ public ResultFileVersions getFileVersions(String fileId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.getFileVersions(fileId); } @@ -396,7 +394,7 @@ public ResultFileVersions getFileVersions(String fileId) * @return a Result class */ public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.getFileVersionDetails(fileId, versionId); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 2ed7cea..fb441d2 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -56,7 +56,7 @@ public RestClient(ImageKit imageKit) { this.multipartBuilder = new MultipartBuilder(); } - public Result upload(FileCreateRequest fileCreateRequest) throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { Result result = null; Map headers = Utils.getHeaders(imageKit); @@ -73,17 +73,17 @@ public Result upload(FileCreateRequest fileCreateRequest) throws ConflictExcepti result = new Gson().fromJson(respBody, Result.class); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { Result result = null; Map headers = Utils.getHeaders(imageKit); String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), @@ -99,17 +99,17 @@ public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws Forbidden result = new Gson().fromJson(respBody, Result.class); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { ResultList resultList = new ResultList(); Map headers = Utils.getHeaders(imageKit); @@ -133,17 +133,17 @@ public ResultList getFileList(Map options) throws ForbiddenExcep resultList.setResults(files); resultList.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultList; } - public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { Result result = new Result(); Map headers = Utils.getHeaders(imageKit); @@ -159,17 +159,17 @@ public Result getFileDetail(String fileId) throws ForbiddenException, TooManyReq result = new Gson().fromJson(respBody, Result.class); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { ResultMetaData result = new ResultMetaData(); Map headers = Utils.getHeaders(imageKit); @@ -186,17 +186,17 @@ public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, result.setResults(metaData); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { ResultMetaData result = new ResultMetaData(); Map headers = Utils.getHeaders(imageKit); @@ -213,17 +213,17 @@ public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenExceptio result.setResults(metaData); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { Result result = new Result(); Map headers = Utils.getHeaders(imageKit); @@ -239,17 +239,17 @@ public Result deleteFile(String fileId) throws ForbiddenException, TooManyReques result.setFileId(fileId); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { ResultFileDelete result = new ResultFileDelete(); Map headers = Utils.getHeaders(imageKit); @@ -266,18 +266,20 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenEx respBody = response.body().string(); result = new Gson().fromJson(respBody, ResultFileDelete.class); result.setRaw(respBody); - } else { + } else if (response.code() == 207 || response.code() == 404) { Utils.throwException(response); + } else { + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { ResultCache result = new ResultCache(); Map headers = Utils.getHeaders(imageKit); @@ -294,17 +296,17 @@ public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequ result = new Gson().fromJson(respBody, ResultCache.class); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } - public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { ResultCacheStatus result = new ResultCacheStatus(); Map headers = Utils.getHeaders(imageKit); @@ -320,18 +322,18 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenE result = new Gson().fromJson(respBody, ResultCacheStatus.class); result.setRaw(respBody); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return result; } public ResultTags manageTags(TagsRequest tagsRequest, String action) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultTags resultTags = new ResultTags(); Map headers = Utils.getHeaders(imageKit); @@ -348,19 +350,21 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) if (response.code() == 200) { respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else { + } else if (response.code() == 207 || response.code() == 404) { Utils.throwException(response); + } else { + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultTags; } public ResultTags removeAITags(AITagsRequest aiTagsRequest) - throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultTags resultTags = new ResultTags(); Map headers = Utils.getHeaders(imageKit); @@ -375,19 +379,21 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) if (response.code() == 200) { respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else { + } else if (response.code() == 207 || response.code() == 404) { Utils.throwException(response); + } else { + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultTags; } - public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws UnknownException { ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); Map headers = Utils.getHeaders(imageKit); @@ -405,20 +411,18 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele new TypeToken>() { }.getType()); resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); - } else { - Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultCustomMetaDataFieldList; } public ResultCustomMetaDataField createCustomMetaDataFields( CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) - throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, UnknownException { if (customMetaDataFieldCreateRequest.getName() == null) { throw new RuntimeException("Error: Name not provided."); } @@ -441,18 +445,21 @@ public ResultCustomMetaDataField createCustomMetaDataFields( JsonElement responseBody = new JsonParser().parse(respBody); resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); } else { - Utils.throwException(response); + if (response.code() == 400) { + ResultException result = Utils.populateResult(response); + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultCustomMetaDataField; } - public ResultNoContent deleteCustomMetaDataField(String id) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, UnknownException { ResultNoContent resultNoContent = new ResultNoContent(); Map headers = Utils.getHeaders(imageKit); @@ -467,19 +474,23 @@ public ResultNoContent deleteCustomMetaDataField(String id) String respString = response.body().string(); respBody = respString == null ? "" : respString; } else { - Utils.throwException(response); + if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultNoContent; } public ResultCustomMetaDataField updateCustomMetaDataFields( CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, NotFoundException, UnknownException { ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); Map headers = Utils.getHeaders(imageKit); @@ -498,18 +509,27 @@ public ResultCustomMetaDataField updateCustomMetaDataFields( JsonElement responseBody = new JsonParser().parse(respBody); resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); } else { - Utils.throwException(response); + if (response.code() == 400 || response.code() == 404) { + ResultException result = Utils.populateResult(response); + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } + } } Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultCustomMetaDataField; } public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultNoContent resultNoContent = new ResultNoContent(); Map headers = Utils.getHeaders(imageKit); @@ -524,19 +544,28 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers if (response.code() == 204) { String respString = response.body().string(); respBody = respString == null ? "" : respString; + } else if (response.code() == 400 || response.code() == 404) { + ResultException result = Utils.populateResult(response); + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultNoContent; } public ResultNoContent copyFile(CopyFileRequest copyFileRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultNoContent resultNoContent = new ResultNoContent(); Map headers = Utils.getHeaders(imageKit); @@ -551,19 +580,23 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) if (response.code() == 204) { String respString = response.body().string(); respBody = respString == null ? "" : respString; + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultNoContent; } public ResultNoContent moveFile(MoveFileRequest moveFileRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultNoContent resultNoContent = new ResultNoContent(); Map headers = Utils.getHeaders(imageKit); @@ -578,13 +611,17 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) if (response.code() == 204) { String respString = response.body().string(); respBody = respString == null ? "" : respString; + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultNoContent; } @@ -606,18 +643,24 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) String respString = response.body().string(); respBody = respString == null || respString.equals("") ? "{}" : respString; resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); - } else { + } else if (response.code() == 207 || response.code() == 404) { Utils.throwException(response); + } else if (response.code() == 409) { + ResultException result = Utils.populateResult(response); + throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); + } else { + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultRenameFile; } - public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws UnknownException { ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); Map headers = Utils.getHeaders(imageKit); @@ -632,19 +675,17 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) th if (response.code() == 201) { String respString = response.body().string(); respBody = respString == null || respString.equals("") ? "{}" : respString; - } else { - Utils.throwException(response); } Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultEmptyBlock; } public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultNoContent resultNoContent = new ResultNoContent(); Map headers = Utils.getHeaders(imageKit); @@ -659,19 +700,23 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) if (response.code() == 204) { String respString = response.body().string(); respBody = respString == null ? "" : respString; + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultNoContent; } public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); Map headers = Utils.getHeaders(imageKit); @@ -687,19 +732,23 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) if (response.code() == 200) { respBody = response.body().string(); resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultOfFolderActions; } public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); Map headers = Utils.getHeaders(imageKit); @@ -715,18 +764,22 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) if (response.code() == 200) { respBody = response.body().string(); resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultOfFolderActions; } - public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); Map headers = Utils.getHeaders(imageKit); @@ -742,18 +795,18 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenExcept respBody = response.body().string(); resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultBulkJobStatus; } public ResultFileVersions getFileVersions(String fileId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultFileVersions resultFileVersions = new ResultFileVersions(); Map headers = Utils.getHeaders(imageKit); @@ -770,19 +823,23 @@ public ResultFileVersions getFileVersions(String fileId) new TypeToken>() { }.getType()); resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultFileVersions; } public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { if (fileId == null) { throw new RuntimeException("Error: FileId not provided."); } @@ -802,13 +859,17 @@ public ResultFileVersionDetails getFileVersionDetails(String fileId, String vers if (response.code() == 200) { respBody = response.body().string(); resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { - Utils.throwException(response); + Utils.ManageApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), response.headers().toMultimap()); } catch (IOException e) { - throw new UnknownException(e.getCause().getMessage(), e.getCause()); + throw new UnknownException(e.getMessage(), e.getCause()); } return resultFileVersionDetails; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 0294176..3b48dad 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -1,6 +1,8 @@ package io.imagekit.sdk.utils; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.config.Configuration; @@ -20,6 +22,7 @@ import okhttp3.Response; import java.io.*; +import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.List; @@ -133,15 +136,10 @@ public static Map getHeaders(ImageKit imageKit) { return headers; } - public static void throwException(Response response) - throws IOException, PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, UnauthorizedException, ForbiddenException, TooManyRequestsException { - String resp = response.body().string(); - ResultException result = new Gson().fromJson(resp, ResultException.class); - populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); - if (response.code() == 207) { - throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else if (response.code() == 400) { + public static void ManageApiThrowException(Response response) + throws IOException, BadRequestException, InternalServerException, UnknownException, UnauthorizedException, ForbiddenException, TooManyRequestsException { + ResultException result = populateResult(response); + if (response.code() == 400) { throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else if (response.code() == 401) { @@ -150,12 +148,6 @@ public static void throwException(Response response) } else if (response.code() == 403) { throw new ForbiddenException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); - } else if (response.code() == 404) { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), - result.getResponseMetaData()); - } else if (response.code() == 409) { - throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), - result.getResponseMetaData()); } else if (response.code() == 429) { throw new TooManyRequestsException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); @@ -168,4 +160,25 @@ public static void throwException(Response response) } } + public static void throwException(Response response) throws IOException, PartialSuccessException, NotFoundException, UnknownException { + ResultException result = populateResult(response); + if (response.code() == 207) { + throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else if (response.code() == 404) { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); + } else { + throw new UnknownException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + result.getResponseMetaData()); + } + } + + public static ResultException populateResult(Response response) throws IOException { + String resp = response.body().string(); + ResultException result = new Gson().fromJson(resp, ResultException.class); + populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); + return result; + } + } From a8de7b10a68cc405027b2727378ac4adecdc9d37 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 21 Jun 2022 12:33:27 +0530 Subject: [PATCH 064/112] added changes regarding exceptions --- .../io/imagekit/sdk/tasks/RestClient.java | 8 +- .../java/io/imagekit/sdk/utils/Utils.java | 2 +- .../java/io/imagekit/sdk/ImageKitTest.java | 108 +++++++++--------- src/main/java/io/imagekit/sampleapp/App.java | 58 +++++----- 4 files changed, 88 insertions(+), 88 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index fb441d2..afc6da6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -267,7 +267,7 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenEx result = new Gson().fromJson(respBody, ResultFileDelete.class); result.setRaw(respBody); } else if (response.code() == 207 || response.code() == 404) { - Utils.throwException(response); + Utils.throwOtherException(response); } else { Utils.ManageApiThrowException(response); } @@ -351,7 +351,7 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); } else if (response.code() == 207 || response.code() == 404) { - Utils.throwException(response); + Utils.throwOtherException(response); } else { Utils.ManageApiThrowException(response); } @@ -380,7 +380,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) respBody = response.body().string(); resultTags = new Gson().fromJson(respBody, ResultTags.class); } else if (response.code() == 207 || response.code() == 404) { - Utils.throwException(response); + Utils.throwOtherException(response); } else { Utils.ManageApiThrowException(response); } @@ -644,7 +644,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) respBody = respString == null || respString.equals("") ? "{}" : respString; resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); } else if (response.code() == 207 || response.code() == 404) { - Utils.throwException(response); + Utils.throwOtherException(response); } else if (response.code() == 409) { ResultException result = Utils.populateResult(response); throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 3b48dad..591bb52 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -160,7 +160,7 @@ public static void ManageApiThrowException(Response response) } } - public static void throwException(Response response) throws IOException, PartialSuccessException, NotFoundException, UnknownException { + public static void throwOtherException(Response response) throws IOException, PartialSuccessException, NotFoundException, UnknownException { ResultException result = populateResult(response); if (response.code() == 207) { throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index a4bbd9b..ff9c5d8 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -487,7 +487,7 @@ public void imageKit_upload_expect_UnknownHostException() throws UnknownHostExce } @Test - public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; URL url = null; try { @@ -596,8 +596,8 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep } @Test(expected = NotFoundException.class) - public void imageKit_updateDetails_expected_404() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void imageKit_updateDetails_expected_404() throws IOException, InterruptedException, + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); MockWebServer server = new MockWebServer(); @@ -613,8 +613,8 @@ public void imageKit_updateDetails_expected_404() throws IOException, Interrupte } @Test - public void imageKit_updateDetails_returnTrue() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void imageKit_updateDetails_returnTrue() throws IOException, InterruptedException, + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); @@ -675,7 +675,7 @@ public void imageKit_updateDetails_returnTrue() throws IOException, InterruptedE } @Test - public void imageKit_getFileList_returnList() throws InterruptedException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException { + public void imageKit_getFileList_returnList() throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "[\n" + @@ -726,8 +726,8 @@ public void imageKit_getFileList_returnList() throws InterruptedException, Forbi } @Test(expected = NotFoundException.class) - public void imageKit_getFileDetail__expected_404() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void imageKit_getFileDetail__expected_404() throws IOException, InterruptedException, + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + @@ -743,7 +743,7 @@ public void imageKit_getFileDetail__expected_404() throws IOException, Interrupt } @Test - public void imageKit_getFileDetail_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_getFileDetail_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"type\": \"file\",\n" + @@ -785,7 +785,7 @@ public void imageKit_getFileDetail_successExpected() throws IOException, Forbidd } @Test - public void imageKit_getFileMetaData_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_getFileMetaData_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"height\": 1000,\n" + @@ -814,7 +814,7 @@ public void imageKit_getFileMetaData_successExpected() throws IOException, Forbi } @Test(expected = NotFoundException.class) - public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" @@ -828,7 +828,7 @@ public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenExcept } @Test(expected = NotFoundException.class) - public void imageKit_deleteFile_404_Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_deleteFile_404_Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + @@ -843,7 +843,7 @@ public void imageKit_deleteFile_404_Expected() throws ForbiddenException, TooMan } @Test - public void imageKit_deleteFile_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_deleteFile_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); String responseJson = ""; server.enqueue(new MockResponse().setResponseCode(204).setBody(responseJson)); @@ -860,7 +860,7 @@ public void imageKit_deleteFile_successExpected() throws IOException, ForbiddenE } @Test(expected = NotFoundException.class) - public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { + public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { List fileIds = new ArrayList<>(); fileIds.add("file_id_1"); fileIds.add("file_id_2"); @@ -882,7 +882,7 @@ public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, To } @Test - public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { + public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { List fileIds = new ArrayList<>(); fileIds.add("62ad9ece7db937e35ef18dda"); MockWebServer server = new MockWebServer(); @@ -905,7 +905,7 @@ public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException } @Test(expected = BadRequestException.class) - public void imageKit_purgeCache_404Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_purgeCache_404Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"Invalid url\"\n" + @@ -919,7 +919,7 @@ public void imageKit_purgeCache_404Expected() throws ForbiddenException, TooMany } @Test - public void imageKit_purgeCache_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_purgeCache_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + @@ -938,7 +938,7 @@ public void imageKit_purgeCache_successExpected() throws IOException, ForbiddenE } @Test(expected = BadRequestException.class) - public void imageKit_getPurgeCacheStatus_400Expected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_getPurgeCacheStatus_400Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"No request found for this requestId.\",\n" + @@ -953,7 +953,7 @@ public void imageKit_getPurgeCacheStatus_400Expected() throws ForbiddenException } @Test - public void imageKit_getPurgeCacheStatus_successExpected() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_getPurgeCacheStatus_successExpected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"status\": \"Completed\"\n" + @@ -1032,7 +1032,7 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { @Test(expected = NotFoundException.class) public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1056,7 +1056,7 @@ public void add_tags_expected_404() throws IOException, InterruptedException, No @Test public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1083,7 +1083,7 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept @Test(expected = NotFoundException.class) public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1104,7 +1104,7 @@ public void remove_tags_expected_404_bad_request() throws InterruptedException, @Test public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1129,7 +1129,7 @@ public void remove_tags_expectedSuccessWith() throws IOException, InterruptedExc } @Test - public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" @@ -1152,7 +1152,7 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, @Test(expected = BadRequestException.class) public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException, - PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + UnknownException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" @@ -1187,7 +1187,7 @@ public void createCustomMetaDataFields_expected_400() throws InterruptedExceptio @Test public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, - BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" @@ -1220,7 +1220,7 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep @Test(expected = NotFoundException.class) public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" @@ -1234,7 +1234,7 @@ public void deleteCustomMetaDataField_404_Expected() throws IOException, Interru @Test public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); @@ -1253,7 +1253,7 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte @Test(expected = NotFoundException.class) public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1276,7 +1276,7 @@ public void updateCustomMetaDataFields_404_Expected() throws InterruptedExceptio @Test(expected = BadRequestException.class) public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400) @@ -1301,7 +1301,7 @@ public void updateCustomMetaDataFields_400_Expected() throws InterruptedExceptio @Test public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, - BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse() @@ -1335,7 +1335,7 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep @Test(expected = NotFoundException.class) public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1359,7 +1359,7 @@ public void removeAITags_404_Expected() throws InterruptedException, IOException @Test public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1387,7 +1387,7 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept @Test(expected = NotFoundException.class) public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/sample_image.jpg"); @@ -1407,7 +1407,7 @@ public void copyFile_404_Expected() throws InterruptedException, IOException, No @Test public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/car_false.jpeg"); @@ -1431,7 +1431,7 @@ public void copyFile_successExpected() throws InterruptedException, IOException, @Test(expected = NotFoundException.class) public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); @@ -1450,7 +1450,7 @@ public void moveFile_404_Expected() throws InterruptedException, IOException, No @Test public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException, - PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_la.jpg"); @@ -1538,7 +1538,7 @@ public void renameFile_successExpected() throws InterruptedException, IOExceptio } @Test - public void createFolder_400_Expected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public void createFolder_400_Expected() throws InterruptedException, IOException, UnknownException { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("/testFolder"); @@ -1556,7 +1556,7 @@ public void createFolder_400_Expected() throws InterruptedException, IOException } @Test - public void createFolder_successExpected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public void createFolder_successExpected() throws InterruptedException, IOException, UnknownException { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("testFolder"); @@ -1579,7 +1579,7 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept @Test(expected = NotFoundException.class) public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("/testFolder"); @@ -1597,7 +1597,7 @@ public void deleteFolder_404_Expected() throws InterruptedException, IOException @Test public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("testFolder"); @@ -1619,7 +1619,7 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept @Test(expected = NotFoundException.class) public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1639,7 +1639,7 @@ public void copyFolder_404_Expected() throws InterruptedException, IOException, @Test public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1663,7 +1663,7 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio @Test(expected = NotFoundException.class) public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder/"); @@ -1682,7 +1682,7 @@ public void moveFolder_404_Expected() throws InterruptedException, IOException, @Test public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder"); @@ -1704,7 +1704,7 @@ public void moveFolder_successExpected() throws InterruptedException, IOExceptio } @Test - public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(500)); @@ -1723,7 +1723,7 @@ public void getBulkJobStatus_500_Expected() throws InterruptedException, IOExcep } @Test - public void getBulkJobStatus_successExpected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public void getBulkJobStatus_successExpected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" @@ -1741,7 +1741,7 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx @Test(expected = NotFoundException.class) public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1755,7 +1755,7 @@ public void getFileVersions_404_Expected() throws InterruptedException, IOExcept @Test public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" @@ -1796,7 +1796,7 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc @Test(expected = NotFoundException.class) public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1810,7 +1810,7 @@ public void getFileVersionDetails_404_Expected() throws InterruptedException, IO @Test public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException, - ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" @@ -1852,7 +1852,7 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, @Test(expected = BadRequestException.class) public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1870,7 +1870,7 @@ public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedE @Test(expected = NotFoundException.class) public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1888,7 +1888,7 @@ public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedE @Test public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java index a10d1f0..c1c551a 100644 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ b/src/main/java/io/imagekit/sampleapp/App.java @@ -175,7 +175,7 @@ private static void calculateDistance() { System.out.println("\n\n"); } - private static void getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Fetching cache status:" + Color.ANSI_RESET); System.out.println(">> Sending request..."); ResultCacheStatus result = ImageKit.getInstance().getPurgeCacheStatus(requestId); @@ -189,7 +189,7 @@ private static void getPurgeCacheStatus(String requestId) throws ForbiddenExcept System.out.println("\n\n"); } - private static ResultCache purgeCache(String filePath) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static ResultCache purgeCache(String filePath) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Purging cache:" + Color.ANSI_RESET); System.out.println(">> Sending request..."); ResultCache result = ImageKit.getInstance().purgeCache(filePath); @@ -204,7 +204,7 @@ private static ResultCache purgeCache(String filePath) throws ForbiddenException return result; } - private static void deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); System.out.println(">> Sending file id: " + fileId); Result result = ImageKit.getInstance().deleteFile(fileId); @@ -218,7 +218,7 @@ private static void deleteFile(String fileId) throws ForbiddenException, TooMany System.out.println("\n\n"); } - private static void deleteFiles(List files) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void deleteFiles(List files) throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { List fileIds = files.stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList()); System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); System.out.println(">> Sending file id: " + fileIds); @@ -233,7 +233,7 @@ private static void deleteFiles(List files) throws ForbiddenException, System.out.println("\n\n"); } - private static void updateDetails(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void updateDetails(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Updating file details:" + Color.ANSI_RESET); System.out.println(">> Updating file details..."); List tags = new ArrayList<>(); @@ -254,7 +254,7 @@ private static void updateDetails(String fileId) throws ForbiddenException, TooM System.out.println("\n\n"); } - private static void getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get file Metadata:" + Color.ANSI_RESET); System.out.println(">> Fetching Metadata..."); ResultMetaData result = ImageKit.getInstance().getFileMetadata(fileId); @@ -268,7 +268,7 @@ private static void getFileMetaData(String fileId) throws ForbiddenException, To System.out.println("\n\n"); } - private static void getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get Remote file Metadata:" + Color.ANSI_RESET); System.out.println(">> Fetching Metadata..."); ResultMetaData result = ImageKit.getInstance().getRemoteFileMetadata(url); @@ -282,7 +282,7 @@ private static void getRemoteFileMetaData(String url) throws ForbiddenException, System.out.println("\n\n"); } - private static void getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get file details:" + Color.ANSI_RESET); System.out.println(">> Fetching details..."); Result result = ImageKit.getInstance().getFileDetail(fileId); @@ -296,7 +296,7 @@ private static void getFileDetail(String fileId) throws ForbiddenException, TooM System.out.println("\n\n"); } - private static List getList(int skip, int limit) throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static List getList(int skip, int limit) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { System.out.println(Color.ANSI_CYAN + ">> Get Uploaded file as List:" + Color.ANSI_RESET); System.out.println(">> Fetching list..."); Map options = new HashMap<>(); @@ -316,7 +316,7 @@ private static List getList(int skip, int limit) throws ForbiddenExcep return resultList.getResults(); } - private static void uploadFromURL() throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + private static void uploadFromURL() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { System.out.println(Color.ANSI_CYAN + ">> Uploading from URL:" + Color.ANSI_RESET); System.out.println(">> Start uploading..."); String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; @@ -351,7 +351,7 @@ private static void uploadFromURL() throws ConflictException, InternalServerExce System.out.println("\n\n"); } - private static void uploadFromBase64() throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + private static void uploadFromBase64() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { System.out.println(Color.ANSI_CYAN + ">> Uploading Base64 Image:" + Color.ANSI_RESET); System.out.println(">> Start uploading..."); URL url = App.class.getClassLoader().getResource("sample1.jpg"); @@ -369,7 +369,7 @@ private static void uploadFromBase64() throws ConflictException, InternalServerE System.out.println("\n\n"); } - private static void uploadFromBytes() throws ConflictException, InternalServerException, PartialSuccessException, NotFoundException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + private static void uploadFromBytes() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { System.out.println(Color.ANSI_CYAN + ">> Uploading Image from file:" + Color.ANSI_RESET); System.out.println(">> Start uploading..."); URL url = App.class.getClassLoader().getResource("sample1.jpg"); @@ -411,7 +411,7 @@ private static void uploadFromBytes() throws ConflictException, InternalServerEx } private static void addTags() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62a9b446663ef7b5c15951ba"); List tags = new ArrayList<>(); @@ -429,7 +429,7 @@ private static void addTags() } private static void removeTags() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); List tags = new ArrayList<>(); @@ -445,7 +445,7 @@ private static void removeTags() } private static void removeAITags() - throws PartialSuccessException, NotFoundException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62a9b446663ef7b5c15951ba"); List aiTags = new ArrayList<>(); @@ -462,7 +462,7 @@ private static void removeAITags() System.out.println("\n\n"); } - private static void getCustomMetaDataFields() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void getCustomMetaDataFields() throws UnknownException { ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = ImageKit.getInstance() .getCustomMetaDataFields(false); System.out.println(">> Fetch CustomMetaDataFields done."); @@ -474,7 +474,7 @@ private static void getCustomMetaDataFields() throws ForbiddenException, TooMany } private static void createCustomMetaDataFields() - throws BadRequestException, PartialSuccessException, NotFoundException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, UnknownException { CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); customMetaDataFieldSchemaObject.setValueRequired(false); @@ -497,7 +497,7 @@ private static void createCustomMetaDataFields() } private static void deleteCustomMetaDataField(String id) - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, UnknownException { ResultNoContent resultNoContent = ImageKit.getInstance().deleteCustomMetaDataField(id); System.out.println(">> CustomMetaDataField deleted..."); System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); @@ -510,7 +510,7 @@ private static void deleteCustomMetaDataField(String id) } private static void updateCustomMetaDataFields() - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, NotFoundException, UnknownException { CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); schemaObject.setMinValue(1); schemaObject.setMaxValue(200); @@ -532,7 +532,7 @@ private static void updateCustomMetaDataFields() } private static void deleteFileVersion() - throws BadRequestException, NotFoundException, PartialSuccessException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); deleteFileVersionRequest.setVersionId("62aac9b47db937233eee762f"); @@ -546,7 +546,7 @@ private static void deleteFileVersion() } private static void copyFile() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/new_car11.jpg"); copyFileRequest.setDestinationPath("/demo1/"); @@ -561,7 +561,7 @@ private static void copyFile() } private static void moveFile() - throws NotFoundException, PartialSuccessException, BadRequestException, ConflictException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_car11.jpg"); moveFileRequest.setDestinationPath("/demo1"); @@ -589,7 +589,7 @@ private static void renameFile() System.out.println("\n\n"); } - private static void createFolder() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void createFolder() throws UnknownException { CreateFolderRequest createFolderRequest = new CreateFolderRequest(); createFolderRequest.setFolderName("test1"); createFolderRequest.setParentFolderPath("/"); @@ -603,7 +603,7 @@ private static void createFolder() throws ForbiddenException, TooManyRequestsExc } private static void deleteFolder() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String folderPath = "/test1"; DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath(folderPath); @@ -617,7 +617,7 @@ private static void deleteFolder() } private static void copyFolder() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/test1"); copyFolderRequest.setDestinationPath("/demo1"); @@ -631,7 +631,7 @@ private static void copyFolder() } private static void moveFolder() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/demo1/test1"); moveFolderRequest.setDestinationPath("/"); @@ -644,7 +644,7 @@ private static void moveFolder() System.out.println("\n\n"); } - private static void getBulkJobStatus() throws ForbiddenException, TooManyRequestsException, ConflictException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + private static void getBulkJobStatus() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { String jobId = "62a9b9d5663ef7fd985c6fcb"; ResultBulkJobStatus resultBulkJobStatus = ImageKit.getInstance().getBulkJobStatus(jobId); System.out.println(">> Fetch Bulk job status done."); @@ -656,7 +656,7 @@ private static void getBulkJobStatus() throws ForbiddenException, TooManyRequest } private static void getFileVersions() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String fileId = "629f3de17eb0fe4053615450"; ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); System.out.println(">> Fetch Get file versions done."); @@ -668,7 +668,7 @@ private static void getFileVersions() } private static void getFileVersionDetails() - throws NotFoundException, ConflictException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String fileId = "62a9b446663ef7b5c15951ba"; String versionId = "62a9b446663ef7b5c15951ba"; ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, From cf39f2ea58ff71e754205676681b396b8f3c7bb9 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 21 Jun 2022 12:50:27 +0530 Subject: [PATCH 065/112] changed method name --- .../io/imagekit/sdk/tasks/RestClient.java | 44 +++++++++---------- .../java/io/imagekit/sdk/utils/Utils.java | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index afc6da6..2706ac6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -73,7 +73,7 @@ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerE result = new Gson().fromJson(respBody, Result.class); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -99,7 +99,7 @@ public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws Forbidden result = new Gson().fromJson(respBody, Result.class); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -133,7 +133,7 @@ public ResultList getFileList(Map options) throws ForbiddenExcep resultList.setResults(files); resultList.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -159,7 +159,7 @@ public Result getFileDetail(String fileId) throws ForbiddenException, TooManyReq result = new Gson().fromJson(respBody, Result.class); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -186,7 +186,7 @@ public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, result.setResults(metaData); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -213,7 +213,7 @@ public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenExceptio result.setResults(metaData); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -239,7 +239,7 @@ public Result deleteFile(String fileId) throws ForbiddenException, TooManyReques result.setFileId(fileId); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -269,7 +269,7 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenEx } else if (response.code() == 207 || response.code() == 404) { Utils.throwOtherException(response); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -296,7 +296,7 @@ public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequ result = new Gson().fromJson(respBody, ResultCache.class); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -322,7 +322,7 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenE result = new Gson().fromJson(respBody, ResultCacheStatus.class); result.setRaw(respBody); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -353,7 +353,7 @@ public ResultTags manageTags(TagsRequest tagsRequest, String action) } else if (response.code() == 207 || response.code() == 404) { Utils.throwOtherException(response); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -382,7 +382,7 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) } else if (response.code() == 207 || response.code() == 404) { Utils.throwOtherException(response); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -554,7 +554,7 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers result.getHelp(), result.getResponseMetaData()); } } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -585,7 +585,7 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -616,7 +616,7 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -650,7 +650,7 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -705,7 +705,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -737,7 +737,7 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -769,7 +769,7 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -795,7 +795,7 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenExcept respBody = response.body().string(); resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -828,7 +828,7 @@ public ResultFileVersions getFileVersions(String fileId) throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), response.headers().toMultimap()); @@ -864,7 +864,7 @@ public ResultFileVersionDetails getFileVersionDetails(String fileId, String vers throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else { - Utils.ManageApiThrowException(response); + Utils.generalApiThrowException(response); } Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), response.headers().toMultimap()); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 591bb52..89ed2ee 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -136,7 +136,7 @@ public static Map getHeaders(ImageKit imageKit) { return headers; } - public static void ManageApiThrowException(Response response) + public static void generalApiThrowException(Response response) throws IOException, BadRequestException, InternalServerException, UnknownException, UnauthorizedException, ForbiddenException, TooManyRequestsException { ResultException result = populateResult(response); if (response.code() == 400) { From a2d36c5e3f29d7ead01330ac6dfedbed5bec06b6 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 21 Jun 2022 15:50:14 +0530 Subject: [PATCH 066/112] test updated and removed try/catch block --- .../java/io/imagekit/sdk/ImageKitTest.java | 31 ++++--------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index ff9c5d8..3dd167e 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URL; import java.net.UnknownHostException; import java.util.*; @@ -470,37 +471,17 @@ public void getUrl_with_time_expire() { // Test Case for Upload @Test(expected = UnknownHostException.class) - public void imageKit_upload_expect_UnknownHostException() throws UnknownHostException { + public void imageKit_upload_expect_UnknownHostException() throws IOException { String imageUrl = "https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; - try { - URL url = new URL(imageUrl); - - HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); - urlConnect.getContent(); - - } catch (UnknownHostException e) { - e.printStackTrace(); - throw e; - } catch (IOException e) { - e.printStackTrace(); - } + URL url = new URL(imageUrl); + HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); + urlConnect.getContent(); } @Test public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url = null; - try { - // make a URL to a known source - url = new URL(imageUrl); - - HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); - Object objData = urlConnect.getContent(); - - } catch (UnknownHostException e) { - System.out.println("CONNECTION FAILED:==> " + e); - e.printStackTrace(); - } + URL url = new URL(imageUrl); FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); List tags = new ArrayList<>(); tags.add("Software"); From 24fcca761b8d78a6104ab8f29b6d386acda0aeaf Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 21 Jun 2022 18:40:20 +0530 Subject: [PATCH 067/112] added versionning changes for readme file --- README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/README.md b/README.md index abbfddc..dfcecc2 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Table of contents - * [Installation](#installation) * [Initialization](#initialization) * [Usage](#usage) + * [Versioning](#versioning) * [URL generation](#url-generation) * [File upload](#file-upload) * [File management](#file-management) @@ -94,6 +95,35 @@ class App { You can use this Java SDK for 3 different kinds of methods - URL generation, file upload, and file management. The usage of the SDK has been explained below. +## Versioning +This document presents a list of changes that break existing functionality of ${Version.VERSION_CODE} version. We try our best to minimize these disruptions, but sometimes they are unavoidable and they will be in a major version that is ${Version.VERSION_CODE + 1} version. +### Breaking History: + +### Title +- Result object raw and getMap() properties: + +**What changed** +- raw and getMap() has been deprecated. + +**Who is affected?** +- This affects any development that uses the raw or getMap() from response object of APIs that is Result object. + +**How should I update my code?** +- If you still need to use raw and getMap(), write it with using it with result's internal property such as result.getResponseMetaData().getRaw(). + +### Title +- Result object message and isSuccessful boolean properties: + +**What changed** +- message and isSuccessful has been replaced with custom exceptions according to response code. + +**Who is affected?** +- This affects any development that uses the message or isSuccessful from response object of APIs that is Result object. + +**How should I update my code?** +- If you still need to use message it will be there in custom exception and could be raised isSuccessful properties in your own code from status code which is coming in the response or custom exception. + + ## URL generation **1. Using image path and URL-endpoint** From 4557fd6cb7898990d1a5761995608e507b0a9908 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 22 Jun 2022 10:28:26 +0530 Subject: [PATCH 068/112] added fix in summary description of readme file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dfcecc2..810103f 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ You can use this Java SDK for 3 different kinds of methods - URL generation, fil The usage of the SDK has been explained below. ## Versioning -This document presents a list of changes that break existing functionality of ${Version.VERSION_CODE} version. We try our best to minimize these disruptions, but sometimes they are unavoidable and they will be in a major version that is ${Version.VERSION_CODE + 1} version. +This document presents a list of changes that break existing functionality of previous versions. We try our best to minimize these disruptions, but sometimes they are unavoidable and they will be in major versions. ### Breaking History: ### Title From 8f129d7e6e37c082d4aa915ce34a69949a7ab821 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 22 Jun 2022 10:38:40 +0530 Subject: [PATCH 069/112] added versions --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 810103f..2a31d0b 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,9 @@ The usage of the SDK has been explained below. This document presents a list of changes that break existing functionality of previous versions. We try our best to minimize these disruptions, but sometimes they are unavoidable and they will be in major versions. ### Breaking History: +Even under this circumstance, we will not modify versioned releases. +For example, if we release a breaking change in 1.0.3, we will not simply overwrite version 1.0.3; we will release a new version 1.0.4 that fixes the breaking change. + ### Title - Result object raw and getMap() properties: From 6a00841057208db27ff0b164175c4441856b79ae Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 22 Jun 2022 10:39:50 +0530 Subject: [PATCH 070/112] removed condition for setRaw --- imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 89ed2ee..716fe59 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -117,9 +117,7 @@ public static Map mapListOfStringToString(Map> responseHeaders) throws IOException { - if (responseCode == 200 || responseCode == 201 || responseCode == 204) { - responseMetadata.setRaw(respBody); - } + responseMetadata.setRaw(respBody); if (responseHeaders != null) { Map mappedHeader = Utils.mapListOfStringToString(responseHeaders); responseMetadata.setHeaders(mappedHeader); From 051476899dac9fc36dc558b8488a76f7047d9589 Mon Sep 17 00:00:00 2001 From: amanforindia Date: Wed, 22 Jun 2022 10:41:16 +0530 Subject: [PATCH 071/112] Update readme --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2a31d0b..45a6a9f 100644 --- a/README.md +++ b/README.md @@ -97,13 +97,12 @@ The usage of the SDK has been explained below. ## Versioning This document presents a list of changes that break existing functionality of previous versions. We try our best to minimize these disruptions, but sometimes they are unavoidable and they will be in major versions. + ### Breaking History: -Even under this circumstance, we will not modify versioned releases. -For example, if we release a breaking change in 1.0.3, we will not simply overwrite version 1.0.3; we will release a new version 1.0.4 that fixes the breaking change. +Changes from 1.0.3 -> 2.0.0 are listed below -### Title -- Result object raw and getMap() properties: +1. Result object raw and getMap() properties: **What changed** - raw and getMap() has been deprecated. @@ -114,8 +113,7 @@ For example, if we release a breaking change in 1.0.3, we will not simply overwr **How should I update my code?** - If you still need to use raw and getMap(), write it with using it with result's internal property such as result.getResponseMetaData().getRaw(). -### Title -- Result object message and isSuccessful boolean properties: +2. Result object message and isSuccessful boolean properties: **What changed** - message and isSuccessful has been replaced with custom exceptions according to response code. From c5418e8ec046337f316a17a0a6cfbcd729f4b15f Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 22 Jun 2022 12:22:47 +0530 Subject: [PATCH 072/112] added fix for issue 3 --- build.gradle | 2 +- imagekit-sdk/build.gradle | 8 +++++++- .../io/imagekit/sdk/config/Configuration.java | 2 +- libs/commons-codec-1.13.jar | Bin 344339 -> 0 bytes libs/converter-gson-2.3.0.jar | Bin 5852 -> 0 bytes libs/gson-2.7.jar | Bin 231952 -> 0 bytes libs/okhttp-3.10.0.jar | Bin 412117 -> 0 bytes libs/okio-1.14.0.jar | Bin 85756 -> 0 bytes libs/retrofit-2.4.0.jar | Bin 91002 -> 0 bytes 9 files changed, 9 insertions(+), 3 deletions(-) delete mode 100644 libs/commons-codec-1.13.jar delete mode 100644 libs/converter-gson-2.3.0.jar delete mode 100644 libs/gson-2.7.jar delete mode 100644 libs/okhttp-3.10.0.jar delete mode 100644 libs/okio-1.14.0.jar delete mode 100644 libs/retrofit-2.4.0.jar diff --git a/build.gradle b/build.gradle index 462e601..49debe4 100644 --- a/build.gradle +++ b/build.gradle @@ -17,8 +17,8 @@ application { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') compile project(':imagekit-sdk') testCompile group: 'junit', name: 'junit', version: '4.12' + implementation 'com.google.code.gson:gson:2.7' } diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 1644034..1d35955 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -10,10 +10,16 @@ sourceCompatibility = 1.8 repositories { mavenCentral() + google() } dependencies { - compile fileTree(include: ['*.jar'], dir: '../libs') + compile 'commons-codec:commons-codec:1.13' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.google.code.gson:gson:2.7' + implementation 'com.squareup.okhttp3:okhttp:3.10.0' + compile group: 'com.squareup.okio', name: 'okio', version: '1.14.0' + implementation 'com.squareup.retrofit2:retrofit:2.4.0' testCompile group: 'junit', name: 'junit', version: '4.12' testCompile "org.mockito:mockito-all:2.+" testImplementation 'com.squareup.okhttp3:mockwebserver:3.10.0' diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java index f4da6d6..54350e7 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java @@ -26,7 +26,7 @@ public void setPublicKey(String publicKey) { this.publicKey = publicKey; } - public String getPrivateKey() { + public String getPrivateKey() { return privateKey; } diff --git a/libs/commons-codec-1.13.jar b/libs/commons-codec-1.13.jar deleted file mode 100644 index bf6ccb385d5f6cfc0930565fc88a049544cd7cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344339 zcmb5U1C(sdwl!F;Q?_l}wtdR>DciPf+qP}nwryASx&M3p{`YQof8D*u*dt@?oHN#n z$c&L|&Rp_Rz#zx~0Ka|#m}@=CMxG{=cS8UGJjeh5{Cx@_BcdcgBOxnFCnF#$Au6J% zL@Og&r6pmr$%@>KmHLB!C{OGwc2L*Ac}pOny(o|gR+nMHFZBqG6;)_n$Mf}cRKO~k z&+JK@5WvCenm5@FeeMVib(X#4WV@Ms{?oI` z-P7|?Leih+DZ#QKyu9b6f=)Guwr5+5R_+U_$CXmUH{CZ(pe&t zO*cgVaUNh$O^KTCdZufNv>=0c<6&oL?;dI_;)2-dB{Dd3zhcGY^QYr!<7v&^&M{%$ z_lE=@)W`3LhKlgJ5^kSky96@F2jx|@gE^lI6K!b~j~O<>(rt)AOc>;6Ct>&IMz{UN z##D+^yn(oAt(>f9UoJeL6#DF*Ybt>es=P&4*?wwQnT4J3u9z6By?vufy!%Vycl6t1 z!k~wb-JzY6&Y^nkIs$4zll%-j^A4F)1^T_yKF>Q zNkfqfhL>ZjcQba$(BJ~a0n8YBXXM0NydI2r5d<}F^g#zb|KGQm^Akus>oNA&>!1X& z#RORvBOvE9pn4yQ29T%76n9$o9&rHdP#6 zQiZUOXGVkk@&+%%d37^-0{|b(?>pmZy9;m-ymj#IeTMv~9LNP#r1Cu|C2nBMcS8y} zwKS^5Qe<}513w0QUXlOpT-7cL`p7*cvZL;hS=V}~xph0|vP}8qIIX;MD40n<1a?r# zA*HqLFrmCpc3uVjEeTng3a@mqoyz?yJwiwB58}?q!TL+ZPZxvAQgLG2auhAfs}B` zM_lxpT9G4_E=&q4v=S&2K+~1;?Tagq)+Gq z{8LYTHGa=k8;8R3cGd_V@^s&Xic>oaMjJf#*Bw8=avt!Lqi1arKp1Qw5aCaK39!?g zci*QWSFAxBy$|MpbodC9QxAI|e9C`)n)Z*Z)@F-Nc`7_sM(T)?>; z7nRu2Xv9a1Beo=Xg}`%fKQ}%0K5#6I=cfcxbp>n5bVWr;dfkAbS@5O8r3{ydP~}RY zA;_WNN+F(%;mUwdsi;x`Q{)v4(W=-IX?Ve)DkpEsFf`+5C^_-P0@7a+q2Lf>7qwQn zZEAcx^j|#7&rri+`0{~)x+(~Q!L{1ig!<@%F9+|zkZ?`j!B%7&U&f2WK)ms_c9wiB zx~sF@O?*wQW=3=?NXWLOpN;V_Rr~LAomhcSR(vbDI_!Kmq5@tUKa6E)kJ9L-N}w9Gc6C+@Y7OC!i!hgF#_~-EPNc%PSiVDRP+!>A5(G{4zOOl zfBZZ}Bmy_B?-!bFtdWN&y3|T8MuRC+VWO?(gSP$o3vzc-lo`uqDE}m>%(Mg|fOHO>5lRbw3`{P|c^*)_FzAwSY zVAP*JRfzB?Dw^o_zkjp^I-Y-8>9?xWel_Mm%~G}1VTG!*j=3eo10kiFDqOV z??Qgm=M{yAlyniSJEAS?M_h|890}?WWJkMT(gt~vF7XHGAaNZV3^WoMFrU1I6 z10VUF_&h=^0)GN{8B$II??vy7Nil@iSkCpm(UixYW9YQBLX$~ik9o$`1m>9-Ld5yv8mI4>+Jvo7lmX4uQ^EUabkY|F z;Ibm=c_Vm{2Z_9KXVAc0bpwl_1Bv|AOh9CBZcA1;cz_n1vyez1T|;NXXPbGnw8EGE5dhNs*o966=J|Dz{G;*N^`WwP zGSJliDeA9_{k{1S!W~P-H~MTAhdsgf>IS*=a`U(oZ|wLMw$N#aK=pj06K|6$clP0d zio(p*I7(2uA1aU6T#Oi2Gr zn@f%n?xzPnhLq&pLo~8hC3G|HSXT^jNsTUK8lRi10#3RS7vfvC3yKFZGzR^B_#jpD zCg-nOG1Pg}nxKUZ=4o1%@ticC-x zS|r(NDyUVMNSmplxsZDCSFBn+x2!;8E*M3m(pKe)E=fx-*3RsTcKeEw?~KE4S7MB( zZ}C^|F#W4U?Uk2=rqq(F9LG581Y*vYUDP_JpCq6Cob1Y-%uX(^7VnSyt-&b0^+)#_ zNVF2KadHY%@@o2uqna_`s4mIg57ZKmFG{{s-|e*z6{tgLLT9sV1E;oo9o{NED{ZH$Z!|AB`8Pc#EFYkhmSe_-SM6Wh?z z>>sHA7}&_n#Mr^{AJ~Nd6xdSV+QdoU0k88I!{_olUOFsM! z_+J;?-_d``2P=JNW9$DG=ikBqit}&a|NJ)4{QHOd?^LS)H|qa&qW{o4^nVjh8`72V z_?sy?&A;g#X$c__Sw#_AM_0!!4J#Y05rl6Y{2zU(+)|KCV=|fb;kQCH`~KxTXo+ep zkhj{-4Wbs_ZN?6l{8il@lRvsKg~n)KDg>rg3s={do!k$TlU{dRcV#&fRh27}opVj+ zS?~L0pg;1do)-4^ep0h!96(?DIlRQ8B zE}f6x@6RP%c5SVQHP)!A4#HZ!b5e z607?YP?Bj>o@l#u(f}*s)kzn8(&2Zcobu>mf%M6 zF+7Mht(rY5R4)WlwQDMUmDI{Zx?&G%Syg^A9x?5LEHsV^Z^7}D5B3&TUoa$#~>W)G(dEcyI;WDO5o$J>i z4!-{Cp<+N+kW$Opj@WqZsY9(?9o4BuR*#c)Htd4US2k!-sRV2V#G`h52y=E$$A;R- zG#l+#vA5_ds?yjJEYdW#SpT@pK=WZgd4N_rY|3%Q1ZU%aF@iv!phRmK%$8abLTCyW zAlpETPcHshi)6A3UV5bC;-agH`4MM;YsWBSqmtwc<0=&suf!PxT4P)1aQ1QLz(cgm zLeg;w0k#+<-nVi%b=0iTFs5PM?P;!jg>xJoX2yI;z&0M6Z?EZyL-8*~?!pi*VM_<` z705CR!EsAJK+?|y6AkSf~|0+KtIUogh5ka?N0ZrAv>(^Gbh1>*= zA#2I@#jO6=?c16YH9;m9+cg^ zWlgg+V{tamgsA%R4I=V)xXMnF&0y@}6f7s)s2V@n<|G!f*mCK7i3Tx)xZp%Hsf!-M zOgQP?!Xr3f!XaBXqu++VdQ+_u$Qw5XnJ;H#^r+3K4p;^!Zu>`QvccO?qRE={Ppq0smJCwot@5JC#HUXffEc7& z(ubzF$;54=l*@(KHGpHQN0Fu0>V&SSX)e?9BfaSTa(z=xb&QSUs=-o#L!x%e$rhA? z8}5-mQ;L8j&!bgb@N-wIM@_;Q+Pbh7hh=hcB;1q|wajJn_E2s>6VZ4|Bnm4RJ(c^% z2QeU%60Up0F6J2Ec8S;`^ZXpTO`xgklief3Q+3!lNv#i>+i|B(;m5Je_~6mkrSlQl z6lH7Nry*`7>X9v83Z)R;r%>hFk&QQXCS^e%0g2>PWA4jB4X52^T8%MA;Tb!&bvIUN3Om9T1`tF?%@?c;f?!lJ!VRhGI)^M)5v@weYBe zCJCteHwnU`1SNy$LmvL=ADILcMq~rU*enM;m&pFbewm&{$~&L&jnUyd&~&z9vMcH= z!jiH!VZF*{QPppQiG16)7lEVws19aSSfEbY{#eUVCaQprU zV(`Iz`6`i%Ydpn90fQ*W)WysBAlz(H8|M73s9(|&U;FwqAa0^o(hLlWO_@Z1ND+GK zN#aD?{M{aeAaGl^p}|Z3CqRO@dPrsikwDm49!GxdhmL=EwQqxrKqz;~kC*Yja3T(~ zvuwZ3zT>J?jfE$2rks=;s(&eKQNG=$r4vtStRs<9)^wdHJu5-Qp|%;-7a5A6NKuD6 zZg(=PAeyxcat$%{*L?gqfR0Nm{??f4C;{35ST?lm5R}Q~C@uq>PN0-WQ9Y?Y_8?{fYt zs0q98cnN<@LJ-Ud$I_d@474TI#ct)8=@l5&gTnEV+iWRb#u#8(`yenI|+BK+l-bc&@y| zS)RAZ8g6Y0KtSDl+x5ipACwE>wyL@-v`OF#xI#fWPH3;Twnm*+v#;F5(gWG7Nv+K-KhW!gw1ly(`8g` zQYBX-HYdWQl&%3UNgN@nNSqU=e1J3>cHX+|X)5IuY}w~5g!7hZJ9AmiQ=FB;XGDVZ zr(^f($+JHjBP)qgH1szl7k?jRC+>G3o|0X&hCP~zNu9D5z#T0rPsfgcqibf#H$`^V zo@NAv?*|sI57g=>``yoFKy$4hV{AF(P%kRZz@f0!!I3ERZ`XJMisd>Bt^}>6>Az}l zJHaZr9j>RiPWtf^%%cxICt&bPQq-HB?j%DN&9h8c%>bq36nV-s&xZAt00skz$~{_l>0$jb?26!igH?dM%2bz?4FR4 zcA0dqcNo+^xyoi*gJ~vao;+guo%{2D4HKvn(L#t4%p);5WTYbFeuZq`*JUcDH1jf) za{*X?uTWIlD1Ck$ZW+2i@`c~@ zqYv0*GSY{^?sj1>@CO`I$yX21cXK4i+sBC`4&?%SO$GCC!v61{=|LbRs=; zq`iLMTYIM{eR_NU987h1+ib#wH&blvDFM6?VH@ayzN6~ihp1{60zuL z+hI(pEg;jZV#{p?Bq4M>lP9QaYe}vljY36j&)n>2smg!vuX*0RJ9oeCy_Z}Jd69Ux zcY8e%9d>?tfB*6RVfvWAc>CIapZ1xu#b9&uaDy7?@^EmY+V1Y~@^EmuYN*RmbY|}B zMQLVNd2kFU;qNZxzQsbHO|M!SJb9a^`HbAwmz(6*dNlAtTi}2vYq#^ayF$OuDsw7t zi4x_?v&?UJ<$B!=NGQ@_nT?|9D!;eZ`5;~uHg+g> z{I4&48#?QF%;$QyS?+ABffwS?;M~yHGLcn2(Sa7U{rX}ff$~sS=@8vxVI7ds4;H&G zvqxMQiX7}ak$#PusJky^>pWSp@68#|J_{5g=-n9OM6aq(k>>6`OnAE)+)`E^uj}8B ztDW{8^igd! z?xRa!o=d4gQ%!V|^QuGJZuR^?rJMSBi?$juRo_8@v`z>Hw@#(LMmN2jAZ*2_TUXN7;0Io~UVv4B6cMHD-&46EVk{ z7%4*IO)y<8{WJ1-B#6;y_py@$RsGsF>6D9a3#kMu5ihTR?ADbDqj=fM6Z_2&rQgP| zD+1uCXMAExdb|TGvl@8wS^q-NihZZ4TgyPUHEe`K)*+R|SFrbH89y{Pj&XQ!%4OTth<4IlwvdoPGQVt*o-S51>M*JM{Q9Q+*qc3oq zQcT`boUN3k+Yrv=PT)o1{*7~k0EOWXp0gvE!~5H3D}*zdfr&%)Sdj1qb}}Bz)_xv5 zQimqw@+;@v=otq6XaD*gV-PliH)O>pvM{jbz%?gd(d82cb&7l(jaPExM{F8*tbJuW z>o*cX{sI%QKk%OOmwDiaA1A)WV~8%{@UqmOx9eAP_H({}c})LXtQ)Qc3_Jk=07QWT z0I>g6{r_^I{?lXnKdqzxFbn?E(h<~mFqReimp4Q#WMl1U?CMBsXsPeukfgNn8%Y43 zM@W#hl4{UaK>?7?G*le<)*mowmj+!x8&v2~KVCY1Xo|LJP3@k^J3vJ}wO*31H>Um) z163#%TxLl&hr`Q#eqpPF&&TTnP!FueDbSWAoC1adqUO9c_zd^aP;`X4TFOyqL}oMI zRCdIwkR&~2!atg;m1>Tsje4APZ1$^ zaJ67CLE{lCI`e&Ujs!BIb&w+#bXQUF3B<^ZdbB)k)pc@)bAr6lwmtO^Y#9=g1@s`gGIIMFYgfFh=@|9cU*?sVV|B-=m7#6rjBeu+RGt`{1S4{VQS9{+Ln~S-45gz=^P9FU7MWu$4yLcLqc2H`VlK``Hm$huizNH>bs^tfqJWukrfLqx1DNpt{&^T0PrX3mb zb-|dl82EWjc7tOU!QlP;!06^#i(|w2t&-8y#}Vf|WbB06pw|*Uj$sO}T){S#GftL7 zh!%$`&^G72dJQr=iLHqANbuIsQ=9*Jl!B3n>|y@;v>~Vf0QCRAj?#Y|p&~UmN2Mc_ zA1|hxsbmO0BT|-$UHnk}KY~j5_)MG*MZTiME5HT1C82r*2Wst|Ht-!aBo2 zkAQJ;9c+ZOjJVmgGOhE@wq(7mf|#RTGQ@z7>B`A9{ygu&)K&X=Z%Z#zHH&ZsPXQkq zMV7S0&M?bta6MYe%9(6cxQR zPv)!%yVqmlRM8ecITA9J#|-~Y8~px0>}v1bk0{|TGt#(OUhsfA0O}reW$5bBoiXRA ziXBTT#>q%HGs=s4wLZ_!Q5FJ{^O6@u`>{!fiXQKSi71gZd{B_mbzcfRDwK^ zu;-Z18oRQZtJg5lvXL+%CH*B1#g%A^AyM4)_spawuXw0C`TMpOHlb%!kRLxeKhvab zOC?_AdtA|(hJEp9sHEqrk=_h9d4{OWf-JLnK}u0g;;%P`FLELkg=%<^P=ahaQj8@6 zen4*JmOfoALE*fosz{?44An94m}n(;g`stE@W=@n3g`_asjuM>5sHCWZszrlqB*#? zRb`~NSF6>;r%+Pbx3jiu&mcjzf62&n7;38)C-845x~C(@SWd)Jj)*6!lTyaN;T(+l zZ_7b)Os5-ohM^FFL%s7CduhpCmQ0DxLRDH)N~LwjdAa*5>2ixSGZKBU$J5mvhV3NG zHvEC4Wn_jkdWYh`NNobC(<)$)8^K;Pr7gi}j23<@Mu0BbzCMj!*b4cZTGizDQf#8H&YHsg!wG zyg{CPwz7~zag6A065mi`jyqz`N(cXbINH^U;zcd%X2;a*I_HNK82tZl;hTAXUw~2Z^#?lc3*~WyI)%e+1B?| z(-nqW_mez?^Dzi^>oX1(W3F>HPmfgWD}JnH?Jz2b7jkV4yi;5+u@1*bU;sSs(I9gu z!1WX;RCNCLw(hc$bULHN&ubJZMm;Q?9SS2=Ezg9=*w~V6a*2I9+%eQUhz}||2Vxra zlJ6|Zx%>)A@nMMb+^1&@siGTU+Hq-#F>QqVpG!sv(U1W=vHCif+F0qhjU=-#elr70 zU=nT;&B$xI86jhgE@PFxVEF#hL1ncl)bzIO9llmTr`9^l&fsB-iQxc}DiX5;*+vmUD za1u&?F&ATwxEWwh$Lgj9Qyr?7?EPW8nx9ItP58vY;1s0&!Bu_*?)xTE*~Q8Kk`q44 z3Cr&h|J8zdO!MmsHP9JKumd!2E3lWRSd}D8)e!3%f4zC(Qk49p4jPv19rWim;Ej9D zC7HC8R`G?~iYBApE~OZZ-c(13t;w>D(GxMdMFyyt+86e0w*!&Cs%{QQK8)Zp*U4Ed zsLFuKrYPOQ95?sMv)9J7I=|T8yQ?6j{#GXqw8yy5Coc%IKG!yjji$0V8IDTIKeb+P zME;eoY}TSO1JdeKoqmQ_3^MJ6+`|R+X>S&qQm&(T4`RVdwe}Wwgi$9;aYU}ez11XU z^=OcS8dA)a3Px5=wyK|`Uk>tIY9-!%*tk{v0piKc~B~kPA>E7NU)Z6g~nIIUlu5f@Clf zUA(`a6ixq;fG}zfF?M5Imu!HsuaHjKqc7Es30;j`%CDlvtQp}|rujt=pv$$xu8TFYe_!KyhicF)$A>r z(}_UAWVB9otZt=jxYN(q6^Uv{Qy4Lc#csKr&S=w~)tYmn%VVk>vE=lye80dXRY7@K zpW(X1>ztc>KSO7t-V@oV;&vcS1(YvCrj|?suLpL$ziY~&>Jdoct6Y~OIQdUcyC|>N zpW1u+b1bsG2QERfJ>GE1o&)4+BArXcn9}{%HbH$nMh@L!^&#dwp4>hW9KNU^0vQpS)Fi7crKMKUa1S9UWAX=FRQ|JA+QJTLv_^` z${9hupU6pibVXi(12Y8Ubq1q#2D5es!xaTE_VdApq!tOq?R%=lAoZHT#=&|m!1}1lAE5H0zF>@A0xXc zDE(su4^Xx;BQYtp@*+1bDMPDoB;Q+xRxOnfi`W{lhK_-bk?Na@aVjT@Dhh@Qrh*>> zGinGpf5|@yXvD-|3k2{#6-A6v)dCa@0Km%MH8cFvvj4N~LHK`lKPWqzSvvg3+OyO> z^pKAba_Cx8y0FoJ`~da{@PWoi_K4woZ(~7#21ykp#Hn~skLroRQ#w*R4)VN8UoEYw z@cjjUAs9sF530nIlQ%$AkIR2jLU=V)jTz=tFuB z7}o>;7CR~?%u9N&N|*!xh85R?^adX1gZPFPCl~gaG3pcgnKEi3EQ`buAPj&YKpYhs z6)HR^OPm!dJt#mN5SlPbPe@CcCLD}3M#$(tDo(hDPQ)OIT3{S^5U6YriKG%FV_SJ1+^o64stou(^mCw!P z5dDg@xxow;;uXKwG7Wo~FxlD_)Ni7|2qErQwLx0xC6}Ux>iA`*rJ90@4x^j)&NZSf(?bhK3vx+#)wKLC5S#8X{!4&?YPk7|`#@gJLkGO*eih~>n)ru?$AOiO&sds>q6SDNZ2oXW&9ub`$5S<(}TQNGq z109DT4y11e%^_Wpfg!q)87_cT=I6~Y=! zE4K`04P{#LqgoH|V%RQ9DYWdSkQF{AZ3kZrGVo3L;oD*z!cECk9FTF^fv5;V=n;sc zD94a2sIxXwz>g4oQpxa0*11bEu@Vnxr&&e{XB*$evkVimcA&N5_KM>>jiK%vpPHx{ z$s(Nc<~|is&TA%(X<53kP~q;Dmx99e>13tkjd50dHU+RC{N_hjD2BE|C1{ZGbB1=; zOzdNt+4|G)APqr$Og|M{U#rphhI+mk$Fl=H0uhzVoBirDq>dHd{DwT==OhI1CyqBc z0Ls(0MG84gogEPu4clLb@Qc=tKu^geb88Ec2AjE*5nevM)33g{*fat$axh5CR$4Ct zV`y_0WKu4v%e)z(AguZPXo%Jn*eWz@N~fc|GSnSIdnx&_cP^8#$?9xCpnBcBF>hT@ zi6*HmI`+gLYpNS#ChI`3&CiI-@k*QS-crZ zU>i66I`0fOeOs9DYS4mAhwH8xp(el;hq)`QIE(qJ@Qj9;hkpT>xhttyoB1mL%!>J{ z*o$qZF5(7b)131ZWr&YQ9!bJzLJm zPf80!j_k0bx{anW&AOFVL9$5R7FJ9J6-xWIP)&H4M%2@F9aP6OcdkLHE(Vc9`jFiC zl!I^vX-(D$JozUVCxz8g-ZL)MY;m8KC2>EH;2mh&BGTKCY2KO#XjmQFNo?CcFoIA9(`-RPzo_g z*wG7-;)!XzMCvHE}=f^2FFyjg&{q`e;VQr@E1VfgQ#ku3@%P`j9WG|P94o1nn> zB)w+EZ_x4>cBRmP=6z52rgE7CD2++LO-#A^QnMB^xvTh2Gb?^FNi+6v{O&eO3btAb zvv3$A%KQ*n$qK&B=+UaZ#fBrY3DH+1&B~npBKYOwCVixOH~Z47#(4Ie@cKRN6Uc`}2eJsQIxI_hH-ZIpWvKxlUKlR}&6PJU+2Ju3 zYt?|Gg|-kvt*`}`Fp-zGqR;5#+oPj@80t&ppGifXL5M!U#;pyF#2D*u@-L?%Em?^^ zAjY@*N24W^QIy(S80!l#)~FM^qT;6XjmYvZuOcteMOpETZ}`A0F`|@ye*L)!Sy=TeX1mWG&(V7D8BX+lfniSmJ>c!Gc#vSdlLKqHIg=r)iL2| z!*j^T(TJ(G5&MFg9Jj$pylThV!0S) zqKGz@WSANwwS`j+H%$92jg>;^=TRv+ml@D#W(o9CU*sxa4_N4?Cih%l#GW;$o7tbx zWl1ru7fY!wx89aHd1zlB{8X4VF(yq*){UIqsCh&@6NzlVvo>-}91}M9R7v(XzeA>X zm%>{kybL6^fX0NU!hi`0z?1~pIZEx(2H7bp>NndZSO$>3_^T4TcoODewsX%QRJ#8)pZiD7Ny zQm2IbSt&(`Vbw(PS0kCzo(}P`!Z^m_YEf$6wY7+k?c-Aa&L0sms6~s2LP0oZj1q>( zG=KDWzWTV-5#fDvm7a`)`+J= zf@T-p!PAzK+d~3YvLfi;a2FDADG5PZvVVVz9&I_)M~@EMkh34vj*Q|k&XkuELe?^= z4G8Z@FUGu8dSd5%VwQY-mtN@Kb86qg)xQixf1oRV@GErVE9qbipYZ-z*fSL5WDq8N zs27qz&rc$Y!_|tTF^Q8<#KP8#OJNimQ^evL#f_sAJD{-;@l0lK*@K1Ml*H%_C*Zjx zrzNpv9vQ9?ovPg%uGuqfI-Pu~J^y-7vos09cx`U*q~-#NIoIz{^HHZ%dcF9KfxDm!hvz?lt)_vvDgbg(53*4j@MK;@Kr0A`-CB$tl%$Fsr2N?3 zRF6knhRR}XN%8!$m_PvdX%;a?P&cYw;ju9|4_24=y$bJ0u>IO3|qvw zNL#%C^B21{D@w5tu95)jpP2IRz2+q1VNcQ8^RQ7p}qK=mTr!<|O> zgFW`h_HeW>%PqU7rjrU_&UIyePgn7asnafdK*qZ9Yc#ansI71?FLpq01yY9+ruZ;P zQV*h!3B0DPn%`>uLb9zOtU!gVX@FFUv?N#P%wkZpgqQ6a ze#^(?hdEf(bvMA-d<4B9Cn(4K1igYg=sn4m%Kmchfh_8&&B6jhDX<#3ndvQvD`K@k zCyj=PCm4~Dt7Ifong?=xH_I+hB-M0FA3>MlUDX~#r57jp$gbJfF7>=kwX6%D)-|e_ z-qV2{_mflmBZ2t5SS$g?PCEM@2K#h2VZXOZi<8KvN5O`AmHzA>wS23^x$G6Hg~(w~i29i(VX03<;nocr+q4*gXM3qliv(L2 zHCNr4-DS0X^E3{GpBnvFoh9%bxo)Sm6%AsJ*$!%fCZ$gFpI1g#hoQlAeP^;wEf#b@ zy0YIT-{AjKStU_Y?CePa0E}4z05JW3P*(Cz_QsO>&iX?3hD?nAp{*9zjg^!=7GJ); zetu9%Br7S1c!q7wg@>5q~!U@4rL&N;EU(&N3 zvh22IT(`OD@J95!S71>+ZtC>CpD|A6Z-_>mIJFIhJ{W^Jg*F($e4wu)8x<7gI#gc7 zK1Nc^36^vBAUj#^DngV+yP|vbUehE)VX3qO(Ev3w47_&lr|8?*IuM4pW>)<}T6C0# z#CqMB6ZWYMZ3p+0%<{exjW}5Q%K*9`>y+Ip3>jFt@^7 z{iB1n3+#TJ+b&kq7R>R@kJvVYbU@pWTVq!&AZ3j{)bro{<{ck5e1=h1VyJb4A`LZV z6vX~ij>vbd1+%NN`rtid_S6O#E)J@r(^qD2$i6ABg$49IY3fgUwG6?(h@KMN1y3m? zZZbBEgmy6<^Z)3%vskjN7119gJ-4|pW?bN0{RG5KR|_ksIp!wH|#`2bVZIRWj%NXhLboTYvLlAPcJf0~WR zPIcivAo0e{=0W&|D@X3%xBi+=^>Nr2`yBmi^Im^^g5|oo*I2B2DzQPfrNQ78NbRYx zHMTc!!)e-2Lyt^t6!FdSK8m2H3m^XsUdOIow_aq#MZrpb#hFG@&eRr2x8%9XTknfJ zE@I6gHWh8aVzaR_4Gh(@GR^s@xy!5yPp!rb^tFk$9=|vO2P1nj32c2vgo#hcR{A}- zZNTa6eygC&?((;lu{%z7fXd>Atwyn7ELhgQ4}J&q_Kg@bnBPP#xw=&-GF5gUbbya{ zX`rIJ?bu^xgP>Qap{^Qmj>EuNMBV8JG#`|WIT=#3yf?raJC-#ujOl&pbTVnL12#aj z?eHt#>7xriHFzIH`1s&SLqN7gN+L`X!DCeaVD~sw4eL$IgoMy{aCyTE;ySkZ+k`+B z)ZV&|u_>`TcJg>Gpl$pXyTw?EeT3x7w0{G;UOHTd za~)w{8^~c)Slf!G%-AXpf8@`$95OeDAU_8w9`+-)hT!6bOn85s9GKoVj+bIM5kYi? z@Hh`A)z?kLnQcOp641aE)acNNW%A7Lvp?f7RRf0r2PF4;_@w$*cJhsh&vai0y1!kV z=-UdIqf|mnN)BB3!Zp!zT0Uru?nzDPRmFKj>ZGx^2t*2uLZ6x3vJ@|Yflldz#y_cdsaOz7`_#S77QtE%BJ*=&yveQb_g(O>p`*OWTDXb>0UwseNi zgjm3cDrsC2DRD1SpfW;@nXa*{&Dj&9N|?vn2)P$yIt>TB)EjN+zuvMn|5zaFX=({f_z^I zvhp5O$zi%9ALzz=e_n{Fh;W;#P1TMT1+8|$*xHye3diGcCuEH2j7TpQd4ckCu7N5F+N_ot`ua%Xa3D|Btqk^|dVu!bIq(F&N z`T5`}WY^V+%2&g~`wR=M6|L6H5Y)mks>huu*|6&W+aV(t+c~oZHlk?ob=&sE1CQce1UoGJ11Z8(a;vnu3PMsb0EtVR|&Y!FaLT3Wkz3YRLaYYW1n2sxa0)QzYb z`N@6_*B{OkJ#baIL<~({YZK;j!2NXF&sPmx&wVk|-^IIpQafo--3yd3*}VEklN*Li z>!D#c-LV;vmV=@nr~$39 zEh-R&lu98sWfke9rZDy3so;j~_Uz-RDD-aTLG-mXpVD-LtP22`r^Lp$D2x-J7_~V` z?*!8et;%w18UIw(m5~(H>}KIRCCWTstl0uzSn&LhQf9{<116bn8SFYq&$_6;{|K@_421$m{9;?r}d zM__jk>eU!K0noYIC@Q=Dhy0kHyARc6h|O`?)KIFF1P%Rlt&#>m#US2J*t*ywv9&DkAD9t$C$Z z%04t27nOLsw)wIm^UP#)lTuH*ktAn29Io>2%ZMhDk{<=cRBjl&CpE1>N&y9QwxjNS z&XrD-zeb=x5IwXY@m|2#3V59NDq@t8aoaZ7_-*|jh@^QfVgq@HyntrE4CP@)z3_7S zC`l}!FlFU_32ebgG~GU0nuB?xSiS~t;MFjXJnicu(UXvTlB--{Jwko3qBjjspH(L) z%&gPG$iPr<7nFB-5TUaVMF)yK766~3WPd>%Y?W{j^_u8X)B4O@_+iC_OW$2dzN2tY zW^@C1sFZ5k+WJ*7ER%@n_C89taQIfma8Y)MqW6yFPhl)FFr@jx&kQ<;UL*iL;=Ftj zx4-FThnH2GR1nNHJN|mkAg&pJjX-(1tBje3`d zjaBvG_^eSo$^Z6m3nZmt^eE8yV+Zt@aNoc{e0^Zy2syqU^(!V&Jn~u6Uf5x&4ZT?u zjDo)L0txJaRRC5kj{BMd73XO+oCZRrkDYa;o0V6K_Z_~b9?f!aOc(Tfl#a4a0Y?9#wi1oJVc~gFa6O zgMP}a?$?pZbZb<-mlSSa>3s`7`nLLc5aY!~ieH^eiArsC69=Ypw$5dsd4@s7|H0W? zM`hh~@!ldOBA_TO4WgigbfX|4rP7_!DczxfNC_B73Mie@T>=VHQqm#TLoAK#g4zWXzK_HSk`ZXX}KuCyHcx79_@cqW57?2m^&&UQE7R=ucrhE?__ z1pgyPsGnhd#SmXy#Ok|qVeg)Iq#thtmlyre6rdq#6JH}7USB8bvw2)6Qd(JQN*_<< zCmPO2Jy|Zb@}WPX@2~0hqy@7VPLqdh5Qc-6@U4rA8_BNHv9E5OS2|HvkZGB(*iG;2 z+I(+e!%ox4emr8lRydMoI>7FD7@@s`Yw#l9Z_h3(TGi{k%`5dm3748E(jrbUHUcpTEYxJt9xzCxVjl3bpG7)N>i(qk+Y1Iqa?O%zub) zB-Z@Hzam5R$;e$dMC;|V6a9}Tin_<=XZ~Nf;Ylc>Mobw;UEhLXiuiA#EGQ)ZM1aW{kLBEJ@c>#l2Y+UgPtGdo0l9nZ(rCC zr5Tcb-)GyK%Dj}kZ^$;@lcyxba^mLITWlNEvvk?s?V_Cqm5YQ3jY!{Pq{p)qiTZgMJ14!6h&yz@5@d!@a;*S0-% zFysF2%FheR?eF^~Zv@t`+jV15TWAaCRsD^OT;_TC`J+9-l zaJT&rPIDr@h2fe};y%3Rd=jNw(H#d^QFbiTdU|;Sj_9R>eX?vSbe3_*U#eXr->$kUim3Jl1(p_Wgb`hwTOu9 ztDfMj*EstG*KU4sa}Z{(#HwO;Bb-$~@llChYj|)^>1SD6rPej-U@F(QJ`S$m?70)Q zYV!EHC(5E)4qn*`Gv@j=unE-F&J!h8Q#8Qe`h~rpd$uP!=4jbBLQv`8*es~a!{-;p zMtwD&;`m^8RA}h{)mkReEn`nDe z`S*6mo2SdyS8F^AZ|^3o+XmDnDV{|0ab$7a-L|^aas@vs_1orQUQ`R7b&^A=;X20k z65lLK)85xL0?EIA6Womq#xe@&3-Wl>zgOGJaQ60O=E-Kk6{}#Px+oWqf)K}Di6ml$ zyZ;iyvP_6Dqgl-GoU42oFln3DMH*Y0f3=ZcHXI@nW!stZpUo#|n5!8H{%cXOvU1^? zl7I&W{bH<}iF3G-mu?-Y8h)pna-_7+_A640lKEbuA31S#G;a&ZhTAft!$#@X61&*R zBR8C{$VKdyO1B1);iM~sy>?zr_}m$6qCEU4&s((gw%H}`J@WkI{KTM-A4*EgCXQz? zbPawBUMP-ODQ)V^G~@2`l32Z3>f@Aoy?$4S>(a*cdb=0x9R%i_S<;eTBKlKPS7U`` zeA*6_gXJA_ZNKdH9WQ==Wl>FEgG>60=2>Gf2}w^{`N?ml>j#6`#Gewnq~hMPYX`2; zv>Fs;9Q&&mO-!1dOU$`F^s92KQ}GS0ljx-yc3b||t?xKdAN@w%go2qKOi4t$1WDdh z{7(MTjx^{FuatO7KyT$OBCeS)>3B-*o-gK}3HB?JSGoQ2*uS;7!XVC=O(i77?AzRv z;72-V>(C?cuV%#=MU zk5}+Z_x{WpG6|G_h^Ur_|L-h-u-@muRm$n;)v`rh#L4`AubS8v{dD)i( zhs)BLrE9mpeQmXi#ID@4eJF|L>^(^~V;eIxyHL74<Nwa9p6v6CLBxAc#g0Q2z9{fM!t<02uOy7SLX z#v*542)N+Z5J?HOH1~ePS2Om^Ya6n5Ih*c%@nL~e^vvSgySRCSpp$~Ru^H{}2AIqw8qUpy6J1Yw`@FxAg#S5JryZW`!D~Dr zEF-1c%+=wl7mQrNuK28$(3m?kS>s-ISiXy~IaWo+xnAig##+a{)!t^8iepigG3=;N zxaLj7_Abxr6%K*#o>abAh=!4mW0UfaJ&M${?~I+AYm8dYtvOT1JXm@&vKa4XDwZ|H zhTxfS{yO4L-3|+A*sQl-k&^nlq9J2v-9RY7zcEVqwd#{@``UNAf|nwCow!%qe~d(N zzn`3JYh$xl5zw9Y4{`)tT{?>kiCtUo`e3+8lT*;PYM|o`J zro&?%(z25`FMRm+x_UXQS8l!G-lh#;w*s5Ba_B70e|4@@}>>xS8bKWRdhH3yyyx_=IzE=Amq_jlzV zUjO?0e zwIFS$m1gPJuKlcG_oH7ERFhh{HBI*YzH2Q(wVFigr$ocEV-X?4j%HJ>-{UgYr=HJo z<>sc^*t@9+@V*iX;F7)rU)>eD*)R{FCX-DGu(!9s(lv2Vq0+r%4 zF|Y8pM%x4H9$3nA`eg*Kb(ST2H=6Isul3UZ`oiD#r@|wAXiSLjeD{N|Cd;pA^#u+O z+O8fiRn&2H3o0iCKYk}B-{J}F1^?48RufG(h@gKQ2;T7KemWD?U^xM)%T z>>d84`cK{WJ@tP){2|6u$ycC}b&5@EOd#B}T5IGnpj=RoZG`h&Ce=^&2ZhMWoA@x{ zGIMO>mOKO8qCXx5=MyB?>{B1=YhK1_jsMK}={~pU_%jc)fZ0=xa^s%&&(n)d=Yvb! zjUIawRi!Hjnf%HBq3|h#gDZIFFO7QE=`B;1z$5h!{!NMry3)SA3mxt`{BF2>_CEYH zD?JMa_v_3(-HgQ2^~nzhSKY8?s9D}OB`U|_&Nlw_<=8B?tTU?|(y%AI5!r2k%^&9G zlA0p6N2NVJI!+N{&Lj8rpSjxdv~&CG!hOAx5ZvlNcPRX?-22e#Am-IU(xww;p02ch za9{JfJ5|u+{QD${fh>~@_ulqGN*cbcU(bI(jksarl0E36I)1l-)hc-;{^D60D;)VREhUFI?X(dGH#E+Yxy`!B+c6X*OM^aqKX_x8{ODHT(;QarL;S|7DkuAcoAa z3P$|aN5X;zs5c%b3X1R*FS=D9W`U}easH>Yzi(B zieE?7lWcmY>_;yB_GW!1G5;n5e`~oXuc>Hce38GrYG65ZW+p|9Ug)olnjtBrZ=s z!ZuoAtm%9yvdc`&$lX09-PZq?u}?^7A46J$hTU(AwKQG( zOhkg&4OCuwZy95$rYuys8;j_CR61+YdF@$kM}cL#Uyo~|VUXj0vdFq7**`fmv~L^Z zNdAG;Ff^^+oG{% zdW@!|2EL{jc4P~TT|aWz6Ej1)n+t_ytQw03oG&ZcH=N;8>tyUU-=C8EtV#LFr;)bT z<^=!Rs_z6I=|-9OUFBG^%Eqns*UYk^Im5)K5odYLri&|sj&wgfg(y!VOWP|H+ew=$ zrK?l~C^Rl#*n3~YZq(HD{jp~46gSax`JuMyrWX}^Mp`w40wT1<7G%qVdwk82Ed(($ zd#mriehtxxn(pn(8Jt#SG3Ka`5_(Ld*55JJls~-4(qwIOsK_*m9n}=Rd{U6w{)u9y za&xv*i*BNuj5aw>R;J`Cb(ceP)4YImt61563x#zv8!N+)L^X`*73rTWbOcrL%59>? zx_U@c&6nwk@(wQV<8U|p`xCYOm>l^e5n!h3{a68_- z^6>NW$>w*bKRl%wkj~`8UByu3J&}swbD2HEnRjwf*%-EJNJI9 zvBM?T<^|Jm8vXogrA^e zR%2n*TR?m-@nvarzMWy<+?XcT7@2PSI@f&j^rrh?3K5a|P9iI7Ynk6i1}R~wDN!Rv zBaz>-<4VkBxl4~K4exZnIJU&-P_z*>mA5Ga$21l&ERhH^*W)vC%&x`M z)y`)Y=v7ZYN?lP=NZjop@a5j{X^E@}p3E9HImQ*yP&sTdmizqhW~J+&n>d#`9u=#K zA73UlF1jT|m{f9f|-122z+FQ8H>>6eM_O~XC^o3Zis*SLk&5aKmQE$FH?QY?6 zw7Hp_JmP^pW*k9eIFGYk?Z8@4OZYk2^~GdC_)Gf$LerM&Bf5rYbO8Nx=}7g zw1#2XyC~ev5)=_=kUS;#&xX4RH$^nffbNsw8gJr5EkT-%aZ(W(@x>4Nn(?o<&MAiN zhTP|pyVaWEm@t|a)gN)q+hJJDGf_!Y6#L!*Sv=jX_3bN5R3~=>I@1^Bql;$C$~mHV zb;5e(BbE&%B82|zPYkPnYz<)zE3ylIioZ&!?@HC7%J*oi#BG)6QjTEX)ftWF_S4JJ zGfkX%vufc3MHrL6E>Epri-+HwrX0g8-wl>K7+@$p@Gv~D-X-ivJ-L%nJ##c&mEz!W zHfu!gYu4qH_u(w(miCFe0LjxoHN37^^;3~q{lnHXvjN=ln}aot*CemoJxzPQwdCk7 z!nMw7$Bw@m+NYeB%#bfx$f?Okqv}7pH(K64pr_YBw`&=e^G$2i0hdOp$SuHYWVxTy z*1YUlmPf;}(HnbX;}D;<9nzNFp)kp~;y+vtA3KM49_jd$%1kcj>Tu3>338VX)-;@Z zz!lHZ70+TmXSk;q5LdP{&9BW!|Xmp|-v-lcamiw-{K5IDKH5KqhhVzKEK_txw{ zt#qXdzY)=Fa9;WS??GI5`VPK+8X+GO|9T#q?+TR>Z*B!+WF1u{&Nf^5aEQ;FcCqoo zH6ijjFFy8r!{OCj?oM@Wf&&z0YXL!ntjAwNIp&WaS-v{G<2>rYO&qm8RTZ{+Lo10h zqizB;6z;z9gg=INY=g!ZW{$4(PYj=1tB5p+Fz1)%IhRkm z7=4=YLsns!+bfKcOa1xgv3i$orLEO;*b=*O%DK3_N$v#SdA+g(CMJ#G5F`W93V2 zR?6zwurF0ndER=?W|=}Ykzo?*^gg)qi)01OniZu&bMpfnWzM>=?{4lQJa}KLZl-J9 zbQ;Pcwi7FPD8sAFhRc*#T7NEubH#V5p}qO4^}pNC47oIHUwBiwklip75~S-IzeSxt zEWFnea-*AUbH^v)IuFHo+f|uodTvGviPns(6vhoS7@v2AYCk+W!^>G5NWlvE>l)zh zJH9S_Kgov8XoYf2YoD*Jfi`|}ufboTkPi2&FaE>!Pw%eO6uCW+Vl2(Rmi#>Gs72JM z!Fl}ZHC`%yycWW?{C3h60qQ5)CTvZ9rmMGWPbsJ`B>47Can0onGdUA(c?NE``Z#mi z4V#O8y`7>}sXdiRJZew*k2>rUE_Rv$brilP^+q4je5XgooDzJxuibtP|NTMy^_rr} z*aVi^sml3}>(zPu?h7%z#4{A;WQKi>-8Ja7=aRF291e)j0sF@{5Z zv>zdb7&b50vi!Xpvy}6;&Glbv-&ttU*IeF+d|H!gpC7eYWOdq(k>&qWVO;)JerV!L zgFBDs#|srTM-OVKg2fK>Uw+68lSz}eDBi`n#mW_6R1wqq+UeE8biD0j?9z#ytZUml zv_bSoYEN$DO~hCke=qy(L{1zhB5~xOvK%ZmH*jB5N!c>{BwB6+E6y~2`taS4RtF~m zA!7Ut8lUG{)Ia6>c5FS#yARhAFw;AaSPeCLUbJqWBpU`+q-)gPi)bcce4P0=m{UY? z?9r zjV10^kmmlYWv{5ylRO9qhofzJYn`n1W!BaZxm?K z*2-2$zr)}C>E~A$#i`rB&7{~k9Br?es_xcLT(Jmh5pWku~RXSTJhzM0iZnms4GoI4bpZ#L^x6kW(Td7S!|M?fU z8`iY-4TQ?~K2Nsj75%-Z$&S+=>~ar2vPfT3gKL`A;;A9#wepJ!Ev2jRzMIz#wuzK{ za*QILNm_qxF)VAL)U{js7!t{{Okx!Ipssjnq|}9d$j)K{J4dVJ+O_MJ3xVU`38+5K z<_BA9a(!#Xe?D2I+nTcZSFd+p^+5Of$~|`Stv63NQ$6Q-uE%RsVZ`53E0|TWBHlkg&yw>;&F=Y{ZV)|-E$Pc;XYa|}!kHOCr@A_I){QY9r6{Ch*Y zM>S|uW1p8{p1ezqPEFUgt{BW7Q(k(r`#9jfDFeE;BYg9dAQa8Tqmp?15+T=bE?eZCkif!8t9f{CJDUC-v_yxGXb$-`vv`(}G` zx=CR5e#DkF?bY7O$M~t-m+&YDdpL}pd#6&y9xVMc4wS};_({{&t~l> zflDEtUaRz>_Nc+>&skm9fnQSks^22#$wm{;>0Z;)$rRD2@ZH<{(X7?)&Q`EI&ypqn zt{iUQ#arzC9{acUw3_g&2mY}3=g;`*FvY(!uL}#o%i`v*Gs}i$jtIA2qy(2dY5hUh zt<^KCHC6qpFi8JnNkCA2P}2>)@}OD6)Tv*2vzjHZu9h*j?rjv0NExgJPKuLVI>0$; zXs@r|>JC0~J|qo3^A4#BfM2i_f8TYgKQzqVe&!T3GsX7rwC1_%y&0VYv$YpE^=GH5 zPRCAUYeFq&1+izzGBrOH&Kj&+{q}f{Hpa@Xwh6QK?-0bE31}~^O`m0JXfzkLPPx5Q za#J}H`s9<}SAWCW0Ao~xWv#R6eqS<$IFB!O#!6V*)|u0N^Z7H5iV>ZgXZ50+duuZV z+{0!vYkH${Ue@kQ3NA@5YA$-tb_uNO0-!%i8o2 zkg~W;&enGuhzwyL`&fHe+o$MPKMnqL@{?kjb?F&Fr?m{u@w>ylwKf^j;CIJQtYt{x z7ptezUyWXIKAa6OVqTN&drRUG{I-lyG%5QVZ|Tp-e+2nu_7#0^57Lu<^)?p03NTXJ z+DlQ|({n3H9uz-wUKpjS9&KnK_9@#~$HFPvRj*fb)&!d zcroE@G1XdzbQH7i^pIloxW`^^g?aS(;At6+ygj;1OnhfeDJXKRmm{*ZCTGQL`%Z(+y8nLJ&y3Gj`CS*SNNm+rbFE5Zv=tNHs!`c$XAhQH z<`4CnkqoLQsHq9ts;gLA^-Je}?pn68wHAhHE?YWW}@OjwmV>^QTCp% zCcCa|L~rM(8BtjjpXgxy=xX+EzZpka1D{teX6c{Lgac-@F0c8Ha-NrsDDMoJ`3=e> zU=GlaUe6*NT%a4&NO-O$ZtIzQI{NQ1W~rbQ!N9^JUfG0tt0KOWfy=gsxhAA_y9 z9})DMy{0VaGUUCVK)>u@OQ^zFMv)_J$*mAEWL7D3KjDg1IA2IEnAwp(&E5!UC-g0o z+eSVzDWgb_99)ofN#v8so+}g7PWsrzwJc@ZmJ?els2PFJW^ zEgwsEeJwkJGVK=fG%6hUvUCLHmifA+c|VlMO>~ds zWjK^)2@B{9CMDV~vnze6PAJh+od1;NB_KS&)2-yfVg9~4szhg^M^25%VK?hfBF_$; zd79Tj^=A{+IGnn(H3Sw1a})8GdAlF%2rb6McU9#r zI22^@3up``BwAasFIIbo#pX{g{Lb=7q*|u#R^&~I&7GVdf3o3dm%AtEv5eVGUFIKK zNcwC&he&X5Kqm2M*`ynD2QO2?r{k7tiX%!}VsGq$dSU5`>iQ73>0%N;tqNx9aEy?RbLf1{IZqkOIrom)sQZr0{rULU zbOpCU|LSrRlj=GVztepyh0PwF_3e&w8u4(T)YAfHJT^OQ;-T?ZOgRp0(ODh&3Tc$X zuU-%g$4j}`kr4A%s>%I&mK$9(H~Kp3d%jW{X$4N`sICsNOQkE*@-yq0qQxPGnZ|s@ zG@1&+(8KX+CQ64jIe}-?vOK?s7-zobE2mwlzzA*Al_6HFB#`5o7m9XR;A5C+wpD0; zJN80~+fIeJtE!tx+d)sZ^mlcPMXRlJ8gGSQDBn0K)95pu7>BuXhQ7$LcquPCDq`wN zTRG?7)zJ=%<&1ryW63XYD=!s&F@zfo1<1Fn^S~eNS$-L87fi05lUA;8){e}9(vjCT&U5w1aay( z9kJ24A@R)kW#TL2Mohs@l5$edT4bdhTjZpi7-hq!30bbRL@;s1P(3id#vlLHV*LWK zNhKGPaTTLn_311(;Z1fi1YmKP7r(%= zH!psJRcKxujA8>XgCZ5xKBF>RY0O)J_q^i4{lT=uCbBI(}ZgZ5hMs{3z$=xN4hq$(;RiC)F zwpEO{wyxEexVF9(gSfWgfe@bl^ei3T~!<7OL z1NSNgqyx#S1e5~#s|4-^YE%ix1-exUz++T>gYt9}p*-D0C{H&L%F|1P^7Il}n%MMo z>6(P$-!nDI>*+Ey>FDX+XtLJRrEl`m(`9Z7)6->aO3>3~Y0A|zjh&uge0Zqt*jipjkpOoz$6DQt|%y(LV9xOTRcnz(lEff%0t-&r_~zq4=}+p};Q+p};Q z|I+-i>^&dL25Qu~!!FmkO9j5Kb5{tgsB^y`I9%rrk5T6ik5PY~tN+5Hj>(wmE{=z?o6BSyvYYE<8*-a}$!KLacgbkw zHV?@@Gr6CIDKn9uo8`tM_20iAh(}i+V~F|Eo{1de{@7{Wxvl3+Y!b&z-!EQnko|K0 zt9^{$-U)3?-nj#}Bl&wVcj%bq)cvtQsu2A|11|I^`?1?v+D%q_hE zBQ=DpAs_;P(burlGGzIJg8-D=6^(AdDDMH}vyKHo2wCh1Ky?zL5vn>*82~ECAS(m; zMo{TOsB~!rZ~QGWL1V{pK1Z92m zMRUZ#x-J10F0$@{^^6m&e`vSF(C7jJ9s=NlGSH$JssRIHchN)RpocbuwJ6XNhM>_S zG?Io<3wmC3*4I&0jA(QXM&T$qBRYypC?*Fn88ojCt%s~|bQC6l{}zB$g2}Lq656b* z$YMg-(ax}-ow1vb@2n@&}6@QDMk3 z2I~Xbi}z?tKcmbPkXaWMuYs($=%LZoDnMJBi>jeSY2G1=5v&zt;h;29Foz#)sUk|l z4Qa;F{!}2#7Nz+BbL>#f|2+XZ&2h95ZfGMW5bzd&b#xyrQ3ehKpr_tLPmPIyBmiho z@gY#WDZ0WU=srZDN)@06k2eTFWwoQS@Q@V)Rx&DH3o`uWL37Z3=s{&UAxi|TTC@io z$dX6aU1Xu+3z21wEFrLdpi>k?BeZlaD&7gLa|f-H0P8HEM-c|#ZVHSh(a!IoZT11+ z0PQ>}s`Ne@p^GGj%8Ei6t|AK+FNTVLfR+%1C2peyIZy_91iS*E9$EIt(g8~g6*+}g z-9vLQVa~BESn?<-3z~yA-52et0kZg!g?72=rZzI6(kxi~BRfp>f~kaHE<;6G%3xxEDFY?}EFu7=g%p@v zF!csd@$gIzH;T?r--mMELOI+(b^%#RS9HD?)yD=#J~HURcn76W!Bkh6Itr^UNkA?} zSilXaBq-P&>RVC(6CbDopsHcTB_%L$fl>xa6mtE8XYEaZT(HmnVn7{28B6Gq#KFJ- z0|yLpDAbS>rrEAZP(WMyU5I3dq3>WcC5w2F6R+U`}|{MggGaV7dZq24^%FOkg+ybpxI~ z4lTqA)7-)Ahg=G9tenq*QUId_j2}=AX9yU&U~D4;h$4S5?t>8q#%&;8!yX#qL7vZ$ z_#HfjCKPIj4aQqAh++9W*sh{@m_`ZHtdYS8Mlu*UV8{W*2ix@vZ5KC8y8}i!GT_?L z!HsHk1?m=F!dfx4S_;UVX6R} z>+}Vn(DTW_)ay`&1KjIIJTO?mNQ6RPKLCmcC~nBr4P^+xxlW6Kfe!{d7?n`y^j$F6 zz$iclEI%y-h7IHq1k(;ytAs-7;Gi4tfLQ^_f5X;P!Y!vu0aFjmJ*aCOc61YVR03|f zKiX9yAVr{zO?V?VUIjxL8BpjWw5lLb#$a;5)LJH>UIB&PZ1%`NZ#Fp8X=`zqG&t%jDpe7ocS+om( z&<<>&0-SH4h8{J{s6pj9qw@Zts5`36^S=h|iYMBYT2z_Oe+??{1id;zuQ1UoO!VqG zdi5N=nncCZLh&7!QS%5r1_#vGijHv>?Ft@R2Ma9`h-NjRP5zJN1oq)gV42b35u>t0 z5qk+$Cxs@Yp$UCx!WGnzqZMRPa}zZds6pPt+mPhxf6aAxHGg)^QJJ7oQ==kCd5m{4 zkJpN&%yvxCHX-|Mo2AKExou5^ZGz&@BDpb+?K;8t)@!t!$q99&COQ5G_$t^xW)(;{ z(Fw+NFbqDh8lJYnKm-OCA>M0Y(BcP!2&bNWsuS2Fk$;1|Jw>$Ur$n z!5{=f7>revgBuKXFlvy2atMP#1BMqeP!4`D#K1U02Ff801_l_oU|feBPMl!SgAsxZ z$l)Xa#uYGRkO4WIc);KSqa7KL!wKyN9vCcO94BR;U!X+;F15zQ9}v9=(QGg>kXau9$~2F5Tl zP!3EmBEaAWV;to`hnx?_nQ4xHRRmP&nsG5sI1bJfJroN>^&slT4R{L}9ANk$+zjv( zz%c;FT`|D^;rAF^Ni~1c0Ry6YW&Sj;NPiH)5JwGzIOn{nD)!B+i@hz6Nj}PaWR-}L zQuC(?$~h-WsfOWsDd+q@O;zkAM*!vkU;#iG00}k!yt~ zQ4%Tu2m#OqzypB$pk~lEfMfu20H_a{>c|1a1MmrePXXuzKm&k61VE-bR1N_E+5or! zumS)-0QLY(q70}Od;rt|umxZY05HTsN)cAixxmm04)N<0gwSe^(YI}aftRr4FGEZh5@h#UV}@&n)$Wq~@hF98I5QYrw#0x^NEfp|dh5T&<4*CB}pB(aAie?b>PuRsq$9UxXv z4#*0$459?ZgS0`TAR$mS$P;u3!T|+?q(N<<8=wr38E64S3VH`p2MvMvK;C`&3RomC2k%}x88!cPcq5*|ZI}oJp*{li925o$flB~)t(q3@{W-V@=;afU8Bi@O0I&lv0e}|(djM=805bSN4X1Pf&;!r{fD8ap0MG&;4jKHQhEud9w{)@H zuK?5!kU2m-0Hq)ZWq~?QVOx%w0q6uk1AsyR3;<|AS)h(nv?q4}7z4l!fDHhq5C9p@ zP#tJ57y)PpKpB7(0K@_CgA8X-hyFEy(0;H1Gz^eEKvMuUAP8kab)fxV0iXu}V~_zr zt&Swq%+NDK{~7wv&_9L#DfIKuH$W0UNb2OAYK9S z3W&Qw+zsMx5O;&P8^qlp?gnu;i0?ss58`_e--Gxb#P=Y+2k||K6G5B^;zST9f;bVx zi6Bk{aUzIEK|BiLQ4o)Ucof8=ARYzrD2OXVTp8kLXxHJ~#PC2AAZ!o`hyX+lLb0nL zd=M1~7eoevH<}o&21Y#`Y5ir;1rRw13j`-ve+hIQ1SblglYmiw5kv{X0g-|TK{OyZ z%=#-JSic_DuZQ*PVf|CM&)!rZVGu4HHU}KG5(wRKI}i;>A0!5vf(vj0!UXxjL7%}v z6Ad+7{1$k)NdJlSo1`4c>yT(xI!V&nFjWk$?DND=uz$~dy7-MzmgKce3@cp}gPH`5 zVvfH^uquYf?dju(<^f;>Km&k61VE-*RL&g$gaFt9fC>P9 z0PF#nL>W*mYyj{9um*rI0B!(mAOK}RwQv9+2EYjbxBw6VKns8vWblR>4sHU#1;88t zEC472kOBZHJwTAf8|pYf+ad_iHb7(maR6ihP(8{5bsV5Q;RRp?0Db`M0hmGn$^dm7 zpgj=<;0ORB0B8Xa2f!CH9HTnWUT_1j2ml8F58&Jk0BS%GWI0B4p#2aAXb&J-fW!gt z1K!!M<7m+1Ly)s7IYJ20U`%! zg3ujz2VsGvKpU{3;;^ByNU-xN(5pb-4}CxM=$>;!Ujlsz^iI$_LB9?CHuUIv<3k?? zeHire(91*L34JH@Y|yhop9_61^w!W@L%#z33iRl5Q$e2qeFF44(Ca|&2M1gM@7{`7 zRysF$Bc8!wuQP#Ae**-!be$Q*2$ukE$+$AS2PNPlpgV`|zWCp%2fGJ;lh#cnA!mLT z#(lV%L8Ql)2K#6K%V#l1+|xb!2w##U58s_6bnbuiMM?kPmq^2xKpQz(7#KM?JhOK< z_=7Y8Ht#VW-e-~0V=GxDU4L|~wCkIK>Cb-o zHPexX5%Ce)vFMnof*5PlxS6lB6QVs%Zl5gr^53`1Y!VAu-F9JRc}?*xgZQ|Ld``x~ zt|Um7sZ_Cmg+WDHvV~|&u`yMl(E{&Azz4Zc=@e8+%vNvAEyD31UVh9ludsYu6#K$w z=i`ZwJsjlYIhxHId}So(v6zeB5k)dV4C zwALrdnqi*Kg+iVDR%1t2-Oa@*`>NLq<-jP zsg&d5?d<)p?&q99%5>hR{+?&I+D6P*O^x5BIF_4BkHx9ud#>iRH@|K$uf&o(jdb(Y ziO;{Za_Kqy5H$_0$LLXa%ic!%0n2fm$D>*MU#%ZoPG~lW?zAOn6P>#C?b?P6uNave z42&B-hp*eDue?~jdS}y(AH&RH(&(jym;a+T2~vC8JV$@`x31px`kA|XN27k*Dlu#8 zj(mzdE`?2OlM2ngD9*{bZVIdo_l6$!tuNFci?0w0Q=cUo@Z4)5y4(5I)2{Shn~=an}nt?5e( zN6kxil0ZF$N5-gOjhnDgkxrPfC`qSlEmyu6Vt85}eGufx5>Qi!?x-Rg$) z2lA)JZ$j0$=il7QR1kdHk^2GXjim%?9yO_cxz&+zGa=0;M~Fk|gTT|-H=)D7cLqE2 zO^fkK-NbmwtuAEIX9nNfS-V&2oind;C&lVOwX<;Ou4?C_JCbEToXXDUkUYxwx5Dlj zj8T<;az_q+J-m#3&{#F>@ts}W{6wpHRklp+gObvr3gJGgM|Bv3RL5kZ4|c8%s;DZ9 zR=iKNa?EMXCY|aVtuVT->rAq5N1eSJy6QOd{2GnQTI%+tRY^_9t)8j%4zU@6ofphO zZTQC}CLiFhzXNhz4|Z-g&@eAQ{zB8bo3^Z*7umaG`iA8SpD|PHh37KQf7c6Gk6u;6 zOxjaks&W|DkT?woVH+g~h7Eu!63)DdT=Q_h%Otm_)<5bJ7T!a^Gw5Lt09V)K^EytuC| z+d-#=cjnk??vL`2v-AJ+Cq;%!XWyQKuN_dvJaO9m3&1JJ(qW)S}ix*Ke>cU;Na#&YJla6Epl`xphKJtxtP!sqB29O^>%9cVCMq zHqoX6^TRL_0qlYYFUxKoyw4qtXr{Y9K*u&CD_0q|-6Fbqh2UoB$4mb@4E=Atbq?-+ zKG$g%h}B2_mF9Dau>WKEbyHBfcns$-j-6us&zEQS=lo(Ge7j;Z{J}x^|K{?zI63{lcgN+4k^Ly= z7QnGpULH_Hh39r5N zk=TS4w#oqE@Ty)B492GG0t)z~{mM*x8OE<#?!RL&!ujmq#G`#FAW}Er+VxL?x~%J_ z#<#+o^(-&^pp-Mro)uYaUgDDYTGek*z&EpYeK*cg_7Oi5r9rBo0JD<>!CO_CU$La} z#HB4-I5#hRqhfoNsla^m38il0wG3R$FT}ckFiA}^ONu+C!iFO3UQFm}yRgYO$k|(_ zv|jLyc}>0Tas1tqz(!@dvuTqp@nv$!)eDv%2Wm6B3{3RN@5*=oWstmKJZZ2l5_EUO zlcb6}{KAhrn9ru{G0krG7f-lxX6)bnpsL1e*1fBlvFN#QwO!T;+bVMjb=C*jVa`~i4Vanz4TbErLpPaw?LY3v`5RK+ zBgfvfr3~u(mMs#Tu#p==AfmLfk=dyz5M}5>RFOM>d;CQ%a}p`1p52U0WnzTCiZjp4 z2GWjo3F*GJj@X5FW9EbLMfPpUE=?xmCJJMrrKYz+RO=m>S7UEgc03-#A2Q`~6rxzL z7$5s-ui=z_V_0KY;~u$$gdgn^?eq2He=GarMlxZh%Om`Ro0^4DEl%0ZA+kECpgiv|yWrt@+5#aCxN=5aYCBH7mVWc7=BmG&-K z$WMO4b@jmS*I3E9+U*gEYHF=Jb#J+Y@AOA*UfpfKO&0Vs+T+h;5C^4CfJj%|*Jl$A z9qK`HxO-eHM%F4BmVW=sn_zt_A#NIeg37~BP{IF`H^EbPBNJx>^QX_?C+Pp*kI$f- z_FXBrt0XSiPYm7O_ICteNMk3AW-!@L6$g-J>%Lz5uwj40`Whs;Mt+u#KI&|M+lX8m6+8bc6F%ir2KWW% z7n@J!g$LapJM2L|w`IQ>=cXp;EcSIGPOtQW*N(3-DfHMYRensSzncAy)HU&G%9~K~ zunMvgb-yJtSjcEEc+%bCx~1Q@eFQds-v?a)!_JDS4rd6d!|@8QWn1-(Z)E$-?AW_P z&5)6g8w`e?LE?`#6J1^13*kcX{gH^8=Q8Ic~L3H6V@p&_~2(mHl{NUSgE{;TInEA#v z1>`Hu-Z|XA-knLNWh`*uKtM}K|BvN2|C4b2{rwj%k!qv1NTTSSq9dPlVFcH9m}pV^ zdqF~KKSg_TLI|iL7kAgi7dS7@tP<~Q>Q8`y3%*(^xWfDRe?XLfh7r)DtpSieWjdEt zxi-tw9PB$bAHC1USed@|{lo(HKwQ<}Yk}o|lSRiadv*jSQ_%`Z7mlAS&cTPbec1@I8XG*iYn8 z0T$ylZPz6={%ZJTvol9bHY<+i5vaL634P%^6fm$Rv8!( zYlE`7X`S=9`*0)UcE^VHX`M@;KO!0#lzU#SjxM2eWH@XFi-QV>Kz>ARXHmrS1G~lEHK($Izs+fzYh-$E$)(hcdk{RN*tksj8x1o`xa30kfN{!6I3wi z&*l5v94b1{bC|Ojg8(Yw9|T3;3kRhIgG5Y7*KZ~i6bB~rL#yETHQBGY4sq8?cOq2^ zw|47ohR&`;NV;BBX@2yD(9mLWa)o|F@R@Is9#Lr*MyUspyEuDe0!<1 z>F)l*)JEppZggTtF}SkRB=1bc5<$2Y`9vjRfcpT;gqn8Fo)ZW|!opHATM>KO-|@VB zZ=hbNq}0o`|8t^`<(x#79LWxPDMIjjhJrUtnLaM0s6;U#k(hH})&whfGQ?nB9ETlg zu*Yg@mL#5PWB78+I@Z&QI9@7_L{@TMJWnd*U>mS&C(CKuYovIQtn_T_BmAd(x9!+X z43A)UJKtRvqrc>5s{HSE+Htan4gvXg0kmH)jraU|y0#-#Fq0B5E0|gB5KUm7kMcsD zn$jyN$6I)H1fEq?!N;vB!YiJ^T$jmC^wMzOUv%`|RP-68halSwz0^kTcTM@YAV*7n z-^T<|cv>r;StIn~x_W)?cdx%MzFt0V;;ykZx!av?J#=RvZRvj!+e=Iv48UDzOnrD_ zc~}eDT5Gae9Tmc?*XFFUI1T>3q2QOEsObpc^zpvvZR{KUoS=NzrpfIj1b^l>`1C!( zLwHBZ^%1$F4e1CzdJXwNneN1Y!Oz9Rf1%IK`uP%VuCaJXj_4M2bQt2TKjYqC){>R^ zoEmEdU}vsM@$#VUS|w)V;xdJ{r%8~dd&*P(#1fVgJPGEYqzCkxI6O(o{AQm|&<+)1 zOmNO#4PJegc`4K|bwnuc-lk}&Zs)^(IzMeBYa`l*a|84+b_{8NdV>IO_p>zyND)I3 zK@y(4E_-IkH^tSrpbobJDdU9Gy~4#YUMbB1qG%eING5_w|Cc9QPpgAS;i7KPp?xb;d+IN z@*L_ukcg!%w1K^A8WcYsEF{*tY&t|h-s}9=*9F?JyUq2hAbErMU(z}UXDeezT{CAJ zQ+ng6XZD^7il&5fF|LG-{2F(BlJ!#RBq(8FJ6%4x zy!eB-4|2#yIY-h%pDWv9g?rY%=pYfS>5oqbf|#9bJipQCP!N*7X3LP#QNrp>5WGRn z&nQVbvZ)qCq##K2gra4_0pl-b6G0T{=P{9{h>7R*=Q5%HE!IO1ym|}BMS$=R^YO+G zK9)ff33lPbbMd$D6X+-v7%1iW3hpoyi~D!fmPXaV1q}3N)uy@hIZzq8!*454hev!% zi5B}M_6TQERtVH{!p)K7x5?|K z(ozJ%Rl)+mb;rmxaw}Eo)mn%PdmDg&IdaHc4hgp{$T5&IY{| zX6hT1<$(QFgpOER?Jt^w`C50pQ;7Q#ahdb=olx|{47|jPrx+o1BZ)*~&8?F0;f7%G z6gP^Btb_|ISa1N#Q>?x60^EJli{^XYhq{l?+uPGTX6USU>i$4${`SaW6T^9tdga=1 zkY(m>YJHYTvx%vYEhek6YdwwYspgC}bL{5XW;bq=b5}=OmbP@EOVvrRjaH(zk9{)I z$D%&}Q(AA>m1}SnwfEav?}E{LFPH?uo6{2>ffsjI=gYa2Y z>tO#G0q3QyweGc^G(qF@?1t*s@96=p24Vx!i{NQ9=g^V63*DL{l^?;EEw4wdv(|ap zw-S~oOOo3+PdGMMRiub_j=8GnuTd(G)xTO&w zbQ|X_HE**AzFiKkZciE?&>E0&=@(_jCk|?ytqT54swAIrhlQ=>%tUM}lK)Je0}Gh0 z&o^sd_{HtFhST?iYDc8$=$=2o!+&~uipMzT0{Y7&+#ELiVw|QY6`)zxlmu9W%1H_T zDbYaU{FP|*50xV`{Jznux0mYM*V4Be*#~5S?wNN8Wqn)7pyi;N41TqxllPn?jT!0I zv-gk0BeoDV5Ld6_>^2V7{Nfm7fYaZ(Hc^V-;7s`DR~fb@T!SvI{!AQK*>go1_W7TQ zrI6@o575Tj49H}m9_L&tyO>c2K3KvB)pkgCF`H99MHfW@~<(-idmZsPz>`$tMMW2E)BQBd4C> z%A3WAJA>q%IXnI?HjRMbZMMrDBe!kXZ;^S^qEhy~lkvlfIWZTNxEV0sg%u$3E<*S| zV#d^7?cJ3~qyk)o)Nc1rg{E!u+|?d>$&&T`e<0Jn>-hjUJr7y=ah9Qw>JKI*Y_`InCh znOB39bv1my{weXXSK0uW`cBF`BJr1x?z}m{Y2|_wBg6;knBUPA#Hq|W*Ly9E$Na>M zT*|8_0Ubi%_D)3^-bJuDfu~?_M4FW~(u_9JWS}E|hq4$zR2GiXa^j1Fdr=P?5IG7n z>h0^5R-Dz40|;4bUK=GRg!s!xd7X%izOaHvl|F3DFRx13#P7zKeR9tH4?bGI0IQp4 zmRcz1wwyB~UEdOs$-d6S>#dRhmyhOr@zKlJFFxAthpwhcURmCR1o%%rYA&PA0zo(W z#YfNo@=?fr&;~R%9(?=|N3k2AjzRZ0JgyN)53ng=`W=;@jvcxx6c|D@Y zA$c-bPHYjEE@7=A^O?37UVA)?Jq~#vzqh;z|8xwEN`67M!wt_1!wad$i4WX0KSG9n z`!Lfk@+){jT7Jdr-C1^B{Gja^lWS;u0YkI> zalRly*NB5$=Ri;Bl<(VSTuqC??4fjHVx|5;Ggr(kF15>yp;;WARDG7kIHN)vmaO(^`7 zgV6~zi7&;hZRG6FWlzd?-CV{H@?fg|C>EZKoq%uyVdGIE0s6mTh=cl`JOPD9TD4TTul=sMY zq`J&>UMJ5CkQ8VIbg^WavZ}KByp(TUe!1?pIWH^s)XICcz{h(S9^gPJ^i?{k) zo>$J3cux=#``dbN=SSV>xDQd$p1s%Em%T^m7m-1a5WC%GWK;NeL8MpfdTyUU)#w>w z0kTLWp74Q)>?&NdMOszL+5u}Ap|hZ}!|77OuJ$oGK!SXDhNzDXcaaaC~94JK)Re) zFI8&>7cgt;oE>GdB2)O?2Kh$O@-T5_=?Q8~l5)&8i@c~doT2!jChZGf^JDQKed3QO zOsbv4U?p1HYj@COak5}uuQbtAhDGM#hihwO+gq0yvc5H0(37_P0ej z7JM6vSR+k}qV$-}78f4%>Q~n3m>hL=e`cZ8-S0QnDZe#HLrZIGGoy^gp`hDtT-D^q zZ75sT;iN<^X@`$r&n7D?ehjh@W{WPi`E0TOEj_xj{fa_MjYThSsd=QlbSAf7ruhcy zE_swNd)#nhFK_vlH9jz$0x0y97VrE+;8X5|>K3~jcwxVeUbWERTw$%G{FbJn+;xhHmnOiDYgD`T2`6?7<|s<*yx0L z_U{;Zz&zc?>)@UFxuYG4?d6ZkgJr199#XpFTCL zadpa(YIx6ia{48pp!sgE@9N;78V+wVstFzPsW~L(GymAkCAMWTj9=J%Fy6mGyjdg zg43KydouUitC`Wv+Qmk_4&_0d>gTz3Cln*}W0`9Dd zBMsEVUbYJYp){TEk_lf#+M=%+l6l^_X|A*V;NxiR8KS0(>d;)4>+$85ljrn7WQ!A4 z;~--xGVJ+vymB!fzaP2%lZvMAGEhxnHa0*taN)*5OdhDjl@phiKwdnS!T?uZ z-PiYGL}j{ik=U}5D!orjOHKRCvsTn((iHXhQw~5lGW;WaTz6ytcs~$A$2r+Fe)3a( zBBQqRQdysRIK(u`C*94girbQGSpV1goH*yhjN%~SsA<&fh>^ZLC)eO+G{tcuE83No zCDefu{^9uVb_w-6c5Iayf$F!O>(KqAC_D}CeK)=5ospxJx0d}Ylj-3Gq*6zt=Zf92 z8_vPz{YUDLtz^xQr5)KQ<@<(;!KWQJt7psbPIjHfxAuNsY}NNSCo1Ysi~Y}b^zBrL zrqbW0bv_MuwEy~c!uxm5RD2zV^smG4zpA$W@pd{nJ6M`Kn*GOVh@Z4s;e#Kz6l?1p zD$37o`dgWUDwQD=)0+#~hI22aEwxTuURJf4h!gcpG0ciXn#jDCAw7}MMF~B)2tvz zr^@vw=1pQKGkc}bVBX#AjU}JT*Q_Sh{_kh{aBVU^IzLlUp)6gWhC|(i=NrZeBIK(}J19mV* zN)DRzo3hVMDxyejjAISmQZ_~+^Ch_`U;;UfX2?}i{)LH&5LUwm7tR#wl83INAG)cs zC~y$H{C97Jzs)|K&4nO*I)eSb?_>h z`PmzMQ4YSZgYa*g2o#JRZJiwqjRkFO9G&!SoE-nLcQPY(RHBy;Iq374x&}@2v|^(b zp+36~K0o_=Tp__6>WbQ0f;dM$xix|Lj%PEX))NpC z_!hJ>SOS&8l0tQbUNC;iItKLqf*RKk9)!wqPru8i2QWeY+cou{YuU6UIZ8F7*(cT& zvrX2U#Y=`m$8ZC_FAyHBIR;rA2Lh8#7nl^V=nP3wr=Y4%)6@1@_yz8Q!*W*al~%!u ziZ4N5X(NX%b%PnS4y5bGWJr;Th@6cZue5Mc{Yaw5w&Qp&d29(v7i>sP2gi|Chl9Wl z;==~hyC5st#8erlwSlUz*`sCXV4uvY$bhQW_*t7+DNR}97>Qi@tR5sDGeO>)n=IaN+>(moez zjloW4Xz7o%?v-8df<aSR$LY@= z$`g@mSwn1hZ4=UH9f#<#K`RM0(Dpa!_CU-W!(^QIB_)vd&EMtz7z_l|r_#W2-Y60z z#H6v*OuAXbPj%gz64Q@48PM?9Tu%q+bs!Pt#8h$P>^TiGYfFCXQ0RdpNcEH)u$f|& zZ?wZJL%m6E(9<92p<0k)L&bE{)5pO=#oa*=d!YUFCrh3j_dp|fq?u3fPiTKU8(CYBL9KMb&VfhO7ru)hvP;YqhnZz zK}2*UVlmVy@I3?wqC)hw`2oJ5eIX%&3^CJ2Bok8bT4g(x%BvbsE;TBV6=n#`ptAxM zDrMI58m&wH?HU!%=9Xwsd#_oq8&V`})1aq^iQQq*n5gvOOhw;W&vvyQ`R%#Bcvp~ zE*Xz{*w-h?6yp9fEcHS?n5!p%I-sP&knB>m=3;`$rG=fG?N?Q zW~NM97PmSn9fPX^a9xwD{onhLImZ(IRSZuS8CCYPS|8~Xi!CKVvM39cfXRDspN%bA z^fzJlE%1y^qpQf7_u6jF{PogXX&a4^BFr}w^G=Ja#r*e{?55={TQSdYyK8CoOO*^; z$61Pw^(`6y%b1K!hNo5VP4d@<;X|5?OBY2(AJL~xnwZC$`<@1@9ec6DaIFM#a1A}wb+HHD&pYsFLXI75S#9_4trg*8KU3ro^7EG8y zOAWzLA-3*4^%cbMpw%AdSkSxA){anjtkqqq7H$KIWKGq^LjC93l@~A=%S7tT);5#v zHe;#a#r~bsGJ*4)!bCe|#qtVjROxJMSXSjfLAj@#0;j#omaCNq|4q2$Q z6g71f8+Y8G9TO{x(-ynpO*0l^BkEPCVgKwFuLTXgn2{|bz%g>ZR88Pwuixi1T-`{Y zZ|A{6YBWtiz5_P|*YYbdgMvh*0zTk^rXY_=da(d<)}A9ocMtJ#(dfTf7|(=Yql(~I zQm3GVbE_-kYN2H;Gz6}Lu2OKe%@m)CQ*Qt%>C9{z$Y`NKr<^MbLA#@ZmYTf==rx6M zr=dA+LIV#(Aei>lck2QEc2C8A69b82_3hvC?O@JI@G&enz9~p&tRuq($88&L3zZXY zAfv)CTGL>aa$`pT8&TAArJZBRzj_sx;v@Fu_XGUFC6U01hq(HTLJM-piLU*Q<76cX zMh2`I_%d7JcPRC5j2TZTl0`tG-lDj>zB z^)q~;LpjoNg6N1k&H<=%*$qWv5)qR>E3@2)tU@gN?CIJ_c}L^0Lkjr8lg`M54ZDDR z{BZ>;Dn_ZCgx|R_BbG1R?gqoGq>6scMHjH`{i)uKsyC&%LLG z1kt(>wAddr2|x{fkbSNg6}22JxQzG{T*FcMX@SZUIQJ%{P*G|+?GvQM`DIxIz5x~W zgu38ATv59vDRhUR-L9wGv#^+E4<4>itF~P^sik6{)`Om2M3ktX6G_wHOnsf{LQqGd zG6h`?D3DV?6wCiG+bJD3kF&xhNA{%*(qj#SQjVd56y%E_959vBUR}Y|!L!J~(%qa! zjUqX;wt{RVC8RGQb`H}LyPI5(VA10OiTq6-X_Z)=#NYU-H!>dwTIq#gZn>{l4DQUbFRI zt=XZ4$ab(Yh}W$vyZV&(GQJNFNE`;@DVc0`z*D-1u)f>z%duue?7=16P;1#HuoJtZ zvH`Kgngl<}oQfsU2Ih?+O1`m1iSuqD#~bgfpNsde5(Wp9_%tD=CKZ_D8guTinbmO@ z)#H9l?R2PEkX6B`qeWGsF>?}}f5*6xQ&eP&Md!6XQ35@UJYlS`^=OeQ0%tVR8?&+a zbALpJG#&M>r^FYS1#KDxYLnoA&SX*XB!y#uN`RVA0J*!_{|T{SlZ^Y~bM=vbd&}{u zbcp8UEpf=`yaBAtS}dCUj6e?NX#9%IZ#2{HlqDWL8!e41&Aad{4A9+4lJ*Y#>|(N( zYa%6DDE=%W>W{j8Wz(pAxU*B7*;8fLyRm!|1w2eWrUd!?bUA%%8MeL3+G_USUGP?r z;MVK$a8RMj(q$jryM807?B$=KMozmUXb<45h%Rovb~6JE>B#iP`W!Smd9UudK4~Kt zk$eVzTHI_tanBLGI~(6@KI6SVX@-RBv}^C-6`N*!n%{Ij{p!B91w7vH05Y?)QrdK7 zE(81c7Ad6^gAU~FishUD;+ut>(veIePDiG8Qo+COlqa3cew8b6>&91xI}4>*15c-dS7{qtz>bGbSR}^;y&Z{h_9O%$?7*wrshOX|)-ow^n9t|W{J|NXIY5_* z8i*@ss*@m`o)Ir2O-YrU<$o^?n=dpmYxZaE7;B<1YL*@s>;w`wrZdA29ZexA8mhJF zovE|KNtB^TQ%Vg3CMZl1BpG5MuwH_Q04b&W z!&R&?dI*$jnhlvnajdMIvSOD)iO0mzcVUk}nSo6I!e>v8t%=pmbi>!mSxGpvLN%;5 zydy_Bw}Ki3zOrI?o&TK_167bLkOi_{fNh>=I;sREl$}Q)+OKVdo#Z{^L*Ih%k9^_5 zp*s1ZJX>O8pP}inBcKE)7ez3xh=?La=OG6%Z-g)2%r=t9j}U_rC7yUIUx_%STS4m_ zl0ACASIQ%N1Gik05=;uMCYt4#(4LZN^2iT90Ql%NWArMkO zOdgca0l3f*48fIOP2!DHtihlRj$*B4!S%1-w>{5d_)K8TA7igZyDu|?poO8gIkn7Y z*6*YNE<>iA>;5;4f`6tDt_Fy4hKWz309^?~a<=Z$WTn4l()N@KTxOIoB@#>fIBW5t zJ-<1z>01Pw?@C#>9Wej-u_G+FWud{VnuT_5rYPU&AVv#E@DkeORxj=!C`J4eL@6ju zh?4b>uS$+3px+)Z5KtJ&i3>=VJ=3fV4UX;596Zq|D3P9q4=IG>cI8PvGUEmYh5Ois z1T)Mkw&WKf!{`lFRE2p)%jo`X^p>g^&rKZ6rm5)ertV%LhF0cS;6YnPUB!jt@T-61O6?35!7cbVH(cnr1j0*dw8x5T1ilC-6qM{3)Y_uh2 zA7~D`66Qv;_RT~sQT^9qAG|}_S!&MDRW1S_qKfWZ?=JH35n5d89HDlKq@P;P+Ki>( z@084%T0cqV*0>r`P{KN?IH?_kK7d2Bl=^c5*4CtuM!;1B4=i7N4<-FtXmI`e&>lT& z<)SO`P8;!LiKc;a8iN1?oM^~gtSvtb)M;&|tGp)-xXpi{nAClPuP761GFk`Xw17ws zW^+Wsu|%>Uvna0^x2R`7*}&Th9w?8Nq=fizzTV~X@>h1W`L&zc(tHo4GNw%@J9Bt& z@U2Pm2mD$j8K>N{L%?8z#3{mPNMWl?%qB^ZF`D4Duhb73)#7#>cXAtF{`P^T(2O^- zvV{-`8X5dGK~^ zjU!I!L;|C(S(rP*z2atbF9Bh~e}=4-TYGsnscD&goAC0WfOh#f7wnzH_0V!aIs?N% zh+D}-^LEn62b-<-zU9vQyS-UgFww#Q8Ug7C zAqBLO)CGy`FSwM*g!R4q{qy`c9wD243EE>e(HKywY^Jy#rZ@qtP}m*sfK0(0&oPlk z>@)MQ_HCJPZvA4JY87bTgbbz#N8|+pC>4G918V4qUth0}H8iK6yjhxRj*>a~oyv&4 zRb9)(K_2DVMEW%AG`i+AN}lqq^Kz5=>H68x`Pr}K<)UlBej)axnx*`zDU5aXIGbkW{nna1Bp*n=;7&9&}m8M1pxk4$}$NH&1u zn}i}~!r(M8rkenezb8htl|sV(!eUMipB!DL#R{pF2-@YL32z{@y^A*ggu_mo8Jk{0 zc^8SzmZ-4>XzA%wIk}p}P?a`~02>|~Snsj<#L zZ9((B5cU`rK?95bowg=y*eHiO z;GR*BaNFG~-8&iz5yJUY|_q zlA?R|gKRFn7enN(GE;(Vj^WhAAu|SUJDv1f57RZ2bxNe4Id6s2hoy0w)ntfwAicjE zt+Cw$#8P+JUFvz#<(AivR7((^kUtJC*V6T5TWK@G%9_JvYAF=R5ZL|NOxE_#!<3r|EL)6)a_7sDtn}{_7pDcLJ%F% zU9099pE%y1swK^t

ViHB`l3aEBk87} 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 P7gpD0a5-!Z_&V$VHv^iJ diff --git a/libs/converter-gson-2.3.0.jar b/libs/converter-gson-2.3.0.jar deleted file mode 100644 index d91c032aea2049cee530c8a32e43673b0813e10c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5852 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 diff --git a/libs/gson-2.7.jar b/libs/gson-2.7.jar deleted file mode 100644 index be5b59b764b56819e35021933772ab07b41e2e0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231952 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


Tx^^#N^nM%8YqGo37p@^(viQ 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%0AS16P*A^8&!6~}%6g=@rY9yC-f&fb|?IM4FVqdxE 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 p^p!F6`I&Cxpl09sv{%_dk<>o3H=? diff --git a/libs/okhttp-3.10.0.jar b/libs/okhttp-3.10.0.jar deleted file mode 100644 index 1c3cfb826f4bc8b69e0685987e473f304eb3ef9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412117 zcma%j1CV9SvTob9t!dk~yQghyw{6=tr>$w*)3$Bf?&)c~`OkmvxpVG2@5EaXE21KH zeY>);mQiV&TYyf}lLki3+* zn6e7JoH+TU5KJEo>|9qf-m;NdF|GV06 zB#@nzg|o9g3&a1r7V;mp0JhGij<$x@|DihOzpMUN8%%$Iw12DmcfEf;{}yCyXl!Bn zA3%7&;r}iEKLs#c5rjBHa zhK^3AN~TUO*3R_C)`m__G0HXyYl>KWDXAFW3rCF%kbV zpmxf3n>=Y$w2+GtVD*e>S?N=2 z4EQT)dbsXD+!9nkywr09REd)4;7weloB&ll<&5R$44R|8WMzhgd2p@kLy-4vxC8Xi0JsMuvcPep2rPpFKKXcFOGZnq-nWLwhfN{ zLb$$4R>6ER?t8%FOD5{#w&NbC0u3g{?59WQz}j6wJ^CerPU7tzJdDIBZ5d4jz?0%)+1<>Nj%!3=c70*)-=JH%hX=+6oNw@v-GDF829GnW1~ zfwkZ7pUzgq(At_z+|bzB&e7xVxi1&P1k)#oB=$Lw&c+lNf{8@i$RswF9NLXQ%$PySR8d6+R0dQLG$_nuPiei-$XQ%75ZT%8ZD2@%lq5nme~6tB4qv|ApA? zn(z3-_jqfY?|AF&@j6HV2yQ1cJV!2^2zh`WIS3{6rad@iWiqB;j&*}{7oLnf+926$ zxYb6dFDo4>0mev4nB|GSkN@I$68I`N(H<#`tTUvA9Lil{paUg!uZsxnBj<>h`ntF+ z>vlIf7_Od#6*&w%m^O7fLp+xpO*c<%K@)hlh%2kds}CXg&%$*fmtHGYU(OGj@`T%OKAm8;Qg zWrAeRU0(eHd!8GGkio^|d#{#~i?u7qWb}7(Y!TSAXgNZ&3cA1&?31)vP~{=&@2Ls> zUy)Ozc}H~Pk&my8IqCPo(4lV{h-(htn`u8_EB;D=m%jw~Y%e979gcrNRo$O3Ponr@LO$JTX~fj`N~uHw2@t z*U=S< zrlC3>?^vr@T{WZ!77&}4HbI{(s|u6$b<>(?mcL@06Dg_A8h$>ihzEg4B#`?V50wi; zG9~wkE4r9}I9`5~Op)@{3qPT)Ab*V}GO~{~bVC+p2GwT|VO^`moh!}+2R5R%9pi8| zQUpg;*BBy4USjY%)wr*2erx?~^^2O;_%WLHB=ee;#NyYBiWO+QC#`ZY^ON=|^EP^# zPE6Ouu2IYtWwG~%%3uKyY5HNfy$wYL)3|b#9x%97v$+Wq_xx6Rt$dr*4&Tk9W)AKP za=E21Y|nUTs-_;EHLt(87QCz&tN}Mz@3-Xjms`beF5zzQz7X?r8}RUC?D6dc6|tJiPf{ z${r2WR2pH7fbWd&x(8=u648oxGARDz^j0Hqet*_yp%Awf?OyEFQQzr;-Ma;uwxAs9 zv_(2ueAsKsFm*En{YY*_$7of@2s%~6^7gp$rWeK+XgcNQ7Nt92->Mh0@&`P*J>ecEk2ubdJbPe)q-XBSCx|-TVUf4J6Kv8+GVTw|lVj2WBE7zGc}HGqz(qf( z^&q>_Pjnm?kvGUJaO8EuLQ@^l`|WV0Us$@V?rfqB`c8~IwE^94*T%sgd{4v=gnv2g zKi%@bI_%r1vFfYej#>p62su;vV`^Nh9)H@)>i#9 zg`INsnns_A)lYS(!WX#G_b5+|s*n;eVaQ8q6k*H=);l^$U-FD13o+9u%&65W7eLw(2BWBoz z7uz2(?$@oZKrYH%I_-AS;jj8P0}PDaFz(!^eF@-&-Qm8^fjDy$fve$$dWDzUd7#|> z`@YVd;c1i4HbRE6k3?FA@w-Ucnz6gg*kw?6kR)JcJ17_7YNrAOQsK)q)0I@YNNc6e zo-bpRVn35(^}&!5tUi^V^doK>3C)8&#^YK{1w+As-}yKAmyyASj~#(!q|de5kv_i3C^T4)ush+kzIoJ zPZ#q0aqE}LG8*^ls0MK|VG(2y%J`$s)TmRXZyMmoY!sFvDLr5Juw`N)_ee*}QslC5 zxOIlRz)Rm_e?*zp5TRo_&Ct^+lIgGStS9FMRBw zRxD91_I1Hh^TKSVnZ_F*8StVKN~hx{jwYk0T;FihA$ZOP)|yMOCxk1-rNU>(8ht~% zdLn7{SYu(FITr6SWKF3{{OUU+JN!I6>D;!+o(55cV{EoY(r=Rf?jW3yx{m(CfpD&% znIkt^`<(TyVIF}SSuXYgPUF)l* zQ`s_okh7E_m(|T=ICSFSJ&_B;SDzX~4o-aDVHe-9i4A8Otz|8AcegPkp=7S%v~_?Y z)l_k9_`RGpuIUozD2-cyH}_NU-5)&$zmtc%+8zJcrL%B9FjoJ(wQN5zcAR@_(Lrq3 zD|6}AFPUxn>GLJWw-Aqk{&MTXA~Qk5ti34a*wxhoZiY)t$;-W2QOQFmH1c7yf$2me zRd%4*v=7F~{wF*d-_cfIXZvyyY%0D|Yb#kTOi;Pbs4+qldcY2s%LHV@R}bRM$n)pi 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%0A?{FRI~oE5$0 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 rbOOi@uYf?xb;5R#`vT( z?8mmfvR~yjrZEdX!Jk0hP@^sa4BsQZ$w{)_BPeQDlq`p##*s0QVv%XBPyrpN)Tw0cfDWF_`%2Hb=BANrk_UQKMoIN z=;AsZ_0QSBQGl-`)WISu#06(c=KVx!uy#xLK)(0mb?NO(%%y{3UM>i8p#_~{2uZLX zy$J=pUqYFx$;}v9V?X;_ZK7a>fOM;ynn4mX}6xs$`0iWPt}~^R!nK>T6n^97HV`oov9#5ZQNkT)g(rg z&mFVfLE6O;t+@r3_~7k{y`1QaTsG6x;)P`^-67Hm$j19zLR$W$t!Z9;H2$j(%3mNH zUegjD<*RQY)x3Nqc(CplPj0FaLG?$%&W*k{XiwMkW*5a%lnNrkDjxL+M(Km`&_{2` zzP7Y-iY!?|{|Q^)LQvg^p?2L<^dyMWxMw-#xZNE&RyROH!kO^a-Lpva$1~yL4k-c| zzoV)~-rZVPoS>jUf|&_iAts#bYWQj9nbGUWthdOGYjzC}yzi@Pu4{F1yolfvjO?AFK*gn0mALi5OaeZ3G@Z*hri2`zJ%9bYMVm7!dqY2 z4L^V2o^(XUT+dRZ6m%rV@)usX);iDhk4eQ-g~U-|@P*VLr$p$hay>L;3iha>oH9_y zf7V189|bE`sLz*&v1}1d0jEUe?^CQcq1{r zF+XfTA@nQ)4+st&f?RM&g^ffft|ED>yNBu%^EeYiCVD!Az#YxXaOaH$WwRF^2l7&T z!FtQbj&om0?s*WpeClQ;c-HYF z-?BEOD?I;-+Nkejj`YGxW(z1yxFYeQBGXw79<9tvwZeL|^hl*yThL`uxLuI0z*|ir z)|#oglI%c3hN>!c);`9dmcGQVBFJ82{It;;98aL?9DmesvM8yKzgO#C+dqbkc&TFJ7H##+{pZt9<4U@YeF>XJZ#`6g2*77AhH(> z(Q+Y;e1!N~a$8C&vPzqtNMU^veVXhqU6Xy9?bj(s?7b%|?9IQ^%w`EtPxk(JSW+{u z{v9!yVSOU1AilIZYK4tJBD_;qf6|#an&^3nY5Y{k-!2%@1 z{)&bZshgqrwy)zm@C4^OLU#GitNdKkoTBFlzfXXV-+4z~w!roFE4&~^jZYm8sJ*JO zVk(hVI9rUTBX(g!c7oZ2$Zabu3jTwUa%y9PtQBYJE*gS0JgbfoIx6@uK38GL~(pL*000k-o4m@-wfu@Z9fjVM9ciO<)pq$=^(PnEkJt>$Tw0-JJfX8a zWgG^r%V_{!X7{Forcj){UlmJ2Cs%aS41L!|MY%w+Y~rLucdqxfH+LXVK{Vv2>RLAA zge`H7vZG8UH1laI@!u=9g|LH%(n;{mDBV~rtZ3?@TT_`LTKW`|G>FHT90qtQcq?J) z=c;fxk;XZ23A7dnoiX*qzT?D)0{=}r1Nww)HraY#@*EZu@c?0Jl}7A!A*I^_yjmY5 z;Ytk1y5(qgTvaGudIoG+rLm|)GHC{AB}g5GwU(~?d<-t#r@g2R{XrZU_?8f=e(Gjz zD($e#_#1trVb8JFOeW)0CLBsr#$QDrxq%oCdvpx1u&LWmdw9^hdQA;)1-n#RJrRG| ze0K&TT1)EAnb4F2Eqw>7Fi1``H{GM^>lvj)kkx!pa zZm=8U@?+AjccfPI{~W>9=YCg;<-T-(i!DG z$_`21`pv1kQ{rz*o6*UkqOfgpZPvG69;BPPu&f&Mp9RlauA$343u_qXk=jjAMSQsn7~$S4AqvdW;?HbY4k+)<`**ymYv&riTDx24EA=v3!F z(bujESXE~vIDP;>$zM?WP^8jap zTGi8eMOR7O;O5ys>`*ElR6GakJ}5qhz31|>`$0#G>gT=js7CnK@Up*wY#ScisVZ!W zPc9()ey;Jp4?N$mG=x_7MEGXrbDPJ%Y;;W;^xd;>nt9t5(wMajJ^@wzCZ-qFlL)oC64i|!s zyi0Su!g?Gb0}6v46JaJ?D7M+`)mt;z`2WB>ImOn&C@mR=s$ohnOf?p0+z{8?K5_Rb z@sk)QMB;FY4G}r#lAkkPDevR6r7{637|Y)|E7u(5@rJ-V#_}3FAgpxS%Rp3$^$6_# zHss+R@P!^<>h~zOe)k#|x6=`|T~WlR9Z4 zsw$L~2FSx_qX|L^z}KTN4Ka=TVm}DjA2-(+HglHJAMKM?7G69*_1^;VC;|Y=`xYdH zir5B^VFaMh6|9vw5&uL!i-5ur`0SM^tw+!rmB&s;N8QWT!xP0pd ztvneN|8=ACubclgkLGB=`syrteG!~XYb4ehINKvEb-qAonHcfa18c3lXNW4or z3QL)uuAx&V(u^MTLD4}ZONyX1AeKX3-B8UMtY^wb?T;&8sf!ic)j!t1wR zx#i+|@mYNji3@PuySHz>3B~yerO4sj6K9KSZ}XImi#vY~jzh8cylJ%+H)WyDVp`=T z%PKvDr!aGo&gG%I#$0w1-?|aQGjQI+;;0!!;r?HYy<>1?;kU2bold7?n;qM>ZQEI~ z?T(!l+gh=0+qSJ0b<$z?&E999d;X{Dez;ZhouB8Ich+x=8sm95+8r@xWqJ%#d1u?5 z2>(@)l6&}zbIfwzsjvTww#{9=t98EV9q%@DIlS}~=J;20h{yAHFgEM15a_^jm*@PP zh_>r|xap}q>aq3A&~qw5(8DNMdvu`OMU(Z<`QepF>dv34K`dnZ+9m# zw&m9RdbhFY-V*`AbdKFNLF^}9W>3GsM})mzsjC;nniDhfwhDd3PH|A~N|n2V8uiIu ze9`^Z4;py|f(ZIw!%p&rW}cwFdbr5?XwCwG;GZw(4tdea!akA@sjosza~;f`wRJB~ zBPUNaLb{j0)K}nUCNHE|aIAnn$zDu_?qJs)$mjqZ=<4mLF3*d!mM zcVFP5My6v#Js2q`hU21jLYZo8z=kdCe+>k6`ZaX!{T1@xj3_wx~4em6h zplb0Y?Q~JvB7lk_pJNb!&GVjY-3EOpw7Vqv>=Yzw-9NEob*n`?y{pYM%Q(%YiO2^E z)>4&NXil{YQwbvy!>e~?;GX@C{|N?9pWdDH2+(E&cTC-eKlfG&)O542(%x#GEMD{& z7_OozRL_mdR->99A4`haNcs$uU&T>7MdrEg*wEv`%Jo#;?aeTkh%fTV!;2+`SM-8B zYde~Zsc@sUq<3-zxzKlMaTJ{=F6F`pJX%AbQW9JtQ+)5FqFpiK+{>bUd${{_1SkWx zna8=2tv{lF`B@}6siWKyQm@T=}ESJ9TE7 zDB;RD`$^4<>7Q%v;w3>E+0_=9W7VF&bZF4che8rH!c%ag?u3*%B!XCD%x8+FPm+Gq zmW(Y}B?}kkQxgX^#d=7UtLjI_^gyc9*%0Z{)n~2YL_8%~@1`(YMaCS~e3g~Z_RtFz zagLw>$6k~3zV^_W7FZTiFtuBXL)fYAQy+SHPttkYyS_qNu-X^qEk?Rhr9Mj3XUY*w ztK>-2reMoVTyY$RJ?|-H<~E3QlI8kXA<$Zh^OSN>fKO_|w2#<%3|8+VZrzr2`(2`dr2jQH3r8oSWi&n&PSuq$*xG*4oFDEE{R#A`TG{%41b7DcY{eX3%j|<~r(kjZTKHOyB(Ur&vR%Ph^`h zu}unYaSKBbF;*kQ!>BN#5uB=BO>r3J*f1L57gl_*&=!kLqL$d><*sIy4iC6RGMBgy z(xfL_h1^f{N>W`#l@B#KDCU+XhSC*WEheZI^{tsOOQ>j1cz7&`T|$0{jK8{` zEJ)0V1_#sBYxb6k2@Z6HmpM(|yPG%IO6imqVxc_G=wC%1mBW6c?hhdg;X zsRA5z*mZ!HMoDw-`;GtDZBm>+&4J_DqP;MBIx^zgcD9?1N3As?;V-%LNv8*_M1-91)#`ZoM)y@XC^(YZ?UR5 zd&n=7zUXCLe)R+>RV%9}tyKU1UejXlh^R-40tdpv1-KJeSrq|oFUl3=gSy|h3tZL9 zUCR3`O+}~VR)#PAT)+&oYW=p4MdQAW&?;h*AZHrP#+4Jge7d-Wuqi!sF(5}B=qiP4 zB3UljUS2yZyih|Y@l-K-nFS> zpEkx<`I>6G8`Vvhc<^wAq<(A_I&#N4d;|crQh(A)nUNl`e z)pGbF6V{qnHpk}IIgXpwMUyTr29Ig_kodnb-7hI^j*m-wdP^wlotCM+U$`!UJu($) z1^l56Y6mN`W;Rf!X!W=uTrT}fv2&k^%Rdc}t0bgab?S&%GW51G(NGsi9Y6ET89^uH zY;UNzJBmfMAg`?U%AA%p34+1*PCS&Wu+Z?ef84Kk(1o9aA+BCe0l15IH4uKE7m=?EwFQHGZic*(zj z&_j0r@Z>qgQ9b>f%{w)CkH2kOnJr!u{b>Br9h7%QSu)D-~Ao zgm*E`R!$e68;o)Zdtxipnqs@x`iB_M17fO;bVGF`*dklZmo4i4kaWX(y9yj^J$wbr zJ9(fAYz?Ay;-vXR1o%WIzeQBPWk3@eRc$L?`9^4Y#di`NTq)KO5uKcozWX2}9TvU6 zVI%H2I6@PRCOtz++_ie9Cf6cY&mJZ{*91(}N5W_E3=fgMA zYc?*3g1{@8DjC9yJjZVS#C)UTM1c-j<+6x=PWP*FD*r?O)6L%e3Tv0BO&&sN8cB-7 z2|;f{y}*|cT;^yLL20}651`{ndgB?H2~Pc^vIA%`M@E#<4e3^`ccttq`I>XmOLkb= zE`Dak()Y(=9_myq&pPUrVl_ z`FDZN#z0RbH>$!b;my}5r(TJ@)XWXydf>H!kK6#~DH9(C$W*=HjTvSoazBz2T6?-S z$?}4?(KYAi-*%F8V8m|w*iFlei=F@A$t>#w;?G*g62ZJfV|0y7unwz-Itm5&;Z&Az zWM-9 z4h>>GG`61dmYzw5#>j~K=7v;yCSN51@3}g}@XC`&84@a-w@KtbPs*Xa5g(|+zx|TB zI#o^FY$!rfd41!e>DyeAA5kGD_Z2jitLYhkeGJgi|7m?INn>w4eiz5RP<~VEWw25b zw}<{95u&j%Rl9-YbOgfi?}tYt=I9bcOg zMkKwORjcA1f?DCk*=LxK=v7i?B(+1Dnk0jfm?l4p^h(1{5l3T6s5LE*p=ln%6yX@_ zg%p+B!^Kf=Txt9l0P$eQ<#G?pU@CBm#oQb49<`s|ZrJ1Le3a((6nX&C!!0RqtOo2? zwx4{_Gi@`5D<;yD~Y1ep!OD_e?R!Zqsyuy>L zF2W(xjRaw2X)n=ND2@554^>^DteWQD&dW~LDbbCp)G(fUr)UY2)1Eidga*OxoDlyD zztgnETF^s6i{w@bwq;0;n~Yl!713^ocqKPT_oxJJm=jd0>FBZ(|2gl%ZW`&|2~9IbG#`{Y=# z+{C>WEwv^q9#1C&SnKKDa+Yl4KYl*E?IpW$&NCo$4pP5|ELtZ=@#r`r&}bKFL_TWK z+6#BLVSJqr&>(SQeY>vG=Z#d9wH?ww@LLmI+F`U;P3;MOWgK;jae8^uksbP_Cyw+{ zn7ae<7{m7RoVxPsr_IN86>Ww(_e2#>WiwbckC>jOCBXSQ zxp7oOYu*iCVAD#CNHS%lX7t4BiVrxEM0K!PdCrwBSt>xucX0+wK}0lq>?@?{a=a)r zCffVo%Dw;WA^e~2!hb3E!sU{e(?5YH)t|tV|Ie*N4;MyFfQhPusSUtY)7i=u;QYU~ z&QdgNJk^#l^f@2elJ=n}0>7HX=zYI7gNIZb&?KZmnhy~Q_-WPmgEJ}1Y|M;dX6tKE zRD{r-vej}+Vdz2S64rMz7$lpzmYzBl-Rr!+4!{05$jYt?cqGEZ+|D0mx%}aN%l2E@ z@yYRcHst&w?J{E`4X9mKxTUdJ+jI5crRpftAh6rSp(nwDL7R|CDvjn0aCa>vMA z!MGg!{nFJt>ehuiP-!fO5sK6cZOV@r;i{BrDB~jK?kz9Z%dmhKbShu}nhG=wb>xc4 zSW}hb^rxTRT<9X5?tGDFFhHlhk$&i@;x9bpwA&}HHdHoimUb=H&h{+ojXJT@i+i&)Xoq;&HN~opRI5Ao z7FQhgvH-2*o%FE80ctf|T^4E07Pkg>yjH8}Sz3D{35`MaoSM$_r%baVbJ-Tq zy1kts#C{HHBj3OuroP%3oa>;ObaWLZ->0y>t;D(kDnByi5%BlM5s-%^> zKp@)Iq%OF4J0?km+Z6F$>P$}JSz}gxhGJHX2~f(rr2wjN1Ffj>xdb zuNKTGE)f|L7+ePP*|^)~1`INj@fENWN^u6@PJUNV>t{IWQSKMRS4l83qt8tW5rCJO zKK}81Hz}PJ;!m||6GmYLl<-<>9I2G202`Q+jb6zmm-OoT&U}L_XXIY?TNEhx?BP);@Sw;i z%sxru0vE3CJ6Z(?_A`ONyyIdWty_8Wws8rjIgj)9lwE%!4lTbx#`+P*=G6>9zj2vE zRj&2iUB_y1JpGB3n-K-^_ zh1&seVO^3Ue;e3#_huo$j8Hwp9=ITbZ&++%VZt0O_DyJJj^||!>|E9P_IF~jTuZ^@ z$}KCd=GpWH?f1h+eM2UzYBgroY%5H*W%))i(dw~nI1qp64BJ7W5uCc^W?3nW+y=~# zqZeigno*fN1l*-4z*x3|-?&qg=zS=vqYX06`Uf}2`2!VaSQ6B&mr#|3XVj(F)in`S zsex;+;t;iJJ)}?jG8(Nc>vqN+^4~{z>2R%0HG6z2YTW5x8e6u>h0C$jj91Ukq}C_B zMiW4q_2+@`WL+|ZmWsy>Il&6-Whz9G%W*@7-jV%Yj}>d1+tQjUx^5Y=35rQCzHVQQ z#fn3eqNLW93^mXm0rbj9DR1|$Jj-!Xk1B@<)?IQmv9AqUy|N}}3p>ebw-K2_fsmfy&xdKfl~HTK!)u<8)G>>5 z(NezNj53E9Z^~7_uzBEnSE56wn>TPf? zXRp3I_3<@~MGv&+_k*r1qG_wn;#F(f#FBx0AkPs*MbM#rjP#$s8vNsiY&rVC}isW!X|h5CPRY+k6-k% zF1Lo7X)vHhk0W!d7Xx_vQouK+CMX6Jh=GCBl(r~E(TbU~o|{?5YZn+Mb9Zrz>XN7Z z0~QK!p`;Cyoxlsnw+os6bWQP`IioyICO;TVP!fB74Ff8CK-4VmzhObpx{^i1k*Jcj z+6u6Qb72;q=)FVMXvS3AQg;>*sX}3Yd6=2lMsqxr{Q>Z`mR)c1-{Mn>BEaCa{>UbZ zWZ`RN(_DdCqh5~#TLw%JRNzHIiAk0x_cjRlDnjuyujqLp%P-uBE@$UM(`>xp%nJ;O z0~O$(_BF`IJCe$tk{6L!u|j#_s|kHzS=r!;8Z{)4Jt0f@(9yiq6@-DM1>w!+c&xv% zk@gN_UfmZSVI)4J!z?Ku>Y{1gT}BA`Lc7<(OY4bd_vHDaJ?`*#3Oti`bGB~jU~1kg7$dG&MS^=Ln3aSzS9O<#D>7x)Y@9C z=6ik~^wKQ!@1ArKW#~U5?vU;KY}&rpnnLXu1$xWASUC%{;@{inb_pkYJRA{=+~_3B zS10G;bNJxXW=a$rJ6AiSj~4oK2h+v%Y#6cC5t$YW5C0sFv{bsktX$@IkBz*LDa{fY z|CWxvJl)Nk%z?TLxG<&z*(17fN<5A|$-0tc_#Ar@Nsu=y#;iQ;zfJFG;C(jH8`C8V zoZ{OGx@h`RTqK=1UCF^fy!x2p}l@JHn*D0*x*qq5r6C2Am9#iEb;n z`gImZb>?SZD97(r`Q}Qcfvld%j3?c`U%-Q3w0%-v-XI+ww!MR9R~nz;^A21DlzaPj z$3}nc(Y`0uuE0I(JnVO24sjN5wr)H=D*$}hwViT1?TyVv6MOo*R3}bz7Bo^k5}si( zWK=dJA|IpCLUx4<|8^d<);yz#x3Rglx_>o&shp#+XZXj7YRXWq7+2Bp58FYkeI(k_ zL|_|ui+O*iK=<#zu>$`Y>i+MzhoK?mz5w^-iz?>-kGS`#ST_6LaW6*;#^^Kd@iR8Q zj~|I95`Ptegc8FWK*banZ;F?Kl!HLU4A#hz^G{3||93tmmP%upveJP;T?j){6RT4l zML}G65azS2VOMR_Y~S1*t+6B`KkM^P(Hx4T8DT~j>~qu8neB7)Ch+k1f%G+<;T_li zVieVO$uX3O!FEc5o@4yP0+-{>v4jY><=HWXOrJi>ecg4;yfVz@eXMy_@6y602j4EK z=n~)(oV`=FPeG*c#}vEeC?A3I%?Zw*AxnX~n;oxp-<|s-bjvT?7QA#TO9Z|*t?GKU zCj#FYcj~pRetUDs;q%U8y}Xo7T$OcB3$qslnG_-MH|*|9GJ^jYmuB2W#Iw2^pVn z3)MbW6QA+cyU0oz-)^JAcCDXt!Zg1_sgH=zONdk9RwIRK!k#_IFGi?~ea=asVBLxz zV9ZAtQ$P;Ees$Qgjt)f#9H6lQ4AIa!*x0g}NQhRG5Xrj7W?X?>3|&a(dAjLLC}Pra zqEf4)( Y^rZ%NbA?2*|F=La9HA_Iq{nhB)g4Gd!#tuWg(s^3R##2Spn07&k^ zLVSv%;;hB^m^`fwpmODXoVqclGq|sx69yZ&pV+h{CsxRwn&D-quwl>A@S%f~;Lf-< z+mcj5_IprxyN=47ys8dkc|K^_EH4a~01DTQtw7mGO{Oxl#nLsQB>k~+*0Ro&-E+%H zI0=uelM}lQ=WC`8-*-12jXgDj(tRJE%#zXYUubo1+23=uqnCMbkNV+`&rH^{fjoi4 zG90-%y>*5^2|hR!COxi}jO@4^>O9W97!Vkw7W#Ks3*fpEL6b14k)}~z6 zOFNykz%zhKxSFY&oDQ{k{}Hq?H%m)GKl1zyiF13$xq*h?Byu{oODKzq(EFZgq()x9 zhmL#2_$)SP_^HwQRq7Emn&hblILQP4+EX2%5Iy%NE(|eXn#X4eRxKsaRxlPA6a+l9 z1NomtM$?{UMtkctM+MIFe;wKo_)VFJFhvIWrJ{T3xlv6#+ZK$g-6OPwt%y}CiK?ho zGIO~#Fz7w2VcGA`hiY1ijj6blSXHwGD-6rt4ZoZws6vlyx|l-6q`_4gSQ^(QL$^~GJY9?`dur30{7>-ykVFigcy_cZHR%Jv--B|p5*tQ!I`F`l2hDCBgr6E8+p`qEY! za9M|#eE9gX{7bHtUVBL&wl3~yiEXclX@PGYHVLUYXisjAz$r0Tm>$?@$AGg@Cx-(vtrykDxyqE!=hTcA$f@go3@Yc=P(fMLGQjcZwQsggx*JP+hOH#sM zOIYjdA!na&OrJ=y5sLYq8GiI|x_tE1FpCa=o1Odn?kQMBS7QiS6PJ@#7lu7?WkQA2 ziV+JHpD~~{PHr35`ctGFO9X@6l-(#`FJEfzRJDJVw3O%(P@?Co8~TYCue_sB*JX;) zfJ@#9C%(RQ(VBya)i;(IFNil3h8ngn?vQsC3291^!Pz$7ry?D8Bc9H#U5~5C5fhPCM7`rd|jEoFod-qEwhg? z*oiF60DmhJxA$ge^w7r&Dj9y^av<SA#<{Wx^T zIGqOXat!KcW64eP4SRW&XSB{u2Z!b&KErljBSsIBMZ>RKScd9!P_g=k3fPae6N=x5 z;I|B7adn~P_IWIwi_klKbRg(c?dwQ?9dQ8n-Ku1rLIxsyPjAbO&e1ZeRXln1$Z_jA z&v9ALs_pmm>Q|5>_b>ep@;HQUulpwHjGo>P!jt4aSU?@LvzK(}nNbFS^k{!KlPcby zI5;u_rw905FCg)Qtvfn0+iJl-rYK@eZB#C?B~Y-@o~M1`6Iug=%FKx<$TSXqaE1S4 z81{DEKQZP|lzqP0igbc#L`F7?E3rLN1BxFraN*zpC0RIgq4anM~5 zY*0bHa!*NVuQ7z}>5Y`&A;BT7I2{$}87gh?jI0oL31!ThncSLS%}`F4_U!@--vuOk zqVFi~YWKtasMJ*Z%M1%e(8k+iWRzLI*oFLRSsT?fte8eye^Z(=CUS{Uw8OYZ(iTXV z{P#-b%d-whV%OWl?Zrxo3H%+=#e|b^puf;{^AtrFHD|#?qD@y z>C@9rfeZ|;f(_6NJ<;KAHvF^<%n0*()+Rcm z#j9ZmEE#R+Fn1F@Z>DUsAEJ&wDpZ`}W&9|j)^~)rwxm0ELz&y~k|N%5hA!~8CaZP_ z^|obQb`&A`g}MYHCL<%{hwf55Ay*HSw?aleU!A}^u{oYWjg)t6xdWA+VMLm<2c&$X zjESeAKr9TIxStET<~2KgRJZY}1pZZZUgVc!;>Caj8w7umH;TCi*{a~#hryT3OHP?- zVK>7f=S{@as2^=o6cNQZqcr$kVr~W?liInES`!+BA{;}DdEX?Oo@zBBYuTf+BjbG@ z(ehj+Dd+1!GUe>7f?4v9S2mtw+u|yE7G)mw>Tf#=rFD;f>8MsAA^g|1`}~;Af3%kb z@;?Mfqy!acZAllaF89YF97e9wo<f$X1@Rah*N^H zZb_j39l6wR1h(56NfRTmg;I2$9Ds_`^fKYdn&Ly7gyQef5hl%6jq5dAT48&O1p`ZE zBGqu0r2MW#e@QaPH$3 zEQCXI=3)$=l|Q-*4P=zZex4Zmu9pm!rLfiGxMQy=-la$jtc0q;X`6}9IykP-LN?z1 zBf@-MYtN*`noAi}j*BFU!qOBBLL6UYV6G9Ze${TzCv3i` z>4%>ty>5PL77vLo%KQxHoO(L-UyC;|2IBU+AC9Dru6lq>ulzT+`KS%qu>Apnr9aoM z9W%l4u!6c=`P)dgoxtt3#2fVp1K}a}zdy09#|!=u!xGJ(rxu|pmuBchRUJ0aF3D|w z4?`NCne&x-fzt8i*$xg7y_Q^wJ5pTaGZzdrkFzBP#MukCj<&=T&i@iVDYO?1by@{4 zO6KO<;jPoB$59IpjIbCgP(jA$^$fpk*Rv7IaG(_yikV z6N#_NQgy36P@Tu$efUH)N*z6UcCj$Yvuih(r%9Q^+q;SZy?&r|j5ygY1By^PI{IFCA%GFM{WKhm+~73{Hog zsXxV(yL@lR0qcomrnND%o^_CKTV;b5+n$_AZfmn!{wIh`9s%vaQv_yUWS8*t&e7n( zXM9D$*+tSR0%Nej2^e4>(vEThHU$fufGxoOCqNdDrQjcqQ=(hJQ-1xyj0c{~_5(14 zJxBfUz8T?3EC+Ib?&A0M(JOOL_G4li37tJ_pbe=9H2FQDks3#9y>6jT=?-yl z1QUL?j{G*tGnZ1@5G9_rgsYe@!z}qOx=FZL2nx9e-nM*QjG406OG0Otri#KgX2pm8 zLGHOYSxJvm-3hTTARn}(0EB9`RJ&f)a;fYPwS%uH_&cJoI4Am1d`_q&>No$@4UalT zu~R1%H8IRVp3dwdSf`b6*(Z48K#9t>0z`xs`2c^D1D(fYrdTy)y zhLcJzj&JJF=Abnows}{Ga$nJ$n7tw^n%T~3YbzUhEh#@PRZW%;1=SRzB0V%WC}A!j zP!TFe>k>VU;muU0DzxAXlM;qG_nSb+P=>p)3cA#8KiMFSi+^(jTu zSmjC{gUnjezt>74_L|nZRuX~p zZmVZ+0YtaCdEC@Vr$}w8kj*;K=Vf6Y(Cu&{PGA{8`oKg1F-<9@qAWS{+{9J=sTJm=UZr2Rw$Ykq8gM&?+~= z(4cLDvO%vJW(2&;^w-vhQ*Oh0J5~p|Y1JBiL&Eb~3%NwM9dTpvFWS?_hIKcR>UXGD z9l1f@ir9U?{H1g&`7Yh>!uO8TDoxd*9vsxWR|}i_3Fz;OhBX-2rE)OcrvCA_A*3NU zH#cmU*(E?o4XKQR6tiG_&M{SKWEZ0=DC-5<$Lw9SU+|9c`>Lq=t;4(IK$9G2^J4X5 zrLaOmYK=I|gR17uYLWj1PA}%tTYJj8?m(E~HT24jCepk2(Vijysp8LQ%pL@e1C=M* zKT3=Nh^zKBg!ilLY%SW7{l^#sLrSQGalWyBBv6~$VkYltD~VVN!xT%mCOwN3>WfG) z(NhsWma#*Cl^YNc8)6YzM7)GK;Wj32rJE9a3?QW{UyBoaKWZy zju5lbM-5Idp-D2Uk^@mehp1GsMKSC5TwQXbqs)O;;`nG83Q#v?J&|uiGi#9FO%6SwBE}V^X`dL<@BN1q^XwYY^B~%LY2r6 zal^ruX($0{C)6fEjI4942M=y-sIZQ0R{+&+Mpn$^1!{WcrBUm($@Y1)8>!4RX+Qb~ z^MU)EhIE>|#*0e13``g4>i(N8;&GGcy0hgCraO<=%-Xs8f(HtL!!WlUV9+!kkLu=e zbkXY%bSY8(nE(|>xqN0ZCys;Nz!sB}SMhm2!@>RVG}V|7!7+WG}={`pYDjO+1BqF|z4lbAX{{7pevoY^b%{mqu$Ka7g%dFq=so6`5& zs+CA+nR`mh1D5p^>lxO!#tKGnKz5ll-mm86yEGDe55&R~Mz(|<1taTucAq}gz&0em z5A*jo=5Ifk;C?V;g_n&ZshSd@)VC<{HA>lF+2==4H@H4^-1)t+l-nOpPQW3e;D*V=qUUrs zm_};c6_-5GZJwa%S3L`-ELM+K5`kR%8)Di-bNh>;gRW#;smI^b!~%b^Y~Dhq+@_$u z97aG`FeAkwg9NNMJJ+Eg8IGn8^;h@N5MR>ceL_lSvf>bcK#CI{?~^Vd2M)Wj?iMf*t9NU|Fzv2c7O5FJ45blVY@GG?5GWzr{=bmUMBVac%gi5sk>ib z)Ps0tFQlLWDD6DOwK6RpTq+iG+hUezElwgo_|1(|wpWOLhvqmQQV1ieyFJIK@zkEUekK8Hh;9z6*KkKPE z+Av1R%gq9(dB=G#50n}386m`UUr`3*>saSQ=t(R|q~q(xNSMfy%v@Q}DA6#7t!YhUDS_h1qM9b_&!KD^U&v;hMh|A( zW64OT84QRn#nGF=Xz=ftnvORIO--X(w#>NTi{04%`y0{8JKvw(27g42|+iq{m%dDf-;T3NhqHV3hDbwDqI;e4lo#R<1YLIcy;ww%AX zl`8t{(A|oJ$B-W0pvYw@U*QS5VQ>$7wB$Uw-NsD;yD64`!BslR)u}bQ^}K64U%zWG z->PeIc(wi68|%jT4x!-$&G{mhp-0;6xj0(z_#jKaOZQaQ^)FkJzmo^q2C4#6MsvLu zS3Mc-#RaT~ahtu>^u#o+wMMm0M?>Iv@B77E%UlfDjEsjA#UAb^y`CglE)1>S8npE~ z5~iMpP($BUY`%Rm0>}z4m{xCol>HI@q*X>bb=1rO3^TD~%}k7xszTu9X$dXdPInFW zaFsyaugN4sTV>|fJs>EMf*;B$FykH3-#-CEV%~dGX!@|MuVY7p%~*H_BWt8IS@30H z1$I)JZf9N+w8+}yt;E;IOeIY&1ZD~!pEEk3=;$L`1Crj46SUe2I!$f3>S>zTE68Fv z!wYRhA|ql{rF#aw1qTV$w|~>KRH5 zIE*^>OszEBm+B7zZMb@kTjo*z6Jv+7@;xHjfkmvzXF=%?0+{Dgv7Ma*(l%ds4c7@| zC3psGNc2(8YA7(HDMiPn_@Jhf%eLL8paJo$xE)2x^UUrrsmmWOqdt35kz*@hGf#1< zL@ivKK<-tR*opi!gH3`ccXsg&qvv)U+hFIst|`yhW0vpq`<5(fM3EAtjzG_Vqhr-6$(J2U&V73z``d?&fBbY;J-(t%hxpz}`9)6soK1JNwVJ zA}MMxM3p0QnsgC)Q)7LzLD^5~@a0X9Fww}E63T|*CT|53jL_l=FuvAqeUh#~StuEKspOWPu zfux0KAM|gO z=m`KDDoz~5&5l}IzZJZ@mJzgA-Oht~N0zRJX0IplelI2Jtuo%sDeNcY#Qv>4c-mb8 zbG2CAT0~Atbv?JCqzT?G(o*#e*!=)$3(0W|rV~WRL@rvrjtvx(s^SQIRa$U`3DCyh zg)Jp4@Y8jZxi>Ps4?t-z!k0x^Ja$Y1pXwz&%^4*1kWHtZ(^72HE5)(Boe?I1Q_OqW z{><~s9fo@gvvrUVMh4c$pnY;Ya9lf)-We%&=(h3eX z&yADpY&p-Jya$R)&(g>9N+sp~LhKsfW34m2DD=pl@>AS=4>L%7G(6zlYhZQ#+aS%j zSVTckY9ap@cGu1s>4x=%aDC692Wg3A1?V1%I(5|4 zj%U~5{;PoHJ@ISzxZ&|2gEdV2W47K^#ELK6-|x6-E)#9Q;J@y38u_} z@u+0AcLe|O;@+_oqCHh;Frvk7)g`rK)^U-qyDL;oPWya$7Q|KCkYgP zJsNW1Y8bD5Xf1g`bPirbWO`l`Iux_o_pFe(Z6ep#}@WG~gb4XUH0#Y$Ywz>dsH}Rqu zj+{CsRrdrdA78(GqvjBosg{uft-IL;Q3pp({QV4Y{d8>9Mvb3j(Ysi7CIK0`@^PLw+znA|}eGvAB#MnJtROwQ33gZM10dp%|bhM)^NM6S%rN#7bm#cIfJodInVp zC*k(>i0Wb_RLeucry`_o5ar>rpa=R|+0eq%G|+d^Y&4K;Y%gOcO_8~|RFkK=$u{4+ zW2>ntuX8W446La*Sb(@i-H64F(UJqK`F%A?n7X*c3msI6eYf@^wXtxw_4lW=T_$H< z!v2-<t|HTEj6L2GMiMyKM_FlV5v? zwP}G{JJ}U2eB1RvPuXJiXHMuZ^+aP>6u`34CR(LE`fD#F)o4dwjG#2yXQhg>d|L`PkQJyXYC4o?bXQ*Jw3 zhshqOpDf;iBoXvt6a!(%5Q*Ppvf}Dzl94TDC1-Gc1(xvLimqWjQcYn!*tkjlY`-Zp z8>y$&g*C-!^V@01Bx$W+*@Z_Cr85_nV!cvign;+zWI*hwQW?Z;B)vkn!RWNrC3%e_8l5iC0*Lo=68HJj}^=@*d6p+$K3p%lLX| zWDpDjdPr%V6g5mv9S=GiQFpUa>{dV7n`Y!YX(?Jn3hzQ12c*BXqMo5OqW{sOg+40v zHwoNFKl`zP((V_E{AskA+=;kt;}p>DUdM6A0{P8Mmbutl1T*X3?j{`K^8Mf`UfnXK zB+ntdgH8^Hy(m!k&}0 z`3BOQiI+VtAtPmrD^@_$&27^FVI15SV#f1_X!(ZK6lL;U`udAs@8K;Va#lqTL0*)! zn5tzk1KTm*wAZ~6u%772;#R5icJfWS8Y$eSP3Dv=k3nB5T66xX^{4!n1|HXp zSM-HvxXTMV(-Q%L(Ut*uWxn(6{JpQqKa*w4WEYpDlh-98D_0|&FGmTerfNmHmJzi7bX4>#ZPhpX@$b=_j4kkNMOTQ+i59IVPsX#-8#?(+Y`*jvU# zqPEMTFoU~8V6?(Q%+H0}RqpMCfGl6#YrkWTp9Pj$VI zR!OKl#-F&|s|dDjrOlt~c+01{zHR`ViIOz1gIPOf_se)IN1MR;8V&sUjvK%wo--ck zgxWGZ!#1%TJ#)K*7f<;8eQK@Zr;ccNMYCYC5h2mPEyy5Tj+YtzjCWHfn7GJA`B^jZ z15WD&C|_uZ81uJKbKzJ&!eD^6q4$X4qS&CY^iX|Nm+z1sH>0hDdJ5z2L0R$8%&<~= z0`Re0_NGq_o~KQ;{*Y7rn-^7FbDIXu!4uL9JvF%A{*r%GNCS8`D=Z|twI*^4 zrrG|;&kWwoIV&?M+*(j;@2zB5GE2!kc-aA|qNwq_`M$4QMiZ)|f&Ox<4~`hD=F#!% zatKPkQ=$HpA*lX?m-R8RI6E2I{iNKI{1bij{wNYUyD7HFAYDq0ziWymKb9UA<2k~U za_X|~IpU>6eV((0`V(xS;4C-gj;|Z(U zZi7HXB%``~w~C?;(mPy!cHf1sKjn>#XvhyGzs;VsEkdsk3dfVnIEtSN6U+ITACgPc z*_7fxi>yufB^|Rbz)!nnJK4!VYeaFk<7p!8LQ_#$B zS{AZnkr(}xah)Yt7Q3uT-!xB@uM;w#Mzp8roG?fHh(?KN@sr4B*b(N>_R&RgBivf77Dh!_OLh_24Er1iT?l?dS7G zX78-L(Yn5pYuq3{3x6;%Z2!0w_Wg}{?bWX7bd7RQY`*Q{wH-WFisdR`!UH`F$weT_ zx&|xYi;R98=@;>AMxASy^Ot(x4T#$TmJz%4eSu05E&OtJtn2|z@=aeQ?x`c%dKJtQ z{Pb*p@$HV95c0WRH>m6g8Ijylb_=XvPWOXEcuBuMg#3g4!h^xKI#r>}aw^BwH>4AO zxWMYEIikn|ZLe4rWUScg+2I8tuPZd+Ev4)g#)3y6?=L@t-p~&fmn}+u*=$9o7Dez@ zg4t%!ln~pc6ZjyW!PpYhsBZHTs11-m#RkKy+;2^56`RCQafjvM*bTnC&-{))*b>J_ zt4qhKR1>;w6kE7{$DhZHQz?<><|WI%Y18N+nR`>OJkh^BxIP079TwvdE7X%~Dth5l zuHu`%kr~^(*L!z1D#ETdH{?`;>nSMmF)NBBwV9j|d9o-PZ80y#1Pk?D(q997 z=9^tJT>TDTHZ+$dXkLyZ@Y8nP)?O`41=#5B+VC*Y>R&e|(TPSB6EXtHwHeCiviB_?!FrcUx*JXuQ~XGybRS&f6ueA3A6>@|3$ z;jXH{#7OU2c*hVDAoXrFMtm$eTJB1wTw;4^<%~D)T3|BRLMe~HCiL7g*fUhE;bSr$ z0!;{U}}I2EpuqNZXnL#8fD@gtm|CLJ&?z-)9M!Sq}**wp~OeTx$5?;#tZ z-WWGH2>aC-;4R+r3to6+PtvUkOFbuxeYxz@bnWpES8DTP>Bm@hMJny! zJ@lfN_OS24eNc|)XS-0bI|vB&aJl4@_v<6+&)OHeU|XY7n}Kl)eQQsIeRv*_0wX-n zU_XY6pFBShE_Vs8;i<9C#U~u$V&3>T%@HQVDPQ;l0*DSHR>jbj{79p!14yGR;?BJ6 zcaMmi=(~gjl!XTSs^((V;s66xGhHQwD*X&|3aW9}w;abmKwAjk=k8QUQ8_Mq^6$2e zw;a;If?;mHL<^ajKd57#8vBDGvN+A(fTMV7aoJXXZTTQS1@Bn)u@4M+VQHn18#_cJ zpq~_Z34g0$J8%D$L8OAUC&;mM=D^QuIX1&r9gakpLvtpwa^5h+j;Y-+T6`|UsR zjkMiZbfPq5^9!=JSHxNtygBS^P3kDml`#t;qg{?7{1I)7xqMv?lF6*k1Ax z3%5kW1k9JPzb?T&%!f(NT9vlmM#}11u+76K|_>TZjB1I zOntDrSWto(y`xn*zGPORe7ie_8L*>x>S)aEz4T5)!LCqqebgSHF;Tr!(Wq*_PLNoD zJ&IEd;Dvx8%RTd?%7kt!@ zFQZJZCAm;Cou#qm#cryPnXXv#uJ+L>X?4PO60j`?T48A~%~zx37(_s;O}o}cA@rUxJha)JMVH9Lst zA%kiNQsu+U5GiIC&P5w6<>gdI9l)Iy)vgJ8ktIpav69o&ax~nA< z`DS#IHriwZ^^q2B?Af+67_;ZA#H;ywvaj`I&Wbwh`+6@1;xdTBz(+v^`qfzb+``Sm zmfdJr=T&vyRkei35+h@;zrYt;YUi`82jT^-EnNMa))z;M`B`fGdE_YTWO=4lzj%`S znY>Vw!ns*+@kqwnNdDYYE~rf5+QZGChc zolBlGsmL<3g0I)KDoAI-NAqzLzuP!7V9McL4bi+6JoE~g@CkA4rp9C$qmau~LB}84 z;!z=QKnfvuFsv#z=rk9WY9o8OpgZxmIqqh1-p1ut%=41AYkp<{pjnGF32}Ns>|y&e zi5sj3rX&belw9_%Cb?t&A&G6w8U*58iEl|Jt*WUO+XU=bhxAzIrq?5F6x!gSTs{=l zo80S^Kqiw^>V`tRAnKl^C^y|D5%I`GCdMgQzF z;iy}YT{T&&m!gtettXq9xeH=1EtE@3_(d8_Y6G1$cSfq!x&q%;XA_~WDyXQaDwwmL zr+z@K$sSxrX`!U5hvl$&pB;GjGR&|3*gO>`Nh|OtABCNad-OV5^(M)LlEo{H+;# z3k6{dqy5stUA@okeL3{#Eye%x`I@(rp`2j&N<^TtC)VVtX8OH9Hhb4x_|1vHcW3DJ zT1LP(_y_D?yPyr&+LwwD%y-SOE$H1#@Ha^KpR}UzAEb^SXG1RTQX#(&)_#~gmBUq8 zxG%(-J^(++`?kQ}5CI=leO)F`O>m#_J8VK+>S0R`85&^v$RpHMP}%w30A6g54r?x5 z&$lOs#osWjvu_rCd;B-ovcb$xKB}aG>}r0_(Gl;*c|dHrr4rG6Wno}B6QlJ*%Jqx| zscoZZpck~K1gX)WcAq$}?I84KV;H)zeR!a!LvNH09!b7oKx0Qmag(tXhd(#eK*e|; zGx4G;Nd_bI+-mEq=gZdW!eW!d++b()a~@rforq4O?O#kNbYU2 zgT&&RBc!w!Q5V>ae`b=ROA({L-xSu6pjM?O;Z;Lp$ca@`p=~VyWD2fi9{YupSJJVt z827FhEr^Yfi)fYyGiOo`1ng z*liJlCl2Xk8c}&GW(ZH&J6O<|+E7V&CN#5aSjOW7&7HfU>^O{wR(J$s*>EFZUH_6& zWx@vLrf?aE4N%S14phsCN7ZajlgTRRK+!lZq*!Adsa$S0o5rw4rhW9>WhuH4!w7%S zC$ed&CJtI3Iq1-?xA$YmRTz`wpv^Et?h{F;Ha#t(kPetZy>xxAnvglV?T1q z46S}sDO>JG0j-@e%Tz!L7s|$jS<1<-V|ZUZ$&(*=_)Lx=(+z;W*q#e>4wG`{&!58r zhT?J}EgxTE6K%r>OXG=B3tC=GlhFHzi+BBH zr#~sTR|kAvR z$NYVErd^ZK!zwYPbIr~!yT}nOKL@1GtnBNSk3Kw6l~Ti=SOS8ooz}-;oYbe3IY-R^ zxLu87V`NG~82bvfndS?{PwIm##r(OW|GHS_6mnM})fb8i3sJHk&rlYNIibJe{&li6D~q)jiXO;`en#~E(;3g|6fJi)t--_xbxo)P%! zydDeb3}+ZBe$MT(4TDF%H;18HXsoDy1Y=5}=75(Sh6$t(8BdYdbN6H9;aJi}$+e%} zZ`Cl2iM|Q8hA5AcL?3cnm<&>D7z)#%n=Van9JR;)!2;V)cvJ_FM~dgZ4-2Adb|j5 zs%z?Ms;ZE2QC*3S`<41Paaxf6TP3ctH-mkt!OF%Lrq7O-nGe8I=OpE)PRyILv}b;? znJ+ds3eVXjo;8f4j3=ZaNI(`l!cf8z^3$Y~8scmLy*bLuseCx5(k%4mW-5<$Db+7M!WHV!g4MDFMH7xk z_}P>G%xyZS+u7h*f4vOGf}g{})ilAvDFO}6uAPz-DbCb=;u+a^UTOl$hl>RIoZz}y zEVJKH*x$Ace_epF-S7U5L|HsCdoE?Skg<|ia_tdxHW8iNQR^UD3nFQyxeuH5r~~e{ zG+ddqV)-U3 z`}huch4uIxjCxOZ|2&L(*HI+)L8_7|IEc>%+yATXq&VT>$X4$0bt^c}8|nc^(!VFx zej0>{pY`70qK4={82^~lyFtd7nzXD9UL_k@ z@!x+z!C-sn(soCb)gk6RY3k{sGls`fXcSE62HN`mFP@?!(>AhEhE)j;(3_K*f}rQ3;i+B3DZkN~;@Jr0vdEAob)~F$Us4MSM|MhLjffx%~3T?fMMI^8(Sc zLP*UxJf5e~H%Uhy^ED4)Uh^MwZr*7hr2PlRVRvM)!>0?xFR40H#kcW_whF z-Y8DjY=a-fwqJgG_I?tVuz*ks7n-&SvvdpX`O2vQvMMdM<@z@pz+J zJ3fkfmKl79H~xgVz5Z5qO}zFLs~PcoS%9H#Lca&1eKg}^a^(|o^6DpZ(@&?vk5I18 zK|`OY^S9QU6;J+0N+&rFQ`+++CR3a1QA++l?X~`adfxF<85(;e&HfeSotkjx%>@;X zJ#18%es7(|n*D=I_L=U)LoaWZH5IY0S!5m3xN|G6JjN38(K+6-6tT0O$F(z{T-~=5%a;Ymms-ZrM`jKx9nImvs@}+Kq16Q=A_;6#^Edl^5kU9^js@m)KF!6ZL}(Fq&Bet z9xc0s0i@~ZDtTa{V|AxM*Y9%@c8$+fC{oE{iXGjb4A1ggDD&oW=1u@1^zx@#fA$j- zE=4*Og1)(3$&(D#ktzsE1hQoA9-~f?&%~Y1aFdr$QAYDiOa~E2Z6;i-Cm%ZMjI66? z`mJrKI9QDzERL@)e*H6a4b7fsuQO6-fR5k8+!By{v<@<#)l+7VQm#OK_B~@#$a@re zOhX#-%B@4Dr+wWsD71Un5Oo4Fx~YIX4aCz6^~QA z(2_y#vLkxq<(sA(2n*mLB%cyv z+0(z`x5`?ofJ7OR9;CpApK>em?J+rR-n(v_?Zohh>B-rTkkDqOy1K2vb`P>YQ$&rG z6;s+2;1RWArr1vi7%t|6H4(G%R;}U}t-9&!=hzQ{mHnqq;fT#Bh%G1_2Pj*6!e@Pb z>r$&V_r}Eo8%nQGlZWOQ3OG<3Nx@570fGmz^}0WC-qs6jR%2OW2&aF7*}U&9<8o4j zKa7%cf2{!Xz@Wf0GQCGD#sa!SNx{c{WUuhaWGJB~R$=7d^TwbO+^{Il6|9cHpeIID^2ka_u&cd|WJXVlFx z&>e4TDgUnPp9_V5*L43`?P-8GF{^w70kHuC0RjBG+H*8DF|~CD8d^L3pCbj;p9*t| zXnb}wr|L9wJqEI>Nb}cq#DVaN;c+P`v<4XoPnai-nC^L}@Vn~xW5m+QBa=cktf0=}S{10f;lDU;ivW~|34YS)T^0YD&r;kD*VLI~Hm zOkLbyUIZEX7+k4&FUALKhzan*PiVzOJA+6Em3`|pgRS{>(pnR3WFeynh?i0scS~9F zG}LQ6yp%C#yk%E~-9~Tcu!dQ5V8aB*Cab^-C@WkIf1Y8bo#SWz+evelU(qwXZV*Pa zaouc{ZVnpQeBXHDk&W9laP`nt7KE(BDSo@`%y)s)mK$4DC9VZGaO%b!b!X98uVeQT zrE1F|C65hsDc)m$rXf;myN{I~Ls1=Ktfhv-Q(!D5i6!oPQe)=9Gi+!sHwIS#EEmb! zFqCV~)x<=^P>;@!<54}KU55jq&^!Cr?J};&GpV;^&>9&O3;>rthR8ch_wRj{E;f7i z!3Gnq>1)nWg;?Q`rjaS57f5;>e^A_fC+M91w~CYYN>b6=3~|@DL3Fy-r>p4@rK!ix!_Bk56t0mcP$3UswaR z?ExZL^BjCBsZ03WfS3Toz5xp|*h?Cfk5oO3|u2lT-?H^?R8-M?aOk}=`%M(x#klwG`xc@-rf9)_z8#E!qN*eqF}>*7P*hnb<&L+?tQD3^FP5UkRW|Q z1YnppQ$QRFv~MOS&%9XdTpy0AE(Ji&c7(v`FVyW3)A297mT#&js_Pj@QgInMD;}5v z*A~9_RAUcIw#yCq81i3r<_&A-h*ZY3#HVIMZkUi7hx{$4L@6qF$Axv|_~yecoiLKM zweX@Ev9!*b?Tlr~B!J47KNL!wbxc_VHn9lzny?rv?h=6NJNV8TKZg=KQl=&Hk?f03;rscj*?7A2+OXN+rSOJ&0HB*7*iu%67|NfU>-gx(61-6 zo`HYZZ>=G+k(DU@MmR)Q8x{YFm$Q))TgflMmA{Q&S96xsI3!&{2xqQ&lSCx0C@f_%u<9N^3lK5w(`rC1 zN&1G1n>zG^a;cG;bw>?{dZ{{{5>$WvH~o@^-w#)n4_6lFhUa7l$B$;QUy8dRU00jw zj~`2~1Y4iyw~+W=xZTdVmKFmcMwHE32tSmr)!>`97g5$j)(%$i99=>O>v&|UA>4q= zVQmM0tsI|PBkW3^%$P>6=omUHawQz8o?_Nl3JmFNA9wLvZuQU~%bFEL$k^R$v?jL_ z``)n!cR?9CF9!nkc}b-R9(EzI#SLVjJ+H$sV?Ars5^PmwigO{>*vmIi{$&C!iC6=+3 z2rI7Eo+9OdrV2In>1w&zIP+vblsaM)YOAjK=5-6nRrTiFzIqSEbwd|1I3558xcr2G z4S#$8NQPOa)B{sbPyS+@p_q1G5pw*Y{D`9t@>-Nclzkwc{C>n}VR6amZ6fm8U-sWx z&{n3)*5RUgjfOf(K({30l{5&Fwv}p100K?{NpbN?gyuu)x4QDs^~+`J5-o9w25}y_ z6G|E*dTG}x);*a54F8A+i)knZmfhqxc{^&?;XIH0+bK_@RHytGO+C*u42AK>H6s#R z=k)yvr<|d7T3}GiRUsV=PJCsElZL(}#JLt5CUkSYt7J&U?zFN0EW#R8rM^Y~?9xq0 zlqlr^rG|?f&cM)wD6=&zly7q&5lgf7c7d)Mp6hyq^TeowL|amICTz12bD{$7Alomz ze6!RcyhUw59$Rsyr#M1I_x`WDAb{*3U0boxp;=$>vuZ5{3XySHwe^Nc^roIE7Ec$kCj+3J0)r&Y0GMr`P;BzZt2JnJG~ z1{A?cht;Ebl&(c8#_wg-Eh>Eqj=)rFC(W7AL1i^QQRVV_s>TZzW3G+{C#}GWQDc_J zN{(QkVl#G7@pYbED*yB4p52EKQes^5{cCTHvI>BWg5HIe;)eE1A~0A@L(}z`F^Sq< z{+=oM0r}cn{Jz?k_E!;E&${O|;^n~{>|cPk3LCie$QmwOv0*A!PmU$tj0vyBWD{vX z6#u@mN&!CJ(GCQjjb@H95k`$X!YLSf*X*^`oA|&OH+?S*UUm-|cV}3+b9;b>T6@u+ zOMC8~T+6#oyI2A42lcnTSS$-XyFF$MM;HohXXianye^THY6`<(o^pqd?q#8)rs^L< zrZy9iL;12nOrfRTXH;JBnOT`ep@Kb!eu%S5e+!6$k(IR#co-TN*p*F4~VFLVxayg+p~LW ziy`Dz^DfyVc#<6Yy57S394zPl2>kr}gyjV;4!@``!)tpt{B8bP0I+v!?@JyN1G&~~ zST_dM)Zdn{Vb(ucw*Q(R_jA`e5W_3!M+o1gBlm;U(!~%cI;6{{@^PMIGnRZVUpdQ8DB-){@Gq@78l zaU&QgZ6*?48kMI|{Fx)Px?vC9c}!(zusNUL%2wJ$tw1u;Y(H`0Bo_*`D$YL%>zYpx zZrb^O>I`1|6|G0#BuC0h=(~>_YCX8QFL@KYZm9ZG=$MxjgHRlbyr;~KD_qAaZ4rE0 z%qmC0TmYF-E#`&sj5y{6!nK?&%+}yjOkOY{q)wWIq=DYp1LKik&x3{bg{@`-xWuN; zNvy^L8N%D=(^F=+c6T5TIptF}D9s}(ApblrA2p+_gscmR4N2dNR&+>w!;1y69X!!x zaGAu#)7mrNRe54PZ(hDml*wfNN`uRYt%$dvaargS&k_rjrgBu}eH05H4sTG)g+YhN ztGdZ1)B+Eq?B85y#CO5tN*Z zT<5*`S_EKfcsjwA?kSB3Yve00A+i^UHz{1VaO~`GXV1pY5});kk;hsnizO~CXzFGY z&w3B=+n`pKKB5Ol_BoovQPS8b>UH*>1xoj6TF>q2k&_RYEeCO zcaEkDnz1)dUfsQIv&~V>7N6HwUQ3ds2f(OQHvGdAfC;xVp(F2{Qho%Of1Ffq@Mkl} ztF)z@BG$i-B6wR8|JFHoaDr^l!JZ_asOohdf#*dq9nLaH`P1F0<~B1)ZW! z(|6g@R{c=vqQJxX`$*>(87|FI(;e}#X8&?d)Lcr5CCs>&p=?s1q<3&#P%Su*VizMg zy$YDgGso~vcF#a*uast?axRgIR+tOWni9~>iZOQ=?2`27699HF0hwLCmLRu|ilw}* z=G!rd)D@%M-c#Kf?%^KU*mnKd?)e~^Whf#2u%jg3~kpUQ2IM?mL15`69 zK8%G;?`T|#@a5NFZg%j>ay?+joL&{)xzI7oJVrY)ZV7p@RRc`FD<<=lbm0}-0A{l` zO^dpQ*l+pEn(>1c9kf)23VCu_CB(k=jb#J8!x)kUtY?wzlv?4Yes$YMHRBY1x6svh zcyS$HPX(pe-E9Wx2@P8gWlecA~MD>QC=|27{}`fFuU)&zHgl zb|FsD1Al(j`#=VNJd2AyibfNbvAvAT31rO+G;+#fFHSCVge0e&oD7D&kot^7Jc=9c z@0^iMSsS6r5=_NQC!vALCRv-ul3(8jiHLGg-SI|?b(^U?dDOeWKS}w&Q}6#w%6~J& zN+^F7al&6M2E2bIm#)RZ^V1=xNB-Wn@iMZXfunljl zm=_LhnHS=vg-uyWcj5Z3=gEA%jd&#iFo#7Z@;n}I=eU$BIzL)^h4h1Hbdofh6B_7A z4*XL2(4+>+VslI#FNZnBMV35BW@ro?~5=ZFMCbE&rc(i%VO@b6f4O*R@#prch9 zR{$GU0x#33=4NZ6q%cPG(z4IeI+`rtaT!zt6V%kqiU zk2T1|RI?(Vn*o8cyLD4&CH9_c|I3T7^FX&rx5*Wr_K(ZUpCGh(xPzpN!eIuPA|ZWx z2spUxV(X|50#SsE0mC;gk$vX4j)r0GNQ2Dy5$XxfvlzodQk6#4lKjuP?L5}%kI${;JZjXHZY@_>AF%7wO|gh|Hr4McT}p}o z>B*}l_*$fM(?7@gT{s`HCb1413$db$i`0yvfL~7X>eAfcSegrP6P**=zfr*S1d zT_}qIfBVcT3bfa3y5cjm)b9d}fNvXYFs^F(2D_drbC0T#y=L$t4a}{x7A5seUp90a zHf^0LjwmB3AvUQm8K+rhVI$$b^xw~67}w+LTFgfgrOSX;o)ON;>B)uIu9iCGr97m> z8^38R+A85@_;um>?0)f^W1~}lVl)I<{_y<}EaeeHQX<`ym%y6rSjc#2F(?*V-U7n7O$l~pNOZ}U8M`ReqC?%P(&oH@BO~BFM8SXY_%dKNY8s<#|nCDTL=Gz z2YO2+w?8JB$-1F;3c=NKmVW}?7M|PLiFd*S!6ECkL<8FW7fRngkk9NX2j^4iBvrde z{Rel$9IK&pMcitNUIt}$gVZn(jaHIO z+7b@f8imst2Ul7@T<5kGVCSI@dFhP86Jm^`R5u7a(@m0gVjD}`1HzzCYiRu# zXY)|?B4fV{t_!;gX54=5U&cHCCbfwxkV|lmCEcKqT0tePaF=Yo*H4&zCyVaLC(V_Z zMUbM7D;Od@ftI39DA+(HE#xDu==@#4b-BW~#nMKWwo!X@HtD6Jdz@Q>5_~9y{8-ey zETTjL)0eo5y6#GaQ3~hH;2d^Myn&3WmjK$?^T!yB=y!Lh0$zJy`9&~l?x%buzuI{4?z-hUa+`$Q;(h*W1tRh!DJ(!AkrDwCYxh2Ve+-0^ z(v2`mn_?lRm$+^XqO6qUjMd`TMR%Z!;DUB(?v1XLxE4pd^=={Dofsav@_p*jL4miE zxQ+?Jan}eU&i#&=uetA(jL2nMbhE>U(1|v{yk+67iCjaSi`g314i!jbP3e(D#NUwj zhYFy_l+0WgQwWghgNtVqW0)OE@odY{D)U)1G)RPF<6^0@cyknTNCw)KujGk^So?qJ zi*N=5M7sJ2(N)J5ttHrSeQj4`-1MEKSy;`3h<=@All)R*k@$^M#43_We~77eT2@=q zRxti2Z;C2;@bSZNS!>Z6;#yZ}&Z%sGPys8%GWu_XP5E7}&8Y4HS_pG~QA=4Vq>o61 zIiVJw>F33vOI=KYUPl3%_Y~g92;ZMmnd|815dhp(V>P6ph&q$3NPZX}7&5ttmt!nW zyjW)euNq)R0=P)4t#uzTSi0mn6v{~iVAuf@F+T}0<190!^bE0M*<+2OilH_}3YDCR zit3Y0e0HUs6VvOmZe5z(nk)mCV4>1Y#Z=zCI|&lXZix+uO0PCqCcJNJs!}*^Z7n!9 zuP8LiqR#)8HxfL37G%f`Ev?C4b!bx1{L0;gCUXThvFTfU4$@Sy^}uF|EyEnMQxXLy zev+usLWYYh2C!-#sJ1IsJ-D%?##a5XTvT#`zI+%7idt(X*`r5f2&|9VTkm^)@*9n9 z5+(jopBZ#cnVi^MIMc~6N3jRRf!(W=cl}43SBHSP9s+h^x>?TF%ptgh*J=OS)B?K9 zc2l31=NA)of**dBk{t&6#-_uD6U(~7`?|6k#S(5bng#9ea#sz!;#Kow__Hd)V(Hu* z?3Qi((#{&aYo#IDV49YbhAOK!aF{3`|E4qBjX41cPtudZ!zya`_!fpUKLM5NHmAWY zf(P^2>CDi#=M(_~w?A zDL$dv4}9{osb?F#jN%q%{pV@~GelPYb#elt8yI=F*URJukSFl-vsG`<0)NtDm+bO( zgs3}W2IqZh5n8f#p-`7&OUwmwL*JuFz4kq=?vZ@#ya$|m>_Zj}q3$Q@@s|U8oP^+Z z$spv^;CzW7x=;eQ!g?;-7_mx>7{luL1HWY|O-^s1w>?tzo7HEW!& z?YNwkU#-Ku=#1lw82!vidJjiz1*mLFug=sVpWOxxg7gLwooM9qU{Gp zZAj$cN2wp$SX`ct_+84bE|MZA$nh4RKiEgwvtTx=%qWfcXvCQt`ZLP;Tp;4i$o;bL z&>J~IfA*Fj#mIb%KfOjyj|-_X@uqI302zgJHP)<2~saKQIv{s|3T6X zZ?Z@9Q~OhdTYw+=YV3^N@WdA@zajDwzjO3{6@y&OJ4ZQucvUNcZl&&?(gP&w(~dY| zVaR0AHo`Vyo~vW5s~hb11^J6sc?Zb4SDAPe#)sq?5qk!fJUb{7$k<58*fgsOv`t%z zjQx>nNE2W)C{WkfgFazIpK@U~xo%mT!JT-$u&*>AM*Mz$&~6$1z$HL_XgOwa_2i_bs?ib&_>u^DbePwicP#_>&|KeMq?U$R3t)Vr;KSt$D43htRirAT$8k33x z-AzqoO>NDcEmZ7W9F6~H!&7Zb1xF3-!?t!L#2t*0I zYM{XH{ck$#ZK)IDGZfhwCl+|-{Yqu|F^Dmf!yrS1QZAY8$r`ZA@VAHV~Q9ac429iQFA!3(g!D(a6mBa2@{!#HD;sai?tQul0mEEz> zJFgK@R-mM4^G3ao)o&_{;its9%7dyPb1=faUJx8;?GfqB%FJc}OALN{_Z{*nU~6f* z44idB&n4|?aHW38WI;pi8Rzpyvn}^JI~xgoh|jfE9$sB7FN^3!U;SdsxIMWi+~>%J z4qU=9%RISDq5`H9?0VJ$23+ktSw)oD`mD8H)R?%`wjn21ZqyxFE$5T?YNQ=>H_;{!yzL_&c| z11QO+$JDlg^B124YCY3lcV+S5(xs*u5;B$#INUK&Jy%g<31vh~D!CMW2F<=1x6V-! zmpG2F;i73;vMJBR3!0qV*}S9`r^ib-9yg|(m~s~k{<#<5iyYMyk(;MCY|>(S@Ci}7&TKf8~U z@FcWL1k4wH|EBuw37mTwo4%UCA=oDv_`s%jeCjN+5jfeIOY(@fX}+~b^6;JCOrW(^ zmvjUpCnuKp3A`af(CxU-C;m8clT4!w2p5l4EQv*w_U(s+;(PiXi~!NnEf%Gn!DIvI zMw_MNquX^=J`u+FN66K8R#x8Z;UBvDH>v$E-TjkZx@_{D^?Y>~ zlD|g89RGiG$NXP($NW{#+L{_W1MO@{Wr0r4reA}={}~`BDeEb$F{1I214Zh(H4V=q zZKlzW1+@))z~s_f3FAh|mA27?4V3B(NQPuzDWE>Ud96_p-#~oPcDc_5)8;|rGrWAf zr>@_x4i=ul{kSdpVchk5VcYMnVT|$hz1+tXbI?L&pz`e`G1L#}KpwvlM#Iel*#fhFO?-n>tiip9ix?`O1 z=MTos)}QcVJ>kgG>YvoAN0^cdBgr$oo8~E%?;5$NjRq_XW_r^1{BRHgFG*M5y*v&L zzb-^wN>DpVtqn;&_a6-zJ^(5@#Hj_;sE%$)>5Z$W79x<;J zGbjSdFJA{>uy8QVmR*@4)@3d#u)^8AGtg>gR-ERgbwT?_Wal4dRZq6BF$P`v`i5pm zz&Vm0(~6U0Q-Z6l%40dUll=+!T2(B@J>H$-Fzg6(ZE&i9LGiN#6(Zp@SAc@=G;}u! zTtXp}QCJ@BGm93@l7Lr8=a#+gbLT*&vHPS{CDUs7sio#6^k@N_Y^RJX7(&+JnG)|9 zQ~DW51+yV|yU=zr)I^unKPdS(7XA|@&+oXr<6j7I`g#=k{_j!p-<}-GF1EIYM%JeP zgOyBm8z)pXG~Wx`Rk_{9JG=;(nj)7(<>Y$d3L!Kj>3pEdoMvH(d%A8~@VTv79VkEd z-juyK-qur;N`VZmQ*IeWNS;;~A?Pml}Igj4|q$ z_qaGyKns-o_Bqt#o-o?2yF{Nb8r-F&qy+N70OMxj9vRhjrzpYj`53aU5P1Y*{6clf z4z|(SmM6B96pH|1K$GxY%mJOmAJ#^WU=2%T{Lwa3+bXB2gxd!r z$)YgB9gFxOm4r{ZrM1IO=jon6Tzk7nTsVU6Fd@`O(Uu(*+%h6#^B{4ZfMlyfm=!Nm zr9@w;M!SilgSD~t#Tee!L-zJs&H8;4lOGx8h49kCi&Sg2nZ#Ncz6%w{!#gA);Rv;C z>8}YPEvpdRF?(uw`B-z;*!+v}L$x93c;Mc7xh2N%WJWH6CEWbrN?e@+m>Ss0a;1rf za3Le_php$03?+od94)3CyvX^KM%?^;N8FV}mB!zfT)h1m*t`q(AUYSjU99tD3%&a5 zj5!x_TY8(s4#W~O1QLMU%a+xGkOF4b`;HYPHc!bm(pf^8*y0+d3}QMy-Z9Rtv?|oU zOD{+Py{-a&`weOK z)Nm}2q`WgV^Ykjpa2gw}mx_EycN>fJE@?BRBE4njvxoKZr|au=%4MDx8{4CaqDG-e zlb%_p4YoBO3r4xB!)P}gwF5@Ek`-Q>$*xJWkoRs9tM7cNE#Bi7X<3e`f zOD;l88FOJN0sX(^ws>Tf;%AK6oI~v07uNZvwmL2p!;zK>@V0B@i?6NC7u| z5J^9n^4|QE4kTzP1&H$B0>lo?b=7=fQ=;O7mBxvMGEClNY~<(e2tu`Ik$gkY(BS*P zdXBFVZAv*&NzEY4fp9aJf#Hck^0SlBFN|0eyitpGS%>Ah!(IQ-#=ptoKWT#=7lN_k z>v4JhYF+<-`ZfNOOEWVlx;R-V7&)0by8h2*N#@scf+~c@_q|X@8a<8y9X;1#dmtLc z8z_?3Fi4JL>6g;IR^QRx%^k>6*WYF8&FJ4xupP_1nTl-`K;G|@%4I&)VLqApe0{si z;|D*F%3C75y~8Q({>y->$Jk$6!m74Hms>(UXWg^m%OUWa0<)9n+53ukSv^I$X%@s2 zvCog@J=>{xK8iIYEDq05e)RqJ?lWx)p7pPs2!fs+W#^TX}s>nW(TGnN@;B%FHRMUlr zBmPVe(|Va|+PI+O7|y3T%}0&m#)iShaX;)+0x;?c-^%(Mop1S8{*=K#z9pv4*6Vqn z#cw2bWTgI`eyM;lc$vx-fCW4U*xCz}Pg!a92*X2Df4j#~g_0dWK2#@9a&CDrTH`LfAv8Vi_Md zictc;)igMyzdZc|ztvCH|G^REJ#hScOI$EjgV1>7ec3r4AgY2Kc?J6q2L2uC|HJ^< zN&|-VSNxB@YAX8w`={goET%=P>ih$QkC5cbUln3G!(zxaMs489kuL$)!Sjl`gt;M@ zKX4mKXsylDSEzQ=KL^cG6!!uJx(Q5q>*htl_iSsO=)LH-o*m7)KA&FTyQ#AfwjmD3 zuZMAycp(%g^5KSrCx$&>VKFcOXQ=qe#uZ?89NKVydK4Myb5#o#^OFry?(_CUDtO9m z2^$m>LMxdx)?cbp*g`V+;dXCOL=Jw;;2i447NB(^5Ca{vz?r9~0K4;2o5%t?w!;Vh zYxC4`kXBVcozBk)l-9NPKK;tQ;8w=2BlHOeT$?%==4m&a` zc$WcLXWWt0N{G6$i!8mI5I-tglCMsKr2d$Pa6Rhrv#;(|vhKZpu1s^i7kYjCYfDv1 z4uK%U_gGaK;%k|o&sRR=ogkP|d zK;@BgGdTLvuo6u$#Hl6Yh!)sL@qjvUDLIEguBO$~!eQ3U!gM=RN12L=m?!`DDD>O# zQ>gOVe5sfoJ7jarsGKZJtL!0d-DDQ}9#)3oHsB%EZxcPt7bGqUJYr0@>PM^f(Y3{6 zZ~CEX-1sR4Uh{$yz}LOO6?;z*f8zM>X#Kx&43-(Sxc?cydY|tZ`+tw)e=)Lxv4g$7 zm6N5gvz~$VAJF_CsbxYmzhv)s_<+qilUxS%>LgsAQZO_PtI(ued|7xFTFMc z|IDFbH_J^ei6LjL-!P8o!a^`^D?hmeOK7fBHtZ3*QaI%IXN*g zGC;Rp+wM*=M(NEYz-cF~l}rVz^x~x-b$J^%0iPp^{^o@YfQLlpa^QI@VCNS_MSvYn zu$@*-H|3e)as{c_pXMjTY_txBnLgw4md-zas9;U-`1+K^n*A&`aJ6RYK_K;Z_1q&ZfN_KSh@Hs=d`*f) zK25*71vjO3>Ngn4Y||6oSa3f@)Z~2;SPpPn{lBAk-8?3n2N&OO9u}>>v^sC^rbN*M ziV&9TEP)5QM`sjMzbfM5h!e$;Q%O_1z3w{&F1$~w9w-~MTvd;6MHPtUQ=l(|41x{r zNck5inXtUxi~o6f~ls3%gc{%P94g zSo9qoe0AjYsvmX~K4BfsVm6{I#BI+`lnB5Ls6TJE8%vUcn@;6To}?rxvFto?KEmv% z1m|@`*QQ}~lxv$u;}kE*5g${=sjO#qDvaYcK< z(G~@kPp?pk!e)F(fZKeh_u%Dw=ucA$a1NFJ^#u1%?EDoW|HjUr_8b^&#aFV=H6Piq z|D|5FH@Bk`0N9!63H~cu6*LBzSPGgO0RED$n%QBgV0cE>&79Q8$g{}ga(0^{HP*x{ zju%*(73EaNp_4>n<<3b<2&ze%xnG{A=A{hg{pP?~Nt6frOn8H}@+pCILkD4$9mu^&*XibkO76n=p3g^5Mvzb2 z)4N7c-w5fZ81|M>el)f-te0Z)UyxE(4cnEWT$b-TyR_<$LEMJ3Clzx4a;G<1$=qIP zNw_JOxL5;S^8WrS2@wtPRe_d9>}E5kPG=EejNF}r7* z;8{T6m~ZfF$m4+gpws58Nb<;1;{LT$M%hug6Z-w^QFEHyjkH!9UtQA;ex$<&6|b?#Fmem|z7nR8+lu4HXcg|cJ5oU}waT?^J>7_4&Gb;`LxGvKF`LX|?( zI}E9Z-%a35;4Q)@oU<@#UheKIv&4#50WM@ zZr8qn&^6RK4%$&ImAscme!%WpTN8yW;%$Lw*D#-8&Bf>K<3TNFTLXRe%A$?fdUCL~ ze1{9OBP@x9JLCqFH=-7^Bk0oX@vCR?Hp=l(nX}KBq>>%S>XmImXaW_o$OL-ei~srH zAhU$oTrGE+f?1WRI?1qkA?jfKVLqu;Yy6DDT`dubmZXb9OHwQt3K?@-;G)3|5sZqB z^vs=}PXM#!STJ_3)Exmyh1HzV>nFV{R zGIN*{66G*?hOC5RJ`-og(;J$c*43snV84mU;R`(lQ}C-Z7clvO-`v%adlq|w0fw@b;*`}kHCF0j8@tL;7A}UB5ny-E-0*BMnr@YdHz-uIUEMR7cn^otxub07|BjqNQ|}^{wnR9J zBF&>}61?hKp>u=SP75|DCOwcePnvbA=}OQqFSPiY5|D;xA85K_sdE~Db+jkbK+-@5 z5S7;wu!V4<$vcHp>CxRj=#2=@K+Gv85=-2fyN`<_R*aU8R0b@In_zBbDIN)Ao~$g31?zHN0ul&VKFqu)9a-j zfA{JcLKLuhafax4uGK@PJcZN6;_n-#2CE?1q@jilLyMUC9nEnE*ER75iDz$+@@v?2 z>UL;^mbJUc{)VHRjgMS3$xOR4>^g5=&!u<=(EElWFrrIBX+T@|NhZ!!8EEhj_RpS+ z{`wZEmzzv0i88JLVWyp$=f~4E zQWt?KM)H!n0OqP|$&mq>AIw?m5>xeL^yMQZG9`CAcBnGC*t{M&^TrL_+FjF0^X!^k zpsiiG00+DUN32n%b45JfZ`o(lzAA*Tye;mD_CE$P2TLNOo126Mi?x@GbQ}V2hw#8~ zx@Aot(Po^Y1`ZDi;n$VpNoAh{6dB!zWoxaOK0xsAbw(4QRX)%;PP$r6Q8a0JNO-@P(;6&^>Rj)K?7^94CaZ+ys zNad#F`4^7j3zG{}r$+L`b|^68fAZr(jC=tSC?HQvx6+ZZ@b#}{;h&+vLPGy}B>YWS zeK9xJ;+slwH>}*bE{faj7g&Q3?+X_E6=~t449kpQ$ChRvhZUo^YDN!+HNh0+iUJwA z-p~mZVo!piUZ;HCZXK1Fc3pF*s=SGXI_?YiEL^0JSE{)8*l=y$U>B{}Y$yexCE2nrM?2Kg6jP(!9F8wa3QdxA$f#rh|-KVkWI@ckQ>e;}evO?8*;r&@;Y)3zV$ zudtMMFt<0c2H4vF8-*Dv5cZ1m81I&hacrYR5Q3!aXIqI<&SqH&kHjHjl z;kqkLI6YgVT_l#dxi?`xNDO4~y2CsS&%b$cdu!P`%l0mMQEL}>fG@3kRX=9#C0D*S(EdI!3Kw|JG6c%}rUrOG*(nI*%k@ zK<4p?ni<>M$m6`?cjT4K=ShBO#N#Y85ya!HJwa#u7!!!b@;S{i zUsR#mn1Vc&wrj(*49_G_!9=p9ZboeJ_2J~;CKVH;PzW*2&7##yZr-$Zm2su~T z)gk7-aDm0)d>lvm8%V@BRoco52)Eg(`YB;dA$Whev56MVmYH!#UAc*d#^U#mHkdnZ zW8;W&d^0_*)#cxV1}cO&m#nd?z@#@URB}q4}@n=x3pahPeE5 z$)ua##D@vN7?;&0=YuxP+3{&88blniI4rG2)RVqB^8fiFDRK@{U9wMN$!{sU{)95N8sq zk`XRTMnt9(YG?~spA7cL>+JoF%*$o6zP}EEH$S7u7$vbJ;YB6DSMRJJC1{0$r_J`kWX{-9V2Va_s zSTXHPfe=I#A6F2M_2)DJC2PEt&NurWI5FUxyN7$si{#t3z%d#<&)RPQL4!bM)gLh`poV6# z%P&Y%%@-|BDWyF2>gM9yNazsD{z=&)u70lq<28HjRC336^@Hc*i%QZ4q#dMQu^FLCS zlPS zVi>>-LK$8^5`CjMaQ}iL22VDQdIs#{)4uVIjz-&9ro_s-aY$3U(-|(Se3@&uSdwFrY z)SkM2lr6=TS(K;>?f59=g|4F|D^J`oMwxw}?%!moOnha_po-ly)y3~_uEh&#tjR6% z^`Tp$>!7R=L`_6cjD~k%@xFKC_Twi|$o47U8H)t3x+q?W_cpgpHJ@!8u)$z^b?S|I z{J7_J^R@ecKJ18kAcG^qzZznPz#0&{G9W1zZbS;GKKX(B@fyG}H~H8_Y(eCT&2l0h zlSvgXPza|dftx8X>}(=OQo-Dt67ikD6+l6vZu?wk+?KqN&TEilOC1`UI_bhm*E*3Z zt+QSObg|sp`?&`;cnidT`GVRI62&ZB z-`s0r)<{l06VgbSH;dECO4%VRmn>vzE}4y6jn3Jc;YUAuvrA2p0`C4nmXta{g_O&w zaD>|cEHZDPyy4*71f~;lXA3^on<j3$RoMTnW@eN zcD$Ky3#~O08!gmd@D_1DBH_)jD3fG^0_tgjE2*qLj}k-tNiX>*-u`NU zE@ov=GU>klI!`I>@OyJXi(DtvMs$<|A-5~5EWV@1<3;ru4nZV}61NJk9AK_2=^#?T z06YPkPEV&2pS;o^EsGxlRCdDaZL*IA`n|q9Da+`%DU$!~+w89Ew?j~OOtzh{M?}kh z=_atB13>vazUNC(tJdI+yC!E{H%&lvyE2{#8v%{hY#RiJoi=p5eKIjYFaCiq0eEns z__&A!+|&oUjqE6Heczyi`r8> z3dD6Hzoe8wNAI85x`qb$sA~?lK3Rvcd)%wJ{wSPLf8_ffA}M$bmQ37-pp2>|SP@v} zPYj8vl?(XZ%gAqYne*(Cp1XbWfZ%w{|A0{V$y{(5j~f5h>`h>c8a2x}d&UOJGY!Lc zEdHVs6m|%+U3d318k{_`&t!Pf7Z{2m`1y~8Y{6AtR9(zI@r&w=Qyc|8xM7RxB-#Fs z@`7N)L50oEQ%eZ}hN`dJVLe4s0Jq10f@_@#c{%J`B67f#nRf%L2ieO9Lq`uxH}gbS z?bj{^-!2f;Dbd(5z&d@wF^*RFjhmd#WZUE#=w3Nj&kGx%-Z zR2y40_kanA#Z>#mb8R-|r{?U&F=gg#2c8|%i@5FOuBV~lPl|_xwI8cxl#WHV`9ZrO z*uCb9P}bjKID*(|@|Y5{BO^2$5;YVt+7pB3b-p4Cc7cwR4GsAKSFSgeyi^O35^Gql!Y^G#bHYL;AgDn+>J>Dek zX4Irc1teToR&Q-1^mKGHjS7mf?Tp%42$Yh4{<@Mgr))zb8-b=3#wSyt%J#VdX(ZX- zTkE$61}aa{bo6USkWgY?F|Tl9gzFZYK0)#N`dc$v2^Im%J+WQ8Dy4xWa4FQduutDz z?srDje9B-_o?|HcpP}g|G9U;z=d;Q{bK6em8mCx1)8k43fOxS3JG90u5kP2dO?$~-l z%y16CZ5xOZavZQ+^2z#AQBo&hMrq^ANhVV=Q+}foTS$F~+uam&VI(#Vm%pgrpo9eDxauO=2YXtE_?b^7K~?)B(a@RF2OVDHT5o81v;d7KJnJuejfM(WAUc?lOG z0_@cp&`cO))lNQSw0G8uzMmT5c>?ReS&CHSkP(jwZ}$#^JMN4E@^hEM6>>RfQkmpf zy@bO%FbCA8v*NNPlB05Q$$G@Xc!@A+LOIjXxN3Tg_?e$UHM@kT(R0<}bwXh{7}OB4 zG83ZVdP8&b_DqB1;NM85-D$!NAd>Q&VSh&LU_Bb5Z$j=q(Q8Lvos)xJ;XrJX%%z>= z8b+k0aLkh%qvqJ0__~VYP%pJGuor0D^9txIPo|b?4Vn2@vWyZHH0Pu)cdK#zN?Z2O zJ43{rmR`ptdUSg^0QVWz49vhPv{y)@rJgW*GMaPoqp2>@RA)JuYok4=WYD2I8WTz- zKN1lcMcT_ZF?|vjtf%I$cA#{!>2656hsK>&+|Y4o=E7hvHDpvsEio&UUYdTPZ|#`0 zfkhwt5$!q@20u3*-XN7toMXA5Jc|}pB1sG2^FzE}{QkmsEzF315<3Jk$n%TlfYxL; zu)B)0R~7STDMfpB0iDdvgzW-2&j%K>k?+i_S1gjgvEhRDmSFA9)Hw^05*74~FHKJK zLrz%m(c}T-Q=OwKnp}+5%ct}B*pCAn$FgE0?kp8LD2R{(Dn`)iuo9TjM_ldrYs3z^ zRJnvhfk_6M zy=9D#~%zS(7w|F`L8Rd891@;MCVHxy1=Y$KF&LP9U)^OzG4_Woh(L zj%iG2noE$HK{9P8+SR}CQ>`DXzzXA`w z`{n(tvMtHdP~PYr z%DDAXy6*+){hlyi$Zbm#VVjWf^4b<*+RXSU%0diSGY>s1^X(1x!q6X`&6oa~4rs-@ zf;cY;vni03gF7Bk86}G0%!m}wvHmrj=@gbJbxPgG*NU33eVhqGcd`4ECKqrbv?A8 zP5z`!XgA2smiN9cNLJfZkwQ))NP)Tv$l?j0(p~~Ev2fU%p+oN^I29M#`^LKuT%SG* z^Bp`Z-63?Ei}G(ubPe)&tg?LS6mlSo2i^59))utbA-^ws-WJ+N`9F+Xy_+LMgC#Fz z1*BH2^5%p10Cor#i&Gb=D_SBKSD}}+RJ@xNFJ2eF`r7>Rz%hk@&IQP-*G$;%XK=%- zEPMmGGkGI#5y%$Cy7b(q47j&}XT9KfSKN|V_{CfSoTtAdlk8;s65|S_6v2w)Ul}I) zJ!Rg%GS50IMepG1uR+PL!NmS>SCQ1YW$S<~!*N2)%Ck>tK&B}LQ-J;H<>@QWB}4YqxF)i|8))uhQhbr@-f{-c7&{IF#XV+8+DhI@QZ%yJIK|NH(1jh4j8>{UU-_dHIlr=nxgU6 z*R##`OM~C!LGbqAclODf$4E>3qK_eD9ATn1>6v|M7n8N?pUWu)n4JA0cS(5y;EqjR z0}QX>E_wCX%NZcT89~e0JIxvJdECP?2RlC(+#T-J@?26} zB~ra0f3$KxR5dnP=%WBpyc3@lA8`|-l55?81UHGk(4W>#>MU`jdKF!7D!WZT|C5UU zPPqT3;y+}Ax^{l^?I+n_`w5N7{_5)fMf3m1o9h220C$VTw(;xcb zsdyL=oi`or@@;3$N><^YT}JC6p$kL&dldxu0ceYDSn8 zmrTYADH_z8{>Y;)bM=o5QgAe&EwG$+aDs9Tj7;API7iWLz$*awcehstV}KHp6)P0e zsg$aNyd}!^AMpex%bR-MZX=uEH5e|}JW|c$@wLF~vO6U!HkhK9kpSd7*nXnk)*zFN za4k7^Z_UhPi-QY`p8%0Ls`#L?P(Rt=&TYJR`eHn%4i2m>gf+StFcnD(+i1~H1m<`- z`WW6{5j-q5-umi;HyYQZ)>fmwFAQ~MF?smg{v<>25TFZZj__*HN4MwSuN9Xcce<_V zPg@I?%$s>_xFtn1T$yScna^kCQ~BJr%Vv3hu^6=kYr}4F zuB{8)8uUdYhhtJV(>#`^>L$250O3{#9BoUkG$MS?GTD7>!vSHyC#(*x3uDPorI%cf zk3r%=FBn^~+hW)4#CURXd$R1z^hk#V*b$a;TMqrcxCD|1Mj9;l9#b&cJlIkDS@d2u z!A~D->I3T!rv3Z6{Cko9)R?-e*58dk8N2;YE&t!k3FNID?EhzU%|lT`<ZuI-zaZZt1e%uzfIpwjh#{`OIxKQ7OI(?|21EiqjsErb*1o2hRQ0DmBp-5 zN%xW7yyT5a;dQnpN23;zQ4dG;{L6<5g?9W_8rx{9Ka<*ws-cw5RJlB~&_&-S4u}>X?qscTFla1;XsXI!bjd&FbA+ ze@QCo-kHX_+>I%hgmiV4MrO&fNsK^~l0-|)a_m~B#@Q1eruMaR<^FXwLRmR16j2pM zbwVOrb7dL`#0YPLgNhbQbFm|<^{K)w=M=n=v~gE)jj4b=0*#$ALaA;N?p)d+if_zD zC!kO3>$D~;-Tvn`MmF|_hI2apLvB(Y=LF^)B+w308-UMQSLDyi03^>@vKxt8=?eOk zQ37%Vzv8MILiX`@CDkK*93tqdm3?c8%BX-0(X@DAQra({k1mN2R&lMSI>X9#jSr+^(=xXD|>q zg+z9zyQk6>V`E_Kv*eRe!blSjt+nzRRr0-|D}Uln^)eF?wI1h2D*GnQl%ka#4LdJg zZqi55@aw~4VWHcMqG03p_S%;8!i`ozmv0*+0PoPQDxmLK%UnPn2 zMCI3s`)JC9%}^XME5i5;9bsEhtUFwqzjlxpfz3!m;sxR}zvhSV@V7mfXdOCxcxyCu zt2KvESu$g6X@!5i7pG4;i`%-W{^8q>W|IlF{gxEq!Pvuy$QaA$0}sn&fWCXtKeHwr zlG$fA^vn5b>Gie2Ze~C!{R>)>Rm>S@9MJi&QwwR)wRX~;j@xhD#XShhUE*K#>h4$w zbw7!2!Ja{ac+#ICMjoO)___`~T<{wen4R*Ef;E^eft+~&kv z&3QWwj!AEo#=0O)U#iatPoI@qM|l0%)IZIzzn`OjAF4k*?qrW3j@oCY*ZTbVGl?rL ztjJFzE+ax`0dO?1q|>vqptZAc_-uqZSkqdW{TU@-qWjNpI_uBRtZl8V|40B0>=Ybn zC8VjvrRBs*6|Jeoq$b3auB53Y#}()onC6*wC?#nqC&nggSr(X>rJL8= zi}xpDA^jV%{MiCS{EtJ7yn&5_ft|g$g|+$rPDd3euF4?EA!`LC!qNcI$d+W=R;aG@ z$aYhq(G{S_5{8fvW8z^KB5~GblrSl5sl0y65-%1~ly$y|3um~ng9PUW9|+=jalKb} zyG(g{H*~q=MvVsfG2+(DA-BBeZ50 zU23i)CacNocu_JVvnk1F4r3;IkmYc5sj{XlRc@1i5aOdNV_K@V4a}%Lu~bY(ZD~W{ zBnCDgezeHqoI?V;k(Bl%y$YIrqt3p85Is#EPzIxZ-H@>`*TeXbbKm%&GvRhgIJ2R_ zZO%^-(6_pjFjv44y!4pbeW2+fL{uXYAdZseq71G#z1;eQ{a79 zopNbG!~@2GPA>H)cM58+)EVDqz`|0Ag-y`qBh~K%nmFras+AQC=)eY;RqH!VrCIwy zaSf$7)moR9GPV60{(&tL)hW(LCunB@f(|Zk;))+)>g2+hM4!*6p9k@yx*%#V-AVHoF|wzW5JNG3DH4Ct1?Jt4HsFXHldb z8tts=tQxzg@D!VMI9-vzHa78lckEuV5?`ia=J##8G1Cyk#=TtQFw4!|e0`^(M8Qvn zm==;4f>=YEAqs}={vpIi*yV^|m<12`IW>BpUFGqd=ibl!5~${gj~N4UJSIm3bPK%w z6cX&;y@;60x79Cg>q=n}JhF*68w^l=>g{U2MU|8Xw3fg-R4HAYD5E|jk`ez@X??*0NYVnWFI4b?4ILo{Ir##NQ^}_) zq2fi}Vx1Bt=djIX*#EKXDb{Y1;~~>+^69eqA>*a*9jEn+R1Ys4>MkW);Z~!R=iuIh z)O**SDd}l)xsfeQoLP$I;GQcfR1k4pPo%ZI9RiX*g!8MF2J!dT-1P@ zbk_#s$B?u9fC6J?;&pg9599lY;83ekvq$9c4Q<<2PH?5}Z^F1F^x#g02PZb|0jja~ zk(NbGXRR(4Dx8ppV~DQ>45+h64stXpb8+7`IBrnq=CgPkJ-1_Bpkxrq%|e|V^X1p$ zN>A&ogS6423J|Z46n%Wxx>`~kVD6ZIQd{0a1sep;#fFlJ{dP1dGi*4eab?Ff%R3g% z`wpmi(kbAIP0tE0pOe?eN6NB{5b0sAq{@(@nNl&G7E7Bx%o|phS7)|5J`L?VAimWX z%@PS2%q_!8!kVayNveMA@kf=UjUsDt&Z(@lmoST%(Feh45&1&BkZThADos_Fpzfd; zR|R{l#j-X=72!zd19O)+7vVC2IB5{)1S!NMU|WX|O#4#VaT%OO+TjWp z6JcNQ{-->_*Q_jTmHLS zJS8zQ*3IYg?tnkGC?N0P07)LWs)!_0#{Z53VWWNLJsP{emOOY{0;Fh%3{pnVmUBWj zo593@VJtr)WTItXYDMi#2N6*7Edz2vr`|VfTN(syOFDE~wRl8Ryj$au41}I9r`~Bg z)=H11S%u596zY=P8SRq784r*A5#9{N-9HM&-Pa3YBo8?M8e5TC8)YKH$}q0E_dNGT zwV?hKl6QaFwk8yrSmB4$rHi9uTG8@gQ8VTAC41{K_wZqg^)S#1y5#YBI^n1Hgwp7f zy~5`hMrA1VqzgZo1_7J=Q=FD*f-ST~`nDRCtYFjA~lJz#^3fyMxJfDOpZ%tSG+*^g=7s532k0k!C0lW9}b zGOXa+<}DdVkruS+b2OCVs^qF^-3Sp@$wpG?q)|%D3XcXP!Q(w>C*zP5VDAjwvfUr3 zG|l-$u`_Y&>Z*qj)C>Dc$h+ESFW4OQ7nVFCPwECJPk_pp9OdkT)(i_*#X~{nF~-=} zE(DZ?MVn5ub%6US)rTGKwl|&X_5^l9PbjH#H#@oQ#LW=N1<`qegIO zE6%g2l4hX!Sgt!JN=z@EM>zJV5XEWg!kOuyFNdr)Uu6tU-`oo@&rJ*^(aNSx4OdM+ z4c%4^8(Nk-*UVR?J%W}+!cpDN1@I-(<5p<%e(X>M8MEP&DrktUJat>ZcN6eLe;Q!u zK*65+@D#7OZGo3Y;0?1z!^&ak%LHCDGkl%P+cPxjpg-xkC6lc0nn+hN}^l?^K??qz01WQ!_C z()Vzg5G970OV(TS?`E)#?PhRf_0zjO108(ifR044$Hdkb`9SF3j#T+v&xwwhBP0XN z5|-W^5!n_sj14f%yz?`U_T>%q4RFk`8klB@1Cc%h8HocGiI!Yon1eJCy@>;rJ_F*C zyR4FWF4@;=i32SLV;4RHhpL!#jm-DZ%)Fa3P3tq~zCHtJ8kkP1m{dR!bhXTps+ewI zm>(-WOA)mYP`yjg)D+06>#F7M!G<($nkmdyaxW7YF z1vG}x#&Wq8^PlH(rFVw2PeyfRrK_hwO<#RH;AYIO7xci@~rRk>T`sKi&3XhlB_|G=^w(J$8Pv4=q!es7dl|& z{VOS}1z{u=k-&6>aViAx=J-m^#}#>j!)Z!1Fa@q&zNTt!f2q4apvz(~m(m^F@lFJH zVPrJ&s`srFAB~u$2&xo&h*wI`Q{Z*u;8unsR049C|Zv(fB za5kXlj6Asm;Y!9MPM2SFGl7#NF<(>+w4jCeVie+D1OGW59s$D;QoIh3P7_ zc<@vgcLQGXI0K__Q4QKEMClfv3(hJm>?*Pe`!clbI1L8IWo-(K; z;Gt;OP&@9)`1ezzH_*t}B?ELe1e@S9# zfmf0RhA=r2{f00MVwB8g!36R?YJ%7V!=Hc4+a|O08H@M)3ck^$Cg`0PBA_MoQvWPy zJrcvTnpAH;nyo+gB%N?6B8qy+7~m0K<6t(4zN6MY0LX0u0!RvYvwo2LhKaYrKM&{? z?w;-)Z9`C6c7wf})~U0W zhiyGllXM|mQx!k7iy-d;&Cv3@`Yyx}4wwiDHN#rY|MVrwZX zvArI|h!%MVi+gr=5S%uk=|eRxq^dtR)YX(>T$quP*55{bu;~}~vIp`Gp)nQPFCf@? zWVw4f@)epD(wHv*A=@8aYX1d3Ja?zYS3iWe{59td1|>FK$aiFzLJ1o>o0?cw1q&1W&7g` z0n=10C>JZvkSj)GzO*c_MF$wLt*?`xA5R`7c^+F8AA-->%Dhcky~*)pxYZKNnOpGf zZ7io48D^$%JseDSdcNRvVV^+qO6j0CDuwIFb<2N)#&g()O;i%PuC7`~84Xqa4apm# zCnbyqNqMo|5vo*9@u=7hghD|*P)&OeQ_UT&r*M{4a>UQ??@pYkiyfsT@w<8GHo%t- z#l2w543wnGu~`ES9Te&!a{nMv>#}4!fyT%z5768V&t$Q9XaIVjysdcL>iq)uSP9_p zCp5@}=b!&Q_=`SVF5VP=?!Yz?$$FCEEd4Qkd>!R9R^y-$+&RwOPXih$<->dOhb5y> zz}S>l6}D$*hsMrEpj?f39Boq}zzQ>yq(jg^@rvNKrhae~yE=64W?YInbJ=|EL{TP+?2cj~K&@Pba?MOO>dA7QX*k)ve;^vZLeusX zww|vU7yV#@Cl6IQdt;f&g{De#P~{4SqV%+O3VgXB^{F`P@I8idpqZ7jhnSD7OmFfZu+UvW?W|>qiV}#gA2LUN9~BT zuXLxF=4YV+SM4p>QtgUx_EBkTu7qD{O)<5aU0~RRBK#bRj>j`KK5!vZLr~Y}XIM$_Gi$P7ZcI!HCllryF!MZnmw3_Iuw~Rv{A*aW2mQzlbLbSD z+m+-u=MU%i zb0FcuB{-6XKhijGn_y5fbPtH5;fEQEPUY6wJjE)VvK#0M_eX~kEm2iW)kH> zk|LLUO)?xxmaVyA3}5)-4@gG05P&%311AGd+be(f-$Q5#H93bLPEr74Pnhx&Zj>qP zi{kU6Jf^@UP~sNi^mzW#F5umo|z50RD_;RJ*z*V-a2T5BZ&c5s&cKw|TP^HHxVgucLJR)XtCsT{)`=$u(B#3pB5R7Jz445q5PN3rG#HhnMV-Md9Gx73aldTRyE(B4= z5ws*jD+?xZ*+kN(zfM3fG(_FdU<%s9>(mPEQpTD`7V6+CoM9d;-LXpCSi~3KKYqt5 z0=FFQ{qR0OgZEnNy&WZZ`=>qf_p9~qd-kV2QZ!5UUHnrf7z_Ge2I%$vf2S_Ge`uZm z$Ach3Nkaii9QoZ9krCdPfgc)CQ%)rS7)PtEcL!vVCX_rer;a=;P#lV=SIX3|=NXFn zBji`jX~9V8oekbSn}x-b^klLWYVk^teHO3Bgj0vz@$lw{=M$t3?86PYt|PdpHN)h- zJTV3*?ID976{qJ6L(%RDe&umf<{-W0QB%ooV&v+#IK#5}v%1v|=x@u<`}HKNIp@t$ z`c3=wz@(VJ#;T^Sr2XysTnG#i6O;`3&%@<+OKn9B7 z>XKbZqqTmk%V#fDX+1U7))Kt2*!AWVu3b^jx)?q?+RMZ*TaUs58)9wTE2B3YLa)LU zT&6|>Tq-4F{aG?yGh_>0pj8dYvYiYR0%7EThFU0KC>9#Q4g=yHR;=g<>pCE5JKc9c zd@5A6x!KnR&7$F2=&3E4m@Cdj4K)hN{jfpNsL4w74LNP$xz=;bVDGlB3yMl`#_3psIJ%aN={gULgg zMJcr;^R8xhNP4!}NNtS9fN_OMZS{Bi=FUds?R*^3bglYM7YN8&e>?9Xvi|u89B@!8 z*md1*;JwWAZ}$_%iG_`XGK=H?kFReGt~AWnO**!%j&0kvopiEe+qP}n?AT7aW81dP zo0&N^XU?sAZq@f^@BM4nTWfvKyViqBC*_d6(5|@6&Zp8ckL(7`cIy&PYHO4w&(9&B zg>j!`fpAjapR^!FqpQ;1Ek;%1(st^E&>OgffM-+67CQFl%}Y$H%Vge6t`9ikY+6QRoT zCt+3JfG)f-=t`490w@Q;p`v;bbj7G)v4bfVPvhTAjo^(~LkV??y=aFjmW@>hDTkyY zb3}f;hk*WGuk0ay!=TbRTj6J{%SpHP5xRWgHX^v1Ar#+3nNIYM>!YIT1zO6S-z@3u z&2$gZQt2y2&9`88V}-((G^H@-kk$-suGteuyv3a)&)P(0Fyzz3r#kv;;>N3tPn6w1 z%Dsp!NL|F#mfvodfp zv30Pf7ql^Qur)VQ_^;0-!dAA9#^T?*4WoY{k8D-ze|U-d$hoY*5eh(pQqF57O&cY~ zL5Ed$Y790LNlq&nn3+1I82QtV*{stveqhD$7wEtHG0$>wz19=FD=s+N3Q5eV;F%|TuJLcSFHMo9xJgnscnJ7f%!4NnThj89JYw&!RCsrQ|-wY$cun;J(2JFCeJxNJ! zh`scP17;$Z8WHSQ)^wLCm?-t~6IIYmKk?o2ICn`$>QlAu2o=Q3>n0E3t}5*lES9I$ z>*eXCN2H{7oi4Wqkyo}yM`q-C5j)grgnB*X2iRJZlz1q2itpCC{W3DWoAKNVi??vNo)dJ0CCbb*Ho1jAW-!+?GFEuCol`&Z79-jt2 zE7i|Ax-S*=IUKG7O!q0?W3V*CVf#>t)hjlj-4~Y=rP?xQ+_4-Oe3pEm*c|krg@_(X2JS(GmRl-v2sCIwZRo^+-#1W{-^T5^-BEq-~@5r^p0Z_S-*LWQnw&|*s8aoIR_<7~$3 zH(xFzFAh6MWkncbx)y{17$OL7B!0zdH|wTRT<*g3|AH_HijO$KU4u|=DsAfJ%Hope zi%|9Y`=fCNWoNPVjz=>@!*jz46|w;XNt@&j{?2{vtZzsroL!`0190U>+P0DphVOD5 zA(vh1c%9(>M=#-PX3>1$t6@=O9i9TpJ^Z-hm|6yV%x*q6j1{l~E|T!#Cag1}vJ`&p;^W^nV@k z2yOUv(}M4~x(Hs%B&=jK$2$iZP?VVAT(nPjnahgD_!(99#>FzcY9Q(FX~}Q#SeP^m z@kq)7kf`>MFW5Ni*T@nX|Hc%}QWm+(NDT@3HULD$WyCSIBolu6mc^B$7zL6+(TxoB z6m%p-il^yKIf^Vf+~}p$m}-YV)w|3H(QR%mQ}GEGiCC)S?Ough$)l ztdJQH2m*1-5<&yH=N3gR2yR?njcafbu{Rr=F&|9 zFxB1-+R(I+a;~D@81BBO~J|Ne*IzPI$#Ev@yF-R*Id3Aa%?D z|l@iRp8?5I1RSuIl3xSIe@!}JEN9Bo*sTm!qapc*x*EFBMs@$>@g zR0LC&fy0#i)AZjpt8*o)qxVOqlNK&BP!8)X7xBgeo3aMwpC!@G*O6gE+@XlD!bI}z{z}s|L?(mM-xm#@16fsy{ACWlFF1SdcQaM}1 z7O}6$k##cHma`Wc{1Xx*4c-RM^8Qq)=1JVpQW-+F5r)holOkwlJsUx$mC2s1XAj4@ z0;+46N!`#US1oKz6ll4(r4%StrkZf+*D}miNMvUCEY+%UuNFX`xd|2r0*N{Uy8ciu z`)4EHLUWX$p(-ThQMN{532LPdqJeQqA;W@^#ZXf0MSx28(eX?wTrqiqN&Og8ou*k} z%gADP5X^Tk-DazRHc?cn!|^;`ALTJgH5C&CS0~j0aJ=|VI}01z1Y$l~*;oprJ03^Kv*P!K* zGp{*>myshq!NrHk=!{3i-a_PbPx0|Ca>@t~S2IKP%PS0jAZthIQg^i%SZejF9#sgc z5M*MWQpE4Dq?ID z7kcnsn!hH|cbyV^d@=EZF&G(fNchG0W$;<%q@qHf5#{ml%z|?AjuJ_-3rnYil(qtk zAL;wrjTjomsXnVP58zY!NRw#@T^f9 zBL2z;Y1y%UnmM(6D)semg#1#N#ei84VTt`iv|sdP`KO!UJBiczkKzcrBKdrNk}VW8 zN=O|5vh->*AnO$#KfjWEgEmOg!mi4NhDa`X*410TAnvjGBj}iiF2N3A=F#sdED3g9 zFlr|(D-QWqor8pk6a?x7eiwgTun^)-qDYPP2{Bzq$Z)4*u>0k0De3yrhC$)9WPu3Z zK0<yL&9Ra%?tnDtx zX1`=-G>whY(PsWeha17w4vZGY4X_W{3m;#?`MpdF>f9=3BTP#&e#m`+ zv9Fs=piVS7$6vUI20HuZD+-D9!^p1f-awcoBO23uK)m}Bp~n`i2?osI@pA0g9g%Ek zUxy=g=!-$;`~H*Z@t8J~;#9vMDY(InC-GIJ%oBR*FXU9OiMPaSK=wO{Wa1i-L6a-ass))EGS z-@H4@upz{;WXM!fG!sxHn#wwrWu(SJ%sz;nGCSgH1*Q6eT?@=5qShFM;2VR!4+)$D zKB|=1aB4m1y*Ju`eN-iV=)DDo z?y6nt{*>B^=ZuIYRHvLd-mBN5ZZmoA$B6hPJg}K4R5ZNON(0hKH=wNB0qm)-rXl!kBKW+T-Mrnk@6<6!kXY)58PSRT4>xzu1u} zhsn6QeJKy`d*vvoCl1c0qOOaSFnH`V1Kjz&vNl%x-22aBY>2OP6p&G??iugPtp+EF z#owum=?jOlN``wba?JE*F@!l|gMR7^W_Nw|p5@!_L-~yc?(G0`lXf$U&43G<(y4<~ zI&3|`;iDvL&pBgo;Nu!~_bv@Z&yTP3_TC;WS)l3chH5ZCyniO^2J;fnh6CJMK_aZ{OZ3wBHMpVCxa)KEcYXmK?plLmvm^oc z;#&1j3O!QGC$7aCi}BL2D*_bB4T?p(V#KwihsO2UAhjeU^&4lj+RE1aUx#>k>+>Z3 z?E;>M2OsM-J*Y7>p_g1fxB~R%ajikXO+8mQs-1a$rF7RS_3 zF3F_HAhtA8GEvliNbfZCeu^-Ge0D)LfFXeCJ`l4N&+55l}C; z58sO??Tg=_tVisYK5L@#kGxRm4Mjqihz*yLqgXW^@#`)9W?wzVkSWlpPP=Gs z;3#u6LD%)Zj_`9)pddhf6uF^(*XnD22>u>0RrG$aYZ%vD=)nwHzo!^%@@laMfRSpm zi=#C<%%-xkQ>w*V_Y_VSl$FIH=qEx>= zQi>KC@xWYeJk7*`dAx`QZ%;v$tx^`yJ<&__LD@>S!jy@|^JR{Y&xu;g7-Y^l*XF17 zPI(S9pLffrt4P+$BVDSQQv=DePZ`EW`PkUE^qvSg+r#n3 zWq^RKKvdo_`+YMp7F|^G+QPO!)gU4gh416d#Uu~|KpCIe7ju+RS|s!OmP|QIxow~i zm-XEp;@@}CPNO!a(zsf4QKUW}C{UW0B$+dlz9puMWAkgShLI>}l6(#>&kY`h zBq0aN0RX>m7Zf{oV4SOky!PB&imjSSGU4|UWm(t`)tReCx8fwOpTyGm69U4*^M{mW z#%bFSl3nHKDL4ilVc_pxBsLu5xV6EjM%=Ux@ON`0HbN6ldm>ZjyF1Ke;nqceq9Lq{ zGN2)BiXO8WYuRU=$(8B6A?A@)s3el_UqyFE zerz61tmF78-@o`%?si=_g-arnn#Z8)Y6P+=yT9xz_;>bGI8G@zz5pKlVE@xJ`a1}b zV|6(=05g8 z*;sG>5Je{-M~r zO@Rz1AjQJvkrxUp_@;*ryxkNK5FC(Fp@VNkU2x=j_~qP$E_1pPbd`Hb3~mk`;Jd{0 zC`$XdCi7@YZ|agFK)eDx-+zZ)7>`~NH(p`EKaM2$Ln|T*ebjez1-v4bx4ALkM^u6o z_`Ir5QCH3$E!hVyTwQ@2%wmdgFCB%Q;p(;y=GdiEKJ&~yfbAa_h?DCNLp%@jZ2HkD zX6GAG>k&Wjj(YORG#bNj66lNaWdty9tiy_Mh<&|A|ljCvwr_ zC$3WcRsl$V`*+d*e{YWe*NEz0fMr3;(+zdWnO}T$p(+J8?ISyVWyZpl)a+Kg$A=)J&GD-3DCe%@$ocAaxP#s+Cv5SWS+JtO z7j72uLz}QV-#2vx;oyeY{XLY&hbHz5b{24t68uRmVLRhXeLwfJ{GK^@6MlNC_yxxO zT`4~@_#VCsCr?_Cp%ln5F2znSE`w7apD*}BBOV4-?Z>^7pByDFC_9@Wj%$E6XeaQ1;i((fRnkd)tiv%wb>9S>tX>a)E!X6*e z{suLTF;v-g%JYvFeRBvltfI}sgK`vFBPo}$nUP-~i%cFFXTB-@XQldth-Rsk=mY(8cI{-8QvL`NfLwYEXp{u zv>P(Z)JzlR+(mdZ*oInOd3~1_hE(S<@Pn+>=BF~G>3cYpnSx3Q)72YLUE1;_1!A4# z*ql|`+iDvoxcH4#JFIXs9O&Ve^&vZHCJ#7=3c^QqU`n)$HQIq<1a4OChP%-*i1r&6 z$81LBWbp>zM#}~yRU9ma?G^$pT80BRHoPU`G+ni0EHuQ1gJ}`SlM)pW4&cP*h_#tw z@E9L-Po6`AivoTD(KBxI7A79`OfW;#5W8O~zbz0FYZs0|0vgr|?7N6LofOzT8v_~d zgI1%$(ANsn6<=Jqy%&F>A};E1TKHL98p(}>=-TiQ!*DUy>5nme=E|jHr(rQ7!V#s+ z{dICSM&A(;$3!S?D6X9fB4-N@h5*DKmin&-^cs%tYRk?s4A~Y8FBT$gphMdKC5*;~ z+mWlqQHh+@a5{@G!fJ{sj-{VmZ&9N)C`Lgg(IGuFI_WJki}@o1Q>qNPGa*_;&Q*jX zX_vWTZ5}^xv07&>0KHXoO~=vL!lY4=GPvwQTLUK%w7%=-Hm?W5SeM_?F`;RaiCzzT zr=hG0-Z!ySvpJnO4C0Uk4@=taI5=gT&ftW($VQBHB^_D-DMMcUN5zLT-498n<-RcG zd1sI)8v+3s-oS%Jc+{#y)8m`YqYt|Ec?{I=DNj@XP*yyG0&g>+{9_@>1~vsN8lja} zk{a96ERu|7%`0#KpGRis%|TN4Sg=op?ZBZ-1ib4H{-_?VR|t85yJ88A3^h|bn@3Ih z=nog@l?O|+ti<9xg(#V%?BLT9y$Y(-06{oP%hVi+VLz44ZdyM}btaoWxJMBb#WWvj z9vh7e%Uc+o!;Gbs>G-IjLD61neiPWAhUy`uN~4!2SS-;1R|S_vp# z72TXq4i)BqQ%X5PMQ9RQU4$9nUosia{Ha&*2a6tXVML$F-sb1z$@J(+lL}NvPj1&y z5?tCDPU=3UGgZ0|+vKdueDo6zZM^MtXO2$d@{rKF#^B)qVB_Rlzm{8F%M1tW#nUb}H( ziX9OKMdy`!o-B{f3L}-KvlbnOo;HVVCU3P7i$-F*m%=p%pdHag z-xg}gW{L@lMvG$>R2u^ws+$9zsvZa*AyVk1s$5bdD(%Ynu7CGzc%DrzjWgI)lZ&ot zsjl`u6zIgANh;SPelp7XgT8dSxU=Y8sxdO%u_Ys1U(_|9oRSA4RIH1;=53}sStu)R zJna2JW(+xnfCc<4S+azOf1pq}g>%f)gQYOU$7w!|Hy|?!2@L^IAzbH0Nccz`3`E)K z__Xbc7AxO_Ms%IDAU`Iagi#^b>lg=ys&)s;CZj}klOV_!IO}L15c3dC_gbasZtnN? zEv(26C#=_u8nuf?DUI}xJh$>(s=Uy3Yacu@jPHteiyu7QzNJ;vJfjv~LnU7&bAn}u zy8en8eY$y5?an1ocmcVu7$peGVG-NA&YmwJ(HSVa`hzxajDa6CRay)=7!<{;_#*rs z*H57KLJXAnnb955YL|{!F^h9wEV+ggGjtD3yNDeA6HuCd^4kj8@h4}|NHt4A#yKQ% z3_)MGT!<$N%5ABlI>}x_>=SHMiu?NYBR52Fpg!I*=Kg)Nfk3<`pOpHKVb&0O;?Z zCHcV0Hyl`-0B}fyAZxR8{p7e(6~is;}rDw2esg^5#xhOD64d z6paROoOwP9%%M@w^{<5iAXEp$imgH)goCX*%+$5_%N4h_QaoLu{N=OkMv0gCPfWB| zvBTNdTgb7n*oP^A9TB4POa=Z6BJ-7l8Pyl%_qb8{Tl12$uO$ZgNgSdBWh(DnpWent z^|mcZ&fUR!H0QN>@r5ePboV@Ah1TD%6E$K*Km>85OY)h)rCm8n>qUVoiO$gsC&PIx zmi`-Il@yDGP_F(L?WCpdoUtn}@#cyi!727bKbz(|M=9meImb-zF-EPmDpO>7wJb{0 zavIckO6z}7kzKf&kdLUpIm8a@N(Lj!UWwYQO}XYUaF& zXeD{jO{*Lm8INu@F!1=d^^&P{K~hyB@%h)8)4)(7{O}}2MdDb8zpDXaUDSMI!e|z1 z7`4H&fXZ&+vR@AqZc2_OO5;Ta?$urV?}G|5cZMB@Eb5{*H>v?M4aPWiy+aSe;P`hQ zB>yK(u7JpWXVgdH3@n5vZUVGa;KjG(A7RClNtur0E2*sH+0u*ko|`IwWyg_5pd>cR zX~rfwU%70K*%JC}XTnN+r_QO*dTlhv`2u}fmRvDS>gEN14`nppRm4J&?T3(xURE{wx@kd&mO zw4g8_j1YB5#BlYv{FJ-A`EkWkx^fasJ320>B4=3^5r&!}Ki~wxnEw1tZx7y|kGLX! ze1hz@_j~A$-Fusiy6Rx+zM6aZtmc^2*q>3+(8fa`?0)>Gvb)8UnKKcehuKje9- zu$)TlX}{z_Q%QZ9OjOc6;4Z3;XsOROoT8*dHAE{C}9D9?V}ZcDW((Hmd21#}QJm;yaOoCr^M!e4|Q4@`Su zO^9xZPcL0Qu+A#o^I8!%ZmmUs+$+AOMW6V*a(MR-JMr`W5FRfTpQ$Mfs1xdoREatw zg?&TSDx3yD^G*&zPpnod923#@-C&m6bb+O)AtCwwpwuXH~+{!qN&YjWyO4Ub5aUt?))>=Q#f2 z%cLqpMn7s$>;fM{#`7C)0TjhXl;@6K>xqEmaf6NuwrV9|n}uck@r&Nv(L5&7V1{Q! zY=qWFm?gj9wR*C%D3zZ{)UXGC+-2bfQ_ZZ)l%HeHLxE9cJiNxVkJpxXNv$*Lj$X2* zY!unf(6@^}q`(BcTEF5gf%Sx=4Rw23=od=;+^@ayj!C&c9H1HN5H~;3yGLvFZYq!I zwQN+<1F~C@)Y^_(jGnu_6wBS9M{hH{YIqERXK))y2DXkg;y_&C#kj}+B5Q~F2ZPYY+z zQXj=&@^jHmqJ2tV6uJ#^l&ZHmMFQmxAq+&h#h;uF@>_gzmP=q#-uaf6jKmC5XTvA$ zUB&*+K3-Jvy042}K75WR?;=1oBVtIn`oV!qz4e)SyJ{Sc2m=1v9c#V;dIhP3kVv6 zv5-%@qh`3K`6Tq~cl6E->K9#{A92@r*mk+(<8GaTKP@r?ijv5m;V1UBG|7oIUB)J#TAW4pLJB0~$r1?(>?sWXaEMdIBEgS1)*e`2^zh ze}enkdT_<;(Ee5x5O=M$epug-QBf>vj@ZB+?`srNFW748 zX@cz6=i^N%JFvZ*@-KgwHkNiQL3o}%bch}F2y`emCBKZAeQ&FqZ1_wq>p)l+HYMAx zuIg4>cEEiRFkT^o@~#4Q2^5{Z=_hox1WDae@;+bLDDDJ1pyzk#GX2h6>!^LkDX-Uy z$JUbRl6a=RU-nCMmBDLaBNrVukWh$UQT@AY!5Uwlbl9cS^lJ7z^Drzf1<)2S8${JG zjkT%5Z+K2Qh1wk>$IWb|cYa6u$CgL%HX;*tZ;};BI|`x_C~JcXp~61Xq_v0+ly*z^ z5m%BL5m{^DRT<)P8&vtnkRh=Z~p% z<&hF3S4v6tzYJ8caU}-Wwrbu>;Haam7Del;KzF;z@S<6g%mGFwDY|;`3t1~pcr9TZ$Ep# z`hSOTEnA|fN}gb!Iub4zM13&qC}Ot?1a^JnTvX@rn>av>w1I@SPHp{nGKW1Q#vBh_ zzOjzfn0rlXY=mO>CkiZWY)Z!^J&y7LmR7Q*Sq*>yb!4*8xB25jpTgt_k|1J()d};( z4f2X(v*U*C+9#AXMq%gcpS#BYoXh?9#O@!ea+};G*nw|V`Q<@=Ud}`> zW^QFH|1E$waI$sy*RU=+(OP~^0d?fd^-OCqnSAC2QaPj!PAoWo@H#I>LWo(H2y}0( zro%CKhR(Y5_-H#jq@{D1f+XYElRr3DgtuiJI3!GSH7mz+^6PW*Yt#Gd<%Qbshl%Q7 zd`uw>F_jHKr7sN{${Y>LXo$M>mrft3aDfT?v(knW?&dFvWVUhjlFQ{98@vNA@0ZqJ zF@iZQc-$IBn3Gw`nYyNNDeF|G$FwW(zN@PhcD55$EEJCU`&uS|jeDz`4LK>njYljo z=}Qw{$PBOzmmim$Cc-T;m6N5yFAj;GCfgo^$etG~{)l6k^Fp{oYSqJCoWfSss+*we zzH(^5u9#_kh}P{S^lvs}4Q17DDk#D_PBd+_|wA-kXlPhDsmVhZVg%yk_`=nZfbYU3VkZDh$PqQM{D4`aM3$q)0P-uw-`S@jUgN{Y}3K`{g6CD@3%4=|oeMP~V8_kI8|1Gq* zPsHz+D4PZA2cnzJn0^OJcL76BQ1Uv$Yfn`A1e(d#CFvIMun${iudj<#xg;ifQBmUZ z=l>u346ob#UokPT)CM%`l5A?49D zUjor>GaYDP>JmnqVd@rU1)ZUeAYQ14*ar%QkAk0Ioyz=P$|?Hkx0U-h7rIn=@*ua= zE#Af3j|D#=Kh`XRNVa}{M;^tuVnYA;8iVT{EaNk*$1Xr$sOX91v-%n+)EDF*s`39U zfd5$W(Bu0KPG4RYB%o;LQ32NHWCu13lhI1;C%4_!rg`x%V_t|V0 zwU6qb&efkMQ=d-GZBjjsM|})fb7<&U4L#nEE1tRDkDE`|o4!{xz{@c`s|Ew+Sf=OC z$lX@rP?Mt^rlDY_)*7Lys9C8uzwz|@)Gr40m9L$_wiN98Vr+K{0@RJXr2ATe&q*1* z#QU-W#$4uiI-vDbuX(|0S8lv@kSf)U$En?P`w&n&^S48xYbc-N0|=-8M zaHY>SsSqJ&u9N1^9zB71=X}NkPxZxb5>ENKirnE9)a@rKEaJtID(`4m_;PR+X8Q5Q z{elSr?;_^S$qNDS z?qf4HX0>HFzPn;YO*^sG>Z@B6r}YQUJw$^^se%baMT4yjQVOhR-{#zAg#8=k*T=Pe z_XG+b1&c7N4`@kH9Rr$KtP>BCpjj?!ZrN&Z9VEEEdyWwFY=4?D4!nQ$WTKO{JLE`5 zk+wU~c=?=V4&*;RIk|bfPBTx!Kz3F0b^YasQEV<$#o~?R1Fxd%)B0uhEYeDf9V6Sk zPd7>AV!yC@aOW8!M8ZW>FHxZ!P;PMN19f=$+$wkQ5ubLMn~uGJ(syl^gxkc=haPi@ zKu+|-H0^LcUP7s#cs!1{eE$A1MS`Z7+;GP%($AXK+puV%Dc(#a7gn4%{BJrXZ%RU4 z?M~q40XHrtZ$)gei}fVnMeXc*GUjBiT!KgJ<2ETrCWIW0JrZ{nS5AfuhA4rtw@h@G zQx%zuFF~IMM*rs)k|+Fh4pTg&{K?0SB$O&#s8@GQ&BRb=B60o9vy4@ivwc`*LU|B= z&MlHwp@$Wdvq;d(KFgFzdRWL1=P223c)1-_aV!MfX9n)&1f*H{^>V%cb)&s36Pep+ zql{SI?;XN!4HORtve7q1uHl08!8jtGB`2ZWu%j9B9^Th8( z=vtX!Jc!F(YY4e*$0z~sSz064@%A$U9M>h=jb`4H8VvE{%iX7DC!TINW?Bc$dmeD|jgvHj%2%AO@hb}+xsRA4ke(5O zpaEZ0$?T=Us+E$)?&;{7bO|RNd5&wk&q2&ADHyJ6)6Nkd&4ov*+v##Ej=|xcI#QpX ziv#5nNg;DsG&?u3n_Lbr7gWF18@pJkb#Af?-^d4BsC!2#Z8cP>4AUbP4~%I)vgT0= zD!eLRRWs}MD=#NMrx6k4^V1+PjDL>LvNyP9$FaHmX?Z%2$D!PDoQt1GZ7&L6_z*= zY2#GAY~9{g?}#-c;EHHPY}?9iQBA9Kda%zdH}E_;1Ki=R2Rrb)8}6-%&*40sq05P( z9bp}Jb_n(C2v5jY69e9Z-8}DDyWZ}txo&yA{J#Fa{y%s$wx>*Ct`+=wX%Qg8L)CXI zW*DPe@y5pq0nHA{(dh~D*jJi9K!bPXH*7^X!;7UH5vH_={#fESER^C}ki>2wcbq|t z8H(HaQE{{#kqHWWDWYjM1MhNj@e9iw#uVi;Fov*uyY3QFBcMxD2FT*AYI&0hs;0Cm zuJ6JNqJzxw4Pek+{3(yh4#;CVoGPv;x3fG_oC{65!fh34SAFPA3$(Y=VxHWz&UAM~ zQm$I6p@vl|Q-X?PHGKs&GeUu-?wUO+VI|tZd?CY9V`!m=# z2|L#Mt6T-J;ILFCMGbkoMN+U98R}+CWqU>A^K~FlIa5Ns)e;H6iH08N(z1cEoX0v% zG?Dp1--B1uOrNP~mES5@$3`>!BA%5@3IK(w22WlS#u}v@}<0W5qH_OhkFf26toi#_4!8QCGd)5Y6Z*vqoZvzC0&byAB+06-Q%RC z+!JegYEXJ}QY<*>(Y>O>S7^7TWXD7DuvwM_VTZosw7i?*2YE~WB@gUH~{ z>l9I@W#%bJG>k;8_%3aK7XgFD)oJ*70RYZe4<>Cq(kJtz;bLx!2OLK3Rpb8$}xd=j#I-EeiE=0fI@H zE~?BlQA)g}7EOHF;f)Va@d|P+4bH&1^OFMY&F_4BW=h%E08aAGKalW}=^~qhIzN+(sBo<>vF@s7$Z9$E zDWXGJi%Ju;(*uD&=S~np=tm_2Un%}2#d69WE5An}4RrAvQkTB!?RnlbzZ@rHo`50rgolgLF*D)Z?9cr`|bx22)Ci zZ!e_q_KUkGu+keQQ@o+SP5si`8=GsEq-g1 zY_^3uPVqi5)!NF_1G&^;3-tr_sbJ1=kvpf&5E}Oia0Ngz5srs2h$9*ZweC(=GY140 zcsi0AJC5we81?5j7mrz=9S17^guJv59rF%2Sl_yDf)>mp$ES4&&2Gj~C7U!~P?M-S zUM$ni4>)T_0N+QmMY4J?(oG4N8OE|?ba&DR$o|z8Z(|y@(VkysT*Cf)C6T#wpHfkH zY_u}pHm|ha#$)E#F&Pw&WRzT*vXs$PSY0*!(V>ZQr!j3XGl-nRYCkl{AQSM;FM~YT zHM8C%CzY$WzEicx0U&d^J*TB|AhIf@|N0)Zs6-;In0xaEdG zvntmIlzoXZ)TBP?iEJ3E43$;TZHLMqjK4Df5yj|E>j@O-4$OxS&<$F=i-qK;2tWW( z#ZYm@4WgRFiAjb32+sjB3w&kNE60QWyJZ@^zw4kTPFw+QX?|7 z_Xqk7;?F2+C;$xMFF^z%C?hC{&T~CUOSO)(4K$&c>{cijz|l;r^QpiphjT*0p(f|g z-kLr}#^${u$;@Sv>dcbbBKJmFZ1Q?Ql*ipd zcmq(ykTqY>O)G}}jD3G-BIY9iLhfeYoPda9Zv@3HA+u+9sW}OG4_s*>^mdPtS6T|%y$7_JS?ZwijyLfM{^O61irp4!*atOCg+Bsf? z;p{aPdG%Hg>5I|3wTDLb4x#q~%>MN!mw(^;Ykvgf+0^DUIMeq5%|_H|A5!l&M|z*H?g*3yok8nk1mL=NIw`Awb6XLfGFVfmn~gtO-%&3qX`+7q{_`vd&R}NR_Q#lcMW?^wFWVwhxF?!>IU+} zkh0`v17l9q5gSyajQgBQnr63nuWD{YyuuvLo@7H?&y`=gdCMS;xr``rIB&d6R?meb z1~a|g2WndxW+ium2s=XN%qK2haqzQ;VBzdAH&G~&>WzwOYw?cVyv&-?R1_Bks}WOq z)X>T9-%A%Wv$K1vnDJTlI%_R$I%M8uR7q+{r=8j0%>8gt2PFUB3hHSwr0{G{uCAF_ z%!?_fQz8?q40p$|yh1)nQq(C`Gi7?u>R_iHX!!@xJJrrk`8+J9ws8hk*x_I&^( z`K4RgsPq=+UoY(Bv8B6HxP7~iW5_?op{EA5ldWx;pp;)U%%;0h&BccwjmNk#rC^&y zZViFUXPS`7)L_MuKp&NgqL`30Py_HIN?%VhfYt`voMu#OQSC;?L5Y>m?RvAU%3lc{Uvs=YFHkE7}-crI+)2e zL{4SJ!BNU3tgL-nWBzz3IfKLtvc03qm~hYjnk3OY#vYRGT@?1F;{9_x5h-ynA=Y^VsoYF45ZKC++JqNiZU7JV@?McV1nG> zZd8Z%@7Q4^qHFV5GtQYXnUEDW9%C`=@pf?zukV-@@Z<1{h(pYNtZeG0tLXELwL;0B zcMO?F76?QXM7f*xq)%8AIKRW~J;_bjMi4_aNl-B`hwkFmSqMKWhD-b|9bFvfP>m+9 zpWi36z8_4?q8e7Da4vQzH=`1iIFU7WgiTWk;gZ+ix6?(~xNP~czsM1qq^VvMv*1Xu`TO8!Z3;c%P2`<=6K-punez^F5J4{cG}RCAj2S~nkT)mB2}DuDcEX4uSmC5! zxr8PT%+g5-!Q_89+S9DVI1OtE17uvIDVPU&7`G5%28D!^_H1-%mcU1d976`$xu-KT7ah>H%}zY5FK0NYt2Ab z|J-hW%|5UO3%!~JBdnmh5>PP`d1Jr&wR#oL<#gYVFByYASx9`dqV6e=F8`Jfbhv*}~h2(|TA$d)2^;MYjrd z)Mk#jU`<>iMzJ|EY-}@5vX}SPb@T>lE8@Yax^O#r6bTLn+7CKJVbD@aFK7t%3C7@ix?8g=!L!eXV&)Fu^WxJRc4 z&vc+R9WhM#E4TG%U7T-!q7St{@%VUDcAKXQUPz=5Zk5q#(SCcdw7{xpp1(GP!vAnP zc8^aKJ^trSG;Q)yanhF};h0^!eWj#m#U8cMdNs}QSTyyL9HEDhWpjeeuJcB@s9A!= z!lVJsa_Rbxqp{PzpTb)7NM*Rj&}{3iISk}9T^OFV&oLzD)BsK8SW(zJH+|=} zdc2$5 z3*$c4oxJ8%|0Zim_5r)%hq|05yDluIz7lW18FG@hn!I=Acczoyw>~i3bYY7PIS}2= z@x3&=U@@e+V-36c+}6_8y3DfRkEx|vI&aul$A{XxK~feH6c)eWKd3w{!D6dvL- zRJfr}CeYB(dl|5TNRL|Mj0Jae`;NcZN9QOSIU$vF(HW&#_G$!*T~l^Ihr@xSTZoyi zA$t?4-HaW=`freigKCPz>}BD*gGH?4-fBPW8(pF3XBWvgt{LMEN%rxxNE(21);BwtIZ?;U#rkxig< zH;P^x!O*P>O%jA%b(CRx6d;->%)%XFaSYVLn1JmsrcDajsWE%=%qyLiZQ+B9)|T|y zn-RTD=?ljMxf!42U8u1VWlKVmEAvegMhhh?!m5Q!KEV}94u$WY+<9p{3BErLk{ikp z7twufnJoF{zX1ci z#k?w86qfL#mt^!e;Tzs@fjk|6$sE4h&74+jKyh4h!yq*l(~skX0Cf$i=>9IoM8BiD-`W9Exmq6 z5yPGIJHtNiP)8#w*=U$AAzXDolSTDnFaKD`JGkfvbgQU6IWb+ zZ2AYmtF}CD2@?&aU*HJn1?ca-_H0UJ+dky^;cwm?#jkU2N)M*?dJlBQ&3LGwKV#!o zE(;Ou_|q?eg+2o{==j4HzW0#7L+h0JWWszv&E1m}ykH692u7e@G_z822f$uLy_9{R z=*Q@(9h;Fo=9c9kFNtaBM#SS4O^6n_$-0lzo(llGk$+|-lnZg)17I*11~xszOyDy4 zLV>k9bpM`Y-;q)MIp%6CNMN7l6l&yZ3qafl4n6UR*7fHR2^~o%^Z3Q(jt9}#aXjz3 zW5eynCxk=slV~u7LiuNUNeHTA3j9jqScbZ;pDUVd@a?v~fVzN^U7~&;jr)&c2TYiK zN(aBWeIR)bA9+)5ElA3hVC;>;PH$k~7v2BE*gFMT7I52|RavP@+o-f{SK79A+O}=m zwr$(CZRbuqyUsoLcKj!zJGx)?dfpFft{7vE`3>T_;=_CXWI#X6vFh%YYs^q#X9C*j zg3xS>dg-6j-6zmw_yYR?fN?`rx9TdQH-5ktN@^5 zt2fFzj0OI{x@c{;@0)OUNX&k5ZpSe4L*`bl#iViB7Y1cOw!#f3;iJ>?OV01N&?anu z?@b)hRj!kl)n8&(No_GX#V=C81v+*NJrdfLB;g5pU?3@tb|FJCcvT z-H|JY!dl5Y$h5Cs@`O5Q4o6hcvYiAA+V@z3pa?U z?GU0sXo}-q-c4Dpjv?v~-ff$ZF6$Q&@-B+e3)kKv10KC>XFz_~IU;qPZjO$^^)1(F z3PT2IAVyy99=>3GwpXEL;)By^&75}pcc97ps7I*g)4W9Uq1omOvH56wlR;I-J_>7g zpEOcpUq&#>a0_9 zAG3y=F4#qc&ujef0P-FBIX9Itafyi#t?`h?h1RwJh=Ep; zQ-$4pIS<}bUKgAQ+_($QB-zOfAE*o~jxCmI0;HKgQMAPY=n2}bI>JUHaH6+GmgcWi zluUpi0v~C;eYR9Gp9tkUSV|&VgOJWZk$G!gEoP2!(|*y*+_k`v|N7xm;=gxB_1`3N zEb?HU&oI*Ka=_aG#2a()hvENI2MdcDfR77sL7se*RgsQC%Wv zV{H7Q?C%%3TVw=OUeSxe9V;F5b?GC)S44-xg`hLa@!W`Q;`J6kj+%#hU(=y9Q7Psl zMR{{{lsLon2e(ed1SGjnxiLD@3;WmL@)x0uqT}v%y@8q{WcM`kstO)Qm{r0L+oCLg z33Dy}6|hP8_El4URSwa9hUHxh(_M}DRQ?u$N6j)@8|ArD!N(x?tY0at=)q`0avk7D z8ko!G_wp4qy)^3rmP_NmlOtw}l-Xx1Npc-7^<%G{8rxRJ%shZ4D0P)k&ai?G6k3&k zR0$YGPmA`NO`rqdvTlEKo4=c5e{LePw>4`qG;C`)sv*EZgXA=R3hmBZ?hEWP+!0p8 z^99LnB-zzuJ$NU zUHdJ;nDGSDLOa;X@9KtkVP_rDi<*T12eNF0^pSVI|FTd1($WFh~`H91F$3&fn2rorsebV^XB#r zZOtw1EvK$)^XC}aB(Lq8%*-?`)AtP>@B6Ku=R41vtHU!sKIfmk_MI60+K8QS_>sD( z*Km6^M3B4J^s2ll{UJr)q0Bx+Q=&y}qUkZ>_dv+&AumQwQWRc-DKer~eE2}bejp^? zpdjiCij3I(83G>dh!|+YEhfi{x*0Fo)JYKsWtd~g2?zQlp%A_M}wvNP#?Zi1VB z0a3SOEv3$VzD1oU*{Y<$<6kPX|MJ&y9&AX%v7ciPZ|zsDmD6ExL*kNHQYF>kb7wd` z)ROu|?A2s@J;g<=K+wQO(Q0gZwxX>QXGZf1`66jM4vE$t`c5Un>1fetcRN>BQ!^a? zsRN6A>BaP8Mq0*{r^fNMelMOBx|m(Yu_Q@*z53luYLNfXBUs9k-st6y&r-9UG$mOm zKOn5SEdCWaB20Ht>I$27HRWfViEDlR2$s`-g!&#r6cV` zRB%^v7j4G6F)HY9AA zsWOV?g3PmvLdO8qJz(k5TykohrISRUn`;W%c$lM=$O`^A*s4qR-bLMp1wM4i&`I^e z9l`FJpnk237~niR3FBZhSAn=`zIBeE$$K?cZRxYk*^AD^v=EMfhN!it37`UtF$tAD zk30|CV>VYRg66?mQmAyfS6*22Pbxujw$A4OlxYK#d{auGitGotvk7IA@3o95{sGj5 z4;G6lAjX9$;=)=oTT0}U=4uAJ2Y#J-_BlHf3A$PQ@iL82UzNRgAmvuakb=JzSz^Z& zWqFg<=k%h2zyya+U4wN*`;8yo4$h?FT*D&<7maKq6_Jm4^`;sDMl}ea;Ko>uyqdrK zvywklGjTFCp#KD}QXrjohN{Oj8x{p_{Wruxs`tKO5}??yMK$ zx3!Agzk~Tg;BB~jb2P~Wo;?&J_!8#l)60j|iu=t>i)eS+KIh$$O6)7s z&t*3Y96XLy7y6NV9;)GCD>7|sWB*U9H+$BcvAwWrGF+_8kT!nAhCUt;pk$ugW*6*ZvUf`0xoREB~MF0xF8DLoI?JgoVUckq<98v}&toa zq`Fc%EL(3?n^cpNT)C&n{Z1DYR7nm=k#W%-kGGH=Bqar&-EAB>TW{7~AS=S(4Q2|7 zH=m6fF)BqBR~MD1r-op#IOZ44^K7hG-JG`?DW0^$W^Gunbz6J6kSQ}OmWfkF^Zod# z7MqHsT1;(P{28F~{dK)rrP94attL!G!NVpUn(o1|;7Eu*WFS`pasKioK}NC}B`R!X zgQUtvw>@wIUA*~%E_JD1qgqb(JAZcq77}tZM`Y9;DZM_@LhZF$e@Z8sGt7-TV#W4& zKw}!SmAyJ4ws?j06c6di(Ic)4(uefY$dd46CEuO#c4gP`?9six74O68llwQ6^`(hqTkFH z!k+j_u9NAlc4ZPUtVxa05gI-`% z_8UA8XXbw575n8FUVjocTvN>8l%M{!*IM((VIrDw-use zB`#oT$>BH9WJJpa6B4zRZ7lw5WsO;d+@2XjOq*zH8gh^(8WpkF7d77>nM*s|=DvC{AFT>dJ_6zkQ#HZ=3kSG8pDL4{byYkVXtQ1uY0&bXXHnBpZ#G5 zHGcQdERgtmFXYXPdrEWXX#Dx**^4^>f0tufeda*)%}HgpdYOLl!TbZFbB<}dG;UFP z#ZQME7>Jp8K^RYI%uH(v6&yg9Hy*-!MOf+bav?hI#-XMp*6E!bNVJcHGmvk6Hbc;N zld70Kto-JeLvn;)@RM&2Y1*;6Jrj04q-X%>dqFonu0i+r<|w8qXX1_HoQ(NBevW~< z8@&Nfn6ce5g5HKVgoO7Jqp#R7u>w8R$3gQFBQo`=8Um5dYre>H-ZZ!6P*_|5ZaA64 zG5n?(L2s%p6U+eBdpz`xTYu0R(Oaa`Cz`ERhFKj4t*Zd!y*3AlPJe!^m7sp+K7scW zY5Xzz?d;|k^#^gK6_KQyWzk7B7?a%zVU-@wuTz?lm{wm4-3cUKs z(Az-hV@Zg>3m;r&e>*pU`l!e&l+*(nkQ&0@6~h0>jB!gebmTqm6`Y~v!`R4|HGHS| ztwWaoYs_iJ1FH;QDHbV2uA)D*3=*vZ%2G)=`;g&nt~F=#P|r;@fRT*6DCh8D%U!SOQaHmSv)nn8^wNVd|UQx)+`6-oNs zbh`|VaIVFrRz>ZAm@*5y9*y9c3RL!j>VboEcTdf##lJR$*1yzzTk6u`p#1R;W!qvW zPOmt1m+5)FifE~q>p_z23471qvnu7dLce9Q6vk;4xDSjjmCOM&H@6waAP;|4J%Pvl-#cs@uRdc33b!FISgFQ+;L2hYkWnvvzf z>!HhrRvAFAMp-v{xrJPT{eB#=4^)y16YwO4sM7z+Q+r#pEmt`j zz@_eEBZovv=aUpPzU1-lN`z;$VcwC2jWTH3dcb*jiq1{77Ix+ z32o90jL9$>R;UtuHy_s@6+`8Pa-8decybkyKZ^K9xKeF~@Xg zZaR|N4bYxmh%RDreAeMp_57vilC)kI8?OqkY(ZVl#qTu#mc2Kff&ECcv99f^enU*` zREdMgW~S4i(Ok^O*s6RdrcBzZh-pV`_@E~?NQ2p8CpxH&$@DKx?J1xHlYddc&M!Vp zeLayn@C)L7MDz5kT9t*mZP{;xK@Kd4t7LnTLhhB~|h(eJHRuOy71OoXW|H_-WD2|Zf}5sDKA$PbYJGBp14jrgDMN^+=#zVyE;E^)N~ABKjiy_uuY z|2a2Mb@TkMX0GXsv`NFecqt?@B*veHOld#l2TKt^#3AX^e;D_dvtk zrBaz|*VC@}x0yX(7a;H@r**2RS}u3e>1b{IT&nhIq&?$sAx#MS^J#F+^}OjYbGPL% z-F3gu7J~<3i}bZWcqF5>7aUBrmFicK*}C4`R#QWl!J(PeD$>oDxTk?xov`PQX&t*K zf@vMUCu+SJsae0*&&p;!WX0H}-MCFKkVR;pBIk1Q$M1^q5@F9{Q%t`^?%6oNRtL`g z)_@JCRi_xf75E3w-hdJ>xhrP$78&uY%yNTd(K^rjco^?8DNnU{BWsl`qZ(=2I}dL3 zwiFuzn0o5E873Gw*EhVp+?x;9*Blh(bdROEu5odmfwkf9ryK{l(P&ODH|RHPjjYlINa z6B9@E-p5qK4bYbD$aJ+cHYeF=JfGT;Xx4t<#gn}BLno}wn*j_23 z#3VLIc$Jn)cqFXxs(Dlk#@-7!5kXuXgNIwLKXTwQFsvF)MZ_0VWKtrv-#oD@^A~>v zk13o}5h{8{U13};2m=-G;{MBB0Zst>VdP+kI;VhbXr6RnohT2t=wPS@!B=`&!NLqO zv%&<9w7lCw`)shBa*L5jMfzl65sZ;=)T%~BK-eO`!{Q}%hk9&q%mJKzVO^8HUO=K4 zDaAZRd`>#ezSXDrz@uT>-a{q15gS%`Rh2$_WYf4NS=u|XMzm3@F-lmg#keYSD%InjOh8PIhaIB zKUeN~9ybCcWQ*MxBOx{iOq28s>IM5^5wy)AT^J{4O0K)F{7xjWHm<53UBtgx)54UvVqyQlsA}x z!1p~{HHoF(`XrV|2eB&#|1sIrGs`!CEB|e@6W$#SKDjU#YL0tvr1nQJ3+9n=Qlu(c zz0_{s43}?&i8EWc33=ws6^{<`1f5d@VR0_Jh?C7Jc{@~^lM|R9t+TJn2~#--L;@_= zsg&v*pptnLS=5}nN*4k~xXHXL4q!XW4rn^74m?`rMkq6j4sh4*Xtx)D-E#Q5f@Hk$ zQ}`DzxZX2se5KN7FTcJ@50L8~DR>?B9dLd6bDXp&f4G7F(CBo}BG4wYG0nHvhm|Cx z{Vzx#~%yoh1@5c#LdiTw5lR_Mm~AlQ@G4Tt&t3tZlLhaj)M$| z4{jU?N95F+%Wpp(ZeAX;y8lJfx7^&D?-oUMc#ZWpf{T0N2u=@yGzMWiG`n^3K`_7y zO!GqH7px!v1E*hatUIx4l*iWECA4QGM%N5<<70Pp`T?UY>UPNekzZszNRPS`>q5`L+^K z0(9Me=qC#a(Kc2ceGd_#^x1_uF~qO^C?rLCSRH(v9>m}2b&r%jcSxHe;OLQpd&4(H zh*B^W>pLqSWNfb>?Dw;)bbzNl1vI8veK5H=`AY}Q?GU)I(q0W=rX-yF6>&L2sdta z0xkugMgh&n8xc5|jy`9A!|~XY=PTiEpL2jKxK?T~j`N2PoZ!mNEYF+3)bSct`cpXK8H9gBI|i?l*rQ? zUz?#1GB8JIt;VR&cGQAX*2KB1aR{CwimL$9XVGz}qkCH5jl{;~JeQr>x{wtn^7R#a zk{gpmkUFauJQNYjSCR)t!KBs?1DR;{qz2&vn&$58?h`}pr;QB=@|;P4p26)^C832io7t^dQ?B|`yvX9LRH^5ErFQto#Q>4xEdJ+$0KCDV2L##@ zQO3{{hT;hflZ?USzAp)C)m4kuOkmaVjl}VB?-R>i=vPEKmN8H}75u~yJcNH}Spv?v zIR(M4&}Ze7lWV|E^ek7)0M!6#NtUT7HBYkh`N4? zB?_ntg-8?9<2qFU#Xp>Gttw@}8M5r2;>`E=-;TXM)9UBKKd%G{a1SFrVUW)dO!kpW zi^%2#WcP5~vGm-*wI8Ti=N(#8vqzR5{QE1=)ITx;8`|VZ(3_2K*TWrdalr@rT$?C5 zhyPU5H|9YbnVO7O(;x1Cgh%-Vk;I!3R2u&do?RZiun&i~6&tZ02>Y;uGUsY-4t$Dy zjJy~kA3HKwc%+yxYqoMe`k9De?q$R^TKRz6YYHn1RZQ~4Lw*%xQ!H3opQf(Sq*&p6 zHJpkx@-q^ZVr23%{_@1uUEG;&cx|IX8<65fX6&Yow*oi08g<}`x5rFNHMSlD+}M3; zFVEt^s8Rt3HmFy3t)DrWyA%*5H7;2@c`k7PTG&h=G#1_3++@wd1h3NmjeiS{VJeSJ z#AWYN?aM?r?aEqR$c?5UX&x{5hO&;)_hgmyRE#yak! zzT#s&io(;Lu1}oqey+RU?UB-@eMOGH=D^S$8TJ7UZDB)A{3bVR`{=_R-s1F^<3b2~ z4sSon14DI@tS!7(IK(LvPT|b!_k<3R+sp6y%;v@aOGfBB*Yk}Gb-u?GRL_ACYE(nNzbNE^qA&WJ+9<8Qp5h{?u5ygsV}jJ!HG^oh4@cJOMP;PVLV_sJ`^W4z*#BE z>hb`ZUk+k!#>3aDY?24@Mio?sp$cxNT-Z^ypEx~!l0sqI#ptFxxyu+OK zQQXb0JTVDC+*U6+$19xjM#xf>sl36^yx8z6uw=mv;Bruyz&mlVaDU@PvMyWaYQ(hw zus7>Jegp&T_)kR}oE-Ik_>y#><<}=Oc zreM6zDJ_S=ptSP3D|%5^acWTyqfGq23vTlVU!W=wNT^o(KCDt3@V~|ZN_RHnaG9V4 z%KbIceH80TaCTTBYC*#5ztyUxXEr&FQhldlB?o7ofx?-ptWF8f5S<`9CICvZ`dqKD z;Cy})D6L4zd6TvTm+|d|#el*_UD_vuH%qgq?hd`3BkWBs~bin9mcoxrfw~|!v zpPowIo>F)|1Tj6#wyeI*f5z=(y!mv(?^_WDA!)&F$9j(x$U6}RQ9Zds(e0GGJBj&p zXa~q{#oat9Lp3@HV`L|O=KNNe)EPT%uzxx6f8p-lbsIT7Ev5d-=l;@2{)poKYDSUW zyMghf2sL_%o&4y6bYJRCIr>CZ|5V2GqVcVP_r^*2@;~f(A%f^MTyO4|pN_ zXgERihTYW>n(rAu_DLA&fdJya$ohThfOlK%azTChIqKvj$)_&7{nhu$w`NblDNSfI zEU&3n_SwkYog!6yM=5S8ekNIPk{;;lQW-u!J0#|N>wt(?p)ARLB2RpTCux6Pqe2;n zX0t8hNM&zjNx*32ObDT|Hl6EOP_HntJn2d^lyQC=0XLSUG%{+2A+A@as;CV_dUt5c zYjPSx=_x__<#gvDy`^36QP(B;*Gj55z70G`okjTXje2v0gq8R+f{?HUqfrw)yt8^* z2eS6B%-=1=9mu~rkkSf2oJqUdzKCaZxQ|}%9Aj!OWssd+Xwzh_Ce^yatR-$2N6U_~ zI6$l2imoF?XD(Y3&NLb7K z7nCuqIX!b^lbKM1htpi!)KZU*qL~WPz*V1 zKD#y~R2`L2?@8Wfj=eUPtD+)2JGKQ2Eg8rk2$g<95mw}L`#Ltn{xl%XkXKZ?vq~to zk+C%+&A=wIqcD=HE8$2GHzEFeCB3{V8x+L0-A`_i-^LUt*~s}dwQ5iee6kIfCoM!F zEk@%Q$dQIOA(oLeN}5)vZ!9Vsou?)10jsxeO(Hf^PdX$J%-qFdsGxo#9vt_}8_e@_ z%r|lJZVirjn~#D(YSfvUqOWTa55ZK_yQVpF^b<^aQqvyraxp)Wcw)tTsrGxOC%_Ra zcAtm1#>^L398z7Vmj;z;DIo!CDQst2&Xw6V>dLRPqD;@Jn=g#HKl_-xfgo;aQs)`l z>!YYIS8+)Ow2)*G(hd9`vq+Z^C&yMNzbwSLT-36Wme2};QaF*YqX;_JNivjn)Qt%< zwqyaKZITeAgy`pkZNPZS>di@`Kp{SQAz!&xgk71k%#q#|Tl5rz4l*icPPL#@{4wzoTvu9I=E>PX^G8bkd+BTl2MA=DtHK2Z3WZuv;P zqjfM|bdYU!zooR0^KACp{p1s_3#7Qkwv@u|QpY1irH>T7k#C0HrHo2_%OsR%<&26M zmD|dS%b?a!7=dK$M*9RfjLIY$n1rtjn&9A--GhG(ifz;`wQ^?+Tr=-(OZz{tQJ@rq zmK+tQVh;$%3+OjsN0RCl!0V(l^qVTASrn%fOsV(v>UEVbN8{A$Y+&n@AyyvOzcp48 z_ywm}m6Os9%1g^tLanY$EiJlh8jNJ`y{2$+xj6Nm_x6WLc(is5O55ta@fMVa$2HPE zRb(rv(jpjmg)_sR4=@#{O2FBpc!I;z%zt|8l?Rz4p0(SFn+W4Ogwr6wI}3+zksJC1 zk-?ueB4DA5a;^xQYuq0jL@t21d#l8K{R2qB(jQn_nc1k6QZDz6K^+gQDYCdk4jHNh zH;XK>C_Yx^2ALU<(vR9Lk$TDW zWYtERJgQAyMiLJ14c1qjSrAR)x|u^n;igiY8;^EY(Bb{G{CM^LMuPbVeww-lzO22> z64`Dg;t?|RpsQ~mCh4SH*2slA78*;;cjR9K%h3QmQ_Vbt*Gbr)+5@Lk#Mzqwn(HutopfE@ z=tT^`cE7^zLk5dXkNWBhZJa>Sj+Hwv@lwQ1+Q*Kcj6_>T!A>wbUbpHHT|RO52M9Ot z9Qt;+rnlvt@B>}f7Go8c5B`8qg6oPP2$+47(~_wy{%cwmvP#;+nMgE~4w&*_e%BPf z+kp}a>cWgE2+O1(Nd3-nB7WBEayX|RuR9R3MRkxp(|IZQ6Jeihx6Tmn79W=<9bSx2 zN12q^KhJ11dHvf+Zbq1=L5;Zm-Lj=c0$R2&%ASXay3gAXZy=A+{W_71Jev{ixsLTA z2yTc&aMc7Owk1F>TFrU5A|zYLQaC#Imwyy)G!*eoTTIE$+Lmn6D0!Yn zTKzNiDEb+tcqyL02XMLs;B{CO=jo(ef{{TGV}ijw_O2)c>1A-BLhvbN2I)VGL_gCh zFi9xp1l_b(McV)pSBuVxvPnG+w zH^NmBD178%BXzV&3kgNYbI*wupP6!rO~KDqhd^(#YwQlAsBui^Vj5Zn>_2mm`LL!l zy*8RUq4L}(b5A|#!Qa=q#2$-2=(VhOXk(qk?sqWza-`29@n9W~7Kpx!m$vwlr-|DY zLrP_2{tEPnU0<_}0cND!l$N2jLFUpUro`jQ=(fXMKntoJfP@S&SUT> z8gNTR!taF!0BaLW{?)|@siO3~$mo0eW5}Wq&k95uM4J&&r3F?Rnj4CSUFxMzI9Jhe zU|PHr8&XXd6dz(HYWFcN`@cwv1nkJj$rqP|&VG<6=+6L5X;8h;9hk zmJoHSh;NSEkc`i5U+BeOARW#fQe$F}o<^V&qdO!BrqN3ZtQX)AOoq*h%$dlU zY8v^AYVtbiL;hM@!9A4Vo-$Z*)@iXwqXV-=#Hd9YojJ20U#NYu3Mx<56f((9<3M^D z&}}E16r=o0BW(6E8hja#~+g+wYl9 z>=jJuliYOYFsVVu^wj;=!h5cYb*i#oHkL5p(HtV6OL^fvRr1DwSj5~3RdD^^6~Ho1 zhsulrPn|`R(t&3c;75UdV$&A=tZA;w7~fOSid>$=&ff=ES}MaY7obOU$;YN%w*%6B z-rp{^!B~x;Us>iA;pdSlK$>Y)6-f;0f+yQwCIesR! zNmcfObXJkeC`O~E;B}+$f@{)ehs0~Apu#gpdIVn0M8_lpD9E`Hv&#FOiui!sJ}9d` z=A-ggd%1{q;?iQoe0i*t(VfkqF2r6F=Uio;!s=Y5fvvf$BPq%=yPZ-&6y8F_7q1wG z+i2HpV{Dkg4XFfY#663!aA}(>Y)tJeflMAP!>`Hm&^XYh0sD28WYGnx3Y-GgRN`v# zXdctUQvyPBfEiAU$iRltLfd2tqiC9y z`k%?iXFQuU%VU8Py*yWC8NIA1pHWcP!S80O_0yfsBH~K6NQ*e^QK;{cWU`KoQvDKX z8Mv%KGjygt3H_Ze%S6COxA!!?wQcV9n{4j(EkriH0+v;EuFehDFQryKM2AFVjm5?u zBiwc5JG!0cF;Jn(|F9k=A~6h{1-3&8Y`aQ*i1ZQ(&xb zNQ}IsK0-jzX1B=9$aL=56zLWg6W;XrS!}fqzR^hXx-3@5U8bH|Y>d8m2?Zeuu$B8t zJb~OE@$xrwM|1h&EtUqAzg1#G8^Q#iEyOpEpiQWprkzHZKD-p`U^fKzdQl|0M zp%GG}>9=gcpjt$-RFbp{X&<_>8t_~POe|<8SUF2KtLqqCdeUsjYPA!`UDtF zbU-g$o0{qTEm9M%B6N{irP?9!Xj-`fcMpVXm)juI2U%YU5qlvph@8KX+sfN6=$S}Z0+!`S`s1pfwufV z03He|EGys^Eyy&;KV{i@joOgJTEE_Iw~pzP%=1dnYmdLA3eIV`PImf%?lfmUMCFaA zW6zv($`R7!IdkXJVfyCs2H(dELKj1p==5K`;she7Z5iejMno>Es)jA<3URgMW@zqj zOqQNCkT6XN?&@t)4SN4dENjV4`3arUz3Rcj!9>Ov1=s~7CZuOj4XUNJk>oQO)R9Pr zic1wx=O{kbY|OE83-owo5i_M+xA|-rm==v@(9Ej&`)x-C^}0#(HRqIgk)!9Z9oA;-W?a?E&XEH1G)nO)QQ=lHNfoHi)^(@GnVC&u*k;v3eA@`P ze$!Qu$r2VAGT${cNUIEISjQkU{wJb@1a>;QGnrS1v~)(4N#)Ajhli}Vc^P%VPjz+n z>5@xp{#M)d$)NcgQrDGXC|U~};k8#J#K6D%1SQK0b_ekfYc?P2SW?JWn>eM8p4G=Zd9n?jGp@2qzv8mz8 z?w*q86W4ka+*L#rE8Ab?52%=+DYbrXYid$WiD&du1gS4|aHuHED*m5SN(o)Yu%`Ml* zyfAzX<4-tCPc}VZtc`EQcK-NXw6$R`JH=T3GhQF;;I;Tz-3JVOqe+6kr^2y20)Oy* zej)lq{HrK}`~sn2nER&1u3~?K9H=GC6X%84!0!C4D_Ir7$uuIuQ1FhwVr-uV>!=oCC|`o zVM2^RBb%W02TzPUM!-ex2P(+jUs%C+Z26oqomeEI3aEC`;^1(L?RRy^uq_`(ue@s- zd~`|}q}>KK#BW3bD-Iy`dX9n3KF@lX%$_E{sBdiH6NrXwS~-8s7b_>o4ewZaJ~s-F zXE`UAm&*mqBje6JOmRId5jngTN+xi+lEfCu98Ty%Eem7k0|ZJEgKhahGt-YlR}@6V9Yo4h~?tw$ks8O9?N7io-QIUkgqRqsd# zheDoM9I*jzdKCBrc9s-H<5a?B{SH{8!}rzv33ArPWT3t+vCe0+?S8}I;$Z{u`d&l- zQQ5meP&wFb?uml02m~UO-~L8z3A`2elmKs$aL5SXIPwr>Nw+Iub}9S!3BuY`43a$n zoNbXUJgXjPaQ~SyG5j`B_M{D@=cTjIiQVo-@O;sS)ag&Dh#UEYBG>Ib<@;eju6 zRSWbY2^BqjH${jUd#<3wgVzhg(eWoMd`)MT1qV8*^ZuD)^M5J!>>-(IDZ)gBc`sk} z6diI=_LSwPPm{1Y6LSJo<~C8ac=R?ys1i?BS{*jHlj@mN3e8+k*e7Q#J!5P{cD7A0 z-(8@Z;%aMFcaSG_(=N?T6-X%XOPkPIthq057n?u@$23>oK9R7wu)iD1C?l-u8cTa5 zfapkGu!4O}YvttW%A};RC{_u+Vy21CG{*ADu(RCk zIz<>r=L@Ylu#HLLcBzTt)ZsC2Y&@Ljtu@6b>(pr*rJ2@pW_<7=j3H%IWfs1(Stvcw-#?gfOZ?ciCt;##nYb$UU0(vEAUjdPB9Rh`ki< zqE%S}417hcMGD8@hclPdVQ1Fl6QIRic@WXQ;lWua_29(^hOik9%S> z#~ck-l)iYM{Df01MD3%iI~h zqV%COFmuZ};84GTlF3RF%F;=Y`_G3YH~rqxmmQ$93k|B)9;l%&&dty2(vhq&qwIi& zHZGP;`~;5T@P|JBXq3jO!v`}(z#W2sgXD>i zCfquQi+Q;pnbvZ~#Cki0=Sj-NHO}n4nMhpRl@mVyPqxC-zl!E|Gql?gG-HK>`lvQc z6N*eEgp%&%OzlT1z-(>yl$hfrx!UlV$53MCo%(xQyk&dqtWKx8>;qV%gD7r!0+LK7 zbao#!YSa%Ek&#^PBg->g?0xjm{um5eLsnfIA0Mp4@DmH1s8LO? z$@oDvkl&``Z0DI3qQ7R|aK;{|uZ`q>cmJGVNI?)9khqpBJ3-PK&vGdHW+WzvxfhYG zc%U6YjUE(n%**glxP-_pRL(|I;=wD2ksV(vUL^n($rUyLGL%Bd9Xa|JXix%Gj$CY~90D_Cwa{l9aHFx;S9SOY zpu45D;PX(;_MZ}l2)BJL!a~9&Q&sgULfn!<)P=d4^|%NCXB|-r=UFjx%4+Qg8@$qfQCr-e{;E?j;CSglV|A(A1+V{Ybm~Dz>jHo;cvuPBB%QLh zi{{!3K3RY4aZLqjV|Zu%iakOuAG9`8rE^x2jDW=Vbw=C=Fr)o3)UR-QseCKMO0HpM08GL>^!ot53O ztSmwqlkcYe2Z`PJE=#OeZ_*YPhyB%T(DAG77yU9&N} z3qOp?60?gtw<622E)AMi1r4^Pg;M0}iNCzE6ADut#!V1fxT?#@+lG_4#M-JOu{lnz z*Y}b_SmbsDSHs#qewRjeJ|n2s#WRu7s}A}5=rafciHF{mUQnh3rqZ%?Xr}Lt&X05K zBX5a+Z%5$@I#h-V6G4ug&rs?Ey-n-h8Y0+3%#N|695}9NM@CW(kSC_&9G(i!Ad~62 zlNA&swLK84goQfx710iiBDU<#cnl*`AZz$d%fQky2eOCM0!y7s5qogLM|wrZSjp|WXx-i-}4Uz-t- z;aSXwRrAe(iz`6#00brl(Zh>iWL5}6;D{}B_HHy8@W;1Owr)6I*oiFy-L6^pSIjN& zn>)I}D+u*n*=^x|?E`#!&*AgN)ARe6O)@2dG@zX8Ci#52BeIt2v@iuz(PQl%=!tA? zKW;bPMrw{mJ|*GcU=WZWB%>Q0o{r2e2x3<1_)hCwt)BY^S#ElBG^0DDIQ_Z4w{2nh zf3fwB!L==1+Gw()9ox2T+qP}n-mz`lwr$(?j_u^;boc$<(^XwHYyDXN)~um5#)BDs z&Wpf-ssFy-|9gV`&usaRxF8y%mafYW5oUK2e;^+d0*pPh2A;E>}b`gJz>*)937+Yp-oj+2`jG zUTy$8I94vRA+neRoK-kiLsTPJ1hfPCD}Tt6RF6Mp2~wHI^k>5xZX*Gpnf8Vd*9^)1 zY6}vs(k{d+~A)9)iLSj|BsA zfSV867-34zwy*c0A(k=nZ(gv5$EBUFg=dC&>dTZ9}&nU*|hzN7you%oGb30)4QS#a_KyITcTbUlQ~1l*jK zdz0K`Y{T)}2d1&0_|#CMJEI^@1Q(4;cnw`g<$lK-lQ!cU`zmM0a2e`wrHJV`>eSQ} z#_&gre4i)5 z$Lh#|H~bI2l%qt&8rlALim+FpB*D{xpP1`CGR!4%d8P3Qqs5Tl$Or*XA2Q0GB2G?N zYxse&e<#@{IuPe_oR z`FVtpsy&82Szur6O_5Ub^lE@f$Pnr#7v|*UQr?Wm6ggXK1?J>Ss(lZeiCks+6s z^fZK~sIi%1Ib=Q;&*do1DaMKN^8+;c(#pC)fFxz(#M%14XPMKRtVl`+XYtWKCCCx% zs1QdFXVKUBzDa&SI!^hJSncM<13HZj=KSY=Z9ZwsOt7b2Sy8|X{n8Elbo9{xo6s7N zg`dry$eY$|ZAYH9#Fv(}qN=-ULHDSw?a$SJV&dS?&N$gTlT~+RV7@JQFLG1BLb9r& zRZgDKwEat#>~mL+oIiuLpJ!u<5|Jq3R%S;RDa|y7KogFg$2>19%$`)*zA?OFzW45s z!CX(qV823Kch8PKVY@zNHW@AwKbSZ3m1+(s@7*C=rb@7D;v)-!ev;fkX_t&Bb5Lgf zNiTBUKD?3?P9Pqw1UyX$!jw)_7Y~F?ZIFp3;h2Kyj>kV^bQja;7Q_9bWG0?Wr^MbZ zaXUKJ88=#fA$rbKhF6@_5@*kLR>>YC&E(S4Xv@1h;Ykpczp2Y(wo#MSV95s1L+Zd!nipiFQJUKN{WOUHn zDy0jnkaQq(%QDu-%Ve^<)sJAQPVT5Ttff?C)<2Zn(Jq1Q!u1P>g=A&c0X6y<`gtzB zQ8MGOP|zYFLB_lx(@9*1eN6JwK_Rwzbj&2BF^P!Qnvh&%Xh@f9kl#PaRJqLGgk3VO5m?0RUkCUv*sB$=r&F;lKB+L5dqT3w&_g8L4da(?RnH z5J&R}c&vW~a>@yGAd+GgV$I4HCAh3Il@InS=RC9rb^V3PfDx`YeZc9@HIxMd+-@c> zCes=i8xF2}czr=?Bj1TvQ&|oA_~Bcun6T7Ztp~9&U9Fj{8_~kSxU9r@5TF#hynTAR zVkfw56)X6zsu7M z3?y!5z`FXE<8)>+4k&%VyOKoSvH;G=pXi3J(?_{;)(IWFCb{^KZAt9FC@>`j@$eQ+ zLE;y`Joolc)Ud>0rzYod_sGJ={PBLMg@pK0X5xLK#e)R4F;|uXp;rTLIw)erseFF< z0@*@b5&Fj-{0BOWRkM!M-1GiEcT}2j8j98tx%Z5v7gTLGHG|Ucg1x%NlTYtGMSsXL zN_@W)(RtZK1O?N=^Uakwj}f{bL+`xG5qnBR-1_HlN;9(8V)xtSK~=U1i`pW!(~&hE zb!iPWs=0U+e)vNRW=2Lorl=?sc2Qjr1u;mO!yZ(;5Ncj0fpyfR<^rUi3fV9x%wC>r!OSu&@coLOasRoL=F(zp)^ zb6cDelg8opNOb}l#UoWa<|;cH*bYDN-@mpyPSIR~l#&uZt`mu}??>n5c72BL{fYg2~ zoUYcxJqH|alp42GlT+9v7OmGm`h^HpG?EhLOk-mC)1>6%b!b^VUP zR^$+;lhG2Tg9pPJ(t|T@((~h25{HhjnIn0hHq<6l4yEY9)WW02FZ_v`Hn>8!jCs)3 z$L?@Sfe=9qIMwuSu9$gHLX&iIDiVXlV@)VVZ0yOuvk)_>9?Fu>q>O`l_Jqfl6zVMY z<*29Bs$9R0`AoxosHMW*C;A7RgG0#o5|-He;~VQ0m#O_9F4u@MqsMMdk^}W$Qty%o z+AD1P#kivg(io;d`KcPOgt9Vg|A6RbB*iP}p(>oemgMTd2o>=aBWzQeVDr;Jn+rl;Q>U-(CYgkDXqg2Lnct;gDTghad0x1r_2 z-stQbRBtp77H7(3K678tFuOZEFtXOw3+RVp!M!SCn4?Lh=Qr$M3<$b)i`7gTB09GI z<&ZP?qe+v7dOn>%JlatOe#ewXT(k8*a;oKWr7oFhbs>1rZY{uJwyk1NL=2#?hwsgM~n(}v_UZ4 zGxk5F{NK6tpRD^w1lsWtm-+BV!KjiA0D$!W$~sp^+8@PdD^+6yMO#Blep;5b%KY;fOHt1G8$yegpo(2kbXc3&cl{_tz(xlu{d1sajI7q^w5% zyB)NiPyHKEf?7q>s!1bdSwpkQxvZ(9!};Jn=Y6|VDqjEW`Z=%dxw|9N^T~5s9OwN) zlovnW-lCw-k-IVH1YPSq4=FoEhSR;939_)v@m>J7Yw8h4<_I(Z6}@v+kYvX39^nkL zNd0dfln%*8ie!U8dPJf5-E2qaykLiW5>th-O;jJMrx{#LQjGKbOQCvB-_+*5KCi9V ziHgm=ogeFXKM6WW(Hd1~;3k%fV@F7f-Qbiw>&WKj-ft>gXCpDSdWuRl`SXUDW2X1{0?Vk!cAE4Ds}S+5=LQ?|UK^gfWytDWyv zw?3Hpk2wNdOBMjTb<#1pm{M#L&oZF8*9KZ{R=AZ$TE-`F0-in0;7bo}Z>-V1ICt{YH+HW_?|9ZewbQy;1A0bwQf5BOj6UywcfK3l`k4FR zO~GSzh>AzXt`e^+1z< z#H#W0K1x7&D{W2MFd$>lJ{V!Ohk09WUpF|?xX1IvAhb{55fgsrG3|Q=uvf{J1y+vi5l2Y zqIDx`r!gYlRrQ|oc#G@Ks|#|vD~&GO^F^Vbs4Q)3?O{!&{YA<;rEJ)Un07cVXvE}~qh-Dfbm4-?aYs1TN43g}bM0IQ! zVZ&}Yt2WwIK(*H;<;NvvXUmFXsw(yR=Jx8mI+M%(_4f94kz$@bv0P@jJCKx@7N?g2 z`r_{CAK-1ZJ(&L=+(brXwh79QbIgIMjE_1FPk77)f^IoUH%3L7Utf|BSSpU|eKG5D zlelYtA!(q10h7p$6MRD&cuyglk^>4>Lq4lbbm@K*WKmY!QY+a;00R_8G_--295i5H z_S6W+cK7)uK zy+*)fMIqCUXMyxPWo8}zenSg|dVI^u+)BAr_`DXn?yAL(Cbmsnhh^HE za|W1Z!5&;-S05?>KrSYT5dG3$J5jP^0FpDU)ig%$4KIJRr%@~$bbK9r1jybu6R`aJ z0Dx>3YB-2N6S^sizs72&bVb|8j6H7bRQ&|yvf4jRo7bzI+qmi$>U=WVXv6iJsNkb5 z+-KoUVL{Nm9WG%kBKtUa%)mScts2abljf1H>8#WbO_r&kJ(f3~pgph-5#b4L;feVM zZn;d7t8a*Em~dLZ!+)tR4h05F-_NRo0qK1yttBm2j^r`kq`u&%PO>}s`&=QUYtVlBGFI~}F7%4FG*04DqnLx|EG)4I#0 zAtN|Ee)v+;$lUVoR5jV5;YE+zXe-E8zlLgQ)>7@pX&398N;s< z!^awffCbXgqlawOm^WIIS_Jb${$mTZZ=KDZ3e_fTec1y~btAU)F|B@#A81BHUg2Ks zSOV%R^~_5MDgSW-XbwPYmmp^o8<7(>$dG5_3zBK_@`%T@zO$PUtq}0ZEeH77Da*(S+nJPzZT zJ3zkZ8EUWu>lx77tQ?M_ajBG`aawuIIE#|5;!&v&iSs%F}q|!;n9!bnDpi}_UiQrc%;st4_vCs$nodn5V6`JB+6tC;{BR2gti|(Q( zSv{Kn2!KGFAMa4E+$pAcxd4qp`l%n;1wqTKCAa%_RXnpBq%{k&3!riOtn;k;mCv}o zd5dG)RvL=0vS?%$U0bn*%u--|Iyv&e#IS6-wla&cfU~mtV_>hiHUMu}KVQ5YWgYEkXXS;R^8L^wBhu7{m=;Mq-sh zy>fAj`c2-U!jUsok_?A>T?8<*yCANGLn~$TdEC>O;B<%sg#{_*EFPvMsA=XiWRJB% z)gpK3sCK!j#NzQn-T=)9PbLeL9ELMz55PTsTHF9JhGW^;Ln>W4w&sC~ohFooFCkKC z3Dsd9G%<$>vO_XJT# zcASQWh*22bz`7;}i^#I$3XmI^Wk(KzH4)(}g{=kii;e z9qfgScrc*x1Tu$itbT07*?`}S!NL!Ayz0- zizx*6SUq^hVwxZ)eLRcP!guGeZbu^}z}LMHQPm3EBLjm`QNJw&==L@ApyM(9OfX@*sGw*(K!In-Tjwtq&Ub_t) zRIRhi9DIP=^v9kqMyX0Cp6h_Hjg`EOBhnVrypDJyjW)$lcY<-R_hUqykk4gNZ-!Wc zer;igPuPp>1UGlw_lMVBJRDlFY&OV~9Ik!~e#1!R*PeIA!tx^NRY*RAu~nEe$IC(< zcyQsQ0ZbS{daN|cesufmf!^Pc6^y#7Fx$}{3!v9)o{Tre!pYxFr~Wrfs7%IJ+=te> zvoqEu5n~OMZBcU|Dn9t3Ey;un=~sT_z9E{yi+^wT!k_0 zow&=;PX02DYH}4zc2zVx!5ZQ$xoxF6xF7z7?-mZnSBzoZxDGlY?t}RTuGP#qKCsdCQA%v`e5liS6|f`pY}7is2Av*L;DcNoPSZV|<8Xekptt0-@iEZ` z6C~??TJ2{&S7-6SyafH&fVqeGU2@0pg4~o+Zs7Q9d4!;JRoe(VukpaPXF%n2in?;^ z-q0b8;X~eA)DjdxJ=b0fED-$YiP*DP8Bbm~T+UsYvtrX1sEF$@vXo)&?2z^Kt#Ia4 z@wZUYPTlUL`KF4lR961dYlC*JsMhIo&QApAJ+Nq>C>p{xFW5#Dm)kAp!A}&oR?;*e z;y7o_vSgV`tFdtmzYij|KaahePp;zip`o+}k%*)!+W)P(>diG@E)>O=3BV{zN;tkd z+DxDmjn{Al=b{%My1jRZ@i+^V;WdR>fgD0+>aB06 z_rh=XtVK`UBHhz#-Fd?|O!bzloLo}pZ%Yq}=O2@FkDZ1GOt6@p{r9%O>z%z5cW7O4 zk1Ef@q?HMqdo9fP`7t z1>z$N`U-XdedPDVma`l%LlklZhc4Pul2}os-V%FsLS&wwa)RFyKwYR>6!0`7yez76 z!u0m<7W7@An-8RV1N&6`ChkvqpbbrU6ay}Q5EDwz7bQ?a#e**LUGTMgqMm#r;Mmv1(c2r{z zndzt**?W)2GAZ*}4h<59d%(_h;z$J;I^cVy^)?c8hpG(%s=yb% z=EqnTKfx{B%VNq;peaR6=P);t(U*}YMLtP9M3PVqKl4J5948lC5idYZ#wxs94jScdP0j*1pm?fkZPPIMKdIsq{p<#f;7Z}FvJ1}PaOCl>4z)neJK{y zX^LH4bmbi?g~2suJASc`5g%d4}B{u^mLW9pK&xOZx=49)l2h1{Cs$J4=qj z+#VavFaSx;w>AV(fYhtjM~>D8U`)_KC$Til6swiMo97UqSoNf+5rFdD(CY%Y4s5`( zY7I#TCPCmU;^Zu@_&KmId)%u&X^r6=dc0SH@-faWa1XoiOKOF=O+qnxzMoLZHx;8c zF~w&A=gwf(E)yjzK%FY#&M`I_t3V_`Wfy4M>`aHDwzKjg&ik;;DTzD&ngh^p;^4Wm zcV9T9>`p{Vz?G zq;yuJ!%kUC`y!rX^&!vUad+atCqkzHFJ@E=lbx_PVl_Ss`$D$~7+z=;bY0&@3wpKp zp~RZ5s=|0yBZqNMaGIoht>*dh7l8;3UI5t7Jx=t~{WtV+9!9{I-zqMfF(Bh|j3O${ zS>n7c$qbX3GHYNxzhBTS!6Z0tgU~dHY7~cvrB-8p2;!l@_+dV9wJE#S%%AA4%9^Qt zpG-*#AJ~&UE#HtHeQ(w|vQ5WZaqq1m@)5JDd5J~4$YuI5yc936vNp&Fp*zul4+pyL zKM-zIN&8!u2)(7i`HHzO;AU=T$T+cwMdoWepLM%o;y94BUFi?CJtuqPg(13<9&Um& z1B~(9id?bx)>l*YOCs52KE!s7Roui(5%X>9@*&lx5QI2HE_2e?U;;@pKy6i|hwOe_ z&rGpkg2;&Yum|{lR`6bF&~3kBfjr>{vGSul8+V6{FYs3Yp%m>8NN!;#B+`48R@w&+ zugRZ45@#UKysAs$Hu((QHN=f2Te6HYV@fE%DAq=( zO*E(cDK%aUNg>^gyWEVM8hF5-Jh`{ye1Tl++qnd(J%9o~kDfh7)Y6?-I`dG=c+N_6 z&lHem-y>Y~$p@BC$Io_)7>cQb;SHxtSJds_FO;<=aYe|*gM*$&*%~?32=ouk$#Ax<>%^&!Yz2SnhOknT zZtDcK>Oos>Myb>lRlX=-@61NAW31XkS?|Rp8wPyivdyQpi>*GQyF7MjhyS$h6mF;s zB--uR(m%MoqlBwEZ@C9~J31Hq!E4{Fk!yH?Bxb*oLo=NMd^`!cM!9Sb`>~&H?Rw*D z#St%&XqE#>;v(a?G96iQ3v9q~9~`-2=Uu*I*HbBPLy$I6^Vb7mCxU8-Ah_bHzoi?z zryo5ryH7K7R$3|~Y}O&VYNgwWW;=>z8`EgJX43Y!G+duH3XTpXH@Q(=ib=20%2P)k z##eZ?Ih{$n@=?AOcZR9%-&58uA5!5I-wP!~FBnS)NXE<_**7>i@451{`R^dl?$h?O zROcgfr;FS&yBYQTve%J>{#XJ=?OE;ftox9VjIgZx(3$X2^S42noR~0%$;nqkh>z${ z_ret&ptfk2;sI>Il85j12fdYM%Cs#O=qC0L8G@l1;;z)PvS&)!_&wQ>cIuCOIFFp= zWGpM%!Rp^HB#NRc7E=|g^Lkkb{Ybsq(%QQGr{F=jS_<1aof`2N-3i5dVWZy?>`j zS_7Jn@ ze)*XGI!o`4>h6n@MoZYG2-xgXfsP^u<{1!ME-@@>y|wJ+yNY)+r!eHdI<$FL(8fR9 zMnR{7XeV0<;bv$05A(Hxr=}Np+6$4KYaYO$(b&PuV{a!&nl39??ZAT+?0ij%C1h+UQS3>R^snqoCu_)(a`>>`h>#x1 z-O@^atOki5-d2o2G&Zq2)0g*!|zU?9OJ9&RwI^?1OZOs&!_0A~!*Hs~bLL5T^WC`kD0YwTn zM%=i4Mi=WtoN*42rw-_Kae&So;zhS3KUnytL<&Qm;H~*!bNiBBgUo$1m$N|yOe2joLa_Z~w9SGpZOD2I zX6?mxVS#FtThG2hDto#~djf?aPV5W29|Y;8Pn9<;ZI};41^2)Znj~3u3%Ex`5GF0?Vg_fN zC}lyj;5&sT3=wP#U~6UJ2XbzK#Ybl-}yD4PU8tO$Ri8_`(SDA8VGu&*Z z*K@l+zT?>8ydz(6X*PfCG23`=r%q3ke#12V)%J!Cj35OS%rNdkf zB{rj+)D7f_G)F6sh>Z`mfbX*}JCl_$VDtIeIXTa^yIf4Z0kj=syIm8zzX71H)%7x= z7Jm?^Nergr2bzSMv2NnzPT;p>*BC@9$iqM_zw}YxWNd@v5&T~ zTRXB7ua}KZFtxgAqxsFV8>b83|Am40_j&9;hqHe$5EhZ$ETcaMGs+*cT=ah(&i?C4 zZD?%gWcxqrn9eeN;r)D2-gE19%C3;vot~>*7g!z-WDp?yc0GED{3Xe0^Jn2Z$9=Fj z1%pa*T&@1Got-HuTGb_ten??_x_Wpw{HIc`<7xuD4JxV&0`4{3_zcaqbk?25l+!27quBM+^&*Vqj z`mgK#zkl@qejTV?_#I!M003|>002LW`Tqy)lQuRo*H?14`yVu4mdb`B;tBG1mGfFs zC#a@gkaMdrer`mNSZ1sU3E)ub@(>FQLvbpA`a}c~)is29QtY6(SjM*PS(l6{$AXOM zNBkKZlM2ISV?y`M?Ab%!jQ5%0SAYyD^{01-G-bWv@3hh&g-=6bjjz0ukSZ0 z0FWBg0Uk{d+)yK2N|2j;D5ZcF^bZOi;(*Bs-$Z~+k0nwc&ET;;l`>pkT+JB7oWAvk zO>r6ycQ262P)UbfF0ct@2*r%9bF0WN$~9i)q)Xl2~sLi+7eAua9-qv=?pSsQyavMM_ret0>@ zTA=3a9#paED%QVzG%%3RS|-j6a^sS?CTN6CN@K9TihUpv4_*~RKm0FDbf8S!(}%?q ztL|Q^4XT8Qw3hxOkA>>?GNhxS#}a#GBnY~#*ebScV?};f#e&J&xEs7lu-4Sk!EKc) z?kO4luAt>_Q3~XOQdNg01H)~)%RNny0t$t(s=t-?+O|rY9LcjS%$1R>#AMA$&v%GS zHY^Vi4a*%*DAQA$bP!Os>1jjdVm@jlva`0XozL+?vQ* zm{`|Khnj3X;cT_dFM+1n#^$LYhE0O&u2w_!$6`4RSr&*x8kOo%O`O%fAa0;@GPX zsW7}pY8e{IIocc{g`u8(IG#X*klkAQ6;opF`nvb!C4KvS48e>{8nIX$lse*Vvt)y3mRky<_0SS zFdfTR!WT;dLXaPz9gVR&b)OB=4>b6>LG|MZ98G+30A%UkG%glOFpaxP^*-=`1)A-w z_h3S_#P18~--KL^lLK#=Ua}21LMq56jUnt?BU;3%sXj*RjH9%@h^f5|o303qY#^93 zhJb=@898n}gXkY9IU^9=p}Yo2zDKOPJ1=zKSw7#r?kC;lr-RrI#_q5X@a0+&{KsE9 zwl;u@hoQFuptqC^+$T!CC5I90&Tq2y$8P5Dq1W4XzjEAIH)XM&gLC>rBB@6HqUEnJ zJNX3TpqE_RH&7X-787oLm#EXe^9Bs}`MRl;V|{--n+0uH*+BbU`Sv~A2Ddk_5(hg6 zDDqzT7kQbRU1{O z1uwuKNrB;WLWuOYHl0K~k@Um1!2$q478k|$Q;(VV+9umyUUyJ@tkaGckooXg_Vln{3q! zMA2Ma8J8+Y5E{qiMayW&SS;3)n)6SvA3TpmayIMft%UVw)Jn|J1P>EKfQV!OjZkmg zi8<+7Ev@&IhQ+|^uA`&I_ty^v-Cbtd)ugulnqo4}>QqN#)Rv5{NJvi{ob8ThYUgk$ zoV7j1O3ADY6Hk7VpP7_}$q)`2pyyMpdx7{CERb27ioln=3q&$Fp}wyc=Twb7TMfSC zaM7!Yj#@1|K$_=ZDM&J^s-bAt#o??ffUe?b)~kr-hqBL{vqwS4_N-0O4>**HtDGF& z?dl}+NH%1&(#1^+7saMbeVSSnyGkBSIKj3wGI-UGc7z(L5iHC7p33jZWmpJ@IzrDv9DOC|+1I$n@jE5@sZ61=x1Q{|T2uJ-C950f;ObOR~> zNLF*9e=={w<5n!S1aWACaGLvsS$K@@jUiD-d*FF7QYYIerZSrMw^K`oi?TTF0lIXu zAbqs*pgfG!C!)APcPyokM>Z2t@C5b+0X!goVID{o#*51ov{=u>XnL2NkW5x?oSTthVyfDJYC8J?y1UACsa zXwFJeDmf`z;KD|q<3-cN6)Y1>v@9z)G0jIv+aC(A68KUWg`Z~y>oFGsx*r$LDK8qX z>))_a_ySFEfvvIX=~N55I>M75;w?b?E&zLA`p{4_j+nI=KU_|V;7Itv3x_{UAN}HL zhRO~crg&^Cl3J-006N5HO~GJpMTgXf>!3nHcmwJ|BXcLQeAUI z5=Q%Wu3sCY5ri515oj8Xi|uvz9U6wEj)0&A(*VrmCT)^oG-_m$mUbl92@4DY0^j6y zGXz$(4_LvZz$KR)^Ch3G`z%G0FlMDUVOY`JQF8L`^Lc)~`FUUC`3z_^(4tQDYsLUX zCQP3y;t_48zt@~z%1GZpp^}Pz6&+(7{oz0g1!j|qO9?4+Dj)o0&`zfh1jLrE&=YFn z#)WaQ#TCm`?C27~)QkoVg;y&L>u8$Zda*D|7({br@*v$X^hA&GC<>D%fWu6Eb1WnM z+`&Ujqn31-yQY)c)yTl_xYOKjLbIVL1HU3k0>mcF6a*DLaXVZ;xpknnjC&Dd7sI;E z@{j9Q(89VpwW-CjTJ-nC!y$u*POt0|9wMQCTAF za+sXqoT4`fXB-)1Ai%teb5hT>*3hdoX=c`*&WcjDzg_90x(lEnB|4SJGeEJ0UrN3y zfm~nAjqPbw8y~^1z;lu*w|h|h6S*LZ;+`zCS<2g-(z?q>VQ*}ag56lo8XCzLoy)Tz zw)NH69S7lDCz_A$=+rqu$8=?CF_U|amXJrMG}^3m^j5P6JJpWcb+e`=Ioqq#C{ZB& z*+m0EG`JRsgA|9=hQI}=$#IDh1cTwctmQQ-02Q|}Y_W+B*w_f7itZU zN7%)aj5epJGZ~FnQcz@S*o^wDcHFa4Ku}ftIv}(i*#vpk9cf=T`1lqvFH+6*-fS%_c|k(X?P2PU5u#iZqf*4a5V6y9~{_ z_uz-ySt1!E&=K}MsJEMU7!3<SO>X5;fC%BBIE8Ef}|)p?I9v-+N<{= zBhTzBB6r-Tg?F`<=cBGDJ?uGx=$5jDoruB;(>3Fc`~GnUc@FCE01WY=ej>tNte1o8`op+P`tA|`vw zs0@t04~dsBT4nNDoP3P0CgAB}3P653pk;0iaIPZ?bdAFXHXnu$$4dT6Yth%uEK&S` zm2O~nVS6>B!S8cC&AF5M%gvk~LA9fJsHX;pSLrrO=iej+wkZb;-Ok z459>7vXGf~qCc@CCW@~^l%EZm@2Nt5%ZQpWC-H4CSd!MQ)Y5xHR^`CNn2yQv0s6#9 z{dZQxP{T&29|1#I7eKNu(?q1mMmd*DZ2pmnGD};rl#{+7y9m8iicXbi5V2bg0AD3$ z0Vkn?v@X36awh=Eo{6M#4VmtIkCgjDu|2p=?oTEeW?y7$nz}Xk6Y0qUcwWS=-CY}ebVrrED zzGXf~2KSa|tH%ErO5H%+0^*F5e)gK^bfH`BcRDyf*c&YR;M(%YOLH{gC;Z&r0(Ophaya$j{(u-PkC^Zfd|ETpwJmKh;Tz94-t|FI8y9oeXj+pacn^ zBisxa-4HrZb><(8p2HeoHszsE5G;sDx73ea%v&;@SP?9O-FCE@4mGr%t1b$z7LFx!;@>XbOA@KM;~D3^d?$;q3tgs9hlg+P%AkN1=l$Qu(tvU zb$5^&P*z{)nhCtQ!ecV0bVahc*2wM(^DT()hF`V@#Fy12Ee2O38%(BOp#OB2fA^68 z-Ce{n!4If@_%r1{)84>XMIcKHJiCE#_1i%;Rat*Iu#I%D8#pL0_XalE7V7U?+I}{S*LP*1 z(wGaEraQKp%g#e$@)h(HkR#eEkKn1CVQ3ef)kNJ#3e=uf_XHeyhj#+LdIMGieCKtV zj^_0ml6qxZu#Kzp41yOz=0UejX8d6wX)C5%aGNbSf$Sk9>06r&wem>qR^AcTinQ!eb(?LAn?s{qWV_`geZQuC;SB zgQ|hup|l^+abov~1hykg5>6%(#QAgNQSeE{OfpO?#X0l=Y{{`ClX}=0ftpM&+Wn@h zfVN)BB&nI} zVJ^XcW!EIFoDa$y1UTxEqKS4J2)1G?V3CqQGz;3}vB9l3b=IL$YSd{A(NhzHXn4$a z6b0cV>dXq@=dBXZ>q)dqT)%h!JZ2DC?iy8vj~qd`+t1sbY3__W8ELF{j5FBoz`Y*! z4#X6%)%s^%Yl;TyMo6r29A^sfUDJP7@w%2fR$ zZtpV4u6qZQ_u$B`2ROyv3VmJpn~5in@RPxEMp~69pD@-m)cR%iR)XE8H^i6zrlSpR1p` zcr`N<-C^pNp!Ycu5bBdf`y)&fCqP@VKD{**Si6eYw~E z@{$#%?bZ#-xB=pM41w?|+#UIq#9dY0@7$k@Z*nZ&z;1e@C&)F)tm^+zum{u zVADSSoU=vNs;EwNz5_&MHP}%0kx1md(rq)nlL%d!Ef||IKH3(V4<2qFTdRBB_ z2>e--p4+F)CZp3O%y_yrE#5PmhI=|T!Ce{Lkf8->^`^h-w}J{vf(8;N*yy~NBmhzP zc~5VB{-@HsL?M(xX>F7e#}!h>#U%tnm_3c}<^JpSpz zwOB5LO1nVd4t3e6ON`6{6pjOXhuHJ5RQ}vD6N?B`6r%|m@xMtOQWP;mRfAlkT&I=_ z(blJ)o@9lF9G(=j%DrdCe3SWD5%hv5v9f=f*i?F$S%z2Vs?*RWvQtFyBrjEN7$LAX z(3T91u8CRJcIZsl+9cP_ISxS7mpH34jABfV#hqZ8)tk&mB3&I+oEu^$%XU$joP$){ zXpqRP;xo4D8IXeCl^9U(EWO8Bfy>Ue#iBpvuk$^}Abf;bQ20)NRsF3?jgw$@c6LTK zu5v}ChD3>s|0K$XQ8(x4nK5Fla8x*d@q$J*6dRz6#{jL<9)Qux|1qaQVtW)$VOYMm zght&fIt<HATdsP1r?W2eO9&%Lj za#U}$8N|p6Z>%gJ5<`zefu2$10>_sCPJYj_yvs(amrS$}3uAyzi2Tc(I)CE;H@~v4 zT)2(9nlW$Um000pJlRw(?*~JHitOZ=Ff3*`UUgs`6}?ot=YcgF_y;Kbw|TxoX?W>; zU@#E7tuesUYBSG}eeRx!d{vmRK^=+3AOgg~uH}|dMuDNoo^g1s+W0mVWPI3JoqfQ5 zLbotOQ+~9u44j&4C&z3?7RpF8n>^xUe!2kHs*pN2v}ca~`(ZLYq*jzttPxB@LyCa z+6NS*6*&Lm&TyUT;eceuL>Ut542N92!W7z@@bMB)^;wj-i1lcm@`_|`Vb~~EO>Fht zTBbHCB|R1F6n|XIaZMlB6_g&0kuvp%?x~8e3lZyFKPjwNpY=_cS6O^^=S3-E=MaIU z)N=^0^^3W)#Tze+ImHax=0b+X5RcMDHr{xOob8f~yCJJ5Y}{3b+CR+q`^@Mo*nc;k zTyzd)PQ`H!8f{@b6i@6Ez#a#)Z3*AVHrpJG0~*+WFXXZqijUiUSWCNg?v& zyP_dOaj0?BFOkcOiGH$sTM>m|@jOGHL}{|Q%8>{&2kdpRFVt8LG`CtXHbd^bXJ>du zjRRmHRLbh`Qg;R+@b5~loR|}knO{S2*U$8l`uvp?_?%1vWjbF^nlG%atWKn9y!qBW zuxY7gZrU3;@=6Nu|1tJXQKA4#vS{zNZF9G6+qP}nwr$(Cd$(=dw%xsNpEGmkoS8Lm z-S=C+m01;;ks0xnEDuTP)9uZz$NcZ;$2~%N9WD#xYQZtz-Ms%enBbm8%rii)a2h+HQs&rwOGb+k}btQvb z2?7VPvKIf&krSC6W_UFzqs$0lmVYrDQZyS>r+F!JCA{jsv0qlbzrgfr5hA-`p#;MI z&j5~bKeO==6-B7#hKflZtV`2$Uc~`j6QY!$6ZT`2noxh<&X@A4pGTIe-7O>e%w$ z_lOw(Q*~L+P{H2qKD5QL#zcwymdm3|5a@bL%M8M(WSD52sy?QqXM@nVl&D)zTZrG(b%12h%SXPF~6%_4=C7E zBwASzKzmUW&IPGy@-8+behVSwhn)-X>T~!#KnRN55enQoV7e|`N<`GqM^Go4L5mZe zapF~mvB>yoiLYij!45E;^)vDNPL;8RXn<@KK<>{JT%v0rUwY?U$G$H~d@pK?af-p) zVu-IGR4w*)vNDQM!lvE^sv+pG2P#JihUu}L#nB>$h_BH^Tul^PJFAngz<$TBEY%%R zm+rQ8z;*7mv^%@$`A1rwL}FR-t|K_vH=5;IA>e`}5wbcYCF8;N45D@gYB zWc7E48_)^dtq3EmO6DiEx;3UUWyTNlG$he$Ma>gJhjX3rJC$H{5r~+8THg1TDIBpO zccghihi($781j|?BIdp0>H-b|A?;$yzBU;E$vjVx0>Pqfs&w9;j9V3P47E9c&g;Gf zn%$EcbnwYWha!FXLAD$q|M^t%!|8Qq+a2GL+3a$irpgFqRFhQ2X-CPoo5&`ETPTRW zG7#WI;s}G+8Ck?|nx_k_3EVCYHP+jb)VIUa_k=fH;PQQC2RY*>u@vKfc(CF;5rm*d z?((4X6WLtx9M0L}&>Zrc+FiuRI(~Wa4^5YUggzmy;UJ7PzKJ7Vny=(;Q3kx|;sAwt#$9&E>J-yI^?87t>Wts`sJ-8V$v z`69wfDF{EJN7=@%+iBrJRK|>{Sn&T|q6wP)z-40_)BohNqm`_GL}ZbDXdu>%*31x*<$w*nCa`SCmkQ$G^YZG! zm6BMlz_j~e)witXr%Il59~uAT>3+&_0x~ivZpdbz#aeh?Z%tteo;vAWbDvzgyH7jH zTYZvXE}n>=>|{b8d_ZIbT~ee);_}+og{o6TfHjZq$;PGRY!n*IqBVG*g3-(z9K2 zbNY;AJ%a3psXVp0Y!!HsLw~v$g*tGnabP@UpTXGGVt&4yBeR6|S9NaT&XH}7TC}pq ztB6^cA0n2-iXQsQjIH?y7R2J6*Wppvg(mxKQM0-ms|nj_qUD1>pda=FSi> z5&8~kK+X=TB4EZYQ@_cTSkii6bIBTHCr{vuM7Uib;y72rqZpF>JGsr2c#?1i{^IDH zNHH|Oe&JYZ;mQx0SS_QR#~J!uhQ`*KD>J*>`(>?Z*SFIYp~FXrpn7ewT05lN2bNSy zC)bhtJ9~;_32)(XT`P~2!VkDKqX^hkb5n?I3xO^}IboWzsCq6DB~Nqu`2J4-j{Yu; zIgpq=)>d8`_?s>X`I*N)W(|*=_xpXk;q*Yon|N~1_OvgY$f>cT1O*?XZJ_BuNFnqqbc2yN`;$CH zyEEXRIv;^J`5e7~Q+YzoXlJQ^gw_Sn;z@Ex5qSt~($KM`i_{EWlZ3)qnTX=%JNKH` z9^;M;ksj(N4w%vA)=qFp=BweGRv+H(R(P;zDwO-(@aVbl-^ZKa;5y}wxRrjbr*gh( z#c^E7mI?4=2|l6UjUyo1^z99@b7&C{gg?|sHH#t^65|#Z=&eDeE*Yj z`1g0^UoXx-=sy$MAfxFY%3=Ozf`@bQ{txq6ZQhW-f3i>MfBBfjT@O-=HA^sH=ue17ftepC8E zy?O(hSDCdX^MR=#x&gJK9L0om+IOY*VssVnLD_rB52P}o+gJV08&HY@c`_~k!%U*E zSho#@^}=LDR!|t0c|N6VtAkBad_4j23eF@3bHsK{Y6ob7ZA)4gY(4ae^7Nt%b3{Bm~mojQtM%(_r5{Wu2d`q@rX*@e(3pf6>tQFEp6)X z67?a%Qa9OPJ8^ZnjiK&*mI~Ca*Crx=rz0L(rK!G>u!e8f@a9Exla7^=#VmF9wxO5~ z8p5jM_Fa6$fwQ=Vkfg+wFFj%xxpqM{T&_5^R1rW%33Vd*-n~#F|gHefDf}3O~G3Sh(DRCVx{AwPTN``gy zXP@ZoUWu}W8=YD?I>?IKz4H_^;SI6v&bO$n*dw_`FvxJ*0sL2GovV;sD{HcOa=Jg3 zvFdu}asdx{P4U7=z_DOQK^ z+(hcslX>asoujuSo{8#2i(;DQM5-jojHw%-X?d4->oW7%SOuXRrrQ zc$ez4wB@pju`Kh`dz(T&QJ}v6L5}WZh9~yg1<8c5nrC&*9u`MW_={842nfgaYStto zQoYe@(C=(mCoiZSRJOZUlhT6f-}CvXU(|Nj2u~$gmq(F0@A}>6Y$wtqEn4ov#mo02 zSR(>IS{OzlYLEFD;{-D}6(kZz$KEKfU>rSxH|MXoJ+%j5uX{bnLO+74L^!;|vgmzV zCIIKJD$dOz+l=p7b(-^Iz!HC7e1GP?{n1AN(5O7alseMT4?#WTXPp%W= z#2^yCf8FG+pa60(b6PYZS#j)Ea_Jn zs$Ev>I<|nJ$tNy)UR>Dh7DqXs)AmGUb78668SCy<@>CWYs$toNV_H)?3Y(r4E}PfC z(f=|vYJ~F|vyr&k0?>+7UK(|n&oR@s0)3DJW;~X7@92RnoOMo(jW^}huRi*8C^=X$ zUcMHKM$&BXB%o%O35cU;o+Gl&+ti7+7O=C%g;+9pHd;@tc}aU*cAVPwA~gy=(uR<5 zEcA<&K==`?m)>BtAXU3=BZtTLffGGtdmDdbG@B&hfFemEA-Kh`PBAUY9+0G20$4rW zx=ePW=4uag!uuXdf{DD<+Kl&_50bGAvvM2svo#RFov11Ix%-qiz6v^RZVR8tNQ=6P z$*zozRNf0zr&N6MniVF_L=vG4;^vvU8KG%&5{+FKsqlO0KiZz+Nk0=KeZB&7a~hcL z5j<{;^~`Bwzow2JYIRn^+rbRamCjq_du|RBDp-nvl6BHl} z=zPu6)BD2HPl|tx9;9GnW6Eun|td7#?!Y4so=|J;AZ4xg*H=W zFnAu&-mh0PHw+DHfEwDa3`#!(;6ODDh|_}$>KM-ghB0Z}C1tKr8%*b~N{5r8AJ9<~ z@=HeUU_xpQdPlKHD4|h#%+f8{G*N$#6Atfc*izs6q%4TC8uOT%C%M81*(58Lh_fOL z2oge`88!%|rw`y>sDEm9PKj9AkyhQ=mLUm|;~)aR2_DcS{!Z9Wz0g&HDVa-R5>~~| ziu47Z)P^*-crHJ70NfLN_uwOHhvZ1wPoOxLH@Qi!7 zlOHyee5cBJ6rZ_k6k9l^P9AR3Qi-q*`}g;;?>~JY|NTq+*Jt?;e%^`e?uiT@0HBiS z|HB9Jzdp1TTb^6id(cU+GMrZD3*$EJf^eBoVS=8 zfMtHaOka9}6n(uiIi74g&al7m&U9+IUzE=v&e8B(<@0;AM<~5VWPVRe>psmIJ~FeC zaHYL_27mWS(+7Xg3F?;mDxBt4o(??H?%&lKO#E>_-8sYBf5)3-I=~= z*ykU@NCP5o2udT+*VMj(hj3SjR@93c+OIHn-Gb>}hMLrSc63I@)vW1gmxvREjItX2v zTfVvD0Sp~788)qi#bn??#_XykD`hrPn05y`Rfo!5KmvVtCDl=dK@?uS&@t4swBz9z zS_b&0CXmZ8O}Av2xJXmMUujSI>xi#FBV1`7bIu@xt1nL%G5aj$OvRM};|doKE+%tN zeG7BBKP5fw#+n-6Z8zqslhnb@&y@PuKfO4&KBPbc(W7=6fx48hILI2&e*g0P^bW~m zwV&Z&F%zmaSjuu$YKYKtCg`cnIE@~DnO`F(LaGM~C!m}F@9519^Xy$9-P`&ruNJqp z>Gm=VHPr~xR@DuxZ5LW`*oh)vRw&VPM$Ll?qS$Wt8^!*Tx$vDi)Fo-gGgp@Qc7|$_&f9Mr9C&K>Ku`|id6Q>ni6EzxDn=_V0oJH zoE#042F|1ikzg$FKYn0?c_Qm7oK`4BpzdX1;Q+YLhkV2d zvk0KS?9-NnHQ{kGq<<0DwBn7jLrU>^GlIZyrSFPSbRn?=rH7So;i-*rIG7mx*3U^X z{b9?6o)kF%l#lU&<)iI@Pnt>2_5$PJn^>8W$Ndb-Rrj=e=fz-!ov8`-eF*cVr7`yC zx#>;S=!jlFB9*PUK}-5q2|w#ds^Bui^UKl~uk5xoEM&{Q6fjUT!WTGO~KlRnijTAeM7p9>n*mHOpdAB(nhmKjwOLEguX z^w$BQ6cM6B6B31~ROoM#?h?>k8Bet^Sie4T#%9H|evr5jS|#dp8_Zfjcv)pafzXgl ztYE_@Gcw9`I0OcgE14JR!d_2!j=|K2Eg(>)ECfCsTw>TE6E3y{Dr51+s)^SO;J3BGlDxd8U5fJ`7_lv-6K!>ftNb~KWh15 zJ1LPQCR7b~xm7;dGOj_-wC#&bI&X39m+YK5qz+l8qn-tg`BLG+l2M9y*eZ>*6>kM*!XeM?hZiTaw~47>fxa zZo!-7^OBD%0lsp@=;?OR1-l|=Ess(3^44%8!25t;ZBP>BFlk+3ug6xkx9RkF$R+B( zxNNLp09x{+=-c$|vLD$JaBy z>FkLo$MPdn&yxh>DZLVSJ!~NRq?s$r^eew1=#9lTl-%3HR$?QhCUx`!7u+MuR&ou5 z_%PM^p!LN=^hVbTY0fcL`z*X5Ce@B)kR=zWQwK9*~Zu#Q|E%mP+}{t z83~;)XG*gA(HgziEugtdWYwLCA66!F6Y}PlW$hNN0;hILnN^%Ga5{Et93kfh)CI)R zjw1%6a9?fK3F|S5UJRqGOFs_11=G_uJy0m-fL!H?!i0jY86UM^F{PbdSXuMK+3MN} zo947n9#$Pc{f&5~CV*d0ZLtpDflCWlXstm(7?&(6xK=a4G}$>m@&?Bk`0-F0HkK zbuZ|;iIMlxgfT&ff~Mqq5eT9!?9tpBCfO3GoHgIS*x{gzQ>VFRRj5gtnb5oFMuE$U zbicmbbN_55o2_5xY8?HAb<9bb&p@$ZyBM(0D}tAWmTi)K z+y6kQx(8`BUI8I(20-! zJQMJ3*q_4#|(=HMVv@}cD@mz%^h`{AZ;uYNN6j>uiox&P3*eQ1VnD zJX{7*eX99evFDpK8&P9222tKu2 zz7A|8Mz37J?!eMIib7@|KaP5PoYjrwCSpFFf9W)s*M>LHxFifR=;|qA&B-SYG0OYoCl%r1X?&k@JAe<|Yel zNqv$@aV=A+cGeIQMyF6&sU)sqb|W06Y~YdTu@E1bv{6=q<@$&{E-Q(nc`Xv7T#8qO zmu4k>n?F`EJIyCxJG|SJ0X`z#RsWcjWRf@d#&toKQ*N8!q-=H8w5S&})Ht87A}?BE2uBRAE{*WYJukM&wj)%>Q-I9|mVPsgB6R_bxK8R%6t9+C)&g%#JEVTD$%|;&IiYfH>3F2l z0?-a8n}qLy59k38_&~_#FEP{?sG?JM(3A;GStb zbB5}4t3N_dQ1c?~C+>JzhhI&oy+$BRCcsSdw&K4`k7#rv_eM?+Vu}>mBJ}Eu57;fV zN}3Z>%ksVBF}p8r)rv~=GCR8uFfH-uN}Zm{@=S3D!&-$05ob6&ld9 zMR${noz+5rp0!8Lm_{!k#eU$AlydimD~4t|?E=k!qnFi#?-WfQ2^?$cRC7TLZb2+h zE$O=In*$~H9E*)it;nV`25Xwa!W*iChZP+Q-8dV<$4vkz1ik8Cb<}))v4J=Jb2mdT zI%IJzJ$UF}G~R%n=kQW!dS48aPIIKi8~pSbF@RTFkDlmjo=TitZ^6A z7D{IRZxqawO?NOFPaMQ+dmrR-dogEedH@a}rRT=$3~Qjbw%tOlC?R{n*b6GA05u{4 zUqEM^XlHOZE_ilS9h!CP9DtoJR0}QQBP}|-mmNaYk&DMDF2lND!*!1&=UyE!2Q^i$ z%wmmHe8G|6o22HHL019R4K3T*^2V)+T$KC-Ne$Llzq5Q(16-5aU^ppwqLl5+qPJ~s zo=Mj0#W-{GAXkD()|Go4<863PyMZvTy5x54a);e{1)Cp5?K)49ETyd>DQBmym!>>I8DpF6c^*DPr?z%Y{&oRz=%MA6?m3o&lhYG+@ ze|x}2e3HvJf-va#wSKZoOh?M?Nsj)e?c4bVt-m$yNbUj5eW!4qUD*}Zogwb<$a_G( z6{r>BG*>5V{ng1!eexN1ixFjYxSVi7;Vx%rQLBKW^Ndu$D=Euq{{Xq&&sR9H2xfdU z7Ms>7Av)>7X@FYp8-LB6@!d89n?q?A>TmUF6~b0vyZ;91wWs;&gF^Cmqj#UP3Ct1f zv{?$;dYG3pgv%)xNw9Jc~p%Kdp*Ip zEAAE7_S6f%dR=eLlOps^KbuQAx`=Lj92ZxQaUNqvYYx@#omyP=$P#Lyg!3}53%;6g z)^xgtT=75-TirHpp9WOJdm@)^`U3yJ3I2(xa|cr5?X9TYY;j#@S&?os%4va&>C|L_l;qPm#$o#oVjmi$OY!!J!R5-oaajuzJj>7Lzo- z1EKE>w`0OQuv^mUP@LicSGx!-#q3_Z0wp=laXlU0Z6`LJR#M&f{@pLRX>|JJHE`x)e9_@|KtgP^UEu_3XdlY_CowTQWmxuco6jj5uo zvxDLPU5QoJltosD|DKi-WE6Bnz(H08L2x#sDJ*EV;7TL;6A%v zTl%{fN&5|iC&jmKQaF>LjkkDu9hu?wh9dI9Y5LnQV$M0CriMfLq_VbR`po_IJGK)b zgf7QFSO8UewXmsM;&MU(n%RICHjS+;N+0Fc5H!?|Es{_~>eFc7)ISPqI@LRUG{LV; z%=6uX@Ibe?@DjrR-Do+|^BMdy4f@0+v4~6QHb6+k{{Stiz1B`+Y_5)Yi*P`+t5-6N zGwE-LTZo&!K1G#K4b^iF8r@ zUY+#xczOGR)NUl`8EG9CA4kZ?s9bLMq2!}MD4=HQ=YV$Oru7<)577aMxLMX@w(Ct= z8TC}l{V+Zki~x|Ob{}*`VUAjj)MWm%%Sku68oP^<&kS>Ct>m|~QjXOIg^#>-y?mGp zYO7v(s427h*$8LUmi@Hw15}PVk~$w4Jt*(f)>){H!Lnc^Hgki?e)23-^zZ4KM&}M@ zL;c52q-2$9)*6d+KFjY$#l?i1FC($&N-6&<-D06twM35N4=%R~5&ym!xHzo)u=a87 zw0Ghh^^d=@U3`vR6>#S~s1Il>JdGLVPmt1H`m?9|#kTukgj1n~LGSh%$ki63P0&18 zae;iC%&GAdET%8i0;^w=Vryr@MOTxAQJPLgb@2^2&Pl%V-_capNUy*6aSf1EJ1YQA zdr`A#N|7L{t%q0$!JR{1RUrNni*WA%JzFn6IdAcI`|B5OjcRrJn|$;GmT^W(Y;#$y z;tV5VazuGz+HiL0Go%wXMPuHEHS_$ACzZNQ+BQAyxM(A&~u{Ax+dFf^SJnUcarb8 zxoG!5FkJa%2Z-G0{caAxsGbCMa8qs*qLgRXZs~L{jdQ-jKzyk7PqjR8vv&og3FGGnJh+e-W_vWCa^*QgDRLXf{}~CZ-`CZ&n#7FGxGe? zo@`ElkrF3CP32Jq$KmH9wS0MwENN%fDVUdA<2;;-aGJw9Y*Pa6cp%z+g)S1eTA zn-Uf{CyJ79{Rx=@{$1=PO>q|yI4Myzb?j=Um@0$NE24zIix+syL@qwws|5kcI|$;u zw-yk$@v&02OVfc4O-0PpiI%VJP78FffB>NaxHalrQ_Yv!({62HL$-j&V_HD7zox|? zH_n01`IY&BdTR8*IDqF9vgB@+t>kZ+aa#&h^1_NM`zz+Om(XD?w=CLN=DBA}F;oau z03}U=M?s5?HvDj5>HW}t1M1YZ>q$HN2juQaXNm=RYUrOYk-*2)9hshJfy|h@$*9`LelJOgWTv#^wr+>1et^2)kR#DDb_`Y?(8N6 zOiX@I!#$NH-sT6y-q!P7S55qwV%0Ym?Yh2p2gxFT`p5c4@Iq3x1e1$BQNx5=QobVb zDBhZ?e4*ifkM~VRM6$FHgOG7sg!bU;bfU2GwI=4PP*{q2QZ|3^vRX{?4nOJ- zj_a;!Iy2eunQ&4|N}Q*KN)UQ}g1)ZD>eVmxE61WrLs=`=;2yj_aCl5%S(`E#^W)F% zqXR1scCjR|>77&QY#!xLTvwVEKcC_>(iTYQ(s1`oI80xg=wg{_7jnQha_9w|K)X}LIHFrw_m>F$eS%5YM(7HhSL zj)OTGrcuGQsNcB4PTNq2draGtOTum3c7Jt%EH1IaJE&B>Ayu#dtJqc9o;_Hd-E466 z)t;z%UQRjwdaACbu8yL$fwx(dv;nVMldPxzlijjzm$nmeT$E9*PX`9QFy9Hgw()3V zMq#dls1%)t>axGS+8mkFXr>fB+t_6H?C`89TM{>5-1X{r2_N))%&Ah~? z$4G2+zrnxbo&M>ynxq4Ni|1^ZX=9oZKarhg2KtA8@M*yo3{zYZY0Bw6=N_J#ytWNM zo+mu%p1jCKs^9U~_F8#u*Dhd@J)%?}tJ$PK8ayXFJXXD$5|J)bff`f(+P0*A@M^fH zHLHZxh{7m-H=WR!)i~(uX(Ez=Ilta3u!>aQ4t+4dS_0#OfgGfPSgd{@F{(_eET5Co z2Ti;s#-pZ?r7m>3|DOD4WPI{Tr&owN3dr@au+d0d)6dR;FJxK6w)TzKjGPnKNE}K z)T7f5D>1oOuceM$reuT0N$rX*zjvC>$UVx_Wx}1}`S&K^*QCfpvyxP(es9YlM|jHr zz8;{Mi|7=_YKi22RB_4Eyc~#g0}veyL`Q*}BVF~$LdhS4Y(5vh;E5mK=#gFAFULFcvL!|hKagYa58a|R{>Db>+ z81hM+mNeU?hfEoU95YNW_eekQjyjNS$e2qyjS@>x=#oeWB_Q4bR0jvwh9WQA#k8-*9-1I; z)Ch-G?*MGB*cN$S;FLjeL`*|6?tk6XhXmFwp;TZ!#t15V4tk?CY2qmwr!9X=Gp^8g zGLz305^-k*XYRUofYP*A>|P9p<;~7hK^1|$rX$>Bf1&6bB&mDARS}%-;erlau-4q@+=m;f!iNa1!ZfI9zD=s(Ai%Z)N}$&k7*i7D#c!at(7m zEoX~{wEsPpI$oqPCNd69E?!T2F?a&iVc~EUiU^x&6oEqL2PGQE6YPwWenDyt4^`jI+}#VwZ>;T`^waB}=9=a~N=sPAX)%Es8x$=ue4Sjybd$=K%q+FmCo?8q+i!H@iLRIPC> z9+%}u7CtP<3x`3>#s7Wia7r?wEf7CQ+Mvo(C)ZM>9pxMTjlu(uC&qLKcN@zv-2#Fr z4bF9WIe9s0`loSi$Jgf*ur8n^6w^eT>t3$U3P{lHaz8xMU7)*?fv8yu!bkLBJ3=^R zEQ+psY5Ntv#g(&L#kX<6vlYw6wt0nBu-}1|orCV!h(vCER4J0JZtr5ZySX}uK3+cD zMyE~{qM5lk*1GYCSVh?er^;m+jE7UnoaG zeD+MY2Y+vEYId6IZ$0K;?*6Fcp_~C8+2Lnc(O)-%AG48;vlyHxo5q@rW9Mj5bvI}r z=*?HK`p^ei>16VWUDx^*gWY2guXsNTebOkQAQUep_PN&COWI@_qn3Vqxn*8lqEDPz zja`qB&&iUwhiF`fDs?%K7ny+{~XWz_i*@Ep!}oeAKyBoSWe%;@xP)()mu($3FWW0i$1SfKOjN4ItxBT8x?#4 zAJ3Z@I35fnF^ZT}z<9%lpLELB)cvx6)ZC&JPUTVtM@xMR-~70gH0K;kAH7Ud^MXr7 z^Hr1KM!JiYX_ongTJ~M8%23gtkLN2edqq3fZSI$gY{zT%KaSJhe>&dxQ2?6R%!SE4 zq)!Ge&u4MYH9Cv^)puv2CFtZkb2YyaM~4uIUyB+w|8t2$e^90cHQHB(!7nb@05Nf#rWKh+XA(dWw+97z=!$!{c~B1F7BIlf zZ83<4U4u3XN!F+DEX3yoj^3Y7-x4@Zr%7^Zco8iE%+O7g1Fp&d+j<)f>N{J@0-@Bw z6mr092Etl}>C!q0LnUUlIZ6>iudRoJiM4wxBmq9)(v=6 zBb!Tlg)oJyymbR1L{1pG73ND<%)a)r54s(!Jx5w5ZF?G|NF96w~J0n7q zQ>V|WVYM0vi?ylHs50w4(ZS`PFK3kGWeEKzOdRV+2L&L|qtmEM@CWX;!@WQ$d869V z%9-5kBINJ^O@E`a9g0{>SsA(a>r;DFrXG52F(Cq3kg<@+rClqNPdK*~7YaT%EXhGF z2sje&r^nS*#f|mVU`KiY8sZG}$qAX?MUk`aI)P)Q6-lHsOOK{*o6zdMXD|tNXcp3B ztDG)YD-!xI_LpK_5XcQ|6QH*NR=LdZw^2U8r0R8rNwt2AjCKW8MbdGXc6ah88X0L$ zFGm|6x*)w-A5KP~gIO8Sgf3SOnB33A*+h+vg%L(_hrNugPL4RCT8dFQsF~8HhirMr zX&>|orf2!|8KHM~o13XlK;ki%IY7P0iAZkH5G@)fUPFu`xn+hjWR4*v1w2zvStSM<)-~%=e;E}!Q!S}C_ zKZfH;o}$~m!f7Pj3Z3#td4qj_|kgZoIQoBFbEDt0dzxG{h z1!y)9)b>h)W9ZmK)9C`t`slrI4cVYkTnQooC`TbY_T@JtZ5v*=vj#06CHj}$IER)| z(^NWDI3HA!<_0+t<$G|`KLw-2oTY(sNjB$&UX%d+xjc@LBN7WMh*Q`rQs;_Auc%~b z>Quc6vlfJwzCko!wD6SQ6&|1^5(=Lk#c!S-y8Rct%Ws-VHfML~W_tJOWO$m>Ah6T@ zQzx}UO4Kf`={YKEvW6lkN;_xSLQ!I0au`gq7{b;pZ;CoL>U*a`(}Mj&;{rp|)A5Q6 zaSipj{lRmLoWDUU&lR=aPWYR`D~^KCqf3_;g3~_+fPf*&Xxq*qA>L)C_GrowMOg=*nP6a(k85R(|mItVtAuH98o@#_;{?86Xw3cVLepBNW@Pa6pG^jSdQobo)f; zH>tx>5OXB=f>EG;Wc{p~6KaoBI2(xRm*Qx{4VSMrLNSB%7&)nOT9H6~HLT}y+d_|{ zL*8Cey!xg2`RH1Zy^(YPT_52jS>BCmq!k+oua*!E3qAQ#I2Tixmk$+ko-~zcs#>3C zpTr|1*!7QE5UPw1YE>Ul0kAGgv0H*`hlWddulaC2cz{b-LqsJrm<)k)k`Ppv&F zj<8EC3v1C7PMl+Aq|wyARwqlV@-($Dz>T-GjC7D9QeRJPIAK->cWOnv;Gs*G2}H^0;|hpFS*dkOL_H%y?@#Vo4q zRIo_P96w4jyXitPM4RgZ3wl=V=yvg>4j9A}Q1v8e25(HG`PgimCt=WGY;0}iKXE%0 zZ^Bz+N+f@@6&BEAZ8cU8vizjHe1r_?Oh6p~hyH;aWza8dn;SY`9~Xn^v`z&TKkd0DdMX zD|o{U_69ieXO{%+pm-~W#O?Fkr~g#-g2@dV!7wfru6HB+@P=)KYR!lq0h1a&^#p^3O`=-(l*%0PH{d+pmXe(2hT% zBR}SF0Kfk?0Q(Qp>YtpIw6T+!t{fuDJ<|Ihx}zSPh1wDSF4IZK`0i==c9GT zjz=ArlH{}=!nhI0%=b^w>!3RbhAW`mjb`0GjY8w`gFAX9m6q&7NJ!smG@W^yX*GR$ z$<6%(fGjtAOXu&-HD8yvS06%(iOPJ)L}gCL#I%BFD&^wf)?fVN=ztI0GM zLeAIFHjWk;?Xn(8!2&^kQz@3-#gSrRXpWSdM(6b3M-Sylw}(_VViK24WjD0hFgw3)7$LM@*5f zN>gL5AErZUF}5uot<%2iyrS#kbt;Aw&TBh?^{`R4yAffs@M)y%M=HpbAQ@l`+4{tL z^>hv~8~cL-eHNj#U*Nj}-^Xn07Gy-}lj!M;E0!JGTh=n5rz^fx@tpiF@)KV|a`$ev zq-7deJRYVBeqN#hJq2kiF;y8ma2W+up)@{CI8LuXt@?yEME+Uf&RAHZ^w^)agn@<0 zTCtTWo@=LJCSrxdvuUl&%4r15;6`LkKJ2@$fWqr0&`r>EBXcI^W1!i9L08Bvv0FeLxx=Durc$1PSg z)FB5#y6CZv;J!(duSVw6h1ARDoBRp*6*X$2)b|S;I&qu;B=in`1OWsAnq{}_6Ibz; zE{4(#ICgx`a6a|7^gN`K(V?7O)-Kx^{jfeAQ_kEZjcC?1#EPL>T*Jr+7i}jCy#lS{<~lpT4&h?mNnbGoArB$yJnI zSP`@&^wID6e)ha#=>#FgmYVcXrjfXV0y^S5`m(?jlB}Zg_L{uC@l4w7=8#>A7G}cD zD(m(`3taEFYJCXW`k8ue&DJR#Q|I_6=ncYJ0?EwVyLXKe zlWeIdj~M;zqV^VsJu0mAjImiREI`3Pq}@mrKm#*-Zc#I&4XMP@_#Si>RU4hwa9nK} zN#e%GF)-R!J9e45ygWYQ=gGjq0tR+-%qJ#quiBI+paJ@6eFrJJAZyD~lQj0wmO2ZX zAs&p7Y;8X9ujmvv4HF5y?*{aB5R*eQ@$>L}T2 zCHt_OCC%8iIp9oFrlchJyXL9V?n$XmtoH3S zPU=m)T-tQ2e)K}je$I4_yxHUo5CeDjAW$;M3X9!n$gaRf!|Gkx;YT1#@J5=i?Ldff zt_U6@Oxg)J7#Qv&q0VGa1q51b&inA`tXgAyq?cb3rMgdPwYr~aZ4TCyd^5y2w506? zXh8E!F013N{m!DmrhK-pAM;4P02*o#U7@RH-?ngK8O~} z56|}2r=5kyevCmf$5F%{S-`bonr4zhv6e>9nFohtIME8?1d{y<^c&BCnE8>68k88{ z_WHYFyG`K$*{O`%rqivp!ZDHAx9U!rJ_4d zsm!9k{|S3iH6Vi5xCGH7F$oPN>Pt39Od!UCNS0y-E#kfA*M)CJxknmFU)8&qbuU>8 zx72K$xZ5yL^q$_$4G7RDl=da$d$1rjg}ez@A>Bam#)sprRp2Fz_9|DW_i+0ze2uh9 z`Nrwqv9XNX;g(BIuq>oAmG*Bwe0yW^oQ1UO!s_PpTAi1bWzoVNGKEHTDBK?i=Ox8GXD!X0gO=kIsg?XSvoCM7H>xu|ZC|RqH1e9^DI3 z|ISQMpL{T!>Fp$UXC|i2-ekJ^&vBt}7e`B2|2b;0IB7e#F``Z7wIa zZD0%seWH3HeHY$a!2hB0{dd6p?@-G7!%dHm^y3G?zoO)y5&i$KP50kYyZ_(0ukCAu zZ|VFUYe1K?+G>!>Fwsb%?flsM5uKzJ*Wj0G&*LLb)dyqYt|Mz%_b0h4#T-WjH3SVm zQW`XDT?txxKpu9$JDdLSM0g_t)PIR;9*UtEotnWKj)ck6!qL60tt}Dl^KRzK?_a2K z?f!e_^nO0A8UCox6|CA@6GS$6Ac@|6K_0S&_;~dJ3G8KD#|!BpS7iKP z6x1UbKi&M09!`fB(+)9*NoCM#HR1_5hEAo^sx|TsIff~PE=5-n#6UlwxSvoekN+p5 z!+;zSK3K0*FCM~R5>p`+VM3ImR3VoRbr$b zq7Kt4S8pDo4yVDe?lO=H*D6wv5wZfUL8et>)Dp4+qd|qIRiV@)vi4GsR(HHa8{t+1 zkHE_QRv(&qU-28@s2l@d16zZ+PC0}dzIw96OH@;a0IQ#-h&M8__I?K0sT?5>+wyM3 zwoN{i3hIM&{Axw#PTed|@^4zyB^lQ~tsqG;)q}dZ=?7V}Yy_int1f&`N6_a6gDBAN ziFWx^G)yt??Hn^45*?PBy?ovv{0S}D9*x9Q3y8X0>!byILtwyMG7USp&f(*Iazi5g zLv)6B_3-Qt1uecU*>b3}8HU5U(J9K(ltV_2j09suPa9ED15l{ zE)EMi_m^GDXw^{MuC(XeOpFkE(`$ihoG_L_=uy%E)6R@7<#7KW zCPw`{Bi-T+=_pc`b3Y}P-t)1u2 zi4wP&gE1W*?lY>(M}jfkn}~6br-_{u5OH$E%(aV5cxJsyT=d=^&2@SKc~diYOJ}!1 zAO2G!Qh&s^+Wt1XqV2(?tHtD3U2EHSwcRjg)C?+H@+cGZmS1M({P95spCC`qmasGD;GXywpIS_ z?1`fU%Bq}JU-A*yv2H#vjndbloC9239@i8;u9GYD#2rr$t}50@*GG1S2WFpU#@L7Y zuFVh~z=&&#Cq=d58^@58tR>i+JsPj$5Dr{~mq-+)1-BAwI!{VNt^b?S!7VgF25eFo z`DV3rTuY*BHS2EuX$}UHYPv6QVtJ5`ZOENfBo;^UN#vcTw&L5^&`GPK3b71TzK_Xv50$a)ci>NZ28t7E+0~IerHXS1Aq%p$d zr!m5H+ZcVb2gJZtrxBA>_e1O}Ie2&p5gAiswUQetdMS(^GxNglt2vN;X^eh&A;3@^ zzb%IEi>WJrsf1UY_%|d+Er;@lu||rc`Bq9d&G?KgyQYI`HK`)gHxXU3|Cfu6Y_3#P z^9)B^oR?~>%%NKrymE?(StFcvNL}rSm1n<0@Zq#Xl3R#>qJe@F`P}+|5CZFqA&#M_Mio=_#!Qy3SxU|&kJKOf`)%lorE%FD8O{Q zxLGL$Kig%Vmv9DVnE`y(6^}4JKTDv@x#f^5(hs0Z6b}+*@(w`S4vWctEFA>ah~#OU z8^6J0i84iK`&K)h;qgw!op6$g-{U3J=UN#NI+w?9spa|YWFL#=B~Ys@owh4XXQA=j zt0%_Seb|)cfO9rDOSs{{;R@`6xfR+ z9lup(Rd>wlyb2nSm3+_gd&U{Sg1TSL&O16sSLzXNT8fG2Qf(kq_E*#P&b3%W=3(tR z$BO|i+N)vUv8+G(-yhEpi7#D6hPzUFRF)VadNXY6Vt6E3Sx&w)Yo*2*wQCAMl)2E} zS6fRc6~kTrb%x8u{vbupySnN~7L|K@;djq((pJ2KxTWCrcf2BPWU=D}`W<&`*6e$( z)5SojD{iJz*QZd5960+oUnl;_#c3I_f;Wn?DL$)qdClSm%gt9}*Q>r^v!-g>r@to# zaw!4!+WsolpZcjuZU<^-69$dcP&i_9RNoa_8yqqx}v3 znShv?KS6A(2NB$%qn`~B9mg~2hlv07*L4sbV6DVleVBgJ5nG_T z@m)r6E@XBCRCX`L2pwdtdz$ty$q0QG1H1;nydV66Lxx%Fo5M=>o$$O)DB4&FpUua? zmfnvn-~nMGAJ}s+nju)ua-v@^7zy)3COqR1XLe|&@-uTJTygxtGWf5ca0jVd$wF|}}fY!yB7WH2q zwhQmYI@_VH6OLH~bB#2J@A)3A)7F#4*@J#M+nr)yE>O5x+y&S$nT`cdtxr%jRTbOf zcA2~2aw!(QllmAO)tM-+?tt4mN2?=pZ1OHM6(x)Xo`Su@5FH2R!wZeDe!%~I;n}#& z!$^o8Nj}3ivNBpO?^|Cws;DyI@2-`b! zcc(u&`b+~QRKnja18Y#`H(3aJpYWku9ZxG=!mIOBzBzt%fpkMmygAnLtvq?uiY2Gm zPMY$sx zJ~{^D-sm>6Po0iNw|bpz&-HD(7WHYt*Y*~^FriqTvQJ!dd;Kx1Ex)7m*Ddpe(F_@s zI2x^S&~;{^dO^+ALQ~XY5YzyOm1B&ZkowJ&_o8UJrTJieKp`W2^Q$zWVLCfsEY-d! zp~lDOO~Qn2P2zWkYPJ7pJlFP;@L{A!m1&$de@BeA4-*>7+iY!NN#=0niEHzt$VepD58>opRIaT_yv52L)ZHGu&K(Rq zr|F(y=w4BM>B=44+#bxy9rWC<;}3gaY7gt;51-qs69~iV3iss?C+gqzf@X4t+dZK9 zK>k`4Z69Rl9uvjZWBQ)O{L>IVCH{gzk9>=dmZ7#c|sa4j-85C^0{UjWW>V1-w>l#yyy3n}a z%a#e4ZuS*Op?9I<;VMfEG~KXPq!@9a0M1n%3H~u>CD6IhaM@WZ5ZZ^NCfS?eSV=1&uyW}5MdE-OqJpTPKkVda zyTtyun*0{7!G|WvleR_MnO>b&P23^Z((}uxZ*P@820^)9;Jsv}r*Cpb+vNPO2bUr7 z3_n+s6FQc)e8Qu?TWvt8!3nNcb0cy z!(f3w0?`kyB7&tv$Vo>$dx3dOr&G^FhJ7IYgzUC^152=18u4H>8JELj*Rncjh~|yxJ*%4*3T+q8d#Qk_P`K*Y`lU?=}1FS z-Ln+_bwQ#Ng^Lp6Yz?y%m@{c{j5kwR0$=HZ24o~KLn{>y^sNKgBJ+>M0cuZcx@cB^1VKSkm*mu8T4bYN<{K3_Rz?wRARfr7!tQ5R_YvvaJh7m7t(q#Yn{; z3#|EtK>o#}N!gb`9!3n4?}dG7Vd0J*VisQZpe5!`2Uoc6f@CR`k$7+GhB1F&0Q;FTC7zVLeW_Ddt%`rLlr z$2aZz)X)}-S-Euq8}SM2=L!knQK-q)!*{=6F=xtGtiN*Pc32I#ZQWR?{UTO3x!qU| zkl=Ab@jr3(-_i5G<4S~0^TFsJXj8)V55M`ZxcVO>3lVo~JG1|pf6UQ=F;W}Z{+`?9 z@-DP(V4EP~U34&t2IP!@e@#(whaubU3qg*z>nVNGcPy zJTxGdwTB>$yc8|bbY>TB($u;|S7n>js8%1wUgG>-ad3`Z-$TYDIM4yKE5siT{*ls^ z<)$20#fptE<*+Z9opmY`)nlSAB0;}|=ZfI#+Ux}X&6lMKSPO%Awa~}xWL4Y2jBZWk zavvdGScL;W=J1g0BDEcaBh5)jvERS2YVM(1#;^u@z)osHt)>F1C+>f5+uM^|4NY7* zHFxyld6%U5XM=!dkXbXj=j(Q~(oz z{E)>?wh*{F9Sny*(Rw%zN{diw@qrrU6xvVBsc}bjSIg#3XXjF{kEWvbnXn|qZauKL z%cmAUan=A~%fL_Q>qh8^5Wj@v$AQ%cJP%?SXwv-(tkb zDBQpj%TTscS~@$kkwM6;rA^ZZ)AcMv9|>&_iB+(mst$j7NnbVLcsg&42Ify~ zAkl!yT0L3Nr9t}y4isvVUh>R=DwnWk3V-v+j`4F*rQ3-(2Shu9>-kbOsNWdsow8ub z4ZO=4#K1mO>&fj2<>JzwtQNK)FoQSe@$Q}(Cv)M@cjlZ3vp&aU-_q8F=@n zI75zXiZ1W;HL9zT7@W=`HbQZ;VpknsO(BV2MrUf5HgHEv!9@|0&5yGDiJ`0fgbOQ+ zl<=OVle;DUd1q6cO}v8*79(9aVfvGZvFJw@MUi-ILAViA!OSj<**5a!RUY=P?V)6Z zfUnXghoEf2{p>TA6`{Dffk_|jZ~$R(O~|;Y=b{DD_Q;IDBL+2x@=vuflLB`=aj!Fj z&N(s%^ek`$`O>1AngRjT@Ev+q?r`cR+D!fq>S%;tXYRF*L2G0Vg+Ku}Jo^Y8FVIzP zQjogZ8ip-go2s}Lk1F`oAf9%j8;FkWh1(58vl}PbgkUd~1j#LWhr4;EGx;-W1Ki>B z;BWL;>I^sGc#2#)gA^o7u#m zbveW5c}q9coeVL?8;}M!t{5`!V0T9+=Pt=Dl0WPMGmj}@MnZ*sp;}6<-G?5fsM361;Bm4L^GI9!nyDCP!DLt zgSvB{BtLO$F=h*lS>YBLp_x>NbbO*mWAc|+paehQg0|}CfJVcNDAK&Y#h~m#rPWL1 zK|+zN%vf>?9fe|WYFfyXEvKDaeqN5tsP#_*f#0HaiylY>MOXrlxWL|_qMM~lLLV?% zbR-rcL$oaZ=5Y6uYx@-B%|!G3#eRU27JFfPBkdOl{mi2Bs7E*h8=x!_fD%TTlGgNx z=q~cw1OOnkoCZec5Z+;Pb)BgKz3>tIrSd@2T#BR#@7x%cEE@6?eQacBer5yRXv(t`Xup@q4vQJ;zb|5hK)HdjK4_=2L|3I zT4)OMn(kS#f8`%A#iyg>sN6{A<5TF?9U1*pn;5|BE#zBX)n3E32Zr0Kg|q;8c?b3M zp8ajl`(|&+%ix4l49j2i{u#2SaoX=&(OGJ_cbpU1O2~StLs#Q@m&}nz`kesb6vZE` z%4_@t#lo5w7WvqK=WIiN5!@HBwx;B8n--*ey&r5ev^2eA7oJH}>&;b%lZ&?$4t!+u zR8sPlQQlQY%rSG&lGH|MPy zl)oLc&@XFtb<*L|Ll!gHDpm?=wOus^7G%`L6BD6Mw8NdXdF`EvduYt6Ul-7KPFm*V zndAHxy}gS~F&*MwD*xEUiDA}8Si58T`VswXVu&aH8|;6kHA`pP2(GiFs!R zPnJRMas0X}eMLZU#XVh7(A`mEYijM)m@jA2^0Hi6`01^_n=AANH$q@HEiJ?Cbg6-ut)OmpkThF}XN`u!a|ek21->1Z zK=4U0{H=sl`Ni1O*98vkDCZ6+a%zgY1EJk2xJgRH|wO@K9jdv z^Agsc;O;kfib*#&)hv7gy%KtlwBV1-0wD%LpVyT4Wl~W1g**eA)DO_+dIt~qh0~_O zhO5GpJ2JUJOqV~rJ(phcnWzMliYy`sNp>kDt$sw}ojnj03k!b`6b}HXpS6sber}+9 zlWFa=dJ6A2(o8+^;oA8k756Bb+7ZozZvxaD-$O~AF zw-)s?R1rF1r!4!y`Hqn@7E8X=dB^GbWN-q%zuRVMci7 zf*1?q7wiZP2L9L=3cgJWK;HR{w?E59OfPq+R7%1R5|#(DKM{cZ=PLHLmW>!cbJQ4D zgrFzxtY-5~*h|wf%u^SdXwW(+pB8SP+1!saT}2rQp^nLyVr5$5k+rE2Of6e%o;Z=1 z8VuZWEyY8Z7J46ARmG?xe|f%R zF?hx!ad&VyYPY8$fl0Z$4n|2u#+&fGD(hCbzV=32oMnt6RU>iMtn`nPSYO zid@~a#^|ruQ*0`qv+Ca<<1T}olY3uRH5Iv@i2QZ*G{nTBCqMzY(+w-*8~oybyyCe+ z{GQzV1*E0Zpf$)&DaT?6pQHmWqj}T2)<{I!vZDnwS_yctGypTJmunKjLLu}*h^s1a z$j?W6zGAIiVLBvjuvK0n$^pf7`^V?N`WKiCb_l{#N)GnWyjD zaqaZcpLz`VBAGFLgLCC$}>%3)8RyD z*;(v4-CP*j#`H$Ad^y$R8m=VE0AjCfNO1q80yBjS0X2v`bSNvCO!`{#3PbS#e}d!l z%Os@}UFwHm;y6}d^DAQK9eV_>kAkwqH>f|HE21%GTF5TFT%p66d~yI}VT6;_0#``6 z?L?6wpxlWevWswddmhPI@*D0TZXt%!*)f=Vb|N;Fv8*!x6<^*vyb;y?20a(%tx`TX zGa|gB@$iVD=_I3oy$G&9TDlM7?cWzaZtkIFS>wOCK5iDA@|7#}p`q+~*v#L^RHEWC z5aOLvuyt}Qw$;!YQ?C_O4d6f6vb}I<2L$_C{4SyKKq&2Vg)C*_M_c0X*_9hRo$G(} zH+riwdJACw{E^;EB7L6o}FA=zFweSS0-RoK&1< zYdiz-Sd6`~ZV6v=Lm=ArsF)C75gh;?9RMF402;k>1}J1O%p|S#3NW$K(+kmwx%^er zDpN!qG)r}gbydvTq!%=5SnSjEbT_l=o`tg44!uD>{AWqXGKHwj2Es@NwBPGX?gzFn zzTU&M)-JyOnlH#JOsWMzSun^Se}sM$)#o*{1i3Q&$fGps%m4_sKs@Jr0_?fX$fUkv z={Lu6oxn8Qzq^aDpPtKweUb!k@5@mE1SfSXfr?z0f%yz?dCAz8A}B*j-9iPERI#&~ zl$1txhi3@pc67wEd6g@;mF$|A)*&6R!4&$-kcpqJ*!eHXqX7znBq4c;_`g1dit@7J zR%`@u8;HD9V&>Epxni#lM((1F`JKUK1{kU;o&}B^jXua;o_3QQVg|@b_hxturoTdV z*xkDz!Wy~yOjEU*&^?m1;6i)7xAxKYO};cHhowxKV@DxlrCY4z5TJdi2#O)#LPy~h ze9P{+RA=enoQD|TebR=X(eZp!@17m*wN!&c|8<~)y`gpxAGiiE_h@SoJAKYjhtmCo zZ<4v&X#|?r>k*Mv@bhv?;`24+BF|aDMHhug%D$K)FLslw^72_f*?2XDq*Wj1tUCju zPl(-^;yGhIEuw}b6o(Cp=*)CpL z#>`lbXjQPEvl!~#Q&=Z_)l)b3WbeL{AGM*)uy?XmPVd`_6=$T3KTU;V17!roMl1{+ zp8g?>v|qG$ZOMI~arVoQ;EXrLgf=zf{mesN69-dkmR{#aTU9eUNC5?c{XyR${@d%wyb{B(QWIg&5E!{gg~Qu?`R&<8hG(`%d6A#q%R4QT$ zg^b$Lw#RCnIvPt7-Xz0 z-Ys5=24r8PT+xchEeFNj3fZY#R+-(>u2WeYdEMf8q>d{R|L^+>ixugbsW|V5`hN2XDva)CP-~f1KF{~jN zPBKUSsJG`ee#yB=$TtKD#<$jVxf_$CRR=MxcLpH0)bN9#L|@S}HA);a#Ab@k!%res&h#{$E)u&C+> z*;jFcG+LxTzv&8>4;+)rwQ_%OixZVP_yP{l)uXRx-Y3Hqyne6ko!|rZyv?-DlJUK1?>jh1e|VQNU>kyl?#&jWEqX2Aeis2?BTIsW&E6S&sA^@QACZ9qOy0`>J*mI z?ykrIk4)Qy>7*d;fN`Y6f?+-kpSbeor}}wCFl8lZnBhIAZpyAjiD!WXQM&lVzYQMh zB&62dt`UfY{#j#Qaj?la@u4-4!#m_&p&U>EJi9541c-hj+U+9KQ$NN&Pk9}+K;2&f ztOhkA^fcWu zCQ}&}klg#K(Hj<_zWURq2<7X%is~>1%B4+lm5Y8Q*Cq(H$?!27PgsXilp&;MbEdl- zp!6kN*fbmVr21GRe1cJ3o%oiA^&7QhVBi>Je^U9|rMksTd$w%lI}(&hsqyyyz2M>+ z^784qpK5!n*xglp+nzpYlE+xTiwZaIiGslDufj+z5Z>kJZ$#kPXcI;V@-)r!S`k<8 zl_z{fG`X!q2@MoAz0JudGg?5ADlsh<9_y<%6d>Zto5ov8HYi9Iq$^(*9QD!OO0@uW zF5BGB8%6N>mg~58L{BCX9{SGjxIZNKIehNZ%M|-=J#$a+NVF*^f(M^KI#*rFW$H%> z@b7CQ?t|cnU48<;N8zZ1?J1C)P(Rb}i*bSNS+VK%!m2yHq~k8#yKm&*TjLod=D&5| z;%r@AnS+AYjbY*dFu$@tM0UTN^7c8o`O`o+DKU3Isc{+x3%u8UA z?M9zz#S?M;jRdiGtETmf>^c(^_QLLrvK0x}q$g2upka8w?!_%mjMiXK{eT`1ff?o( zUoiN`>#8PI2Qk}D6cQMIX}AMz`08VnSxQ_To^WVe6#&0?qs6O^qxw_jRDWoU^#|+p zo*;?!7^`Ie_Jb4rpt(VYNoeg4DU{QK;e&$VBVo~?kD|Y>;uZ&|(P%$UPQJ~ii{F@A zS?h6L)x+~UdHY9Vl=ByV({>?ON1oAtFbo)iaPP$mwk&knjhzFPlrjGdJpNf?!X$53 z5gJ*S3@t*XZ2=bCJ^hex1s2hySGDAs3+&iRB?~bRO~c0&;b2O#$;DMO7ey(9$?peB zP|0&Lf{RJ}^ATpT{q=ClzP_qQw|7g6_UIHpnR`w(SGd%e5D6458fQ5KUJ3ux6#hBzC*vVWG zuxr(dbpr%(L#d)`j?{CD1tZ=XE9^+w9^=lU0U?-zVRf4Y!+$H2yjE{fu*{^EseP-y zLL~Gu7Vk&s`C?eC17)wDHM6%c7YWo($U=>(>o?JVT2=qukov!^s{ha*^+5&@XZ}$i z*Zvv$VfagwtjBf9Lj7<^%%X`Z7BYEn^LfjF#iqtXKMzRuqMoj*uIC-sr>l#b zz`$>?ex8qNQ`$HXJ^4N6+7S{bfnfg9l`W)7nsSR$xX^Ud z`r<>6khmt^KjiZSK>tg!(4pV|v!hdWQYud~uJI_Du`%2*Gr|^n`TnQyja7JZVk% z3OuDbbXmul)A|j#QxJ7L6_BEMBuu~9GX9L0eT7)UJ+^{wl&a2P_|Lgie(*Ezy7^Tx z%4!VhG#{IfIr}fQ=>ag{A>ndQrf1C@TCF!JKhdKb&!?w4-@~Yf1%k^Bn{Y+RK(}*9 zLtV~r37YVyh%8~w33gd2KxaJp`X1e@ZIH{N8N%w$9D4$O{=S&e6AAQbTxkBxUm{I#Pxa`WV-QR=#|U(LKFWPt zPm#7JUI_78Q30n6*_fl2OcXp$wr>+2!#Q8uiVhY}j;G&4Ep&Z$Y< z66Lqbz&X`Iqq|yi=;+MTD=oI8ak_8<`RWoQ85r~IM%hB0rl(lC>`?-iO$XVlX(TCp z-{}c0Pu$^3N4>J`+o0^X=UH{q(bo*I^=Nm|6lj{~xr3MxL>rt$L@NB2_ws`)cNM{& z&AprUGnF)wB4@5SPV^LeICLK$FWQxbn;ca1+}rpmz@soYth?%IE4|z z9EE~EfIoeQVM7jv#-Iw|ZH*)%szMX{Y1+Lm`jX5bK6Z!ftGtn0F*SvS=?9DLJim7p5eV9AC*I4Q!I;JK-WKYozBVx#wIbf(a z2_eKa=(CNrrFHbxr@<)1^;>#+7v>8H9VsPs~XXaIGTB*+Q6Y3!}xGe$3E zuBzA*LNA5Lfz5+c?hT6A;fAjW(mD40YZW?g;)g)MGm;63&%CJOlaLFe;=N#+aD>R9x{!%Hserk_^IW=t^Oh ze(sLPMPgtDvdRpOfiADE!`_BBa{bdl0An$31j>#^7-^3w~rTW$m#!) zJN@sh_rLRDAeP?<@SoM-5aIu3@cdtqDVUQga2~EcZ<;;F*{;-0|ruxR-@@V1@ zI+oh&6Q@6v&P#7rnav8WMDkgwCRN{DY#aL0a8UuV0YW|A4?EAj&jjB$>Hc4Tsq#SQ z$vwP{zP(|cxn?WRM$u>yjr9h?V3{c4I$RV6yfMPD)0nW(`71=43`>u0ty3h0$Sf6U z+ROK>F=AN$4DC*yvblI^AkI}#5AD9*Y5UCr(O$aod-L~RMd-({KCwsAj&{;0^8O6~ z)Ap9`UDB=^=}`>qR=q&>(pc^$HenszA|*ap1%BQGIJ^<#k)c;YT%IVam0{xC#+j; zmQ>RbE)+pMhSBWihW&6673uE(m%m!U~XDB#N3F++`y+?ypua!lld4o=Q;5U5}BerDr?j z^8<_*7a%eDDHJT=XpzZJiVqRfrIT{4Vn?hPsO)GNxCkBR*nq9-Wqt zD2}?HzikI?@Yq<$R_5`5@VKZHwfpQnOG+)st}64kT1Y4GM6?VPq|qU5!ncPD;mdR}+WC!TS$BN6n`?Id>9QJ}hCByQj-Qjv}- zsDk?5U4g1H-7JS8jd2Xer;27DQwMVBY>xXYmy>|5_S{#$)I@~|nxt4GK%RA8>~^l& zFguq;2n}E3W~D>1pK;UI^V&wwS}kMG7u7@sKO)O&jNL`D*nxRX=s8|XWi14R=FBd7 zk1#L0m|FR}N}&Z5OcY3=#fUYim5HI0WKyHWa40i^W|kw%f)DlyjB_-g6D^7<B?myo_ zMQfEs(JI$O)oay8;WEbP@Khx^=Y@ED6h^t^SfJ))Zfq2BV>#jA4+C&4 zgbm^DP}b&|k8AfQZL*Kf?#h?5fV4$4Qi)c0Ney)kONiSoI;q%c3?pQ&lV+CubK{FG zF!f;_p60T8Tmx*(e9cSo6Lga08U+&1Nfh1{qb!Qj+YQOxNSrx!2by(}>J%??*_dRl z*G6TDRk35cSC1oEi(k!)WkEw%Pwf&D6mWhfHj*t#rkw;OVd5~KO?%*DwR1AX>?CL% zNs$u9lqI#5#gW}(2mGjRCSrf)Mhsi`F&&Dxx|9Bh9Zw41I@ zU3J-GjYG=L^=EP_O`DC)JK2PlC7x`L(%1cNH@@RT1wK*zHiw^0*xIMLQJbK$K}=7j zTh%MEb=A=(tk9Q|n)Kjw(cDPhRfntE^eIysl{8fjuE0slq9O9P|1=1}%jj%#8%nLUYzZc>K_(!%)Hm1Cha=Q!Y$bLQ_dsHG!as=#6 z;19Y|B@ZXq7-fg$^b^VzHL(Yq_P6n_nGeZs#+aW{SdOG30PIX0xpMEkC z^0leA+#gu=az={R5dU26Mr9OgQM_=cx-Lf>4nQ>~)o-LpMoSGV_>&U)23eB^x^DVq zc&l=2ZHlXkyGa(S#aMR2xLikL@F(D;?l5ItXv|Uc>V(l?6{`fb=}cz$az<*9`o6K)QPywHNB9pN|3QX;0sat7Eg(8H!P~#J;k`{%d{VUGVZY zZ%-gD)sU*gY|GP~q3aT#AnSsaR^<-YxIzo3IOI~n)OlW?FRD^9e|0j&hW5iRZmJwXD{iBNx3r z`r7o&RsRW_{X?a{eq6I+SI*Xj0cV3IgdXv%(`@b2iyg90uDX;kebt<3tvdXV*hPzb zw9LKJtLuWWf*0M3&!o0_iYZXVV|`A{o)p(Qv-;73ra6t8AHGpoC!xwJpKWz-?5SS! zLRRRl!;j|9@hHrS8hm#3xSS7Wc6b`ya__;qYhuoXHP(zbEet=VSygj>-ju?5(}I_I z?7iG|eb}^5qMsJ&jxO2s<-Yk<-&j|*n*Z|T;icCGm5!OY%wyS`b-h}7UYOWE_Tabc z8=cPEmDe?||Mm?HMt03SRC&b*aY@~3SMq3BKV@;JqgTgw&)(8&)@IMOrPeujo)jyLBrVTXmOR=~T)Xa>u}zn4jc=HLB&hW5 z7Y|ny&i}1n{rs@i`61KtzaRgk;|DLQ-n}p>wjh7d>hF%`{YLw>qfVS3l&y?7UhAEge>bc(!h6hfujUu49m!1p*!!;cPX|63w>xRE&((zs zcaAPS*RArEa(hd^D*w^iofqpr4v#;YP^F4z(+BZqUUt6p`O?oOu3dRA=%f;6W2(_@ zNc`|PpWzoqb$)qDJ?TvC=pzp*&761A=s9#~^Fy&k+KdMN zp<}fx0j7SXBLlsgG#M4!yjOPhF+WG$3BGpp?X_>t3hFR_cBC?>?))r8k*{y+>e!E- z&2CcUX-uemWw;3{L#1)<>+}l`PsP0^^>(#AQS~tG;AiUo5iJPXbJih1dlEuH= zELk@!>4rA4=boBz1KxtR;PZuYX8R8myKs)cI|HPT|(}(s+AM({d&CU_dcHCFIM#p+qJCi z_KhRj-P>XDDp=(|dHUk%9y?YjPc_;e(%2`wMefRvi^tYiU#t1%E8Cz?+P+2%Dp%gS zg16$$H{Vpyqk4mSbc;*Ji0>nO@U&jxvRdfZu>R2j?LxzY{lWsmLxcNAMYj(Nwj(l+U0#ZN0ekVgfZ*;rUiXE`Kq+dqncB%H_mw z>GWo;QLjpN`}Nw6Z!3t_uDq`k4ILN|nvM$J!!ImI5)VX8LsPdP^iUA{MU<@Jf(Vb( zW{{laPtSx9kuLF&#FsrwMC;6!XbD774cramP>3K}oq?gm8KI7Y5Sw&^cnCJZbYxJR z`C-L7nTJ9;at}fiZ2LvbY~_K_^QhgKS}g~HjhpK{2%>|*phv$5U&Ak$9hF@~MlC!H z#zm&7Y4OQAwJB}fI9)n}r$yEbv; zx_()0NNI1Hkft(f(^A_z*mOru8wT;wYa-f_%Sg4yG?IF?hnD;u&{1dH!9@>Cb6i$S zFKlW!$O(bMVvNbkviok7w#Sd-nLKI9X8R=1POk`C?tJpQ8-R5QAJNei3ae#6Wf3+| zm7J^$R;kSfV+J3megpqzYLNCL!deptZTM-mbVVR^kQb>{CEKt9Oc{DL{l-UoFz5J| z`}lS=oLzJ}Lc9I8h$c=dT~Wxm?kr6zZiwhz7ak}23!&79r8sB`&}fWWlZg*;EjaP< z9Y}o~SgXmfl?l2W5J7sA<5@>i`4SEKuRkgm1up)?M~v-6!}|IRfb06C^@h85wps~A z90$Rydb;6uE64iMhc5AP>W;6ImJd6b0QJ;m_-N2ViZdZiYckWboA@vX{7ak60VfnJ z=yos1WwkW*6=C|r)r1=g9Xo4M!4PMY@~ZT-K&lC#h*j}3_>F_J=w#C{tPN)Uceym7rG9I z13s>(o>HV?$73{Cj3rJ2js8#ez z6;}?(!FM-4Ui3Na&)n46!Fzte!6yfozIW3Vlx#12$>{uJ5KA(|(%wNaep)TQIsXPK zyaA>&A3Ju#c>np>R-1*}tXnbIL$aRa0u$g6cxufNROKCnuq;C>PV2v8eh;a97HOJ1GPr8Zk!G#rwvS0>GXlgT9xn` zA8C#vVr4Y&gAuXmiP?_JYPoZsgHOh1dwzBh(B-7?Q)GmqI^xI)e7ZRR@zZKq zh#Jh1_k@gvidVQt->yF;y>wDbwNt!Goy0enm80}`r(%JTAif>5Naf4?MW`|p7E%T# z8%$-7N|wrmWPYso^Sku{`!)QB4X;fBtQS45+b*2SO}EapYAIHrQZH zk*`iF7L8~!6{Mv>T_~=E%WCnwC1R9CdD{aj%TE1Bd8FE8>`<>;s{l091?b%GB2b_% zHBoDfO4IR`O+fy$!h3H59WU@{F3>~D{_d^_#MVo)WwtGH<-R{)11LKTQL!a$UWo{3 zOE)|NB$@)IdY{?~#*U%zVjMaq$D zuR64b2LBJ~iw#RnTFRpKHyRB_DtcWpiSt#~052slR{@i?)Rn%nm?5@=!Uz01;(FsN zQ0zB-6^gcuC~Nr10}|_E#&Sg__74mzdZt12SyIWlBnTZWgX~wP{lPlD4F9L+A3yg! z%(()9`!M8|kB|c;1CO$$JV}|P3^b(a=^bEEIz1;kQ>;sE`miVjHBCCECol}*vRXPu z%B@8`i(T9@oodzGAwN$7)KYvp36NyEr&V&GF?ypmRjV@7gYhL{(N*kZA(!_3srUpE z+J*4bf>~fgyxamrwVOt3$+Oyv7X$KBK(e*(3=Id;<-z{;ib+Nw1$9S%JPzPX0p69N z*Np$>C0eH(sM4#o$&PA?FOvfww!J?FW;hpFs|~Y8AH1S~w}y~oBa8;KLG3tT<(z?X zmQ=cKL{~5nT>%@UpXfzkw+5kUKKsl_@b3-&*=)EmQ-laeGbf^3r-F#rM3BG56nChd zg|ILeK@q`PxU81&4@964m0n{?R3&lzi$LD}sJL(nK(cE{hlXUH4L%k@9D@w`C{0*> zo>$wTg~Xp@ZorNXZq604(1@n0%otO1dLu&lw(b8l-VSD}K}PgQB*$g7ELbk02>OyA zf00YSq3P753)q{4@l+QF5`F^gGZBnQ935<>qJ0jb3`|VZCuucNhBTv^BSBh1n`qi$ z1>{wH*uu-_%hy?gQ+SbE=l9HLXNHMvb*Z77t>wU~g@lZlieaAcPhPn}WVfp^x2Pi$ zOFGhOe~|9Dtd^%%4!$tS5729j2Aw7%S!EuFs!v(=?`UJ1$sB1gm_zj%ZMv&h(vtUv z?C2bYB|pIIFWj*nep)RnzWyJU{I6PuxO3T~8z3SKgCVeKZ~PW_YY)^U`8#;!b5$q( zYTdtqT!a>iZCbDHaECl3mAY$Hvh<}s(r`mYU9ujNGNX&m92OHZY!MbE^ zR0iIGn!-~&Vb;kQ@lzcreI}Y=Hn{gaz`<10j#5V$RkA7rohts8a|QyRckBC_jX-c6 zRFLdoW9Kmrcv+#wRu}R?hF0+ZbxGhe_{FdA3s&4+PQCUDU0qd4*fTE-dQlU&?I7-+ zjJRi?b&qW?3sGZGiIHZTo46Cxqu_(DN>I@(L}+4}sCeG}LK4UB!e^pot+~E0V2}Hd zrdSmW{?$FUJ#E|iShsc3lq;TJXF)`tqJn0-*zD^vEBN&@>NE*jNj>IDJO%$Z{KNHI z0DHW(a~D3hL=HMqi(w|hP_O|rt4T4b|GLP8y)$a;MRw^94X};LYDIb1>LA9fOXfLK zEa;tjv~cWiGZcz5_^{4oEzf~s_S~fZ(3;vOOm_DE{o}WdM+v7;!rWQ#tFt)ZE@fC4 zwogx}8ox&cHXaMUTq&=mNQ( z#D^`M6iY-Lfn7ex<=;JHwNT7lu*jBilTq0^N=!-h&NCrW#5-zFMI!)31IS0Pr;VN1-~7~(i|Cy67d12L0yWsItt-b+4fvlF7$BIPv^NFm1V zWQ$;7*y+{bZfn~n9&P{1?EB_*Z(8XdP)30~Ha3-P7SR~R@uWnA<<4F4Fb&dPfMmdC zGbPR?IJlIrePi@Vdc!3BV68sEoaio_#pqkbuY@QmCHH0|P=342Lc(5vFt)d6P)A#* zl(C{NKXw{v1y5~V5@%KPzg(VNmy*Hm*kZ(6!@))%l^1s1{H6KFsyeo4_B3{ z-xj+%t@Ig+s9ey>d6fBXi3lit$BukbBr&GPACJ0=Ab1aWET3mzig@<)A+zmEWF5OX zFJ%wLg3aN;>|mpUX9dBrXl{gKEUuyo1w?eEuRIWb6|Z129T`!*YE!}a#1Hq-j@^I# zQgNUsJtf&$a`z(|$v(1RqY;GLg zLj-hevdG&5Vf~!G{n9#M-3Jz1*Om4bvE-w^W8xt@CH3tV_gMkr*9vgY&hH)vyv_mv z@g|&ZP@Cm43Rz>dy+!TYLPgKOh>|g-+K`h=m=DLso5qnkTt!Sei{5{H{sweJp%_fD z#oxUa zHxiCZATHX*!D0rGeAegr&HJ_v9IHKcEt)ezzw`|U(H70h#*ci!oIOi}Xrt-{JeHlM z1@7Yj@<)!G0|&%@^;3Z%7|1DJ0KYXuY?lIgZ2Qp|WjJ?Jmz<~no(MTK^YKRXoTw&@M1@B0K_p$AVs-FbFsMXMJrYc#cgRS2C{-1Z?Xa^x= z7UpG;1jbR9%O%&6W7+x;sQ(az!VY%Y43NM$SLS@ymia9hfPH^OKd{G+V)jRhV9Z7> zk1kSn{RLBx*MNkmV`wG_nYzf)82dS_-DWvRk7grAU$RXkDgO5K-CJ71@69kE_K;3N ztOU;{E_ozs7ycgUUu8BZTZ^WREf@U8h)DA7La;7ftNHg4QCd;&66`K1K81d}F#>3$ zmRZJiZsT|t4o}J?mH+(RpjROlFo73#4i%(*?M0mCP%^u-?Hg2jcQg3;k4s|6)X6R- zJ&egWxfU09)=CECZI@g&ElC!ZnsUkE969M!UbWzSF+{Hh*=$@NfI`|~gN&v-`bmnl z#5A)8an9kH5!5R%9b z|0Z|85iaY8V9gHGA7qNi%rME-PAHyCy^%S^9}>QV7{I2v9Gs1G=u%3MvY#O(U=r?; zl1p<0JJ0*ozP=D|YlxSPc)dOmVarap$j22D;)pTUyvGnC-A3TUIQ-FtB9ufgWit}l zut)U8$ENm8gjR~-;B25K9z+kRj_r6*h`EOc-EJ#7F}^cSb~t+VGQ4UyM~0i!fYZ2Ma%K;Vhzd zYC_$_7}DbYS&tW>n!|0y3PlgbwkChWL6<$cVmnPe05=Y5_@X)z;_d$?RA@lf9>}b7 zW0$*iaAst<&YU<9Gy9BwI1=MHKcck#Pq;S0fFb2Xo$&rGsre9p*`Ia$JsP~Nui+f2 z)%*UJb@|+ld9Qg+47_L%VjSCpHazTZ6{iD0uHfVW`qk&(!XAO*KGfvPi0sA zpki4(d$W(|sx`Z@R3i8K-M)j*fz*~t=Pfutq|rYsS3YQ=X#pEP3`ZUB zfzZGv1U*J@atqN`dD-13eAv=I?#%uHqMr%A1DT=?w zr?Usfhas?qy0mQXRgquAM!LIB@XEtIrrl^`Uo~+);(g;Cc~~Od9qQ`KnZy4Bn;wBI z&JG(&TX0Z?0_5Me+enA0!_vLW0rzcG2WaSo%WCQ0Mg|+(L(BU$`!xV+fYWcDY2ijKBP*FxV%(!ZeBK&79YfY^R%b*DsTPo;!au982XgEU_ z^1+xIBYj%~=1Wu_Y}1zCn*$YEcJH1mT_i-)lg3?c!U=Lv;<9x|=Kv0v^O+e}P-1rc z-2ARTKxl0cDcJ5bWt0eNBTVj|Jc6nHUDI!0AtQRByh0WiE~{nAXb~n%tI?^VGg3K% zCk9`3JTV`eLW(y4#HzADBZBa23qE&8TKqi28)$Ttf^8-TC5nj5jwGimA_hb2SGhsk zHXA`7%iz~~5s3_o?uC~D`KwoulIB^n>o^Za>P-+qsNkmEU_MLL*6+5qgPSfu7G((; zJVnI7=5%s0PB+L%dYs=3%_+#`N2rU<4f!bSTw&H)G#2!71jz9$N}N zPqUv!+d23`>~(i8xNG*D4!Ds)u@JbO8O-9H98BjZM?298?)OU{=_a4iB4eDyG>t7N zw(fqN6*#e;BE;FzXF|$>XiTS_VolO_A}rIm%7h8&JC)gfXjg%VB#m0G>L-e%@6ctl zPrcJ3j&K-I-j)bV`jm4vD;m#=V2%JN+v}2dNgoi*9>{1|B0|~YJV)3BA$=4R8`#@D ekU$8{m-t-ah(VNI=$?kFio8&Tq7wcn6#ox8Y=YbX diff --git a/libs/okio-1.14.0.jar b/libs/okio-1.14.0.jar deleted file mode 100644 index a0ee347165380ead8f82c3ef122f16915df701ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85756 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

@$PtwyP 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 Date: Wed, 22 Jun 2022 12:55:18 +0530 Subject: [PATCH 073/112] removed sample app --- build.gradle | 24 - src/main/java/io/imagekit/sampleapp/App.java | 683 ------------------ .../java/io/imagekit/sampleapp/Color.java | 21 - src/main/resources/config.sample.properties | 6 - src/main/resources/sample1.jpg | Bin 51085 -> 0 bytes 5 files changed, 734 deletions(-) delete mode 100644 build.gradle delete mode 100644 src/main/java/io/imagekit/sampleapp/App.java delete mode 100644 src/main/java/io/imagekit/sampleapp/Color.java delete mode 100644 src/main/resources/config.sample.properties delete mode 100644 src/main/resources/sample1.jpg diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 49debe4..0000000 --- a/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - id 'java' - id 'application' -} - -group 'io.imagekit.sampleapp' -version '1.0-SNAPSHOT' - -sourceCompatibility = 1.8 - -repositories { - mavenCentral() -} - -application { - mainClassName 'io.imagekit.sampleapp.App' -} - -dependencies { - compile project(':imagekit-sdk') - testCompile group: 'junit', name: 'junit', version: '4.12' - implementation 'com.google.code.gson:gson:2.7' -} - diff --git a/src/main/java/io/imagekit/sampleapp/App.java b/src/main/java/io/imagekit/sampleapp/App.java deleted file mode 100644 index c1c551a..0000000 --- a/src/main/java/io/imagekit/sampleapp/App.java +++ /dev/null @@ -1,683 +0,0 @@ -package io.imagekit.sampleapp; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -import io.imagekit.sdk.config.Configuration; -import io.imagekit.sdk.ImageKit; -import io.imagekit.sdk.exceptions.BadRequestException; -import io.imagekit.sdk.exceptions.ConflictException; -import io.imagekit.sdk.exceptions.ForbiddenException; -import io.imagekit.sdk.exceptions.InternalServerException; -import io.imagekit.sdk.exceptions.NotFoundException; -import io.imagekit.sdk.exceptions.PartialSuccessException; -import io.imagekit.sdk.exceptions.TooManyRequestsException; -import io.imagekit.sdk.exceptions.UnauthorizedException; -import io.imagekit.sdk.exceptions.UnknownException; -import io.imagekit.sdk.models.AITagsRequest; -import io.imagekit.sdk.models.BaseFile; -import io.imagekit.sdk.models.CopyFileRequest; -import io.imagekit.sdk.models.CopyFolderRequest; -import io.imagekit.sdk.models.CreateFolderRequest; -import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; -import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; -import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; -import io.imagekit.sdk.models.CustomMetaDataTypeEnum; -import io.imagekit.sdk.models.DeleteFileVersionRequest; -import io.imagekit.sdk.models.DeleteFolderRequest; -import io.imagekit.sdk.models.FileCreateRequest; -import io.imagekit.sdk.models.FileUpdateRequest; -import io.imagekit.sdk.models.MoveFileRequest; -import io.imagekit.sdk.models.MoveFolderRequest; -import io.imagekit.sdk.models.RenameFileRequest; -import io.imagekit.sdk.models.TagsRequest; -import io.imagekit.sdk.models.results.*; -import io.imagekit.sdk.utils.Utils; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.util.*; -import java.util.stream.Collectors; - -class App { - public static void main(String[] args) throws Exception { - ImageKit imageKit = ImageKit.getInstance(); - // getSystemConfig(Class cls) method need current class as parameter - Configuration config = Utils.getSystemConfig(App.class); - imageKit.setConfig(config); - -// getRemoteFileMetaData("https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); -// generateUrl(); - uploadFromURL(); -// uploadFromBase64(); -// uploadFromBytes(); -// getBulkJobStatus(); -// deleteFileVersion(); -// getFileVersions(); -// getFileVersionDetails(); -// copyFile(); -// moveFile(); -// renameFile(); -// createFolder(); -// deleteFolder(); -// copyFolder(); -// moveFolder(); -// addTags(); -// removeTags(); -// removeAITags(); -// createCustomMetaDataFields(); -// updateCustomMetaDataFields(); -// deleteCustomMetaDataField("629f3de17eb0fe4053615450"); -// getCustomMetaDataFields(); -// -// calculateDistance(); -// generatingAuthParams(); -// -// List files=getList(0,10); -// if(null!=files && files.size()>0){ -// getFileDetail(files.get(0).getFileId()); -// getFileMetaData(files.get(0).getFileId()); -// getRemoteFileMetaData(files.get(1).getUrl()); -// updateDetails(files.get(0).getFileId()); -// ResultCache resultCache = purgeCache(files.get(0).getUrl()); -// getPurgeCacheStatus(resultCache.getRequestId()); -// generateUrl(files.get(0)); - - // System.out.println(Color.ANSI_CYAN+"Do you want to delete uploaded files? - // (yes/No): "+Color.ANSI_BLUE); - // String choice=new Scanner(System.in).nextLine(); - // if (!"yes".equalsIgnoreCase(choice.trim().toLowerCase())){ - // System.exit(0); - // } -// System.out.println(Color.ANSI_RESET); -// deleteFile(files.get(0).getFileId()); -// files.remove(0); -// deleteFiles(files); -// } - -// System.exit(0); - } - - private static void generatingAuthParams() { - System.out.println(Color.ANSI_CYAN + ">> Generating Authentication Parameters:" + Color.ANSI_RESET); - Map authenticationParameters = ImageKit.getInstance().getAuthenticationParameters(); - System.out.println(Color.ANSI_GREEN + ">> Results:" + Color.ANSI_RESET); - System.out.println(authenticationParameters); - System.out.println("\n\n"); - } - - private static void generateUrl() { - System.out.println(Color.ANSI_CYAN + ">> URL Generation:" + Color.ANSI_RESET); - String urlEndpoint = ImageKit.getInstance().getConfig().getUrlEndpoint(); -// String urlEndpoint="https://ik.imagekit.io/bowstring/"; - - Map queryParam = new HashMap<>(); - queryParam.put("v", "123"); - - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "300"); - scale.put("width", "300"); - transformation.add(scale); - Map overlay = new HashMap<>(); - overlay.put("overlayImage", "logo-white_SJwqB4Nfe.png"); - transformation.add(overlay); - Map options = new HashMap(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - - String image_url = ImageKit.getInstance().getUrl(options); - - System.out.println("url1:==> " + image_url); - options.clear(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", urlEndpoint); - options.put("queryParameters", queryParam); - options.put("transformation", transformation); - options.put("transformationPosition", "query"); - options.put("signed", true); - options.put("expireSeconds", 10); - - String url2 = ImageKit.getInstance().getUrl(options); - - options.remove("transformationPosition"); - String url3 = ImageKit.getInstance().getUrl(options); - - options.clear(); - options.put("src", "https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); - options.put("queryParameters", queryParam); - options.put("transformation", transformation); - - String url4 = ImageKit.getInstance().getUrl(options); - - System.out.println(">> Generated URL #1:\t" + image_url); - System.out.println(">> Generated URL #2:\t" + url2); - System.out.println(">> Generated URL #3:\t" + url3); - System.out.println(">> Generated URL #4:\t" + url4); - System.out.println("\n\n"); - } - - private static void calculateDistance() { - System.out.println(Color.ANSI_CYAN + ">> Calculating pHash Distance:" + Color.ANSI_RESET); - int d1 = ImageKit.getInstance().pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); - System.out.println(">> Distance 1: " + d1); - // output: 0 (same images) - - int d2 = ImageKit.getInstance().pHashDistance("2d5ad3936d2e015b", "2d6ed293db36a4fb"); - System.out.println(">> Distance 2: " + d2); - // output: 17 (similar images) - - int d3 = ImageKit.getInstance().pHashDistance("a4a65595ac94518b", "7838873e791f8400"); - System.out.println(">> Distance 3: " + d3); - // output: 37 (dissimilar images) - System.out.println("\n\n"); - } - - private static void getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Fetching cache status:" + Color.ANSI_RESET); - System.out.println(">> Sending request..."); - ResultCacheStatus result = ImageKit.getInstance().getPurgeCacheStatus(requestId); - System.out.println(">> Request complete..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static ResultCache purgeCache(String filePath) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Purging cache:" + Color.ANSI_RESET); - System.out.println(">> Sending request..."); - ResultCache result = ImageKit.getInstance().purgeCache(filePath); - System.out.println(">> Request complete..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - return result; - } - - private static void deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); - System.out.println(">> Sending file id: " + fileId); - Result result = ImageKit.getInstance().deleteFile(fileId); - System.out.println(">> File deleted..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteFiles(List files) throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { - List fileIds = files.stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList()); - System.out.println(Color.ANSI_CYAN + ">> Deleting file:" + Color.ANSI_RESET); - System.out.println(">> Sending file id: " + fileIds); - ResultFileDelete result = ImageKit.getInstance().bulkDeleteFiles(fileIds); - System.out.println(">> File deleted..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void updateDetails(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Updating file details:" + Color.ANSI_RESET); - System.out.println(">> Updating file details..."); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest(fileId); - fileUpdateRequest.setTags(tags); - fileUpdateRequest.setCustomCoordinates("10,10,40,40"); - Result result = ImageKit.getInstance().updateFileDetail(fileUpdateRequest); - System.out.println(">> Updating done..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Get file Metadata:" + Color.ANSI_RESET); - System.out.println(">> Fetching Metadata..."); - ResultMetaData result = ImageKit.getInstance().getFileMetadata(fileId); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Get Remote file Metadata:" + Color.ANSI_RESET); - System.out.println(">> Fetching Metadata..."); - ResultMetaData result = ImageKit.getInstance().getRemoteFileMetadata(url); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Get file details:" + Color.ANSI_RESET); - System.out.println(">> Fetching details..."); - Result result = ImageKit.getInstance().getFileDetail(fileId); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static List getList(int skip, int limit) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - System.out.println(Color.ANSI_CYAN + ">> Get Uploaded file as List:" + Color.ANSI_RESET); - System.out.println(">> Fetching list..."); - Map options = new HashMap<>(); - options.put("skip", "" + skip); - options.put("limit", "" + limit); - ResultList resultList = ImageKit.getInstance().getFileList(options); - System.out.println(">> Fetching done..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(">> No. of files in server: " + resultList.getResults().size()); - System.out.println(">> FileIds: " - + resultList.getResults().stream().map(baseFile -> baseFile.getFileId()).collect(Collectors.toList())); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(resultList.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultList.getResponseMetaData().getMap()); - System.out.println("\n\n"); - return resultList.getResults(); - } - - private static void uploadFromURL() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - System.out.println(Color.ANSI_CYAN + ">> Uploading from URL:" + Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url = null; - try { - url = URI.create(imageUrl).toURL(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-image11.jpg"); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileCreateRequest.setTags(tags); - - List responseFields = new ArrayList<>(); - responseFields.add("thumbnail"); - responseFields.add("tags"); - responseFields.add("customCoordinates"); - - fileCreateRequest.setResponseFields(responseFields); - System.out.println(">> Ref: URL= " + imageUrl); - Result result = ImageKit.getInstance().upload(fileCreateRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void uploadFromBase64() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - System.out.println(Color.ANSI_CYAN + ">> Uploading Base64 Image:" + Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - URL url = App.class.getClassLoader().getResource("sample1.jpg"); - File file = new File(url.getPath()); - String base64 = Utils.fileToBase64(file); - FileCreateRequest fileCreateRequest = new FileCreateRequest(base64, "sample_base64_image.jpg"); - Result result = ImageKit.getInstance().upload(fileCreateRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void uploadFromBytes() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - System.out.println(Color.ANSI_CYAN + ">> Uploading Image from file:" + Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - URL url = App.class.getClassLoader().getResource("sample1.jpg"); - File file = new File(url.getPath()); - byte[] bytes = Utils.fileToBytes(file); - FileCreateRequest fileCreateRequest = new FileCreateRequest(bytes, "sample_image_To.jpg"); - fileCreateRequest.setUseUniqueFileName(false); - JsonObject optionsInnerObject = new JsonObject(); - optionsInnerObject.addProperty("add_shadow", true); - optionsInnerObject.addProperty("bg_colour", "green"); - JsonObject innerObject1 = new JsonObject(); - innerObject1.addProperty("name", "remove-bg"); - innerObject1.add("options", optionsInnerObject); - JsonObject innerObject2 = new JsonObject(); - innerObject2.addProperty("name", "google-auto-tagging"); - innerObject2.addProperty("minConfidence", 5); - innerObject2.addProperty("maxTags", 95); - JsonArray jsonArray = new JsonArray(); - jsonArray.add(innerObject1); - jsonArray.add(innerObject2); - fileCreateRequest.setExtensions(jsonArray); - fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); - fileCreateRequest.setOverwriteFile(true); - fileCreateRequest.setOverwriteAITags(true); - fileCreateRequest.setOverwriteTags(true); - fileCreateRequest.setOverwriteCustomMetadata(true); - JsonObject jsonObjectCustomMetadata = new JsonObject(); - jsonObjectCustomMetadata.addProperty("test10", 10); - fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); - Result result = ImageKit.getInstance().upload(fileCreateRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void addTags() - throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - List fileIds = new ArrayList<>(); - fileIds.add("62a9b446663ef7b5c15951ba"); - List tags = new ArrayList<>(); - tags.add("tag-to-add-4"); - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - tagsRequest.setFileIds(fileIds); - tagsRequest.setTags(tags); - ResultTags resultTags = ImageKit.getInstance().addTags(tagsRequest); - System.out.println(">> Add Tags done."); - System.out.println(Color.ANSI_GREEN + ">> Response add tags:" + Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultTags.getResponseMetaData().getMap()); - System.out.println(resultTags); - System.out.println("\n\n"); - } - - private static void removeTags() - throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag-to-add-4"); - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - ResultTags resultTags = ImageKit.getInstance().removeTags(tagsRequest); - System.out.println(">> remove Tags done."); - System.out.println(Color.ANSI_GREEN + ">> Response remove tags:" + Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultTags.getResponseMetaData().getMap()); - System.out.println(resultTags); - System.out.println("\n\n"); - } - - private static void removeAITags() - throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - List fileIds = new ArrayList<>(); - fileIds.add("62a9b446663ef7b5c15951ba"); - List aiTags = new ArrayList<>(); - aiTags.add("Shoe"); - AITagsRequest aiTagsRequest = new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - ResultTags resultTags = ImageKit.getInstance().removeAITags(aiTagsRequest); - System.out.println(">> remove Tags done."); - System.out.println(Color.ANSI_GREEN + ">> Response remove aiTags:" + Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultTags.getResponseMetaData().getMap()); - System.out.println(resultTags); - System.out.println("\n\n"); - } - - private static void getCustomMetaDataFields() throws UnknownException { - ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = ImageKit.getInstance() - .getCustomMetaDataFields(false); - System.out.println(">> Fetch CustomMetaDataFields done."); - System.out.println(Color.ANSI_GREEN + ">> Fetch CustomMetaDataFields Response:" + Color.ANSI_RESET); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList()); - System.out.println(resultCustomMetaDataFieldList); - System.out.println("\n\n"); - } - - private static void createCustomMetaDataFields() - throws BadRequestException, UnknownException { - CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - customMetaDataFieldSchemaObject.setValueRequired(false); - customMetaDataFieldSchemaObject.setMinValue(10); - customMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("NameHe1"); - customMetaDataFieldCreateRequest.setLabel("LabelHe1"); - customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); - - ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() - .createCustomMetaDataFields(customMetaDataFieldCreateRequest); - System.out.println(">> Create CustomMetaDataFields done."); - System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteCustomMetaDataField(String id) - throws NotFoundException, UnknownException { - ResultNoContent resultNoContent = ImageKit.getInstance().deleteCustomMetaDataField(id); - System.out.println(">> CustomMetaDataField deleted..."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void updateCustomMetaDataFields() - throws BadRequestException, NotFoundException, UnknownException { - CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); - schemaObject.setMinValue(1); - schemaObject.setMaxValue(200); - schemaObject.setMinLength(1); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("62aab5a9db4851797a8f8ff9"); - customMetaDataFieldUpdateRequest.setLabel("LabelHE100"); - customMetaDataFieldUpdateRequest.setSchema(schemaObject); - - ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() - .updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - System.out.println(">> Edit CustomMetaDataFields done."); - System.out.println(Color.ANSI_GREEN + ">> Response edit CustomMetaDataFields :" + Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteFileVersion() - throws BadRequestException, NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("62a9b446663ef7b5c15951ba"); - deleteFileVersionRequest.setVersionId("62aac9b47db937233eee762f"); - ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); - System.out.println(">> delete file version done."); - System.out.println(Color.ANSI_GREEN + ">> Response delete File version :" + Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void copyFile() - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/new_car11.jpg"); - copyFileRequest.setDestinationPath("/demo1/"); - copyFileRequest.setIncludeVersions(true); - ResultNoContent resultNoContent = ImageKit.getInstance().copyFile(copyFileRequest); - System.out.println(">> Copy file done."); - System.out.println(Color.ANSI_GREEN + ">> Response Copy File :" + Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void moveFile() - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/new_car11.jpg"); - moveFileRequest.setDestinationPath("/demo1"); - ResultNoContent resultNoContent = ImageKit.getInstance().moveFile(moveFileRequest); - System.out.println(">> Move File done."); - System.out.println(Color.ANSI_GREEN + ">> Response Move File :" + Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void renameFile() - throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/new12.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); - ResultRenameFile resultRenameFile = ImageKit.getInstance().renameFile(renameFileRequest); - System.out.println(">> Rename file done."); - System.out.println(Color.ANSI_GREEN + ">> Response Rename File :" + Color.ANSI_RESET); - System.out.println(resultRenameFile); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultRenameFile.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void createFolder() throws UnknownException { - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("test1"); - createFolderRequest.setParentFolderPath("/"); - ResultEmptyBlock resultEmptyBlock = ImageKit.getInstance().createFolder(createFolderRequest); - System.out.println(">> Create folder done."); - System.out.println(Color.ANSI_GREEN + ">> Response Create Folder :" + Color.ANSI_RESET); - System.out.println(resultEmptyBlock); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void deleteFolder() - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - String folderPath = "/test1"; - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath(folderPath); - ResultNoContent resultNoContent = ImageKit.getInstance().deleteFolder(deleteFolderRequest); - System.out.println(">> Delete folder done."); - System.out.println(Color.ANSI_GREEN + ">> Response Delete Folder :" + Color.ANSI_RESET); - System.out.println(resultNoContent); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultNoContent.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void copyFolder() - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/test1"); - copyFolderRequest.setDestinationPath("/demo1"); - ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().copyFolder(copyFolderRequest); - System.out.println(">> Copy folder done."); - System.out.println(Color.ANSI_GREEN + ">> Response Bulk job status :" + Color.ANSI_RESET); - System.out.println(resultOfFolderActions); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void moveFolder() - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/demo1/test1"); - moveFolderRequest.setDestinationPath("/"); - ResultOfFolderActions resultOfFolderActions = ImageKit.getInstance().moveFolder(moveFolderRequest); - System.out.println(">>Move folder done."); - System.out.println(Color.ANSI_GREEN + ">> Response Bulk job status :" + Color.ANSI_RESET); - System.out.println(resultOfFolderActions); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getBulkJobStatus() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - String jobId = "62a9b9d5663ef7fd985c6fcb"; - ResultBulkJobStatus resultBulkJobStatus = ImageKit.getInstance().getBulkJobStatus(jobId); - System.out.println(">> Fetch Bulk job status done."); - System.out.println(Color.ANSI_GREEN + ">> Response Bulk job status :" + Color.ANSI_RESET); - System.out.println(resultBulkJobStatus); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - private static void getFileVersions() - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - String fileId = "629f3de17eb0fe4053615450"; - ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); - System.out.println(">> Fetch Get file versions done."); - System.out.println(Color.ANSI_GREEN + ">> Response Get file versions :" + Color.ANSI_RESET); - System.out.println(resultFileVersions); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultFileVersions.getResponseMetaData().getList()); - System.out.println("\n\n"); - } - - private static void getFileVersionDetails() - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - String fileId = "62a9b446663ef7b5c15951ba"; - String versionId = "62a9b446663ef7b5c15951ba"; - ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, - versionId); - System.out.println(">> Fetch Get file versions details done."); - System.out.println(Color.ANSI_GREEN + ">> Response Get file versions details :" + Color.ANSI_RESET); - System.out.println(resultFileVersionDetails); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } -} diff --git a/src/main/java/io/imagekit/sampleapp/Color.java b/src/main/java/io/imagekit/sampleapp/Color.java deleted file mode 100644 index b19d555..0000000 --- a/src/main/java/io/imagekit/sampleapp/Color.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.imagekit.sampleapp; - -public class Color { - public static final String ANSI_RESET = "\u001B[0m"; - public static final String ANSI_BLACK = "\u001B[30m"; - public static final String ANSI_RED = "\u001B[31m"; - public static final String ANSI_GREEN = "\u001B[32m"; - public static final String ANSI_YELLOW = "\u001B[33m"; - public static final String ANSI_BLUE = "\u001B[34m"; - public static final String ANSI_PURPLE = "\u001B[35m"; - public static final String ANSI_CYAN = "\u001B[36m"; - public static final String ANSI_WHITE = "\u001B[37m"; - public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m"; - public static final String ANSI_RED_BACKGROUND = "\u001B[41m"; - public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m"; - public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m"; - public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m"; - public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m"; - public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m"; - public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"; -} diff --git a/src/main/resources/config.sample.properties b/src/main/resources/config.sample.properties deleted file mode 100644 index eb626e3..0000000 --- a/src/main/resources/config.sample.properties +++ /dev/null @@ -1,6 +0,0 @@ -# Copy this sample file add rename it to "config.properties" -# Put essential values of keys [UrlEndpoint, PrivateKey, PublicKey] - -UrlEndpoint=<-YOUR-ENDPOINT-URL-HERE-> -PrivateKey=<-YOUR-PRIVATE-KEY-HERE-> -PublicKey=<-YOUR-PUBLIC-KEY-HERE-> \ No newline at end of file diff --git a/src/main/resources/sample1.jpg b/src/main/resources/sample1.jpg deleted file mode 100644 index 3a52a95dfd4f26a12b8f23ee91ff2fa7425f6859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51085 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 From a079589ad13238f9a0cc195c524ac1a9d6f1b6c3 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 22 Jun 2022 12:58:49 +0530 Subject: [PATCH 074/112] revoved extra line --- imagekit-sdk/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 1d35955..c745a17 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -10,7 +10,6 @@ sourceCompatibility = 1.8 repositories { mavenCentral() - google() } dependencies { From 726f26852da764cfde22ea28a74651b69e900e41 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 22 Jun 2022 14:20:42 +0530 Subject: [PATCH 075/112] added formatting fix and few version regarding changes --- README.md | 4 +- imagekit-sdk/build.gradle | 2 +- .../main/java/io/imagekit/sdk/ImageKit.java | 76 +- .../io/imagekit/sdk/config/Configuration.java | 115 +- .../io/imagekit/sdk/constants/Version.java | 2 +- .../sdk/exceptions/ForbiddenException.java | 9 +- .../exceptions/InternalServerException.java | 33 +- .../exceptions/TooManyRequestsException.java | 11 +- .../sdk/exceptions/UnauthorizedException.java | 9 +- .../sdk/exceptions/UnknownException.java | 39 +- .../imagekit/sdk/models/results/Result.java | 35 +- .../sdk/models/results/ResultCache.java | 8 +- .../sdk/models/results/ResultCacheStatus.java | 8 +- .../sdk/models/results/ResultException.java | 7 +- .../sdk/models/results/ResultFileDelete.java | 10 +- .../sdk/models/results/ResultList.java | 8 +- .../sdk/models/results/ResultMetaData.java | 8 +- .../imagekit/sdk/tasks/MultipartBuilder.java | 1 + .../io/imagekit/sdk/tasks/RestClient.java | 1685 +++++++++-------- .../java/io/imagekit/sdk/utils/Utils.java | 21 +- .../java/io/imagekit/sdk/ImageKitTest.java | 482 +++-- .../io/imagekit/sdk/models/BaseFileTest.java | 61 - .../sdk/models/FileCreateRequestTest.java | 95 - .../sdk/models/FileUpdateRequestTest.java | 55 - 24 files changed, 1281 insertions(+), 1503 deletions(-) delete mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java delete mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileCreateRequestTest.java delete mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileUpdateRequestTest.java diff --git a/README.md b/README.md index 45a6a9f..82d6f59 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ allprojects { Step 2. Add the dependency on project's `build.gradle`: ``` dependencies { - implementation 'com.github.imagekit-developer:imagekit-java:1.0.3' + implementation 'com.github.imagekit-developer:imagekit-java:2.0.0' } ``` ### Maven users @@ -62,7 +62,7 @@ Step 2. Add the dependency in POM file: com.github.imagekit-developer imagekit-java - 1.0.3 + 2.0.0 ``` diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index c745a17..60b2a06 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'io.imagekit.sdk' -version '1.0.3' +version '2.0.0' sourceCompatibility = 1.8 diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index b1e4d1a..e900659 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -87,7 +87,8 @@ public String getUrl(Map options) { * @param fileCreateRequest is a object which contains file and other parameters * @return object of Result class */ - public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.upload(fileCreateRequest); } @@ -96,7 +97,9 @@ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerE * @param fileUpdateRequest is a object which contains parameters and fileId * @return object of Result class */ - public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException { return restClient.updateDetail(fileUpdateRequest); } @@ -106,7 +109,8 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws Forbi * "includeFolder", "name", "limit", "skip"] * @return ResultList class that contains list of BaseFile */ - public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getFileList(options); } @@ -115,7 +119,8 @@ public ResultList getFileList(Map options) throws ForbiddenExcep * @param fileId is a unique file id * @return Result class */ - public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getFileDetail(fileId); } @@ -124,7 +129,8 @@ public Result getFileDetail(String fileId) throws ForbiddenException, TooManyReq * @param fileId is a unique file id * @return ResultMetaData class */ - public ResultMetaData getFileMetadata(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public ResultMetaData getFileMetadata(String fileId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getFileMetaData(fileId); } @@ -133,7 +139,8 @@ public ResultMetaData getFileMetadata(String fileId) throws ForbiddenException, * @param url is a remote image url * @return ResultMetaData class */ - public ResultMetaData getRemoteFileMetadata(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public ResultMetaData getRemoteFileMetadata(String url) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getRemoteFileMetaData(url); } @@ -142,7 +149,8 @@ public ResultMetaData getRemoteFileMetadata(String url) throws ForbiddenExceptio * @param fileId is a unique file id * @return Result class */ - public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.deleteFile(fileId); } @@ -151,7 +159,9 @@ public Result deleteFile(String fileId) throws ForbiddenException, TooManyReques * @param fileIds is a list of unique file id * @return Result class */ - public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + public ResultFileDelete bulkDeleteFiles(List fileIds) + throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, + UnauthorizedException, NotFoundException, BadRequestException, UnknownException { return restClient.bulkDeleteFiles(fileIds); } @@ -160,7 +170,8 @@ public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenEx * @param url is image url * @return ResultCache class */ - public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.purgeCache(url); } @@ -169,7 +180,8 @@ public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequ * @param requestId is cache request id * @return ResultCacheStatus class */ - public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getPurgeCacheStatus(requestId); } @@ -218,7 +230,8 @@ public int pHashDistance(String firstHex, String secondHex) { * @return ArrayList of String */ public ResultTags addTags(TagsRequest tagsRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.manageTags(tagsRequest, "addTags"); } @@ -229,7 +242,8 @@ public ResultTags addTags(TagsRequest tagsRequest) * @return ArrayList of String */ public ResultTags removeAITags(AITagsRequest aiTagsRequest) - throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.removeAITags(aiTagsRequest); } @@ -240,7 +254,8 @@ public ResultTags removeAITags(AITagsRequest aiTagsRequest) * @return ArrayList of String */ public ResultTags removeTags(TagsRequest tagsRequest) - throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.manageTags(tagsRequest, "removeTags"); } @@ -261,7 +276,8 @@ public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDele * @return ResultCustomMetaData with ResultCustomMetaDataField */ public ResultCustomMetaDataField createCustomMetaDataFields( - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) throws BadRequestException, UnknownException { + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) + throws BadRequestException, UnknownException { return restClient.createCustomMetaDataFields(customMetaDataFieldCreateRequest); } @@ -293,7 +309,8 @@ public ResultCustomMetaDataField updateCustomMetaDataFields( * @return Result class */ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) - throws BadRequestException, NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws BadRequestException, NotFoundException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.deleteFileVersion(deleteFileVersionRequest); } @@ -303,7 +320,8 @@ public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVers * @return Result class */ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.copyFile(copyFileRequest); } @@ -313,7 +331,8 @@ public ResultNoContent copyFile(CopyFileRequest copyFileRequest) * @return Result class */ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.moveFile(moveFileRequest); } @@ -322,8 +341,9 @@ public ResultNoContent moveFile(MoveFileRequest moveFileRequest) * @param renameFileRequest class * @return Result class */ - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) - throws ConflictException, PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.renameFile(renameFileRequest); } @@ -344,7 +364,8 @@ public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) th * @return Result class */ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.deleteFolder(deleteFolderRequest); } @@ -355,7 +376,8 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) * @return Result class */ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.copyFolder(copyFolderRequest); } @@ -365,7 +387,8 @@ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) * @return Result class */ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.moveFolder(moveFolderRequest); } @@ -374,7 +397,8 @@ public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) * @param jobId * @return a Result class */ - public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { return restClient.getBulkJobStatus(jobId); } @@ -384,7 +408,8 @@ public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenExcept * @return a Result class */ public ResultFileVersions getFileVersions(String fileId) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.getFileVersions(fileId); } @@ -394,7 +419,8 @@ public ResultFileVersions getFileVersions(String fileId) * @return a Result class */ public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { return restClient.getFileVersionDetails(fileId, versionId); } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java index 54350e7..4ff6c7c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/config/Configuration.java @@ -4,63 +4,60 @@ * Configuration class contains sdk configuration */ public class Configuration { - private String publicKey; - private String privateKey; - private String urlEndpoint; - - public Configuration() { - - } - - public Configuration(String publicKey, String privateKey, String urlEndpoint) { - this.publicKey = publicKey; - this.privateKey = privateKey; - this.urlEndpoint = urlEndpoint; - } - - public String getPublicKey() { - return publicKey; - } - - public void setPublicKey(String publicKey) { - this.publicKey = publicKey; - } - - public String getPrivateKey() { - return privateKey; - } - - public void setPrivateKey(String privateKey) { - this.privateKey = privateKey; - } - - public String getUrlEndpoint() { - return urlEndpoint; - } - - public void setUrlEndpoint(String urlEndpoint) { - this.urlEndpoint = urlEndpoint; - } - - @Override - public String toString() { - return "Configuration{" + - "publicKey='" + publicKey + '\'' + - ", privateKey='" + privateKey + '\'' + - ", urlEndpoint='" + urlEndpoint + '\'' + - '}'; - } - - public boolean validate(){ - if (urlEndpoint==null){ - throw new RuntimeException("UrlEndpoint not found in config.properties"); - } - if (privateKey==null){ - throw new RuntimeException("PrivateKey not found in config.properties"); - } - if (publicKey==null){ - throw new RuntimeException("PublicKey not found in config.properties"); - } - return true; - } + private String publicKey; + private String privateKey; + private String urlEndpoint; + + public Configuration() { + + } + + public Configuration(String publicKey, String privateKey, String urlEndpoint) { + this.publicKey = publicKey; + this.privateKey = privateKey; + this.urlEndpoint = urlEndpoint; + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getPrivateKey() { + return privateKey; + } + + public void setPrivateKey(String privateKey) { + this.privateKey = privateKey; + } + + public String getUrlEndpoint() { + return urlEndpoint; + } + + public void setUrlEndpoint(String urlEndpoint) { + this.urlEndpoint = urlEndpoint; + } + + @Override + public String toString() { + return "Configuration{" + "publicKey='" + publicKey + '\'' + ", privateKey='" + privateKey + '\'' + + ", urlEndpoint='" + urlEndpoint + '\'' + '}'; + } + + public boolean validate() { + if (urlEndpoint == null) { + throw new RuntimeException("UrlEndpoint not found in config.properties"); + } + if (privateKey == null) { + throw new RuntimeException("PrivateKey not found in config.properties"); + } + if (publicKey == null) { + throw new RuntimeException("PublicKey not found in config.properties"); + } + return true; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Version.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Version.java index d18b319..d323d37 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Version.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Version.java @@ -1,5 +1,5 @@ package io.imagekit.sdk.constants; public class Version { - public static final String VERSION_CODE="java-1.0.3"; + public static final String VERSION_CODE="java-2.0.0"; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java index f1e30b1..c6931c8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java @@ -9,7 +9,7 @@ public class ForbiddenException extends Exception { private ResponseMetaData responseMetaData; public ForbiddenException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, - String message1, String help, ResponseMetaData responseMetaData) { + String message1, String help, ResponseMetaData responseMetaData) { super(message, cause, enableSuppression, writableStackTrace); this.message = message1; this.help = help; @@ -18,10 +18,7 @@ public ForbiddenException(String message, Throwable cause, boolean enableSuppres @Override public String toString() { - return "ForbiddenException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; + return "ForbiddenException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" + + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java index 09277f4..786dd37 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java @@ -4,24 +4,21 @@ public class InternalServerException extends Exception { - private String message; - private String help; - private ResponseMetaData responseMetaData; + private String message; + private String help; + private ResponseMetaData responseMetaData; - public InternalServerException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, - String message1, String help, ResponseMetaData responseMetaData) { - super(message, cause, enableSuppression, writableStackTrace); - this.message = message1; - this.help = help; - this.responseMetaData = responseMetaData; - } + public InternalServerException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "InternalServerException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "InternalServerException{" + "message='" + message + '\'' + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java index b252b8f..05d616f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java @@ -8,8 +8,8 @@ public class TooManyRequestsException extends Exception { private String help; private ResponseMetaData responseMetaData; - public TooManyRequestsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, - String message1, String help, ResponseMetaData responseMetaData) { + public TooManyRequestsException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace, String message1, String help, ResponseMetaData responseMetaData) { super(message, cause, enableSuppression, writableStackTrace); this.message = message1; this.help = help; @@ -18,10 +18,7 @@ public TooManyRequestsException(String message, Throwable cause, boolean enableS @Override public String toString() { - return "TooManyRequestsException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; + return "TooManyRequestsException{" + "message='" + message + '\'' + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java index 5c7a785..593c6e4 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java @@ -9,7 +9,7 @@ public class UnauthorizedException extends Exception { private ResponseMetaData responseMetaData; public UnauthorizedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, - String message1, String help, ResponseMetaData responseMetaData) { + String message1, String help, ResponseMetaData responseMetaData) { super(message, cause, enableSuppression, writableStackTrace); this.message = message1; this.help = help; @@ -18,10 +18,7 @@ public UnauthorizedException(String message, Throwable cause, boolean enableSupp @Override public String toString() { - return "UnauthorizedException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; + return "UnauthorizedException{" + "message='" + message + '\'' + ", help='" + help + '\'' + + ", responseMetaData=" + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java index ce9750e..5774cc0 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java @@ -4,28 +4,25 @@ public class UnknownException extends Exception { - private String message; - private String help; - private ResponseMetaData responseMetaData; + private String message; + private String help; + private ResponseMetaData responseMetaData; - public UnknownException(String message, Throwable cause) { - super(message, cause); - } + public UnknownException(String message, Throwable cause) { + super(message, cause); + } - public UnknownException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, - String message1, String help, ResponseMetaData responseMetaData) { - super(message, cause, enableSuppression, writableStackTrace); - this.message = message1; - this.help = help; - this.responseMetaData = responseMetaData; - } + public UnknownException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, + String message1, String help, ResponseMetaData responseMetaData) { + super(message, cause, enableSuppression, writableStackTrace); + this.message = message1; + this.help = help; + this.responseMetaData = responseMetaData; + } - @Override - public String toString() { - return "UnknownException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; - } + @Override + public String toString() { + return "UnknownException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" + + responseMetaData + '}'; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java index eaff384..4c51941 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/Result.java @@ -181,32 +181,13 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "Result{" + - "fileId='" + fileId + '\'' + - ", name='" + name + '\'' + - ", url='" + url + '\'' + - ", thumbnail='" + thumbnail + '\'' + - ", height=" + height + - ", width=" + width + - ", size=" + size + - ", filePath='" + filePath + '\'' + - ", tags=" + tags + - ", isPrivateFile=" + isPrivateFile + - ", customCoordinates='" + customCoordinates + '\'' + - ", fileType='" + fileType + '\'' + - ", aiTags=" + aiTags + - ", versionInfo=" + versionInfo + - ", customMetadata=" + customMetadata + - ", embeddedMetadata=" + embeddedMetadata + - ", extensionStatus=" + extensionStatus + - ", type='" + type + '\'' + - ", mime='" + mime + '\'' + - ", hasAlpha=" + hasAlpha + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + - ", help='" + help + '\'' + - ", raw='" + raw + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; + return "Result{" + "fileId='" + fileId + '\'' + ", name='" + name + '\'' + ", url='" + url + '\'' + + ", thumbnail='" + thumbnail + '\'' + ", height=" + height + ", width=" + width + ", size=" + size + + ", filePath='" + filePath + '\'' + ", tags=" + tags + ", isPrivateFile=" + isPrivateFile + + ", customCoordinates='" + customCoordinates + '\'' + ", fileType='" + fileType + '\'' + ", aiTags=" + + aiTags + ", versionInfo=" + versionInfo + ", customMetadata=" + customMetadata + ", embeddedMetadata=" + + embeddedMetadata + ", extensionStatus=" + extensionStatus + ", type='" + type + '\'' + ", mime='" + + mime + '\'' + ", hasAlpha=" + hasAlpha + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt + + ", help='" + help + '\'' + ", raw='" + raw + '\'' + ", responseMetaData=" + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java index d427234..742ec19 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCache.java @@ -61,11 +61,7 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultCache{" + - "help='" + help + '\'' + - ", requestId='" + requestId + '\'' + - ", raw='" + raw + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; + return "ResultCache{" + "help='" + help + '\'' + ", requestId='" + requestId + '\'' + ", raw='" + raw + '\'' + + ", responseMetaData=" + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java index 0f6d71a..a61cba3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultCacheStatus.java @@ -61,11 +61,7 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultCacheStatus{" + - "help='" + help + '\'' + - ", status='" + status + '\'' + - ", raw='" + raw + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; + return "ResultCacheStatus{" + "help='" + help + '\'' + ", status='" + status + '\'' + ", raw='" + raw + '\'' + + ", responseMetaData=" + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java index 7ef31f7..0e66630 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultException.java @@ -36,10 +36,7 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultException{" + - "message='" + message + '\'' + - ", help='" + help + '\'' + - ", responseMetaData=" + responseMetaData + - '}'; + return "ResultException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" + + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java index 121bf39..cb50ff4 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultFileDelete.java @@ -74,12 +74,8 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultFileDelete{" + - "help='" + help + '\'' + - ", raw='" + raw + '\'' + - ", successfullyDeletedFileIds=" + successfullyDeletedFileIds + - ", missingFileIds=" + missingFileIds + - ", responseMetaData=" + responseMetaData + - '}'; + return "ResultFileDelete{" + "help='" + help + '\'' + ", raw='" + raw + '\'' + ", successfullyDeletedFileIds=" + + successfullyDeletedFileIds + ", missingFileIds=" + missingFileIds + ", responseMetaData=" + + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java index 9c3a280..7c51f5b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultList.java @@ -67,11 +67,7 @@ public void setResults(List results) { @Override public String toString() { - return "ResultList{" + - "help='" + help + '\'' + - ", raw='" + raw + '\'' + - ", results=" + results + - ", responseMetaData=" + responseMetaData + - '}'; + return "ResultList{" + "help='" + help + '\'' + ", raw='" + raw + '\'' + ", results=" + results + + ", responseMetaData=" + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java index 29f0a6f..be2e6ed 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/results/ResultMetaData.java @@ -62,11 +62,7 @@ public void setResponseMetaData(ResponseMetaData responseMetaData) { @Override public String toString() { - return "ResultMetaData{" + - "help='" + help + '\'' + - ", raw='" + raw + '\'' + - ", results=" + results + - ", responseMetaData=" + responseMetaData + - '}'; + return "ResultMetaData{" + "help='" + help + '\'' + ", raw='" + raw + '\'' + ", results=" + results + + ", responseMetaData=" + responseMetaData + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index 7627828..f5de2d1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -16,6 +16,7 @@ public class MultipartBuilder { private static final String RANDOM_BOUNDARY = "randomBoundary-------------------"; + public MultipartBody build(FileCreateRequest fileCreateRequest) { MultipartBody.Builder builder = new MultipartBody.Builder(RANDOM_BOUNDARY).setType(MultipartBody.FORM); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 2706ac6..eead8e9 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -42,835 +42,858 @@ public class RestClient { - public static String API_BASE_URL = "https://api.imagekit.io/"; - public static String UPLOAD_BASE_URL = "https://upload.imagekit.io/"; - - private ImageKit imageKit; - Request request; - OkHttpClient client; - MultipartBuilder multipartBuilder; - - public RestClient(ImageKit imageKit) { - this.imageKit = imageKit; - this.client = new OkHttpClient(); - this.multipartBuilder = new MultipartBuilder(); - } - - public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - Result result = null; - Map headers = Utils.getHeaders(imageKit); - - MultipartBody body = multipartBuilder.build(fileCreateRequest); - - request = new Request.Builder().url(UPLOAD_BASE_URL.concat("api/v1/files/upload")).post(body) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - Result result = null; - Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), - fileUpdateRequest.getFileId()); - request = new Request.Builder().url(url).patch(multipartBuilder.build(fileUpdateRequest)) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - ResultList resultList = new ResultList(); - Map headers = Utils.getHeaders(imageKit); - - QueryMaker queryMaker = new QueryMaker(); - - for (Map.Entry entry : options.entrySet()) { - queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); - } - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files?%s"), queryMaker.get()); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - List files = new Gson().fromJson(respBody, new TypeToken>() { - }.getType()); - resultList.setResults(files); - resultList.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultList; - } - - public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - Result result = new Result(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), fileId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, Result.class); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - ResultMetaData result = new ResultMetaData(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/metadata", fileId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - MetaData metaData = new Gson().fromJson(respBody, MetaData.class); - result.setResults(metaData); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - ResultMetaData result = new ResultMetaData(); - Map headers = Utils.getHeaders(imageKit); - - String apiURL = API_BASE_URL.concat("v1/metadata?url=") + url; - - request = new Request.Builder().url(apiURL).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - MetaData metaData = new Gson().fromJson(respBody, MetaData.class); - result.setResults(metaData); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - Result result = new Result(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s"), fileId); - - request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - respBody = response.body().string(); - result.setFileId(fileId); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public ResultFileDelete bulkDeleteFiles(List fileIds) throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException { - ResultFileDelete result = new ResultFileDelete(); - Map headers = Utils.getHeaders(imageKit); - - String url = API_BASE_URL.concat("v1/files/batch/deleteByFileIds"); - - request = new Request.Builder().url(url) - .post(multipartBuilder.build(String.format("{\"fileIds\":%s}", new Gson().toJson(fileIds)))) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, ResultFileDelete.class); - result.setRaw(respBody); - } else if (response.code() == 207 || response.code() == 404) { - Utils.throwOtherException(response); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - ResultCache result = new ResultCache(); - Map headers = Utils.getHeaders(imageKit); - - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/purge")) - .post(multipartBuilder.build(String.format("{\"url\":\"%s\"}", url))).headers(Headers.of(headers)) - .build(); - - try { - Response response = client.newCall(request).execute(); - System.out.println("res:==> " + response.request().body()); - String respBody = ""; - if (response.code() == 200 || response.code() == 201) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, ResultCache.class); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - ResultCacheStatus result = new ResultCacheStatus(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/purge/%s"), requestId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - result = new Gson().fromJson(respBody, ResultCacheStatus.class); - result.setRaw(respBody); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return result; - } - - public ResultTags manageTags(TagsRequest tagsRequest, String action) - throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultTags resultTags = new ResultTags(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(tagsRequest)); - request = new Request.Builder() - .url(action.equals("removeTags") ? API_BASE_URL.concat("v1/files/removeTags") - : API_BASE_URL.concat("v1/files/addTags")) - .post(requestBody).headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else if (response.code() == 207 || response.code() == 404) { - Utils.throwOtherException(response); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultTags; - } - - public ResultTags removeAITags(AITagsRequest aiTagsRequest) - throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultTags resultTags = new ResultTags(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(aiTagsRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/removeAITags")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultTags = new Gson().fromJson(respBody, ResultTags.class); - } else if (response.code() == 207 || response.code() == 404) { - Utils.throwOtherException(response); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultTags; - } - - public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws UnknownException { - ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); - - Map headers = Utils.getHeaders(imageKit); - - request = new Request.Builder() - .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)).get() - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - List resultCustomMetaDataFields = new Gson().fromJson(respBody, - new TypeToken>() { - }.getType()); - resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), - response.code(), response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultCustomMetaDataFieldList; - } - - public ResultCustomMetaDataField createCustomMetaDataFields( - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) - throws BadRequestException, UnknownException { - if (customMetaDataFieldCreateRequest.getName() == null) { - throw new RuntimeException("Error: Name not provided."); - } - if (customMetaDataFieldCreateRequest.getLabel() == null) { - throw new RuntimeException("Error: Label not provided."); - } - ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(customMetaDataFieldCreateRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/customMetadataFields")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 201) { - respBody = response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); - } else { - if (response.code() == 400) { - ResultException result = Utils.populateResult(response); - throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultCustomMetaDataField; - } - - public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, UnknownException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), id); - - request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else { - if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultNoContent; - } - - public ResultCustomMetaDataField updateCustomMetaDataFields( - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) - throws BadRequestException, NotFoundException, UnknownException { - ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); - - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(customMetaDataFieldUpdateRequest)); - String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), - customMetaDataFieldUpdateRequest.getId()); - request = new Request.Builder().url(url).patch(requestBody).headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - JsonElement responseBody = new JsonParser().parse(respBody); - resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); - } else { - if (response.code() == 400 || response.code() == 404) { - ResultException result = Utils.populateResult(response); - if (response.code() == 400) { - throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } - } - } - Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultCustomMetaDataField; - } - - public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) - throws BadRequestException, NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultNoContent resultNoContent = new ResultNoContent(); - - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), - deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); - request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else if (response.code() == 400 || response.code() == 404) { - ResultException result = Utils.populateResult(response); - if (response.code() == 400) { - throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultNoContent; - } - - public ResultNoContent copyFile(CopyFileRequest copyFileRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(copyFileRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/copy")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultNoContent; - } - - public ResultNoContent moveFile(MoveFileRequest moveFileRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(moveFileRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/move")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultNoContent; - } - - public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) - throws PartialSuccessException, ConflictException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultRenameFile resultRenameFile = new ResultRenameFile(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(renameFileRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/files/rename")).put(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - String respString = response.body().string(); - respBody = respString == null || respString.equals("") ? "{}" : respString; - resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); - } else if (response.code() == 207 || response.code() == 404) { - Utils.throwOtherException(response); - } else if (response.code() == 409) { - ResultException result = Utils.populateResult(response); - throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), - result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultRenameFile; - } - - public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws UnknownException { - ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(createFolderRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 201) { - String respString = response.body().string(); - respBody = respString == null || respString.equals("") ? "{}" : respString; - } - Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultEmptyBlock; - } - - public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultNoContent resultNoContent = new ResultNoContent(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(deleteFolderRequest)); - request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).delete(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 204) { - String respString = response.body().string(); - respBody = respString == null ? "" : respString; - } else if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultNoContent; - } - - public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(copyFolderRequest)); - - request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); - } else if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultOfFolderActions; - } - - public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); - Map headers = Utils.getHeaders(imageKit); - - RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), - new Gson().toJson(moveFolderRequest)); - - request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) - .headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); - } else if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultOfFolderActions; - } - - public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); - - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultBulkJobStatus; - } - - public ResultFileVersions getFileVersions(String fileId) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - ResultFileVersions resultFileVersions = new ResultFileVersions(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions"), fileId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - List resultFileVersionDetailsList = new Gson().fromJson(respBody, - new TypeToken>() { - }.getType()); - resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); - } else if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultFileVersions; - } - - public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) - throws NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - if (fileId == null) { - throw new RuntimeException("Error: FileId not provided."); - } - if (versionId == null) { - throw new RuntimeException("Error: versionId not provided."); - } - ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); - Map headers = Utils.getHeaders(imageKit); - - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); - - request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); - - try { - Response response = client.newCall(request).execute(); - String respBody = ""; - if (response.code() == 200) { - respBody = response.body().string(); - resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); - } else if (response.code() == 404) { - ResultException result = Utils.populateResult(response); - throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else { - Utils.generalApiThrowException(response); - } - Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), - response.headers().toMultimap()); - } catch (IOException e) { - throw new UnknownException(e.getMessage(), e.getCause()); - } - return resultFileVersionDetails; - } + public static String API_BASE_URL = "https://api.imagekit.io/"; + public static String UPLOAD_BASE_URL = "https://upload.imagekit.io/"; + + private ImageKit imageKit; + Request request; + OkHttpClient client; + MultipartBuilder multipartBuilder; + + public RestClient(ImageKit imageKit) { + this.imageKit = imageKit; + this.client = new OkHttpClient(); + this.multipartBuilder = new MultipartBuilder(); + } + + public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerException, BadRequestException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + Result result = null; + Map headers = Utils.getHeaders(imageKit); + + MultipartBody body = multipartBuilder.build(fileCreateRequest); + + request = new Request.Builder().url(UPLOAD_BASE_URL.concat("api/v1/files/upload")).post(body) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + Result result = null; + Map headers = Utils.getHeaders(imageKit); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), + fileUpdateRequest.getFileId()); + request = new Request.Builder().url(url).patch(multipartBuilder.build(fileUpdateRequest)) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + ResultList resultList = new ResultList(); + Map headers = Utils.getHeaders(imageKit); + + QueryMaker queryMaker = new QueryMaker(); + + for (Map.Entry entry : options.entrySet()) { + queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); + } + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files?%s"), queryMaker.get()); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List files = new Gson().fromJson(respBody, new TypeToken>() { + }.getType()); + resultList.setResults(files); + resultList.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultList.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultList; + } + + public Result getFileDetail(String fileId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + Result result = new Result(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, Result.class); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + ResultMetaData result = new ResultMetaData(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/metadata", fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + MetaData metaData = new Gson().fromJson(respBody, MetaData.class); + result.setResults(metaData); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public ResultMetaData getRemoteFileMetaData(String url) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + ResultMetaData result = new ResultMetaData(); + Map headers = Utils.getHeaders(imageKit); + + String apiURL = API_BASE_URL.concat("v1/metadata?url=") + url; + + request = new Request.Builder().url(apiURL).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + MetaData metaData = new Gson().fromJson(respBody, MetaData.class); + result.setResults(metaData); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public Result deleteFile(String fileId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + Result result = new Result(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s"), fileId); + + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + respBody = response.body().string(); + result.setFileId(fileId); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public ResultFileDelete bulkDeleteFiles(List fileIds) + throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, + UnauthorizedException, NotFoundException, BadRequestException, UnknownException { + ResultFileDelete result = new ResultFileDelete(); + Map headers = Utils.getHeaders(imageKit); + + String url = API_BASE_URL.concat("v1/files/batch/deleteByFileIds"); + + request = new Request.Builder().url(url) + .post(multipartBuilder.build(String.format("{\"fileIds\":%s}", new Gson().toJson(fileIds)))) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultFileDelete.class); + result.setRaw(respBody); + } else if (response.code() == 207 || response.code() == 404) { + Utils.throwOtherException(response); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + ResultCache result = new ResultCache(); + Map headers = Utils.getHeaders(imageKit); + + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/purge")) + .post(multipartBuilder.build(String.format("{\"url\":\"%s\"}", url))).headers(Headers.of(headers)) + .build(); + + try { + Response response = client.newCall(request).execute(); + System.out.println("res:==> " + response.request().body()); + String respBody = ""; + if (response.code() == 200 || response.code() == 201) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultCache.class); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + ResultCacheStatus result = new ResultCacheStatus(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/purge/%s"), requestId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + result = new Gson().fromJson(respBody, ResultCacheStatus.class); + result.setRaw(respBody); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, result.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return result; + } + + public ResultTags manageTags(TagsRequest tagsRequest, String action) + throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultTags resultTags = new ResultTags(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(tagsRequest)); + request = new Request.Builder() + .url(action.equals("removeTags") ? API_BASE_URL.concat("v1/files/removeTags") + : API_BASE_URL.concat("v1/files/addTags")) + .post(requestBody).headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else if (response.code() == 207 || response.code() == 404) { + Utils.throwOtherException(response); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultTags; + } + + public ResultTags removeAITags(AITagsRequest aiTagsRequest) + throws PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultTags resultTags = new ResultTags(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(aiTagsRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/removeAITags")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultTags = new Gson().fromJson(respBody, ResultTags.class); + } else if (response.code() == 207 || response.code() == 404) { + Utils.throwOtherException(response); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultTags.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultTags; + } + + public ResultCustomMetaDataFieldList getCustomMetaDataFields(boolean includeDeleted) throws UnknownException { + ResultCustomMetaDataFieldList resultCustomMetaDataFieldList = new ResultCustomMetaDataFieldList(); + + Map headers = Utils.getHeaders(imageKit); + + request = new Request.Builder() + .url(API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=" + includeDeleted)).get() + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List resultCustomMetaDataFields = new Gson().fromJson(respBody, + new TypeToken>() { + }.getType()); + resultCustomMetaDataFieldList.setResultCustomMetaDataFieldList(resultCustomMetaDataFields); + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataFieldList.getResponseMetaData(), + response.code(), response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultCustomMetaDataFieldList; + } + + public ResultCustomMetaDataField createCustomMetaDataFields( + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest) + throws BadRequestException, UnknownException { + if (customMetaDataFieldCreateRequest.getName() == null) { + throw new RuntimeException("Error: Name not provided."); + } + if (customMetaDataFieldCreateRequest.getLabel() == null) { + throw new RuntimeException("Error: Label not provided."); + } + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(customMetaDataFieldCreateRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/customMetadataFields")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 201) { + respBody = response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + if (response.code() == 400) { + ResultException result = Utils.populateResult(response); + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultCustomMetaDataField; + } + + public ResultNoContent deleteCustomMetaDataField(String id) throws NotFoundException, UnknownException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), id); + + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else { + if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultNoContent; + } + + public ResultCustomMetaDataField updateCustomMetaDataFields( + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest) + throws BadRequestException, NotFoundException, UnknownException { + ResultCustomMetaDataField resultCustomMetaDataField = new ResultCustomMetaDataField(); + + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(customMetaDataFieldUpdateRequest)); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/customMetadataFields/%s"), + customMetaDataFieldUpdateRequest.getId()); + request = new Request.Builder().url(url).patch(requestBody).headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + JsonElement responseBody = new JsonParser().parse(respBody); + resultCustomMetaDataField = new Gson().fromJson(responseBody, ResultCustomMetaDataField.class); + } else { + if (response.code() == 400 || response.code() == 404) { + ResultException result = Utils.populateResult(response); + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } + } + } + Utils.populateResponseMetadata(respBody, resultCustomMetaDataField.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultCustomMetaDataField; + } + + public ResultNoContent deleteFileVersion(DeleteFileVersionRequest deleteFileVersionRequest) + throws BadRequestException, NotFoundException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), + deleteFileVersionRequest.getFileId(), deleteFileVersionRequest.getVersionId()); + request = new Request.Builder().url(url).delete().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else if (response.code() == 400 || response.code() == 404) { + ResultException result = Utils.populateResult(response); + if (response.code() == 400) { + throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultNoContent; + } + + public ResultNoContent copyFile(CopyFileRequest copyFileRequest) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(copyFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/copy")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultNoContent; + } + + public ResultNoContent moveFile(MoveFileRequest moveFileRequest) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(moveFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/move")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultNoContent; + } + + public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws PartialSuccessException, + ConflictException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultRenameFile resultRenameFile = new ResultRenameFile(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(renameFileRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/files/rename")).put(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString; + resultRenameFile = new Gson().fromJson(respBody, ResultRenameFile.class); + } else if (response.code() == 207 || response.code() == 404) { + Utils.throwOtherException(response); + } else if (response.code() == 409) { + ResultException result = Utils.populateResult(response); + throw new ConflictException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultRenameFile.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultRenameFile; + } + + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws UnknownException { + ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(createFolderRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 201) { + String respString = response.body().string(); + respBody = respString == null || respString.equals("") ? "{}" : respString; + } + Utils.populateResponseMetadata(respBody, resultEmptyBlock.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultEmptyBlock; + } + + public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultNoContent resultNoContent = new ResultNoContent(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(deleteFolderRequest)); + request = new Request.Builder().url(API_BASE_URL.concat("v1/folder/")).delete(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 204) { + String respString = response.body().string(); + respBody = respString == null ? "" : respString; + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultNoContent.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultNoContent; + } + + public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(copyFolderRequest)); + + request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultOfFolderActions; + } + + public ResultOfFolderActions moveFolder(MoveFolderRequest moveFolderRequest) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultOfFolderActions resultOfFolderActions = new ResultOfFolderActions(); + Map headers = Utils.getHeaders(imageKit); + + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), + new Gson().toJson(moveFolderRequest)); + + request = new Request.Builder().url(API_BASE_URL.concat("v1/bulkJobs/moveFolder")).post(requestBody) + .headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultOfFolderActions = new Gson().fromJson(respBody, ResultOfFolderActions.class); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultOfFolderActions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultOfFolderActions; + } + + public ResultBulkJobStatus getBulkJobStatus(String jobId) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + ResultBulkJobStatus resultBulkJobStatus = new ResultBulkJobStatus(); + + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/bulkJobs/%s"), jobId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultBulkJobStatus = new Gson().fromJson(respBody, ResultBulkJobStatus.class); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultBulkJobStatus.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultBulkJobStatus; + } + + public ResultFileVersions getFileVersions(String fileId) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + ResultFileVersions resultFileVersions = new ResultFileVersions(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions"), fileId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + List resultFileVersionDetailsList = new Gson().fromJson(respBody, + new TypeToken>() { + }.getType()); + resultFileVersions.setResultFileVersionDetailsList(resultFileVersionDetailsList); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultFileVersions.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultFileVersions; + } + + public ResultFileVersionDetails getFileVersionDetails(String fileId, String versionId) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + if (fileId == null) { + throw new RuntimeException("Error: FileId not provided."); + } + if (versionId == null) { + throw new RuntimeException("Error: versionId not provided."); + } + ResultFileVersionDetails resultFileVersionDetails = new ResultFileVersionDetails(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s"), fileId, versionId); + + request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + respBody = response.body().string(); + resultFileVersionDetails = new Gson().fromJson(respBody, ResultFileVersionDetails.class); + } else if (response.code() == 404) { + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultFileVersionDetails; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 716fe59..19fa01c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -135,7 +135,8 @@ public static Map getHeaders(ImageKit imageKit) { } public static void generalApiThrowException(Response response) - throws IOException, BadRequestException, InternalServerException, UnknownException, UnauthorizedException, ForbiddenException, TooManyRequestsException { + throws IOException, BadRequestException, InternalServerException, UnknownException, UnauthorizedException, + ForbiddenException, TooManyRequestsException { ResultException result = populateResult(response); if (response.code() == 400) { throw new BadRequestException(result.getMessage(), null, false, false, result.getMessage(), @@ -144,21 +145,23 @@ public static void generalApiThrowException(Response response) throw new UnauthorizedException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } else if (response.code() == 403) { - throw new ForbiddenException(result.getMessage(), null, false, false, result.getMessage(), - result.getHelp(), result.getResponseMetaData()); - } else if (response.code() == 429) { - throw new TooManyRequestsException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), - result.getResponseMetaData()); - } else if (response.code() == 500 || response.code() == 502 || response.code() == 503 || response.code() == 504) { - throw new InternalServerException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), + throw new ForbiddenException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); + } else if (response.code() == 429) { + throw new TooManyRequestsException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else if (response.code() == 500 || response.code() == 502 || response.code() == 503 + || response.code() == 504) { + throw new InternalServerException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); } else { throw new UnknownException(result.getMessage(), null, false, false, result.getMessage(), result.getHelp(), result.getResponseMetaData()); } } - public static void throwOtherException(Response response) throws IOException, PartialSuccessException, NotFoundException, UnknownException { + public static void throwOtherException(Response response) + throws IOException, PartialSuccessException, NotFoundException, UnknownException { ResultException result = populateResult(response); if (response.code() == 207) { throw new PartialSuccessException(result.getMessage(), null, false, false, result.getMessage(), diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 3dd167e..9932e3f 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -479,7 +479,8 @@ public void imageKit_upload_expect_UnknownHostException() throws IOException { } @Test - public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, + BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; URL url = new URL(imageUrl); FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); @@ -547,45 +548,50 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep RestClient.UPLOAD_BASE_URL = server.url("/").toString(); SUT.upload(fileCreateRequest); RecordedRequest request = server.takeRequest(); - String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" + "Content-Length: 53\r\n" - + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"fileName\"\r\n" + "Content-Length: 20\r\n" + "\r\n" - + "sample-cat-image.png\r\n" + "--randomBoundary-------------------\r\n" + String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" + + "Content-Length: 53\r\n" + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"fileName\"\r\n" + + "Content-Length: 20\r\n" + "\r\n" + "sample-cat-image.png\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" - + "false\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"tags\"\r\n" - + "Content-Length: 27\r\n" + "\r\n" + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" + + "false\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"tags\"\r\n" + "Content-Length: 27\r\n" + "\r\n" + + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" - + "Content-Length: 11\r\n" + "\r\n" + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + "Content-Length: 11\r\n" + "\r\n" + + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" - + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" - + "Content-Length: 4\r\n" + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + "Content-Length: 4\r\n" + + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" - + "Content-Length: 12\r\n" + "\r\n" + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" + + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; assertEquals(json, request.getBody().readUtf8().trim()); assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); } @Test(expected = NotFoundException.class) - public void imageKit_updateDetails_expected_404() throws IOException, InterruptedException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void imageKit_updateDetails_expected_404() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"The requested file does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; + String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -594,47 +600,27 @@ public void imageKit_updateDetails_expected_404() throws IOException, Interrupte } @Test - public void imageKit_updateDetails_returnTrue() throws IOException, InterruptedException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - + public void imageKit_updateDetails_returnTrue() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"type\": \"file\",\n" + - " \"name\": \"new_car.jpg\",\n" + - " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + - " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" + - " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + - " \"tags\": [\n" + - " \"tagg\",\n" + - " \"tagg1\"\n" + - " ],\n" + - " \"AITags\": null,\n" + - " \"versionInfo\": {\n" + - " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"embeddedMetadata\": {\n" + - " \"XResolution\": 250,\n" + - " \"YResolution\": 250,\n" + - " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + - " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + - " },\n" + - " \"customCoordinates\": \"10,10,20,20\",\n" + - " \"customMetadata\": {\n" + - " \"test100\": 10\n" + - " },\n" + - " \"isPrivateFile\": false,\n" + - " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + - " \"fileType\": \"image\",\n" + - " \"filePath\": \"/new_car.jpg\",\n" + - " \"height\": 354,\n" + - " \"width\": 236,\n" + - " \"size\": 23023,\n" + - " \"hasAlpha\": false,\n" + - " \"mime\": \"image/jpeg\"\n" + - "}")); + server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" + + " \"name\": \"new_car.jpg\",\n" + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + + " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" + + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"tags\": [\n" + " \"tagg\",\n" + + " \"tagg1\"\n" + " ],\n" + " \"AITags\": null,\n" + " \"versionInfo\": {\n" + + " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + + " \"embeddedMetadata\": {\n" + " \"XResolution\": 250,\n" + + " \"YResolution\": 250,\n" + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + " },\n" + + " \"customCoordinates\": \"10,10,20,20\",\n" + " \"customMetadata\": {\n" + + " \"test100\": 10\n" + " },\n" + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/new_car.jpg\",\n" + " \"height\": 354,\n" + + " \"width\": 236,\n" + " \"size\": 23023,\n" + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); @@ -652,44 +638,33 @@ public void imageKit_updateDetails_returnTrue() throws IOException, InterruptedE assertEquals(requestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("PATCH /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), request.getRequestUrl().toString()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), + request.getRequestUrl().toString()); } @Test - public void imageKit_getFileList_returnList() throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, IOException { + public void imageKit_getFileList_returnList() + throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, IOException { MockWebServer server = new MockWebServer(); - String responseJson = "[\n" + - " {\n" + - " \"type\": \"file\",\n" + - " \"name\": \"default-image.jpg\",\n" + - " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" + - " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" + - " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + - " \"tags\": null,\n" + - " \"AITags\": null,\n" + - " \"versionInfo\": {\n" + - " \"id\": \"62a4439bce686814dfcce65c\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"embeddedMetadata\": {\n" + - " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" + - " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + - " },\n" + - " \"customCoordinates\": null,\n" + - " \"customMetadata\": {},\n" + - " \"isPrivateFile\": false,\n" + - " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" + - " \"fileType\": \"image\",\n" + - " \"filePath\": \"/default-image.jpg\",\n" + - " \"height\": 1000,\n" + - " \"width\": 1000,\n" + - " \"size\": 147022,\n" + - " \"hasAlpha\": false,\n" + - " \"mime\": \"image/jpeg\"\n" + - " }\n" + - "]"; + String responseJson = "[\n" + " {\n" + " \"type\": \"file\",\n" + + " \"name\": \"default-image.jpg\",\n" + + " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" + + " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" + + " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + " \"tags\": null,\n" + + " \"AITags\": null,\n" + " \"versionInfo\": {\n" + + " \"id\": \"62a4439bce686814dfcce65c\",\n" + " \"name\": \"Version 1\"\n" + + " },\n" + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" + + " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/default-image.jpg\",\n" + + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" + + " \"hasAlpha\": false,\n" + " \"mime\": \"image/jpeg\"\n" + " }\n" + "]"; server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -707,14 +682,13 @@ public void imageKit_getFileList_returnList() throws InterruptedException, Forbi } @Test(expected = NotFoundException.class) - public void imageKit_getFileDetail__expected_404() throws IOException, InterruptedException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void imageKit_getFileDetail__expected_404() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"The requested file does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; + String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -724,34 +698,23 @@ public void imageKit_getFileDetail__expected_404() throws IOException, Interrupt } @Test - public void imageKit_getFileDetail_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_getFileDetail_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"type\": \"file\",\n" + - " \"name\": \"sample-image11_g1Qv0wpqP.jpg\",\n" + - " \"createdAt\": \"2022-06-20T05:00:41.830Z\",\n" + - " \"updatedAt\": \"2022-06-20T05:00:43.263Z\",\n" + - " \"fileId\": \"62affef97db937b028f3b47a\",\n" + - " \"tags\": [\n" + - " \"Software\",\n" + - " \"Developer\",\n" + - " \"Engineer\"\n" + - " ],\n" + - " \"AITags\": null,\n" + - " \"versionInfo\": {\n" + - " \"id\": \"62affef97db937b028f3b47a\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"embeddedMetadata\": {},\n" + - " \"customCoordinates\": null,\n" + - " \"customMetadata\": {},\n" + - " \"isPrivateFile\": false,\n" + - " \"url\": \"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/demo/img/static-file-1.png\",\n" + - " \"fileType\": \"non-image\",\n" + - " \"filePath\": \"/sample-image11_g1Qv0wpqP.jpg\",\n" + - " \"size\": 169170\n" + - "}"; + String responseJson = "{\n" + " \"type\": \"file\",\n" + " \"name\": \"sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"createdAt\": \"2022-06-20T05:00:41.830Z\",\n" + + " \"updatedAt\": \"2022-06-20T05:00:43.263Z\",\n" + + " \"fileId\": \"62affef97db937b028f3b47a\",\n" + " \"tags\": [\n" + " \"Software\",\n" + + " \"Developer\",\n" + " \"Engineer\"\n" + " ],\n" + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + " \"id\": \"62affef97db937b028f3b47a\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {},\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/demo/img/static-file-1.png\",\n" + + " \"fileType\": \"non-image\",\n" + " \"filePath\": \"/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"size\": 169170\n" + "}"; server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -762,24 +725,19 @@ public void imageKit_getFileDetail_successExpected() throws IOException, Forbidd assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals("GET /v1/files/62affef97db937b028f3b47a/details HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a/details"), request.getRequestUrl().toString()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a/details"), + request.getRequestUrl().toString()); } @Test - public void imageKit_getFileMetaData_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_getFileMetaData_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"height\": 1000,\n" + - " \"width\": 1000,\n" + - " \"size\": 147022,\n" + - " \"format\": \"jpg\",\n" + - " \"hasColorProfile\": false,\n" + - " \"quality\": 0,\n" + - " \"density\": 72,\n" + - " \"hasTransparency\": false,\n" + - " \"exif\": {},\n" + - " \"pHash\": \"e0d52b612ad538f6\"\n" + - "}"; + String responseJson = "{\n" + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" + + " \"format\": \"jpg\",\n" + " \"hasColorProfile\": false,\n" + " \"quality\": 0,\n" + + " \"density\": 72,\n" + " \"hasTransparency\": false,\n" + " \"exif\": {},\n" + + " \"pHash\": \"e0d52b612ad538f6\"\n" + "}"; server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -789,13 +747,18 @@ public void imageKit_getFileMetaData_successExpected() throws IOException, Forbi String utf8RequestBody = request.getBody().readUtf8(); assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg"), request.getRequestUrl().toString()); + assertEquals("GET /v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg"), + request.getRequestUrl().toString()); } @Test(expected = NotFoundException.class) - public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_getRemoteFileMetaData_404_Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" @@ -809,12 +772,12 @@ public void imageKit_getRemoteFileMetaData_404_Expected() throws ForbiddenExcept } @Test(expected = NotFoundException.class) - public void imageKit_deleteFile_404_Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_deleteFile_404_Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"The requested file does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; + String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -824,7 +787,9 @@ public void imageKit_deleteFile_404_Expected() throws ForbiddenException, TooMan } @Test - public void imageKit_deleteFile_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_deleteFile_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); String responseJson = ""; server.enqueue(new MockResponse().setResponseCode(204).setBody(responseJson)); @@ -837,23 +802,22 @@ public void imageKit_deleteFile_successExpected() throws IOException, ForbiddenE assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals("DELETE /v1/files/62affef97db937b028f3b47a HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a"), request.getRequestUrl().toString()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a"), + request.getRequestUrl().toString()); } @Test(expected = NotFoundException.class) - public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { + public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, + InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, + BadRequestException, UnknownException, IOException, InterruptedException { List fileIds = new ArrayList<>(); fileIds.add("file_id_1"); fileIds.add("file_id_2"); fileIds.add("file_id_3"); MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"The requested file(s) does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"missingFileIds\": [\n" + - " \"62ad9ece7db937e35ef18dda\"\n" + - " ]\n" + - "}"; + String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -863,15 +827,14 @@ public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, To } @Test - public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IOException, InterruptedException { + public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, + InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, + BadRequestException, UnknownException, IOException, InterruptedException { List fileIds = new ArrayList<>(); fileIds.add("62ad9ece7db937e35ef18dda"); MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"successfullyDeletedFileIds\": [\n" + - " \"62ad9ece7db937e35ef18dda\"\n" + - " ]\n" + - "}"; + String responseJson = "{\n" + " \"successfullyDeletedFileIds\": [\n" + + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -882,15 +845,16 @@ public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException assertEquals("{\"fileIds\":[\"62ad9ece7db937e35ef18dda\"]}", utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); assertEquals("POST /v1/files/batch/deleteByFileIds HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/batch/deleteByFileIds"), request.getRequestUrl().toString()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/batch/deleteByFileIds"), + request.getRequestUrl().toString()); } @Test(expected = BadRequestException.class) - public void imageKit_purgeCache_404Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_purgeCache_404Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"Invalid url\"\n" + - "}"; + String responseJson = "{\n" + " \"message\": \"Invalid url\"\n" + "}"; server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -900,11 +864,11 @@ public void imageKit_purgeCache_404Expected() throws ForbiddenException, TooMany } @Test - public void imageKit_purgeCache_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + public void imageKit_purgeCache_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + - "}"; + String responseJson = "{\n" + " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + "}"; server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -919,12 +883,12 @@ public void imageKit_purgeCache_successExpected() throws IOException, ForbiddenE } @Test(expected = BadRequestException.class) - public void imageKit_getPurgeCacheStatus_400Expected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_getPurgeCacheStatus_400Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"No request found for this requestId.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; + String responseJson = "{\n" + " \"message\": \"No request found for this requestId.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -934,11 +898,11 @@ public void imageKit_getPurgeCacheStatus_400Expected() throws ForbiddenException } @Test - public void imageKit_getPurgeCacheStatus_successExpected() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException, IOException { + public void imageKit_getPurgeCacheStatus_successExpected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"status\": \"Completed\"\n" + - "}"; + String responseJson = "{\n" + " \"status\": \"Completed\"\n" + "}"; server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); @@ -949,7 +913,8 @@ public void imageKit_getPurgeCacheStatus_successExpected() throws ForbiddenExcep assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals("GET /v1/files/purge/62b01f15214dfbdf3692dd0a HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge/62b01f15214dfbdf3692dd0a"), request.getRequestUrl().toString()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge/62b01f15214dfbdf3692dd0a"), + request.getRequestUrl().toString()); } @Test @@ -1013,7 +978,8 @@ private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { @Test(expected = NotFoundException.class) public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1037,7 +1003,8 @@ public void add_tags_expected_404() throws IOException, InterruptedException, No @Test public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1064,7 +1031,8 @@ public void add_tags_expectedSuccessWith() throws IOException, InterruptedExcept @Test(expected = NotFoundException.class) public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1085,7 +1053,8 @@ public void remove_tags_expected_404_bad_request() throws InterruptedException, @Test public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1110,7 +1079,8 @@ public void remove_tags_expectedSuccessWith() throws IOException, InterruptedExc } @Test - public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, InterruptedException, UnknownException { + public void get_custom_metadata_fields_expectedSuccessWith() + throws IOException, InterruptedException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" @@ -1132,8 +1102,8 @@ public void get_custom_metadata_fields_expectedSuccessWith() throws IOException, } @Test(expected = BadRequestException.class) - public void createCustomMetaDataFields_expected_400() throws InterruptedException, IOException, BadRequestException, - UnknownException { + public void createCustomMetaDataFields_expected_400() + throws InterruptedException, IOException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" @@ -1167,8 +1137,8 @@ public void createCustomMetaDataFields_expected_400() throws InterruptedExceptio } @Test - public void createCustomMetaDataFields_successExpected() throws InterruptedException, IOException, - BadRequestException, UnknownException { + public void createCustomMetaDataFields_successExpected() + throws InterruptedException, IOException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" @@ -1200,8 +1170,8 @@ public void createCustomMetaDataFields_successExpected() throws InterruptedExcep } @Test(expected = NotFoundException.class) - public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, - UnknownException { + public void deleteCustomMetaDataField_404_Expected() + throws IOException, InterruptedException, NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" @@ -1214,8 +1184,8 @@ public void deleteCustomMetaDataField_404_Expected() throws IOException, Interru } @Test - public void deleteCustomMetaDataField_successExpected() throws IOException, InterruptedException, NotFoundException, - UnknownException { + public void deleteCustomMetaDataField_successExpected() + throws IOException, InterruptedException, NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("")); server.start(); @@ -1233,8 +1203,8 @@ public void deleteCustomMetaDataField_successExpected() throws IOException, Inte } @Test(expected = NotFoundException.class) - public void updateCustomMetaDataFields_404_Expected() throws InterruptedException, IOException, BadRequestException, - NotFoundException, UnknownException { + public void updateCustomMetaDataFields_404_Expected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1256,8 +1226,8 @@ public void updateCustomMetaDataFields_404_Expected() throws InterruptedExceptio } @Test(expected = BadRequestException.class) - public void updateCustomMetaDataFields_400_Expected() throws InterruptedException, IOException, BadRequestException, - NotFoundException, UnknownException { + public void updateCustomMetaDataFields_400_Expected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400) @@ -1281,8 +1251,8 @@ public void updateCustomMetaDataFields_400_Expected() throws InterruptedExceptio } @Test - public void updateCustomMetaDataFields_successExpected() throws InterruptedException, IOException, - BadRequestException, NotFoundException, UnknownException { + public void updateCustomMetaDataFields_successExpected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse() @@ -1316,7 +1286,8 @@ public void updateCustomMetaDataFields_successExpected() throws InterruptedExcep @Test(expected = NotFoundException.class) public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("629f3de17eb0fe4053615450"); @@ -1340,7 +1311,8 @@ public void removeAITags_404_Expected() throws InterruptedException, IOException @Test public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { List fileIds = new ArrayList<>(); fileIds.add("62958deef33aa80bdadf7533"); @@ -1367,8 +1339,9 @@ public void removeAITags_successExpected() throws InterruptedException, IOExcept } @Test(expected = NotFoundException.class) - public void copyFile_404_Expected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void copyFile_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/sample_image.jpg"); @@ -1387,8 +1360,9 @@ public void copyFile_404_Expected() throws InterruptedException, IOException, No } @Test - public void copyFile_successExpected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void copyFile_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/car_false.jpeg"); @@ -1411,8 +1385,9 @@ public void copyFile_successExpected() throws InterruptedException, IOException, } @Test(expected = NotFoundException.class) - public void moveFile_404_Expected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void moveFile_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); @@ -1430,8 +1405,9 @@ public void moveFile_404_Expected() throws InterruptedException, IOException, No } @Test - public void moveFile_successExpected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void moveFile_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFileRequest moveFileRequest = new MoveFileRequest(); moveFileRequest.setSourceFilePath("/new_la.jpg"); @@ -1454,7 +1430,8 @@ public void moveFile_successExpected() throws InterruptedException, IOException, @Test(expected = NotFoundException.class) public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/sample_image_th.jpg"); @@ -1475,7 +1452,8 @@ public void renameFile_404_Expected() throws InterruptedException, IOException, @Test(expected = ConflictException.class) public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/new1.jpg"); @@ -1496,7 +1474,8 @@ public void renameFile_409_Expected() throws InterruptedException, IOException, @Test public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/car_false.jpeg"); @@ -1559,8 +1538,9 @@ public void createFolder_successExpected() throws InterruptedException, IOExcept } @Test(expected = NotFoundException.class) - public void deleteFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void deleteFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("/testFolder"); @@ -1577,8 +1557,9 @@ public void deleteFolder_404_Expected() throws InterruptedException, IOException } @Test - public void deleteFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void deleteFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); deleteFolderRequest.setFolderPath("testFolder"); @@ -1599,8 +1580,9 @@ public void deleteFolder_successExpected() throws InterruptedException, IOExcept } @Test(expected = NotFoundException.class) - public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void copyFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1619,8 +1601,9 @@ public void copyFolder_404_Expected() throws InterruptedException, IOException, } @Test - public void copyFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void copyFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); @@ -1643,8 +1626,9 @@ public void copyFolder_successExpected() throws InterruptedException, IOExceptio } @Test(expected = NotFoundException.class) - public void moveFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void moveFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder/"); @@ -1662,8 +1646,9 @@ public void moveFolder_404_Expected() throws InterruptedException, IOException, } @Test - public void moveFolder_successExpected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void moveFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); moveFolderRequest.setSourceFolderPath("/testFolder"); @@ -1685,7 +1670,9 @@ public void moveFolder_successExpected() throws InterruptedException, IOExceptio } @Test - public void getBulkJobStatus_500_Expected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public void getBulkJobStatus_500_Expected() + throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(500)); @@ -1704,7 +1691,9 @@ public void getBulkJobStatus_500_Expected() throws InterruptedException, IOExcep } @Test - public void getBulkJobStatus_successExpected() throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public void getBulkJobStatus_successExpected() + throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" @@ -1721,8 +1710,9 @@ public void getBulkJobStatus_successExpected() throws InterruptedException, IOEx } @Test(expected = NotFoundException.class) - public void getFileVersions_404_Expected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void getFileVersions_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1735,8 +1725,9 @@ public void getFileVersions_404_Expected() throws InterruptedException, IOExcept } @Test - public void getFileVersions_successExpected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void getFileVersions_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" @@ -1776,8 +1767,9 @@ public void getFileVersions_successExpected() throws InterruptedException, IOExc } @Test(expected = NotFoundException.class) - public void getFileVersionDetails_404_Expected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void getFileVersionDetails_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -1790,8 +1782,9 @@ public void getFileVersionDetails_404_Expected() throws InterruptedException, IO } @Test - public void getFileVersionDetails_successExpected() throws InterruptedException, IOException, NotFoundException, - BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void getFileVersionDetails_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" @@ -1832,8 +1825,9 @@ public void getFileVersionDetails_successExpected() throws InterruptedException, } @Test(expected = BadRequestException.class) - public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void deleteFileVersion_400_SuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1850,8 +1844,9 @@ public void deleteFileVersion_400_SuccessWith() throws IOException, InterruptedE } @Test(expected = NotFoundException.class) - public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void deleteFileVersion_404_SuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); @@ -1868,8 +1863,9 @@ public void deleteFileVersion_404_SuccessWith() throws IOException, InterruptedE } @Test - public void deleteFileVersion_expectedSuccessWith() throws IOException, InterruptedException, BadRequestException, - NotFoundException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + public void deleteFileVersion_expectedSuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java deleted file mode 100644 index 2e41210..0000000 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/BaseFileTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.imagekit.sdk.models; - -import org.junit.Before; -import org.junit.Test; - -import java.util.Date; -import java.util.List; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.mock; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -public class BaseFileTest { - private BaseFile SUT; - - @Before - public void setUp() throws Exception { - SUT = new BaseFile(); - } - - @Test - public void constructor_test() { - List tags = mock(List.class); - SUT = new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags, true, "0,0,10,20", - "image", new JsonArray(), new JsonObject(), new JsonObject(), new JsonObject(), new JsonObject(), - "file", "image/jpeg", false, new Date(), new Date()); - assertNotNull(SUT); - } - - @Test - public void test_getter_setter() { - List tags = mock(List.class); -// SUT=new BaseFile("fileId", "name", "url", "thumbnail", 10, 10, 20, "filePath", tags,true, "0,0,10,20", "fileType"); - SUT.setFileId("fileId"); - SUT.setName("name"); - SUT.setUrl("url"); - SUT.setThumbnail("thumbnail"); - SUT.setHeight(10); - SUT.setWidth(20); - SUT.setSize(30); - SUT.setFilePath("filePath"); - SUT.setTags(tags); - SUT.setPrivateFile(true); - SUT.setCustomCoordinates("0,0,10,20"); - SUT.setFileType("image"); - assertEquals("fileId", SUT.getFileId()); - assertEquals("name", SUT.getName()); - assertEquals("url", SUT.getUrl()); - assertEquals("thumbnail", SUT.getThumbnail()); - assertEquals(10, SUT.getHeight()); - assertEquals(20, SUT.getWidth()); - assertEquals(30, SUT.getSize()); - assertEquals("filePath", SUT.getFilePath()); - assertEquals(tags, SUT.getTags()); - assertEquals(true, SUT.isPrivateFile()); - assertEquals("0,0,10,20", SUT.getCustomCoordinates()); - assertEquals("image", SUT.getFileType()); - } -} \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileCreateRequestTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileCreateRequestTest.java deleted file mode 100644 index fd58505..0000000 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileCreateRequestTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package io.imagekit.sdk.models; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import io.imagekit.sdk.utils.Utils; -import io.imagekit.sdk.utils.UtilsTest; -import okhttp3.MultipartBody; -import org.junit.Test; - -import java.io.File; -import java.net.URI; -import java.net.URL; -import java.util.List; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.mock; - -public class FileCreateRequestTest { - @Test - public void fileFromURL_constructor_test() throws Exception{ - URL url= URI.create("https://sample-videos.com/img/Sample-jpg-image-50kb.jpg").toURL(); - FileCreateRequest SUT=new FileCreateRequest(url,"file_name"); - assertNotNull(SUT); - } - - @Test - public void base64_constructor_test() { - URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); - File file=new File(imageURL.getPath()); - String base64 = Utils.fileToBase64(file); - FileCreateRequest SUT=new FileCreateRequest(base64,"file_name"); - assertNotNull(SUT); - } - - @Test - public void bytes_constructor_test() { - URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); - File file=new File(imageURL.getPath()); - byte[] bytes = Utils.fileToBytes(file); - FileCreateRequest SUT=new FileCreateRequest(bytes,"file_name"); - assertNotNull(SUT); - } - - @Test - public void test_getter_setter() { - URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); - File file=new File(imageURL.getPath()); - String base64 = Utils.fileToBase64(file); - FileCreateRequest SUT=new FileCreateRequest(base64,"file_name"); - - List tags=mock(List.class); - List responseFields=mock(List.class); - - SUT.setCustomCoordinates("0,0,10,20"); - SUT.setFileName("file_name"); - SUT.setFolder("dir1"); - SUT.setPrivateFile(true); - SUT.setResponseFields(responseFields); - SUT.setTags(tags); - SUT.setUseUniqueFileName(true); - - assertEquals("0,0,10,20",SUT.getCustomCoordinates()); - assertEquals("file_name",SUT.getFileName()); - assertEquals("dir1",SUT.getFolder()); - assertEquals(true,SUT.isPrivateFile()); - assertEquals(responseFields,SUT.getResponseFields()); - assertEquals(tags,SUT.getTags()); - assertEquals(true,SUT.isUseUniqueFileName()); - - } -// -// @Test -// public void test_prepareRequest() { -// URL imageURL = UtilsTest.class.getClassLoader().getResource("sample1.jpg"); -// File file=new File(imageURL.getPath()); -// String base64 = Utils.fileToBase64(file); -// FileCreateRequest SUT=new FileCreateRequest(base64,"file_name"); -// assertNotNull(SUT.prepareRequest()); -// } -// -// @Test(expected = RuntimeException.class) -// public void test_prepareRequest_with_null_url_expectException() { -// URL url=null; -// FileCreateRequest SUT=new FileCreateRequest(url,"file_name"); -//// assertNotNull(SUT.prepareRequest()); -// } -// -// @Test(expected = RuntimeException.class) -// public void test_prepareRequest_with_null_file_name_expectException() throws Exception{ -// URL url=new URL("http","localhost",3000,"/demo.jpg"); -// FileCreateRequest SUT=new FileCreateRequest(url,null); -// assertNotNull(SUT.prepareRequest()); -// } -} \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileUpdateRequestTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileUpdateRequestTest.java deleted file mode 100644 index 51aa5e0..0000000 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/models/FileUpdateRequestTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.imagekit.sdk.models; - -import okhttp3.RequestBody; -import org.junit.Test; - -import java.util.List; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.mock; - -public class FileUpdateRequestTest { - @Test - public void constructor_test() { - FileUpdateRequest SUT=new FileUpdateRequest("file_id"); - assertEquals("file_id",SUT.getFileId()); - } - - @Test - public void test_getter_setter_methods() { - List tags=mock(List.class); - FileUpdateRequest SUT=new FileUpdateRequest("file_id"); - SUT.setCustomCoordinates("0,0,10,20"); - SUT.setFileId("file_id1"); - SUT.setTags(tags); - - assertEquals("0,0,10,20",SUT.getCustomCoordinates()); - assertEquals("file_id1",SUT.getFileId()); - assertEquals(tags,SUT.getTags()); - } - -// @Test -// public void prepareRequest_expectSuccess() { -// FileUpdateRequest SUT=new FileUpdateRequest("file_id"); -// SUT.setCustomCoordinates("0,0,10,20"); -// RequestBody requestBody = SUT.prepareRequest(); -// assertNotNull(requestBody); -// } -// -// @Test(expected = RuntimeException.class) -// public void prepareRequest_with_null_file_id_expectRuntime_exception() { -// FileUpdateRequest SUT=new FileUpdateRequest(null); -// SUT.setCustomCoordinates("0,0,10,20"); -// RequestBody requestBody = SUT.prepareRequest(); -// assertNotNull(requestBody); -// } -// -// @Test(expected = RuntimeException.class) -// public void prepareRequest_with_empty_file_id_expectRuntime_exception() { -// FileUpdateRequest SUT=new FileUpdateRequest(""); -// SUT.setCustomCoordinates("0,0,10,20"); -// RequestBody requestBody = SUT.prepareRequest(); -// assertNotNull(requestBody); -// } - -} \ No newline at end of file From 0afa3b24bbd7ab70c3c6ca2bc3b84060eeb251c4 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 23 Jun 2022 18:09:39 +0530 Subject: [PATCH 076/112] resolved few comments --- README.md | 32 ++++++++++++++++--- imagekit-sdk/build.gradle | 4 +++ .../imagekit/sdk/constants/Transformer.java | 1 + .../java/io/imagekit/sdk/ImageKitTest.java | 8 ++--- .../src/test/resources/config.properties | 6 ++-- 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 82d6f59..5ba465a 100644 --- a/README.md +++ b/README.md @@ -91,11 +91,31 @@ class App { } ``` +or + + ```java +import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.config.Configuration; +import io.imagekit.sdk.utils.Utils; +class App { + public static void main(String[] args) { + ImageKit imageKit = ImageKit.getInstance(); + Configuration config = new Configuration("your_public_key", "your_private_key", "your_url_endpoint"); + imageKit.setConfig(config); + } +} +``` + ## Usage -You can use this Java SDK for 3 different kinds of methods - URL generation, file upload, and file management. +You can use this Java SDK for 3 different kinds of methods: + +* URL generation +* file upload +* file management +* The usage of the SDK has been explained below. -## Versioning +## Change log This document presents a list of changes that break existing functionality of previous versions. We try our best to minimize these disruptions, but sometimes they are unavoidable and they will be in major versions. ### Breaking History: @@ -142,6 +162,7 @@ List> transformation=new ArrayList>(); Map scale=new HashMap<>(); scale.put("height","600"); scale.put("width","400"); +scale.put("raw", "ar-4-3,q-40"); transformation.add(scale); Map options=new HashMap(); @@ -166,6 +187,7 @@ List> transformation=new ArrayList>(); Map scale=new HashMap<>(); scale.put("height","600"); scale.put("width","400"); +scale.put("raw", "ar-4-3,q-40"); transformation.add(scale); Map options=new HashMap(); @@ -970,9 +992,9 @@ git clone https://github.com/imagekit-developer/imagekit-java.git **5. Edit `config.properties` and write values of given keys.** ```properties -UrlEndpoint=<-YOUR-ENDPOINT-URL-HERE-> -PrivateKey=<-YOUR-PRIVATE-KEY-HERE-> -PublicKey=<-YOUR-PUBLIC-KEY-HERE-> +UrlEndpoint=your_url_endpoint +PrivateKey=your_private_key +PublicKey=your_public_key ``` **5. You will find `App.java` in `src/main/java/io/imagekit/sampleapp/` directory. Edit program as you need, then run `App.java`. If you are using CLI Tool (Terminal/Command Prompt) Then Open Project in CLI and execute using gradle** diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 60b2a06..7db22da 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -12,6 +12,10 @@ repositories { mavenCentral() } +test { + useJUnitPlatform() +} + dependencies { compile 'commons-codec:commons-codec:1.13' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java index ac83e55..732337c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java @@ -56,6 +56,7 @@ public static synchronized Transformer getInstance(){ transformer.trans.put("effectContrast" , "e-contrast"); transformer.trans.put("effectGray" , "e-grayscale"); transformer.trans.put("original" , "orig"); + transformer.trans.put("raw", "raw"); return transformer; } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 9932e3f..047b084 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -170,11 +170,11 @@ public void getUrl_with_overriding_urlEndpoint() { Map options = new HashMap<>(); options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_override_imagekit_id"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix"); options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_override_imagekit_id/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + Version.VERSION_CODE, is(url)); } @@ -188,11 +188,11 @@ public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { Map options = new HashMap<>(); options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_override_imagekit_id"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix"); options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_override_imagekit_id/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" + Version.VERSION_CODE, is(url)); } diff --git a/imagekit-sdk/src/test/resources/config.properties b/imagekit-sdk/src/test/resources/config.properties index f3b8e1b..9328085 100644 --- a/imagekit-sdk/src/test/resources/config.properties +++ b/imagekit-sdk/src/test/resources/config.properties @@ -1,6 +1,6 @@ # Copy this sample file add rename it to "config.properties" # Put essential values of keys [UrlEndpoint, PrivateKey, PublicKey] -UrlEndpoint=https://test-domain.com/test-endpoint/ -PrivateKey=private_key_test -PublicKey=public_key_test \ No newline at end of file +UrlEndpoint=https://ik.imagekit.io/zv3rkhsym +PrivateKey=private_kwTU4AR9Ei5hBoTIuxCW63Dg2jM= +PublicKey=public_SSvmi6RknpNXj9x1cQnra1sYpJg= \ No newline at end of file From 617b975fc744045c36d9c75ad861a5f7528aa5fa Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 24 Jun 2022 15:19:27 +0530 Subject: [PATCH 077/112] added more changes regarding resolve comments --- README.md | 10 +- imagekit-sdk/build.gradle | 1 + .../java/io/imagekit/sdk/tasks/UrlGen.java | 6 +- .../java/io/imagekit/sdk/ImageKitTest.java | 247 ++++++++++++------ 4 files changed, 169 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index 5ba465a..e7798ba 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,7 @@ String url = ImageKit.getInstance().getUrl(options); ``` The result in a URL like ``` -https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg?v=123&ik-sdk-version=java-1.0.3 +https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg?v=123 ``` **2. Using full image URL** @@ -200,7 +200,7 @@ String url = ImageKit.getInstance().getUrl(options); The results in a URL like ``` -https://ik.imagekit.io/your_imagekit_id/default-image.jpg?tr=w-400,h-600&ik-sdk-version=java-1.0.3 +https://ik.imagekit.io/your_imagekit_id/default-image.jpg?tr=w-400,h-600 ``` The ```.getUrl()``` method accepts the following parameters @@ -240,7 +240,7 @@ String url = ImageKit.getInstance().getUrl(options); Sample Result URL - ``` -https://ik.imagekit.io/your_imagekit_id/default-image.jpg?tr=h-300&w-400:rt-90&ik-sdk-version=java-1.0.3 +https://ik.imagekit.io/your_imagekit_id/default-image.jpg?tr=h-300&w-400:rt-90 ``` **2. Sharpening and contrast transforms and a progressive JPG image** @@ -268,7 +268,7 @@ String url = ImageKit.getInstance().getUrl(options); Note that because the `src` parameter was used, the transformation string gets added as a query parameter. ``` -https://ik.imagekit.io/your_imagekit_id/default-image.jpg?tr=f-jpg&pr-true&e-sharpen&e-contrast-1&ik-sdk-version=java-1.0.3 +https://ik.imagekit.io/your_imagekit_id/default-image.jpg?tr=f-jpg&pr-true&e-sharpen&e-contrast-1 ``` **3. Signed URL that expires in 300 seconds with the default URL endpoint and other query parameters** @@ -289,7 +289,7 @@ String url = ImageKit.getInstance().getUrl(options); ``` **Sample Result URL** ``` -https://ik.imagekit.io/your_imagekit_id/tr:h-600,w-400/default-image.jpg?ik-t=1567358667&ik-s=f2c7cdacbe7707b71a83d49cf1c6110e3d701054&ik-sdk-version=java-1.0.3 +https://ik.imagekit.io/your_imagekit_id/tr:h-600,w-400/default-image.jpg?ik-t=1567358667&ik-s=f2c7cdacbe7707b71a83d49cf1c6110e3d701054 ``` **List of transformations** diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 7db22da..0733a47 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -26,4 +26,5 @@ dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' testCompile "org.mockito:mockito-all:2.+" testImplementation 'com.squareup.okhttp3:mockwebserver:3.10.0' + testImplementation('org.junit.jupiter:junit-jupiter:5.4.0') } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java index f810669..fa66d11 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java @@ -77,7 +77,7 @@ private static String buildPathUrl(String path, String urlEndpoint, Map entry:queryParameters.entrySet()){ queryMaker.put(String.format(Locale.US,"%s=%s",entry.getKey(),entry.getValue())); } @@ -146,7 +145,6 @@ private static String buildFullUrl(String src, Map queryParamete } QueryMaker queryMaker=new QueryMaker(); - queryMaker.put(String.format(Locale.US,"%s=%s","ik-sdk-version", Version.VERSION_CODE)); // check existing query params if (null!=src){ diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 047b084..2d69fd7 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -34,8 +34,11 @@ import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; +import org.hamcrest.MatcherAssert; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; import java.io.IOException; import java.net.HttpURLConnection; @@ -53,7 +56,7 @@ public class ImageKitTest { private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern - .compile("(https://.*)\\?ik-sdk-version=(.*)&ik-s=(.*)&ik-t=(.*)"); + .compile("(https://.*)\\?ik-s=(.*)&ik-t=(.*)"); private ImageKit SUT; @@ -77,9 +80,11 @@ public void imageKit_configurationTest() { assertEquals(config.toString(), ImageKit.getInstance().getConfig().toString()); } - @Test - public void getUrl_with_height_width_options() { - List> transformation = new ArrayList>(); + @org.junit.jupiter.api.Test + public void getUrl_with_height_width_options() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -90,13 +95,14 @@ public void getUrl_with_height_width_options() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE, is(url)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @Test - public void getUrl_with_height_width_options_url_version_check() { - List> transformation = new ArrayList>(); + @org.junit.jupiter.api.Test + public void getUrl_with_height_width_options_url_version_check() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -105,14 +111,14 @@ public void getUrl_with_height_width_options_url_version_check() { options.put("path", "/default-image.jpg"); options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE, is(url)); - assertTrue(url.contains("ik-sdk-version=" + Version.VERSION_CODE)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @Test - public void getUrl_with_new_transformation_params_options() { - List> transformation = new ArrayList>(); + @org.junit.jupiter.api.Test + public void getUrl_with_new_transformation_params_options() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -125,13 +131,14 @@ public void getUrl_with_new_transformation_params_options() { options.put("path", "/default-image.jpg"); options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600:myparam-40/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE, is(url)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:myparam-40/default-image.jpg", is(url)); } - @Test - public void getUrl_with_slash_in_path() { - List> transformation = new ArrayList>(); + @org.junit.jupiter.api.Test + public void getUrl_with_slash_in_path() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -141,13 +148,14 @@ public void getUrl_with_slash_in_path() { options.put("path", "/default-image.jpg"); options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE, is(url)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @Test - public void getUrl_without_slash_in_path() { - List> transformation = new ArrayList>(); + @org.junit.jupiter.api.Test + public void getUrl_without_slash_in_path() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -156,13 +164,13 @@ public void getUrl_without_slash_in_path() { options.put("path", "default-image.jpg"); options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE, is(url)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @Test + @org.junit.jupiter.api.Test public void getUrl_with_overriding_urlEndpoint() { - List> transformation = new ArrayList>(); + SUT = ImageKit.getInstance(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -174,12 +182,70 @@ public void getUrl_with_overriding_urlEndpoint() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE, is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg", is(url)); } - @Test + @org.junit.jupiter.api.Test + public void getUrl_with_transformation_parameters() { + SUT = ImageKit.getInstance(); + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + scale.put("aspectRatio", "4-3"); + scale.put("quality", "40"); + scale.put("crop", "force"); + scale.put("cropMode", "extract"); + scale.put("focus", "left"); + scale.put("format", "png"); + scale.put("radius", "20"); + scale.put("background", "A94D34"); + scale.put("border", "5-A94D34"); + scale.put("rotation", "90"); + scale.put("blur", "10"); + scale.put("named", "any_name"); + scale.put("overlayImage", "/folder/file.jpg"); + scale.put("overlayX", "20"); + scale.put("overlayY", "10"); + scale.put("overlayFocus", "top"); + scale.put("overlayHeight", "20"); + scale.put("overlayWidth", "20"); + scale.put("overlayText", "Image Text"); + scale.put("overlayTextFontSize", "18"); + scale.put("overlayTextFontFamily", "Open Sans"); + scale.put("overlayTextColor", "00FFFF"); + scale.put("overlayAlpha", ""); + scale.put("overlayTextTypography", "b"); + scale.put("overlayBackground", "00AAFF55"); + scale.put("overlayImageTrim", String.valueOf(false)); + scale.put("progressive", String.valueOf(true)); + scale.put("lossless", String.valueOf(true)); + scale.put("trim", "5"); + scale.put("metadata", String.valueOf(true)); + scale.put("colorProfile", String.valueOf(true)); + scale.put("defaultImage", "/folder/file.jpg"); + scale.put("dpr", "3"); + scale.put("effectSharpen", "-"); + scale.put("effectUSM", ""); + scale.put("effectContrast", "1"); + scale.put("effectGray", ""); + scale.put("original", String.valueOf(true)); + scale.put("raw", "w-200,h-200"); + + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,bo-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", is(url)); + } + + @org.junit.jupiter.api.Test public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { + SUT = ImageKit.getInstance(); List> transformation = new ArrayList>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -188,20 +254,21 @@ public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { Map options = new HashMap<>(); options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE, is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg", is(url)); } - @Test - public void getUrl_with_options_as_query() { + @org.junit.jupiter.api.Test + public void getUrl_with_options_as_query() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -214,16 +281,17 @@ public void getUrl_with_options_as_query() { options.put("transformationPosition", "query"); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "default-image.jpg?ik-sdk-version=" + Version.VERSION_CODE - + "&v=123&tr=w-400,h-600", is(url)); + MatcherAssert.assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600", is(url)); } - @Test - public void getUrl_with_options_as_path() { + @org.junit.jupiter.api.Test() + public void getUrl_with_options_as_path() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -235,16 +303,17 @@ public void getUrl_with_options_as_path() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&v=123", is(url)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg?v=123", is(url)); } - @Test - public void getUrl_with_chained_transformation_options_as_query() { + @org.junit.jupiter.api.Test + public void getUrl_with_chained_transformation_options_as_query() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -260,16 +329,17 @@ public void getUrl_with_chained_transformation_options_as_query() { options.put("transformationPosition", "query"); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "default-image.jpg?ik-sdk-version=" + Version.VERSION_CODE - + "&v=123&tr=w-400,h-600:rt-90", is(url)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600:rt-90", is(url)); } - @Test - public void getUrl_with_chained_transformation_options_as_path() { + @org.junit.jupiter.api.Test + public void getUrl_with_chained_transformation_options_as_path() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -284,17 +354,18 @@ public void getUrl_with_chained_transformation_options_as_path() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "tr:w-400,h-600:rt-90/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&v=123", is(url)); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:rt-90/default-image.jpg?v=123", is(url)); } - @Test - public void getUrl_with_multiple_query_params_addition_check() { + @org.junit.jupiter.api.Test + public void getUrl_with_multiple_query_params_addition_check() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -306,17 +377,18 @@ public void getUrl_with_multiple_query_params_addition_check() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&q=abc&v=123&z=234&tr=w-400,h-600", is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); } - @Test - public void getUrl_with_double_and_check() { + @org.junit.jupiter.api.Test + public void getUrl_with_double_and_check() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -328,17 +400,18 @@ public void getUrl_with_double_and_check() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&q=abc&v=123&z=234&tr=w-400,h-600", is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); } - @Test - public void getUrl_with_double_question_mark_check() { + @org.junit.jupiter.api.Test + public void getUrl_with_double_question_mark_check() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -350,13 +423,14 @@ public void getUrl_with_double_question_mark_check() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&v=123&z=234&tr=w-400,h-600", is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); } - @Test - public void getUrl_with_src() { - List> transformation = new ArrayList>(); + @org.junit.jupiter.api.Test + public void getUrl_with_src() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -367,17 +441,18 @@ public void getUrl_with_src() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&tr=w-400,h-600", is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?tr=w-400,h-600", is(url)); } - @Test - public void getUrl_src_with_query_params() { + @org.junit.jupiter.api.Test + public void getUrl_src_with_query_params() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); - List> transformation = new ArrayList>(); + List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); scale.put("width", "400"); @@ -389,12 +464,13 @@ public void getUrl_src_with_query_params() { options.put("transformation", transformation); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", is(url)); } - @Test - public void getUrl_src_with_query_params_but_transformationPosition_is_path() { + @org.junit.jupiter.api.Test + public void getUrl_src_with_query_params_but_transformationPosition_is_path() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); Map queryParam = new HashMap<>(); queryParam.put("v", "123"); queryParam.put("z", "234"); @@ -412,8 +488,7 @@ public void getUrl_src_with_query_params_but_transformationPosition_is_path() { options.put("transformationPosition", "path"); String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?ik-sdk-version=" - + Version.VERSION_CODE + "&v=123&z=234&tr=w-400,h-600", is(url)); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); } @Test @@ -515,10 +590,10 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); fileCreateRequest.setUseUniqueFileName(false); fileCreateRequest.setPrivateFile(false); - fileCreateRequest.setOverwriteFile(false); + fileCreateRequest.setOverwriteFile(true); fileCreateRequest.setOverwriteAITags(false); fileCreateRequest.setOverwriteTags(false); - fileCreateRequest.setOverwriteCustomMetadata(false); + fileCreateRequest.setOverwriteCustomMetadata(true); JsonObject jsonObjectCustomMetadata = new JsonObject(); jsonObjectCustomMetadata.addProperty("test1", 10); fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); From 99821be5aa302274594114c66ae002d5543f969e Mon Sep 17 00:00:00 2001 From: Khush Date: Sat, 25 Jun 2022 15:40:55 +0530 Subject: [PATCH 078/112] added changes regarding comments with order of existing doc of PAIs --- README.md | 361 +++++++++++++++++++++++++++--------------------------- 1 file changed, 181 insertions(+), 180 deletions(-) diff --git a/README.md b/README.md index e7798ba..aff9e7a 100644 --- a/README.md +++ b/README.md @@ -445,33 +445,42 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -**3. Get File Metadata** +**3. Get File Versions** + +It Gets the File versions as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-versions). +The argument to the `getFileVersions()` method accepts the fileId for which file has to be get or Fetched the versions. -Accepts the file ID and fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/metadata-api/get-image-metadata-for-uploaded-media-files) ```java -String fileId="your-file-id"; -ResultMetaData result=ImageKit.getInstance().getFileMetadata(fileId); +String fileId = "62a04834c10d49825c6de9e8"; +ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultFileVersions); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultFileVersions.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultFileVersions.getResponseMetaData().getMap()); ``` -Another way to get metadata from a remote file URL as per the [API documentation here](https://docs.imagekit.io/api-reference/metadata-api/get-image-metadata-from-remote-url). This file should be accessible over the ImageKit.io URL-endpoint. +**4. Get File Version details** + +It Gets the File version details as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-version-details). +The argument to the `getFileVersionDetails()` method accepts the fileId and versionId for which file has to be get or Fetched with particular version. + ```java -String url="Remote File URL"; -ResultMetaData result=ImageKit.getInstance().getRemoteFileMetadata(url); +String fileId = "62a04834c10d49825c6de9e8"; +String versionId = "62a04834c10d49825c6de9e8"; +ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); System.out.println("======FINAL RESULT======="); -System.out.println(result); +System.out.println(resultFileVersionDetails); System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); +System.out.println(resultFileVersionDetails.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); +System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); ``` -**4. Update File Details** +**5. Update File Details** It updates the file properties as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/update-file-details). The argument to the `updateDetail()` method is the object of `FileUpdateRequest` class, and the constructor will take the file ID and then set the parameters to be updated. @@ -489,72 +498,8 @@ System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -**5. Delete File** - -Delete a file as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file). The method accepts the file ID of the file that has to be -deleted. - -```java -String fileId="your-file-id"; -Result result=ImageKit.getInstance().deleteFile(fileId); -System.out.println("======FINAL RESULT======="); -System.out.println(result); -System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); -System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); -``` -**6. Delete files (bulk)** - -Delete multiple files as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-files-bulk). The method accepts multiple file ID of the file that has to be -deleted. -```java -List fileIds = new ArrayList<>(); -fileIds.add("your-file-id"); -fileIds.add("your-file-id"); -fileIds.add("your-file-id"); - -ResultFileDelete result=ImageKit.getInstance().bulkDeleteFiles(fileIds); -System.out.println("======FINAL RESULT======="); -System.out.println(result); -System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); -System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); -``` - -**7. Purge Cache** - -Programmatically issue a cache clear request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache). -Accepts the full URL of the file for which the cache has to be cleared. -```java -ResultCache result=ImageKit.getInstance().purgeCache("https://ik.imagekit.io/imagekit-id/default-image.jpg"); -System.out.println("======FINAL RESULT======="); -System.out.println(result); -System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); -System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); -``` - -**8. Purge Cache Status** - -Get the purge cache request status using the request ID returned when a purge cache request gets submitted as pet the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) - -```java -String requestId="cache-requestId"; -ResultCacheStatus result=ImageKit.getInstance().getPurgeCacheStatus(requestId); -System.out.println("======FINAL RESULT======="); -System.out.println(result); -System.out.println("Raw Response:"); -System.out.println(result.getResponseMetaData().getRaw()); -System.out.println("Map Response:"); -System.out.println(result.getResponseMetaData().getMap()); -``` - -**9. Add tags** +**6. Add tags** Add tags using the FileIds and tags which we want to add in request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) @@ -565,7 +510,7 @@ fileIds.add("FileId"); List tags = new ArrayList<>(); tags.add("tag-to-add-1"); tags.add("tag-to-add-2"); -ResultTags resultTags=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "addTags"); +ResultTags resultTags=ImageKit.getInstance().addTags(new TagsRequest(fileIds, tags), "addTags"); System.out.println("======FINAL RESULT======="); System.out.println(resultTags); System.out.println("Raw Response:"); @@ -574,7 +519,7 @@ System.out.println("Map Response:"); System.out.println(resultTags.getResponseMetaData().getMap()); ``` -**10. Remove tags** +**7. Remove tags** Removed tags using the FileIds and tags which we want to remove from request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) @@ -585,7 +530,7 @@ fileIds.add("FileId"); List tags = new ArrayList<>(); tags.add("tag-to-remove-1"); tags.add("tag-to-remove-2"); -ResultTags resultTags=ImageKit.getInstance().manageTags(new TagsRequest(fileIds, tags), "removeTags"); +ResultTags resultTags=ImageKit.getInstance().removeTags(new TagsRequest(fileIds, tags), "removeTags"); System.out.println("======FINAL RESULT======="); System.out.println(resultTags); System.out.println("Raw Response:"); @@ -594,7 +539,7 @@ System.out.println("Map Response:"); System.out.println(resultTags.getResponseMetaData().getMap()); ``` -**11. Remove AI tags** +**8. Remove AI tags** Removed AITags using the FileIds and AITags which we want to remove from request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) @@ -616,53 +561,33 @@ System.out.println("Map Response:"); System.out.println(resultTags.getResponseMetaData().getMap()); ``` -**12. Get CustomMetaDataFields** - -fetches the metadata as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) +**9. Delete File** -```java -ResultCustomMetaDataFieldList resultCustomMetaDataFieldList=ImageKit.getInstance().getCustomMetaDataFields(false); -System.out.println("======FINAL RESULT======="); -System.out.println(resultCustomMetaDataFieldList); -System.out.println("Raw Response:"); -System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getRaw()); -System.out.println("Map Response:"); -System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList()); -System.out.println(resultCustomMetaDataFieldList.getResultCustomMetaDataFields()); -``` - -**13. Create CustomMetaDataFields** - -It creates the CustomMetaDataFields as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). -The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class. +Delete a file as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file). The method accepts the file ID of the file that has to be +deleted. ```java -CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); -schemaObject.setMinValue(10); -schemaObject.setMaxValue(200); -CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -customMetaDataFieldCreateRequest.setName("Name"); -customMetaDataFieldCreateRequest.setLabel("Label"); -customMetaDataFieldCreateRequest.setSchema(schemaObject); -ResultCustomMetaDataField resultCustomMetaDataField=ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); +String fileId="your-file-id"; +Result result=ImageKit.getInstance().deleteFile(fileId); System.out.println("======FINAL RESULT======="); -System.out.println(resultCustomMetaDataField); +System.out.println(result); System.out.println("Raw Response:"); -System.out.println(resultCustomMetaDataField.getResponseMetaData().getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` -**14. Delete CustomMetaDataFields** +**10. Delete FileVersion** -It deletes the CustomMetaDataFields as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/delete-custom-metadata-field). -The argument to the `deleteCustomMetaDataField()` method accepts the id of customMetaDataField which we want to be deleted. +It deletes the FileVersion as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version). +The argument to the `deleteFileVersion()` method accepts the id of file and versionID to delete particular version of the file except current version which we want to be deleted. ```java -ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField("id"); +DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); +deleteFileVersionRequest.setFileId("629d95278482ba129fd17c97"); +deleteFileVersionRequest.setVersionId("629d953ebd24e8ceca911a66"); +ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); System.out.println("======FINAL RESULT======="); System.out.println(resultNoContent); System.out.println("Raw Response:"); @@ -671,50 +596,27 @@ System.out.println("Map Response:"); System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` -**15. Edit CustomMetaDataFields** +**11. Delete files (bulk)** -It edits the CustomMetaDataFields as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). -The argument to the `updateCustomMetaDataFields()` method is the object of `CustomMetaDataFieldUpdateRequest` class. +Delete multiple files as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-files-bulk). The method accepts multiple file ID of the file that has to be +deleted. ```java -CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); -schemaObject.setMinValue(10); -schemaObject.setMaxValue(200); - -CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); -customMetaDataFieldUpdateRequest.setId("id"); -customMetaDataFieldUpdateRequest.setLabel("label"); -customMetaDataFieldUpdateRequest.setSchema(schemaObject); -ResultCustomMetaDataField resultCustomMetaDataField=ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); -System.out.println("======FINAL RESULT======="); -System.out.println(resultCustomMetaDataField); -System.out.println("Raw Response:"); -System.out.println(resultCustomMetaDataField.getResponseMetaData().getRaw()); -System.out.println("Map Response:"); -System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -``` - -**16. Delete FileVersion** - -It deletes the FileVersion as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version). -The argument to the `deleteFileVersion()` method accepts the id of file and versionID to delete particular version of the file except current version which we want to be deleted. +List fileIds = new ArrayList<>(); +fileIds.add("your-file-id"); +fileIds.add("your-file-id"); +fileIds.add("your-file-id"); -```java -DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); -deleteFileVersionRequest.setFileId("629d95278482ba129fd17c97"); -deleteFileVersionRequest.setVersionId("629d953ebd24e8ceca911a66"); -ResultNoContent resultNoContent = ImageKit.getInstance().deleteFileVersion(deleteFileVersionRequest); +ResultFileDelete result=ImageKit.getInstance().bulkDeleteFiles(fileIds); System.out.println("======FINAL RESULT======="); -System.out.println(resultNoContent); +System.out.println(result); System.out.println("Raw Response:"); -System.out.println(resultNoContent.getResponseMetaData().getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(resultNoContent.getResponseMetaData().getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` -**17. Copy file** +**12. Copy file** It Copies the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file). @@ -734,7 +636,7 @@ System.out.println("Map Response:"); System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` -**18. Move file** +**13. Move file** It Moves the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/move-file). @@ -753,7 +655,7 @@ System.out.println("Map Response:"); System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` -**19. Rename file** +**14. Rename file** It Renames the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file). @@ -773,7 +675,7 @@ System.out.println("Map Response:"); System.out.println(resultRenameFile.getResponseMetaData().getMap()); ``` -**20. Create Folder** +**15. Create Folder** It Creates the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder). @@ -792,7 +694,7 @@ System.out.println("Map Response:"); System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); ``` -**21. Delete Folder** +**16. Delete Folder** It Deletes the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder). @@ -810,7 +712,7 @@ System.out.println("Map Response:"); System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` -**22. Copy Folder** +**17. Copy Folder** It Copies the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder). @@ -829,7 +731,7 @@ System.out.println("Map Response:"); System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); ``` -**23. Move Folder** +**18. Move Folder** It Moves the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder). @@ -848,7 +750,7 @@ System.out.println("Map Response:"); System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); ``` -**24. Get Bulk Job Status** +**19. Get Bulk Job Status** It Gets the Job status as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-move-folder-status). @@ -865,41 +767,140 @@ System.out.println("Map Response:"); System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); ``` -**25. Get File Versions** +**20. Purge Cache** -It Gets the File versions as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-versions). -The argument to the `getFileVersions()` method accepts the fileId for which file has to be get or Fetched the versions. +Programmatically issue a cache clear request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache). +Accepts the full URL of the file for which the cache has to be cleared. +```java +ResultCache result=ImageKit.getInstance().purgeCache("https://ik.imagekit.io/imagekit-id/default-image.jpg"); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**21. Purge Cache Status** + +Get the purge cache request status using the request ID returned when a purge cache request gets submitted as pet the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) ```java -String fileId = "62a04834c10d49825c6de9e8"; -ResultFileVersions resultFileVersions = ImageKit.getInstance().getFileVersions(fileId); +String requestId="cache-requestId"; +ResultCacheStatus result=ImageKit.getInstance().getPurgeCacheStatus(requestId); System.out.println("======FINAL RESULT======="); -System.out.println(resultFileVersions); +System.out.println(result); System.out.println("Raw Response:"); -System.out.println(resultFileVersions.getResponseMetaData().getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(resultFileVersions.getResponseMetaData().getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` -**26. Get File Version details** +**22. Get File Metadata** -It Gets the File version details as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-version-details). -The argument to the `getFileVersionDetails()` method accepts the fileId and versionId for which file has to be get or Fetched with particular version. +Accepts the file ID and fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/metadata-api/get-image-metadata-for-uploaded-media-files) +```java +String fileId="your-file-id"; +ResultMetaData result=ImageKit.getInstance().getFileMetadata(fileId); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` +Another way to get metadata from a remote file URL as per the [API documentation here](https://docs.imagekit.io/api-reference/metadata-api/get-image-metadata-from-remote-url). This file should be accessible over the ImageKit.io URL-endpoint. ```java -String fileId = "62a04834c10d49825c6de9e8"; -String versionId = "62a04834c10d49825c6de9e8"; -ResultFileVersionDetails resultFileVersionDetails = ImageKit.getInstance().getFileVersionDetails(fileId, versionId); +String url="Remote File URL"; +ResultMetaData result=ImageKit.getInstance().getRemoteFileMetadata(url); System.out.println("======FINAL RESULT======="); -System.out.println(resultFileVersionDetails); +System.out.println(result); System.out.println("Raw Response:"); -System.out.println(resultFileVersionDetails.getResponseMetaData().getRaw()); +System.out.println(result.getResponseMetaData().getRaw()); System.out.println("Map Response:"); -System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); +System.out.println(result.getResponseMetaData().getMap()); ``` +**23. Create CustomMetaDataFields** + +It creates the CustomMetaDataFields as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). +The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class. + +```java +CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); +schemaObject.setMinValue(10); +schemaObject.setMaxValue(200); +CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +customMetaDataFieldCreateRequest.setName("Name"); +customMetaDataFieldCreateRequest.setLabel("Label"); +customMetaDataFieldCreateRequest.setSchema(schemaObject); +ResultCustomMetaDataField resultCustomMetaDataField=ImageKit.getInstance().createCustomMetaDataFields(customMetaDataFieldCreateRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(resultCustomMetaDataField); +System.out.println("Raw Response:"); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +``` + +**24. Get CustomMetaDataFields** + +fetches the metadata as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) + +```java +ResultCustomMetaDataFieldList resultCustomMetaDataFieldList=ImageKit.getInstance().getCustomMetaDataFields(false); +System.out.println("======FINAL RESULT======="); +System.out.println(resultCustomMetaDataFieldList); +System.out.println("Raw Response:"); +System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList()); +System.out.println(resultCustomMetaDataFieldList.getResultCustomMetaDataFields()); +``` + +**25. Edit CustomMetaDataFields** + +It edits the CustomMetaDataFields as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). +The argument to the `updateCustomMetaDataFields()` method is the object of `CustomMetaDataFieldUpdateRequest` class. + +```java +CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); +schemaObject.setMinValue(10); +schemaObject.setMaxValue(200); + +CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); +customMetaDataFieldUpdateRequest.setId("id"); +customMetaDataFieldUpdateRequest.setLabel("label"); +customMetaDataFieldUpdateRequest.setSchema(schemaObject); +ResultCustomMetaDataField resultCustomMetaDataField=ImageKit.getInstance().updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); +System.out.println("======FINAL RESULT======="); +System.out.println(resultCustomMetaDataField); +System.out.println("Raw Response:"); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +``` + +**26. Delete CustomMetaDataFields** + +It deletes the CustomMetaDataFields as per the +[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/delete-custom-metadata-field). +The argument to the `deleteCustomMetaDataField()` method accepts the id of customMetaDataField which we want to be deleted. + +```java +ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField("id"); +System.out.println("======FINAL RESULT======="); +System.out.println(resultNoContent); +System.out.println("Raw Response:"); +System.out.println(resultNoContent.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(resultNoContent.getResponseMetaData().getMap()); +``` ## Utility functions From 9c577fee546b87b49d27ccc6b9c85f479ed81e58 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 27 Jun 2022 10:34:01 +0530 Subject: [PATCH 079/112] fix test changes --- imagekit-sdk/build.gradle | 1 - .../java/io/imagekit/sdk/ImageKitTest.java | 98 ++++++------------- 2 files changed, 32 insertions(+), 67 deletions(-) diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 0733a47..7db22da 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -26,5 +26,4 @@ dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' testCompile "org.mockito:mockito-all:2.+" testImplementation 'com.squareup.okhttp3:mockwebserver:3.10.0' - testImplementation('org.junit.jupiter:junit-jupiter:5.4.0') } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 2d69fd7..0b35b0d 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -37,12 +37,9 @@ import org.hamcrest.MatcherAssert; import org.junit.Before; import org.junit.Test; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Tag; import java.io.IOException; import java.net.HttpURLConnection; -import java.net.MalformedURLException; import java.net.URL; import java.net.UnknownHostException; import java.util.*; @@ -80,10 +77,8 @@ public void imageKit_configurationTest() { assertEquals(config.toString(), ImageKit.getInstance().getConfig().toString()); } - @org.junit.jupiter.api.Test - public void getUrl_with_height_width_options() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_height_width_options() { List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -98,10 +93,8 @@ public void getUrl_with_height_width_options() throws IOException { assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_height_width_options_url_version_check() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_height_width_options_url_version_check() { List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -114,7 +107,7 @@ public void getUrl_with_height_width_options_url_version_check() throws IOExcept assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test + @Test public void getUrl_with_new_transformation_params_options() throws IOException { SUT = ImageKit.getInstance(); SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); @@ -134,10 +127,8 @@ public void getUrl_with_new_transformation_params_options() throws IOException { assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:myparam-40/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_slash_in_path() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_slash_in_path() { List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -151,10 +142,8 @@ public void getUrl_with_slash_in_path() throws IOException { assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_without_slash_in_path() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_without_slash_in_path() { List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -167,9 +156,8 @@ public void getUrl_without_slash_in_path() throws IOException { assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test + @Test public void getUrl_with_overriding_urlEndpoint() { - SUT = ImageKit.getInstance(); List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -185,9 +173,8 @@ public void getUrl_with_overriding_urlEndpoint() { assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test + @Test public void getUrl_with_transformation_parameters() { - SUT = ImageKit.getInstance(); List> transformation = new ArrayList>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -243,9 +230,8 @@ public void getUrl_with_transformation_parameters() { assertThat("https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,bo-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test + @Test public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { - SUT = ImageKit.getInstance(); List> transformation = new ArrayList>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -261,10 +247,8 @@ public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { assertThat("https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_options_as_query() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_options_as_query() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); @@ -284,10 +268,8 @@ public void getUrl_with_options_as_query() throws IOException { MatcherAssert.assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600", is(url)); } - @org.junit.jupiter.api.Test() - public void getUrl_with_options_as_path() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test() + public void getUrl_with_options_as_path() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); @@ -306,10 +288,8 @@ public void getUrl_with_options_as_path() throws IOException { assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg?v=123", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_chained_transformation_options_as_query() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_chained_transformation_options_as_query() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); @@ -332,10 +312,8 @@ public void getUrl_with_chained_transformation_options_as_query() throws IOExcep assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600:rt-90", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_chained_transformation_options_as_path() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_chained_transformation_options_as_path() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); @@ -357,10 +335,8 @@ public void getUrl_with_chained_transformation_options_as_path() throws IOExcept assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:rt-90/default-image.jpg?v=123", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_multiple_query_params_addition_check() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_multiple_query_params_addition_check() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); @@ -380,10 +356,8 @@ public void getUrl_with_multiple_query_params_addition_check() throws IOExceptio assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_double_and_check() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_double_and_check() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); @@ -403,10 +377,8 @@ public void getUrl_with_double_and_check() throws IOException { assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_double_question_mark_check() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_double_question_mark_check() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); @@ -426,10 +398,8 @@ public void getUrl_with_double_question_mark_check() throws IOException { assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_with_src() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_with_src() { List> transformation = new ArrayList<>(); Map scale = new HashMap<>(); scale.put("height", "600"); @@ -444,10 +414,8 @@ public void getUrl_with_src() throws IOException { assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?tr=w-400,h-600", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_src_with_query_params() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_src_with_query_params() { Map queryParams = new HashMap<>(); queryParams.put("v", "123"); queryParams.put("z", "234"); @@ -467,10 +435,8 @@ public void getUrl_src_with_query_params() throws IOException { assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", is(url)); } - @org.junit.jupiter.api.Test - public void getUrl_src_with_query_params_but_transformationPosition_is_path() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + @Test + public void getUrl_src_with_query_params_but_transformationPosition_is_path() { Map queryParam = new HashMap<>(); queryParam.put("v", "123"); queryParam.put("z", "234"); From fd712c124fa22eecfad991ba4ac330de003ef4ad Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 27 Jun 2022 13:09:52 +0530 Subject: [PATCH 080/112] separated test into small small files --- .../java/io/imagekit/sdk/CalculationTest.java | 70 + .../io/imagekit/sdk/FileOperationTest.java | 228 ++ .../io/imagekit/sdk/FolderOperationTest.java | 206 ++ .../test/java/io/imagekit/sdk/GetUrlTest.java | 472 ++++ .../java/io/imagekit/sdk/ImageKitTest.java | 1914 +---------------- .../java/io/imagekit/sdk/PurgeCacheTest.java | 98 + .../test/java/io/imagekit/sdk/UploadTest.java | 152 ++ .../sdk/manage/CustomMetaDataFieldTest.java | 240 +++ .../java/io/imagekit/sdk/manage/FileTest.java | 326 +++ .../imagekit/sdk/manage/FileVersionTest.java | 213 ++ .../java/io/imagekit/sdk/manage/TagsTest.java | 194 ++ 11 files changed, 2200 insertions(+), 1913 deletions(-) create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java create mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java new file mode 100644 index 0000000..c16d465 --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java @@ -0,0 +1,70 @@ +package io.imagekit.sdk; + +import io.imagekit.sdk.utils.Utils; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class CalculationTest { + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test + public void withoutToken_getAuthenticationParameters_successExpected() { + Map auth = SUT.getAuthenticationParameters(); + assertNotNull(auth); + } + + @Test(expected = RuntimeException.class) + public void withoutPrivateKey_getAuthenticationParameters_successExpected() { + SUT.getConfig().setPrivateKey(null); + Map auth = SUT.getAuthenticationParameters(); + assertNotNull(auth); + } + + @Test + public void withTokenAndExpire_getAuthenticationParameters_successExpected() { + Map auth = SUT.getAuthenticationParameters("your_token", 1582269249); + assertNotNull(auth); + assertEquals("your_token", auth.get("token")); + assertEquals("1582269249", auth.get("expire")); + assertEquals("98598e12a8eec9fedc883df4ae598618aaf24d87", auth.get("signature")); + } + + @Test + public void sameImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); + assertEquals(0, hammingDistance); + } + + @Test + public void similarImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("33699c96619cc69e", "968e978414fe04ea"); + assertEquals(30, hammingDistance); + } + + @Test + public void dissimilarImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518b", "7838873e791f8400"); + assertEquals(37, hammingDistance); + } + + @Test(expected = RuntimeException.class) + public void invalidHash_getHammingDistance_throwException() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518Z", "7838873e791f8400"); + } + + @Test(expected = RuntimeException.class) + public void differentLength_getHammingDistance_throwException() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400"); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java new file mode 100644 index 0000000..8bcce03 --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java @@ -0,0 +1,228 @@ +package io.imagekit.sdk; + +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ConflictException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.models.CopyFileRequest; +import io.imagekit.sdk.models.MoveFileRequest; +import io.imagekit.sdk.models.RenameFileRequest; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +public class FileOperationTest { + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = NotFoundException.class) + public void copyFile_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/sample_image.jpg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No file found with filePath /sample_image.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFile(copyFileRequest); + server.takeRequest(); + } + + @Test + public void copyFile_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/car_false.jpeg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFile(copyFileRequest); + RecordedRequest request = server.takeRequest(); + + String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void moveFile_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); + moveFileRequest.setDestinationPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No file found with filePath /demo1/sample_image_th.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFile(moveFileRequest); + server.takeRequest(); + } + + @Test + public void moveFile_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/new_la.jpg"); + moveFileRequest.setDestinationPath("test"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFile(moveFileRequest); + RecordedRequest request = server.takeRequest(); + + String moveFileRequestJson = "{\"sourceFilePath\":\"/new_la.jpg\",\"destinationPath\":\"test\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/sample_image_th.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + + " \"message\": \"No file found in media library with filePath /sample_image_th.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); + } + + @Test(expected = ConflictException.class) + public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/new1.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(409) + .setBody("{\n" + + " \"message\": \"File with name new_car.jpg already exists at the same location.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FILE_ALREADY_EXISTS\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); + } + + @Test + public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/car_false.jpeg"); + renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + RecordedRequest request = server.takeRequest(); + + String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(renameFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); + } + + @Test(expected = InternalServerException.class) + public void getBulkJobStatus_500_Expected() + throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(500).setBody( + "{\n" + " \"message\": \"We have experienced an internal error while processing your request.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getBulkJobStatus("jobId"); + server.takeRequest(); + } + + @Test + public void getBulkJobStatus_successExpected() + throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" + + " \"type\": \"MOVE_FOLDER\",\n" + " \"status\": \"Completed\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/bulkJobs/629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), + request.getRequestUrl().toString()); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java new file mode 100644 index 0000000..8dffd91 --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java @@ -0,0 +1,206 @@ +package io.imagekit.sdk; + +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.models.CopyFolderRequest; +import io.imagekit.sdk.models.CreateFolderRequest; +import io.imagekit.sdk.models.DeleteFolderRequest; +import io.imagekit.sdk.models.MoveFolderRequest; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +public class FolderOperationTest { + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test + public void createFolder_400_Expected() throws InterruptedException, IOException, UnknownException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("/testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue( + new MockResponse().setBody("{\n" + " \"message\": \"folderName parameter cannot have a slash.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.createFolder(createFolderRequest); + server.takeRequest(); + } + + @Test + public void createFolder_successExpected() throws InterruptedException, IOException, UnknownException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.createFolder(createFolderRequest); + RecordedRequest request = server.takeRequest(); + + String createFolderRequestJson = "{\"folderName\":\"testFolder\",\"parentFolderPath\":\"/\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(createFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void deleteFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("/testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No folder found with folderPath testFolder/\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FOLDER_NOT_FOUND\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFolder(deleteFolderRequest); + server.takeRequest(); + } + + @Test + public void deleteFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFolder(deleteFolderRequest); + RecordedRequest request = server.takeRequest(); + + String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(deleteFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void copyFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/test"); + copyFolderRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + server.takeRequest(); + } + + @Test + public void copyFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/Gallery"); + copyFolderRequest.setIncludeVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + RecordedRequest request = server.takeRequest(); + + String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void moveFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder/"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFolder(moveFolderRequest); + server.takeRequest(); + } + + @Test + public void moveFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFolder(moveFolderRequest); + RecordedRequest request = server.takeRequest(); + + String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java new file mode 100644 index 0000000..2aa7894 --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java @@ -0,0 +1,472 @@ +package io.imagekit.sdk; + +import io.imagekit.sdk.utils.Utils; +import org.hamcrest.MatcherAssert; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class GetUrlTest { + private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern + .compile("(https://.*)\\?ik-s=(.*)&ik-t=(.*)"); + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { + java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl); + assertTrue(actualUrl + " does not look like a signed url", matcher.matches()); + assertEquals(expectedBaseUrl, matcher.group(1)); + assertFalse(matcher.group(2).trim().isEmpty()); + assertFalse(matcher.group(3).trim().isEmpty()); + } + + @Test + public void getUrl_with_height_width_options() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_height_width_options_url_version_check() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_new_transformation_params_options() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map newParams = new HashMap<>(); + newParams.put("myparam", "40"); + transformation.add(newParams); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:myparam-40/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_slash_in_path() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_without_slash_in_path() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map options = new HashMap<>(); + options.put("path", "default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_overriding_urlEndpoint() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_transformation_parameters() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + scale.put("aspectRatio", "4-3"); + scale.put("quality", "40"); + scale.put("crop", "force"); + scale.put("cropMode", "extract"); + scale.put("focus", "left"); + scale.put("format", "png"); + scale.put("radius", "20"); + scale.put("background", "A94D34"); + scale.put("border", "5-A94D34"); + scale.put("rotation", "90"); + scale.put("blur", "10"); + scale.put("named", "any_name"); + scale.put("overlayImage", "/folder/file.jpg"); + scale.put("overlayX", "20"); + scale.put("overlayY", "10"); + scale.put("overlayFocus", "top"); + scale.put("overlayHeight", "20"); + scale.put("overlayWidth", "20"); + scale.put("overlayText", "Image Text"); + scale.put("overlayTextFontSize", "18"); + scale.put("overlayTextFontFamily", "Open Sans"); + scale.put("overlayTextColor", "00FFFF"); + scale.put("overlayAlpha", ""); + scale.put("overlayTextTypography", "b"); + scale.put("overlayBackground", "00AAFF55"); + scale.put("overlayImageTrim", String.valueOf(false)); + scale.put("progressive", String.valueOf(true)); + scale.put("lossless", String.valueOf(true)); + scale.put("trim", "5"); + scale.put("metadata", String.valueOf(true)); + scale.put("colorProfile", String.valueOf(true)); + scale.put("defaultImage", "/folder/file.jpg"); + scale.put("dpr", "3"); + scale.put("effectSharpen", "-"); + scale.put("effectUSM", ""); + scale.put("effectContrast", "1"); + scale.put("effectGray", ""); + scale.put("original", String.valueOf(true)); + scale.put("raw", "w-200,h-200"); + + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,bo-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_options_as_query() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + options.put("transformationPosition", "query"); + + String url = SUT.getUrl(options); + MatcherAssert.assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600", is(url)); + } + + @Test() + public void getUrl_with_options_as_path() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg?v=123", is(url)); + } + + @Test + public void getUrl_with_chained_transformation_options_as_query() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + options.put("transformationPosition", "query"); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600:rt-90", is(url)); + } + + @Test + public void getUrl_with_chained_transformation_options_as_path() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:rt-90/default-image.jpg?v=123", is(url)); + } + + @Test + public void getUrl_with_multiple_query_params_addition_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_double_and_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&&"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_double_question_mark_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg??"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_src() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_src_with_query_params() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_src_with_query_params_but_transformationPosition_is_path() { + Map queryParam = new HashMap<>(); + queryParam.put("v", "123"); + queryParam.put("z", "234"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("queryParameters", queryParam); + options.put("transformation", transformation); + options.put("transformationPosition", "path"); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_with_signature() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("width", "100"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/test-signed-url.png"); + options.put("transformation", transformation); + options.put("signed", true); + options.put("expireSeconds", 1000); + + String url = SUT.getUrl(options); + + assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); + } + + @Test + public void getUrl_with_signature_src_noTransform() { + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("transformation", Collections.emptyList()); + options.put("signed", true); + options.put("expireSeconds", 1000); + + String url = SUT.getUrl(options); + + assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url); + } + + @Test + public void getUrl_with_time_expire() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + options.put("expireSeconds", 100); + options.put("signed", true); + + String url = SUT.getUrl(options); + assertTrue(url.contains("ik-t")); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 0b35b0d..1d5ac4e 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -1,71 +1,11 @@ package io.imagekit.sdk; import io.imagekit.sdk.config.Configuration; -import io.imagekit.sdk.constants.Version; -import io.imagekit.sdk.exceptions.BadRequestException; -import io.imagekit.sdk.exceptions.ConflictException; -import io.imagekit.sdk.exceptions.ForbiddenException; -import io.imagekit.sdk.exceptions.InternalServerException; -import io.imagekit.sdk.exceptions.NotFoundException; -import io.imagekit.sdk.exceptions.PartialSuccessException; -import io.imagekit.sdk.exceptions.TooManyRequestsException; -import io.imagekit.sdk.exceptions.UnauthorizedException; -import io.imagekit.sdk.exceptions.UnknownException; -import io.imagekit.sdk.models.AITagsRequest; -import io.imagekit.sdk.models.CopyFileRequest; -import io.imagekit.sdk.models.CopyFolderRequest; -import io.imagekit.sdk.models.CreateFolderRequest; -import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; -import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; -import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; -import io.imagekit.sdk.models.CustomMetaDataTypeEnum; -import io.imagekit.sdk.models.DeleteFileVersionRequest; -import io.imagekit.sdk.models.DeleteFolderRequest; -import io.imagekit.sdk.models.FileCreateRequest; -import io.imagekit.sdk.models.FileUpdateRequest; -import io.imagekit.sdk.models.MoveFileRequest; -import io.imagekit.sdk.models.MoveFolderRequest; -import io.imagekit.sdk.models.RenameFileRequest; -import io.imagekit.sdk.models.TagsRequest; -import io.imagekit.sdk.models.results.*; -import io.imagekit.sdk.tasks.RestClient; -import io.imagekit.sdk.utils.Utils; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; - -import org.hamcrest.MatcherAssert; -import org.junit.Before; import org.junit.Test; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.UnknownHostException; -import java.util.*; -import java.util.regex.Pattern; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; +import static org.junit.Assert.assertEquals; public class ImageKitTest { - private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern - .compile("(https://.*)\\?ik-s=(.*)&ik-t=(.*)"); - - private ImageKit SUT; - - RestClient restClient; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - restClient = new RestClient(SUT); - SUT.setRestClient(restClient); - } @Test public void imageKit_configurationTest() { @@ -77,1856 +17,4 @@ public void imageKit_configurationTest() { assertEquals(config.toString(), ImageKit.getInstance().getConfig().toString()); } - @Test - public void getUrl_with_height_width_options() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_height_width_options_url_version_check() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_new_transformation_params_options() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map newParams = new HashMap<>(); - newParams.put("myparam", "40"); - transformation.add(newParams); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:myparam-40/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_slash_in_path() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_without_slash_in_path() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map options = new HashMap<>(); - options.put("path", "default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_overriding_urlEndpoint() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_transformation_parameters() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - scale.put("aspectRatio", "4-3"); - scale.put("quality", "40"); - scale.put("crop", "force"); - scale.put("cropMode", "extract"); - scale.put("focus", "left"); - scale.put("format", "png"); - scale.put("radius", "20"); - scale.put("background", "A94D34"); - scale.put("border", "5-A94D34"); - scale.put("rotation", "90"); - scale.put("blur", "10"); - scale.put("named", "any_name"); - scale.put("overlayImage", "/folder/file.jpg"); - scale.put("overlayX", "20"); - scale.put("overlayY", "10"); - scale.put("overlayFocus", "top"); - scale.put("overlayHeight", "20"); - scale.put("overlayWidth", "20"); - scale.put("overlayText", "Image Text"); - scale.put("overlayTextFontSize", "18"); - scale.put("overlayTextFontFamily", "Open Sans"); - scale.put("overlayTextColor", "00FFFF"); - scale.put("overlayAlpha", ""); - scale.put("overlayTextTypography", "b"); - scale.put("overlayBackground", "00AAFF55"); - scale.put("overlayImageTrim", String.valueOf(false)); - scale.put("progressive", String.valueOf(true)); - scale.put("lossless", String.valueOf(true)); - scale.put("trim", "5"); - scale.put("metadata", String.valueOf(true)); - scale.put("colorProfile", String.valueOf(true)); - scale.put("defaultImage", "/folder/file.jpg"); - scale.put("dpr", "3"); - scale.put("effectSharpen", "-"); - scale.put("effectUSM", ""); - scale.put("effectContrast", "1"); - scale.put("effectGray", ""); - scale.put("original", String.valueOf(true)); - scale.put("raw", "w-200,h-200"); - - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,bo-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_options_as_query() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - options.put("transformationPosition", "query"); - - String url = SUT.getUrl(options); - MatcherAssert.assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600", is(url)); - } - - @Test() - public void getUrl_with_options_as_path() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg?v=123", is(url)); - } - - @Test - public void getUrl_with_chained_transformation_options_as_query() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map rotate = new HashMap<>(); - rotate.put("rotation", "90"); - transformation.add(rotate); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - options.put("transformationPosition", "query"); - - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600:rt-90", is(url)); - } - - @Test - public void getUrl_with_chained_transformation_options_as_path() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map rotate = new HashMap<>(); - rotate.put("rotation", "90"); - transformation.add(rotate); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:rt-90/default-image.jpg?v=123", is(url)); - } - - @Test - public void getUrl_with_multiple_query_params_addition_check() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_double_and_check() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&&"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_double_question_mark_check() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg??"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_src() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_src_with_query_params() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_src_with_query_params_but_transformationPosition_is_path() { - Map queryParam = new HashMap<>(); - queryParam.put("v", "123"); - queryParam.put("z", "234"); - - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("queryParameters", queryParam); - options.put("transformation", transformation); - options.put("transformationPosition", "path"); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_signature() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("width", "100"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/test-signed-url.png"); - options.put("transformation", transformation); - options.put("signed", true); - options.put("expireSeconds", 1000); - - String url = SUT.getUrl(options); - - assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); - } - - @Test - public void getUrl_with_signature_src_noTransform() { - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("transformation", Collections.emptyList()); - options.put("signed", true); - options.put("expireSeconds", 1000); - - String url = SUT.getUrl(options); - - assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url); - } - - @Test - public void getUrl_with_time_expire() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map rotate = new HashMap<>(); - rotate.put("rotation", "90"); - transformation.add(rotate); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - options.put("expireSeconds", 100); - options.put("signed", true); - - String url = SUT.getUrl(options); - assertTrue(url.contains("ik-t")); - } - - // Test Case for Upload - - @Test(expected = UnknownHostException.class) - public void imageKit_upload_expect_UnknownHostException() throws IOException { - String imageUrl = "https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; - URL url = new URL(imageUrl); - HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); - urlConnect.getContent(); - } - - @Test - public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, - BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url = new URL(imageUrl); - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileCreateRequest.setTags(tags); - fileCreateRequest.setFolder("demo1"); - String customCoordinates = "10,10,20,20"; - fileCreateRequest.setCustomCoordinates(customCoordinates); - - List responseFields = new ArrayList<>(); - responseFields.add("thumbnail"); - responseFields.add("tags"); - responseFields.add("customCoordinates"); - - fileCreateRequest.setResponseFields(responseFields); - JsonObject optionsInnerObject = new JsonObject(); - optionsInnerObject.addProperty("add_shadow", true); - JsonObject innerObject1 = new JsonObject(); - innerObject1.addProperty("name", "remove-bg"); - innerObject1.add("options", optionsInnerObject); - JsonObject innerObject2 = new JsonObject(); - innerObject2.addProperty("name", "google-auto-tagging"); - innerObject2.addProperty("minConfidence", 10); - innerObject2.addProperty("maxTags", 5); - JsonArray jsonArray = new JsonArray(); - jsonArray.add(innerObject1); - jsonArray.add(innerObject2); - fileCreateRequest.setExtensions(jsonArray); - fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); - fileCreateRequest.setUseUniqueFileName(false); - fileCreateRequest.setPrivateFile(false); - fileCreateRequest.setOverwriteFile(true); - fileCreateRequest.setOverwriteAITags(false); - fileCreateRequest.setOverwriteTags(false); - fileCreateRequest.setOverwriteCustomMetadata(true); - JsonObject jsonObjectCustomMetadata = new JsonObject(); - jsonObjectCustomMetadata.addProperty("test1", 10); - fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"fileId\": \"62a465d245a84a0ef3852968\",\n" - + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + " \"size\": 23023,\n" - + " \"versionInfo\": {\n" + " \"id\": \"62a465d245a84a0ef3852968\",\n" - + " \"name\": \"Version 1\"\n" + " },\n" - + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"height\": 354,\n" + " \"width\": 236,\n" - + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"AITags\": [\n" + " {\n" + " \"name\": \"Clothing\",\n" - + " \"confidence\": 98.77,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Plant\",\n" - + " \"confidence\": 96.51,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Smile\",\n" - + " \"confidence\": 95.31,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Shoe\",\n" - + " \"confidence\": 95.2,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Street light\",\n" - + " \"confidence\": 91.05,\n" + " \"source\": \"google-auto-tagging\"\n" - + " }\n" + " ],\n" + " \"extensionStatus\": {\n" + " \"remove-bg\": \"pending\",\n" - + " \"google-auto-tagging\": \"success\"\n" + " }\n" + "}")); - server.start(); - RestClient.UPLOAD_BASE_URL = server.url("/").toString(); - SUT.upload(fileCreateRequest); - RecordedRequest request = server.takeRequest(); - String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" - + "Content-Length: 53\r\n" + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"fileName\"\r\n" - + "Content-Length: 20\r\n" + "\r\n" + "sample-cat-image.png\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" - + "false\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"tags\"\r\n" + "Content-Length: 27\r\n" + "\r\n" - + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + "Content-Length: 11\r\n" + "\r\n" - + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" - + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + "Content-Length: 4\r\n" - + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" - + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" - + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" - + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; - assertEquals(json, request.getBody().readUtf8().trim()); - assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void imageKit_updateDetails_expected_404() - throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.updateFileDetail(fileUpdateRequest); - server.takeRequest(); - } - - @Test - public void imageKit_updateDetails_returnTrue() - throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" - + " \"name\": \"new_car.jpg\",\n" + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" - + " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" - + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"tags\": [\n" + " \"tagg\",\n" - + " \"tagg1\"\n" + " ],\n" + " \"AITags\": null,\n" + " \"versionInfo\": {\n" - + " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"name\": \"Version 1\"\n" + " },\n" - + " \"embeddedMetadata\": {\n" + " \"XResolution\": 250,\n" - + " \"YResolution\": 250,\n" + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" - + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + " },\n" - + " \"customCoordinates\": \"10,10,20,20\",\n" + " \"customMetadata\": {\n" - + " \"test100\": 10\n" + " },\n" + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/new_car.jpg\",\n" + " \"height\": 354,\n" - + " \"width\": 236,\n" + " \"size\": 23023,\n" + " \"hasAlpha\": false,\n" - + " \"mime\": \"image/jpeg\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileUpdateRequest.setTags(tags); - - SUT.updateFileDetail(fileUpdateRequest); - RecordedRequest request = server.takeRequest(); - - String requestJson = "{\"fileId\":\"62a9c3ccd875ec6fd658c854\",\"tags\":[\"Software\",\"Developer\",\"Engineer\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(requestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PATCH /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), - request.getRequestUrl().toString()); - } - - @Test - public void imageKit_getFileList_returnList() - throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, IOException { - - MockWebServer server = new MockWebServer(); - String responseJson = "[\n" + " {\n" + " \"type\": \"file\",\n" - + " \"name\": \"default-image.jpg\",\n" - + " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" - + " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" - + " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + " \"tags\": null,\n" - + " \"AITags\": null,\n" + " \"versionInfo\": {\n" - + " \"id\": \"62a4439bce686814dfcce65c\",\n" + " \"name\": \"Version 1\"\n" - + " },\n" + " \"embeddedMetadata\": {\n" - + " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" - + " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + " },\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/default-image.jpg\",\n" - + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" - + " \"hasAlpha\": false,\n" + " \"mime\": \"image/jpeg\"\n" + " }\n" + "]"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - Map options = new HashMap<>(); - options.put("limit", "" + 1); - SUT.getFileList(options); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files?limit=1 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files?limit=1"), request.getRequestUrl().toString()); - - } - - @Test(expected = NotFoundException.class) - public void imageKit_getFileDetail__expected_404() - throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileDetail("629f3de17eb0fe4053615450"); - - server.takeRequest(); - } - - @Test - public void imageKit_getFileDetail_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"type\": \"file\",\n" + " \"name\": \"sample-image11_g1Qv0wpqP.jpg\",\n" - + " \"createdAt\": \"2022-06-20T05:00:41.830Z\",\n" - + " \"updatedAt\": \"2022-06-20T05:00:43.263Z\",\n" - + " \"fileId\": \"62affef97db937b028f3b47a\",\n" + " \"tags\": [\n" + " \"Software\",\n" - + " \"Developer\",\n" + " \"Engineer\"\n" + " ],\n" + " \"AITags\": null,\n" - + " \"versionInfo\": {\n" + " \"id\": \"62affef97db937b028f3b47a\",\n" - + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {},\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/demo/img/static-file-1.png\",\n" - + " \"fileType\": \"non-image\",\n" + " \"filePath\": \"/sample-image11_g1Qv0wpqP.jpg\",\n" - + " \"size\": 169170\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileDetail("62affef97db937b028f3b47a"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/62affef97db937b028f3b47a/details HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a/details"), - request.getRequestUrl().toString()); - } - - @Test - public void imageKit_getFileMetaData_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" - + " \"format\": \"jpg\",\n" + " \"hasColorProfile\": false,\n" + " \"quality\": 0,\n" - + " \"density\": 72,\n" + " \"hasTransparency\": false,\n" + " \"exif\": {},\n" - + " \"pHash\": \"e0d52b612ad538f6\"\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getRemoteFileMetadata("https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg"), - request.getRequestUrl().toString()); - - } - - @Test(expected = NotFoundException.class) - public void imageKit_getRemoteFileMetaData_404_Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getRemoteFileMetadata("remote_url"); - - server.takeRequest(); - } - - @Test(expected = NotFoundException.class) - public void imageKit_deleteFile_404_Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFile("629f3de17eb0fe4053615450"); - - server.takeRequest(); - } - - @Test - public void imageKit_deleteFile_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = ""; - server.enqueue(new MockResponse().setResponseCode(204).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFile("62affef97db937b028f3b47a"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/files/62affef97db937b028f3b47a HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a"), - request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, - InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, - BadRequestException, UnknownException, IOException, InterruptedException { - List fileIds = new ArrayList<>(); - fileIds.add("file_id_1"); - fileIds.add("file_id_2"); - fileIds.add("file_id_3"); - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.bulkDeleteFiles(fileIds); - - server.takeRequest(); - } - - @Test - public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, - InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, - BadRequestException, UnknownException, IOException, InterruptedException { - List fileIds = new ArrayList<>(); - fileIds.add("62ad9ece7db937e35ef18dda"); - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"successfullyDeletedFileIds\": [\n" - + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.bulkDeleteFiles(fileIds); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("{\"fileIds\":[\"62ad9ece7db937e35ef18dda\"]}", utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/batch/deleteByFileIds HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/batch/deleteByFileIds"), - request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void imageKit_purgeCache_404Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"Invalid url\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.purgeCache("url"); - - server.takeRequest(); - } - - @Test - public void imageKit_purgeCache_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.purgeCache("https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("{\"url\":\"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\"}", utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/purge HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge"), request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void imageKit_getPurgeCacheStatus_400Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"No request found for this requestId.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0b"); - - server.takeRequest(); - } - - @Test - public void imageKit_getPurgeCacheStatus_successExpected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"status\": \"Completed\"\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0a"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/purge/62b01f15214dfbdf3692dd0a HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge/62b01f15214dfbdf3692dd0a"), - request.getRequestUrl().toString()); - } - - @Test - public void withoutToken_getAuthenticationParameters_successExpected() { - Map auth = SUT.getAuthenticationParameters(); - assertNotNull(auth); - } - - @Test(expected = RuntimeException.class) - public void withoutPrivateKey_getAuthenticationParameters_successExpected() { - SUT.getConfig().setPrivateKey(null); - Map auth = SUT.getAuthenticationParameters(); - assertNotNull(auth); - } - - @Test - public void withTokenAndExpire_getAuthenticationParameters_successExpected() { - Map auth = SUT.getAuthenticationParameters("your_token", 1582269249); - assertNotNull(auth); - assertEquals("your_token", auth.get("token")); - assertEquals("1582269249", auth.get("expire")); - assertEquals("e71bcd6031016b060d349d212e23e85c791decdd", auth.get("signature")); - } - - @Test - public void sameImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); - assertEquals(0, hammingDistance); - } - - @Test - public void similarImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("33699c96619cc69e", "968e978414fe04ea"); - assertEquals(30, hammingDistance); - } - - @Test - public void dissimilarImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518b", "7838873e791f8400"); - assertEquals(37, hammingDistance); - } - - @Test(expected = RuntimeException.class) - public void invalidHash_getHammingDistance_throwException() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518Z", "7838873e791f8400"); - } - - @Test(expected = RuntimeException.class) - public void differentLength_getHammingDistance_throwException() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400"); - } - - private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { - java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl); - assertTrue(actualUrl + " does not look like a signed url", matcher.matches()); - assertEquals(expectedBaseUrl, matcher.group(1)); - assertEquals(Version.VERSION_CODE, matcher.group(2)); - assertFalse(matcher.group(3).trim().isEmpty()); - assertFalse(matcher.group(4).trim().isEmpty()); - } - - @Test(expected = NotFoundException.class) - public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.addTags(tagsRequest); - - server.takeRequest(); - } - - @Test - public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.addTags(tagsRequest); - RecordedRequest request = server.takeRequest(); - - String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag1"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeTags(tagsRequest); - server.takeRequest(); - } - - @Test - public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeTags(tagsRequest); - RecordedRequest request = server.takeRequest(); - - String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); - } - - @Test - public void get_custom_metadata_fields_expectedSuccessWith() - throws IOException, InterruptedException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" - + " \"name\": \"price\",\n" + " \"label\": \"Amount\",\n" + " \"schema\": {\n" - + " \"minValue\": 10,\n" + " \"maxValue\": 200,\n" - + " \"type\": \"Number\"\n" + " }\n" + " },\n" + " {\n" - + " \"id\": \"6296f91191fa57ccc36b15cf\",\n" + " \"name\": \"Amount2\",\n" - + " \"label\": \"Amouunt\",\n" + " \"schema\": {\n" - + " \"type\": \"Number\",\n" + " \"minValue\": 10,\n" - + " \"maxValue\": 1000\n" + " }\n" + " }\n" + "]")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getCustomMetaDataFields(false); - RecordedRequest request = server.takeRequest(); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/customMetadataFields?includeDeleted=false HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), - request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void createCustomMetaDataFields_expected_400() - throws InterruptedException, IOException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"errors\": {\n" - + " \"minValue\": \"not allowed for this type\",\n" - + " \"maxValue\": \"not allowed for this type\"\n" + " }\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("mockName"); - customMetaDataFieldCreateRequest.setLabel("mockLabel"); - customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - ResultCustomMetaDataField resultCustomMetaDataField = SUT - .createCustomMetaDataFields(customMetaDataFieldCreateRequest); - RecordedRequest request = server.takeRequest(); - String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); - assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); - } - - @Test - public void createCustomMetaDataFields_successExpected() - throws InterruptedException, IOException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" - + " \"name\": \"test1\",\n" + " \"label\": \"test1\",\n" + " \"schema\": {\n" - + " \"type\": \"Number\",\n" + " \"isValueRequired\": false,\n" - + " \"minValue\": 10,\n" + " \"maxValue\": 1000\n" + " }\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("mockName"); - customMetaDataFieldCreateRequest.setLabel("mockLabel"); - customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - RecordedRequest request = server.takeRequest(); - - String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void deleteCustomMetaDataField_404_Expected() - throws IOException, InterruptedException, NotFoundException, UnknownException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - SUT.deleteCustomMetaDataField("6296fd7091fa5768106b808E"); - server.takeRequest(); - } - - @Test - public void deleteCustomMetaDataField_successExpected() - throws IOException, InterruptedException, NotFoundException, UnknownException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); - RecordedRequest request = server.takeRequest(); - - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), - request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void updateCustomMetaDataFields_404_Expected() - throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setMinLength(10); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808E"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - server.takeRequest(); - } - - @Test(expected = BadRequestException.class) - public void updateCustomMetaDataFields_400_Expected() - throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400) - .setBody("{\n" + " \"message\": \"Invalid schema object\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"errors\": {\n" + " \"minLength\": \"not allowed for this type\"\n" + " }\n" - + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setMinLength(10); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - server.takeRequest(); - } - - @Test - public void updateCustomMetaDataFields_successExpected() - throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse() - .setBody("{\n" + " \"id\": \"6296fd7091fa5768106b808d\",\n" + " \"name\": \"Amount3\",\n" - + " \"label\": \"testPrices\",\n" + " \"schema\": {\n" + " \"minValue\": 0,\n" - + " \"maxValue\": 10,\n" + " \"type\": \"Number\"\n" + " }\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - RecordedRequest request = server.takeRequest(); - - String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), - request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List aiTags = new ArrayList<>(); - aiTags.add("Font"); - - AITagsRequest aiTagsRequest = new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeAITags(aiTagsRequest); - server.takeRequest(); - } - - @Test - public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List aiTags = new ArrayList<>(); - aiTags.add("Font"); - - AITagsRequest aiTagsRequest = new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeAITags(aiTagsRequest); - RecordedRequest request = server.takeRequest(); - - String aiTagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"AITags\":[\"Font\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(aiTagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void copyFile_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/sample_image.jpg"); - copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No file found with filePath /sample_image.jpg\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFile(copyFileRequest); - server.takeRequest(); - } - - @Test - public void copyFile_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/car_false.jpeg"); - copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFile(copyFileRequest); - RecordedRequest request = server.takeRequest(); - - String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void moveFile_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); - moveFileRequest.setDestinationPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No file found with filePath /demo1/sample_image_th.jpg\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFile(moveFileRequest); - server.takeRequest(); - } - - @Test - public void moveFile_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/new_la.jpg"); - moveFileRequest.setDestinationPath("test"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFile(moveFileRequest); - RecordedRequest request = server.takeRequest(); - - String moveFileRequestJson = "{\"sourceFilePath\":\"/new_la.jpg\",\"destinationPath\":\"test\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/sample_image_th.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" - + " \"message\": \"No file found in media library with filePath /sample_image_th.jpg\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"FILE_MISSING\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - server.takeRequest(); - } - - @Test(expected = ConflictException.class) - public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/new1.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(409) - .setBody("{\n" - + " \"message\": \"File with name new_car.jpg already exists at the same location.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"FILE_ALREADY_EXISTS\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - server.takeRequest(); - } - - @Test - public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/car_false.jpeg"); - renameFileRequest.setNewFileName("new_car.jpeg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - RecordedRequest request = server.takeRequest(); - - String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(renameFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); - } - - @Test - public void createFolder_400_Expected() throws InterruptedException, IOException, UnknownException { - - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("/testFolder"); - createFolderRequest.setParentFolderPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue( - new MockResponse().setBody("{\n" + " \"message\": \"folderName parameter cannot have a slash.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.createFolder(createFolderRequest); - server.takeRequest(); - } - - @Test - public void createFolder_successExpected() throws InterruptedException, IOException, UnknownException { - - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("testFolder"); - createFolderRequest.setParentFolderPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.createFolder(createFolderRequest); - RecordedRequest request = server.takeRequest(); - - String createFolderRequestJson = "{\"folderName\":\"testFolder\",\"parentFolderPath\":\"/\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(createFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void deleteFolder_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath("/testFolder"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No folder found with folderPath testFolder/\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"FOLDER_NOT_FOUND\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFolder(deleteFolderRequest); - server.takeRequest(); - } - - @Test - public void deleteFolder_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath("testFolder"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFolder(deleteFolderRequest); - RecordedRequest request = server.takeRequest(); - - String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(deleteFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void copyFolder_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/testFolder"); - copyFolderRequest.setDestinationPath("/test"); - copyFolderRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFolder(copyFolderRequest); - server.takeRequest(); - } - - @Test - public void copyFolder_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/testFolder"); - copyFolderRequest.setDestinationPath("/Gallery"); - copyFolderRequest.setIncludeVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFolder(copyFolderRequest); - RecordedRequest request = server.takeRequest(); - - String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void moveFolder_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/testFolder/"); - moveFolderRequest.setDestinationPath("/Gallery"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFolder(moveFolderRequest); - server.takeRequest(); - } - - @Test - public void moveFolder_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/testFolder"); - moveFolderRequest.setDestinationPath("/Gallery"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFolder(moveFolderRequest); - RecordedRequest request = server.takeRequest(); - - String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); - } - - @Test - public void getBulkJobStatus_500_Expected() - throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(500)); - server.enqueue(new MockResponse().setBody( - "{\n" + " \"message\": \"We have experienced an internal error while processing your request.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - ResultBulkJobStatus resultBulkJobStatus = SUT.getBulkJobStatus("jobId"); - RecordedRequest request = server.takeRequest(); - - assertEquals(500, resultBulkJobStatus.getResponseMetaData().getHttpStatusCode()); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/bulkJobs/jobId HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/jobId"), request.getRequestUrl().toString()); - } - - @Test - public void getBulkJobStatus_successExpected() - throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" - + " \"type\": \"MOVE_FOLDER\",\n" + " \"status\": \"Completed\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/bulkJobs/629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), - request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void getFileVersions_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersions("id"); - server.takeRequest(); - } - - @Test - public void getFileVersions_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" - + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" - + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" - + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" - + " \"tag10\"\n" + " ],\n" + " \"AITags\": [\n" + " {\n" - + " \"name\": \"Colorfulness\",\n" + " \"confidence\": 96.19,\n" - + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" - + " \"name\": \"Purple\",\n" + " \"confidence\": 86.05,\n" - + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" - + " \"name\": \"Violet\",\n" + " \"confidence\": 81.08,\n" - + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" - + " \"name\": \"Rectangle\",\n" + " \"confidence\": 80.99,\n" - + " \"source\": \"google-auto-tagging\"\n" + " }\n" + " ],\n" - + " \"versionInfo\": {\n" + " \"id\": \"629f3de17eb0fe4053615450\",\n" - + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {\n" - + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + " \"ImageWidth\": 1006,\n" - + " \"ImageHeight\": 467,\n" - + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" - + " \"height\": 467,\n" + " \"width\": 1006,\n" + " \"size\": 47579,\n" - + " \"hasAlpha\": true,\n" + " \"mime\": \"image/png\"\n" + " }\n" + "]")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersions("629f3de17eb0fe4053615450"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), - request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void getFileVersionDetails_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); - server.takeRequest(); - } - - @Test - public void getFileVersionDetails_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" - + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" - + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" - + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + " \"tag10\"\n" - + " ],\n" + " \"AITags\": [\n" + " {\n" + " \"name\": \"Colorfulness\",\n" - + " \"confidence\": 96.19,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Purple\",\n" - + " \"confidence\": 86.05,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Violet\",\n" - + " \"confidence\": 81.08,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Rectangle\",\n" - + " \"confidence\": 80.99,\n" + " \"source\": \"google-auto-tagging\"\n" - + " }\n" + " ],\n" + " \"versionInfo\": {\n" - + " \"id\": \"629f3de17eb0fe4053615450\",\n" + " \"name\": \"Version 1\"\n" + " },\n" - + " \"embeddedMetadata\": {\n" + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" - + " \"ImageWidth\": 1006,\n" + " \"ImageHeight\": 467,\n" - + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + " \"height\": 467,\n" - + " \"width\": 1006,\n" + " \"size\": 47579,\n" + " \"hasAlpha\": true,\n" - + " \"mime\": \"image/png\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), - request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void deleteFileVersion_400_SuccessWith() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("id"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400) - .setBody("{\n" + " \"message\": \"Your request contains invalid versionId parameter.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - server.takeRequest(); - } - - @Test(expected = NotFoundException.class) - public void deleteFileVersion_404_SuccessWith() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("62a9c403d89eedb81721102b"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested file version does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - server.takeRequest(); - } - - @Test - public void deleteFileVersion_expectedSuccessWith() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - RecordedRequest request = server.takeRequest(); - - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2 HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), - request.getRequestUrl().toString()); - } - } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java new file mode 100644 index 0000000..0cc7a9b --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java @@ -0,0 +1,98 @@ +package io.imagekit.sdk; + +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +public class PurgeCacheTest { + + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = BadRequestException.class) + public void imageKit_purgeCache_404Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Invalid url\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.purgeCache("url"); + + server.takeRequest(); + } + + @Test + public void imageKit_purgeCache_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.purgeCache("https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("{\"url\":\"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\"}", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/purge HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge"), request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void imageKit_getPurgeCacheStatus_400Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"No request found for this requestId.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0b"); + + server.takeRequest(); + } + + @Test + public void imageKit_getPurgeCacheStatus_successExpected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"status\": \"Completed\"\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/purge/62b01f15214dfbdf3692dd0a HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge/62b01f15214dfbdf3692dd0a"), + request.getRequestUrl().toString()); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java new file mode 100644 index 0000000..a0f7c04 --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java @@ -0,0 +1,152 @@ +package io.imagekit.sdk; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.models.FileCreateRequest; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class UploadTest { + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = UnknownHostException.class) + public void imageKit_upload_expect_UnknownHostException() throws IOException { + String imageUrl = "https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; + URL url = new URL(imageUrl); + HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); + urlConnect.getContent(); + } + + @Test + public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, + BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; + URL url = new URL(imageUrl); + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + fileCreateRequest.setFolder("demo1"); + String customCoordinates = "10,10,20,20"; + fileCreateRequest.setCustomCoordinates(customCoordinates); + + List responseFields = new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); + + fileCreateRequest.setResponseFields(responseFields); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 10); + innerObject2.addProperty("maxTags", 5); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + fileCreateRequest.setUseUniqueFileName(false); + fileCreateRequest.setPrivateFile(false); + fileCreateRequest.setOverwriteFile(true); + fileCreateRequest.setOverwriteAITags(false); + fileCreateRequest.setOverwriteTags(false); + fileCreateRequest.setOverwriteCustomMetadata(true); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"fileId\": \"62a465d245a84a0ef3852968\",\n" + + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + " \"size\": 23023,\n" + + " \"versionInfo\": {\n" + " \"id\": \"62a465d245a84a0ef3852968\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"height\": 354,\n" + " \"width\": 236,\n" + + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"AITags\": [\n" + " {\n" + " \"name\": \"Clothing\",\n" + + " \"confidence\": 98.77,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Plant\",\n" + + " \"confidence\": 96.51,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Smile\",\n" + + " \"confidence\": 95.31,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Shoe\",\n" + + " \"confidence\": 95.2,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Street light\",\n" + + " \"confidence\": 91.05,\n" + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + " ],\n" + " \"extensionStatus\": {\n" + " \"remove-bg\": \"pending\",\n" + + " \"google-auto-tagging\": \"success\"\n" + " }\n" + "}")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + RecordedRequest request = server.takeRequest(); + String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" + + "Content-Length: 53\r\n" + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"fileName\"\r\n" + + "Content-Length: 20\r\n" + "\r\n" + "sample-cat-image.png\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + + "false\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"tags\"\r\n" + "Content-Length: 27\r\n" + "\r\n" + + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + "Content-Length: 11\r\n" + "\r\n" + + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" + + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "false\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "false\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + "Content-Length: 4\r\n" + + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" + + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" + + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; + System.out.println("request.getBody().readUtf8().trim():->" + request.getBody().readUtf8().trim()); + assertEquals(json, request.getBody().readUtf8().trim()); + assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); + } + +} \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java new file mode 100644 index 0000000..276bcb5 --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java @@ -0,0 +1,240 @@ +package io.imagekit.sdk.manage; + +import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.ImageKitTest; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.models.CustomMetaDataFieldCreateRequest; +import io.imagekit.sdk.models.CustomMetaDataFieldSchemaObject; +import io.imagekit.sdk.models.CustomMetaDataFieldUpdateRequest; +import io.imagekit.sdk.models.CustomMetaDataTypeEnum; +import io.imagekit.sdk.models.results.ResultCustomMetaDataField; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +public class CustomMetaDataFieldTest { + + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test + public void get_custom_metadata_fields_expectedSuccessWith() + throws IOException, InterruptedException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" + + " \"name\": \"price\",\n" + " \"label\": \"Amount\",\n" + " \"schema\": {\n" + + " \"minValue\": 10,\n" + " \"maxValue\": 200,\n" + + " \"type\": \"Number\"\n" + " }\n" + " },\n" + " {\n" + + " \"id\": \"6296f91191fa57ccc36b15cf\",\n" + " \"name\": \"Amount2\",\n" + + " \"label\": \"Amouunt\",\n" + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + " \"minValue\": 10,\n" + + " \"maxValue\": 1000\n" + " }\n" + " }\n" + "]")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getCustomMetaDataFields(false); + RecordedRequest request = server.takeRequest(); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/customMetadataFields?includeDeleted=false HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), + request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void createCustomMetaDataFields_expected_400() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"errors\": {\n" + + " \"minValue\": \"not allowed for this type\",\n" + + " \"maxValue\": \"not allowed for this type\"\n" + " }\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + ResultCustomMetaDataField resultCustomMetaDataField = SUT + .createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test + public void createCustomMetaDataFields_successExpected() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" + + " \"name\": \"test1\",\n" + " \"label\": \"test1\",\n" + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + " \"isValueRequired\": false,\n" + + " \"minValue\": 10,\n" + " \"maxValue\": 1000\n" + " }\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void deleteCustomMetaDataField_404_Expected() + throws IOException, InterruptedException, NotFoundException, UnknownException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + SUT.deleteCustomMetaDataField("6296fd7091fa5768106b808E"); + server.takeRequest(); + } + + @Test + public void deleteCustomMetaDataField_successExpected() + throws IOException, InterruptedException, NotFoundException, UnknownException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void updateCustomMetaDataFields_404_Expected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808E"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); + } + + @Test(expected = BadRequestException.class) + public void updateCustomMetaDataFields_400_Expected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"errors\": {\n" + " \"minLength\": \"not allowed for this type\"\n" + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); + } + + @Test + public void updateCustomMetaDataFields_successExpected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse() + .setBody("{\n" + " \"id\": \"6296fd7091fa5768106b808d\",\n" + " \"name\": \"Amount3\",\n" + + " \"label\": \"testPrices\",\n" + " \"schema\": {\n" + " \"minValue\": 0,\n" + + " \"maxValue\": 10,\n" + " \"type\": \"Number\"\n" + " }\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), + request.getRequestUrl().toString()); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java new file mode 100644 index 0000000..323c40a --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -0,0 +1,326 @@ +package io.imagekit.sdk.manage; + +import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.ImageKitTest; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class FileTest { + + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = UnknownException.class) + public void imageKit_updateDetails_expected_404() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.updateFileDetail(fileUpdateRequest); + server.takeRequest(); + } + + @Test(expected = UnknownException.class) + public void imageKit_updateDetails_expected_400() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.updateFileDetail(fileUpdateRequest); + server.takeRequest(); + } + + @Test + public void imageKit_updateDetails_returnTrue() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" + + " \"name\": \"new_car.jpg\",\n" + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + + " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" + + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"tags\": [\n" + " \"tagg\",\n" + + " \"tagg1\"\n" + " ],\n" + " \"AITags\": null,\n" + " \"versionInfo\": {\n" + + " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + + " \"embeddedMetadata\": {\n" + " \"XResolution\": 250,\n" + + " \"YResolution\": 250,\n" + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + " },\n" + + " \"customCoordinates\": \"10,10,20,20\",\n" + " \"customMetadata\": {\n" + + " \"test100\": 10\n" + " },\n" + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/new_car.jpg\",\n" + " \"height\": 354,\n" + + " \"width\": 236,\n" + " \"size\": 23023,\n" + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileUpdateRequest.setTags(tags); + + SUT.updateFileDetail(fileUpdateRequest); + RecordedRequest request = server.takeRequest(); + + String requestJson = "{\"fileId\":\"62a9c3ccd875ec6fd658c854\",\"tags\":[\"Software\",\"Developer\",\"Engineer\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(requestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PATCH /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), + request.getRequestUrl().toString()); + } + + @Test + public void imageKit_getFileList_returnList() + throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, IOException { + + MockWebServer server = new MockWebServer(); + String responseJson = "[\n" + " {\n" + " \"type\": \"file\",\n" + + " \"name\": \"default-image.jpg\",\n" + + " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" + + " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" + + " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + " \"tags\": null,\n" + + " \"AITags\": null,\n" + " \"versionInfo\": {\n" + + " \"id\": \"62a4439bce686814dfcce65c\",\n" + " \"name\": \"Version 1\"\n" + + " },\n" + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" + + " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/default-image.jpg\",\n" + + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" + + " \"hasAlpha\": false,\n" + " \"mime\": \"image/jpeg\"\n" + " }\n" + "]"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Map options = new HashMap<>(); + options.put("limit", "" + 1); + SUT.getFileList(options); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files?limit=1 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files?limit=1"), request.getRequestUrl().toString()); + + } + + @Test(expected = BadRequestException.class) + public void imageKit_getFileDetail__expected_400() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileDetail("fileId"); + + server.takeRequest(); + } + + @Test + public void imageKit_getFileDetail_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"type\": \"file\",\n" + " \"name\": \"sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"createdAt\": \"2022-06-20T05:00:41.830Z\",\n" + + " \"updatedAt\": \"2022-06-20T05:00:43.263Z\",\n" + + " \"fileId\": \"62affef97db937b028f3b47a\",\n" + " \"tags\": [\n" + " \"Software\",\n" + + " \"Developer\",\n" + " \"Engineer\"\n" + " ],\n" + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + " \"id\": \"62affef97db937b028f3b47a\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {},\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/demo/img/static-file-1.png\",\n" + + " \"fileType\": \"non-image\",\n" + " \"filePath\": \"/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"size\": 169170\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileDetail("62affef97db937b028f3b47a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/62affef97db937b028f3b47a/details HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a/details"), + request.getRequestUrl().toString()); + } + + @Test + public void imageKit_getFileMetaData_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" + + " \"format\": \"jpg\",\n" + " \"hasColorProfile\": false,\n" + " \"quality\": 0,\n" + + " \"density\": 72,\n" + " \"hasTransparency\": false,\n" + " \"exif\": {},\n" + + " \"pHash\": \"e0d52b612ad538f6\"\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getRemoteFileMetadata("https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg"), + request.getRequestUrl().toString()); + + } + + @Test(expected = BadRequestException.class) + public void imageKit_getRemoteFileMetaData_400_Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"remote_url should be accessible using your ImageKit.io account.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getRemoteFileMetadata("remote_url"); + + server.takeRequest(); + } + + @Test(expected = BadRequestException.class) + public void imageKit_deleteFile_400_Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFile("629f3de17eb0fe4053615450"); + + server.takeRequest(); + } + + @Test + public void imageKit_deleteFile_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = ""; + server.enqueue(new MockResponse().setResponseCode(204).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFile("62affef97db937b028f3b47a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/files/62affef97db937b028f3b47a HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, + InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, + BadRequestException, UnknownException, IOException, InterruptedException { + List fileIds = new ArrayList<>(); + fileIds.add("file_id_1"); + fileIds.add("file_id_2"); + fileIds.add("file_id_3"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.bulkDeleteFiles(fileIds); + + server.takeRequest(); + } + + @Test + public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, + InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, + BadRequestException, UnknownException, IOException, InterruptedException { + List fileIds = new ArrayList<>(); + fileIds.add("62ad9ece7db937e35ef18dda"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"successfullyDeletedFileIds\": [\n" + + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.bulkDeleteFiles(fileIds); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("{\"fileIds\":[\"62ad9ece7db937e35ef18dda\"]}", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/batch/deleteByFileIds HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/batch/deleteByFileIds"), + request.getRequestUrl().toString()); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java new file mode 100644 index 0000000..40aca90 --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java @@ -0,0 +1,213 @@ +package io.imagekit.sdk.manage; + +import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.ImageKitTest; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.models.DeleteFileVersionRequest; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +public class FileVersionTest { + + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = NotFoundException.class) + public void getFileVersions_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersions("id"); + server.takeRequest(); + } + + @Test + public void getFileVersions_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + + " \"tag10\"\n" + " ],\n" + " \"AITags\": [\n" + " {\n" + + " \"name\": \"Colorfulness\",\n" + " \"confidence\": 96.19,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Purple\",\n" + " \"confidence\": 86.05,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Violet\",\n" + " \"confidence\": 81.08,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Rectangle\",\n" + " \"confidence\": 80.99,\n" + + " \"source\": \"google-auto-tagging\"\n" + " }\n" + " ],\n" + + " \"versionInfo\": {\n" + " \"id\": \"629f3de17eb0fe4053615450\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + " \"ImageWidth\": 1006,\n" + + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + + " \"height\": 467,\n" + " \"width\": 1006,\n" + " \"size\": 47579,\n" + + " \"hasAlpha\": true,\n" + " \"mime\": \"image/png\"\n" + " }\n" + "]")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersions("629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void getFileVersionDetails_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + server.takeRequest(); + } + + @Test + public void getFileVersionDetails_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + " \"tag10\"\n" + + " ],\n" + " \"AITags\": [\n" + " {\n" + " \"name\": \"Colorfulness\",\n" + + " \"confidence\": 96.19,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Purple\",\n" + + " \"confidence\": 86.05,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Violet\",\n" + + " \"confidence\": 81.08,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Rectangle\",\n" + + " \"confidence\": 80.99,\n" + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + " ],\n" + " \"versionInfo\": {\n" + + " \"id\": \"629f3de17eb0fe4053615450\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + + " \"embeddedMetadata\": {\n" + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + + " \"ImageWidth\": 1006,\n" + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + " \"height\": 467,\n" + + " \"width\": 1006,\n" + " \"size\": 47579,\n" + " \"hasAlpha\": true,\n" + + " \"mime\": \"image/png\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), + request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void deleteFileVersion_400_SuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("id"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + " \"message\": \"Your request contains invalid versionId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); + } + + @Test(expected = NotFoundException.class) + public void deleteFileVersion_404_SuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("62a9c403d89eedb81721102b"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested file version does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); + } + + @Test + public void deleteFileVersion_expectedSuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2 HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), + request.getRequestUrl().toString()); + } +} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java new file mode 100644 index 0000000..c649aaa --- /dev/null +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java @@ -0,0 +1,194 @@ +package io.imagekit.sdk.manage; + +import io.imagekit.sdk.ImageKit; +import io.imagekit.sdk.ImageKitTest; +import io.imagekit.sdk.exceptions.BadRequestException; +import io.imagekit.sdk.exceptions.ForbiddenException; +import io.imagekit.sdk.exceptions.InternalServerException; +import io.imagekit.sdk.exceptions.NotFoundException; +import io.imagekit.sdk.exceptions.PartialSuccessException; +import io.imagekit.sdk.exceptions.TooManyRequestsException; +import io.imagekit.sdk.exceptions.UnauthorizedException; +import io.imagekit.sdk.exceptions.UnknownException; +import io.imagekit.sdk.models.AITagsRequest; +import io.imagekit.sdk.models.TagsRequest; +import io.imagekit.sdk.tasks.RestClient; +import io.imagekit.sdk.utils.Utils; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class TagsTest { + + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = NotFoundException.class) + public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.addTags(tagsRequest); + + server.takeRequest(); + } + + @Test + public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.addTags(tagsRequest); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeTags(tagsRequest); + server.takeRequest(); + } + + @Test + public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeTags(tagsRequest); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeAITags(aiTagsRequest); + server.takeRequest(); + } + + @Test + public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeAITags(aiTagsRequest); + RecordedRequest request = server.takeRequest(); + + String aiTagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"AITags\":[\"Font\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(aiTagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); + } +} From 7bf61b6fcb51dde4831cdc797332e0e46512f845 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 27 Jun 2022 14:01:07 +0530 Subject: [PATCH 081/112] adde test fix for upload --- .../src/test/java/io/imagekit/sdk/UploadTest.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java index a0f7c04..c289067 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java @@ -128,14 +128,10 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "false\r\n" + "--randomBoundary-------------------\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "false\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + "Content-Length: 4\r\n" - + "\r\n" + "true\r\n" + "--randomBoundary-------------------\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" @@ -143,7 +139,7 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; - System.out.println("request.getBody().readUtf8().trim():->" + request.getBody().readUtf8().trim()); +// System.out.println("request.getBody().readUtf8().trim():->" + request.getBody().readUtf8().trim()); assertEquals(json, request.getBody().readUtf8().trim()); assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); From 85aebb69137e2375254c1352314732f5f94d20b1 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 27 Jun 2022 18:04:06 +0530 Subject: [PATCH 082/112] added more changes regarding comments --- README.md | 40 ++++++--- .../main/java/io/imagekit/sdk/ImageKit.java | 13 ++- .../io/imagekit/sdk/tasks/RestClient.java | 37 ++++++++- .../java/io/imagekit/sdk/utils/Utils.java | 1 + .../io/imagekit/sdk/FileOperationTest.java | 31 ++++++- .../io/imagekit/sdk/FolderOperationTest.java | 23 ++++++ .../test/java/io/imagekit/sdk/UploadTest.java | 69 +++++++++++++++- .../java/io/imagekit/sdk/manage/FileTest.java | 82 ++++++++++++++++++- .../imagekit/sdk/manage/FileVersionTest.java | 74 +++++++++++++++++ 9 files changed, 350 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index aff9e7a..01e79cb 100644 --- a/README.md +++ b/README.md @@ -675,7 +675,23 @@ System.out.println("Map Response:"); System.out.println(resultRenameFile.getResponseMetaData().getMap()); ``` -**15. Create Folder** +**15. Restore file Version** + +It Restores file version to a different version of a file as per the +[API documentation here](https://docs.imagekit.io/api-reference/media-api/restore-file-version). +The argument to the `restoreFileVersion()` method accepts the fileId and versionId. + +```java +Result result = ImageKit.getInstance().restoreFileVersion("fileId", "versionId"); +System.out.println("======FINAL RESULT======="); +System.out.println(result); +System.out.println("Raw Response:"); +System.out.println(result.getResponseMetaData().getRaw()); +System.out.println("Map Response:"); +System.out.println(result.getResponseMetaData().getMap()); +``` + +**16. Create Folder** It Creates the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder). @@ -694,7 +710,7 @@ System.out.println("Map Response:"); System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); ``` -**16. Delete Folder** +**17. Delete Folder** It Deletes the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder). @@ -712,7 +728,7 @@ System.out.println("Map Response:"); System.out.println(resultNoContent.getResponseMetaData().getMap()); ``` -**17. Copy Folder** +**18. Copy Folder** It Copies the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder). @@ -731,7 +747,7 @@ System.out.println("Map Response:"); System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); ``` -**18. Move Folder** +**19. Move Folder** It Moves the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder). @@ -750,7 +766,7 @@ System.out.println("Map Response:"); System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); ``` -**19. Get Bulk Job Status** +**20. Get Bulk Job Status** It Gets the Job status as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-move-folder-status). @@ -767,7 +783,7 @@ System.out.println("Map Response:"); System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); ``` -**20. Purge Cache** +**21. Purge Cache** Programmatically issue a cache clear request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache). Accepts the full URL of the file for which the cache has to be cleared. @@ -781,7 +797,7 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -**21. Purge Cache Status** +**22. Purge Cache Status** Get the purge cache request status using the request ID returned when a purge cache request gets submitted as pet the [API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) @@ -797,7 +813,7 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -**22. Get File Metadata** +**23. Get File Metadata** Accepts the file ID and fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/metadata-api/get-image-metadata-for-uploaded-media-files) ```java @@ -823,7 +839,7 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -**23. Create CustomMetaDataFields** +**24. Create CustomMetaDataFields** It creates the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). @@ -846,7 +862,7 @@ System.out.println("Map Response:"); System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); ``` -**24. Get CustomMetaDataFields** +**25. Get CustomMetaDataFields** fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) @@ -862,7 +878,7 @@ System.out.println(resultCustomMetaDataFieldList.getResponseMetaData().getList() System.out.println(resultCustomMetaDataFieldList.getResultCustomMetaDataFields()); ``` -**25. Edit CustomMetaDataFields** +**26. Edit CustomMetaDataFields** It edits the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). @@ -886,7 +902,7 @@ System.out.println("Map Response:"); System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); ``` -**26. Delete CustomMetaDataFields** +**27. Delete CustomMetaDataFields** It deletes the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/delete-custom-metadata-field). diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index e900659..0545a8b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -100,7 +100,7 @@ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerE public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - return restClient.updateDetail(fileUpdateRequest); + return restClient.updateFileDetail(fileUpdateRequest); } /** @@ -347,6 +347,17 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws C return restClient.renameFile(renameFileRequest); } + /** + * + * @param fileId & versionId + * @return a Result class + */ + public Result restoreFileVersion(String fileId, String versionId) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + return restClient.restoreFileVersion(fileId, versionId); + } + /** * * @param createFolderRequest which contains folderPath that is full path to the diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index eead8e9..cbd4a3d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -84,7 +84,7 @@ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerE return result; } - public Result updateDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, + public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { Result result = null; Map headers = Utils.getHeaders(imageKit); @@ -178,7 +178,7 @@ public ResultMetaData getFileMetaData(String fileId) throws ForbiddenException, ResultMetaData result = new ResultMetaData(); Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, "https://api.imagekit.io/v1/files/%s/metadata", fileId); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/metadata"), fileId); request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); @@ -677,6 +677,39 @@ public ResultRenameFile renameFile(RenameFileRequest renameFileRequest) throws P return resultRenameFile; } + public Result restoreFileVersion(String fileId, String versionId) + throws NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + Result resultFileVersionDetails = new Result(); + Map headers = Utils.getHeaders(imageKit); + + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s/restore"), fileId, versionId); + RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), ""); + request = new Request.Builder().url(url).put(requestBody).headers(Headers.of(headers)).build(); + + try { + Response response = client.newCall(request).execute(); + String respBody = ""; + if (response.code() == 200) { + System.out.println("20000000000000"); + respBody = response.body().string(); + resultFileVersionDetails = new Gson().fromJson(respBody, Result.class); + } else if (response.code() == 404) { + System.out.println("400000000000004"); + ResultException result = Utils.populateResult(response); + throw new NotFoundException(result.getMessage(), null, false, false, result.getMessage(), + result.getHelp(), result.getResponseMetaData()); + } else { + Utils.generalApiThrowException(response); + } + Utils.populateResponseMetadata(respBody, resultFileVersionDetails.getResponseMetaData(), response.code(), + response.headers().toMultimap()); + } catch (IOException e) { + throw new UnknownException(e.getMessage(), e.getCause()); + } + return resultFileVersionDetails; + } + public ResultEmptyBlock createFolder(CreateFolderRequest createFolderRequest) throws UnknownException { ResultEmptyBlock resultEmptyBlock = new ResultEmptyBlock(); Map headers = Utils.getHeaders(imageKit); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 19fa01c..9cfdec1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -177,6 +177,7 @@ public static void throwOtherException(Response response) public static ResultException populateResult(Response response) throws IOException { String resp = response.body().string(); + System.out.println("resp:==> " + resp); ResultException result = new Gson().fromJson(resp, ResultException.class); populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); return result; diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java index 8bcce03..24a26ab 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java @@ -153,7 +153,7 @@ public void renameFile_409_Expected() throws InterruptedException, IOException, RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/new1.jpg"); renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); + renameFileRequest.setPurgeCache(false); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(409) @@ -175,7 +175,7 @@ public void renameFile_successExpected() throws InterruptedException, IOExceptio RenameFileRequest renameFileRequest = new RenameFileRequest(); renameFileRequest.setFilePath("/car_false.jpeg"); renameFileRequest.setNewFileName("new_car.jpeg"); - renameFileRequest.setPurgeCache(true); + renameFileRequest.setPurgeCache(false); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{}")); @@ -184,6 +184,33 @@ public void renameFile_successExpected() throws InterruptedException, IOExceptio SUT.renameFile(renameFileRequest); RecordedRequest request = server.takeRequest(); + String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":false}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(renameFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); + } + + @Test + public void renameFile_successExpected_with_purge_cache() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/car_false.jpeg"); + renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"purgeRequestId\": \"62b973a00f0ad4164f307dad\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + RecordedRequest request = server.takeRequest(); + String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(renameFileRequestJson, utf8RequestBody); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java index 8dffd91..f14a7a3 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java @@ -114,6 +114,29 @@ public void deleteFolder_successExpected() assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); } + @Test(expected = BadRequestException.class) + public void copyFolder_400_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/"); + copyFolderRequest.setDestinationPath("/test"); + copyFolderRequest.setIncludeVersions(false); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + + " \"message\": \"sourceFolderPath cannot be root\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_IS_ROOT\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + server.takeRequest(); + } + @Test(expected = NotFoundException.class) public void copyFolder_404_Expected() throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java index c289067..aa9f2e1 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java @@ -43,6 +43,19 @@ public void imageKit_upload_expect_UnknownHostException() throws IOException { urlConnect.getContent(); } + @Test(expected = RuntimeException.class) + public void imageKit_upload_expected_RuntimeException_for_file() throws IOException, InterruptedException, InternalServerException, + BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + FileCreateRequest fileCreateRequest = new FileCreateRequest((String) null, "sample-cat-image.png"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("java.lang.RuntimeException: Error: File not provided.")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + RecordedRequest request = server.takeRequest(); + } + @Test public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { @@ -139,10 +152,64 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; -// System.out.println("request.getBody().readUtf8().trim():->" + request.getBody().readUtf8().trim()); assertEquals(json, request.getBody().readUtf8().trim()); assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); } + @Test(expected = BadRequestException.class) + public void imageKit_upload_400_expected() throws IOException, InterruptedException, InternalServerException, + BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; + URL url = new URL(imageUrl); + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + fileCreateRequest.setFolder("demo1"); + String customCoordinates = "10,10,20,20"; + fileCreateRequest.setCustomCoordinates(customCoordinates); + + List responseFields = new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); + + fileCreateRequest.setResponseFields(responseFields); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 10); + innerObject2.addProperty("maxTags", 5); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + fileCreateRequest.setUseUniqueFileName(false); + fileCreateRequest.setPrivateFile(false); + fileCreateRequest.setOverwriteFile(false); + fileCreateRequest.setOverwriteAITags(false); + fileCreateRequest.setOverwriteTags(false); + fileCreateRequest.setOverwriteCustomMetadata(true); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + + " \"message\": \"A file with the same name already exists at the exact location. We could not overwrite it because both overwriteFile and useUniqueFileName are set to false.\"\n" + + "}")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + server.takeRequest(); + } + } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index 323c40a..c9339ba 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -139,6 +139,7 @@ public void imageKit_getFileList_returnList() server.start(); RestClient.API_BASE_URL = server.url("/").toString(); Map options = new HashMap<>(); + options.put("skip", "" + 0); options.put("limit", "" + 1); SUT.getFileList(options); @@ -146,8 +147,8 @@ public void imageKit_getFileList_returnList() String utf8RequestBody = request.getBody().readUtf8(); assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files?limit=1 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files?limit=1"), request.getRequestUrl().toString()); + assertEquals("GET /v1/files?limit=1&limit=0 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files?limit=1&limit=0"), request.getRequestUrl().toString()); } @@ -206,6 +207,83 @@ public void imageKit_getFileMetaData_successExpected() throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InterruptedException { MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"height\": 300,\n" + + " \"width\": 300,\n" + + " \"size\": 51085,\n" + + " \"format\": \"jpg\",\n" + + " \"hasColorProfile\": false,\n" + + " \"quality\": 0,\n" + + " \"density\": 300,\n" + + " \"hasTransparency\": false,\n" + + " \"exif\": {\n" + + " \"image\": {\n" + + " \"Orientation\": 1,\n" + + " \"XResolution\": 300,\n" + + " \"YResolution\": 300,\n" + + " \"ResolutionUnit\": 2,\n" + + " \"Software\": \"Adobe Photoshop CS5 (12.0x20100115 [20100115.m.998 2010/01/15:02:00:00 cutoff; m branch]) Windows\",\n" + + " \"ModifyDate\": \"2017:09:11 22:15:46\",\n" + + " \"ExifOffset\": 236\n" + + " },\n" + + " \"thumbnail\": {\n" + + " \"Compression\": 6,\n" + + " \"XResolution\": 72,\n" + + " \"YResolution\": 72,\n" + + " \"ResolutionUnit\": 2,\n" + + " \"ThumbnailOffset\": 374,\n" + + " \"ThumbnailLength\": 4083\n" + + " },\n" + + " \"exif\": {\n" + + " \"ColorSpace\": 65535,\n" + + " \"ExifImageWidth\": 300,\n" + + " \"ExifImageHeight\": 300\n" + + " },\n" + + " \"gps\": {},\n" + + " \"interoperability\": {},\n" + + " \"makernote\": {}\n" + + " },\n" + + " \"pHash\": \"2df5da2dd63c6926\"\n" + + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileMetadata("62b43109d23153217b8b8a36"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/62b43109d23153217b8b8a36/metadata HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/62b43109d23153217b8b8a36/metadata"), + request.getRequestUrl().toString()); + + } + + @Test(expected = BadRequestException.class) + public void imageKit_getFileMetaData_400_Expected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"type\": \"INVALID_PARAM_ERROR\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileMetadata("fileId"); + server.takeRequest(); + } + + @Test + public void imageKit_getRemoteFileMetaData_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); String responseJson = "{\n" + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" + " \"format\": \"jpg\",\n" + " \"hasColorProfile\": false,\n" + " \"quality\": 0,\n" + " \"density\": 72,\n" + " \"hasTransparency\": false,\n" + " \"exif\": {},\n" diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java index 40aca90..4cd78af 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java @@ -210,4 +210,78 @@ public void deleteFileVersion_expectedSuccessWith() RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), request.getRequestUrl().toString()); } + + @Test + public void restoreFileVersion_expectedSuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"type\": \"file\",\n" + + " \"name\": \"new_car.jpg\",\n" + + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + + " \"updatedAt\": \"2022-06-27T12:11:11.254Z\",\n" + + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + + " \"tags\": [\n" + + " \"tagg\",\n" + + " \"tagg1\"\n" + + " ],\n" + + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + + " \"id\": \"62b97749f63122840530fda9\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"embeddedMetadata\": {\n" + + " \"XResolution\": 250,\n" + + " \"YResolution\": 250,\n" + + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + + " },\n" + + " \"customCoordinates\": \"10,10,20,20\",\n" + + " \"customMetadata\": {\n" + + " \"test100\": 10\n" + + " },\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + + " \"fileType\": \"image\",\n" + + " \"filePath\": \"/new_car.jpg\",\n" + + " \"height\": 354,\n" + + " \"width\": 236,\n" + + " \"size\": 23023,\n" + + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.restoreFileVersion("62a9c3ccd875ec6fd658c854", "62b97749f63122840530fda9"); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/62a9c3ccd875ec6fd658c854/versions/62b97749f63122840530fda9/restore HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/versions/62b97749f63122840530fda9/restore"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void restoreFileVersion_expected_404() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + + " \"message\": \"The requested file version does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.restoreFileVersion("62a9c3ccd875ec6fd658c854", "62b97749f63122840530fda9"); + RecordedRequest request = server.takeRequest(); + request.getBody().readUtf8(); + } } From 3c0e2d87c767e858ef2892c72f1dcf33c68ace8d Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 28 Jun 2022 11:03:46 +0530 Subject: [PATCH 083/112] added more resolved comments fixe --- README.md | 15 ++- .../java/io/imagekit/sdk/manage/FileTest.java | 93 +++++++++++++++---- 2 files changed, 88 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 01e79cb..c710785 100644 --- a/README.md +++ b/README.md @@ -421,7 +421,20 @@ in the [documentation here](https://docs.imagekit.io/api-reference/media-api/lis correct values to get the results. ```java -ResultList resultList=ImageKit.getInstance().getFileList(10,10); +Map options = new HashMap<>(); +List tags = new ArrayList<>(); +tags.add("Software"); +tags.add("Developer"); +tags.add("Engineer"); +options.put("skip", "" + 0); +options.put("limit", "" + 1); +options.put("type", "file"); +options.put("sort", "ASC_CREATED"); +options.put("path", "/"); +options.put("fileType", "all"); +options.put("searchQuery","createdAt >= '2d' OR size < '2mb' OR format='png'"); +options.put("tags", String.valueOf(tags)); +ResultList resultList = ImageKit.getInstance().getFileList(options); System.out.println("======FINAL RESULT======="); System.out.println(resultList); System.out.println("Raw Response:"); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index c9339ba..b9af56d 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -118,38 +118,93 @@ public void imageKit_getFileList_returnList() UnauthorizedException, BadRequestException, UnknownException, IOException { MockWebServer server = new MockWebServer(); - String responseJson = "[\n" + " {\n" + " \"type\": \"file\",\n" - + " \"name\": \"default-image.jpg\",\n" - + " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" - + " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" - + " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + " \"tags\": null,\n" - + " \"AITags\": null,\n" + " \"versionInfo\": {\n" - + " \"id\": \"62a4439bce686814dfcce65c\",\n" + " \"name\": \"Version 1\"\n" - + " },\n" + " \"embeddedMetadata\": {\n" - + " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" - + " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + " },\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/default-image.jpg\",\n" - + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" - + " \"hasAlpha\": false,\n" + " \"mime\": \"image/jpeg\"\n" + " }\n" + "]"; + String responseJson = "[\n" + + " {\n" + + " \"type\": \"file\",\n" + + " \"name\": \"default-image.jpg\",\n" + + " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" + + " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" + + " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + + " \"tags\": null,\n" + + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + + " \"id\": \"62a4439bce686814dfcce65c\",\n" + + " \"name\": \"Version 1\"\n" + + " },\n" + + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" + + " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + + " },\n" + + " \"customCoordinates\": null,\n" + + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" + + " \"fileType\": \"image\",\n" + + " \"filePath\": \"/default-image.jpg\",\n" + + " \"height\": 1000,\n" + + " \"width\": 1000,\n" + + " \"size\": 147022,\n" + + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + + " }\n" + + "]"; server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); Map options = new HashMap<>(); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); options.put("skip", "" + 0); options.put("limit", "" + 1); + options.put("type", "file"); + options.put("sort", "ASC_CREATED"); + options.put("path", "/"); + options.put("fileType", "all"); + options.put("searchQuery","createdAt >= '2d' OR size < '2mb' OR format='png'"); + options.put("tags", String.valueOf(tags)); SUT.getFileList(options); RecordedRequest request = server.takeRequest(); String utf8RequestBody = request.getBody().readUtf8(); assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files?limit=1&limit=0 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files?limit=1&limit=0"), request.getRequestUrl().toString()); + assertEquals("GET /v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), request.getRequestUrl().toString()); + + } + @Test(expected = BadRequestException.class) + public void imageKit_getFileList_400_expected() + throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, IOException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"Invalid search query - createdAt field must have a valid date value. Make sure the value is enclosed within quotes. Please refer to the documentation for syntax specification.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Map options = new HashMap<>(); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + options.put("skip", "" + 0); + options.put("limit", "" + 1); + options.put("type", "file"); + options.put("sort", "ASC_CREATED"); + options.put("path", "/"); + options.put("fileType", "all"); + options.put("searchQuery","createdAt >= '2days' OR size < '2mb' OR format='png'"); + options.put("tags", String.valueOf(tags)); + SUT.getFileList(options); + + server.takeRequest(); } @Test(expected = BadRequestException.class) From bafbf10317a96c7d9ae3ad0afa2c32ba232ace93 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 28 Jun 2022 11:46:42 +0530 Subject: [PATCH 084/112] added changes for includeFileVersions --- README.md | 4 ++-- .../src/main/java/io/imagekit/sdk/ImageKit.java | 2 +- .../java/io/imagekit/sdk/models/CopyFileRequest.java | 12 ++++++------ .../io/imagekit/sdk/models/CopyFolderRequest.java | 12 ++++++------ .../test/java/io/imagekit/sdk/FileOperationTest.java | 6 +++--- .../java/io/imagekit/sdk/FolderOperationTest.java | 8 ++++---- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index c710785..ca09d53 100644 --- a/README.md +++ b/README.md @@ -639,7 +639,7 @@ The argument to the `copyFile()` method accepts the sourceFilePath and destinati CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/w2_image.png"); copyFileRequest.setDestinationPath("/Gallery/"); -copyFileRequest.setIncludeVersions(true); +copyFileRequest.setIncludeFileVersions(true); ResultNoContent resultNoContent = ImageKit.getInstance().copyFile(copyFileRequest); System.out.println("======FINAL RESULT======="); System.out.println(resultNoContent); @@ -745,7 +745,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); It Copies the Folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder). -The argument to the `copyFolder()` method accepts the sourceFolderPath, destinationPath and includeVersions for which the folder has to be copied. +The argument to the `copyFolder()` method accepts the sourceFolderPath, destinationPath and includeFileVersions for which the folder has to be copied. ```java CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 0545a8b..bf76775 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -383,7 +383,7 @@ public ResultNoContent deleteFolder(DeleteFolderRequest deleteFolderRequest) /** * * @param copyFolderRequest that contains sourceFolderPath, destinationPath, - * includeVersions + * includeFileVersions * @return Result class */ public ResultOfFolderActions copyFolder(CopyFolderRequest copyFolderRequest) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java index 93d022b..b915ce1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFileRequest.java @@ -3,7 +3,7 @@ public class CopyFileRequest { public String sourceFilePath; public String destinationPath; - public Boolean includeVersions; + public Boolean includeFileVersions; public String getSourceFilePath() { return sourceFilePath; @@ -21,17 +21,17 @@ public void setDestinationPath(String destinationPath) { this.destinationPath = destinationPath; } - public Boolean getIncludeVersions() { - return includeVersions; + public Boolean getIncludeFileVersions() { + return includeFileVersions; } - public void setIncludeVersions(Boolean includeVersions) { - this.includeVersions = includeVersions; + public void setIncludeFileVersions(Boolean includeFileVersions) { + this.includeFileVersions = includeFileVersions; } @Override public String toString() { return "CopyFileRequest{" + "sourceFilePath=" + sourceFilePath + ", destinationPath=" + destinationPath - + ", includeVersions=" + includeVersions + '}'; + + ", includeFileVersions=" + includeFileVersions + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java index 8a468f6..0938fd5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CopyFolderRequest.java @@ -3,7 +3,7 @@ public class CopyFolderRequest { public String sourceFolderPath; public String destinationPath; - public Boolean includeVersions; + public Boolean includeFileVersions; public String getSourceFolderPath() { return sourceFolderPath; @@ -21,17 +21,17 @@ public void setDestinationPath(String destinationPath) { this.destinationPath = destinationPath; } - public Boolean getIncludeVersions() { - return includeVersions; + public Boolean getIncludeFileVersions() { + return includeFileVersions; } - public void setIncludeVersions(Boolean includeVersions) { - this.includeVersions = includeVersions; + public void setIncludeFileVersions(Boolean includeFileVersions) { + this.includeFileVersions = includeFileVersions; } @Override public String toString() { return "CopyFolderRequest{" + "sourceFolderPath=" + sourceFolderPath + ", destinationPath=" + destinationPath - + ", includeVersions=" + includeVersions + '}'; + + ", includeFileVersions=" + includeFileVersions + '}'; } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java index 24a26ab..f0b9cd8 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java @@ -41,7 +41,7 @@ public void copyFile_404_Expected() CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/sample_image.jpg"); copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeVersions(true); + copyFileRequest.setIncludeFileVersions(true); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -62,7 +62,7 @@ public void copyFile_successExpected() CopyFileRequest copyFileRequest = new CopyFileRequest(); copyFileRequest.setSourceFilePath("/car_false.jpeg"); copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeVersions(true); + copyFileRequest.setIncludeFileVersions(true); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(204).setBody("")); @@ -71,7 +71,7 @@ public void copyFile_successExpected() SUT.copyFile(copyFileRequest); RecordedRequest request = server.takeRequest(); - String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeVersions\":true}"; + String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeFileVersions\":true}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(copyFileRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java index f14a7a3..2783f84 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java @@ -122,7 +122,7 @@ public void copyFolder_400_Expected() CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/"); copyFolderRequest.setDestinationPath("/test"); - copyFolderRequest.setIncludeVersions(false); + copyFolderRequest.setIncludeFileVersions(false); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(400) @@ -145,7 +145,7 @@ public void copyFolder_404_Expected() CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); copyFolderRequest.setDestinationPath("/test"); - copyFolderRequest.setIncludeVersions(true); + copyFolderRequest.setIncludeFileVersions(true); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setResponseCode(404) @@ -166,7 +166,7 @@ public void copyFolder_successExpected() CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); copyFolderRequest.setSourceFolderPath("/testFolder"); copyFolderRequest.setDestinationPath("/Gallery"); - copyFolderRequest.setIncludeVersions(true); + copyFolderRequest.setIncludeFileVersions(true); MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + "}")); @@ -175,7 +175,7 @@ public void copyFolder_successExpected() SUT.copyFolder(copyFolderRequest); RecordedRequest request = server.takeRequest(); - String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeVersions\":true}"; + String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeFileVersions\":true}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(copyFolderRequestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); From ef17daf44baad8af78882c352c10135d2f89370a Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 28 Jun 2022 12:12:47 +0530 Subject: [PATCH 085/112] format all files --- .../imagekit/sdk/constants/Transformer.java | 114 +-- .../io/imagekit/sdk/tasks/RestClient.java | 8 +- .../java/io/imagekit/sdk/tasks/UrlGen.java | 395 ++++---- .../java/io/imagekit/sdk/CalculationTest.java | 70 -- .../io/imagekit/sdk/FileOperationTest.java | 454 ++++----- .../io/imagekit/sdk/FolderOperationTest.java | 402 ++++---- .../test/java/io/imagekit/sdk/GetUrlTest.java | 909 +++++++++--------- .../java/io/imagekit/sdk/ImageKitTest.java | 53 + .../java/io/imagekit/sdk/PurgeCacheTest.java | 132 +-- .../test/java/io/imagekit/sdk/UploadTest.java | 369 +++---- .../sdk/manage/CustomMetaDataFieldTest.java | 426 ++++---- .../java/io/imagekit/sdk/manage/FileTest.java | 811 ++++++++-------- .../imagekit/sdk/manage/FileVersionTest.java | 448 +++++---- .../java/io/imagekit/sdk/manage/TagsTest.java | 326 +++---- 14 files changed, 2424 insertions(+), 2493 deletions(-) delete mode 100644 imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java index 732337c..9e886e6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java @@ -5,68 +5,68 @@ public class Transformer { - private Map trans=new HashMap<>(); - private static Transformer transformer; + private Map trans = new HashMap<>(); + private static Transformer transformer; - public static synchronized Transformer getInstance(){ - if (null!= transformer){ - return transformer; - } - transformer =new Transformer(); + public static synchronized Transformer getInstance() { + if (null != transformer) { + return transformer; + } + transformer = new Transformer(); - transformer.trans.put("height" , "h"); - transformer.trans.put("width" , "w"); - transformer.trans.put("aspectRatio" , "ar"); - transformer.trans.put("quality" , "q"); - transformer.trans.put("crop" , "c"); - transformer.trans.put("cropMode" , "cm"); - transformer.trans.put("x" , "x"); - transformer.trans.put("y" , "y"); - transformer.trans.put("focus" , "fo"); - transformer.trans.put("format" , "f"); - transformer.trans.put("radius" , "r"); - transformer.trans.put("background" , "bg"); - transformer.trans.put("border" , "bo"); - transformer.trans.put("rotation" , "rt"); - transformer.trans.put("blur" , "bl"); - transformer.trans.put("named" , "n"); - transformer.trans.put("overlayImage" , "oi"); - transformer.trans.put("overlayX" , "ox"); - transformer.trans.put("overlayY" , "oy"); - transformer.trans.put("overlayFocus" , "ofo"); - transformer.trans.put("overlayHeight" , "oh"); - transformer.trans.put("overlayWidth" , "ow"); - transformer.trans.put("overlayText" , "ot"); - transformer.trans.put("overlayTextFontSize" , "ots"); - transformer.trans.put("overlayTextFontFamily" , "otf"); - transformer.trans.put("overlayTextColor" , "otc"); - transformer.trans.put("overlayAlpha" , "oa"); - transformer.trans.put("overlayTextTypography" , "ott"); - transformer.trans.put("overlayBackground" , "obg"); - transformer.trans.put("overlayImageTrim" , "oit"); - transformer.trans.put("progressive" , "pr"); - transformer.trans.put("lossless" , "lo"); - transformer.trans.put("trim" , "t"); - transformer.trans.put("metadata" , "md"); - transformer.trans.put("colorProfile" , "cp"); - transformer.trans.put("defaultImage" , "di"); - transformer.trans.put("dpr" , "dpr"); - transformer.trans.put("effectSharpen" , "e-sharpen"); - transformer.trans.put("effectUSM" , "e-usm"); - transformer.trans.put("effectContrast" , "e-contrast"); - transformer.trans.put("effectGray" , "e-grayscale"); - transformer.trans.put("original" , "orig"); - transformer.trans.put("raw", "raw"); + transformer.trans.put("height", "h"); + transformer.trans.put("width", "w"); + transformer.trans.put("aspectRatio", "ar"); + transformer.trans.put("quality", "q"); + transformer.trans.put("crop", "c"); + transformer.trans.put("cropMode", "cm"); + transformer.trans.put("x", "x"); + transformer.trans.put("y", "y"); + transformer.trans.put("focus", "fo"); + transformer.trans.put("format", "f"); + transformer.trans.put("radius", "r"); + transformer.trans.put("background", "bg"); + transformer.trans.put("border", "bo"); + transformer.trans.put("rotation", "rt"); + transformer.trans.put("blur", "bl"); + transformer.trans.put("named", "n"); + transformer.trans.put("overlayImage", "oi"); + transformer.trans.put("overlayX", "ox"); + transformer.trans.put("overlayY", "oy"); + transformer.trans.put("overlayFocus", "ofo"); + transformer.trans.put("overlayHeight", "oh"); + transformer.trans.put("overlayWidth", "ow"); + transformer.trans.put("overlayText", "ot"); + transformer.trans.put("overlayTextFontSize", "ots"); + transformer.trans.put("overlayTextFontFamily", "otf"); + transformer.trans.put("overlayTextColor", "otc"); + transformer.trans.put("overlayAlpha", "oa"); + transformer.trans.put("overlayTextTypography", "ott"); + transformer.trans.put("overlayBackground", "obg"); + transformer.trans.put("overlayImageTrim", "oit"); + transformer.trans.put("progressive", "pr"); + transformer.trans.put("lossless", "lo"); + transformer.trans.put("trim", "t"); + transformer.trans.put("metadata", "md"); + transformer.trans.put("colorProfile", "cp"); + transformer.trans.put("defaultImage", "di"); + transformer.trans.put("dpr", "dpr"); + transformer.trans.put("effectSharpen", "e-sharpen"); + transformer.trans.put("effectUSM", "e-usm"); + transformer.trans.put("effectContrast", "e-contrast"); + transformer.trans.put("effectGray", "e-grayscale"); + transformer.trans.put("original", "orig"); + transformer.trans.put("raw", "raw"); - return transformer; - } + return transformer; + } - private Transformer(){ + private Transformer() { - } + } - public String transform(String key){ - return this.trans.get(key)!=null?this.trans.get(key):key; - } + public String transform(String key) { + return this.trans.get(key) != null ? this.trans.get(key) : key; + } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index cbd4a3d..849abf0 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -84,8 +84,9 @@ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerE return result; } - public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) throws ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException { Result result = null; Map headers = Utils.getHeaders(imageKit); String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/details"), @@ -683,7 +684,8 @@ public Result restoreFileVersion(String fileId, String versionId) Result resultFileVersionDetails = new Result(); Map headers = Utils.getHeaders(imageKit); - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s/restore"), fileId, versionId); + String url = String.format(Locale.US, API_BASE_URL.concat("v1/files/%s/versions/%s/restore"), fileId, + versionId); RequestBody requestBody = RequestBody.create(okhttp3.MediaType.parse("application/json"), ""); request = new Request.Builder().url(url).put(requestBody).headers(Headers.of(headers)).build(); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java index fa66d11..a23c118 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/UrlGen.java @@ -12,202 +12,201 @@ public class UrlGen { - private static final long DEFAULT_TIMESTAMP=9999999999L; - - public static String getUrl(Map options){ - String path= (String) options.get("path"); - String urlEndpoint= (String) options.get("urlEndpoint"); - String src= (String) options.get("src"); - Map queryParams= (Map) options.get("queryParameters"); - List> transformation= (List>) options.get("transformation"); - String transformationPosition= (String) options.get("transformationPosition"); - boolean signed=false; - if (null!=options.get("signed")) { - signed = (boolean) options.get("signed"); - } - long expire=0; - if (null!=options.get("expireSeconds")) { - expire = (long) (int)options.get("expireSeconds"); - } - return UrlGen.generateUrl(path,urlEndpoint,src,queryParams,transformation,transformationPosition,signed,expire); - } - - private static String generateUrl( - String path, - String urlEndpoint, - String src, - Map queryParameters, - List> transformation, - String transformationPosition, - boolean signed, - long expireSeconds - ){ - Configuration config=ImageKit.getInstance().getConfig(); - if (urlEndpoint==null){ - urlEndpoint= config.getUrlEndpoint(); - } - if (urlEndpoint.charAt(urlEndpoint.length()-1)!='/'){ - urlEndpoint+="/"; - } - String newUrl=null; - if (null!=src){ - newUrl=buildFullUrl(src,queryParameters,transformation,transformationPosition,signed,expireSeconds, config.getPrivateKey(), urlEndpoint); - } - else { - if ("query".equalsIgnoreCase(transformationPosition)){ - newUrl=buildFullUrl(urlEndpoint+(path.charAt(0)=='/'?path.substring(1,path.length()):path),queryParameters,transformation,transformationPosition,signed,expireSeconds, config.getPrivateKey(), urlEndpoint); - } - else { - newUrl = buildPathUrl(path.charAt(0)=='/'?path:"/"+path, urlEndpoint, queryParameters, transformation, transformationPosition, signed, expireSeconds, config.getPrivateKey()); - } - } - return newUrl; - } - - private static String buildPathUrl(String path, String urlEndpoint, Map queryParameters, List> transformation, String transformationPosition, boolean signed, long expireSeconds, String privateKey) { - - StringBuilder tr= new StringBuilder(""); - if (transformation.size()>0) { - tr.append("tr"); - for (Map map : transformation) { - Set> entries = map.entrySet(); - tr.append(":"); - int i = 0; - for (Map.Entry entry : entries) { - String key = entry.getKey(); - String value = entry.getValue(); - String element = Transformer.getInstance().transform(key) + (value.equalsIgnoreCase("-") ? "" : "-" + value); - tr.append(element.contains("oi") || element.contains("di") ? element.replaceFirst("/", "").replaceAll("/", "@@") :element); - if (i < entries.size() - 1) { - tr.append(","); - } - i++; - } - } - } - - QueryMaker queryMaker=new QueryMaker(); - if (null!=queryParameters){ - for (Map.Entry entry:queryParameters.entrySet()){ - queryMaker.put(String.format(Locale.US,"%s=%s",entry.getKey(),entry.getValue())); - } - } - - URI baseUrl=URI.create(urlEndpoint); - URI newUri= null; - try { - String newPath=baseUrl.getPath(); - if (tr.toString().equalsIgnoreCase("")){ - newPath+=path.substring(1,path.length()); - } - else { - newPath+=tr+path; - } - - URI tmpUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(), - newPath, - queryMaker.get(),null); - - if (signed){ - sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri); - } - - newUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(), - newPath, - queryMaker.get(),null); - - } catch (URISyntaxException e) { - e.printStackTrace(); - } - return newUri.toString(); - } - - private static String buildFullUrl(String src, Map queryParameters, List> transformation, String transformationPosition, boolean signed, long expireSeconds, String privateKey, String urlEndpoint) { - StringBuilder tr= new StringBuilder(""); - if (transformation.size()>0) { - tr.append("tr="); - for (Map map : transformation) { - Set> entries = map.entrySet(); - if (!tr.toString().equalsIgnoreCase("tr=")) - tr.append(":"); - int i = 0; - for (Map.Entry entry : entries) { - String key = entry.getKey(); - String value = entry.getValue(); - String element = Transformer.getInstance().transform(key) + (value.equalsIgnoreCase("-") ? "" : "-" + value); - tr.append(element); - if (i < entries.size() - 1) { - tr.append(","); - } - i++; - } - } - } - - QueryMaker queryMaker=new QueryMaker(); - - // check existing query params - if (null!=src){ - String[] parts=src.split("\\?"); - if (parts.length>1){ - String[] queries=parts[1].split("&"); - for (String query:queries){ - queryMaker.put(query); - } - } - } - - if (null!=queryParameters){ - for (Map.Entry entry:queryParameters.entrySet()){ - queryMaker.put(String.format(Locale.US,"%s=%s",entry.getKey(),entry.getValue())); - } - } - if (!tr.toString().equalsIgnoreCase("")){ - queryMaker.put(tr.toString()); - } - - URI baseUrl=URI.create(src); - URI newUri= null; - try { - String newPath=baseUrl.getPath(); - URI tmpUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(), - newPath, - queryMaker.get(),null); - - - if (signed){ - sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri); - } - - newUri = new URI(baseUrl.getScheme(),baseUrl.getUserInfo(),baseUrl.getHost(),baseUrl.getPort(), - newPath, - queryMaker.get(),null); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - return newUri.toString(); - } - - private static void sign(String urlEndpoint, long expireSeconds, String privateKey, QueryMaker queryMaker, URI tmpUri) { - long expiryTimestamp = DEFAULT_TIMESTAMP; - if (expireSeconds > 0){ - expiryTimestamp = ((Calendar.getInstance().getTimeInMillis()/1000)+ expireSeconds); - } - String signature = signUrl(privateKey, tmpUri.toString(), urlEndpoint,expiryTimestamp); - queryMaker.put("ik-s=" + signature); - if(expiryTimestamp > 0 && expiryTimestamp != DEFAULT_TIMESTAMP) { - queryMaker.put("ik-t=" + expiryTimestamp); - } - } - - public static String signUrl(String privateKey, String url, String urlEndpoint, long expiryTimestamp){ - if (expiryTimestamp < 1){ - expiryTimestamp = DEFAULT_TIMESTAMP; - } - if (urlEndpoint.charAt(urlEndpoint.length()-1)!='/'){ - urlEndpoint+="/"; - } - String replaceUrl=url.replace(urlEndpoint,"")+expiryTimestamp; - return HmacUtils.hmacSha1Hex(privateKey, replaceUrl); - } + private static final long DEFAULT_TIMESTAMP = 9999999999L; + + public static String getUrl(Map options) { + String path = (String) options.get("path"); + String urlEndpoint = (String) options.get("urlEndpoint"); + String src = (String) options.get("src"); + Map queryParams = (Map) options.get("queryParameters"); + List> transformation = (List>) options.get("transformation"); + String transformationPosition = (String) options.get("transformationPosition"); + boolean signed = false; + if (null != options.get("signed")) { + signed = (boolean) options.get("signed"); + } + long expire = 0; + if (null != options.get("expireSeconds")) { + expire = (long) (int) options.get("expireSeconds"); + } + return UrlGen.generateUrl(path, urlEndpoint, src, queryParams, transformation, transformationPosition, signed, + expire); + } + + private static String generateUrl(String path, String urlEndpoint, String src, Map queryParameters, + List> transformation, String transformationPosition, boolean signed, + long expireSeconds) { + Configuration config = ImageKit.getInstance().getConfig(); + if (urlEndpoint == null) { + urlEndpoint = config.getUrlEndpoint(); + } + if (urlEndpoint.charAt(urlEndpoint.length() - 1) != '/') { + urlEndpoint += "/"; + } + String newUrl = null; + if (null != src) { + newUrl = buildFullUrl(src, queryParameters, transformation, transformationPosition, signed, expireSeconds, + config.getPrivateKey(), urlEndpoint); + } else { + if ("query".equalsIgnoreCase(transformationPosition)) { + newUrl = buildFullUrl(urlEndpoint + (path.charAt(0) == '/' ? path.substring(1, path.length()) : path), + queryParameters, transformation, transformationPosition, signed, expireSeconds, + config.getPrivateKey(), urlEndpoint); + } else { + newUrl = buildPathUrl(path.charAt(0) == '/' ? path : "/" + path, urlEndpoint, queryParameters, + transformation, transformationPosition, signed, expireSeconds, config.getPrivateKey()); + } + } + return newUrl; + } + + private static String buildPathUrl(String path, String urlEndpoint, Map queryParameters, + List> transformation, String transformationPosition, boolean signed, long expireSeconds, + String privateKey) { + + StringBuilder tr = new StringBuilder(""); + if (transformation.size() > 0) { + tr.append("tr"); + for (Map map : transformation) { + Set> entries = map.entrySet(); + tr.append(":"); + int i = 0; + for (Map.Entry entry : entries) { + String key = entry.getKey(); + String value = entry.getValue(); + String element = Transformer.getInstance().transform(key) + + (value.equalsIgnoreCase("-") ? "" : "-" + value); + tr.append(element.contains("oi") || element.contains("di") + ? element.replaceFirst("/", "").replaceAll("/", "@@") + : element); + if (i < entries.size() - 1) { + tr.append(","); + } + i++; + } + } + } + + QueryMaker queryMaker = new QueryMaker(); + if (null != queryParameters) { + for (Map.Entry entry : queryParameters.entrySet()) { + queryMaker.put(String.format(Locale.US, "%s=%s", entry.getKey(), entry.getValue())); + } + } + + URI baseUrl = URI.create(urlEndpoint); + URI newUri = null; + try { + String newPath = baseUrl.getPath(); + if (tr.toString().equalsIgnoreCase("")) { + newPath += path.substring(1, path.length()); + } else { + newPath += tr + path; + } + + URI tmpUri = new URI(baseUrl.getScheme(), baseUrl.getUserInfo(), baseUrl.getHost(), baseUrl.getPort(), + newPath, queryMaker.get(), null); + + if (signed) { + sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri); + } + + newUri = new URI(baseUrl.getScheme(), baseUrl.getUserInfo(), baseUrl.getHost(), baseUrl.getPort(), newPath, + queryMaker.get(), null); + + } catch (URISyntaxException e) { + e.printStackTrace(); + } + return newUri.toString(); + } + + private static String buildFullUrl(String src, Map queryParameters, + List> transformation, String transformationPosition, boolean signed, long expireSeconds, + String privateKey, String urlEndpoint) { + StringBuilder tr = new StringBuilder(""); + if (transformation.size() > 0) { + tr.append("tr="); + for (Map map : transformation) { + Set> entries = map.entrySet(); + if (!tr.toString().equalsIgnoreCase("tr=")) + tr.append(":"); + int i = 0; + for (Map.Entry entry : entries) { + String key = entry.getKey(); + String value = entry.getValue(); + String element = Transformer.getInstance().transform(key) + + (value.equalsIgnoreCase("-") ? "" : "-" + value); + tr.append(element); + if (i < entries.size() - 1) { + tr.append(","); + } + i++; + } + } + } + + QueryMaker queryMaker = new QueryMaker(); + + // check existing query params + if (null != src) { + String[] parts = src.split("\\?"); + if (parts.length > 1) { + String[] queries = parts[1].split("&"); + for (String query : queries) { + queryMaker.put(query); + } + } + } + + if (null != queryParameters) { + for (Map.Entry entry : queryParameters.entrySet()) { + queryMaker.put(String.format(Locale.US, "%s=%s", entry.getKey(), entry.getValue())); + } + } + if (!tr.toString().equalsIgnoreCase("")) { + queryMaker.put(tr.toString()); + } + + URI baseUrl = URI.create(src); + URI newUri = null; + try { + String newPath = baseUrl.getPath(); + URI tmpUri = new URI(baseUrl.getScheme(), baseUrl.getUserInfo(), baseUrl.getHost(), baseUrl.getPort(), + newPath, queryMaker.get(), null); + + if (signed) { + sign(urlEndpoint, expireSeconds, privateKey, queryMaker, tmpUri); + } + + newUri = new URI(baseUrl.getScheme(), baseUrl.getUserInfo(), baseUrl.getHost(), baseUrl.getPort(), newPath, + queryMaker.get(), null); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + return newUri.toString(); + } + + private static void sign(String urlEndpoint, long expireSeconds, String privateKey, QueryMaker queryMaker, + URI tmpUri) { + long expiryTimestamp = DEFAULT_TIMESTAMP; + if (expireSeconds > 0) { + expiryTimestamp = ((Calendar.getInstance().getTimeInMillis() / 1000) + expireSeconds); + } + String signature = signUrl(privateKey, tmpUri.toString(), urlEndpoint, expiryTimestamp); + queryMaker.put("ik-s=" + signature); + if (expiryTimestamp > 0 && expiryTimestamp != DEFAULT_TIMESTAMP) { + queryMaker.put("ik-t=" + expiryTimestamp); + } + } + + public static String signUrl(String privateKey, String url, String urlEndpoint, long expiryTimestamp) { + if (expiryTimestamp < 1) { + expiryTimestamp = DEFAULT_TIMESTAMP; + } + if (urlEndpoint.charAt(urlEndpoint.length() - 1) != '/') { + urlEndpoint += "/"; + } + String replaceUrl = url.replace(urlEndpoint, "") + expiryTimestamp; + return HmacUtils.hmacSha1Hex(privateKey, replaceUrl); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java deleted file mode 100644 index c16d465..0000000 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/CalculationTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package io.imagekit.sdk; - -import io.imagekit.sdk.utils.Utils; -import org.junit.Before; -import org.junit.Test; - -import java.util.Map; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -public class CalculationTest { - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - @Test - public void withoutToken_getAuthenticationParameters_successExpected() { - Map auth = SUT.getAuthenticationParameters(); - assertNotNull(auth); - } - - @Test(expected = RuntimeException.class) - public void withoutPrivateKey_getAuthenticationParameters_successExpected() { - SUT.getConfig().setPrivateKey(null); - Map auth = SUT.getAuthenticationParameters(); - assertNotNull(auth); - } - - @Test - public void withTokenAndExpire_getAuthenticationParameters_successExpected() { - Map auth = SUT.getAuthenticationParameters("your_token", 1582269249); - assertNotNull(auth); - assertEquals("your_token", auth.get("token")); - assertEquals("1582269249", auth.get("expire")); - assertEquals("98598e12a8eec9fedc883df4ae598618aaf24d87", auth.get("signature")); - } - - @Test - public void sameImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); - assertEquals(0, hammingDistance); - } - - @Test - public void similarImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("33699c96619cc69e", "968e978414fe04ea"); - assertEquals(30, hammingDistance); - } - - @Test - public void dissimilarImage_getHammingDistance_expectedSuccessWith() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518b", "7838873e791f8400"); - assertEquals(37, hammingDistance); - } - - @Test(expected = RuntimeException.class) - public void invalidHash_getHammingDistance_throwException() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518Z", "7838873e791f8400"); - } - - @Test(expected = RuntimeException.class) - public void differentLength_getHammingDistance_throwException() { - int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400"); - } -} diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java index f0b9cd8..9528413 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FileOperationTest.java @@ -25,231 +25,231 @@ import static org.junit.Assert.assertEquals; public class FileOperationTest { - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - @Test(expected = NotFoundException.class) - public void copyFile_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/sample_image.jpg"); - copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeFileVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No file found with filePath /sample_image.jpg\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFile(copyFileRequest); - server.takeRequest(); - } - - @Test - public void copyFile_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFileRequest copyFileRequest = new CopyFileRequest(); - copyFileRequest.setSourceFilePath("/car_false.jpeg"); - copyFileRequest.setDestinationPath("/Gallery/"); - copyFileRequest.setIncludeFileVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(204).setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFile(copyFileRequest); - RecordedRequest request = server.takeRequest(); - - String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeFileVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void moveFile_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); - moveFileRequest.setDestinationPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No file found with filePath /demo1/sample_image_th.jpg\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFile(moveFileRequest); - server.takeRequest(); - } - - @Test - public void moveFile_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFileRequest moveFileRequest = new MoveFileRequest(); - moveFileRequest.setSourceFilePath("/new_la.jpg"); - moveFileRequest.setDestinationPath("test"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(204).setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFile(moveFileRequest); - RecordedRequest request = server.takeRequest(); - - String moveFileRequestJson = "{\"sourceFilePath\":\"/new_la.jpg\",\"destinationPath\":\"test\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/sample_image_th.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" - + " \"message\": \"No file found in media library with filePath /sample_image_th.jpg\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"FILE_MISSING\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - server.takeRequest(); - } - - @Test(expected = ConflictException.class) - public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/new1.jpg"); - renameFileRequest.setNewFileName("new_car.jpg"); - renameFileRequest.setPurgeCache(false); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(409) - .setBody("{\n" - + " \"message\": \"File with name new_car.jpg already exists at the same location.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"FILE_ALREADY_EXISTS\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - server.takeRequest(); - } - - @Test - public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/car_false.jpeg"); - renameFileRequest.setNewFileName("new_car.jpeg"); - renameFileRequest.setPurgeCache(false); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - RecordedRequest request = server.takeRequest(); - - String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":false}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(renameFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); - } - - @Test - public void renameFile_successExpected_with_purge_cache() throws InterruptedException, IOException, ConflictException, - PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - RenameFileRequest renameFileRequest = new RenameFileRequest(); - renameFileRequest.setFilePath("/car_false.jpeg"); - renameFileRequest.setNewFileName("new_car.jpeg"); - renameFileRequest.setPurgeCache(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"purgeRequestId\": \"62b973a00f0ad4164f307dad\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.renameFile(renameFileRequest); - RecordedRequest request = server.takeRequest(); - - String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(renameFileRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); - } - - @Test(expected = InternalServerException.class) - public void getBulkJobStatus_500_Expected() - throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(500).setBody( - "{\n" + " \"message\": \"We have experienced an internal error while processing your request.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getBulkJobStatus("jobId"); - server.takeRequest(); - } - - @Test - public void getBulkJobStatus_successExpected() - throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" - + " \"type\": \"MOVE_FOLDER\",\n" + " \"status\": \"Completed\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); - RecordedRequest request = server.takeRequest(); - - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/bulkJobs/629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), - request.getRequestUrl().toString()); - } + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = NotFoundException.class) + public void copyFile_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/sample_image.jpg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeFileVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No file found with filePath /sample_image.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFile(copyFileRequest); + server.takeRequest(); + } + + @Test + public void copyFile_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFileRequest copyFileRequest = new CopyFileRequest(); + copyFileRequest.setSourceFilePath("/car_false.jpeg"); + copyFileRequest.setDestinationPath("/Gallery/"); + copyFileRequest.setIncludeFileVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFile(copyFileRequest); + RecordedRequest request = server.takeRequest(); + + String copyFileRequestJson = "{\"sourceFilePath\":\"/car_false.jpeg\",\"destinationPath\":\"/Gallery/\",\"includeFileVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/copy HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/copy"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void moveFile_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/demo1/sample_image_th.jpg"); + moveFileRequest.setDestinationPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No file found with filePath /demo1/sample_image_th.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFile(moveFileRequest); + server.takeRequest(); + } + + @Test + public void moveFile_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFileRequest moveFileRequest = new MoveFileRequest(); + moveFileRequest.setSourceFilePath("/new_la.jpg"); + moveFileRequest.setDestinationPath("test"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFile(moveFileRequest); + RecordedRequest request = server.takeRequest(); + + String moveFileRequestJson = "{\"sourceFilePath\":\"/new_la.jpg\",\"destinationPath\":\"test\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/move HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/move"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void renameFile_404_Expected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/sample_image_th.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + + " \"message\": \"No file found in media library with filePath /sample_image_th.jpg\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FILE_MISSING\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); + } + + @Test(expected = ConflictException.class) + public void renameFile_409_Expected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/new1.jpg"); + renameFileRequest.setNewFileName("new_car.jpg"); + renameFileRequest.setPurgeCache(false); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(409) + .setBody("{\n" + + " \"message\": \"File with name new_car.jpg already exists at the same location.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FILE_ALREADY_EXISTS\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + server.takeRequest(); + } + + @Test + public void renameFile_successExpected() throws InterruptedException, IOException, ConflictException, + PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/car_false.jpeg"); + renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setPurgeCache(false); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + RecordedRequest request = server.takeRequest(); + + String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":false}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(renameFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); + } + + @Test + public void renameFile_successExpected_with_purge_cache() throws InterruptedException, IOException, + ConflictException, PartialSuccessException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + RenameFileRequest renameFileRequest = new RenameFileRequest(); + renameFileRequest.setFilePath("/car_false.jpeg"); + renameFileRequest.setNewFileName("new_car.jpeg"); + renameFileRequest.setPurgeCache(true); + + MockWebServer server = new MockWebServer(); + server.enqueue( + new MockResponse().setBody("{\n" + " \"purgeRequestId\": \"62b973a00f0ad4164f307dad\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.renameFile(renameFileRequest); + RecordedRequest request = server.takeRequest(); + + String renameFileRequestJson = "{\"filePath\":\"/car_false.jpeg\",\"newFileName\":\"new_car.jpeg\",\"purgeCache\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(renameFileRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/rename HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/rename"), request.getRequestUrl().toString()); + } + + @Test(expected = InternalServerException.class) + public void getBulkJobStatus_500_Expected() + throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(500) + .setBody("{\n" + + " \"message\": \"We have experienced an internal error while processing your request.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getBulkJobStatus("jobId"); + server.takeRequest(); + } + + @Test + public void getBulkJobStatus_successExpected() + throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\",\n" + + " \"type\": \"MOVE_FOLDER\",\n" + " \"status\": \"Completed\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getBulkJobStatus("629f44ac7eb0fe8173622d4b"); + RecordedRequest request = server.takeRequest(); + + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/bulkJobs/629f44ac7eb0fe8173622d4b HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/629f44ac7eb0fe8173622d4b"), + request.getRequestUrl().toString()); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java index 2783f84..899fb0f 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/FolderOperationTest.java @@ -24,206 +24,204 @@ import static org.junit.Assert.assertEquals; public class FolderOperationTest { - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - @Test - public void createFolder_400_Expected() throws InterruptedException, IOException, UnknownException { - - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("/testFolder"); - createFolderRequest.setParentFolderPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400)); - server.enqueue( - new MockResponse().setBody("{\n" + " \"message\": \"folderName parameter cannot have a slash.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.createFolder(createFolderRequest); - server.takeRequest(); - } - - @Test - public void createFolder_successExpected() throws InterruptedException, IOException, UnknownException { - - CreateFolderRequest createFolderRequest = new CreateFolderRequest(); - createFolderRequest.setFolderName("testFolder"); - createFolderRequest.setParentFolderPath("/"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.createFolder(createFolderRequest); - RecordedRequest request = server.takeRequest(); - - String createFolderRequestJson = "{\"folderName\":\"testFolder\",\"parentFolderPath\":\"/\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(createFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void deleteFolder_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath("/testFolder"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No folder found with folderPath testFolder/\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"FOLDER_NOT_FOUND\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFolder(deleteFolderRequest); - server.takeRequest(); - } - - @Test - public void deleteFolder_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); - deleteFolderRequest.setFolderPath("testFolder"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(204).setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFolder(deleteFolderRequest); - RecordedRequest request = server.takeRequest(); - - String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(deleteFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void copyFolder_400_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/"); - copyFolderRequest.setDestinationPath("/test"); - copyFolderRequest.setIncludeFileVersions(false); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400) - .setBody("{\n" + - " \"message\": \"sourceFolderPath cannot be root\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"reason\": \"SOURCE_IS_ROOT\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFolder(copyFolderRequest); - server.takeRequest(); - } - - @Test(expected = NotFoundException.class) - public void copyFolder_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/testFolder"); - copyFolderRequest.setDestinationPath("/test"); - copyFolderRequest.setIncludeFileVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFolder(copyFolderRequest); - server.takeRequest(); - } - - @Test - public void copyFolder_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); - copyFolderRequest.setSourceFolderPath("/testFolder"); - copyFolderRequest.setDestinationPath("/Gallery"); - copyFolderRequest.setIncludeFileVersions(true); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.copyFolder(copyFolderRequest); - RecordedRequest request = server.takeRequest(); - - String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeFileVersions\":true}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(copyFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void moveFolder_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/testFolder/"); - moveFolderRequest.setDestinationPath("/Gallery"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFolder(moveFolderRequest); - server.takeRequest(); - } - - @Test - public void moveFolder_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); - moveFolderRequest.setSourceFolderPath("/testFolder"); - moveFolderRequest.setDestinationPath("/Gallery"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.moveFolder(moveFolderRequest); - RecordedRequest request = server.takeRequest(); - - String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\"}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(moveFolderRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); - } + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test + public void createFolder_400_Expected() throws InterruptedException, IOException, UnknownException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("/testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400)); + server.enqueue( + new MockResponse().setBody("{\n" + " \"message\": \"folderName parameter cannot have a slash.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.createFolder(createFolderRequest); + server.takeRequest(); + } + + @Test + public void createFolder_successExpected() throws InterruptedException, IOException, UnknownException { + + CreateFolderRequest createFolderRequest = new CreateFolderRequest(); + createFolderRequest.setFolderName("testFolder"); + createFolderRequest.setParentFolderPath("/"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.createFolder(createFolderRequest); + RecordedRequest request = server.takeRequest(); + + String createFolderRequestJson = "{\"folderName\":\"testFolder\",\"parentFolderPath\":\"/\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(createFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void deleteFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("/testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No folder found with folderPath testFolder/\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"FOLDER_NOT_FOUND\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFolder(deleteFolderRequest); + server.takeRequest(); + } + + @Test + public void deleteFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); + deleteFolderRequest.setFolderPath("testFolder"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFolder(deleteFolderRequest); + RecordedRequest request = server.takeRequest(); + + String deleteFolderRequestJson = "{\"folderPath\":\"testFolder\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(deleteFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/folder/ HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/folder/"), request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void copyFolder_400_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/"); + copyFolderRequest.setDestinationPath("/test"); + copyFolderRequest.setIncludeFileVersions(false); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + " \"message\": \"sourceFolderPath cannot be root\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"SOURCE_IS_ROOT\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + server.takeRequest(); + } + + @Test(expected = NotFoundException.class) + public void copyFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/test"); + copyFolderRequest.setIncludeFileVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + server.takeRequest(); + } + + @Test + public void copyFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); + copyFolderRequest.setSourceFolderPath("/testFolder"); + copyFolderRequest.setDestinationPath("/Gallery"); + copyFolderRequest.setIncludeFileVersions(true); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f43017eb0feff5c61f83c\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.copyFolder(copyFolderRequest); + RecordedRequest request = server.takeRequest(); + + String copyFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\",\"includeFileVersions\":true}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(copyFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void moveFolder_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder/"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No files & folder found at sourceFolderPath /testFolder\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"reason\": \"NO_FILES_FOLDER\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFolder(moveFolderRequest); + server.takeRequest(); + } + + @Test + public void moveFolder_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); + moveFolderRequest.setSourceFolderPath("/testFolder"); + moveFolderRequest.setDestinationPath("/Gallery"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"jobId\": \"629f44ac7eb0fe8173622d4b\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.moveFolder(moveFolderRequest); + RecordedRequest request = server.takeRequest(); + + String moveFolderRequestJson = "{\"sourceFolderPath\":\"/testFolder\",\"destinationPath\":\"/Gallery\"}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(moveFolderRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/bulkJobs/moveFolder HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/bulkJobs/moveFolder"), request.getRequestUrl().toString()); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java index 2aa7894..502c3de 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java @@ -20,453 +20,464 @@ import static org.junit.Assert.assertTrue; public class GetUrlTest { - private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern - .compile("(https://.*)\\?ik-s=(.*)&ik-t=(.*)"); - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { - java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl); - assertTrue(actualUrl + " does not look like a signed url", matcher.matches()); - assertEquals(expectedBaseUrl, matcher.group(1)); - assertFalse(matcher.group(2).trim().isEmpty()); - assertFalse(matcher.group(3).trim().isEmpty()); - } - - @Test - public void getUrl_with_height_width_options() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_height_width_options_url_version_check() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_new_transformation_params_options() throws IOException { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map newParams = new HashMap<>(); - newParams.put("myparam", "40"); - transformation.add(newParams); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:myparam-40/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_slash_in_path() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_without_slash_in_path() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map options = new HashMap<>(); - options.put("path", "default-image.jpg"); - options.put("transformation", transformation); - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_overriding_urlEndpoint() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_transformation_parameters() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - scale.put("aspectRatio", "4-3"); - scale.put("quality", "40"); - scale.put("crop", "force"); - scale.put("cropMode", "extract"); - scale.put("focus", "left"); - scale.put("format", "png"); - scale.put("radius", "20"); - scale.put("background", "A94D34"); - scale.put("border", "5-A94D34"); - scale.put("rotation", "90"); - scale.put("blur", "10"); - scale.put("named", "any_name"); - scale.put("overlayImage", "/folder/file.jpg"); - scale.put("overlayX", "20"); - scale.put("overlayY", "10"); - scale.put("overlayFocus", "top"); - scale.put("overlayHeight", "20"); - scale.put("overlayWidth", "20"); - scale.put("overlayText", "Image Text"); - scale.put("overlayTextFontSize", "18"); - scale.put("overlayTextFontFamily", "Open Sans"); - scale.put("overlayTextColor", "00FFFF"); - scale.put("overlayAlpha", ""); - scale.put("overlayTextTypography", "b"); - scale.put("overlayBackground", "00AAFF55"); - scale.put("overlayImageTrim", String.valueOf(false)); - scale.put("progressive", String.valueOf(true)); - scale.put("lossless", String.valueOf(true)); - scale.put("trim", "5"); - scale.put("metadata", String.valueOf(true)); - scale.put("colorProfile", String.valueOf(true)); - scale.put("defaultImage", "/folder/file.jpg"); - scale.put("dpr", "3"); - scale.put("effectSharpen", "-"); - scale.put("effectUSM", ""); - scale.put("effectContrast", "1"); - scale.put("effectGray", ""); - scale.put("original", String.valueOf(true)); - scale.put("raw", "w-200,h-200"); - - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,bo-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg", is(url)); - } - - @Test - public void getUrl_with_options_as_query() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - options.put("transformationPosition", "query"); - - String url = SUT.getUrl(options); - MatcherAssert.assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600", is(url)); - } - - @Test() - public void getUrl_with_options_as_path() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg?v=123", is(url)); - } - - @Test - public void getUrl_with_chained_transformation_options_as_query() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map rotate = new HashMap<>(); - rotate.put("rotation", "90"); - transformation.add(rotate); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - options.put("transformationPosition", "query"); - - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600:rt-90", is(url)); - } - - @Test - public void getUrl_with_chained_transformation_options_as_path() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map rotate = new HashMap<>(); - rotate.put("rotation", "90"); - transformation.add(rotate); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:rt-90/default-image.jpg?v=123", is(url)); - } - - @Test - public void getUrl_with_multiple_query_params_addition_check() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_double_and_check() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&&"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_double_question_mark_check() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg??"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_src() { - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_src_with_query_params() { - Map queryParams = new HashMap<>(); - queryParams.put("v", "123"); - queryParams.put("z", "234"); - - List> transformation = new ArrayList<>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue"); - options.put("queryParameters", queryParams); - options.put("transformation", transformation); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_src_with_query_params_but_transformationPosition_is_path() { - Map queryParam = new HashMap<>(); - queryParam.put("v", "123"); - queryParam.put("z", "234"); - - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("queryParameters", queryParam); - options.put("transformation", transformation); - options.put("transformationPosition", "path"); - - String url = SUT.getUrl(options); - assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", is(url)); - } - - @Test - public void getUrl_with_signature() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("width", "100"); - transformation.add(scale); - - Map options = new HashMap<>(); - options.put("path", "/test-signed-url.png"); - options.put("transformation", transformation); - options.put("signed", true); - options.put("expireSeconds", 1000); - - String url = SUT.getUrl(options); - - assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); - } - - @Test - public void getUrl_with_signature_src_noTransform() { - Map options = new HashMap<>(); - options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); - options.put("transformation", Collections.emptyList()); - options.put("signed", true); - options.put("expireSeconds", 1000); - - String url = SUT.getUrl(options); - - assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url); - } - - @Test - public void getUrl_with_time_expire() { - List> transformation = new ArrayList>(); - Map scale = new HashMap<>(); - scale.put("height", "600"); - scale.put("width", "400"); - transformation.add(scale); - Map rotate = new HashMap<>(); - rotate.put("rotation", "90"); - transformation.add(rotate); - - Map options = new HashMap<>(); - options.put("path", "/default-image.jpg"); - options.put("transformation", transformation); - options.put("expireSeconds", 100); - options.put("signed", true); - - String url = SUT.getUrl(options); - assertTrue(url.contains("ik-t")); - } + private static final Pattern IMAGEKIT_SIGNED_URL_PATTERN = Pattern.compile("(https://.*)\\?ik-s=(.*)&ik-t=(.*)"); + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + private void assertSignedUrl(String expectedBaseUrl, String actualUrl) { + java.util.regex.Matcher matcher = IMAGEKIT_SIGNED_URL_PATTERN.matcher(actualUrl); + assertTrue(actualUrl + " does not look like a signed url", matcher.matches()); + assertEquals(expectedBaseUrl, matcher.group(1)); + assertFalse(matcher.group(2).trim().isEmpty()); + assertFalse(matcher.group(3).trim().isEmpty()); + } + + @Test + public void getUrl_with_height_width_options() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_height_width_options_url_version_check() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_new_transformation_params_options() throws IOException { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map newParams = new HashMap<>(); + newParams.put("myparam", "40"); + transformation.add(newParams); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:myparam-40/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_slash_in_path() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_without_slash_in_path() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map options = new HashMap<>(); + options.put("path", "default-image.jpg"); + options.put("transformation", transformation); + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_overriding_urlEndpoint() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat( + "https://ik.imagekit.io/your_imagekit_id/different-url-endpoint-prefix/tr:w-400,h-600/default-image.jpg", + is(url)); + } + + @Test + public void getUrl_with_transformation_parameters() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + scale.put("aspectRatio", "4-3"); + scale.put("quality", "40"); + scale.put("crop", "force"); + scale.put("cropMode", "extract"); + scale.put("focus", "left"); + scale.put("format", "png"); + scale.put("radius", "20"); + scale.put("background", "A94D34"); + scale.put("border", "5-A94D34"); + scale.put("rotation", "90"); + scale.put("blur", "10"); + scale.put("named", "any_name"); + scale.put("overlayImage", "/folder/file.jpg"); + scale.put("overlayX", "20"); + scale.put("overlayY", "10"); + scale.put("overlayFocus", "top"); + scale.put("overlayHeight", "20"); + scale.put("overlayWidth", "20"); + scale.put("overlayText", "Image Text"); + scale.put("overlayTextFontSize", "18"); + scale.put("overlayTextFontFamily", "Open Sans"); + scale.put("overlayTextColor", "00FFFF"); + scale.put("overlayAlpha", ""); + scale.put("overlayTextTypography", "b"); + scale.put("overlayBackground", "00AAFF55"); + scale.put("overlayImageTrim", String.valueOf(false)); + scale.put("progressive", String.valueOf(true)); + scale.put("lossless", String.valueOf(true)); + scale.put("trim", "5"); + scale.put("metadata", String.valueOf(true)); + scale.put("colorProfile", String.valueOf(true)); + scale.put("defaultImage", "/folder/file.jpg"); + scale.put("dpr", "3"); + scale.put("effectSharpen", "-"); + scale.put("effectUSM", ""); + scale.put("effectContrast", "1"); + scale.put("effectGray", ""); + scale.put("original", String.valueOf(true)); + scale.put("raw", "w-200,h-200"); + + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat( + "https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,bo-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", + is(url)); + } + + @Test + public void getUrl_with_overriding_urlEndpoint_double_slash_tests() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("urlEndpoint", "https://ik.imagekit.io/your_imagekit_id/"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg", is(url)); + } + + @Test + public void getUrl_with_options_as_query() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + options.put("transformationPosition", "query"); + + String url = SUT.getUrl(options); + MatcherAssert.assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600", is(url)); + } + + @Test() + public void getUrl_with_options_as_path() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600/default-image.jpg?v=123", is(url)); + } + + @Test + public void getUrl_with_chained_transformation_options_as_query() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + options.put("transformationPosition", "query"); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/default-image.jpg?v=123&tr=w-400,h-600:rt-90", is(url)); + } + + @Test + public void getUrl_with_chained_transformation_options_as_path() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat(SUT.getConfig().getUrlEndpoint() + "/tr:w-400,h-600:rt-90/default-image.jpg?v=123", is(url)); + } + + @Test + public void getUrl_with_multiple_query_params_addition_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat( + "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", + is(url)); + } + + @Test + public void getUrl_with_double_and_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&&"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat( + "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?q=abc&v=123&z=234&tr=w-400,h-600", + is(url)); + } + + @Test + public void getUrl_with_double_question_mark_check() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg??"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", + is(url)); + } + + @Test + public void getUrl_with_src() { + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?tr=w-400,h-600", is(url)); + } + + @Test + public void getUrl_src_with_query_params() { + Map queryParams = new HashMap<>(); + queryParams.put("v", "123"); + queryParams.put("z", "234"); + + List> transformation = new ArrayList<>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue"); + options.put("queryParameters", queryParams); + options.put("transformation", transformation); + + String url = SUT.getUrl(options); + assertThat( + "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?srcParam=srcParamValue&v=123&z=234&tr=w-400,h-600", + is(url)); + } + + @Test + public void getUrl_src_with_query_params_but_transformationPosition_is_path() { + Map queryParam = new HashMap<>(); + queryParam.put("v", "123"); + queryParam.put("z", "234"); + + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("queryParameters", queryParam); + options.put("transformation", transformation); + options.put("transformationPosition", "path"); + + String url = SUT.getUrl(options); + assertThat("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg?v=123&z=234&tr=w-400,h-600", + is(url)); + } + + @Test + public void getUrl_with_signature() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("width", "100"); + transformation.add(scale); + + Map options = new HashMap<>(); + options.put("path", "/test-signed-url.png"); + options.put("transformation", transformation); + options.put("signed", true); + options.put("expireSeconds", 1000); + + String url = SUT.getUrl(options); + + assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); + } + + @Test + public void getUrl_with_signature_src_noTransform() { + Map options = new HashMap<>(); + options.put("src", "https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg"); + options.put("transformation", Collections.emptyList()); + options.put("signed", true); + options.put("expireSeconds", 1000); + + String url = SUT.getUrl(options); + + assertSignedUrl("https://ik.imagekit.io/your_imagekit_id/endpoint/default-image.jpg", url); + } + + @Test + public void getUrl_with_time_expire() { + List> transformation = new ArrayList>(); + Map scale = new HashMap<>(); + scale.put("height", "600"); + scale.put("width", "400"); + transformation.add(scale); + Map rotate = new HashMap<>(); + rotate.put("rotation", "90"); + transformation.add(rotate); + + Map options = new HashMap<>(); + options.put("path", "/default-image.jpg"); + options.put("transformation", transformation); + options.put("expireSeconds", 100); + options.put("signed", true); + + String url = SUT.getUrl(options); + assertTrue(url.contains("ik-t")); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 1d5ac4e..40f3173 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -3,7 +3,10 @@ import io.imagekit.sdk.config.Configuration; import org.junit.Test; +import java.util.Map; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class ImageKitTest { @@ -17,4 +20,54 @@ public void imageKit_configurationTest() { assertEquals(config.toString(), ImageKit.getInstance().getConfig().toString()); } + @Test + public void withoutToken_getAuthenticationParameters_successExpected() { + Map auth = SUT.getAuthenticationParameters(); + assertNotNull(auth); + } + + @Test(expected = RuntimeException.class) + public void withoutPrivateKey_getAuthenticationParameters_successExpected() { + SUT.getConfig().setPrivateKey(null); + Map auth = SUT.getAuthenticationParameters(); + assertNotNull(auth); + } + + @Test + public void withTokenAndExpire_getAuthenticationParameters_successExpected() { + Map auth = SUT.getAuthenticationParameters("your_token", 1582269249); + assertNotNull(auth); + assertEquals("your_token", auth.get("token")); + assertEquals("1582269249", auth.get("expire")); + assertEquals("98598e12a8eec9fedc883df4ae598618aaf24d87", auth.get("signature")); + } + + @Test + public void sameImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("f06830ca9f1e3e90", "f06830ca9f1e3e90"); + assertEquals(0, hammingDistance); + } + + @Test + public void similarImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("33699c96619cc69e", "968e978414fe04ea"); + assertEquals(30, hammingDistance); + } + + @Test + public void dissimilarImage_getHammingDistance_expectedSuccessWith() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518b", "7838873e791f8400"); + assertEquals(37, hammingDistance); + } + + @Test(expected = RuntimeException.class) + public void invalidHash_getHammingDistance_throwException() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518Z", "7838873e791f8400"); + } + + @Test(expected = RuntimeException.class) + public void differentLength_getHammingDistance_throwException() { + int hammingDistance = SUT.pHashDistance("a4a65595ac94518b3", "7838873e791f8400"); + } + } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java index 0cc7a9b..cbb68f9 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/PurgeCacheTest.java @@ -20,79 +20,79 @@ public class PurgeCacheTest { - private ImageKit SUT; + private ImageKit SUT; - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } - @Test(expected = BadRequestException.class) - public void imageKit_purgeCache_404Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"Invalid url\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.purgeCache("url"); + @Test(expected = BadRequestException.class) + public void imageKit_purgeCache_404Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Invalid url\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.purgeCache("url"); - server.takeRequest(); - } + server.takeRequest(); + } - @Test - public void imageKit_purgeCache_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.purgeCache("https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg"); + @Test + public void imageKit_purgeCache_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"requestId\": \"62b01f15214dfbdf3692dd0a\"\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.purgeCache("https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg"); - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("{\"url\":\"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\"}", utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/purge HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge"), request.getRequestUrl().toString()); - } + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("{\"url\":\"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\"}", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/purge HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge"), request.getRequestUrl().toString()); + } - @Test(expected = BadRequestException.class) - public void imageKit_getPurgeCacheStatus_400Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"No request found for this requestId.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0b"); + @Test(expected = BadRequestException.class) + public void imageKit_getPurgeCacheStatus_400Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"No request found for this requestId.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0b"); - server.takeRequest(); - } + server.takeRequest(); + } - @Test - public void imageKit_getPurgeCacheStatus_successExpected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"status\": \"Completed\"\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0a"); + @Test + public void imageKit_getPurgeCacheStatus_successExpected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"status\": \"Completed\"\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getPurgeCacheStatus("62b01f15214dfbdf3692dd0a"); - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/purge/62b01f15214dfbdf3692dd0a HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge/62b01f15214dfbdf3692dd0a"), - request.getRequestUrl().toString()); - } + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/purge/62b01f15214dfbdf3692dd0a HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/purge/62b01f15214dfbdf3692dd0a"), + request.getRequestUrl().toString()); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java index aa9f2e1..89305aa 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java @@ -27,189 +27,190 @@ import static org.junit.Assert.assertEquals; public class UploadTest { - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - @Test(expected = UnknownHostException.class) - public void imageKit_upload_expect_UnknownHostException() throws IOException { - String imageUrl = "https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; - URL url = new URL(imageUrl); - HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); - urlConnect.getContent(); - } - - @Test(expected = RuntimeException.class) - public void imageKit_upload_expected_RuntimeException_for_file() throws IOException, InterruptedException, InternalServerException, - BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - FileCreateRequest fileCreateRequest = new FileCreateRequest((String) null, "sample-cat-image.png"); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("java.lang.RuntimeException: Error: File not provided.")); - server.start(); - RestClient.UPLOAD_BASE_URL = server.url("/").toString(); - SUT.upload(fileCreateRequest); - RecordedRequest request = server.takeRequest(); - } - - @Test - public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, - BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url = new URL(imageUrl); - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileCreateRequest.setTags(tags); - fileCreateRequest.setFolder("demo1"); - String customCoordinates = "10,10,20,20"; - fileCreateRequest.setCustomCoordinates(customCoordinates); - - List responseFields = new ArrayList<>(); - responseFields.add("thumbnail"); - responseFields.add("tags"); - responseFields.add("customCoordinates"); - - fileCreateRequest.setResponseFields(responseFields); - JsonObject optionsInnerObject = new JsonObject(); - optionsInnerObject.addProperty("add_shadow", true); - JsonObject innerObject1 = new JsonObject(); - innerObject1.addProperty("name", "remove-bg"); - innerObject1.add("options", optionsInnerObject); - JsonObject innerObject2 = new JsonObject(); - innerObject2.addProperty("name", "google-auto-tagging"); - innerObject2.addProperty("minConfidence", 10); - innerObject2.addProperty("maxTags", 5); - JsonArray jsonArray = new JsonArray(); - jsonArray.add(innerObject1); - jsonArray.add(innerObject2); - fileCreateRequest.setExtensions(jsonArray); - fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); - fileCreateRequest.setUseUniqueFileName(false); - fileCreateRequest.setPrivateFile(false); - fileCreateRequest.setOverwriteFile(true); - fileCreateRequest.setOverwriteAITags(false); - fileCreateRequest.setOverwriteTags(false); - fileCreateRequest.setOverwriteCustomMetadata(true); - JsonObject jsonObjectCustomMetadata = new JsonObject(); - jsonObjectCustomMetadata.addProperty("test1", 10); - fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"fileId\": \"62a465d245a84a0ef3852968\",\n" - + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + " \"size\": 23023,\n" - + " \"versionInfo\": {\n" + " \"id\": \"62a465d245a84a0ef3852968\",\n" - + " \"name\": \"Version 1\"\n" + " },\n" - + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"height\": 354,\n" + " \"width\": 236,\n" - + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"AITags\": [\n" + " {\n" + " \"name\": \"Clothing\",\n" - + " \"confidence\": 98.77,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Plant\",\n" - + " \"confidence\": 96.51,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Smile\",\n" - + " \"confidence\": 95.31,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Shoe\",\n" - + " \"confidence\": 95.2,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Street light\",\n" - + " \"confidence\": 91.05,\n" + " \"source\": \"google-auto-tagging\"\n" - + " }\n" + " ],\n" + " \"extensionStatus\": {\n" + " \"remove-bg\": \"pending\",\n" - + " \"google-auto-tagging\": \"success\"\n" + " }\n" + "}")); - server.start(); - RestClient.UPLOAD_BASE_URL = server.url("/").toString(); - SUT.upload(fileCreateRequest); - RecordedRequest request = server.takeRequest(); - String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" - + "Content-Length: 53\r\n" + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"fileName\"\r\n" - + "Content-Length: 20\r\n" + "\r\n" + "sample-cat-image.png\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" - + "false\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"tags\"\r\n" + "Content-Length: 27\r\n" + "\r\n" - + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + "Content-Length: 11\r\n" + "\r\n" - + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" - + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" - + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" - + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" - + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; - assertEquals(json, request.getBody().readUtf8().trim()); - assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void imageKit_upload_400_expected() throws IOException, InterruptedException, InternalServerException, - BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; - URL url = new URL(imageUrl); - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileCreateRequest.setTags(tags); - fileCreateRequest.setFolder("demo1"); - String customCoordinates = "10,10,20,20"; - fileCreateRequest.setCustomCoordinates(customCoordinates); - - List responseFields = new ArrayList<>(); - responseFields.add("thumbnail"); - responseFields.add("tags"); - responseFields.add("customCoordinates"); - - fileCreateRequest.setResponseFields(responseFields); - JsonObject optionsInnerObject = new JsonObject(); - optionsInnerObject.addProperty("add_shadow", true); - JsonObject innerObject1 = new JsonObject(); - innerObject1.addProperty("name", "remove-bg"); - innerObject1.add("options", optionsInnerObject); - JsonObject innerObject2 = new JsonObject(); - innerObject2.addProperty("name", "google-auto-tagging"); - innerObject2.addProperty("minConfidence", 10); - innerObject2.addProperty("maxTags", 5); - JsonArray jsonArray = new JsonArray(); - jsonArray.add(innerObject1); - jsonArray.add(innerObject2); - fileCreateRequest.setExtensions(jsonArray); - fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); - fileCreateRequest.setUseUniqueFileName(false); - fileCreateRequest.setPrivateFile(false); - fileCreateRequest.setOverwriteFile(false); - fileCreateRequest.setOverwriteAITags(false); - fileCreateRequest.setOverwriteTags(false); - fileCreateRequest.setOverwriteCustomMetadata(true); - JsonObject jsonObjectCustomMetadata = new JsonObject(); - jsonObjectCustomMetadata.addProperty("test1", 10); - fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + - " \"message\": \"A file with the same name already exists at the exact location. We could not overwrite it because both overwriteFile and useUniqueFileName are set to false.\"\n" + - "}")); - server.start(); - RestClient.UPLOAD_BASE_URL = server.url("/").toString(); - SUT.upload(fileCreateRequest); - server.takeRequest(); - } + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = UnknownHostException.class) + public void imageKit_upload_expect_UnknownHostException() throws IOException { + String imageUrl = "https://homepagesabc.cae.wisc.edu/~ece533/images/12.png"; + URL url = new URL(imageUrl); + HttpURLConnection urlConnect = (HttpURLConnection) url.openConnection(); + urlConnect.getContent(); + } + + @Test(expected = RuntimeException.class) + public void imageKit_upload_expected_RuntimeException_for_file() + throws IOException, InterruptedException, InternalServerException, BadRequestException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + FileCreateRequest fileCreateRequest = new FileCreateRequest((String) null, "sample-cat-image.png"); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("java.lang.RuntimeException: Error: File not provided.")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + RecordedRequest request = server.takeRequest(); + } + + @Test + public void imageKit_upload_returnSuccess() throws IOException, InterruptedException, InternalServerException, + BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; + URL url = new URL(imageUrl); + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + fileCreateRequest.setFolder("demo1"); + String customCoordinates = "10,10,20,20"; + fileCreateRequest.setCustomCoordinates(customCoordinates); + + List responseFields = new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); + + fileCreateRequest.setResponseFields(responseFields); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 10); + innerObject2.addProperty("maxTags", 5); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + fileCreateRequest.setUseUniqueFileName(false); + fileCreateRequest.setPrivateFile(false); + fileCreateRequest.setOverwriteFile(true); + fileCreateRequest.setOverwriteAITags(false); + fileCreateRequest.setOverwriteTags(false); + fileCreateRequest.setOverwriteCustomMetadata(true); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"fileId\": \"62a465d245a84a0ef3852968\",\n" + + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + " \"size\": 23023,\n" + + " \"versionInfo\": {\n" + " \"id\": \"62a465d245a84a0ef3852968\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"height\": 354,\n" + " \"width\": 236,\n" + + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" + + " \"AITags\": [\n" + " {\n" + " \"name\": \"Clothing\",\n" + + " \"confidence\": 98.77,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Plant\",\n" + + " \"confidence\": 96.51,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Smile\",\n" + + " \"confidence\": 95.31,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Shoe\",\n" + + " \"confidence\": 95.2,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Street light\",\n" + + " \"confidence\": 91.05,\n" + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + " ],\n" + " \"extensionStatus\": {\n" + " \"remove-bg\": \"pending\",\n" + + " \"google-auto-tagging\": \"success\"\n" + " }\n" + "}")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + RecordedRequest request = server.takeRequest(); + String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" + + "Content-Length: 53\r\n" + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"fileName\"\r\n" + + "Content-Length: 20\r\n" + "\r\n" + "sample-cat-image.png\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + + "false\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"tags\"\r\n" + "Content-Length: 27\r\n" + "\r\n" + + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + "Content-Length: 11\r\n" + "\r\n" + + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" + + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" + + "true\r\n" + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" + + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" + + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; + assertEquals(json, request.getBody().readUtf8().trim()); + assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void imageKit_upload_400_expected() throws IOException, InterruptedException, InternalServerException, + BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + String imageUrl = "https://homepages.cae.wisc.edu/~ece533/images/cat.png"; + URL url = new URL(imageUrl); + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "sample-cat-image.png"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + fileCreateRequest.setFolder("demo1"); + String customCoordinates = "10,10,20,20"; + fileCreateRequest.setCustomCoordinates(customCoordinates); + + List responseFields = new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); + + fileCreateRequest.setResponseFields(responseFields); + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 10); + innerObject2.addProperty("maxTags", 5); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + fileCreateRequest.setExtensions(jsonArray); + fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + fileCreateRequest.setUseUniqueFileName(false); + fileCreateRequest.setPrivateFile(false); + fileCreateRequest.setOverwriteFile(false); + fileCreateRequest.setOverwriteAITags(false); + fileCreateRequest.setOverwriteTags(false); + fileCreateRequest.setOverwriteCustomMetadata(true); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test1", 10); + fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" + + " \"message\": \"A file with the same name already exists at the exact location. We could not overwrite it because both overwriteFile and useUniqueFileName are set to false.\"\n" + + "}")); + server.start(); + RestClient.UPLOAD_BASE_URL = server.url("/").toString(); + SUT.upload(fileCreateRequest); + server.takeRequest(); + } } \ No newline at end of file diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java index 276bcb5..24afd04 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java @@ -24,217 +24,217 @@ public class CustomMetaDataFieldTest { - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - @Test - public void get_custom_metadata_fields_expectedSuccessWith() - throws IOException, InterruptedException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" - + " \"name\": \"price\",\n" + " \"label\": \"Amount\",\n" + " \"schema\": {\n" - + " \"minValue\": 10,\n" + " \"maxValue\": 200,\n" - + " \"type\": \"Number\"\n" + " }\n" + " },\n" + " {\n" - + " \"id\": \"6296f91191fa57ccc36b15cf\",\n" + " \"name\": \"Amount2\",\n" - + " \"label\": \"Amouunt\",\n" + " \"schema\": {\n" - + " \"type\": \"Number\",\n" + " \"minValue\": 10,\n" - + " \"maxValue\": 1000\n" + " }\n" + " }\n" + "]")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getCustomMetaDataFields(false); - RecordedRequest request = server.takeRequest(); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/customMetadataFields?includeDeleted=false HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), - request.getRequestUrl().toString()); - } - - @Test(expected = BadRequestException.class) - public void createCustomMetaDataFields_expected_400() - throws InterruptedException, IOException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"errors\": {\n" - + " \"minValue\": \"not allowed for this type\",\n" - + " \"maxValue\": \"not allowed for this type\"\n" + " }\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("mockName"); - customMetaDataFieldCreateRequest.setLabel("mockLabel"); - customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - ResultCustomMetaDataField resultCustomMetaDataField = SUT - .createCustomMetaDataFields(customMetaDataFieldCreateRequest); - RecordedRequest request = server.takeRequest(); - String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); - assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); - } - - @Test - public void createCustomMetaDataFields_successExpected() - throws InterruptedException, IOException, BadRequestException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" - + " \"name\": \"test1\",\n" + " \"label\": \"test1\",\n" + " \"schema\": {\n" - + " \"type\": \"Number\",\n" + " \"isValueRequired\": false,\n" - + " \"minValue\": 10,\n" + " \"maxValue\": 1000\n" + " }\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); - customMetaDataFieldCreateRequest.setName("mockName"); - customMetaDataFieldCreateRequest.setLabel("mockLabel"); - customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); - RecordedRequest request = server.takeRequest(); - - String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void deleteCustomMetaDataField_404_Expected() - throws IOException, InterruptedException, NotFoundException, UnknownException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - SUT.deleteCustomMetaDataField("6296fd7091fa5768106b808E"); - server.takeRequest(); - } - - @Test - public void deleteCustomMetaDataField_successExpected() - throws IOException, InterruptedException, NotFoundException, UnknownException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); - RecordedRequest request = server.takeRequest(); - - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), - request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void updateCustomMetaDataFields_404_Expected() - throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setMinLength(10); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808E"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - server.takeRequest(); - } - - @Test(expected = BadRequestException.class) - public void updateCustomMetaDataFields_400_Expected() - throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400) - .setBody("{\n" + " \"message\": \"Invalid schema object\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"errors\": {\n" + " \"minLength\": \"not allowed for this type\"\n" + " }\n" - + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setMinLength(10); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - server.takeRequest(); - } - - @Test - public void updateCustomMetaDataFields_successExpected() - throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse() - .setBody("{\n" + " \"id\": \"6296fd7091fa5768106b808d\",\n" + " \"name\": \"Amount3\",\n" - + " \"label\": \"testPrices\",\n" + " \"schema\": {\n" + " \"minValue\": 0,\n" - + " \"maxValue\": 10,\n" + " \"type\": \"Number\"\n" + " }\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - - CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); - mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); - mockCustomMetaDataFieldSchemaObject.setMinValue(10); - mockCustomMetaDataFieldSchemaObject.setMaxValue(100); - - CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); - customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); - customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); - customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); - - SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); - RecordedRequest request = server.takeRequest(); - - String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), - request.getRequestUrl().toString()); - } + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test + public void get_custom_metadata_fields_expectedSuccessWith() + throws IOException, InterruptedException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"id\": \"6291f00890ba008cc27f64d1\",\n" + + " \"name\": \"price\",\n" + " \"label\": \"Amount\",\n" + " \"schema\": {\n" + + " \"minValue\": 10,\n" + " \"maxValue\": 200,\n" + + " \"type\": \"Number\"\n" + " }\n" + " },\n" + " {\n" + + " \"id\": \"6296f91191fa57ccc36b15cf\",\n" + " \"name\": \"Amount2\",\n" + + " \"label\": \"Amouunt\",\n" + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + " \"minValue\": 10,\n" + + " \"maxValue\": 1000\n" + " }\n" + " }\n" + "]")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getCustomMetaDataFields(false); + RecordedRequest request = server.takeRequest(); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/customMetadataFields?includeDeleted=false HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields?includeDeleted=false"), + request.getRequestUrl().toString()); + } + + @Test(expected = BadRequestException.class) + public void createCustomMetaDataFields_expected_400() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + " \"errors\": {\n" + + " \"minValue\": \"not allowed for this type\",\n" + + " \"maxValue\": \"not allowed for this type\"\n" + " }\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + ResultCustomMetaDataField resultCustomMetaDataField = SUT + .createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(400, resultCustomMetaDataField.getResponseMetaData().getHttpStatusCode()); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test + public void createCustomMetaDataFields_successExpected() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"id\": \"629f2e2f7eb0fe2eb25f9988\",\n" + + " \"name\": \"test1\",\n" + " \"label\": \"test1\",\n" + " \"schema\": {\n" + + " \"type\": \"Number\",\n" + " \"isValueRequired\": false,\n" + + " \"minValue\": 10,\n" + " \"maxValue\": 1000\n" + " }\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void deleteCustomMetaDataField_404_Expected() + throws IOException, InterruptedException, NotFoundException, UnknownException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + SUT.deleteCustomMetaDataField("6296fd7091fa5768106b808E"); + server.takeRequest(); + } + + @Test + public void deleteCustomMetaDataField_successExpected() + throws IOException, InterruptedException, NotFoundException, UnknownException { + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + SUT.deleteCustomMetaDataField("629f2e2f7eb0fe2eb25f9988"); + RecordedRequest request = server.takeRequest(); + + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988 HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/629f2e2f7eb0fe2eb25f9988"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void updateCustomMetaDataFields_404_Expected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"No such custom metadata field exists\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("6296fd7091fa5768106b808E"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); + } + + @Test(expected = BadRequestException.class) + public void updateCustomMetaDataFields_400_Expected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + " \"message\": \"Invalid schema object\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"errors\": {\n" + " \"minLength\": \"not allowed for this type\"\n" + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + server.takeRequest(); + } + + @Test + public void updateCustomMetaDataFields_successExpected() + throws InterruptedException, IOException, BadRequestException, NotFoundException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse() + .setBody("{\n" + " \"id\": \"6296fd7091fa5768106b808d\",\n" + " \"name\": \"Amount3\",\n" + + " \"label\": \"testPrices\",\n" + " \"schema\": {\n" + " \"minValue\": 0,\n" + + " \"maxValue\": 10,\n" + " \"type\": \"Number\"\n" + " }\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); + mockCustomMetaDataFieldSchemaObject.setMinValue(10); + mockCustomMetaDataFieldSchemaObject.setMaxValue(100); + + CustomMetaDataFieldUpdateRequest customMetaDataFieldUpdateRequest = new CustomMetaDataFieldUpdateRequest(); + customMetaDataFieldUpdateRequest.setId("628f189d4e4ea318b69efa9d"); + customMetaDataFieldUpdateRequest.setLabel("mockEditLabel"); + customMetaDataFieldUpdateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.updateCustomMetaDataFields(customMetaDataFieldUpdateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldUpdateRequestJson = "{\"id\":\"628f189d4e4ea318b69efa9d\",\"label\":\"mockEditLabel\",\"schema\":{\"type\":\"Number\",\"minValue\":10,\"maxValue\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldUpdateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PATCH /v1/customMetadataFields/628f189d4e4ea318b69efa9d HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields/628f189d4e4ea318b69efa9d"), + request.getRequestUrl().toString()); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index b9af56d..7359fa8 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -29,431 +29,388 @@ public class FileTest { - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - @Test(expected = UnknownException.class) - public void imageKit_updateDetails_expected_404() - throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.updateFileDetail(fileUpdateRequest); - server.takeRequest(); - } - - @Test(expected = UnknownException.class) - public void imageKit_updateDetails_expected_400() - throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.updateFileDetail(fileUpdateRequest); - server.takeRequest(); - } - - @Test - public void imageKit_updateDetails_returnTrue() - throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" - + " \"name\": \"new_car.jpg\",\n" + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" - + " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" - + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"tags\": [\n" + " \"tagg\",\n" - + " \"tagg1\"\n" + " ],\n" + " \"AITags\": null,\n" + " \"versionInfo\": {\n" - + " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"name\": \"Version 1\"\n" + " },\n" - + " \"embeddedMetadata\": {\n" + " \"XResolution\": 250,\n" - + " \"YResolution\": 250,\n" + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" - + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + " },\n" - + " \"customCoordinates\": \"10,10,20,20\",\n" + " \"customMetadata\": {\n" - + " \"test100\": 10\n" + " },\n" + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/new_car.jpg\",\n" + " \"height\": 354,\n" - + " \"width\": 236,\n" + " \"size\": 23023,\n" + " \"hasAlpha\": false,\n" - + " \"mime\": \"image/jpeg\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileUpdateRequest.setTags(tags); - - SUT.updateFileDetail(fileUpdateRequest); - RecordedRequest request = server.takeRequest(); - - String requestJson = "{\"fileId\":\"62a9c3ccd875ec6fd658c854\",\"tags\":[\"Software\",\"Developer\",\"Engineer\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(requestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PATCH /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), - request.getRequestUrl().toString()); - } - - @Test - public void imageKit_getFileList_returnList() - throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, IOException { - - MockWebServer server = new MockWebServer(); - String responseJson = "[\n" + - " {\n" + - " \"type\": \"file\",\n" + - " \"name\": \"default-image.jpg\",\n" + - " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" + - " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" + - " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + - " \"tags\": null,\n" + - " \"AITags\": null,\n" + - " \"versionInfo\": {\n" + - " \"id\": \"62a4439bce686814dfcce65c\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"embeddedMetadata\": {\n" + - " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" + - " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + - " },\n" + - " \"customCoordinates\": null,\n" + - " \"customMetadata\": {},\n" + - " \"isPrivateFile\": false,\n" + - " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" + - " \"fileType\": \"image\",\n" + - " \"filePath\": \"/default-image.jpg\",\n" + - " \"height\": 1000,\n" + - " \"width\": 1000,\n" + - " \"size\": 147022,\n" + - " \"hasAlpha\": false,\n" + - " \"mime\": \"image/jpeg\"\n" + - " }\n" + - "]"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - Map options = new HashMap<>(); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - options.put("skip", "" + 0); - options.put("limit", "" + 1); - options.put("type", "file"); - options.put("sort", "ASC_CREATED"); - options.put("path", "/"); - options.put("fileType", "all"); - options.put("searchQuery","createdAt >= '2d' OR size < '2mb' OR format='png'"); - options.put("tags", String.valueOf(tags)); - SUT.getFileList(options); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), request.getRequestUrl().toString()); - - } - - @Test(expected = BadRequestException.class) - public void imageKit_getFileList_400_expected() - throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, IOException { - - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"Invalid search query - createdAt field must have a valid date value. Make sure the value is enclosed within quotes. Please refer to the documentation for syntax specification.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - Map options = new HashMap<>(); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - options.put("skip", "" + 0); - options.put("limit", "" + 1); - options.put("type", "file"); - options.put("sort", "ASC_CREATED"); - options.put("path", "/"); - options.put("fileType", "all"); - options.put("searchQuery","createdAt >= '2days' OR size < '2mb' OR format='png'"); - options.put("tags", String.valueOf(tags)); - SUT.getFileList(options); - - server.takeRequest(); - } - - @Test(expected = BadRequestException.class) - public void imageKit_getFileDetail__expected_400() - throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, - ForbiddenException, TooManyRequestsException, UnauthorizedException { - - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"Your request contains invalid fileId parameter.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileDetail("fileId"); - - server.takeRequest(); - } - - @Test - public void imageKit_getFileDetail_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"type\": \"file\",\n" + " \"name\": \"sample-image11_g1Qv0wpqP.jpg\",\n" - + " \"createdAt\": \"2022-06-20T05:00:41.830Z\",\n" - + " \"updatedAt\": \"2022-06-20T05:00:43.263Z\",\n" - + " \"fileId\": \"62affef97db937b028f3b47a\",\n" + " \"tags\": [\n" + " \"Software\",\n" - + " \"Developer\",\n" + " \"Engineer\"\n" + " ],\n" + " \"AITags\": null,\n" - + " \"versionInfo\": {\n" + " \"id\": \"62affef97db937b028f3b47a\",\n" - + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {},\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/demo/img/static-file-1.png\",\n" - + " \"fileType\": \"non-image\",\n" + " \"filePath\": \"/sample-image11_g1Qv0wpqP.jpg\",\n" - + " \"size\": 169170\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileDetail("62affef97db937b028f3b47a"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/62affef97db937b028f3b47a/details HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a/details"), - request.getRequestUrl().toString()); - } - - @Test - public void imageKit_getFileMetaData_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"height\": 300,\n" + - " \"width\": 300,\n" + - " \"size\": 51085,\n" + - " \"format\": \"jpg\",\n" + - " \"hasColorProfile\": false,\n" + - " \"quality\": 0,\n" + - " \"density\": 300,\n" + - " \"hasTransparency\": false,\n" + - " \"exif\": {\n" + - " \"image\": {\n" + - " \"Orientation\": 1,\n" + - " \"XResolution\": 300,\n" + - " \"YResolution\": 300,\n" + - " \"ResolutionUnit\": 2,\n" + - " \"Software\": \"Adobe Photoshop CS5 (12.0x20100115 [20100115.m.998 2010/01/15:02:00:00 cutoff; m branch]) Windows\",\n" + - " \"ModifyDate\": \"2017:09:11 22:15:46\",\n" + - " \"ExifOffset\": 236\n" + - " },\n" + - " \"thumbnail\": {\n" + - " \"Compression\": 6,\n" + - " \"XResolution\": 72,\n" + - " \"YResolution\": 72,\n" + - " \"ResolutionUnit\": 2,\n" + - " \"ThumbnailOffset\": 374,\n" + - " \"ThumbnailLength\": 4083\n" + - " },\n" + - " \"exif\": {\n" + - " \"ColorSpace\": 65535,\n" + - " \"ExifImageWidth\": 300,\n" + - " \"ExifImageHeight\": 300\n" + - " },\n" + - " \"gps\": {},\n" + - " \"interoperability\": {},\n" + - " \"makernote\": {}\n" + - " },\n" + - " \"pHash\": \"2df5da2dd63c6926\"\n" + - "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileMetadata("62b43109d23153217b8b8a36"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/62b43109d23153217b8b8a36/metadata HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/files/62b43109d23153217b8b8a36/metadata"), - request.getRequestUrl().toString()); - - } - - @Test(expected = BadRequestException.class) - public void imageKit_getFileMetaData_400_Expected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"Your request contains invalid fileId parameter.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + - " \"type\": \"INVALID_PARAM_ERROR\"\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileMetadata("fileId"); - server.takeRequest(); - } - - @Test - public void imageKit_getRemoteFileMetaData_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" - + " \"format\": \"jpg\",\n" + " \"hasColorProfile\": false,\n" + " \"quality\": 0,\n" - + " \"density\": 72,\n" + " \"hasTransparency\": false,\n" + " \"exif\": {},\n" - + " \"pHash\": \"e0d52b612ad538f6\"\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getRemoteFileMetadata("https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg"), - request.getRequestUrl().toString()); - - } - - @Test(expected = BadRequestException.class) - public void imageKit_getRemoteFileMetaData_400_Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"remote_url should be accessible using your ImageKit.io account.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getRemoteFileMetadata("remote_url"); - - server.takeRequest(); - } - - @Test(expected = BadRequestException.class) - public void imageKit_deleteFile_400_Expected() - throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, - BadRequestException, UnknownException, InterruptedException, IOException { - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + - " \"message\": \"Your request contains invalid fileId parameter.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}"; - server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFile("629f3de17eb0fe4053615450"); - - server.takeRequest(); - } - - @Test - public void imageKit_deleteFile_successExpected() - throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, InterruptedException { - MockWebServer server = new MockWebServer(); - String responseJson = ""; - server.enqueue(new MockResponse().setResponseCode(204).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFile("62affef97db937b028f3b47a"); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/files/62affef97db937b028f3b47a HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a"), - request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, - InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, - BadRequestException, UnknownException, IOException, InterruptedException { - List fileIds = new ArrayList<>(); - fileIds.add("file_id_1"); - fileIds.add("file_id_2"); - fileIds.add("file_id_3"); - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.bulkDeleteFiles(fileIds); - - server.takeRequest(); - } - - @Test - public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, - InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, - BadRequestException, UnknownException, IOException, InterruptedException { - List fileIds = new ArrayList<>(); - fileIds.add("62ad9ece7db937e35ef18dda"); - MockWebServer server = new MockWebServer(); - String responseJson = "{\n" + " \"successfullyDeletedFileIds\": [\n" - + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setBody(responseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.bulkDeleteFiles(fileIds); - - RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("{\"fileIds\":[\"62ad9ece7db937e35ef18dda\"]}", utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/batch/deleteByFileIds HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/batch/deleteByFileIds"), - request.getRequestUrl().toString()); - } + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = UnknownException.class) + public void imageKit_updateDetails_expected_404() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.updateFileDetail(fileUpdateRequest); + server.takeRequest(); + } + + @Test(expected = UnknownException.class) + public void imageKit_updateDetails_expected_400() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c804"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"The requested file does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.updateFileDetail(fileUpdateRequest); + server.takeRequest(); + } + + @Test + public void imageKit_updateDetails_returnTrue() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" + + " \"name\": \"new_car.jpg\",\n" + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + + " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" + + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"tags\": [\n" + " \"tagg\",\n" + + " \"tagg1\"\n" + " ],\n" + " \"AITags\": null,\n" + " \"versionInfo\": {\n" + + " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + + " \"embeddedMetadata\": {\n" + " \"XResolution\": 250,\n" + + " \"YResolution\": 250,\n" + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + " },\n" + + " \"customCoordinates\": \"10,10,20,20\",\n" + " \"customMetadata\": {\n" + + " \"test100\": 10\n" + " },\n" + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/new_car.jpg\",\n" + " \"height\": 354,\n" + + " \"width\": 236,\n" + " \"size\": 23023,\n" + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileUpdateRequest.setTags(tags); + + SUT.updateFileDetail(fileUpdateRequest); + RecordedRequest request = server.takeRequest(); + + String requestJson = "{\"fileId\":\"62a9c3ccd875ec6fd658c854\",\"tags\":[\"Software\",\"Developer\",\"Engineer\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(requestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PATCH /v1/files/62a9c3ccd875ec6fd658c854/details HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/details"), + request.getRequestUrl().toString()); + } + + @Test + public void imageKit_getFileList_returnList() + throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, IOException { + + MockWebServer server = new MockWebServer(); + String responseJson = "[\n" + " {\n" + " \"type\": \"file\",\n" + + " \"name\": \"default-image.jpg\",\n" + + " \"createdAt\": \"2022-06-11T07:26:19.294Z\",\n" + + " \"updatedAt\": \"2022-06-11T07:26:19.600Z\",\n" + + " \"fileId\": \"62a4439bce686814dfcce65c\",\n" + " \"tags\": null,\n" + + " \"AITags\": null,\n" + " \"versionInfo\": {\n" + + " \"id\": \"62a4439bce686814dfcce65c\",\n" + " \"name\": \"Version 1\"\n" + + " },\n" + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-06-11T07:26:19.599Z\",\n" + + " \"DateTimeCreated\": \"2022-06-11T07:26:19.600Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/default-image.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/default-image.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/default-image.jpg\",\n" + + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" + + " \"hasAlpha\": false,\n" + " \"mime\": \"image/jpeg\"\n" + " }\n" + "]"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Map options = new HashMap<>(); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + options.put("skip", "" + 0); + options.put("limit", "" + 1); + options.put("type", "file"); + options.put("sort", "ASC_CREATED"); + options.put("path", "/"); + options.put("fileType", "all"); + options.put("searchQuery", "createdAt >= '2d' OR size < '2mb' OR format='png'"); + options.put("tags", String.valueOf(tags)); + SUT.getFileList(options); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals( + "GET /v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", + request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat( + "v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), + request.getRequestUrl().toString()); + + } + + @Test(expected = BadRequestException.class) + public void imageKit_getFileList_400_expected() + throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, IOException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"Invalid search query - createdAt field must have a valid date value. Make sure the value is enclosed within quotes. Please refer to the documentation for syntax specification.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + Map options = new HashMap<>(); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + options.put("skip", "" + 0); + options.put("limit", "" + 1); + options.put("type", "file"); + options.put("sort", "ASC_CREATED"); + options.put("path", "/"); + options.put("fileType", "all"); + options.put("searchQuery", "createdAt >= '2days' OR size < '2mb' OR format='png'"); + options.put("tags", String.valueOf(tags)); + SUT.getFileList(options); + + server.takeRequest(); + } + + @Test(expected = BadRequestException.class) + public void imageKit_getFileDetail__expected_400() + throws IOException, InterruptedException, BadRequestException, InternalServerException, UnknownException, + ForbiddenException, TooManyRequestsException, UnauthorizedException { + + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileDetail("fileId"); + + server.takeRequest(); + } + + @Test + public void imageKit_getFileDetail_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"type\": \"file\",\n" + " \"name\": \"sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"createdAt\": \"2022-06-20T05:00:41.830Z\",\n" + + " \"updatedAt\": \"2022-06-20T05:00:43.263Z\",\n" + + " \"fileId\": \"62affef97db937b028f3b47a\",\n" + " \"tags\": [\n" + " \"Software\",\n" + + " \"Developer\",\n" + " \"Engineer\"\n" + " ],\n" + " \"AITags\": null,\n" + + " \"versionInfo\": {\n" + " \"id\": \"62affef97db937b028f3b47a\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {},\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/demo/img/static-file-1.png\",\n" + + " \"fileType\": \"non-image\",\n" + " \"filePath\": \"/sample-image11_g1Qv0wpqP.jpg\",\n" + + " \"size\": 169170\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileDetail("62affef97db937b028f3b47a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/62affef97db937b028f3b47a/details HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a/details"), + request.getRequestUrl().toString()); + } + + @Test + public void imageKit_getFileMetaData_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"height\": 300,\n" + " \"width\": 300,\n" + " \"size\": 51085,\n" + + " \"format\": \"jpg\",\n" + " \"hasColorProfile\": false,\n" + " \"quality\": 0,\n" + + " \"density\": 300,\n" + " \"hasTransparency\": false,\n" + " \"exif\": {\n" + + " \"image\": {\n" + " \"Orientation\": 1,\n" + " \"XResolution\": 300,\n" + + " \"YResolution\": 300,\n" + " \"ResolutionUnit\": 2,\n" + + " \"Software\": \"Adobe Photoshop CS5 (12.0x20100115 [20100115.m.998 2010/01/15:02:00:00 cutoff; m branch]) Windows\",\n" + + " \"ModifyDate\": \"2017:09:11 22:15:46\",\n" + " \"ExifOffset\": 236\n" + + " },\n" + " \"thumbnail\": {\n" + " \"Compression\": 6,\n" + + " \"XResolution\": 72,\n" + " \"YResolution\": 72,\n" + + " \"ResolutionUnit\": 2,\n" + " \"ThumbnailOffset\": 374,\n" + + " \"ThumbnailLength\": 4083\n" + " },\n" + " \"exif\": {\n" + + " \"ColorSpace\": 65535,\n" + " \"ExifImageWidth\": 300,\n" + + " \"ExifImageHeight\": 300\n" + " },\n" + " \"gps\": {},\n" + + " \"interoperability\": {},\n" + " \"makernote\": {}\n" + " },\n" + + " \"pHash\": \"2df5da2dd63c6926\"\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileMetadata("62b43109d23153217b8b8a36"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/62b43109d23153217b8b8a36/metadata HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62b43109d23153217b8b8a36/metadata"), + request.getRequestUrl().toString()); + + } + + @Test(expected = BadRequestException.class) + public void imageKit_getFileMetaData_400_Expected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"type\": \"INVALID_PARAM_ERROR\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileMetadata("fileId"); + server.takeRequest(); + } + + @Test + public void imageKit_getRemoteFileMetaData_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"height\": 1000,\n" + " \"width\": 1000,\n" + " \"size\": 147022,\n" + + " \"format\": \"jpg\",\n" + " \"hasColorProfile\": false,\n" + " \"quality\": 0,\n" + + " \"density\": 72,\n" + " \"hasTransparency\": false,\n" + " \"exif\": {},\n" + + " \"pHash\": \"e0d52b612ad538f6\"\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getRemoteFileMetadata("https://ik.imagekit.io/zv3rkhsym/default-image.jpg"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/metadata?url=https://ik.imagekit.io/zv3rkhsym/default-image.jpg"), + request.getRequestUrl().toString()); + + } + + @Test(expected = BadRequestException.class) + public void imageKit_getRemoteFileMetaData_400_Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + + " \"message\": \"remote_url should be accessible using your ImageKit.io account.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getRemoteFileMetadata("remote_url"); + + server.takeRequest(); + } + + @Test(expected = BadRequestException.class) + public void imageKit_deleteFile_400_Expected() + throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, + BadRequestException, UnknownException, InterruptedException, IOException { + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"Your request contains invalid fileId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFile("629f3de17eb0fe4053615450"); + + server.takeRequest(); + } + + @Test + public void imageKit_deleteFile_successExpected() + throws IOException, ForbiddenException, TooManyRequestsException, InternalServerException, + UnauthorizedException, BadRequestException, UnknownException, InterruptedException { + MockWebServer server = new MockWebServer(); + String responseJson = ""; + server.enqueue(new MockResponse().setResponseCode(204).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFile("62affef97db937b028f3b47a"); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/files/62affef97db937b028f3b47a HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/62affef97db937b028f3b47a"), + request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void imageKit_bulkDeleteFiles_404Expected() throws ForbiddenException, TooManyRequestsException, + InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, + BadRequestException, UnknownException, IOException, InterruptedException { + List fileIds = new ArrayList<>(); + fileIds.add("file_id_1"); + fileIds.add("file_id_2"); + fileIds.add("file_id_3"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.bulkDeleteFiles(fileIds); + + server.takeRequest(); + } + + @Test + public void imageKit_bulkDeleteFiles_successExpected() throws ForbiddenException, TooManyRequestsException, + InternalServerException, PartialSuccessException, UnauthorizedException, NotFoundException, + BadRequestException, UnknownException, IOException, InterruptedException { + List fileIds = new ArrayList<>(); + fileIds.add("62ad9ece7db937e35ef18dda"); + MockWebServer server = new MockWebServer(); + String responseJson = "{\n" + " \"successfullyDeletedFileIds\": [\n" + + " \"62ad9ece7db937e35ef18dda\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setBody(responseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.bulkDeleteFiles(fileIds); + + RecordedRequest request = server.takeRequest(); + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("{\"fileIds\":[\"62ad9ece7db937e35ef18dda\"]}", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/batch/deleteByFileIds HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/batch/deleteByFileIds"), + request.getRequestUrl().toString()); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java index 4cd78af..8189f58 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileVersionTest.java @@ -24,264 +24,244 @@ public class FileVersionTest { - private ImageKit SUT; + private ImageKit SUT; - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } - @Test(expected = NotFoundException.class) - public void getFileVersions_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test(expected = NotFoundException.class) + public void getFileVersions_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersions("id"); - server.takeRequest(); - } + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersions("id"); + server.takeRequest(); + } - @Test - public void getFileVersions_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test + public void getFileVersions_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" - + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" - + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" - + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" - + " \"tag10\"\n" + " ],\n" + " \"AITags\": [\n" + " {\n" - + " \"name\": \"Colorfulness\",\n" + " \"confidence\": 96.19,\n" - + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" - + " \"name\": \"Purple\",\n" + " \"confidence\": 86.05,\n" - + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" - + " \"name\": \"Violet\",\n" + " \"confidence\": 81.08,\n" - + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" - + " \"name\": \"Rectangle\",\n" + " \"confidence\": 80.99,\n" - + " \"source\": \"google-auto-tagging\"\n" + " }\n" + " ],\n" - + " \"versionInfo\": {\n" + " \"id\": \"629f3de17eb0fe4053615450\",\n" - + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {\n" - + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + " \"ImageWidth\": 1006,\n" - + " \"ImageHeight\": 467,\n" - + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" - + " \"height\": 467,\n" + " \"width\": 1006,\n" + " \"size\": 47579,\n" - + " \"hasAlpha\": true,\n" + " \"mime\": \"image/png\"\n" + " }\n" + "]")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersions("629f3de17eb0fe4053615450"); - RecordedRequest request = server.takeRequest(); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("[\n" + " {\n" + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + + " \"tag10\"\n" + " ],\n" + " \"AITags\": [\n" + " {\n" + + " \"name\": \"Colorfulness\",\n" + " \"confidence\": 96.19,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Purple\",\n" + " \"confidence\": 86.05,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Violet\",\n" + " \"confidence\": 81.08,\n" + + " \"source\": \"google-auto-tagging\"\n" + " },\n" + " {\n" + + " \"name\": \"Rectangle\",\n" + " \"confidence\": 80.99,\n" + + " \"source\": \"google-auto-tagging\"\n" + " }\n" + " ],\n" + + " \"versionInfo\": {\n" + " \"id\": \"629f3de17eb0fe4053615450\",\n" + + " \"name\": \"Version 1\"\n" + " },\n" + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + " \"ImageWidth\": 1006,\n" + + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + + " \"height\": 467,\n" + " \"width\": 1006,\n" + " \"size\": 47579,\n" + + " \"hasAlpha\": true,\n" + " \"mime\": \"image/png\"\n" + " }\n" + "]")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersions("629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), - request.getRequestUrl().toString()); - } + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions"), + request.getRequestUrl().toString()); + } - @Test(expected = NotFoundException.class) - public void getFileVersionDetails_404_Expected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test(expected = NotFoundException.class) + public void getFileVersionDetails_404_Expected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); - server.takeRequest(); - } + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested asset does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + server.takeRequest(); + } - @Test - public void getFileVersionDetails_successExpected() - throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test + public void getFileVersionDetails_successExpected() + throws InterruptedException, IOException, NotFoundException, BadRequestException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" - + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" - + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" - + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + " \"tag10\"\n" - + " ],\n" + " \"AITags\": [\n" + " {\n" + " \"name\": \"Colorfulness\",\n" - + " \"confidence\": 96.19,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Purple\",\n" - + " \"confidence\": 86.05,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Violet\",\n" - + " \"confidence\": 81.08,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Rectangle\",\n" - + " \"confidence\": 80.99,\n" + " \"source\": \"google-auto-tagging\"\n" - + " }\n" + " ],\n" + " \"versionInfo\": {\n" - + " \"id\": \"629f3de17eb0fe4053615450\",\n" + " \"name\": \"Version 1\"\n" + " },\n" - + " \"embeddedMetadata\": {\n" + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" - + " \"ImageWidth\": 1006,\n" + " \"ImageHeight\": 467,\n" - + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" - + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" - + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + " \"height\": 467,\n" - + " \"width\": 1006,\n" + " \"size\": 47579,\n" + " \"hasAlpha\": true,\n" - + " \"mime\": \"image/png\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); - RecordedRequest request = server.takeRequest(); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" + + " \"name\": \"w2_image.png\",\n" + " \"createdAt\": \"2022-06-07T12:00:33.825Z\",\n" + + " \"updatedAt\": \"2022-06-07T12:00:33.828Z\",\n" + + " \"fileId\": \"629f3de17eb0fe4053615450\",\n" + " \"tags\": [\n" + " \"tag10\"\n" + + " ],\n" + " \"AITags\": [\n" + " {\n" + " \"name\": \"Colorfulness\",\n" + + " \"confidence\": 96.19,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Purple\",\n" + + " \"confidence\": 86.05,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Violet\",\n" + + " \"confidence\": 81.08,\n" + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + " {\n" + " \"name\": \"Rectangle\",\n" + + " \"confidence\": 80.99,\n" + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + " ],\n" + " \"versionInfo\": {\n" + + " \"id\": \"629f3de17eb0fe4053615450\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + + " \"embeddedMetadata\": {\n" + " \"DateCreated\": \"2022-05-26T06:05:18.087Z\",\n" + + " \"ImageWidth\": 1006,\n" + " \"ImageHeight\": 467,\n" + + " \"DateTimeCreated\": \"2022-05-26T06:05:18.088Z\"\n" + " },\n" + + " \"customCoordinates\": null,\n" + " \"customMetadata\": {},\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/xyxt2lnil/w2_image.png\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/xyxt2lnil/tr:n-ik_ml_thumbnail/w2_image.png\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/w2_image.png\",\n" + " \"height\": 467,\n" + + " \"width\": 1006,\n" + " \"size\": 47579,\n" + " \"hasAlpha\": true,\n" + + " \"mime\": \"image/png\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.getFileVersionDetails("629f3de17eb0fe4053615450", "629f3de17eb0fe4053615450"); + RecordedRequest request = server.takeRequest(); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), - request.getRequestUrl().toString()); - } + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("GET /v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450 HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/629f3de17eb0fe4053615450/versions/629f3de17eb0fe4053615450"), + request.getRequestUrl().toString()); + } - @Test(expected = BadRequestException.class) - public void deleteFileVersion_400_SuccessWith() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test(expected = BadRequestException.class) + public void deleteFileVersion_400_SuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("id"); + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("id"); - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400) - .setBody("{\n" + " \"message\": \"Your request contains invalid versionId parameter.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - server.takeRequest(); - } + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(400) + .setBody("{\n" + " \"message\": \"Your request contains invalid versionId parameter.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); + } - @Test(expected = NotFoundException.class) - public void deleteFileVersion_404_SuccessWith() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test(expected = NotFoundException.class) + public void deleteFileVersion_404_SuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("62a9c403d89eedb81721102b"); + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("62a9c403d89eedb81721102b"); - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested file version does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - server.takeRequest(); - } + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested file version does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + server.takeRequest(); + } - @Test - public void deleteFileVersion_expectedSuccessWith() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test + public void deleteFileVersion_expectedSuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); - deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); - deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); + DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); + deleteFileVersionRequest.setFileId("629d90768482ba272ed17628"); + deleteFileVersionRequest.setVersionId("629d91878482bae8bed177f2"); - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(204).setBody("")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.deleteFileVersion(deleteFileVersionRequest); - RecordedRequest request = server.takeRequest(); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(204).setBody("")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.deleteFileVersion(deleteFileVersionRequest); + RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json", request.getHeader("Content-Type")); - assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2 HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), - request.getRequestUrl().toString()); - } + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json", request.getHeader("Content-Type")); + assertEquals("DELETE /v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2 HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL.concat("v1/files/629d90768482ba272ed17628/versions/629d91878482bae8bed177f2"), + request.getRequestUrl().toString()); + } - @Test - public void restoreFileVersion_expectedSuccessWith() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test + public void restoreFileVersion_expectedSuccessWith() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + - " \"type\": \"file\",\n" + - " \"name\": \"new_car.jpg\",\n" + - " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + - " \"updatedAt\": \"2022-06-27T12:11:11.254Z\",\n" + - " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + - " \"tags\": [\n" + - " \"tagg\",\n" + - " \"tagg1\"\n" + - " ],\n" + - " \"AITags\": null,\n" + - " \"versionInfo\": {\n" + - " \"id\": \"62b97749f63122840530fda9\",\n" + - " \"name\": \"Version 1\"\n" + - " },\n" + - " \"embeddedMetadata\": {\n" + - " \"XResolution\": 250,\n" + - " \"YResolution\": 250,\n" + - " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + - " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + - " },\n" + - " \"customCoordinates\": \"10,10,20,20\",\n" + - " \"customMetadata\": {\n" + - " \"test100\": 10\n" + - " },\n" + - " \"isPrivateFile\": false,\n" + - " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + - " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + - " \"fileType\": \"image\",\n" + - " \"filePath\": \"/new_car.jpg\",\n" + - " \"height\": 354,\n" + - " \"width\": 236,\n" + - " \"size\": 23023,\n" + - " \"hasAlpha\": false,\n" + - " \"mime\": \"image/jpeg\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.restoreFileVersion("62a9c3ccd875ec6fd658c854", "62b97749f63122840530fda9"); - RecordedRequest request = server.takeRequest(); + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" + + " \"name\": \"new_car.jpg\",\n" + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + + " \"updatedAt\": \"2022-06-27T12:11:11.254Z\",\n" + + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"tags\": [\n" + " \"tagg\",\n" + + " \"tagg1\"\n" + " ],\n" + " \"AITags\": null,\n" + " \"versionInfo\": {\n" + + " \"id\": \"62b97749f63122840530fda9\",\n" + " \"name\": \"Version 1\"\n" + " },\n" + + " \"embeddedMetadata\": {\n" + " \"XResolution\": 250,\n" + + " \"YResolution\": 250,\n" + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" + + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + " },\n" + + " \"customCoordinates\": \"10,10,20,20\",\n" + " \"customMetadata\": {\n" + + " \"test100\": 10\n" + " },\n" + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + + " \"fileType\": \"image\",\n" + " \"filePath\": \"/new_car.jpg\",\n" + " \"height\": 354,\n" + + " \"width\": 236,\n" + " \"size\": 23023,\n" + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.restoreFileVersion("62a9c3ccd875ec6fd658c854", "62b97749f63122840530fda9"); + RecordedRequest request = server.takeRequest(); - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals("", utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("PUT /v1/files/62a9c3ccd875ec6fd658c854/versions/62b97749f63122840530fda9/restore HTTP/1.1", - request.getRequestLine()); - assertEquals( - RestClient.API_BASE_URL.concat("v1/files/62a9c3ccd875ec6fd658c854/versions/62b97749f63122840530fda9/restore"), - request.getRequestUrl().toString()); - } + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals("", utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("PUT /v1/files/62a9c3ccd875ec6fd658c854/versions/62b97749f63122840530fda9/restore HTTP/1.1", + request.getRequestLine()); + assertEquals( + RestClient.API_BASE_URL + .concat("v1/files/62a9c3ccd875ec6fd658c854/versions/62b97749f63122840530fda9/restore"), + request.getRequestUrl().toString()); + } - @Test(expected = NotFoundException.class) - public void restoreFileVersion_expected_404() - throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, - UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + @Test(expected = NotFoundException.class) + public void restoreFileVersion_expected_404() + throws IOException, InterruptedException, BadRequestException, NotFoundException, InternalServerException, + UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404).setBody("{\n" + - " \"message\": \"The requested file version does not exist.\",\n" + - " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + - "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.restoreFileVersion("62a9c3ccd875ec6fd658c854", "62b97749f63122840530fda9"); - RecordedRequest request = server.takeRequest(); - request.getBody().readUtf8(); - } + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested file version does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\"\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.restoreFileVersion("62a9c3ccd875ec6fd658c854", "62b97749f63122840530fda9"); + RecordedRequest request = server.takeRequest(); + request.getBody().readUtf8(); + } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java index c649aaa..3aaeb17 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/TagsTest.java @@ -28,167 +28,167 @@ public class TagsTest { - private ImageKit SUT; - - @Before - public void setUp() throws Exception { - SUT = ImageKit.getInstance(); - SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); - } - - @Test(expected = NotFoundException.class) - public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.addTags(tagsRequest); - - server.takeRequest(); - } - - @Test - public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - tags.add("tag2"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.addTags(tagsRequest); - RecordedRequest request = server.takeRequest(); - - String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List tags = new ArrayList<>(); - tags.add("tag1"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; - server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeTags(tagsRequest); - server.takeRequest(); - } - - @Test - public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, - PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List tags = new ArrayList<>(); - tags.add("tag1"); - - TagsRequest tagsRequest = new TagsRequest(fileIds, tags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeTags(tagsRequest); - RecordedRequest request = server.takeRequest(); - - String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(tagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); - } - - @Test(expected = NotFoundException.class) - public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("629f3de17eb0fe4053615450"); - List aiTags = new ArrayList<>(); - aiTags.add("Font"); - - AITagsRequest aiTagsRequest = new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404) - .setBody("{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" - + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" - + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeAITags(aiTagsRequest); - server.takeRequest(); - } - - @Test - public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, - NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, - TooManyRequestsException, UnauthorizedException { - - List fileIds = new ArrayList<>(); - fileIds.add("62958deef33aa80bdadf7533"); - List aiTags = new ArrayList<>(); - aiTags.add("Font"); - - AITagsRequest aiTagsRequest = new AITagsRequest(); - aiTagsRequest.setFileIds(fileIds); - aiTagsRequest.setAITags(aiTags); - - MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); - server.start(); - RestClient.API_BASE_URL = server.url("/").toString(); - SUT.removeAITags(aiTagsRequest); - RecordedRequest request = server.takeRequest(); - - String aiTagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"AITags\":[\"Font\"]}"; - String utf8RequestBody = request.getBody().readUtf8(); - assertEquals(aiTagsRequestJson, utf8RequestBody); - assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); - assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); - assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); - } + private ImageKit SUT; + + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + + @Test(expected = NotFoundException.class) + public void add_tags_expected_404() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.addTags(tagsRequest); + + server.takeRequest(); + } + + @Test + public void add_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + tags.add("tag2"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.addTags(tagsRequest); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\",\"tag2\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/addTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/addTags"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void remove_tags_expected_404_bad_request() throws InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + String tagsResponseJson = "{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}"; + server.enqueue(new MockResponse().setResponseCode(404).setBody(tagsResponseJson)); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeTags(tagsRequest); + server.takeRequest(); + } + + @Test + public void remove_tags_expectedSuccessWith() throws IOException, InterruptedException, NotFoundException, + PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List tags = new ArrayList<>(); + tags.add("tag1"); + + TagsRequest tagsRequest = new TagsRequest(fileIds, tags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeTags(tagsRequest); + RecordedRequest request = server.takeRequest(); + + String tagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"tags\":[\"tag1\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(tagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeTags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeTags"), request.getRequestUrl().toString()); + } + + @Test(expected = NotFoundException.class) + public void removeAITags_404_Expected() throws InterruptedException, IOException, PartialSuccessException, + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("629f3de17eb0fe4053615450"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\n" + " \"message\": \"The requested file(s) does not exist.\",\n" + + " \"help\": \"For support kindly contact us at support@imagekit.io .\",\n" + + " \"missingFileIds\": [\n" + " \"629f3de17eb0fe4053615450\"\n" + " ]\n" + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeAITags(aiTagsRequest); + server.takeRequest(); + } + + @Test + public void removeAITags_successExpected() throws InterruptedException, IOException, PartialSuccessException, + NotFoundException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, + TooManyRequestsException, UnauthorizedException { + + List fileIds = new ArrayList<>(); + fileIds.add("62958deef33aa80bdadf7533"); + List aiTags = new ArrayList<>(); + aiTags.add("Font"); + + AITagsRequest aiTagsRequest = new AITagsRequest(); + aiTagsRequest.setFileIds(fileIds); + aiTagsRequest.setAITags(aiTags); + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\"successfullyUpdatedFileIds\": [\"62958deef33aa80bdadf7533\"]}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + SUT.removeAITags(aiTagsRequest); + RecordedRequest request = server.takeRequest(); + + String aiTagsRequestJson = "{\"fileIds\":[\"62958deef33aa80bdadf7533\"],\"AITags\":[\"Font\"]}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(aiTagsRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/files/removeAITags HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/files/removeAITags"), request.getRequestUrl().toString()); + } } From 0fbb1a618750c183ea9cb4d1624cadab8d023bf4 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 29 Jun 2022 14:26:50 +0530 Subject: [PATCH 086/112] added error handling in docs --- README.md | 43 ++++++++++++++++++- .../sdk/exceptions/BadRequestException.java | 10 ++++- .../sdk/exceptions/ForbiddenException.java | 8 ++++ .../exceptions/InternalServerException.java | 8 ++++ .../sdk/exceptions/NotFoundException.java | 8 ++++ .../exceptions/PartialSuccessException.java | 8 ++++ .../exceptions/TooManyRequestsException.java | 8 ++++ .../sdk/exceptions/UnauthorizedException.java | 8 ++++ .../sdk/exceptions/UnknownException.java | 8 ++++ 9 files changed, 106 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ca09d53..c4f9569 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Release](https://jitpack.io/v/com.github.imagekit-developer/imagekit-java.svg)](https://jitpack.io/#com.github.imagekit-developer/imagekit-java) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Twitter Follow](https://img.shields.io/twitter/follow/imagekitio?label=Follow&style=social)](https://twitter.com/ImagekitIo) - + Java SDK for [ImageKit.io](https://imagekit.io/) that implements the new APIs and interface for performing different file operations. @@ -22,6 +22,7 @@ Table of contents - * [File upload](#file-upload) * [File management](#file-management) * [Utility functions](#utility-functions) + * [Handling errors](#handling-errors) * [Support](#support) * [Links](#links) @@ -1043,7 +1044,45 @@ cd imagekit-java # You will find jar in "imagekit-sdk/build/libs/" directory. ``` -## Support +## Handling errors +Catch and respond to invalid data, internal problems, and more. + +Imagekit Java SDK raise exceptions for many reasons, such as not found, invalid parameters, authentication errors, and internal server error. We recommend writing code that gracefully handles all possible API exceptions. + +#### Example: + +```java +try { + // Use ImageKit's SDK to make requests... +} catch (BadRequestException e) { + // Missing or Invalid parameters were supplied to Imagekit.io's API + System.out.println("Status is: " + e.getResponseMetaData().getHttpStatusCode()); + System.out.println("Message is: " + e.getMessage()); + System.out.println("Headers are: " + e.getResponseMetaData().getHeaders()); + System.out.println("Raw body is: " + e.getResponseMetaData().getRaw()); + System.out.println("Mapped body is: " + e.getResponseMetaData().getMap()); +} catch (UnauthorizedException e) { + // No valid API key was provided. +} catch (ForbiddenException e) { + // Can be for the following reasons: + // ImageKit could not authenticate your account with the keys provided. + // An expired key (public or private) was used with the request. + // The account is disabled. + // If you are using the upload API, the total storage limit (or upload limit) is exceeded. +} catch (TooManyRequestsException e) { + // Too many requests made to the API too quickly +} catch (InternalServerException e) { + // Something went wrong with ImageKit.io API. +} catch (PartialSuccessException e) { + // Error cases on partial success. +} catch (NotFoundException e) { + // If any of the field or parameter is not found in data +} catch (UnknownException e) { + // Something else happened, which can be unrelated to imagekit, reason will be indicated in the message field +} +``` + +## Supporttim For any feedback or to report any issues or general implementation support, please reach out to [support@imagekit.io]() diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java index e96571d..ccaa72d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/BadRequestException.java @@ -8,8 +8,16 @@ public class BadRequestException extends Exception { private String help; private ResponseMetaData responseMetaData; + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + public BadRequestException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, - String message1, String help, ResponseMetaData responseMetaData) { + String message1, String help, ResponseMetaData responseMetaData) { super(message, cause, enableSuppression, writableStackTrace); this.message = message1; this.help = help; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java index c6931c8..eb73cf6 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/ForbiddenException.java @@ -16,6 +16,14 @@ public ForbiddenException(String message, Throwable cause, boolean enableSuppres this.responseMetaData = responseMetaData; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "ForbiddenException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java index 786dd37..938c464 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/InternalServerException.java @@ -16,6 +16,14 @@ public InternalServerException(String message, Throwable cause, boolean enableSu this.responseMetaData = responseMetaData; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "InternalServerException{" + "message='" + message + '\'' + ", help='" + help + '\'' diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java index 7e79429..a3b446c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/NotFoundException.java @@ -16,6 +16,14 @@ public NotFoundException(String message, Throwable cause, boolean enableSuppress this.responseMetaData = responseMetaData; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "NotFoundException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java index 667e2f4..22e318c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/PartialSuccessException.java @@ -16,6 +16,14 @@ public PartialSuccessException(String message, Throwable cause, boolean enableSu this.responseMetaData = responseMetaData; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "PartialSuccessException{" + "message='" + message + '\'' + ", help='" + help + '\'' diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java index 05d616f..fcdf837 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/TooManyRequestsException.java @@ -16,6 +16,14 @@ public TooManyRequestsException(String message, Throwable cause, boolean enableS this.responseMetaData = responseMetaData; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "TooManyRequestsException{" + "message='" + message + '\'' + ", help='" + help + '\'' diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java index 593c6e4..e785dab 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnauthorizedException.java @@ -16,6 +16,14 @@ public UnauthorizedException(String message, Throwable cause, boolean enableSupp this.responseMetaData = responseMetaData; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "UnauthorizedException{" + "message='" + message + '\'' + ", help='" + help + '\'' diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java index 5774cc0..0a9a1f1 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/exceptions/UnknownException.java @@ -20,6 +20,14 @@ public UnknownException(String message, Throwable cause, boolean enableSuppressi this.responseMetaData = responseMetaData; } + public ResponseMetaData getResponseMetaData() { + return responseMetaData; + } + + public void setResponseMetaData(ResponseMetaData responseMetaData) { + this.responseMetaData = responseMetaData; + } + @Override public String toString() { return "UnknownException{" + "message='" + message + '\'' + ", help='" + help + '\'' + ", responseMetaData=" From e2477eded822159c8f2920e96a7fbfbed9197c16 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 29 Jun 2022 18:24:38 +0530 Subject: [PATCH 087/112] make private manageTags --- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 849abf0..90d91d8 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -344,7 +344,7 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenE return result; } - public ResultTags manageTags(TagsRequest tagsRequest, String action) + private ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultTags resultTags = new ResultTags(); From 61ae1839b04324f310eaf160a0daff2ccd7c8554 Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 4 Jul 2022 17:26:58 +0530 Subject: [PATCH 088/112] resolved comments --- README.md | 40 +++- .../main/java/io/imagekit/sdk/ImageKit.java | 9 +- .../sdk/models/CustomMetaDataTypeEnum.java | 3 - .../sdk/models/FileUpdateRequest.java | 49 +++- .../sdk/models/GetFileListRequest.java | 92 ++++++++ .../imagekit/sdk/tasks/MultipartBuilder.java | 8 +- .../io/imagekit/sdk/tasks/RestClient.java | 16 +- .../java/io/imagekit/sdk/utils/Utils.java | 1 - .../java/io/imagekit/sdk/ImageKitTest.java | 1 + .../test/java/io/imagekit/sdk/UploadTest.java | 133 +++++++---- .../sdk/manage/CustomMetaDataFieldTest.java | 42 ++++ .../java/io/imagekit/sdk/manage/FileTest.java | 216 ++++++++++++++++-- 12 files changed, 511 insertions(+), 99 deletions(-) create mode 100644 imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java diff --git a/README.md b/README.md index c4f9569..97583dd 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ operations. ImageKit is a complete image optimization and transformation solution that comes with and [image CDN](https://imagekit.io/features/imagekit-infrastructure) and media storage. It can be integrated with your existing infrastructure - storage like AWS s3, web servers, your CDN, and custom domain names, allowing you to deliver -optimize images in minutes with minimal code changes. +optimize images in minutes with minimal code changes Table of contents - * [Installation](#installation) @@ -500,10 +500,37 @@ It updates the file properties as per the [API documentation here](https://docs. The argument to the `updateDetail()` method is the object of `FileUpdateRequest` class, and the constructor will take the file ID and then set the parameters to be updated. ```java -String fileId="your-file-id"; -FileUpdateRequest fileUpdateRequest =new FileUpdateRequest(fileId); -fileUpdateRequest.setTags(List.of("Software","Developer","Engineer")); +List tags = new ArrayList<>(); +tags.add("Software"); +tags.add("Developer"); +tags.add("Engineer"); + +List aiTags = new ArrayList<>(); +aiTags.add("Plant"); +FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("fileId"); +fileUpdateRequest.setTags(tags); +fileUpdateRequest.setRemoveAITags(aiTags); +fileUpdateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + +JsonObject optionsInnerObject = new JsonObject(); +optionsInnerObject.addProperty("add_shadow", true); +optionsInnerObject.addProperty("bg_color", "yellow"); +JsonObject innerObject1 = new JsonObject(); +innerObject1.addProperty("name", "remove-bg"); +innerObject1.add("options", optionsInnerObject); +JsonObject innerObject2 = new JsonObject(); +innerObject2.addProperty("name", "google-auto-tagging"); +innerObject2.addProperty("minConfidence", 15); +innerObject2.addProperty("maxTags", 20); +JsonArray jsonArray = new JsonArray(); +jsonArray.add(innerObject1); +jsonArray.add(innerObject2); + +fileUpdateRequest.setExtensions(jsonArray); fileUpdateRequest.setCustomCoordinates("10,10,40,40"); +JsonObject jsonObjectCustomMetadata = new JsonObject(); +jsonObjectCustomMetadata.addProperty("test10", 11); +fileUpdateRequest.setCustomMetadata(jsonObjectCustomMetadata); Result result=ImageKit.getInstance().updateFileDetail(fileUpdateRequest); System.out.println("======FINAL RESULT======="); System.out.println(result); @@ -524,7 +551,7 @@ fileIds.add("FileId"); List tags = new ArrayList<>(); tags.add("tag-to-add-1"); tags.add("tag-to-add-2"); -ResultTags resultTags=ImageKit.getInstance().addTags(new TagsRequest(fileIds, tags), "addTags"); +ResultTags resultTags=ImageKit.getInstance().addTags(new TagsRequest(fileIds, tags)); System.out.println("======FINAL RESULT======="); System.out.println(resultTags); System.out.println("Raw Response:"); @@ -544,7 +571,7 @@ fileIds.add("FileId"); List tags = new ArrayList<>(); tags.add("tag-to-remove-1"); tags.add("tag-to-remove-2"); -ResultTags resultTags=ImageKit.getInstance().removeTags(new TagsRequest(fileIds, tags), "removeTags"); +ResultTags resultTags=ImageKit.getInstance().removeTags(new TagsRequest(fileIds, tags)); System.out.println("======FINAL RESULT======="); System.out.println(resultTags); System.out.println("Raw Response:"); @@ -861,6 +888,7 @@ The argument to the `createCustomMetaDataFields()` method is the object of `Cust ```java CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); +schemaObject.setType("Number"); schemaObject.setMinValue(10); schemaObject.setMaxValue(200); CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index bf76775..4a93ef4 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -15,6 +15,7 @@ import io.imagekit.sdk.tasks.Calculation; import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.tasks.UrlGen; +import retrofit2.http.QueryMap; import java.util.List; import java.util.Map; @@ -105,13 +106,13 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) /** * - * @param options is an map it may contain keys [ "path", "fileType", "tags", + * @param getFileListRequest is an map it may contain keys [ "path", "fileType", "tags", * "includeFolder", "name", "limit", "skip"] * @return ResultList class that contains list of BaseFile */ - public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException { - return restClient.getFileList(options); + public ResultList getFileList(@QueryMap GetFileListRequest getFileListRequest) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException, IllegalAccessException { + return restClient.getFileList(getFileListRequest); } /** diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java index 092a491..97c0e24 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataTypeEnum.java @@ -1,7 +1,4 @@ package io.imagekit.sdk.models; - -import com.google.gson.annotations.SerializedName; - public enum CustomMetaDataTypeEnum { Text, Textarea, Number, Date, Boolean, SingleSelect, MultiSelect; diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileUpdateRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileUpdateRequest.java index b532b86..a263657 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileUpdateRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/FileUpdateRequest.java @@ -1,16 +1,23 @@ package io.imagekit.sdk.models; -import com.google.gson.Gson; -import okhttp3.MediaType; -import okhttp3.RequestBody; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import java.util.List; public class FileUpdateRequest { private String fileId; + public List removeAITags; + + public String webhookUrl; + + public JsonArray extensions; + private List tags; private String customCoordinates; + public JsonObject customMetadata; + public FileUpdateRequest(String fileId) { this.fileId = fileId; } @@ -23,6 +30,30 @@ public void setFileId(String fileId) { this.fileId = fileId; } + public List getRemoveAITags() { + return removeAITags; + } + + public void setRemoveAITags(List removeAITags) { + this.removeAITags = removeAITags; + } + + public String getWebhookUrl() { + return webhookUrl; + } + + public void setWebhookUrl(String webhookUrl) { + this.webhookUrl = webhookUrl; + } + + public JsonArray getExtensions() { + return extensions; + } + + public void setExtensions(JsonArray extensions) { + this.extensions = extensions; + } + public List getTags() { return tags; } @@ -39,12 +70,24 @@ public void setCustomCoordinates(String customCoordinates) { this.customCoordinates = customCoordinates; } + public JsonObject getCustomMetadata() { + return customMetadata; + } + + public void setCustomMetadata(JsonObject customMetadata) { + this.customMetadata = customMetadata; + } + @Override public String toString() { return "FileUpdateRequest{" + "fileId='" + fileId + '\'' + + ", removeAITags=" + removeAITags + + ", webhookUrl='" + webhookUrl + '\'' + + ", extensions=" + extensions + ", tags=" + tags + ", customCoordinates='" + customCoordinates + '\'' + + ", customMetadata=" + customMetadata + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java new file mode 100644 index 0000000..0fbaab7 --- /dev/null +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java @@ -0,0 +1,92 @@ +package io.imagekit.sdk.models; + +import com.google.gson.JsonArray; + +public class GetFileListRequest { + public String type; + public String sort; + public String path; + public String searchQuery; + public String fileType; + public String limit; + public String skip; + public String[] tags; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getSort() { + return sort; + } + + public void setSort(String sort) { + this.sort = sort; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getSearchQuery() { + return searchQuery; + } + + public void setSearchQuery(String searchQuery) { + this.searchQuery = searchQuery; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getLimit() { + return limit; + } + + public void setLimit(String limit) { + this.limit = limit; + } + + public String getSkip() { + return skip; + } + + public void setSkip(String skip) { + this.skip = skip; + } + + public String[] getTags() { + return tags; + } + + public void setTags(String[] tags) { + this.tags = tags; + } + + @Override + public String toString() { + return "GetFileListRequest{" + + "type='" + type + '\'' + + ", sort='" + sort + '\'' + + ", path='" + path + '\'' + + ", searchQuery='" + searchQuery + '\'' + + ", fileType='" + fileType + '\'' + + ", limit='" + limit + '\'' + + ", skip='" + skip + '\'' + + ", tags=" + tags + + '}'; + } +} diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java index f5de2d1..98914b3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/MultipartBuilder.java @@ -54,16 +54,16 @@ public MultipartBody build(FileCreateRequest fileCreateRequest) { if (null != fileCreateRequest.responseFields) { builder.addFormDataPart("responseFields", Utils.listToString(fileCreateRequest.responseFields)); } - if (fileCreateRequest.overwriteFile != null && !fileCreateRequest.overwriteFile) { + if (fileCreateRequest.overwriteFile != null && fileCreateRequest.overwriteFile) { builder.addFormDataPart("overwriteFile", "true"); } - if (fileCreateRequest.overwriteAITags != null && !fileCreateRequest.overwriteAITags) { + if (fileCreateRequest.overwriteAITags != null && fileCreateRequest.overwriteAITags) { builder.addFormDataPart("overwriteAITags", "true"); } - if (fileCreateRequest.overwriteTags != null && !fileCreateRequest.overwriteTags) { + if (fileCreateRequest.overwriteTags != null && fileCreateRequest.overwriteTags) { builder.addFormDataPart("overwriteTags", "true"); } - if (fileCreateRequest.overwriteCustomMetadata != null && !fileCreateRequest.overwriteCustomMetadata) { + if (fileCreateRequest.overwriteCustomMetadata != null && fileCreateRequest.overwriteCustomMetadata) { builder.addFormDataPart("overwriteCustomMetadata", "true"); } if (null != fileCreateRequest.extensions) { diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 90d91d8..df0aec5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -25,6 +25,7 @@ import io.imagekit.sdk.models.DeleteFileVersionRequest; import io.imagekit.sdk.models.DeleteFolderRequest; import io.imagekit.sdk.models.FileCreateRequest; +import io.imagekit.sdk.models.GetFileListRequest; import io.imagekit.sdk.models.MoveFileRequest; import io.imagekit.sdk.models.MoveFolderRequest; import io.imagekit.sdk.models.MetaData; @@ -66,6 +67,7 @@ public Result upload(FileCreateRequest fileCreateRequest) throws InternalServerE request = new Request.Builder().url(UPLOAD_BASE_URL.concat("api/v1/files/upload")).post(body) .headers(Headers.of(headers)).build(); + try { Response response = client.newCall(request).execute(); String respBody = ""; @@ -112,16 +114,17 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) return result; } - public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, + public ResultList getFileList(GetFileListRequest getFileListRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { ResultList resultList = new ResultList(); Map headers = Utils.getHeaders(imageKit); +// ObjectMap objectMapper = new ObjectMapper(); +// ModelMapp QueryMaker queryMaker = new QueryMaker(); - - for (Map.Entry entry : options.entrySet()) { - queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); - } +// for (Map.Entry entry : ) { +// queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); +// } String url = String.format(Locale.US, API_BASE_URL.concat("v1/files?%s"), queryMaker.get()); @@ -300,7 +303,6 @@ public ResultCache purgeCache(String url) throws ForbiddenException, TooManyRequ try { Response response = client.newCall(request).execute(); - System.out.println("res:==> " + response.request().body()); String respBody = ""; if (response.code() == 200 || response.code() == 201) { respBody = response.body().string(); @@ -344,7 +346,7 @@ public ResultCacheStatus getPurgeCacheStatus(String requestId) throws ForbiddenE return result; } - private ResultTags manageTags(TagsRequest tagsRequest, String action) + public ResultTags manageTags(TagsRequest tagsRequest, String action) throws NotFoundException, PartialSuccessException, BadRequestException, InternalServerException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { ResultTags resultTags = new ResultTags(); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java index 9cfdec1..19fa01c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/utils/Utils.java @@ -177,7 +177,6 @@ public static void throwOtherException(Response response) public static ResultException populateResult(Response response) throws IOException { String resp = response.body().string(); - System.out.println("resp:==> " + resp); ResultException result = new Gson().fromJson(resp, ResultException.class); populateResponseMetadata(resp, result.getResponseMetaData(), response.code(), response.headers().toMultimap()); return result; diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 40f3173..1056a55 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -9,6 +9,7 @@ import static org.junit.Assert.assertNotNull; public class ImageKitTest { + private ImageKit SUT; @Test public void imageKit_configurationTest() { diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java index 89305aa..ad07580 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/UploadTest.java @@ -92,9 +92,9 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep jsonArray.add(innerObject2); fileCreateRequest.setExtensions(jsonArray); fileCreateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + fileCreateRequest.setOverwriteFile(true); fileCreateRequest.setUseUniqueFileName(false); fileCreateRequest.setPrivateFile(false); - fileCreateRequest.setOverwriteFile(true); fileCreateRequest.setOverwriteAITags(false); fileCreateRequest.setOverwriteTags(false); fileCreateRequest.setOverwriteCustomMetadata(true); @@ -103,56 +103,91 @@ public void imageKit_upload_returnSuccess() throws IOException, InterruptedExcep fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"fileId\": \"62a465d245a84a0ef3852968\",\n" - + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\n" + " \"size\": 23023,\n" - + " \"versionInfo\": {\n" + " \"id\": \"62a465d245a84a0ef3852968\",\n" - + " \"name\": \"Version 1\"\n" + " },\n" - + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"height\": 354,\n" + " \"width\": 236,\n" - + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\n" - + " \"AITags\": [\n" + " {\n" + " \"name\": \"Clothing\",\n" - + " \"confidence\": 98.77,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Plant\",\n" - + " \"confidence\": 96.51,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Smile\",\n" - + " \"confidence\": 95.31,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Shoe\",\n" - + " \"confidence\": 95.2,\n" + " \"source\": \"google-auto-tagging\"\n" - + " },\n" + " {\n" + " \"name\": \"Street light\",\n" - + " \"confidence\": 91.05,\n" + " \"source\": \"google-auto-tagging\"\n" - + " }\n" + " ],\n" + " \"extensionStatus\": {\n" + " \"remove-bg\": \"pending\",\n" - + " \"google-auto-tagging\": \"success\"\n" + " }\n" + "}")); + server.enqueue(new MockResponse().setBody("{\r\n" + " \"fileId\": \"62a465d245a84a0ef3852968\",\r\n" + + " \"name\": \"sample-cat-image_GG0_X8GOn.jpg\",\r\n" + " \"size\": 23023,\r\n" + + " \"versionInfo\": {\r\n" + " \"id\": \"62a465d245a84a0ef3852968\",\r\n" + + " \"name\": \"Version 1\"\r\n" + " },\r\n" + + " \"filePath\": \"/demo1/sample-cat-image_GG0_X8GOn.jpg\",\r\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/demo1/sample-cat-image_GG0_X8GOn.jpg\",\r\n" + + " \"fileType\": \"image\",\r\n" + " \"height\": 354,\r\n" + " \"width\": 236,\r\n" + + " \"thumbnailUrl\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/demo1/sample-cat-image_GG0_X8GOn.jpg\",\r\n" + + " \"AITags\": [\r\n" + " {\r\n" + " \"name\": \"Clothing\",\r\n" + + " \"confidence\": 98.77,\r\n" + " \"source\": \"google-auto-tagging\"\r\n" + + " },\r\n" + " {\r\n" + " \"name\": \"Plant\",\r\n" + + " \"confidence\": 96.51,\r\n" + " \"source\": \"google-auto-tagging\"\r\n" + + " },\r\n" + " {\r\n" + " \"name\": \"Smile\",\r\n" + + " \"confidence\": 95.31,\r\n" + " \"source\": \"google-auto-tagging\"\r\n" + + " },\r\n" + " {\r\n" + " \"name\": \"Shoe\",\r\n" + + " \"confidence\": 95.2,\r\n" + " \"source\": \"google-auto-tagging\"\r\n" + + " },\r\n" + " {\r\n" + " \"name\": \"Street light\",\r\n" + + " \"confidence\": 91.05,\r\n" + " \"source\": \"google-auto-tagging\"\r\n" + + " }\r\n" + " ],\r\n" + " \"extensionStatus\": {\r\n" + " \"remove-bg\": \"pending\",\r\n" + + " \"google-auto-tagging\": \"success\"\r\n" + " }\r\n" + "}")); server.start(); RestClient.UPLOAD_BASE_URL = server.url("/").toString(); SUT.upload(fileCreateRequest); RecordedRequest request = server.takeRequest(); - String json = "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"file\"\r\n" - + "Content-Length: 53\r\n" + "\r\n" + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"fileName\"\r\n" - + "Content-Length: 20\r\n" + "\r\n" + "sample-cat-image.png\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + "Content-Length: 5\r\n" + "\r\n" - + "false\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"tags\"\r\n" + "Content-Length: 27\r\n" + "\r\n" - + "Software,Developer,Engineer\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"folder\"\r\n" + "Content-Length: 5\r\n" + "\r\n" + "demo1\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + "Content-Length: 11\r\n" + "\r\n" - + "10,10,20,20\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + "Content-Length: 32\r\n" + "\r\n" - + "thumbnail,tags,customCoordinates\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteAITags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"overwriteTags\"\r\n" + "Content-Length: 4\r\n" + "\r\n" - + "true\r\n" + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"extensions\"\r\n" + "Content-Length: 114\r\n" + "\r\n" - + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" - + "--randomBoundary-------------------\r\n" + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" - + "Content-Length: 57\r\n" + "\r\n" + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" - + "--randomBoundary-------------------\r\n" - + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + "Content-Length: 12\r\n" + "\r\n" - + "{\"test1\":10}\r\n" + "--randomBoundary---------------------"; + String json = "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"file\"\r\n" + + "Content-Length: 53\r\n" + + "\r\n" + + "https://homepages.cae.wisc.edu/~ece533/images/cat.png\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"fileName\"\r\n" + + "Content-Length: 20\r\n" + + "\r\n" + + "sample-cat-image.png\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"useUniqueFileName\"\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "false\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"tags\"\r\n" + + "Content-Length: 27\r\n" + + "\r\n" + + "Software,Developer,Engineer\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"folder\"\r\n" + + "Content-Length: 5\r\n" + + "\r\n" + + "demo1\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customCoordinates\"\r\n" + + "Content-Length: 11\r\n" + + "\r\n" + + "10,10,20,20\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"responseFields\"\r\n" + + "Content-Length: 32\r\n" + + "\r\n" + + "thumbnail,tags,customCoordinates\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteFile\"\r\n" + + "Content-Length: 4\r\n" + + "\r\n" + + "true\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"overwriteCustomMetadata\"\r\n" + + "Content-Length: 4\r\n" + + "\r\n" + + "true\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"extensions\"\r\n" + + "Content-Length: 114\r\n" + + "\r\n" + + "[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true}},{\"name\":\"google-auto-tagging\",\"minConfidence\":10,\"maxTags\":5}]\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"webhookUrl\"\r\n" + + "Content-Length: 57\r\n" + + "\r\n" + + "https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\r\n" + + "--randomBoundary-------------------\r\n" + + "Content-Disposition: form-data; name=\"customMetadata\"\r\n" + + "Content-Length: 12\r\n" + + "\r\n" + + "{\"test1\":10}\r\n" + + "--randomBoundary---------------------"; assertEquals(json, request.getBody().readUtf8().trim()); assertEquals("POST /api/v1/files/upload HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.UPLOAD_BASE_URL.concat("api/v1/files/upload"), request.getRequestUrl().toString()); @@ -204,8 +239,8 @@ public void imageKit_upload_400_expected() throws IOException, InterruptedExcept fileCreateRequest.setCustomMetadata(jsonObjectCustomMetadata); MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setResponseCode(400).setBody("{\n" - + " \"message\": \"A file with the same name already exists at the exact location. We could not overwrite it because both overwriteFile and useUniqueFileName are set to false.\"\n" + server.enqueue(new MockResponse().setResponseCode(400).setBody("{\r\n" + + " \"message\": \"A file with the same name already exists at the exact location. We could not overwrite it because both overwriteFile and useUniqueFileName are set to false.\"\r\n" + "}")); server.start(); RestClient.UPLOAD_BASE_URL = server.url("/").toString(); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java index 24afd04..663afad 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java @@ -123,6 +123,48 @@ public void createCustomMetaDataFields_successExpected() assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); } + @Test + public void createCustomMetaDataFields_successExpected_type_Textarea() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"name\": \"mockName\",\n" + + " \"label\": \"mockLabel\",\n" + + " \"schema\": {\n" + + " \"isValueRequired\": true,\n" + + " \"defaultValue\": \"default value of test\",\n" + + " \"type\": \"Textarea\",\n" + + " \"minLength\": 10,\n" + + " \"maxLength\": 1000\n" + + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject mockCustomMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + mockCustomMetaDataFieldSchemaObject.setValueRequired(true); + mockCustomMetaDataFieldSchemaObject.setDefaultValue("default value of test"); + mockCustomMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Textarea); + mockCustomMetaDataFieldSchemaObject.setMinLength(10); + mockCustomMetaDataFieldSchemaObject.setMaxLength(100); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("mockName"); + customMetaDataFieldCreateRequest.setLabel("mockLabel"); + customMetaDataFieldCreateRequest.setSchema(mockCustomMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"mockName\",\"label\":\"mockLabel\",\"schema\":{\"type\":\"Textarea\",\"defaultValue\":\"default value of test\",\"isValueRequired\":true,\"minLength\":10,\"maxLength\":100}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + @Test(expected = NotFoundException.class) public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, UnknownException { diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index 7359fa8..84c25b1 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -1,5 +1,7 @@ package io.imagekit.sdk.manage; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import io.imagekit.sdk.ImageKit; import io.imagekit.sdk.ImageKitTest; import io.imagekit.sdk.exceptions.BadRequestException; @@ -75,35 +77,206 @@ public void imageKit_updateDetails_returnTrue() ForbiddenException, TooManyRequestsException, UnauthorizedException { MockWebServer server = new MockWebServer(); - server.enqueue(new MockResponse().setBody("{\n" + " \"type\": \"file\",\n" - + " \"name\": \"new_car.jpg\",\n" + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" - + " \"updatedAt\": \"2022-06-18T12:14:07.070Z\",\n" - + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"tags\": [\n" + " \"tagg\",\n" - + " \"tagg1\"\n" + " ],\n" + " \"AITags\": null,\n" + " \"versionInfo\": {\n" - + " \"id\": \"62a9c3ccd875ec6fd658c854\",\n" + " \"name\": \"Version 1\"\n" + " },\n" - + " \"embeddedMetadata\": {\n" + " \"XResolution\": 250,\n" - + " \"YResolution\": 250,\n" + " \"DateCreated\": \"2022-06-15T11:34:36.702Z\",\n" - + " \"DateTimeCreated\": \"2022-06-15T11:34:36.702Z\"\n" + " },\n" - + " \"customCoordinates\": \"10,10,20,20\",\n" + " \"customMetadata\": {\n" - + " \"test100\": 10\n" + " },\n" + " \"isPrivateFile\": false,\n" - + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" - + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" - + " \"fileType\": \"image\",\n" + " \"filePath\": \"/new_car.jpg\",\n" + " \"height\": 354,\n" - + " \"width\": 236,\n" + " \"size\": 23023,\n" + " \"hasAlpha\": false,\n" - + " \"mime\": \"image/jpeg\"\n" + "}")); + server.enqueue(new MockResponse().setBody("{\n" + + " \"type\": \"file\",\n" + + " \"name\": \"new_car.jpg\",\n" + + " \"createdAt\": \"2022-06-15T11:34:36.294Z\",\n" + + " \"updatedAt\": \"2022-07-04T10:15:50.067Z\",\n" + + " \"fileId\": \"62a9c3ccd875ec6fd658c854\",\n" + + " \"tags\": [\n" + + " \"Software\",\n" + + " \"Developer\",\n" + + " \"Engineer\"\n" + + " ],\n" + + " \"AITags\": [\n" + + " {\n" + + " \"name\": \"Clothing\",\n" + + " \"confidence\": 98.77,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Smile\",\n" + + " \"confidence\": 95.31,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Shoe\",\n" + + " \"confidence\": 95.2,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Street light\",\n" + + " \"confidence\": 91.05,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Person\",\n" + + " \"confidence\": 96.5,\n" + + " \"source\": \"aws-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Female\",\n" + + " \"confidence\": 91.27,\n" + + " \"source\": \"aws-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Flyer\",\n" + + " \"confidence\": 90.62,\n" + + " \"source\": \"aws-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Poster\",\n" + + " \"confidence\": 90.62,\n" + + " \"source\": \"aws-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Advertisement\",\n" + + " \"confidence\": 90.62,\n" + + " \"source\": \"aws-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Plant\",\n" + + " \"confidence\": 96.51,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Street fashion\",\n" + + " \"confidence\": 89.1,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Fashion\",\n" + + " \"confidence\": 88.46,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Tree\",\n" + + " \"confidence\": 87.62,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Yellow\",\n" + + " \"confidence\": 85.76,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Happy\",\n" + + " \"confidence\": 84.01,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Grass\",\n" + + " \"confidence\": 82.89,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Leisure\",\n" + + " \"confidence\": 81.19,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Morning\",\n" + + " \"confidence\": 79.09,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Summer\",\n" + + " \"confidence\": 78.87,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"People\",\n" + + " \"confidence\": 77.9,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Electric blue\",\n" + + " \"confidence\": 75.57,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Beauty\",\n" + + " \"confidence\": 75.22,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Denim\",\n" + + " \"confidence\": 74.91,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Recreation\",\n" + + " \"confidence\": 74.33,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Publication\",\n" + + " \"confidence\": 74.24,\n" + + " \"source\": \"google-auto-tagging\"\n" + + " }\n" + + " ],\n" + + " \"versionInfo\": {\n" + + " \"id\": \"62b97749f63122840530fda9\",\n" + + " \"name\": \"Version 4\"\n" + + " },\n" + + " \"embeddedMetadata\": {\n" + + " \"DateCreated\": \"2022-07-04T10:15:50.066Z\",\n" + + " \"DateTimeCreated\": \"2022-07-04T10:15:50.066Z\"\n" + + " },\n" + + " \"customCoordinates\": null,\n" + + " \"customMetadata\": {\n" + + " \"test100\": 10,\n" + + " \"test10\": 11\n" + + " },\n" + + " \"isPrivateFile\": false,\n" + + " \"url\": \"https://ik.imagekit.io/zv3rkhsym/new_car.jpg\",\n" + + " \"thumbnail\": \"https://ik.imagekit.io/zv3rkhsym/tr:n-ik_ml_thumbnail/new_car.jpg\",\n" + + " \"fileType\": \"image\",\n" + + " \"filePath\": \"/new_car.jpg\",\n" + + " \"height\": 354,\n" + + " \"width\": 236,\n" + + " \"size\": 7390,\n" + + " \"hasAlpha\": false,\n" + + " \"mime\": \"image/jpeg\"\n" + + "}")); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); List tags = new ArrayList<>(); tags.add("Software"); tags.add("Developer"); tags.add("Engineer"); + + List aiTags = new ArrayList<>(); + aiTags.add("Plant"); + FileUpdateRequest fileUpdateRequest = new FileUpdateRequest("62a9c3ccd875ec6fd658c854"); + fileUpdateRequest.setRemoveAITags(aiTags); + fileUpdateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); + + JsonObject optionsInnerObject = new JsonObject(); + optionsInnerObject.addProperty("add_shadow", true); + optionsInnerObject.addProperty("bg_color", "yellow"); + JsonObject innerObject1 = new JsonObject(); + innerObject1.addProperty("name", "remove-bg"); + innerObject1.add("options", optionsInnerObject); + JsonObject innerObject2 = new JsonObject(); + innerObject2.addProperty("name", "google-auto-tagging"); + innerObject2.addProperty("minConfidence", 15); + innerObject2.addProperty("maxTags", 20); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(innerObject1); + jsonArray.add(innerObject2); + + fileUpdateRequest.setExtensions(jsonArray); fileUpdateRequest.setTags(tags); + fileUpdateRequest.setCustomCoordinates("10,10,40,40"); + JsonObject jsonObjectCustomMetadata = new JsonObject(); + jsonObjectCustomMetadata.addProperty("test10", 11); + fileUpdateRequest.setCustomMetadata(jsonObjectCustomMetadata); SUT.updateFileDetail(fileUpdateRequest); RecordedRequest request = server.takeRequest(); - String requestJson = "{\"fileId\":\"62a9c3ccd875ec6fd658c854\",\"tags\":[\"Software\",\"Developer\",\"Engineer\"]}"; + String requestJson = "{\"fileId\":\"62a9c3ccd875ec6fd658c854\",\"removeAITags\":[\"Plant\"],\"webhookUrl\":\"https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e\",\"extensions\":[{\"name\":\"remove-bg\",\"options\":{\"add_shadow\":true,\"bg_color\":\"yellow\"}},{\"name\":\"google-auto-tagging\",\"minConfidence\":15,\"maxTags\":20}],\"tags\":[\"Software\",\"Developer\",\"Engineer\"],\"customCoordinates\":\"10,10,40,40\",\"customMetadata\":{\"test10\":11}}"; String utf8RequestBody = request.getBody().readUtf8(); assertEquals(requestJson, utf8RequestBody); assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); @@ -114,8 +287,7 @@ public void imageKit_updateDetails_returnTrue() @Test public void imageKit_getFileList_returnList() - throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, IOException { + throws InterruptedException, IOException { MockWebServer server = new MockWebServer(); String responseJson = "[\n" + " {\n" + " \"type\": \"file\",\n" @@ -151,7 +323,7 @@ public void imageKit_getFileList_returnList() options.put("fileType", "all"); options.put("searchQuery", "createdAt >= '2d' OR size < '2mb' OR format='png'"); options.put("tags", String.valueOf(tags)); - SUT.getFileList(options); +// SUT.getFileList(options); RecordedRequest request = server.takeRequest(); String utf8RequestBody = request.getBody().readUtf8(); @@ -191,7 +363,7 @@ public void imageKit_getFileList_400_expected() options.put("fileType", "all"); options.put("searchQuery", "createdAt >= '2days' OR size < '2mb' OR format='png'"); options.put("tags", String.valueOf(tags)); - SUT.getFileList(options); +// SUT.getFileList(options); server.takeRequest(); } From 6542f4043662692988c6636a42980f1c4991960c Mon Sep 17 00:00:00 2001 From: Khush Date: Mon, 4 Jul 2022 18:48:16 +0530 Subject: [PATCH 089/112] added test cases and few fixes for crete custom metaData --- README.md | 51 ++++- .../CustomMetaDataFieldSchemaObject.java | 51 +++-- .../sdk/manage/CustomMetaDataFieldTest.java | 195 ++++++++++++++++++ 3 files changed, 269 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 97583dd..6497851 100644 --- a/README.md +++ b/README.md @@ -882,10 +882,12 @@ System.out.println(result.getResponseMetaData().getMap()); **24. Create CustomMetaDataFields** -It creates the CustomMetaDataFields as per the +It creates the CustomMetaDataFields with many available types with param name `type` as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class. +#### Examples: + ```java CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); schemaObject.setType("Number"); @@ -904,6 +906,53 @@ System.out.println("Map Response:"); System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); ``` +- MultiSelect type Exmample: + +```java +List objectList = new ArrayList<>(); +objectList.add("small"); +objectList.add(30); +objectList.add(40); +objectList.add(true); + +List defaultValueObject = new ArrayList<>(); +defaultValueObject.add("small"); +defaultValueObject.add(30); +defaultValueObject.add(true); +CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +customMetaDataFieldSchemaObject.setType("MultiSelect"); +customMetaDataFieldSchemaObject.setValueRequired(true); // optional +customMetaDataFieldSchemaObject.setDefaultValue(defaultValueObject); // required if isValueRequired set to true +customMetaDataFieldSchemaObject.setSelectOptions(objectList); +CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +customMetaDataFieldCreateRequest.setName("Name-MultiSelect"); +customMetaDataFieldCreateRequest.setLabel("Label-MultiSelect"); +customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); + +ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() + .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +``` + +- Date type Exmample: + +```java +CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +customMetaDataFieldSchemaObject.setType("Date"); +customMetaDataFieldSchemaObject.setValueRequired(true); // optional +customMetaDataFieldSchemaObject.setDefaultValue("2022-11-30T10:11:10+00:00"); // required if isValueRequired set to true +customMetaDataFieldSchemaObject.setMinValue("2022-11-30T10:11:10+00:00"); +customMetaDataFieldSchemaObject.setMaxValue("2022-12-30T10:11:10+00:00"); + +CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +customMetaDataFieldCreateRequest.setName("Name"); +customMetaDataFieldCreateRequest.setLabel("Label"); +customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); + +ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() + .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +``` + + **25. Get CustomMetaDataFields** fetches the metadata as per the diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java index e1e9f11..dc5b98f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/CustomMetaDataFieldSchemaObject.java @@ -1,14 +1,12 @@ package io.imagekit.sdk.models; -import java.util.List; - public class CustomMetaDataFieldSchemaObject { private CustomMetaDataTypeEnum type; - private List selectOptions; - private String defaultValue; + private Object selectOptions; + private Object defaultValue; private Boolean isValueRequired; - private Integer minValue; - private Integer maxValue; + private Object minValue; + private Object maxValue; private Integer minLength; private Integer maxLength; @@ -16,14 +14,6 @@ public CustomMetaDataFieldSchemaObject() { } - public CustomMetaDataFieldSchemaObject(CustomMetaDataTypeEnum type, boolean isValueRequired, int minValue, - int maxValue) { - this.type = type; - this.isValueRequired = isValueRequired; - this.minValue = minValue; - this.maxValue = maxValue; - } - public CustomMetaDataTypeEnum getType() { return type; } @@ -32,43 +22,43 @@ public void setType(CustomMetaDataTypeEnum type) { this.type = type; } - public List getSelectOptions() { + public Object getSelectOptions() { return selectOptions; } - public void setSelectOptions(List selectOptions) { + public void setSelectOptions(Object selectOptions) { this.selectOptions = selectOptions; } - public String getDefaultValue() { + public Object getDefaultValue() { return defaultValue; } - public void setDefaultValue(String defaultValue) { + public void setDefaultValue(Object defaultValue) { this.defaultValue = defaultValue; } - public boolean isValueRequired() { + public Boolean getValueRequired() { return isValueRequired; } - public void setValueRequired(boolean valueRequired) { + public void setValueRequired(Boolean valueRequired) { isValueRequired = valueRequired; } - public Integer getMinValue() { + public Object getMinValue() { return minValue; } - public void setMinValue(Integer minValue) { + public void setMinValue(Object minValue) { this.minValue = minValue; } - public Integer getMaxValue() { + public Object getMaxValue() { return maxValue; } - public void setMaxValue(Integer maxValue) { + public void setMaxValue(Object maxValue) { this.maxValue = maxValue; } @@ -90,8 +80,15 @@ public void setMaxLength(Integer maxLength) { @Override public String toString() { - return "{" + "type=" + '"' + type + '"' + ", selectOptions=" + '"' + selectOptions + '"' + ", defaultValue=" - + '"' + defaultValue + '"' + ", isValueRequired=" + isValueRequired + ", minValue=" + minValue - + ", maxValue=" + maxValue + ", minLength=" + minLength + ", maxLength=" + maxLength + '}'; + return "CustomMetaDataFieldSchemaObject{" + + "type=" + type + + ", selectOptions=" + selectOptions + + ", defaultValue=" + defaultValue + + ", isValueRequired=" + isValueRequired + + ", minValue=" + minValue + + ", maxValue=" + maxValue + + ", minLength=" + minLength + + ", maxLength=" + maxLength + + '}'; } } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java index 663afad..d62919c 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/CustomMetaDataFieldTest.java @@ -19,6 +19,8 @@ import org.junit.Test; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import static org.junit.Assert.assertEquals; @@ -165,6 +167,199 @@ public void createCustomMetaDataFields_successExpected_type_Textarea() assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); } + @Test + public void createCustomMetaDataFields_successExpected_type_Date() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"id\": \"62c2d18da6f0abb293b3941a\",\n" + + " \"name\": \"name\",\n" + + " \"label\": \"label\",\n" + + " \"schema\": {\n" + + " \"type\": \"Date\",\n" + + " \"minValue\": \"2022-11-30T10:11:10+00:00\",\n" + + " \"maxValue\": \"2022-12-30T10:11:10+00:00\"\n" + + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Date); + customMetaDataFieldSchemaObject.setMinValue("2022-11-30T10:11:10+00:00"); + customMetaDataFieldSchemaObject.setMaxValue("2022-12-30T10:11:10+00:00"); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("Name"); + customMetaDataFieldCreateRequest.setLabel("Label"); + customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"Name\",\"label\":\"Label\",\"schema\":{\"type\":\"Date\",\"minValue\":\"2022-11-30T10:11:10+00:00\",\"maxValue\":\"2022-12-30T10:11:10+00:00\"}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test + public void createCustomMetaDataFields_successExpected_type_Boolean() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"id\": \"62c2e4268eed64d4a80c585a\",\n" + + " \"name\": \"Name\",\n" + + " \"label\": \"Label\",\n" + + " \"schema\": {\n" + + " \"type\": \"Boolean\",\n" + + " \"isValueRequired\": true,\n" + + " \"defaultValue\": true\n" + + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Boolean); + customMetaDataFieldSchemaObject.setValueRequired(true); + customMetaDataFieldSchemaObject.setDefaultValue(true); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("Name"); + customMetaDataFieldCreateRequest.setLabel("Label"); + customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"Name\",\"label\":\"Label\",\"schema\":{\"type\":\"Boolean\",\"defaultValue\":true,\"isValueRequired\":true}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test + public void createCustomMetaDataFields_successExpected_type_SingleSelect() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"id\": \"62c2cfe2a6f0ab95fcb3640f\",\n" + + " \"name\": \"Name\",\n" + + " \"label\": \"Label\",\n" + + " \"schema\": {\n" + + " \"type\": \"SingleSelect\",\n" + + " \"selectOptions\": [\n" + + " \"small\",\n" + + " \"medium\",\n" + + " \"large\",\n" + + " 30,\n" + + " 40,\n" + + " true\n" + + " ]\n" + + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + List objectList = new ArrayList<>(); + objectList.add("small"); + objectList.add("medium"); + objectList.add("large"); + objectList.add(30); + objectList.add(40); + objectList.add(true); + CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.SingleSelect); + customMetaDataFieldSchemaObject.setSelectOptions(objectList); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("Name"); + customMetaDataFieldCreateRequest.setLabel("Label"); + customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"Name\",\"label\":\"Label\",\"schema\":{\"type\":\"SingleSelect\",\"selectOptions\":[\"small\",\"medium\",\"large\",30,40,true]}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + + @Test + public void createCustomMetaDataFields_successExpected_type_MultiSelect() + throws InterruptedException, IOException, BadRequestException, UnknownException { + + MockWebServer server = new MockWebServer(); + server.enqueue(new MockResponse().setBody("{\n" + + " \"id\": \"62c2d3c5a6f0ab2330b3b0b2\",\n" + + " \"name\": \"Name\",\n" + + " \"label\": \"Label\",\n" + + " \"schema\": {\n" + + " \"isValueRequired\": true,\n" + + " \"defaultValue\": [\n" + + " \"small\",\n" + + " 30,\n" + + " true\n" + + " ],\n" + + " \"type\": \"MultiSelect\",\n" + + " \"selectOptions\": [\n" + + " \"small\",\n" + + " \"medium\",\n" + + " \"large\",\n" + + " 30,\n" + + " 40,\n" + + " true\n" + + " ]\n" + + " }\n" + + "}")); + server.start(); + RestClient.API_BASE_URL = server.url("/").toString(); + + List objectList = new ArrayList<>(); + objectList.add("small"); + objectList.add("medium"); + objectList.add("large"); + objectList.add(30); + objectList.add(40); + objectList.add(true); + + List defaultValueObject = new ArrayList<>(); + defaultValueObject.add("small"); + defaultValueObject.add(30); + defaultValueObject.add(true); + CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); + customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.MultiSelect); + customMetaDataFieldSchemaObject.setValueRequired(true); + customMetaDataFieldSchemaObject.setDefaultValue(defaultValueObject); + customMetaDataFieldSchemaObject.setSelectOptions(objectList); + + CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); + customMetaDataFieldCreateRequest.setName("Name"); + customMetaDataFieldCreateRequest.setLabel("Label"); + customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); + + SUT.createCustomMetaDataFields(customMetaDataFieldCreateRequest); + RecordedRequest request = server.takeRequest(); + + String customMetaDataFieldCreateRequestJson = "{\"name\":\"Name\",\"label\":\"Label\",\"schema\":{\"type\":\"MultiSelect\",\"selectOptions\":[\"small\",\"medium\",\"large\",30,40,true],\"defaultValue\":[\"small\",30,true],\"isValueRequired\":true}}"; + String utf8RequestBody = request.getBody().readUtf8(); + assertEquals(customMetaDataFieldCreateRequestJson, utf8RequestBody); + assertEquals("application/json; charset=utf-8", request.getHeader("Content-Type")); + assertEquals("POST /v1/customMetadataFields HTTP/1.1", request.getRequestLine()); + assertEquals(RestClient.API_BASE_URL.concat("v1/customMetadataFields"), request.getRequestUrl().toString()); + } + @Test(expected = NotFoundException.class) public void deleteCustomMetaDataField_404_Expected() throws IOException, InterruptedException, NotFoundException, UnknownException { From bfaede5aa231e26670d5ac4817295dca7cf5f384 Mon Sep 17 00:00:00 2001 From: Khush Date: Tue, 5 Jul 2022 11:13:24 +0530 Subject: [PATCH 090/112] added few changes --- README.md | 4 +- imagekit-sdk/build.gradle | 3 ++ .../main/java/io/imagekit/sdk/ImageKit.java | 6 +-- .../io/imagekit/sdk/tasks/RestClient.java | 50 ++++++++++++++++--- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6497851..0dca8f0 100644 --- a/README.md +++ b/README.md @@ -882,8 +882,10 @@ System.out.println(result.getResponseMetaData().getMap()); **24. Create CustomMetaDataFields** -It creates the CustomMetaDataFields with many available types with param name `type` as per the +It creates the CustomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). + +Check for the [Allowed Values In The Schema](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field#allowed-values-in-the-schema-object). The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class. #### Examples: diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 7db22da..1b4789e 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -26,4 +26,7 @@ dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' testCompile "org.mockito:mockito-all:2.+" testImplementation 'com.squareup.okhttp3:mockwebserver:3.10.0' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.4.1.3' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.4.1' + implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.4.1.1' } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 4a93ef4..4030b6f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -110,9 +110,9 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) * "includeFolder", "name", "limit", "skip"] * @return ResultList class that contains list of BaseFile */ - public ResultList getFileList(@QueryMap GetFileListRequest getFileListRequest) throws ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException, IllegalAccessException { - return restClient.getFileList(getFileListRequest); + public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException, IllegalAccessException, InstantiationException { + return restClient.getFileList(options); } /** diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index df0aec5..5689242 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,5 +1,7 @@ package io.imagekit.sdk.tasks; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonParser; @@ -37,6 +39,9 @@ import okhttp3.*; import java.io.IOException; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -114,20 +119,47 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) return result; } - public ResultList getFileList(GetFileListRequest getFileListRequest) throws ForbiddenException, TooManyRequestsException, - InternalServerException, UnauthorizedException, BadRequestException, UnknownException { + public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, + InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InstantiationException, IllegalAccessException { ResultList resultList = new ResultList(); Map headers = Utils.getHeaders(imageKit); -// ObjectMap objectMapper = new ObjectMapper(); -// ModelMapp QueryMaker queryMaker = new QueryMaker(); -// for (Map.Entry entry : ) { -// queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); +// Map options = new HashMap<>(); +// if (getFileListRequest.getType() != null) { +// options.put("type", getFileListRequest.getType()); +// } +// if (getFileListRequest.getSort() != null) { +// options.put("sort", getFileListRequest.getSort()); +// } +// if (getFileListRequest.getPath() != null) { +// options.put("path", getFileListRequest.getPath()); +// } +// if (getFileListRequest.getSearchQuery() != null) { +// options.put("searchQuery", getFileListRequest.getSearchQuery()); +// } +// if (getFileListRequest.getFileType() != null) { +// options.put("fileType", getFileListRequest.getFileType()); +// } +// if (getFileListRequest.getLimit() != null) { +// options.put("limit", getFileListRequest.getLimit()); // } +// if (getFileListRequest.getSkip() != null) { +// options.put("skip", getFileListRequest.getSkip()); +// } +// if (getFileListRequest.getTags() != null) { +// options.put("tags", Arrays.toString(getFileListRequest.getTags())); +// } + System.out.println("options:==> " + options); + for (Map.Entry entry : options.entrySet()) { + queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); + } + + System.out.println("queryMake:--> " + queryMaker.get()); String url = String.format(Locale.US, API_BASE_URL.concat("v1/files?%s"), queryMaker.get()); + System.out.println("url:--> " + url); request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); try { @@ -135,8 +167,10 @@ public ResultList getFileList(GetFileListRequest getFileListRequest) throws Forb String respBody = ""; if (response.code() == 200) { respBody = response.body().string(); - List files = new Gson().fromJson(respBody, new TypeToken>() { - }.getType()); +// System.out.println("respBody:==> " + respBody); + List files = new Gson().fromJson(respBody, + new TypeToken>() { + }.getType()); resultList.setResults(files); resultList.setRaw(respBody); } else { From ad8f19fab939e51d1640b06e35b44c23853c33ba Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 6 Jul 2022 15:56:00 +0530 Subject: [PATCH 091/112] added getfileequest --- .../main/java/io/imagekit/sdk/ImageKit.java | 4 +- .../java/io/imagekit/sdk/models/BaseFile.java | 31 ++++++----- .../io/imagekit/sdk/tasks/RestClient.java | 55 ++++++++++--------- 3 files changed, 46 insertions(+), 44 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java index 4030b6f..69d374b 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/ImageKit.java @@ -110,9 +110,9 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) * "includeFolder", "name", "limit", "skip"] * @return ResultList class that contains list of BaseFile */ - public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, + public ResultList getFileList(GetFileListRequest getFileListRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, IllegalAccessException, InstantiationException { - return restClient.getFileList(options); + return restClient.getFileList(getFileListRequest); } /** diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java index f65f5d0..3161e5f 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/BaseFile.java @@ -1,7 +1,7 @@ package io.imagekit.sdk.models; import com.google.gson.JsonArray; -import com.google.gson.JsonObject; +import com.google.gson.JsonElement; import java.util.Date; import java.util.List; @@ -20,10 +20,11 @@ public class BaseFile { protected String customCoordinates; protected String fileType; protected JsonArray aiTags; - protected JsonObject versionInfo; - protected JsonObject customMetadata; - protected JsonObject embeddedMetadata; - protected JsonObject extensionStatus; + protected JsonElement versionInfo; + protected JsonElement customMetadata; + + protected JsonElement embeddedMetadata; + protected JsonElement extensionStatus; protected String type; protected String mime; protected Boolean hasAlpha; @@ -35,8 +36,8 @@ public BaseFile() { public BaseFile(String fileId, String name, String url, String thumbnail, int height, int width, long size, String filePath, List tags, boolean isPrivateFile, String customCoordinates, String fileType, - JsonArray aiTags, JsonObject versionInfo, JsonObject customMetadata, JsonObject embeddedMetadata, - JsonObject extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { + JsonArray aiTags, JsonElement versionInfo, JsonElement customMetadata, JsonElement embeddedMetadata, + JsonElement extensionStatus, String type, String mime, Boolean hasAlpha, Date createdAt, Date updatedAt) { this.fileId = fileId; this.name = name; this.url = url; @@ -165,35 +166,35 @@ public void setAiTags(JsonArray aiTags) { this.aiTags = aiTags; } - public JsonObject getVersionInfo() { + public JsonElement getVersionInfo() { return versionInfo; } - public void setVersionInfo(JsonObject versionInfo) { + public void setVersionInfo(JsonElement versionInfo) { this.versionInfo = versionInfo; } - public JsonObject getCustomMetadata() { + public JsonElement getCustomMetadata() { return customMetadata; } - public void setCustomMetadata(JsonObject customMetadata) { + public void setCustomMetadata(JsonElement customMetadata) { this.customMetadata = customMetadata; } - public JsonObject getEmbeddedMetadata() { + public JsonElement getEmbeddedMetadata() { return embeddedMetadata; } - public void setEmbeddedMetadata(JsonObject embeddedMetadata) { + public void setEmbeddedMetadata(JsonElement embeddedMetadata) { this.embeddedMetadata = embeddedMetadata; } - public JsonObject getExtensionStatus() { + public JsonElement getExtensionStatus() { return extensionStatus; } - public void setExtensionStatus(JsonObject extensionStatus) { + public void setExtensionStatus(JsonElement extensionStatus) { this.extensionStatus = extensionStatus; } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 5689242..c9b9ac9 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; @@ -119,37 +120,37 @@ public Result updateFileDetail(FileUpdateRequest fileUpdateRequest) return result; } - public ResultList getFileList(Map options) throws ForbiddenException, TooManyRequestsException, + public ResultList getFileList(GetFileListRequest getFileListRequest) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, InstantiationException, IllegalAccessException { ResultList resultList = new ResultList(); Map headers = Utils.getHeaders(imageKit); QueryMaker queryMaker = new QueryMaker(); -// Map options = new HashMap<>(); -// if (getFileListRequest.getType() != null) { -// options.put("type", getFileListRequest.getType()); -// } -// if (getFileListRequest.getSort() != null) { -// options.put("sort", getFileListRequest.getSort()); -// } -// if (getFileListRequest.getPath() != null) { -// options.put("path", getFileListRequest.getPath()); -// } -// if (getFileListRequest.getSearchQuery() != null) { -// options.put("searchQuery", getFileListRequest.getSearchQuery()); -// } -// if (getFileListRequest.getFileType() != null) { -// options.put("fileType", getFileListRequest.getFileType()); -// } -// if (getFileListRequest.getLimit() != null) { -// options.put("limit", getFileListRequest.getLimit()); -// } -// if (getFileListRequest.getSkip() != null) { -// options.put("skip", getFileListRequest.getSkip()); -// } -// if (getFileListRequest.getTags() != null) { -// options.put("tags", Arrays.toString(getFileListRequest.getTags())); -// } + Map options = new HashMap<>(); + if (getFileListRequest.getType() != null) { + options.put("type", getFileListRequest.getType()); + } + if (getFileListRequest.getSort() != null) { + options.put("sort", getFileListRequest.getSort()); + } + if (getFileListRequest.getPath() != null) { + options.put("path", getFileListRequest.getPath()); + } + if (getFileListRequest.getSearchQuery() != null) { + options.put("searchQuery", getFileListRequest.getSearchQuery()); + } + if (getFileListRequest.getFileType() != null) { + options.put("fileType", getFileListRequest.getFileType()); + } + if (getFileListRequest.getLimit() != null) { + options.put("limit", getFileListRequest.getLimit()); + } + if (getFileListRequest.getSkip() != null) { + options.put("skip", getFileListRequest.getSkip()); + } + if (getFileListRequest.getTags() != null) { + options.put("tags", Arrays.toString(getFileListRequest.getTags())); + } System.out.println("options:==> " + options); for (Map.Entry entry : options.entrySet()) { queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); @@ -167,7 +168,7 @@ public ResultList getFileList(Map options) throws ForbiddenExcep String respBody = ""; if (response.code() == 200) { respBody = response.body().string(); -// System.out.println("respBody:==> " + respBody); + System.out.println("respBody:==> " + respBody); List files = new Gson().fromJson(respBody, new TypeToken>() { }.getType()); From 1e32ca8254702178759a8b93e0c17eb2e044cfee Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 6 Jul 2022 15:56:33 +0530 Subject: [PATCH 092/112] sample app --- build.gradle | 28 ++ libs/commons-codec-1.13.jar | Bin 0 -> 344339 bytes libs/converter-gson-2.3.0.jar | Bin 0 -> 5852 bytes libs/gson-2.7.jar | Bin 0 -> 231952 bytes libs/okhttp-3.10.0.jar | Bin 0 -> 412117 bytes libs/okio-1.14.0.jar | Bin 0 -> 85756 bytes libs/retrofit-2.4.0.jar | Bin 0 -> 91002 bytes local.properties | 8 + src/main/java/io/imagekit/sampleapp/App.java | 383 ++++++++++++++++++ .../java/io/imagekit/sampleapp/Color.java | 21 + src/main/resources/config.sample.properties | 6 + src/main/resources/sample1.jpg | Bin 0 -> 51085 bytes 12 files changed, 446 insertions(+) create mode 100644 build.gradle create mode 100644 libs/commons-codec-1.13.jar create mode 100644 libs/converter-gson-2.3.0.jar create mode 100644 libs/gson-2.7.jar create mode 100644 libs/okhttp-3.10.0.jar create mode 100644 libs/okio-1.14.0.jar create mode 100644 libs/retrofit-2.4.0.jar create mode 100644 local.properties create mode 100644 src/main/java/io/imagekit/sampleapp/App.java create mode 100644 src/main/java/io/imagekit/sampleapp/Color.java create mode 100644 src/main/resources/config.sample.properties create mode 100644 src/main/resources/sample1.jpg diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7bd908e --- /dev/null +++ b/build.gradle @@ -0,0 +1,28 @@ +plugins { + id 'java' + id 'application' +} + +group 'io.imagekit.sampleapp' +version '1.0-SNAPSHOT' + +sourceCompatibility = 1.8 + +repositories { + mavenCentral() +} + +application { + mainClassName 'io.imagekit.sampleapp.App' +} + +test { + useJUnitPlatform() +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + compile project(':imagekit-sdk') + testCompile group: 'junit', name: 'junit', version: '4.12' +} + diff --git a/libs/commons-codec-1.13.jar b/libs/commons-codec-1.13.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf6ccb385d5f6cfc0930565fc88a049544cd7cd4 GIT binary patch literal 344339 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

ViHB`l3aEBk87} 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 P7gpD0a5-!Z_&V$VHv^iJ literal 0 HcmV?d00001 diff --git a/libs/converter-gson-2.3.0.jar b/libs/converter-gson-2.3.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..d91c032aea2049cee530c8a32e43673b0813e10c GIT binary patch literal 5852 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 literal 0 HcmV?d00001 diff --git a/libs/gson-2.7.jar b/libs/gson-2.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..be5b59b764b56819e35021933772ab07b41e2e0e GIT binary patch literal 231952 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


Tx^^#N^nM%8YqGo37p@^(viQ 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%0AS16P*A^8&!6~}%6g=@rY9yC-f&fb|?IM4FVqdxE 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 p^p!F6`I&Cxpl09sv{%_dk<>o3H=? literal 0 HcmV?d00001 diff --git a/libs/okhttp-3.10.0.jar b/libs/okhttp-3.10.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..1c3cfb826f4bc8b69e0685987e473f304eb3ef9d GIT binary patch literal 412117 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%0D|Yb#kTOi;Pbs4+qldcY2s%LHV@R}bRM$n)pi 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%0A?{FRI~oE5$0 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 rbOOi@uYf?xb;5R#`vT( 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 literal 0 HcmV?d00001 diff --git a/libs/okio-1.14.0.jar b/libs/okio-1.14.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..a0ee347165380ead8f82c3ef122f16915df701ab GIT binary patch literal 85756 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

@$PtwyP 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 cls) method need current class as parameter + Configuration config = new Configuration("public_SSvmi6RknpNXj9x1cQnra1sYpJg=", "private_kwTU4AR9Ei5hBoTIuxCW63Dg2jM=", "https://ik.imagekit.io/zv3rkhsym"); + imageKit.setConfig(config); + + getFileList(); +// uploadFromURL(); +// updateDetails("62a9c3ccd875ec6fd658c854"); +// createCustomMetaDataFields_Number(); +// restoreFileVersion(); +// uploadFromURL(); +// uploadFromBase64(); +// uploadFromBytes(); +// +// calculateDistance(); +// generatingAuthParams(); +// +// List files=getList(0,10); +// if(null!=files && files.size()>0){ +// getFileDetail(files.get(0).getFileId()); +// getFileMetaData(files.get(0).getFileId()); +// getRemoteFileMetaData(files.get(1).getUrl()); +// updateDetails(files.get(0).getFileId()); +// ResultCache resultCache = purgeCache(files.get(0).getUrl()); +// getPurgeCacheStatus(resultCache.getRequestId()); +// generateUrl(files.get(0)); +// +// // System.out.println(Color.ANSI_CYAN+"Do you want to delete uploaded files? (yes/No): "+Color.ANSI_BLUE); +// // String choice=new Scanner(System.in).nextLine(); +// // if (!"yes".equalsIgnoreCase(choice.trim().toLowerCase())){ +// // System.exit(0); +// // } +// System.out.println(Color.ANSI_RESET); +// deleteFile(files.get(0).getFileId()); +// files.remove(0); +// deleteFiles(files); +// } + + System.exit(0); + } + + + private static void getFileList() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IllegalAccessException, InstantiationException { + System.out.println(Color.ANSI_CYAN + ">> Uploading Image from file:" + Color.ANSI_RESET); + System.out.println(">> Start uploading..."); + String[] tags = new String[3]; + tags[0] = "Software"; + tags[1] = "Developer"; + tags[2] = "Engineer"; + Map options = new HashMap<>(); +// options.put("skip", "" + 0); +// options.put("limit", "" + 2); +// options.put("type", "file"); +// options.put("sort", "ASC_CREATED"); +// options.put("path", "/"); +// options.put("fileType", "non-image"); // 62ac1b71759bcd0f9156d137 +// options.put("searchQuery", "format='jpg'"); +// options.put("tags", Arrays.toString(tags)); + GetFileListRequest getFileListRequest = new GetFileListRequest(); + getFileListRequest.setFileType("all"); + getFileListRequest.setTags(tags); + getFileListRequest.setLimit("4"); + ResultList resultList = ImageKit.getInstance().getFileList(getFileListRequest); + System.out.println(">> Uploading done."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(resultList); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(resultList.getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(resultList.getMap()); + System.out.println("\n\n"); + } + + + + private static void uploadFromURL() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { + System.out.println(Color.ANSI_CYAN + ">> Uploading from URL:" + Color.ANSI_RESET); + System.out.println(">> Start uploading..."); + String imageUrl = "https://ik.imagekit.io/ikmedia/IPTC-PhotometadataRef-Std2019.1_8O33PO0Jjss.jpg?tr=md-true"; + URL url = null; + try { + url = URI.create(imageUrl).toURL(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "new-image-2.jpg"); + List tags = new ArrayList<>(); + tags.add("Software"); + tags.add("Developer"); + tags.add("Engineer"); + fileCreateRequest.setTags(tags); + + List responseFields = new ArrayList<>(); + responseFields.add("thumbnail"); + responseFields.add("tags"); + responseFields.add("customCoordinates"); +// responseFields.add("embeddedMetadata"); + + fileCreateRequest.setResponseFields(responseFields); + System.out.println(">> Ref: URL= " + imageUrl); + Result result = ImageKit.getInstance().upload(fileCreateRequest); + System.out.println(">> Uploading done."); + System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); + System.out.println(result); + System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getRaw()); + System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); + System.out.println(result.getResponseMetaData().getMap()); + System.out.println("\n\n"); + } + + +// private static void createCustomMetaDataFields_Text() +// throws BadRequestException, UnknownException { +// +// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); +// customMetaDataFieldSchemaObject.setValueRequired(true); +// customMetaDataFieldSchemaObject.setDefaultValue(20); +// customMetaDataFieldSchemaObject.setMinLength(10); +// customMetaDataFieldSchemaObject.setMaxLength(100); +// +// +// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +// customMetaDataFieldCreateRequest.setName("Name"); +// customMetaDataFieldCreateRequest.setLabel("Label"); +// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); +// +// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() +// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +// System.out.println(">> Create CustomMetaDataFields done."); +// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +// +// +// private static void createCustomMetaDataFields_Textarea() +// throws BadRequestException, UnknownException { +// +// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Textarea); +// customMetaDataFieldSchemaObject.setValueRequired(true); +// customMetaDataFieldSchemaObject.setDefaultValue(20); +// customMetaDataFieldSchemaObject.setMinLength(10); +// customMetaDataFieldSchemaObject.setMaxLength(100); +// +// +// +// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +// customMetaDataFieldCreateRequest.setName("Name"); +// customMetaDataFieldCreateRequest.setLabel("Label"); +// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); +// +// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() +// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +// System.out.println(">> Create CustomMetaDataFields done."); +// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +// +// +// private static void createCustomMetaDataFields_Date() +// throws BadRequestException, UnknownException { +// +// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Date); +// customMetaDataFieldSchemaObject.setValueRequired(true); +// customMetaDataFieldSchemaObject.setDefaultValue("2022-11-30T10:11:10+00:00"); +// customMetaDataFieldSchemaObject.setMinValue("2022-11-30T10:11:10+00:00"); +// customMetaDataFieldSchemaObject.setMaxValue("2022-12-30T10:11:10+00:00"); +// +// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +// customMetaDataFieldCreateRequest.setName("Name"); +// customMetaDataFieldCreateRequest.setLabel("Label"); +// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); +// +// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() +// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +// System.out.println(">> Create CustomMetaDataFields done."); +// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +// +// private static void createCustomMetaDataFields_SingleSelect() +// throws BadRequestException, UnknownException { +// List objectList = new ArrayList<>(); +// objectList.add("small"); +// objectList.add("medium"); +// objectList.add("large"); +// objectList.add(30); +// objectList.add(40); +// objectList.add(true); +// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.SingleSelect); +// customMetaDataFieldSchemaObject.setValueRequired(true); +// customMetaDataFieldSchemaObject.setDefaultValue("small"); +// customMetaDataFieldSchemaObject.setSelectOptions(objectList); +// +// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +// customMetaDataFieldCreateRequest.setName("Name"); +// customMetaDataFieldCreateRequest.setLabel("Label"); +// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); +// +// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() +// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +// System.out.println(">> Create CustomMetaDataFields done."); +// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +// +// +// private static void createCustomMetaDataFields_Number() +// throws BadRequestException, UnknownException { +// +// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); +// customMetaDataFieldSchemaObject.setValueRequired(true); +// customMetaDataFieldSchemaObject.setDefaultValue(10); +// customMetaDataFieldSchemaObject.setMinValue(1); +// customMetaDataFieldSchemaObject.setMaxValue(20); +// +// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +// customMetaDataFieldCreateRequest.setName("Name"); +// customMetaDataFieldCreateRequest.setLabel("Label"); +// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); +// +// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() +// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +// System.out.println(">> Create CustomMetaDataFields done."); +// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +// +// private static void createCustomMetaDataFields_MultiSelect() +// throws BadRequestException, UnknownException { +// +// List objectList = new ArrayList<>(); +// objectList.add("small"); +// objectList.add("medium"); +// objectList.add("large"); +// objectList.add(30); +// objectList.add(40); +// objectList.add(true); +// +// List defaultValueObject = new ArrayList<>(); +// defaultValueObject.add("small"); +// defaultValueObject.add(30); +// defaultValueObject.add(true); +// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.MultiSelect); +// customMetaDataFieldSchemaObject.setValueRequired(true); +// customMetaDataFieldSchemaObject.setDefaultValue(defaultValueObject); +// customMetaDataFieldSchemaObject.setSelectOptions(objectList); +// +// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +// customMetaDataFieldCreateRequest.setName("Name"); +// customMetaDataFieldCreateRequest.setLabel("Label"); +// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); +// +// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() +// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +// System.out.println(">> Create CustomMetaDataFields done."); +// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +// +// +// private static void createCustomMetaDataFields_Boolean() +// throws BadRequestException, UnknownException { +// +// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); +// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Boolean); +// customMetaDataFieldSchemaObject.setValueRequired(true); +// customMetaDataFieldSchemaObject.setDefaultValue(true); +// +// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); +// customMetaDataFieldCreateRequest.setName("Name"); +// customMetaDataFieldCreateRequest.setLabel("Label"); +// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); +// +// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() +// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); +// System.out.println(">> Create CustomMetaDataFields done."); +// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +// +// private static void updateDetails(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { +// System.out.println(Color.ANSI_CYAN + ">> Updating file details:" + Color.ANSI_RESET); +// System.out.println(">> Updating file details..."); +// List tags = new ArrayList<>(); +// tags.add("Software"); +// tags.add("Developer"); +// tags.add("Engineer"); +// +// List aiTags = new ArrayList<>(); +// aiTags.add("Plant"); +// FileUpdateRequest fileUpdateRequest = new FileUpdateRequest(fileId); +// fileUpdateRequest.setTags(tags); +// fileUpdateRequest.setRemoveAITags(aiTags); +// fileUpdateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); +// +// JsonObject optionsInnerObject = new JsonObject(); +// optionsInnerObject.addProperty("add_shadow", true); +// optionsInnerObject.addProperty("bg_color", "yellow"); +// JsonObject innerObject1 = new JsonObject(); +// innerObject1.addProperty("name", "remove-bg"); +// innerObject1.add("options", optionsInnerObject); +// JsonObject innerObject2 = new JsonObject(); +// innerObject2.addProperty("name", "google-auto-tagging"); +// innerObject2.addProperty("minConfidence", 15); +// innerObject2.addProperty("maxTags", 20); +// JsonArray jsonArray = new JsonArray(); +// jsonArray.add(innerObject1); +// jsonArray.add(innerObject2); +// +// fileUpdateRequest.setExtensions(jsonArray); +// fileUpdateRequest.setCustomCoordinates("10,10,40,40"); +// JsonObject jsonObjectCustomMetadata = new JsonObject(); +// jsonObjectCustomMetadata.addProperty("test10", 11); +// fileUpdateRequest.setCustomMetadata(jsonObjectCustomMetadata); +// Result result = ImageKit.getInstance().updateFileDetail(fileUpdateRequest); +// System.out.println(">> Updating done..."); +// System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); +// System.out.println(result); +// System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); +// System.out.println(result.getResponseMetaData().getRaw()); +// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); +// System.out.println(result.getResponseMetaData().getMap()); +// System.out.println("\n\n"); +// } +} diff --git a/src/main/java/io/imagekit/sampleapp/Color.java b/src/main/java/io/imagekit/sampleapp/Color.java new file mode 100644 index 0000000..b19d555 --- /dev/null +++ b/src/main/java/io/imagekit/sampleapp/Color.java @@ -0,0 +1,21 @@ +package io.imagekit.sampleapp; + +public class Color { + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_BLACK = "\u001B[30m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + public static final String ANSI_BLUE = "\u001B[34m"; + public static final String ANSI_PURPLE = "\u001B[35m"; + public static final String ANSI_CYAN = "\u001B[36m"; + public static final String ANSI_WHITE = "\u001B[37m"; + public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m"; + public static final String ANSI_RED_BACKGROUND = "\u001B[41m"; + public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m"; + public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m"; + public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m"; + public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m"; + public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m"; + public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"; +} diff --git a/src/main/resources/config.sample.properties b/src/main/resources/config.sample.properties new file mode 100644 index 0000000..eb626e3 --- /dev/null +++ b/src/main/resources/config.sample.properties @@ -0,0 +1,6 @@ +# Copy this sample file add rename it to "config.properties" +# Put essential values of keys [UrlEndpoint, PrivateKey, PublicKey] + +UrlEndpoint=<-YOUR-ENDPOINT-URL-HERE-> +PrivateKey=<-YOUR-PRIVATE-KEY-HERE-> +PublicKey=<-YOUR-PUBLIC-KEY-HERE-> \ No newline at end of file diff --git a/src/main/resources/sample1.jpg b/src/main/resources/sample1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a52a95dfd4f26a12b8f23ee91ff2fa7425f6859 GIT binary patch literal 51085 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 literal 0 HcmV?d00001 From e3197863172cfe56647eb5ae921160060d7a0f68 Mon Sep 17 00:00:00 2001 From: Khush Date: Wed, 6 Jul 2022 16:59:35 +0530 Subject: [PATCH 093/112] added fixes for getFileList --- README.md | 30 +++++---- .../sdk/models/GetFileListRequest.java | 24 ++++++- .../io/imagekit/sdk/tasks/RestClient.java | 11 +-- .../java/io/imagekit/sdk/manage/FileTest.java | 67 ++++++++++--------- 4 files changed, 79 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 0dca8f0..3138232 100644 --- a/README.md +++ b/README.md @@ -422,20 +422,22 @@ in the [documentation here](https://docs.imagekit.io/api-reference/media-api/lis correct values to get the results. ```java -Map options = new HashMap<>(); -List tags = new ArrayList<>(); -tags.add("Software"); -tags.add("Developer"); -tags.add("Engineer"); -options.put("skip", "" + 0); -options.put("limit", "" + 1); -options.put("type", "file"); -options.put("sort", "ASC_CREATED"); -options.put("path", "/"); -options.put("fileType", "all"); -options.put("searchQuery","createdAt >= '2d' OR size < '2mb' OR format='png'"); -options.put("tags", String.valueOf(tags)); -ResultList resultList = ImageKit.getInstance().getFileList(options); +String[] tags = new String[3]; +tags[0] = "Software"; +tags[1] = "Developer"; +tags[2] = "Engineer"; +GetFileListRequest getFileListRequest = new GetFileListRequest(); +getFileListRequest.setType("file"); +getFileListRequest.setSort("ASC_CREATED"); +getFileListRequest.setPath("/"); +getFileListRequest.setSearchQuery("createdAt >= '2d' OR size < '2mb' OR format='png'"); +getFileListRequest.setFileType("all"); +getFileListRequest.setLimit("4"); +getFileListRequest.setSkip("1"); +getFileListRequest.setTags(tags); +getFileListRequest.setIncludeFolder(false); +getFileListRequest.setName("new_car.jpg"); // name match is case-sensitive. +ResultList resultList = ImageKit.getInstance().getFileList(getFileListRequest); System.out.println("======FINAL RESULT======="); System.out.println(resultList); System.out.println("Raw Response:"); diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java index 0fbaab7..6067f24 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java @@ -1,6 +1,6 @@ package io.imagekit.sdk.models; -import com.google.gson.JsonArray; +import java.util.Arrays; public class GetFileListRequest { public String type; @@ -11,6 +11,8 @@ public class GetFileListRequest { public String limit; public String skip; public String[] tags; + public Boolean includeFolder; + public String name; public String getType() { return type; @@ -76,6 +78,22 @@ public void setTags(String[] tags) { this.tags = tags; } + public Boolean getIncludeFolder() { + return includeFolder; + } + + public void setIncludeFolder(Boolean includeFolder) { + this.includeFolder = includeFolder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + @Override public String toString() { return "GetFileListRequest{" + @@ -86,7 +104,9 @@ public String toString() { ", fileType='" + fileType + '\'' + ", limit='" + limit + '\'' + ", skip='" + skip + '\'' + - ", tags=" + tags + + ", tags=" + Arrays.toString(tags) + + ", includeFolder=" + includeFolder + + ", name='" + name + '\'' + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index c9b9ac9..56b1a6d 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -151,16 +151,18 @@ public ResultList getFileList(GetFileListRequest getFileListRequest) throws Forb if (getFileListRequest.getTags() != null) { options.put("tags", Arrays.toString(getFileListRequest.getTags())); } - System.out.println("options:==> " + options); + if (getFileListRequest.getIncludeFolder() != null) { + options.put("includeFolder", String.valueOf(getFileListRequest.getIncludeFolder())); + } + if (getFileListRequest.getName() != null) { + options.put("name", getFileListRequest.getName()); + } for (Map.Entry entry : options.entrySet()) { queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); } - System.out.println("queryMake:--> " + queryMaker.get()); - String url = String.format(Locale.US, API_BASE_URL.concat("v1/files?%s"), queryMaker.get()); - System.out.println("url:--> " + url); request = new Request.Builder().url(url).get().headers(Headers.of(headers)).build(); try { @@ -168,7 +170,6 @@ public ResultList getFileList(GetFileListRequest getFileListRequest) throws Forb String respBody = ""; if (response.code() == 200) { respBody = response.body().string(); - System.out.println("respBody:==> " + respBody); List files = new Gson().fromJson(respBody, new TypeToken>() { }.getType()); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index 84c25b1..85bfc7d 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -13,6 +13,7 @@ import io.imagekit.sdk.exceptions.UnauthorizedException; import io.imagekit.sdk.exceptions.UnknownException; import io.imagekit.sdk.models.FileUpdateRequest; +import io.imagekit.sdk.models.GetFileListRequest; import io.imagekit.sdk.tasks.RestClient; import io.imagekit.sdk.utils.Utils; import okhttp3.mockwebserver.MockResponse; @@ -287,7 +288,7 @@ public void imageKit_updateDetails_returnTrue() @Test public void imageKit_getFileList_returnList() - throws InterruptedException, IOException { + throws InterruptedException, IOException, ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException, IllegalAccessException, InstantiationException { MockWebServer server = new MockWebServer(); String responseJson = "[\n" + " {\n" + " \"type\": \"file\",\n" @@ -310,30 +311,31 @@ public void imageKit_getFileList_returnList() server.enqueue(new MockResponse().setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Map options = new HashMap<>(); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - options.put("skip", "" + 0); - options.put("limit", "" + 1); - options.put("type", "file"); - options.put("sort", "ASC_CREATED"); - options.put("path", "/"); - options.put("fileType", "all"); - options.put("searchQuery", "createdAt >= '2d' OR size < '2mb' OR format='png'"); - options.put("tags", String.valueOf(tags)); -// SUT.getFileList(options); + String[] tags = new String[3]; + tags[0] = "Software"; + tags[1] = "Developer"; + tags[2] = "Engineer"; + GetFileListRequest getFileListRequest = new GetFileListRequest(); + getFileListRequest.setType("file"); + getFileListRequest.setSort("ASC_CREATED"); + getFileListRequest.setPath("/"); + getFileListRequest.setSearchQuery("createdAt >= '2d' OR size < '2mb' OR format='png'"); + getFileListRequest.setFileType("all"); + getFileListRequest.setLimit("1"); + getFileListRequest.setSkip("0"); + getFileListRequest.setTags(tags); + getFileListRequest.setIncludeFolder(false); + SUT.getFileList(getFileListRequest); RecordedRequest request = server.takeRequest(); String utf8RequestBody = request.getBody().readUtf8(); assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals( - "GET /v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", + "GET /v1/files?path=/&includeFolder=false&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat( - "v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), + "v1/files?path=/&includeFolder=false&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), request.getRequestUrl().toString()); } @@ -341,7 +343,7 @@ public void imageKit_getFileList_returnList() @Test(expected = BadRequestException.class) public void imageKit_getFileList_400_expected() throws InterruptedException, ForbiddenException, TooManyRequestsException, InternalServerException, - UnauthorizedException, BadRequestException, UnknownException, IOException { + UnauthorizedException, BadRequestException, UnknownException, IOException, IllegalAccessException, InstantiationException { MockWebServer server = new MockWebServer(); String responseJson = "{\n" @@ -350,20 +352,21 @@ public void imageKit_getFileList_400_expected() server.enqueue(new MockResponse().setResponseCode(400).setBody(responseJson)); server.start(); RestClient.API_BASE_URL = server.url("/").toString(); - Map options = new HashMap<>(); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - options.put("skip", "" + 0); - options.put("limit", "" + 1); - options.put("type", "file"); - options.put("sort", "ASC_CREATED"); - options.put("path", "/"); - options.put("fileType", "all"); - options.put("searchQuery", "createdAt >= '2days' OR size < '2mb' OR format='png'"); - options.put("tags", String.valueOf(tags)); -// SUT.getFileList(options); + String[] tags = new String[3]; + tags[0] = "Software"; + tags[1] = "Developer"; + tags[2] = "Engineer"; + GetFileListRequest getFileListRequest = new GetFileListRequest(); + getFileListRequest.setType("file"); + getFileListRequest.setSort("ASC_CREATED"); + getFileListRequest.setPath("/"); + getFileListRequest.setSearchQuery("createdAt >= '2d' OR size < '2mb' OR format='png'"); + getFileListRequest.setFileType("all"); + getFileListRequest.setLimit("1"); + getFileListRequest.setSkip("0"); + getFileListRequest.setTags(tags); + getFileListRequest.setIncludeFolder(true); + SUT.getFileList(getFileListRequest); server.takeRequest(); } From 7b8a5f803b9667482a81eccf645cbc2ab9d1541e Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 7 Jul 2022 16:39:46 +0530 Subject: [PATCH 094/112] removed sample app --- build.gradle | 28 -- libs/commons-codec-1.13.jar | Bin 344339 -> 0 bytes libs/converter-gson-2.3.0.jar | Bin 5852 -> 0 bytes libs/gson-2.7.jar | Bin 231952 -> 0 bytes libs/okhttp-3.10.0.jar | Bin 412117 -> 0 bytes libs/okio-1.14.0.jar | Bin 85756 -> 0 bytes libs/retrofit-2.4.0.jar | Bin 91002 -> 0 bytes local.properties | 8 - src/main/java/io/imagekit/sampleapp/App.java | 383 ------------------ .../java/io/imagekit/sampleapp/Color.java | 21 - src/main/resources/config.sample.properties | 6 - src/main/resources/sample1.jpg | Bin 51085 -> 0 bytes 12 files changed, 446 deletions(-) delete mode 100644 build.gradle delete mode 100644 libs/commons-codec-1.13.jar delete mode 100644 libs/converter-gson-2.3.0.jar delete mode 100644 libs/gson-2.7.jar delete mode 100644 libs/okhttp-3.10.0.jar delete mode 100644 libs/okio-1.14.0.jar delete mode 100644 libs/retrofit-2.4.0.jar delete mode 100644 local.properties delete mode 100644 src/main/java/io/imagekit/sampleapp/App.java delete mode 100644 src/main/java/io/imagekit/sampleapp/Color.java delete mode 100644 src/main/resources/config.sample.properties delete mode 100644 src/main/resources/sample1.jpg diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 7bd908e..0000000 --- a/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -plugins { - id 'java' - id 'application' -} - -group 'io.imagekit.sampleapp' -version '1.0-SNAPSHOT' - -sourceCompatibility = 1.8 - -repositories { - mavenCentral() -} - -application { - mainClassName 'io.imagekit.sampleapp.App' -} - -test { - useJUnitPlatform() -} - -dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile project(':imagekit-sdk') - testCompile group: 'junit', name: 'junit', version: '4.12' -} - diff --git a/libs/commons-codec-1.13.jar b/libs/commons-codec-1.13.jar deleted file mode 100644 index bf6ccb385d5f6cfc0930565fc88a049544cd7cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344339 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

ViHB`l3aEBk87} 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 P7gpD0a5-!Z_&V$VHv^iJ diff --git a/libs/converter-gson-2.3.0.jar b/libs/converter-gson-2.3.0.jar deleted file mode 100644 index d91c032aea2049cee530c8a32e43673b0813e10c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5852 zcmbtY2Ut_vvW`j%U8>3fr1y>>y$VvIbPOOEVi2SR2n0e?sx(0X6)>SljR;6piu5AV zy9g*CAjQz69fJ76^#JEu&b{BeE8pHbW#<29t*n_@GX{Dmh{yr^Lo_8{_g`=Rx&aAK z&;=7U5uHm~Vg`SSkpV;qVnAKrY&hZPP{PIVcQKIKB^|8`#wMa5tuLUCc6~h&(OxP& z5y7sG?h+&M0jY@@cVXSG*TQ-t>SUzTnPv%0LUr8U6=+>4gsulhFrT6LjT9pC%NN2| zQAYH7M#gnPF~kvVr?KQU5il%@yv0Y$r-fETpwe1k2m0`79C_I<_VO}WIL zo&W&42&*dfPioo(U5x{7EeO;D?v4_LIzbSKPBY8PEZPivBsNT9j{HPq10dZ#t7wPf znYhyWu%;eWQR;}}ks)i+U|zeZ5x3#R-0Jl#8vh0OoQ-`}xn|jbve`mxq>o*-aEpv) zt|5cvdyE{SX4wxh`x*QVKigdk=$MKKl%uDV)j##pVWQpI55^f|NizFD0B%bwYa}h0 zc%|;i+AHUYm~<76*sNsyBSyK& zKu5lMEgD~7OFiGec+3mQwtDmYWhSd`DyGvdu~GQwCX!K?yYT?r?C&stU`t8gI?L4PDl0)r@?pyKRWE{7$J8yVbEaCbfa`{)<79 z3HaE;tDTKzLAm1AH)T2t{x%HmY;ITFhsmPZvP6iDpCxly8ZPbDE_>yBX8}s{if%7r zP-H%z^2KcD3eTp^FLyX9?>V-4C5%Bmt~e8a)j;JU@enDJB}?zycbIg& zo5T^Eo&7HP8gBW9t^O3nB@9%GcCS6!*0KzEl*)QvS1zL(YzkH^Kn6-p#ZQ4TrDn}O z6IIq=*;WdifJ=TNRRtG+L{V{?OOdP7RS;4U$I87h5Rv8G1AZuv_vFit-?GP7p!EAy zPG-yaXY27wfW!vXe1QFV+8CL;bQcYi?%snX*rleEF7yurM#r?f9h(Armu}1_XDZz5 zzg^d{xFTe8=jW;c8D>LjRS&V3Qyk+|b_1`N8AI|aqH?zBY+ zN=#d)Cml~}N_YeMO8vz=dBeUkz@5~kw>Avb7eAbk0fM6&QLli;@lrbhkw6P$vfCLb8BX z8AMmesW-{nI4&b1SFAtp?02c$@g*BMKH_s55)wf|lH9VyLo97tDCJ?TE@K>R1RX%ch{%NM7J6f0RWo>*O&cI zu5Sc$^MoNh)Zy1rhf(0W`(w-;E&J_G)oAD$+n!gT_9UAdDE}i!k~QN2kc`@_PA9a8 zp2C5@zHdOfd9_dmQ+KWqNBUVC_wH+UI>Tsjg_!^QExGsI^Pq1#_$`%V`cHDxNMkKl zPTDnhqoYy8YKn2IS9*x+txRYe=!tD?b?PN+jP5l=(mo@9aE|!$YFWc#iTDs>=Bi>e z74hS3t(J$;aF`#T8W`+dEnS6q?^Ag;T>)167BSwCS#E15tmJPZPEVJdn#24ehg;JK zzmr}tBVsAF>5*e!`OYuNNFY(<9SW!<(5T!~T#o5XO1|cBd0V66*^TueM|nDunbQ;kwr6^!YZED1lNy}&R%0Ngn+XqO&GkqX zvg3!m+^0RVoHV+f=VEx4l%?jDz!!k=0<9jbzQgXz4q+G-Y1T@G*qshPuw>K{8Y7pi z63?p{DC*5k`(bh5PL+a?>eQ|2tL2Ps?E%ujBKwL)Ii=LWA><~g5!58eWf-bT*_@st zgkpRu0ntY4R#iP2&M%#P*?}_W@SeHyp4KCwlYeyme1ZTz&&nMB#ayf>@ER!`?Wn1OtLgKZ$Qu98&DPZLqLiv56AbXBHjAu*uV^-OlQx^?zPj`9N zFF>(A4{q~Lu zj!qGUXLmRzFKuWIZ)5lFZJb*WV6VSA3Ld1HbEz(<3hTcO47lcdHvLiRSojsTfEq5_ z&Wlw|Pka)pbTJ$$kHz&tuB7m_UEpP&K7fPoE|HPnv`F$)2K?mqgJ%F2)NI29(=B)g zu~$zR|K&7=?r1ds1V;0Gn?l5GQ26SYhQ&}M-eMS--bN~=?!P3f1mwRZt|jF##TsPE zXK#(V(=#+DF+EI{ng%$(%9FV=D+oBX5$^o?!ei|*W|Jpl9 zC&?wJ`BQWVIB98?Tk(Oo7$lG*LF5XrhNaO9>cM9)7{ZE?*E9GbQE(=#w7StbY>E8Q zx=xCi@9^~LOQ*rch)9_mbG4mb5|~TEhN`$HkTYF$jZUTV`23I}R=V1ou<(2iheW?T z@0abk((=b#dd7WyWn(dREK{ShVQ8g{I&n;C1=Mnx>W0yv$d~X@BCq|qE7NH;`DFJfre|x57no9oX#0&_lvmVZllmQfVQ(6 z#EttGC}>(BGG`*kI&&>3gR7Sph9sZhPB2=K$8?ryY=A~0)EA6nve}((qF(UR(a|vh z?Qy|fUt-kW(xpgvjC02u*`A6tdzznISJk|(p5>42^T0|mXBCRp!^6?Vk>y>(RJ|i9 zEO=SbTn1^Vj+)YvkiBX~&?j#W2)LfyjHlY#dZdtgIcVd3GC6!xlP$FJ*4I@)w1@%FYc%z#!k-d_4^zf6R6 zJnk4K^xQ>XDT}!=-5gF_Lm%z8<4o*w8fTS#!Y246iF;?m?%3n9%Sa)Lysxblx%CQ} z!;l_;C7m9LEpDTUJYdQBhxjAOIz&Gtn1xbC|;)M@gu@2=-9XUm%%BZpY1D1S3M$<~`d7 zW0cqN$&9j5;f1K%0r}Tz=ehXR9vblVvc{7kU-Q6-ma^!bt#}0_YKt99qox~I@3ZF$ zarjvjIOMnYOx|33+fb9;CB#&JOU>Q7?7Y^P|2oaTJ6)fkk48Dc*~ST%&_6kyD+KBY zxd9V#aIu4bKM;UG?YfPs3`+ElPp-~ut(>SF5I~NYUa*Q_3SEMSJrmQLypx!?V%P^(GBr`iJ$VGXx1c zs-b=s=KWb13U?MoxOqa{VVDD8lRV%T&+C1mgz0DvV1 z02Kefkgf#dy`7!P5^Nkt#TlAEd=-cu$>Wiozec3(f69r{!t5>kj+x1yErw_GlDS7u zXMFG`8 z?hdlhDr;4_w_nG-0vlMYk}yn$MV+H{*7L#t8D<^#%$N5(vjX4NQn|B^0!#R!a=I$!8p(+M>@Rnkf= zr3i^5|cnEM?ICk@B9t1KQz~8hsA}i8>C#Cl4I}rfc;~7?Ng^3N}ehr zg$~4lv?&^>96MfbNZOYpc?>05J}h%p$5e43>#!= z`0^u@wFbhKIxmc3JXR?x;De(|n-uYlhE2@(0;<46%i|mhTLlfGk5c21PPvE#2l*B zAqU(g^jnS{XE^cu&Jkf|gh30ysqH@x{rX7l*PWz&;r)>r$Va#zs{O66bcFD83+KBz z`}+IDuL;k;$AKe*_j_3TQU_zd_49q~>#Y#p9_bzWKB1%YdxZT~(D$*Az)1)Pze4yc zdK|#~x;1nFlo<&ACz#(iijM63bpd)rU_uC4zqNCp;P>U|k0d{y9*;{M z-(&74sw2$F{~Ggf>mH=70}3+0uM*b*NoJrlVF?a>@B5s8WA+aef2Fab)&0H$e~fuY eOwg161Jh9iG|(d^*$1U2ykZEwmh*J`pZ*U^olbrL diff --git a/libs/gson-2.7.jar b/libs/gson-2.7.jar deleted file mode 100644 index be5b59b764b56819e35021933772ab07b41e2e0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231952 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


Tx^^#N^nM%8YqGo37p@^(viQ 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%0AS16P*A^8&!6~}%6g=@rY9yC-f&fb|?IM4FVqdxE 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 p^p!F6`I&Cxpl09sv{%_dk<>o3H=? diff --git a/libs/okhttp-3.10.0.jar b/libs/okhttp-3.10.0.jar deleted file mode 100644 index 1c3cfb826f4bc8b69e0685987e473f304eb3ef9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412117 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%0D|Yb#kTOi;Pbs4+qldcY2s%LHV@R}bRM$n)pi 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%0A?{FRI~oE5$0 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 rbOOi@uYf?xb;5R#`vT( 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 diff --git a/libs/okio-1.14.0.jar b/libs/okio-1.14.0.jar deleted file mode 100644 index a0ee347165380ead8f82c3ef122f16915df701ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85756 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

@$PtwyP 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 cls) method need current class as parameter - Configuration config = new Configuration("public_SSvmi6RknpNXj9x1cQnra1sYpJg=", "private_kwTU4AR9Ei5hBoTIuxCW63Dg2jM=", "https://ik.imagekit.io/zv3rkhsym"); - imageKit.setConfig(config); - - getFileList(); -// uploadFromURL(); -// updateDetails("62a9c3ccd875ec6fd658c854"); -// createCustomMetaDataFields_Number(); -// restoreFileVersion(); -// uploadFromURL(); -// uploadFromBase64(); -// uploadFromBytes(); -// -// calculateDistance(); -// generatingAuthParams(); -// -// List files=getList(0,10); -// if(null!=files && files.size()>0){ -// getFileDetail(files.get(0).getFileId()); -// getFileMetaData(files.get(0).getFileId()); -// getRemoteFileMetaData(files.get(1).getUrl()); -// updateDetails(files.get(0).getFileId()); -// ResultCache resultCache = purgeCache(files.get(0).getUrl()); -// getPurgeCacheStatus(resultCache.getRequestId()); -// generateUrl(files.get(0)); -// -// // System.out.println(Color.ANSI_CYAN+"Do you want to delete uploaded files? (yes/No): "+Color.ANSI_BLUE); -// // String choice=new Scanner(System.in).nextLine(); -// // if (!"yes".equalsIgnoreCase(choice.trim().toLowerCase())){ -// // System.exit(0); -// // } -// System.out.println(Color.ANSI_RESET); -// deleteFile(files.get(0).getFileId()); -// files.remove(0); -// deleteFiles(files); -// } - - System.exit(0); - } - - - private static void getFileList() throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, NotFoundException, BadRequestException, UnknownException, IllegalAccessException, InstantiationException { - System.out.println(Color.ANSI_CYAN + ">> Uploading Image from file:" + Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - String[] tags = new String[3]; - tags[0] = "Software"; - tags[1] = "Developer"; - tags[2] = "Engineer"; - Map options = new HashMap<>(); -// options.put("skip", "" + 0); -// options.put("limit", "" + 2); -// options.put("type", "file"); -// options.put("sort", "ASC_CREATED"); -// options.put("path", "/"); -// options.put("fileType", "non-image"); // 62ac1b71759bcd0f9156d137 -// options.put("searchQuery", "format='jpg'"); -// options.put("tags", Arrays.toString(tags)); - GetFileListRequest getFileListRequest = new GetFileListRequest(); - getFileListRequest.setFileType("all"); - getFileListRequest.setTags(tags); - getFileListRequest.setLimit("4"); - ResultList resultList = ImageKit.getInstance().getFileList(getFileListRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(resultList); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(resultList.getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(resultList.getMap()); - System.out.println("\n\n"); - } - - - - private static void uploadFromURL() throws InternalServerException, BadRequestException, UnknownException, ForbiddenException, TooManyRequestsException, UnauthorizedException { - System.out.println(Color.ANSI_CYAN + ">> Uploading from URL:" + Color.ANSI_RESET); - System.out.println(">> Start uploading..."); - String imageUrl = "https://ik.imagekit.io/ikmedia/IPTC-PhotometadataRef-Std2019.1_8O33PO0Jjss.jpg?tr=md-true"; - URL url = null; - try { - url = URI.create(imageUrl).toURL(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - FileCreateRequest fileCreateRequest = new FileCreateRequest(url, "new-image-2.jpg"); - List tags = new ArrayList<>(); - tags.add("Software"); - tags.add("Developer"); - tags.add("Engineer"); - fileCreateRequest.setTags(tags); - - List responseFields = new ArrayList<>(); - responseFields.add("thumbnail"); - responseFields.add("tags"); - responseFields.add("customCoordinates"); -// responseFields.add("embeddedMetadata"); - - fileCreateRequest.setResponseFields(responseFields); - System.out.println(">> Ref: URL= " + imageUrl); - Result result = ImageKit.getInstance().upload(fileCreateRequest); - System.out.println(">> Uploading done."); - System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); - System.out.println(result); - System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getRaw()); - System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); - System.out.println(result.getResponseMetaData().getMap()); - System.out.println("\n\n"); - } - - -// private static void createCustomMetaDataFields_Text() -// throws BadRequestException, UnknownException { -// -// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); -// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Text); -// customMetaDataFieldSchemaObject.setValueRequired(true); -// customMetaDataFieldSchemaObject.setDefaultValue(20); -// customMetaDataFieldSchemaObject.setMinLength(10); -// customMetaDataFieldSchemaObject.setMaxLength(100); -// -// -// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -// customMetaDataFieldCreateRequest.setName("Name"); -// customMetaDataFieldCreateRequest.setLabel("Label"); -// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); -// -// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() -// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); -// System.out.println(">> Create CustomMetaDataFields done."); -// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -// -// -// private static void createCustomMetaDataFields_Textarea() -// throws BadRequestException, UnknownException { -// -// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); -// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Textarea); -// customMetaDataFieldSchemaObject.setValueRequired(true); -// customMetaDataFieldSchemaObject.setDefaultValue(20); -// customMetaDataFieldSchemaObject.setMinLength(10); -// customMetaDataFieldSchemaObject.setMaxLength(100); -// -// -// -// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -// customMetaDataFieldCreateRequest.setName("Name"); -// customMetaDataFieldCreateRequest.setLabel("Label"); -// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); -// -// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() -// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); -// System.out.println(">> Create CustomMetaDataFields done."); -// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -// -// -// private static void createCustomMetaDataFields_Date() -// throws BadRequestException, UnknownException { -// -// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); -// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Date); -// customMetaDataFieldSchemaObject.setValueRequired(true); -// customMetaDataFieldSchemaObject.setDefaultValue("2022-11-30T10:11:10+00:00"); -// customMetaDataFieldSchemaObject.setMinValue("2022-11-30T10:11:10+00:00"); -// customMetaDataFieldSchemaObject.setMaxValue("2022-12-30T10:11:10+00:00"); -// -// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -// customMetaDataFieldCreateRequest.setName("Name"); -// customMetaDataFieldCreateRequest.setLabel("Label"); -// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); -// -// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() -// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); -// System.out.println(">> Create CustomMetaDataFields done."); -// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -// -// private static void createCustomMetaDataFields_SingleSelect() -// throws BadRequestException, UnknownException { -// List objectList = new ArrayList<>(); -// objectList.add("small"); -// objectList.add("medium"); -// objectList.add("large"); -// objectList.add(30); -// objectList.add(40); -// objectList.add(true); -// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); -// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.SingleSelect); -// customMetaDataFieldSchemaObject.setValueRequired(true); -// customMetaDataFieldSchemaObject.setDefaultValue("small"); -// customMetaDataFieldSchemaObject.setSelectOptions(objectList); -// -// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -// customMetaDataFieldCreateRequest.setName("Name"); -// customMetaDataFieldCreateRequest.setLabel("Label"); -// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); -// -// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() -// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); -// System.out.println(">> Create CustomMetaDataFields done."); -// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -// -// -// private static void createCustomMetaDataFields_Number() -// throws BadRequestException, UnknownException { -// -// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); -// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Number); -// customMetaDataFieldSchemaObject.setValueRequired(true); -// customMetaDataFieldSchemaObject.setDefaultValue(10); -// customMetaDataFieldSchemaObject.setMinValue(1); -// customMetaDataFieldSchemaObject.setMaxValue(20); -// -// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -// customMetaDataFieldCreateRequest.setName("Name"); -// customMetaDataFieldCreateRequest.setLabel("Label"); -// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); -// -// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() -// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); -// System.out.println(">> Create CustomMetaDataFields done."); -// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -// -// private static void createCustomMetaDataFields_MultiSelect() -// throws BadRequestException, UnknownException { -// -// List objectList = new ArrayList<>(); -// objectList.add("small"); -// objectList.add("medium"); -// objectList.add("large"); -// objectList.add(30); -// objectList.add(40); -// objectList.add(true); -// -// List defaultValueObject = new ArrayList<>(); -// defaultValueObject.add("small"); -// defaultValueObject.add(30); -// defaultValueObject.add(true); -// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); -// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.MultiSelect); -// customMetaDataFieldSchemaObject.setValueRequired(true); -// customMetaDataFieldSchemaObject.setDefaultValue(defaultValueObject); -// customMetaDataFieldSchemaObject.setSelectOptions(objectList); -// -// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -// customMetaDataFieldCreateRequest.setName("Name"); -// customMetaDataFieldCreateRequest.setLabel("Label"); -// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); -// -// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() -// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); -// System.out.println(">> Create CustomMetaDataFields done."); -// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -// -// -// private static void createCustomMetaDataFields_Boolean() -// throws BadRequestException, UnknownException { -// -// CustomMetaDataFieldSchemaObject customMetaDataFieldSchemaObject = new CustomMetaDataFieldSchemaObject(); -// customMetaDataFieldSchemaObject.setType(CustomMetaDataTypeEnum.Boolean); -// customMetaDataFieldSchemaObject.setValueRequired(true); -// customMetaDataFieldSchemaObject.setDefaultValue(true); -// -// CustomMetaDataFieldCreateRequest customMetaDataFieldCreateRequest = new CustomMetaDataFieldCreateRequest(); -// customMetaDataFieldCreateRequest.setName("Name"); -// customMetaDataFieldCreateRequest.setLabel("Label"); -// customMetaDataFieldCreateRequest.setSchema(customMetaDataFieldSchemaObject); -// -// ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() -// .createCustomMetaDataFields(customMetaDataFieldCreateRequest); -// System.out.println(">> Create CustomMetaDataFields done."); -// System.out.println(Color.ANSI_GREEN + ">> Response create CustomMetaDataFields :" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -// -// private static void updateDetails(String fileId) throws ForbiddenException, TooManyRequestsException, InternalServerException, UnauthorizedException, BadRequestException, UnknownException { -// System.out.println(Color.ANSI_CYAN + ">> Updating file details:" + Color.ANSI_RESET); -// System.out.println(">> Updating file details..."); -// List tags = new ArrayList<>(); -// tags.add("Software"); -// tags.add("Developer"); -// tags.add("Engineer"); -// -// List aiTags = new ArrayList<>(); -// aiTags.add("Plant"); -// FileUpdateRequest fileUpdateRequest = new FileUpdateRequest(fileId); -// fileUpdateRequest.setTags(tags); -// fileUpdateRequest.setRemoveAITags(aiTags); -// fileUpdateRequest.setWebhookUrl("https://webhook.site/c78d617f-33bc-40d9-9e61-608999721e2e"); -// -// JsonObject optionsInnerObject = new JsonObject(); -// optionsInnerObject.addProperty("add_shadow", true); -// optionsInnerObject.addProperty("bg_color", "yellow"); -// JsonObject innerObject1 = new JsonObject(); -// innerObject1.addProperty("name", "remove-bg"); -// innerObject1.add("options", optionsInnerObject); -// JsonObject innerObject2 = new JsonObject(); -// innerObject2.addProperty("name", "google-auto-tagging"); -// innerObject2.addProperty("minConfidence", 15); -// innerObject2.addProperty("maxTags", 20); -// JsonArray jsonArray = new JsonArray(); -// jsonArray.add(innerObject1); -// jsonArray.add(innerObject2); -// -// fileUpdateRequest.setExtensions(jsonArray); -// fileUpdateRequest.setCustomCoordinates("10,10,40,40"); -// JsonObject jsonObjectCustomMetadata = new JsonObject(); -// jsonObjectCustomMetadata.addProperty("test10", 11); -// fileUpdateRequest.setCustomMetadata(jsonObjectCustomMetadata); -// Result result = ImageKit.getInstance().updateFileDetail(fileUpdateRequest); -// System.out.println(">> Updating done..."); -// System.out.println(Color.ANSI_GREEN + ">> Response:" + Color.ANSI_RESET); -// System.out.println(result); -// System.out.println(Color.ANSI_GREEN + ">> Raw Response:" + Color.ANSI_RESET); -// System.out.println(result.getResponseMetaData().getRaw()); -// System.out.println(Color.ANSI_GREEN + ">> Map Response:" + Color.ANSI_RESET); -// System.out.println(result.getResponseMetaData().getMap()); -// System.out.println("\n\n"); -// } -} diff --git a/src/main/java/io/imagekit/sampleapp/Color.java b/src/main/java/io/imagekit/sampleapp/Color.java deleted file mode 100644 index b19d555..0000000 --- a/src/main/java/io/imagekit/sampleapp/Color.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.imagekit.sampleapp; - -public class Color { - public static final String ANSI_RESET = "\u001B[0m"; - public static final String ANSI_BLACK = "\u001B[30m"; - public static final String ANSI_RED = "\u001B[31m"; - public static final String ANSI_GREEN = "\u001B[32m"; - public static final String ANSI_YELLOW = "\u001B[33m"; - public static final String ANSI_BLUE = "\u001B[34m"; - public static final String ANSI_PURPLE = "\u001B[35m"; - public static final String ANSI_CYAN = "\u001B[36m"; - public static final String ANSI_WHITE = "\u001B[37m"; - public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m"; - public static final String ANSI_RED_BACKGROUND = "\u001B[41m"; - public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m"; - public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m"; - public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m"; - public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m"; - public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m"; - public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m"; -} diff --git a/src/main/resources/config.sample.properties b/src/main/resources/config.sample.properties deleted file mode 100644 index eb626e3..0000000 --- a/src/main/resources/config.sample.properties +++ /dev/null @@ -1,6 +0,0 @@ -# Copy this sample file add rename it to "config.properties" -# Put essential values of keys [UrlEndpoint, PrivateKey, PublicKey] - -UrlEndpoint=<-YOUR-ENDPOINT-URL-HERE-> -PrivateKey=<-YOUR-PRIVATE-KEY-HERE-> -PublicKey=<-YOUR-PUBLIC-KEY-HERE-> \ No newline at end of file diff --git a/src/main/resources/sample1.jpg b/src/main/resources/sample1.jpg deleted file mode 100644 index 3a52a95dfd4f26a12b8f23ee91ff2fa7425f6859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51085 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 From 021be4548ad5a22993c61653f48672a2d2c41048 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 7 Jul 2022 16:40:33 +0530 Subject: [PATCH 095/112] removed extra dependencies and extra fields --- README.md | 3 +-- imagekit-sdk/build.gradle | 3 --- .../sdk/models/GetFileListRequest.java | 20 ------------------- .../io/imagekit/sdk/tasks/RestClient.java | 8 -------- .../java/io/imagekit/sdk/manage/FileTest.java | 2 -- 5 files changed, 1 insertion(+), 35 deletions(-) diff --git a/README.md b/README.md index 3138232..e054646 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ + # ImageKit Java SDK [![Java CI](https://github.com/imagekit-developer/imagekit-java/workflows/Java%20CI/badge.svg)](https://github.com/imagekit-developer/imagekit-java) @@ -435,8 +436,6 @@ getFileListRequest.setFileType("all"); getFileListRequest.setLimit("4"); getFileListRequest.setSkip("1"); getFileListRequest.setTags(tags); -getFileListRequest.setIncludeFolder(false); -getFileListRequest.setName("new_car.jpg"); // name match is case-sensitive. ResultList resultList = ImageKit.getInstance().getFileList(getFileListRequest); System.out.println("======FINAL RESULT======="); System.out.println(resultList); diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 1b4789e..7db22da 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -26,7 +26,4 @@ dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' testCompile "org.mockito:mockito-all:2.+" testImplementation 'com.squareup.okhttp3:mockwebserver:3.10.0' - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.4.1.3' - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.4.1' - implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.4.1.1' } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java index 6067f24..0727060 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/models/GetFileListRequest.java @@ -11,8 +11,6 @@ public class GetFileListRequest { public String limit; public String skip; public String[] tags; - public Boolean includeFolder; - public String name; public String getType() { return type; @@ -78,22 +76,6 @@ public void setTags(String[] tags) { this.tags = tags; } - public Boolean getIncludeFolder() { - return includeFolder; - } - - public void setIncludeFolder(Boolean includeFolder) { - this.includeFolder = includeFolder; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - @Override public String toString() { return "GetFileListRequest{" + @@ -105,8 +87,6 @@ public String toString() { ", limit='" + limit + '\'' + ", skip='" + skip + '\'' + ", tags=" + Arrays.toString(tags) + - ", includeFolder=" + includeFolder + - ", name='" + name + '\'' + '}'; } } diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 56b1a6d..5a15e2c 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -1,7 +1,5 @@ package io.imagekit.sdk.tasks; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; @@ -151,12 +149,6 @@ public ResultList getFileList(GetFileListRequest getFileListRequest) throws Forb if (getFileListRequest.getTags() != null) { options.put("tags", Arrays.toString(getFileListRequest.getTags())); } - if (getFileListRequest.getIncludeFolder() != null) { - options.put("includeFolder", String.valueOf(getFileListRequest.getIncludeFolder())); - } - if (getFileListRequest.getName() != null) { - options.put("name", getFileListRequest.getName()); - } for (Map.Entry entry : options.entrySet()) { queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); } diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index 85bfc7d..33ff3b3 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -324,7 +324,6 @@ public void imageKit_getFileList_returnList() getFileListRequest.setLimit("1"); getFileListRequest.setSkip("0"); getFileListRequest.setTags(tags); - getFileListRequest.setIncludeFolder(false); SUT.getFileList(getFileListRequest); RecordedRequest request = server.takeRequest(); @@ -365,7 +364,6 @@ public void imageKit_getFileList_400_expected() getFileListRequest.setLimit("1"); getFileListRequest.setSkip("0"); getFileListRequest.setTags(tags); - getFileListRequest.setIncludeFolder(true); SUT.getFileList(getFileListRequest); server.takeRequest(); From ad1c3c6d3666f8b0520f7fbf3d7f50abf7f67d07 Mon Sep 17 00:00:00 2001 From: Khush Date: Thu, 7 Jul 2022 16:57:51 +0530 Subject: [PATCH 096/112] fixed --- .../src/test/java/io/imagekit/sdk/GetUrlTest.java | 2 +- .../src/test/java/io/imagekit/sdk/ImageKitTest.java | 8 ++++++++ .../src/test/java/io/imagekit/sdk/manage/FileTest.java | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java index 502c3de..7e14fc9 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java @@ -444,7 +444,7 @@ public void getUrl_with_signature() { String url = SUT.getUrl(options); - assertSignedUrl("https://test-domain.com/test-endpoint/tr:w-100/test-signed-url.png", url); + assertSignedUrl("https://ik.imagekit.io/zv3rkhsym/tr:w-100/test-signed-url.png", url); } @Test diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 1056a55..9158a6a 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -1,6 +1,8 @@ package io.imagekit.sdk; import io.imagekit.sdk.config.Configuration; +import io.imagekit.sdk.utils.Utils; +import org.junit.Before; import org.junit.Test; import java.util.Map; @@ -11,6 +13,12 @@ public class ImageKitTest { private ImageKit SUT; + @Before + public void setUp() throws Exception { + SUT = ImageKit.getInstance(); + SUT.setConfig(Utils.getSystemConfig(ImageKitTest.class)); + } + @Test public void imageKit_configurationTest() { Configuration config = new Configuration(); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index 33ff3b3..4d6355b 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -331,10 +331,10 @@ public void imageKit_getFileList_returnList() assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals( - "GET /v1/files?path=/&includeFolder=false&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", + "GET /v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat( - "v1/files?path=/&includeFolder=false&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), + "v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), request.getRequestUrl().toString()); } From 9867433fc7c12ca8c5bd7c1af4ca11ebbc9d8bf4 Mon Sep 17 00:00:00 2001 From: amanforindia Date: Thu, 7 Jul 2022 17:40:39 +0530 Subject: [PATCH 097/112] Test fixes --- imagekit-sdk/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/imagekit-sdk/build.gradle b/imagekit-sdk/build.gradle index 7db22da..1a6bc6e 100644 --- a/imagekit-sdk/build.gradle +++ b/imagekit-sdk/build.gradle @@ -24,6 +24,7 @@ dependencies { compile group: 'com.squareup.okio', name: 'okio', version: '1.14.0' implementation 'com.squareup.retrofit2:retrofit:2.4.0' testCompile group: 'junit', name: 'junit', version: '4.12' + testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2") testCompile "org.mockito:mockito-all:2.+" testImplementation 'com.squareup.okhttp3:mockwebserver:3.10.0' } From a06b60367aa9be0991df793b57f51bf813e18b07 Mon Sep 17 00:00:00 2001 From: amanforindia Date: Thu, 7 Jul 2022 17:48:50 +0530 Subject: [PATCH 098/112] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e054646..a21160a 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ UrlEndpoint=<-YOUR-ENDPOINT-URL-HERE-> PrivateKey=<-YOUR-PRIVATE-KEY-HERE-> PublicKey=<-YOUR-PUBLIC-KEY-HERE-> ``` -Step 2. Then you need to initialize ImageKit with that configuration. +Step 2. Then you need to initialize ImageKit with that configuration. ```java import io.imagekit.sdk.ImageKit; From 9815eb9e1249b64b4fd5dfe0e1970286559bd390 Mon Sep 17 00:00:00 2001 From: Manu Chaudhary Date: Fri, 8 Jul 2022 11:06:27 +0530 Subject: [PATCH 099/112] readme update --- README.md | 109 ++++++++++-------- .../imagekit/sdk/constants/Transformer.java | 20 +++- .../test/java/io/imagekit/sdk/GetUrlTest.java | 11 +- 3 files changed, 87 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index a21160a..57f16ad 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,9 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Twitter Follow](https://img.shields.io/twitter/follow/imagekitio?label=Follow&style=social)](https://twitter.com/ImagekitIo) -Java SDK for [ImageKit.io](https://imagekit.io/) that implements the new APIs and interface for performing different file -operations. +Java SDK for [ImageKit.io](https://imagekit.io/) that implements the new APIs and interface for performing different file operations. -ImageKit is a complete image optimization and transformation solution that comes with and -[image CDN](https://imagekit.io/features/imagekit-infrastructure) and media storage. It can be integrated with your -existing infrastructure - storage like AWS s3, web servers, your CDN, and custom domain names, allowing you to deliver -optimize images in minutes with minimal code changes +ImageKit is complete media storage, optimization, and transformation solution that comes with an [image and video CDN](https://imagekit.io). It can be integrated with your existing infrastructure - storage like AWS S3, web servers, your CDN, and custom domain names, allowing you to deliver optimized images in minutes with minimal code changes. Table of contents - * [Installation](#installation) @@ -303,49 +299,64 @@ transformation code from ImageKit docs as the name when using in the ```url``` f | Supported Transformation Name | Translates to parameter | -| ----------------------------- | ----------------------- | -| height | h | -| width | w | -| aspect_ratio | ar | -| quality | q | -| crop | c | -| crop_mode | cm | -| x | x | -| y | y | -| focus | fo | -| format | f | -| radius | r | -| background | bg | -| border | bo | -| rotation | rt | -| blur | bl | -| named | n | -| overlay_image | oi | -| overlay_x | ox | -| overlay_y | oy | -| overlay_focus | ofo | -| overlay_height | oh | -| overlay_width | ow | -| overlay_text | ot | -| overlay_text_font_size | ots | -| overlay_text_font_family | otf | -| overlay_text_color | otc | -| overlay_alpha | oa | -| overlay_text_typography | ott | -| overlay_background | obg | -| overlay_image_trim | oit | -| progressive | pr | -| lossless | lo | -| trim | t | -| metadata | md | -| color_profile | cp | -| default_image | di | -| dpr | dpr | -| effect_sharpen | e-sharpen | -| effect_usm | e-usm | -| effect_contrast | e-contrast | -| effect_gray | e-grayscale | -| original | orig | +|-------------------------------|-------------------------| +| height | h | +| width | w | +| aspectRatio | ar | +| quality | q | +| crop | c | +| cropMode | cm | +| x | x | +| y | y | +| focus | fo | +| format | f | +| radius | r | +| background | bg | +| border | b | +| rotation | rt | +| blur | bl | +| named | n | +| overlayX | ox | +| overlayY | oy | +| overlayFocus | ofo | +| overlayHeight | oh | +| overlayWidth | ow | +| overlayImage | oi | +| overlayImageTrim | oit | +| overlayImageAspectRatio | oiar | +| overlayImageBackground | oibg | +| overlayImageBorder | oib | +| overlayImageDPR | oidpr | +| overlayImageQuality | oiq | +| overlayImageCropping | oic | +| overlayImageFocus | oifo | +| overlayText | ot | +| overlayTextFontSize | ots | +| overlayTextFontFamily | otf | +| overlayTextColor | otc | +| overlayTextTransparency | oa | +| overlayAlpha | oa | +| overlayTextTypography | ott | +| overlayBackground | obg | +| overlayTextEncoded | ote | +| overlayTextWidth | otw | +| overlayTextBackground | otbg | +| overlayTextPadding | otp | +| overlayTextInnerAlignment | otia | +| overlayRadius | or | +| progressive | pr | +| lossless | lo | +| trim | t | +| metadata | md | +| colorProfile | cp | +| defaultImage | di | +| dpr | dpr | +| effectSharpen | e-sharpen | +| effectUSM | e-usm | +| effectContrast | e-contrast | +| effectGray | e-grayscale | +| original | orig | +| raw | `replaced by the parameter value` | ## File Upload diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java index 9e886e6..6e1ebc5 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/constants/Transformer.java @@ -26,24 +26,38 @@ public static synchronized Transformer getInstance() { transformer.trans.put("format", "f"); transformer.trans.put("radius", "r"); transformer.trans.put("background", "bg"); - transformer.trans.put("border", "bo"); + transformer.trans.put("border", "b"); transformer.trans.put("rotation", "rt"); transformer.trans.put("blur", "bl"); transformer.trans.put("named", "n"); - transformer.trans.put("overlayImage", "oi"); transformer.trans.put("overlayX", "ox"); transformer.trans.put("overlayY", "oy"); transformer.trans.put("overlayFocus", "ofo"); transformer.trans.put("overlayHeight", "oh"); transformer.trans.put("overlayWidth", "ow"); + transformer.trans.put("overlayImage", "oi"); + transformer.trans.put("overlayImageTrim", "oit"); + transformer.trans.put("overlayImageAspectRatio", "oiar"); + transformer.trans.put("overlayImageBackground", "oibg"); + transformer.trans.put("overlayImageBorder", "oib"); + transformer.trans.put("overlayImageDPR", "oidpr"); + transformer.trans.put("overlayImageQuality", "oiq"); + transformer.trans.put("overlayImageCropping", "oic"); + transformer.trans.put("overlayImageFocus", "oifo"); transformer.trans.put("overlayText", "ot"); transformer.trans.put("overlayTextFontSize", "ots"); transformer.trans.put("overlayTextFontFamily", "otf"); transformer.trans.put("overlayTextColor", "otc"); + transformer.trans.put("overlayTextTransparency", "oa"); transformer.trans.put("overlayAlpha", "oa"); transformer.trans.put("overlayTextTypography", "ott"); transformer.trans.put("overlayBackground", "obg"); - transformer.trans.put("overlayImageTrim", "oit"); + transformer.trans.put("overlayTextEncoded", "ote"); + transformer.trans.put("overlayTextWidth", "otw"); + transformer.trans.put("overlayTextBackground", "otbg"); + transformer.trans.put("overlayTextPadding", "otp"); + transformer.trans.put("overlayTextInnerAlignment", "otia"); + transformer.trans.put("overlayRadius", "or"); transformer.trans.put("progressive", "pr"); transformer.trans.put("lossless", "lo"); transformer.trans.put("trim", "t"); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java index 7e14fc9..3e8cd85 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java @@ -180,6 +180,15 @@ public void getUrl_with_transformation_parameters() { scale.put("effectGray", ""); scale.put("original", String.valueOf(true)); scale.put("raw", "w-200,h-200"); + scale.put("overlayImage", "oi"); + scale.put("overlayImageTrim", "oit"); + scale.put("overlayImageAspectRatio", "oiar"); + scale.put("overlayImageBackground", "oibg"); + scale.put("overlayImageBorder", "oib"); + scale.put("overlayImageDPR", "oidpr"); + scale.put("overlayImageQuality", "oiq"); + scale.put("overlayImageCropping", "oic"); + scale.put("overlayImageFocus", "oifo"); transformation.add(scale); @@ -190,7 +199,7 @@ public void getUrl_with_transformation_parameters() { String url = SUT.getUrl(options); assertThat( - "https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,bo-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", + "https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,b-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", is(url)); } From 60e6b96ac522a3b005b4b1756e7c422cb381779c Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 8 Jul 2022 11:06:59 +0530 Subject: [PATCH 100/112] updated PR for change og --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a21160a..b3a25f3 100644 --- a/README.md +++ b/README.md @@ -124,27 +124,27 @@ This document presents a list of changes that break existing functionality of pr Changes from 1.0.3 -> 2.0.0 are listed below -1. Result object raw and getMap() properties: +1. Result `raw` object and `getMap()` properties: **What changed** -- raw and getMap() has been deprecated. +- `raw` and `getMap()` has been deprecated. **Who is affected?** -- This affects any development that uses the raw or getMap() from response object of APIs that is Result object. +- This affects any development that uses the `raw` or `getMap()` from the response object of APIs and Result object. **How should I update my code?** -- If you still need to use raw and getMap(), write it with using it with result's internal property such as result.getResponseMetaData().getRaw(). +- If you still need to use `raw` and `getMap()`, do this `result.getResponseMetaData().getRaw()`. -2. Result object message and isSuccessful boolean properties: +2. Result object `message` and `isSuccessful` boolean properties: **What changed** -- message and isSuccessful has been replaced with custom exceptions according to response code. +- `message` and `isSuccessful` have been replaced with custom exceptions according to response code. **Who is affected?** -- This affects any development that uses the message or isSuccessful from response object of APIs that is Result object. +- This affects any development that uses the `message` or `isSuccessful` from response object of APIs that is Result object. **How should I update my code?** -- If you still need to use message it will be there in custom exception and could be raised isSuccessful properties in your own code from status code which is coming in the response or custom exception. +- If you still need to use `message` it will be there in the custom exception and could be raised `isSuccessful` properties in your own code from status code with `httpStatusCode` that is coming in the responseMetaData with `getResponseMetaData()` of response object or custom exception. ## URL generation From e19d455a004ed27ed09e61c62e63543f2db1cfd2 Mon Sep 17 00:00:00 2001 From: Manu Chaudhary Date: Fri, 8 Jul 2022 11:11:45 +0530 Subject: [PATCH 101/112] readme update --- README.md | 74 ++++++++++++++++++++++--------------------------------- 1 file changed, 30 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 57f16ad..61a0d53 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - # ImageKit Java SDK [![Java CI](https://github.com/imagekit-developer/imagekit-java/workflows/Java%20CI/badge.svg)](https://github.com/imagekit-developer/imagekit-java) @@ -33,13 +32,13 @@ Table of contents - Step 1. Add the JitPack repository to your build file ``` allprojects { - repositories { - ... - maven { url 'https://jitpack.io' } - } + repositories { + ... + maven { url 'https://jitpack.io' } + } } ``` -Step 2. Add the dependency on project's `build.gradle`: +Step 2. Add the dependency on the project's `build.gradle`: ``` dependencies { implementation 'com.github.imagekit-developer:imagekit-java:2.0.0' @@ -55,7 +54,7 @@ Step 1. Add the JitPack repository to your build file ``` -Step 2. Add the dependency in POM file: +Step 2. Add the dependency in the POM file: ``` com.github.imagekit-developer @@ -66,7 +65,7 @@ Step 2. Add the dependency in POM file: ## Initialization -Step 1. Create a `config.properties` file inside `src/main/resources` of your project. And put essential values of keys [UrlEndpoint, PrivateKey, PublicKey], no need to use quote(`'` or `"`) in values. +**Step 1**. Create a `config.properties` file inside `src/main/resources` of your project. And put essential values of keys [UrlEndpoint, PrivateKey, PublicKey], no need to use quote(`'` or `"`) in values. ```editorconfig # Put essential values of keys [UrlEndpoint, PrivateKey, PublicKey] @@ -74,7 +73,7 @@ UrlEndpoint=<-YOUR-ENDPOINT-URL-HERE-> PrivateKey=<-YOUR-PRIVATE-KEY-HERE-> PublicKey=<-YOUR-PUBLIC-KEY-HERE-> ``` -Step 2. Then you need to initialize ImageKit with that configuration. +**Step 2**. Then you need to initialize ImageKit with that configuration. ```java import io.imagekit.sdk.ImageKit; @@ -110,47 +109,44 @@ You can use this Java SDK for 3 different kinds of methods: * URL generation * file upload * file management -* + The usage of the SDK has been explained below. ## Change log -This document presents a list of changes that break existing functionality of previous versions. We try our best to minimize these disruptions, but sometimes they are unavoidable and they will be in major versions. +This document presents a list of changes that break the existing functionality of previous versions. We try our best to minimize these disruptions, but sometimes they are unavoidable and will be in major versions. ### Breaking History: Changes from 1.0.3 -> 2.0.0 are listed below -1. Result object raw and getMap() properties: +1. Result raw object and getMap() properties: **What changed** - raw and getMap() has been deprecated. **Who is affected?** -- This affects any development that uses the raw or getMap() from response object of APIs that is Result object. +- This affects any development that uses the raw or getMap() from the response object of APIs and Result object. **How should I update my code?** -- If you still need to use raw and getMap(), write it with using it with result's internal property such as result.getResponseMetaData().getRaw(). +- If you still need to use raw and getMap(), do this `result.getResponseMetaData().getRaw()`. 2. Result object message and isSuccessful boolean properties: **What changed** -- message and isSuccessful has been replaced with custom exceptions according to response code. +- message and isSuccessful have been replaced with custom exceptions according to response code. **Who is affected?** - This affects any development that uses the message or isSuccessful from response object of APIs that is Result object. **How should I update my code?** -- If you still need to use message it will be there in custom exception and could be raised isSuccessful properties in your own code from status code which is coming in the response or custom exception. +- If you still need to use message it will be there in the custom exception and could be raised isSuccessful properties in your own code from status code that is coming in the response or custom exception. ## URL generation **1. Using image path and URL-endpoint** -This method allows you to create a URL using the path where the image exists and the URL-endpoint you want to use to access the image. You can refer to the documentation -[here](https://docs.imagekit.io/integration/url-endpoints) to read more about URL endpoints -in ImageKit and the section about [image origins](https://docs.imagekit.io/integration/configure-origin) to understand -about paths with different kinds of origins. +This method allows you to create an URL to access a file using the relative file path and the ImageKit URL endpoint (`urlEndpoint`). The file can be an image, video, or any other static file supported by ImageKit. ```java Map queryParam=new HashMap<>(); @@ -176,9 +172,7 @@ https://ik.imagekit.io/your_imagekit_id/tr:w-400,h-600/default-image.jpg?v=123 ``` **2. Using full image URL** -This method allows you to add transformation parameters to an existing complete URL that is already mapped to ImageKit -using the `src` parameter. This method should be used if you have the complete image URL mapped to ImageKit stored in your -database. +This method allows you to add transformation parameters to an absolute URL. For example, if you have configured a custom CNAME and have absolute asset URLs in your database or CMS, you will often need this. ```java List> transformation=new ArrayList>(); @@ -205,13 +199,13 @@ The ```.getUrl()``` method accepts the following parameters | Option | Description | | :---------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| urlEndpoint | Optional. `(Type: String)` The base URL to be appended before the path of the image. If not specified, the URL Endpoint specified at the time of SDK initialization is used. For example, https://ik.imagekit.io/your_imagekit_id/ | +| urlEndpoint | Optional. `(Type: String)` The base URL to be appended before the path of the image. If not specified, the URL Endpoint specified during SDK initialization is used. For example, https://ik.imagekit.io/your_imagekit_id/ | | path | Conditional. `(Type: String)` This is the path at which the image exists. For example, `/path/to/image.jpg`. Either the `path` or `src` parameter needs to be specified for URL generation. | | src | Conditional. `(Type: String)` This is the complete URL of an image already mapped to ImageKit. For example, `https://ik.imagekit.io/your_imagekit_id/endpoint/path/to/image.jpg`. Either the `path` or `src` parameter needs to be specified for URL generation. | | transformation | Optional. `(Type: List>)` An array of objects specifying the transformation to be applied in the URL. The transformation name and the value should be specified as a key-value pair in the object. Different steps of a [chained transformation](https://docs.imagekit.io/features/image-transformations/chained-transformations) can be specified as different objects of the array. The complete list of supported transformations in the SDK and some examples of using them are given later. If you use a transformation name that is not specified in the SDK, it gets applied as it is in the URL. | -| transformationPosition | Optional. `(Type: String)` Default value is `path` that places the transformation string as a path parameter in the URL. It can also be specified as `query` which adds the transformation string as the query parameter `tr` in the URL. If you use the `src` parameter to create the URL, then the transformation string is always added as a query parameter. | -| queryParameters | Optional. `(Type: Map)` These are the other query parameters that you want to add to the final URL. These can be any query parameters and not necessarily related to ImageKit. Especially useful if you want to add some versioning parameter to your URLs. | -| signed | Optional. `(Type: Boolean)` Default is `false`. If set to `true`, the SDK generates a signed image URL adding the image signature to the image URL. This can only be used if you are creating the URL with the `url_endpoint` and `path` parameters, and not with the `src` parameter. | +| transformationPosition | Optional. `(Type: String)` Default value is `path` that places the transformation string as a path parameter in the URL. It can also be specified as `query`, which adds the transformation string as the query parameter `tr` in the URL. If you use the `src` parameter to create the URL, then the transformation string is always added as a query parameter. | +| queryParameters | Optional. `(Type: Map)` These are the other query parameters that you want to add to the final URL. These can be any query parameters and not necessarily related to ImageKit. Especially useful if you want to add some versioning parameters to your URLs. | +| signed | Optional. `(Type: Boolean)` Default is `false`. If set to `true`, the SDK generates a signed image URL adding the image signature to the image URL. This can only be used if you create the URL with the `url_endpoint` and `path` parameters and not with the `src` parameter. | | expireSeconds | Optional. `(Type: Integer)` Meant to be used along with the `signed` parameter to specify the time in seconds from now when the URL should expire. If specified, the URL contains the expiry timestamp in the URL, and the image signature is modified accordingly. | @@ -241,7 +235,7 @@ Sample Result URL - https://ik.imagekit.io/your_imagekit_id/default-image.jpg?tr=h-300&w-400:rt-90 ``` -**2. Sharpening and contrast transforms and a progressive JPG image** +**2. Sharpening and contrast transform and a progressive JPG image** There are some transforms like [Sharpening](https://docs.imagekit.io/features/image-transformations/image-enhancement-and-color-manipulation) that can be added to the URL with or without any other value. To use such transforms without specifying a value, specify @@ -292,11 +286,9 @@ https://ik.imagekit.io/your_imagekit_id/tr:h-600,w-400/default-image.jpg?ik-t=15 **List of transformations** -The complete list of transformations supported and their usage in ImageKit can be found [here](https://docs.imagekit.io/features/image-transformations/resize-crop-and-other-transformations). -The SDK gives a name to each transformation parameter, making the code simpler, making the code more straightforward and readable. -If a transformation is supported in ImageKit, but a name for it cannot be found in the table below, then use the -transformation code from ImageKit docs as the name when using in the ```url``` function. +See the complete list of [image](https://docs.imagekit.io/features/image-transformations) and [video](https://docs.imagekit.io/features/video-transformation) transformations supported in ImageKit. The SDK gives a name to each transformation parameter e.g. `height` for `h` and `width` for `w` parameter. It makes your code more readable. If the property does not match any of the following supported options, it is added as it is. +If you want to generate transformations in your application and add them to the URL as it is, use the `raw` parameter. | Supported Transformation Name | Translates to parameter | |-------------------------------|-------------------------| @@ -362,12 +354,9 @@ transformation code from ImageKit docs as the name when using in the ```url``` f ## File Upload The SDK provides a simple interface using the `.upload()` method to upload files to the ImageKit Media library. It -accepts an object of `FileCreateRequest` class that contains all the parameters supported by the [ImageKit Upload API](https://docs.imagekit.io/api-reference/upload-file-api/server-side-file-upload). +accepts an object of the `FileCreateRequest` class that contains all the parameters supported by the [ImageKit Upload API](https://docs.imagekit.io/api-reference/upload-file-api/server-side-file-upload). -The constructor `FileCreateRequest` class requires `file` as (URL/Base64/Byte Array) and `file_name` if `file` is byte array then it's require another parameter named `mediaType` to upload a file. The method returns object of `Result` class. It contains method `isSuccessful()` (return boolean), `getMessage()` for error message and other file parameter responsed by server. -ImageKit upload API using the same parameter name as specified in the upload API documentation. For example, to -specify tags for a file at the time of upload use the tags parameter as specified in the -[documentation here](https://docs.imagekit.io/api-reference/upload-file-api/server-side-file-upload) +The constructor `FileCreateRequest` class requires `file` as (URL/Base64/Byte Array) and `file_name`. If `file` is byte array then it's require another parameter named `mediaType` to upload a file. The method returns object of `Result` class. It contains method `isSuccessful()` (return boolean), `getMessage()` for error message and other file parameter responsed by server. Sample usage @@ -417,21 +406,18 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -If the upload is successful, `getMessage()` will be `None`, and the result will be an object of `Result` class that contains the same all the parameters received from ImageKit's servers and `isSuccessful()` will return true. +If the upload is successful, `getMessage()` will be `None`, and the result will be an object of `Result` class that contains the same all the parameters received from ImageKit's servers, and `isSuccessful()` will return true. -If the upload fails, `getMessage()` will contain the same error message received from ImageKit's servers and `isSuccessful()` will return false. +If the upload fails, `getMessage()` will contain the same error message received from ImageKit's servers, and `isSuccessful()` will return false. ## File Management -The SDK provides a simple interface for all the [media APIs mentioned here](https://docs.imagekit.io/api-reference/media-api) -to manage your files. This also returns `error` and `result`, the error will be `None` if API succeeds. +The SDK provides a simple interface for all the [media APIs mentioned here](https://docs.imagekit.io/api-reference/media-api) to manage your files. This also returns `error` and `result`, the error will be `None` if API succeeds. **1. List & Search Files** -Accepts an object specifying the parameters to be used to list and search files. All parameters specified -in the [documentation here](https://docs.imagekit.io/api-reference/media-api/list-and-search-files) can be passed as-is with the -correct values to get the results. +Accepts an object specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/list-and-search-files) can be passed as-is with the correct values to get the results. ```java String[] tags = new String[3]; From 4cbb1bd2404fa1c74ef75e11ef4827fee68bd256 Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 8 Jul 2022 12:49:33 +0530 Subject: [PATCH 102/112] resolved comments --- README.md | 6 +++--- imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java | 4 ++-- .../src/test/java/io/imagekit/sdk/ImageKitTest.java | 2 +- imagekit-sdk/src/test/resources/config.properties | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 78b70c6..7bae092 100644 --- a/README.md +++ b/README.md @@ -356,7 +356,7 @@ If you want to generate transformations in your application and add them to the The SDK provides a simple interface using the `.upload()` method to upload files to the ImageKit Media library. It accepts an object of the `FileCreateRequest` class that contains all the parameters supported by the [ImageKit Upload API](https://docs.imagekit.io/api-reference/upload-file-api/server-side-file-upload). -The constructor `FileCreateRequest` class requires `file` as (URL/Base64/Byte Array) and `file_name`. If `file` is byte array then it's require another parameter named `mediaType` to upload a file. The method returns object of `Result` class. It contains method `isSuccessful()` (return boolean), `getMessage()` for error message and other file parameter responsed by server. +The constructor `FileCreateRequest` class requires `file` as (URL/Base64/Byte Array) and `file_name`. The method returns object of `Result` in case of successful, or it will throw custom exception in case of failure. Sample usage @@ -406,9 +406,9 @@ System.out.println("Map Response:"); System.out.println(result.getResponseMetaData().getMap()); ``` -If the upload is successful, `getMessage()` will be `None`, and the result will be an object of `Result` class that contains the same all the parameters received from ImageKit's servers, and `isSuccessful()` will return true. +If the upload is successful, result will be there as an object of `Result` class that contains the same all the parameters received from ImageKit's servers. -If the upload fails, `getMessage()` will contain the same error message received from ImageKit's servers, and `isSuccessful()` will return false. +If the upload fails, custom exception getting thrown and by doinf`getMessage()` will contain the same error message received from ImageKit's servers. ## File Management diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java index 3e8cd85..d240b64 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/GetUrlTest.java @@ -199,7 +199,7 @@ public void getUrl_with_transformation_parameters() { String url = SUT.getUrl(options); assertThat( - "https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,fo-left,bl-10,ar-4-3,oit-false,e-usm-,oa-,obg-00AAFF55,ots-18,t-5,oh-20,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,b-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,q-40,ott-b,bg-A94D34,w-400,pr-true,e-sharpen,oi-folder@@file.jpg,c-force,otf-Open%20Sans/default-image.jpg", + "https://ik.imagekit.io/your_imagekit_id/tr:cm-extract,ofo-top,n-any_name,md-true,ow-20,e-contrast-1,oiar-oiar,fo-left,bl-10,ar-4-3,oit-oit,e-usm-,oidpr-oidpr,oa-,obg-00AAFF55,ots-18,t-5,oh-20,oic-oic,cp-true,r-20,ox-20,ot-Image%20Text,oy-10,otc-00FFFF,di-folder@@file.jpg,h-600,b-5-A94D34,orig-true,rt-90,dpr-3,f-png,raw-w-200,h-200,lo-true,e-grayscale-,oibg-oibg,q-40,ott-b,oib-oib,oiq-oiq,bg-A94D34,w-400,pr-true,e-sharpen,oi-oi,oifo-oifo,c-force,otf-Open%20Sans/default-image.jpg", is(url)); } @@ -453,7 +453,7 @@ public void getUrl_with_signature() { String url = SUT.getUrl(options); - assertSignedUrl("https://ik.imagekit.io/zv3rkhsym/tr:w-100/test-signed-url.png", url); + assertSignedUrl("https://ik.imagekit.io/imagekit_id/tr:w-100/test-signed-url.png", url); } @Test diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java index 9158a6a..ba2123e 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/ImageKitTest.java @@ -48,7 +48,7 @@ public void withTokenAndExpire_getAuthenticationParameters_successExpected() { assertNotNull(auth); assertEquals("your_token", auth.get("token")); assertEquals("1582269249", auth.get("expire")); - assertEquals("98598e12a8eec9fedc883df4ae598618aaf24d87", auth.get("signature")); + assertEquals("e71bcd6031016b060d349d212e23e85c791decdd", auth.get("signature")); } @Test diff --git a/imagekit-sdk/src/test/resources/config.properties b/imagekit-sdk/src/test/resources/config.properties index 9328085..a7cbc4a 100644 --- a/imagekit-sdk/src/test/resources/config.properties +++ b/imagekit-sdk/src/test/resources/config.properties @@ -1,6 +1,6 @@ # Copy this sample file add rename it to "config.properties" # Put essential values of keys [UrlEndpoint, PrivateKey, PublicKey] -UrlEndpoint=https://ik.imagekit.io/zv3rkhsym -PrivateKey=private_kwTU4AR9Ei5hBoTIuxCW63Dg2jM= -PublicKey=public_SSvmi6RknpNXj9x1cQnra1sYpJg= \ No newline at end of file +UrlEndpoint=https://ik.imagekit.io/imagekit_id +PrivateKey=private_key_test +PublicKey=public_key_test \ No newline at end of file From e03bd2a67c0dbbcbf0eac7e55ec3924f4b04772e Mon Sep 17 00:00:00 2001 From: Manu Chaudhary Date: Fri, 8 Jul 2022 13:22:15 +0530 Subject: [PATCH 103/112] readme update --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7bae092..3439c2c 100644 --- a/README.md +++ b/README.md @@ -65,14 +65,17 @@ Step 2. Add the dependency in the POM file: ## Initialization -**Step 1**. Create a `config.properties` file inside `src/main/resources` of your project. And put essential values of keys [UrlEndpoint, PrivateKey, PublicKey], no need to use quote(`'` or `"`) in values. +**Step 1**. Create a `config.properties` file inside `src/main/resources` of your project. And put essential values of keys [UrlEndpoint, PrivateKey, PublicKey], no need to use quote(`'` or `"`) in values. + + You can get the value of [URL-endpoint](https://imagekit.io/dashboard#url-endpoints) from your ImageKit dashboard. API keys can be obtained from the [developer](https://imagekit.io/dashboard/developer/api-keys) section in your ImageKit dashboard. ```editorconfig # Put essential values of keys [UrlEndpoint, PrivateKey, PublicKey] -UrlEndpoint=<-YOUR-ENDPOINT-URL-HERE-> -PrivateKey=<-YOUR-PRIVATE-KEY-HERE-> -PublicKey=<-YOUR-PUBLIC-KEY-HERE-> +UrlEndpoint=your_public_api_key +PrivateKey=your_private_api_key +PublicKey=https://ik.imagekit.io/imagekit_id/ ``` + **Step 2**. Then you need to initialize ImageKit with that configuration. ```java From 6717e4902dd92caac40db6e9335350245e7094e2 Mon Sep 17 00:00:00 2001 From: amanforindia Date: Fri, 8 Jul 2022 13:48:49 +0530 Subject: [PATCH 104/112] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3439c2c..cf13b82 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ Changes from 1.0.3 -> 2.0.0 are listed below - This affects any development that uses the `message` or `isSuccessful` from response object of APIs that is Result object. **How should I update my code?** -- If you still need to use `message` it will be there in the custom exception and could be raised `isSuccessful` properties in your own code from status code with `httpStatusCode` that is coming in the responseMetaData with `getResponseMetaData()` of response object or custom exception. +- If you still need to use `message` it will be there in the custom exceptions that could be raised when calling the various API methods. `isSuccessful` can be derived to be `true` if the API method doesn't throw any exception. ## URL generation @@ -411,7 +411,7 @@ System.out.println(result.getResponseMetaData().getMap()); If the upload is successful, result will be there as an object of `Result` class that contains the same all the parameters received from ImageKit's servers. -If the upload fails, custom exception getting thrown and by doinf`getMessage()` will contain the same error message received from ImageKit's servers. +If the upload fails, custom exception is thrown and `getMessage()` can be called to get the error message received from ImageKit's servers. ## File Management From 872cc1090ef1fb46de175b0f671122a895890059 Mon Sep 17 00:00:00 2001 From: amanforindia Date: Fri, 8 Jul 2022 13:50:44 +0530 Subject: [PATCH 105/112] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf13b82..3b716ea 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ Changes from 1.0.3 -> 2.0.0 are listed below - This affects any development that uses the `message` or `isSuccessful` from response object of APIs that is Result object. **How should I update my code?** -- If you still need to use `message` it will be there in the custom exceptions that could be raised when calling the various API methods. `isSuccessful` can be derived to be `true` if the API method doesn't throw any exception. +- If you still need to use `message` it will be there in the custom exceptions that could be raised when calling the various API methods. `isSuccessful` can be understood to be `true` if the API method doesn't throw any exception. ## URL generation From e8883c98cdc9140d83e89b77a6fd8876ec646c8b Mon Sep 17 00:00:00 2001 From: Khush Date: Fri, 8 Jul 2022 14:30:17 +0530 Subject: [PATCH 106/112] added fixes for tags --- .../src/main/java/io/imagekit/sdk/tasks/RestClient.java | 2 +- .../src/test/java/io/imagekit/sdk/manage/FileTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java index 5a15e2c..5e6fbf3 100644 --- a/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java +++ b/imagekit-sdk/src/main/java/io/imagekit/sdk/tasks/RestClient.java @@ -147,7 +147,7 @@ public ResultList getFileList(GetFileListRequest getFileListRequest) throws Forb options.put("skip", getFileListRequest.getSkip()); } if (getFileListRequest.getTags() != null) { - options.put("tags", Arrays.toString(getFileListRequest.getTags())); + options.put("tags", String.join(",", getFileListRequest.getTags())); } for (Map.Entry entry : options.entrySet()) { queryMaker.put(String.format("%s=%s", entry.getKey(), entry.getValue())); diff --git a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java index 4d6355b..9e2c7fb 100644 --- a/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java +++ b/imagekit-sdk/src/test/java/io/imagekit/sdk/manage/FileTest.java @@ -331,10 +331,10 @@ public void imageKit_getFileList_returnList() assertEquals("", utf8RequestBody); assertEquals("application/json", request.getHeader("Content-Type")); assertEquals( - "GET /v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer] HTTP/1.1", + "GET /v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=Software,Developer,Engineer HTTP/1.1", request.getRequestLine()); assertEquals(RestClient.API_BASE_URL.concat( - "v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=[Software,%20Developer,%20Engineer]"), + "v1/files?path=/&searchQuery=createdAt%20%3E=%20%272d%27%20OR%20size%20%3C%20%272mb%27%20OR%20format=%27png%27&limit=1&skip=0&sort=ASC_CREATED&type=file&fileType=all&tags=Software,Developer,Engineer"), request.getRequestUrl().toString()); } From 3621addb67eeed611f046e8c1eb1fee9b066723f Mon Sep 17 00:00:00 2001 From: Vishwa Ghodasara <67286297+VishwaGhodasara@users.noreply.github.com> Date: Fri, 8 Jul 2022 15:23:01 +0530 Subject: [PATCH 107/112] Update README.md --- README.md | 87 +++++++++++++++++-------------------------------------- 1 file changed, 26 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 3b716ea..a1d054b 100644 --- a/README.md +++ b/README.md @@ -462,9 +462,7 @@ System.out.println(result.getResponseMetaData().getMap()); **3. Get File Versions** -It Gets the File versions as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-versions). -The argument to the `getFileVersions()` method accepts the fileId for which file has to be get or Fetched the versions. +Accepts the file ID and fetches the details as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-versions). ```java String fileId = "62a04834c10d49825c6de9e8"; @@ -479,9 +477,7 @@ System.out.println(resultFileVersions.getResponseMetaData().getMap()); **4. Get File Version details** -It Gets the File version details as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-version-details). -The argument to the `getFileVersionDetails()` method accepts the fileId and versionId for which file has to be get or Fetched with particular version. +Accepts the file ID and vesrion ID and fetches the details as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-version-details). ```java String fileId = "62a04834c10d49825c6de9e8"; @@ -497,8 +493,7 @@ System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); **5. Update File Details** -It updates the file properties as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/update-file-details). -The argument to the `updateDetail()` method is the object of `FileUpdateRequest` class, and the constructor will take the file ID and then set the parameters to be updated. +Accepts an object specifying the parameters to be used to update file details. All parameters specified in the [documentation here] (https://docs.imagekit.io/api-reference/media-api/update-file-details) can be passed as-is with the correct values to get the results. ```java List tags = new ArrayList<>(); @@ -543,8 +538,7 @@ System.out.println(result.getResponseMetaData().getMap()); **6. Add tags** -Add tags using the FileIds and tags which we want to add in request as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) +Accepts the file IDs and tags and add tags as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) ```java List fileIds = new ArrayList<>(); @@ -563,8 +557,7 @@ System.out.println(resultTags.getResponseMetaData().getMap()); **7. Remove tags** -Removed tags using the FileIds and tags which we want to remove from request as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) +Accepts the file IDs and tags to remove tags as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) ```java List fileIds = new ArrayList<>(); @@ -583,8 +576,7 @@ System.out.println(resultTags.getResponseMetaData().getMap()); **8. Remove AI tags** -Removed AITags using the FileIds and AITags which we want to remove from request as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) +Accepts the file IDs and AI tags to remove AI tags as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) ```java List fileIds = new ArrayList<>(); @@ -605,8 +597,7 @@ System.out.println(resultTags.getResponseMetaData().getMap()); **9. Delete File** -Delete a file as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file). The method accepts the file ID of the file that has to be -deleted. +Accepts the file ID and delete a file as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file). ```java String fileId="your-file-id"; @@ -621,9 +612,7 @@ System.out.println(result.getResponseMetaData().getMap()); **10. Delete FileVersion** -It deletes the FileVersion as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version). -The argument to the `deleteFileVersion()` method accepts the id of file and versionID to delete particular version of the file except current version which we want to be deleted. +Accepts the file ID and version ID (particular version of the file except current version) to delete a FileVersion as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version). ```java DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); @@ -640,8 +629,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **11. Delete files (bulk)** -Delete multiple files as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-files-bulk). The method accepts multiple file ID of the file that has to be -deleted. +Accepts the file IDs to delete files as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-files-bulk). ```java List fileIds = new ArrayList<>(); @@ -660,9 +648,8 @@ System.out.println(result.getResponseMetaData().getMap()); **12. Copy file** -It Copies the File as per the +Accepts the sourceFilePath and destinationPath to copy the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file). -The argument to the `copyFile()` method accepts the sourceFilePath and destinationPath that where we want to be copied it. ```java CopyFileRequest copyFileRequest = new CopyFileRequest(); @@ -680,9 +667,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **13. Move file** -It Moves the File as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/move-file). -The argument to the `moveFile()` method accepts the sourceFilePath and destinationPath that where we want to be moved it. +Accepts the sourceFilePath and destinationPath to move the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/move-file). ```java MoveFileRequest moveFileRequest = new MoveFileRequest(); @@ -699,9 +684,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **14. Rename file** -It Renames the File as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file). -The argument to the `renameFile()` method accepts the filePath for which you wants to rename and newFileName that with which you want to renamed it with purgeCache boolean. +Accepts the filePath and newFileName to rename file as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file). ```java RenameFileRequest renameFileRequest = new RenameFileRequest(); @@ -719,9 +702,7 @@ System.out.println(resultRenameFile.getResponseMetaData().getMap()); **15. Restore file Version** -It Restores file version to a different version of a file as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/restore-file-version). -The argument to the `restoreFileVersion()` method accepts the fileId and versionId. +Accepts the fileId and versionId to restore file version as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/restore-file-version). ```java Result result = ImageKit.getInstance().restoreFileVersion("fileId", "versionId"); @@ -735,9 +716,7 @@ System.out.println(result.getResponseMetaData().getMap()); **16. Create Folder** -It Creates the Folder as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder). -The argument to the `createFolder()` method accepts the folderName and parentFolderPath. +Accepts the folderName and parentFolderPath to cretae folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder). ```java CreateFolderRequest createFolderRequest = new CreateFolderRequest(); @@ -754,9 +733,7 @@ System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); **17. Delete Folder** -It Deletes the Folder as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder). -The argument to the `deleteFolder()` method accepts the folderPath for which the folder has to be deleted. +Accepts the folderPath to delete folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder). ```java DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); @@ -772,9 +749,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **18. Copy Folder** -It Copies the Folder as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder). -The argument to the `copyFolder()` method accepts the sourceFolderPath, destinationPath and includeFileVersions for which the folder has to be copied. +Accepts the sourceFolderPath, destinationPath and includeFileVersions to copy folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder). ```java CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); @@ -791,9 +766,7 @@ System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); **19. Move Folder** -It Moves the Folder as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder). -The argument to the `moveFolder()` method accepts the sourceFolderPath, destinationPath for which the folder has to be moved. +Accepts the sourceFolderPath and destinationPath to move folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder). ```java MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); @@ -810,9 +783,7 @@ System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); **20. Get Bulk Job Status** -It Gets the Job status as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-move-folder-status). -The argument to the `getBulkJobStatus()` method accepts the jobId for which job has to be get or Fetched the status. +Accepts the jobId to get bulk job status as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-move-folder-status). ```java String jobId = "629f44ac7eb0fe8173622d4b"; @@ -827,8 +798,8 @@ System.out.println(resultBulkJobStatus.getResponseMetaData().getMap()); **21. Purge Cache** -Programmatically issue a cache clear request as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache). -Accepts the full URL of the file for which the cache has to be cleared. +Accepts a full URL of the file for which the cache has to be cleared as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache). + ```java ResultCache result=ImageKit.getInstance().purgeCache("https://ik.imagekit.io/imagekit-id/default-image.jpg"); System.out.println("======FINAL RESULT======="); @@ -841,8 +812,7 @@ System.out.println(result.getResponseMetaData().getMap()); **22. Purge Cache Status** -Get the purge cache request status using the request ID returned when a purge cache request gets submitted as pet the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) +Accepts a request ID and fetch purge cache status as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/purge-cache-status) ```java String requestId="cache-requestId"; @@ -858,6 +828,7 @@ System.out.println(result.getResponseMetaData().getMap()); **23. Get File Metadata** Accepts the file ID and fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/metadata-api/get-image-metadata-for-uploaded-media-files) + ```java String fileId="your-file-id"; ResultMetaData result=ImageKit.getInstance().getFileMetadata(fileId); @@ -883,11 +854,9 @@ System.out.println(result.getResponseMetaData().getMap()); **24. Create CustomMetaDataFields** -It creates the CustomMetaDataFields as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field). +Accepts an object specifying the parameters to be used to create cusomMetaDataFields. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field) can be passed as-is with the correct values to get the results. Check for the [Allowed Values In The Schema](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field#allowed-values-in-the-schema-object). -The argument to the `createCustomMetaDataFields()` method is the object of `CustomMetaDataFieldCreateRequest` class. #### Examples: @@ -958,7 +927,7 @@ ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() **25. Get CustomMetaDataFields** -fetches the metadata as per the +Fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) ```java @@ -974,9 +943,7 @@ System.out.println(resultCustomMetaDataFieldList.getResultCustomMetaDataFields() **26. Edit CustomMetaDataFields** -It edits the CustomMetaDataFields as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). -The argument to the `updateCustomMetaDataFields()` method is the object of `CustomMetaDataFieldUpdateRequest` class. +Accepts an ID of customMetaDataField and object specifying the parameters to be used to edit cusomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). ```java CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); @@ -998,9 +965,7 @@ System.out.println(resultCustomMetaDataField.getResponseMetaData().getMap()); **27. Delete CustomMetaDataFields** -It deletes the CustomMetaDataFields as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/delete-custom-metadata-field). -The argument to the `deleteCustomMetaDataField()` method accepts the id of customMetaDataField which we want to be deleted. +Accepts the id to delete the customMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/delete-custom-metadata-field). ```java ResultNoContent resultNoContent=ImageKit.getInstance().deleteCustomMetaDataField("id"); From ac18429431443441569e7a95646f72a3f3dd9ca9 Mon Sep 17 00:00:00 2001 From: Vishwa Ghodasara <67286297+VishwaGhodasara@users.noreply.github.com> Date: Fri, 8 Jul 2022 15:43:36 +0530 Subject: [PATCH 108/112] Update README.md --- README.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index a1d054b..49cab9a 100644 --- a/README.md +++ b/README.md @@ -420,7 +420,7 @@ The SDK provides a simple interface for all the [media APIs mentioned here](http **1. List & Search Files** -Accepts an object specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/list-and-search-files) can be passed as-is with the correct values to get the results. +Accepts an object of class `GetFileListRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/list-and-search-files) can be passed as-is with the correct values to get the results. ```java String[] tags = new String[3]; @@ -477,7 +477,7 @@ System.out.println(resultFileVersions.getResponseMetaData().getMap()); **4. Get File Version details** -Accepts the file ID and vesrion ID and fetches the details as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-version-details). +Accepts the file ID and version ID and fetches the details as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/get-file-version-details). ```java String fileId = "62a04834c10d49825c6de9e8"; @@ -493,7 +493,7 @@ System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); **5. Update File Details** -Accepts an object specifying the parameters to be used to update file details. All parameters specified in the [documentation here] (https://docs.imagekit.io/api-reference/media-api/update-file-details) can be passed as-is with the correct values to get the results. +Accepts an object of class `FileUpdateRequest` specifying the parameters to be used to update file details. All parameters specified in the [documentation here] (https://docs.imagekit.io/api-reference/media-api/update-file-details) can be passed as-is with the correct values to get the results. ```java List tags = new ArrayList<>(); @@ -648,8 +648,7 @@ System.out.println(result.getResponseMetaData().getMap()); **12. Copy file** -Accepts the sourceFilePath and destinationPath to copy the File as per the -[API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file). +Accepts the sourceFilePath and destinationPath to copy the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file). ```java CopyFileRequest copyFileRequest = new CopyFileRequest(); @@ -854,7 +853,7 @@ System.out.println(result.getResponseMetaData().getMap()); **24. Create CustomMetaDataFields** -Accepts an object specifying the parameters to be used to create cusomMetaDataFields. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field) can be passed as-is with the correct values to get the results. +Accepts an object of class `CustomMetaDataFieldCreateRequest` specifying the parameters to be used to create cusomMetaDataFields. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field) can be passed as-is with the correct values to get the results. Check for the [Allowed Values In The Schema](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/create-custom-metadata-field#allowed-values-in-the-schema-object). @@ -927,8 +926,7 @@ ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() **25. Get CustomMetaDataFields** -Fetches the metadata as per the -[API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) +Fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) ```java ResultCustomMetaDataFieldList resultCustomMetaDataFieldList=ImageKit.getInstance().getCustomMetaDataFields(false); @@ -943,7 +941,7 @@ System.out.println(resultCustomMetaDataFieldList.getResultCustomMetaDataFields() **26. Edit CustomMetaDataFields** -Accepts an ID of customMetaDataField and object specifying the parameters to be used to edit cusomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). +Accepts an ID of customMetaDataField and object of class `CustomMetaDataFieldUpdateRequest` specifying the parameters to be used to edit cusomMetaDataFields as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/update-custom-metadata-field). ```java CustomMetaDataFieldSchemaObject schemaObject = new CustomMetaDataFieldSchemaObject(); From fe585a01539a9aa49bd80d15ad6fc834a54be0d5 Mon Sep 17 00:00:00 2001 From: Vishwa Ghodasara <67286297+VishwaGhodasara@users.noreply.github.com> Date: Fri, 8 Jul 2022 15:50:24 +0530 Subject: [PATCH 109/112] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 49cab9a..7742cd1 100644 --- a/README.md +++ b/README.md @@ -420,7 +420,7 @@ The SDK provides a simple interface for all the [media APIs mentioned here](http **1. List & Search Files** -Accepts an object of class `GetFileListRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/list-and-search-files) can be passed as-is with the correct values to get the results. +Accepts an object of class `GetFileListRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/list-and-search-files) can be passed via their setter functions to get the results. ```java String[] tags = new String[3]; @@ -493,7 +493,7 @@ System.out.println(resultFileVersionDetails.getResponseMetaData().getMap()); **5. Update File Details** -Accepts an object of class `FileUpdateRequest` specifying the parameters to be used to update file details. All parameters specified in the [documentation here] (https://docs.imagekit.io/api-reference/media-api/update-file-details) can be passed as-is with the correct values to get the results. +Accepts an object of class `FileUpdateRequest` specifying the parameters to be used to update file details. All parameters specified in the [documentation here] (https://docs.imagekit.io/api-reference/media-api/update-file-details) can be passed via their setter functions to get the results. ```java List tags = new ArrayList<>(); From 73eda1b66443680c8cb2477eff2f5c3aa7706d0d Mon Sep 17 00:00:00 2001 From: Vishwa Ghodasara <67286297+VishwaGhodasara@users.noreply.github.com> Date: Fri, 8 Jul 2022 16:07:25 +0530 Subject: [PATCH 110/112] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7742cd1..f8c508d 100644 --- a/README.md +++ b/README.md @@ -926,7 +926,7 @@ ResultCustomMetaDataField resultCustomMetaDataField = ImageKit.getInstance() **25. Get CustomMetaDataFields** -Fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) +Accepts the includeDeleted boolean and fetches the metadata as per the [API documentation here](https://docs.imagekit.io/api-reference/custom-metadata-fields-api/get-custom-metadata-field) ```java ResultCustomMetaDataFieldList resultCustomMetaDataFieldList=ImageKit.getInstance().getCustomMetaDataFields(false); From 4bafc86e86c34933c7eb4d4bd9d2eaedd3f3930f Mon Sep 17 00:00:00 2001 From: Vishwa Ghodasara <67286297+VishwaGhodasara@users.noreply.github.com> Date: Fri, 8 Jul 2022 17:02:33 +0530 Subject: [PATCH 111/112] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f8c508d..62caca2 100644 --- a/README.md +++ b/README.md @@ -538,7 +538,7 @@ System.out.println(result.getResponseMetaData().getMap()); **6. Add tags** -Accepts the file IDs and tags and add tags as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) +Accepts an object of class `TagsRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) can be passed via their setter functions to get the results. ```java List fileIds = new ArrayList<>(); @@ -557,7 +557,7 @@ System.out.println(resultTags.getResponseMetaData().getMap()); **7. Remove tags** -Accepts the file IDs and tags to remove tags as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) +Accepts an object of class `TagsRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) can be passed via their setter functions to get the results. ```java List fileIds = new ArrayList<>(); @@ -576,7 +576,7 @@ System.out.println(resultTags.getResponseMetaData().getMap()); **8. Remove AI tags** -Accepts the file IDs and AI tags to remove AI tags as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) +Accepts an object of class `AITagsRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) can be passed via their setter functions to get the results. ```java List fileIds = new ArrayList<>(); @@ -612,7 +612,7 @@ System.out.println(result.getResponseMetaData().getMap()); **10. Delete FileVersion** -Accepts the file ID and version ID (particular version of the file except current version) to delete a FileVersion as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version). +Accepts an object of class `DeleteFileVersionRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version) can be passed via their setter functions to get the results. ```java DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); @@ -648,7 +648,7 @@ System.out.println(result.getResponseMetaData().getMap()); **12. Copy file** -Accepts the sourceFilePath and destinationPath to copy the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file). +Accepts an object of class `CopyFileRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file) can be passed via their setter functions to get the results. ```java CopyFileRequest copyFileRequest = new CopyFileRequest(); @@ -666,7 +666,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **13. Move file** -Accepts the sourceFilePath and destinationPath to move the File as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/move-file). +Accepts an object of class `MoveFileRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/move-file) can be passed via their setter functions to get the results. ```java MoveFileRequest moveFileRequest = new MoveFileRequest(); @@ -683,7 +683,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **14. Rename file** -Accepts the filePath and newFileName to rename file as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file). +Accepts an object of class `RenameFileRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file) can be passed via their setter functions to get the results. ```java RenameFileRequest renameFileRequest = new RenameFileRequest(); @@ -715,7 +715,7 @@ System.out.println(result.getResponseMetaData().getMap()); **16. Create Folder** -Accepts the folderName and parentFolderPath to cretae folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder). +Accepts an object of class `CreateFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder) can be passed via their setter functions to get the results. ```java CreateFolderRequest createFolderRequest = new CreateFolderRequest(); @@ -732,7 +732,7 @@ System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); **17. Delete Folder** -Accepts the folderPath to delete folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder). +Accepts an object of class `DeleteFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder) can be passed via their setter functions to get the results. ```java DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); @@ -748,7 +748,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **18. Copy Folder** -Accepts the sourceFolderPath, destinationPath and includeFileVersions to copy folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder). +Accepts an object of class `CopyFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder) can be passed via their setter functions to get the results. ```java CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); @@ -765,7 +765,7 @@ System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); **19. Move Folder** -Accepts the sourceFolderPath and destinationPath to move folder as per the [API documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder). +Accepts an object of class `MoveFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder) can be passed via their setter functions to get the results. ```java MoveFolderRequest moveFolderRequest = new MoveFolderRequest(); From c86c0adddd67a6d30dd2bda6a4ea10d6a2b29512 Mon Sep 17 00:00:00 2001 From: Vishwa Ghodasara <67286297+VishwaGhodasara@users.noreply.github.com> Date: Fri, 8 Jul 2022 17:08:17 +0530 Subject: [PATCH 112/112] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 62caca2..87f06b7 100644 --- a/README.md +++ b/README.md @@ -538,7 +538,7 @@ System.out.println(result.getResponseMetaData().getMap()); **6. Add tags** -Accepts an object of class `TagsRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) can be passed via their setter functions to get the results. +Accepts an object of class `TagsRequest` specifying the parameters to be used to add tags. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/add-tags-bulk) can be passed via their setter functions to get the results. ```java List fileIds = new ArrayList<>(); @@ -557,7 +557,7 @@ System.out.println(resultTags.getResponseMetaData().getMap()); **7. Remove tags** -Accepts an object of class `TagsRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) can be passed via their setter functions to get the results. +Accepts an object of class `TagsRequest` specifying the parameters to be used to remove tags. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/remove-tags-bulk) can be passed via their setter functions to get the results. ```java List fileIds = new ArrayList<>(); @@ -576,7 +576,7 @@ System.out.println(resultTags.getResponseMetaData().getMap()); **8. Remove AI tags** -Accepts an object of class `AITagsRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) can be passed via their setter functions to get the results. +Accepts an object of class `AITagsRequest` specifying the parameters to be used to remove AI tags. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/remove-aitags-bulk) can be passed via their setter functions to get the results. ```java List fileIds = new ArrayList<>(); @@ -612,7 +612,7 @@ System.out.println(result.getResponseMetaData().getMap()); **10. Delete FileVersion** -Accepts an object of class `DeleteFileVersionRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version) can be passed via their setter functions to get the results. +Accepts an object of class `DeleteFileVersionRequest` specifying the parameters to be used to delete file version. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/delete-file-version) can be passed via their setter functions to get the results. ```java DeleteFileVersionRequest deleteFileVersionRequest = new DeleteFileVersionRequest(); @@ -648,7 +648,7 @@ System.out.println(result.getResponseMetaData().getMap()); **12. Copy file** -Accepts an object of class `CopyFileRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file) can be passed via their setter functions to get the results. +Accepts an object of class `CopyFileRequest` specifying the parameters to be used to copy file. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/copy-file) can be passed via their setter functions to get the results. ```java CopyFileRequest copyFileRequest = new CopyFileRequest(); @@ -666,7 +666,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **13. Move file** -Accepts an object of class `MoveFileRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/move-file) can be passed via their setter functions to get the results. +Accepts an object of class `MoveFileRequest` specifying the parameters to be used to move file. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/move-file) can be passed via their setter functions to get the results. ```java MoveFileRequest moveFileRequest = new MoveFileRequest(); @@ -683,7 +683,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **14. Rename file** -Accepts an object of class `RenameFileRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file) can be passed via their setter functions to get the results. +Accepts an object of class `RenameFileRequest` specifying the parameters to be used to rename file. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/rename-file) can be passed via their setter functions to get the results. ```java RenameFileRequest renameFileRequest = new RenameFileRequest(); @@ -715,7 +715,7 @@ System.out.println(result.getResponseMetaData().getMap()); **16. Create Folder** -Accepts an object of class `CreateFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder) can be passed via their setter functions to get the results. +Accepts an object of class `CreateFolderRequest` specifying the parameters to be used to create folder. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/create-folder) can be passed via their setter functions to get the results. ```java CreateFolderRequest createFolderRequest = new CreateFolderRequest(); @@ -732,7 +732,7 @@ System.out.println(resultEmptyBlock.getResponseMetaData().getMap()); **17. Delete Folder** -Accepts an object of class `DeleteFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder) can be passed via their setter functions to get the results. +Accepts an object of class `DeleteFolderRequest` specifying the parameters to be used to delete folder. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/delete-folder) can be passed via their setter functions to get the results. ```java DeleteFolderRequest deleteFolderRequest = new DeleteFolderRequest(); @@ -748,7 +748,7 @@ System.out.println(resultNoContent.getResponseMetaData().getMap()); **18. Copy Folder** -Accepts an object of class `CopyFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder) can be passed via their setter functions to get the results. +Accepts an object of class `CopyFolderRequest` specifying the parameters to be used to copy folder. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/copy-folder) can be passed via their setter functions to get the results. ```java CopyFolderRequest copyFolderRequest = new CopyFolderRequest(); @@ -765,7 +765,7 @@ System.out.println(resultOfFolderActions.getResponseMetaData().getMap()); **19. Move Folder** -Accepts an object of class `MoveFolderRequest` specifying the parameters to be used to list and search files. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder) can be passed via their setter functions to get the results. +Accepts an object of class `MoveFolderRequest` specifying the parameters to be used to move folder. All parameters specified in the [documentation here](https://docs.imagekit.io/api-reference/media-api/move-folder) can be passed via their setter functions to get the results. ```java MoveFolderRequest moveFolderRequest = new MoveFolderRequest();