From 5e2bcce3db3155d0d6d7b797a40ec534019d0b24 Mon Sep 17 00:00:00 2001 From: furkanozmen Date: Thu, 23 Oct 2025 10:10:33 +0300 Subject: [PATCH 1/6] Add CreateReportRequest and ReportDemandResponse for report generation --- .../adapter/FileReportingAdapter.java | 11 ++++++++ .../java/io/craftgate/model/ReportPeriod.java | 8 ++++++ .../java/io/craftgate/model/ReportType.java | 8 ++++++ .../java/io/craftgate/net/HttpClient.java | 6 ++-- .../request/CreateReportRequest.java | 28 +++++++++++++++++++ .../response/ReportDemandResponse.java | 16 +++++++++++ .../craftgate/sample/FileReportingSample.java | 20 +++++++++++++ 7 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/craftgate/model/ReportPeriod.java create mode 100644 src/main/java/io/craftgate/model/ReportType.java create mode 100644 src/main/java/io/craftgate/request/CreateReportRequest.java create mode 100644 src/main/java/io/craftgate/response/ReportDemandResponse.java diff --git a/src/main/java/io/craftgate/adapter/FileReportingAdapter.java b/src/main/java/io/craftgate/adapter/FileReportingAdapter.java index 31d72198..0075ac07 100644 --- a/src/main/java/io/craftgate/adapter/FileReportingAdapter.java +++ b/src/main/java/io/craftgate/adapter/FileReportingAdapter.java @@ -1,10 +1,12 @@ package io.craftgate.adapter; import io.craftgate.net.HttpClient; +import io.craftgate.request.CreateReportRequest; import io.craftgate.request.RetrieveDailyPaymentReportRequest; import io.craftgate.request.RetrieveDailyTransactionReportRequest; import io.craftgate.request.common.RequestOptions; import io.craftgate.request.common.RequestQueryParamsBuilder; +import io.craftgate.response.ReportDemandResponse; import java.util.Map; @@ -32,4 +34,13 @@ public byte[] retrieveDailyPaymentReport(RetrieveDailyPaymentReportRequest retri headers.put(CONTENT_TYPE, APPLICATION_OCTET_STREAM); return HttpClient.get(requestOptions.getBaseUrl() + path, headers, byte[].class); } + + public ReportDemandResponse createReport(CreateReportRequest request) { + String path = "/file-reporting/v1/report-demands"; + Map headers = createHeaders(request, path, requestOptions); + return HttpClient.post(requestOptions.getBaseUrl() + path, + headers, + request, + ReportDemandResponse.class); + } } diff --git a/src/main/java/io/craftgate/model/ReportPeriod.java b/src/main/java/io/craftgate/model/ReportPeriod.java new file mode 100644 index 00000000..d0d5b1ab --- /dev/null +++ b/src/main/java/io/craftgate/model/ReportPeriod.java @@ -0,0 +1,8 @@ +package io.craftgate.model; + +public enum ReportPeriod { + DAILY, + WEEKLY, + MONTHLY, + CUSTOM +} diff --git a/src/main/java/io/craftgate/model/ReportType.java b/src/main/java/io/craftgate/model/ReportType.java new file mode 100644 index 00000000..82f956df --- /dev/null +++ b/src/main/java/io/craftgate/model/ReportType.java @@ -0,0 +1,8 @@ +package io.craftgate.model; + +public enum ReportType { + TRANSACTION, + SETTLEMENT, + PAYMENT, + SUB_MERCHANT_MEMBER_WALLET_TX +} diff --git a/src/main/java/io/craftgate/net/HttpClient.java b/src/main/java/io/craftgate/net/HttpClient.java index e1eb06e0..f7e8713b 100644 --- a/src/main/java/io/craftgate/net/HttpClient.java +++ b/src/main/java/io/craftgate/net/HttpClient.java @@ -183,8 +183,10 @@ private static byte[] body(HttpURLConnection conn) throws IOException { private static Gson buildGson() { return new GsonBuilder() - .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> LocalDateTime.parse(json.getAsString())) - .create(); + .registerTypeAdapter(LocalDateTime.class, (com.google.gson.JsonSerializer) (localDateTime, typeOfSrc, context) -> + context.serialize(localDateTime.toString())) + .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> + LocalDateTime.parse(json.getAsString())) .create(); } } diff --git a/src/main/java/io/craftgate/request/CreateReportRequest.java b/src/main/java/io/craftgate/request/CreateReportRequest.java new file mode 100644 index 00000000..9fc5ebbe --- /dev/null +++ b/src/main/java/io/craftgate/request/CreateReportRequest.java @@ -0,0 +1,28 @@ +package io.craftgate.request; + +import io.craftgate.model.ReportPeriod; +import io.craftgate.model.ReportType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CreateReportRequest { + + private LocalDateTime startDate; + + private LocalDateTime endDate; + + @Builder.Default + private ReportType reportType = ReportType.TRANSACTION; + + private ReportPeriod reportPeriod; + + private Long merchantPosId; +} diff --git a/src/main/java/io/craftgate/response/ReportDemandResponse.java b/src/main/java/io/craftgate/response/ReportDemandResponse.java new file mode 100644 index 00000000..cfcfa1aa --- /dev/null +++ b/src/main/java/io/craftgate/response/ReportDemandResponse.java @@ -0,0 +1,16 @@ +package io.craftgate.response; + +import io.craftgate.model.ReportPeriod; +import io.craftgate.model.ReportType; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ReportDemandResponse { + private Long id; + private ReportType reportType; + private ReportPeriod reportPeriod; + private LocalDateTime startDate; + private LocalDateTime endDate; +} diff --git a/src/test/java/io/craftgate/sample/FileReportingSample.java b/src/test/java/io/craftgate/sample/FileReportingSample.java index 5b75dbbf..3928ff50 100644 --- a/src/test/java/io/craftgate/sample/FileReportingSample.java +++ b/src/test/java/io/craftgate/sample/FileReportingSample.java @@ -2,11 +2,16 @@ import io.craftgate.Craftgate; import io.craftgate.model.ReportFileType; +import io.craftgate.model.ReportPeriod; +import io.craftgate.model.ReportType; +import io.craftgate.request.CreateReportRequest; import io.craftgate.request.RetrieveDailyPaymentReportRequest; import io.craftgate.request.RetrieveDailyTransactionReportRequest; +import io.craftgate.response.ReportDemandResponse; import org.junit.jupiter.api.Test; import java.time.LocalDate; +import java.time.LocalDateTime; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -35,4 +40,19 @@ void retrieve_daily_payment_report() { String response = new String(craftgate.fileReporting().retrieveDailyPaymentReport(retrieveRequest)); assertNotNull(response); } + + @Test + void create_report_demand() { + CreateReportRequest request = CreateReportRequest.builder() + .startDate(LocalDateTime.now().minusDays(2)) + .endDate(LocalDateTime.now()) + .reportType(ReportType.TRANSACTION) + .reportPeriod(ReportPeriod.DAILY) + .merchantPosId(1L) + .build(); + + ReportDemandResponse response = craftgate.fileReporting().createReport(request); + assertNotNull(response); + assertNotNull(response.getId()); + } } From 38b9b714679d62a862c2b15ca7da80ad0e881ab1 Mon Sep 17 00:00:00 2001 From: furkanozmen Date: Thu, 23 Oct 2025 11:03:03 +0300 Subject: [PATCH 2/6] Refactor HashGenerator to use custom Gson builder for LocalDateTime serialization --- .../io/craftgate/request/common/HashGenerator.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/craftgate/request/common/HashGenerator.java b/src/main/java/io/craftgate/request/common/HashGenerator.java index cc98445b..88d4e641 100644 --- a/src/main/java/io/craftgate/request/common/HashGenerator.java +++ b/src/main/java/io/craftgate/request/common/HashGenerator.java @@ -1,12 +1,15 @@ package io.craftgate.request.common; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializer; import io.craftgate.exception.CraftgateException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; public final class HashGenerator { @@ -19,7 +22,7 @@ public static String generateHash(String baseUrl, String apiKey, String secretKe String decodedUrl = URLDecoder.decode(baseUrl + path, StandardCharsets.UTF_8.toString()); if (request != null) { - Gson gson = new Gson(); + Gson gson = buildGson(); String requestBody = gson.toJson(request); hashData = decodedUrl + apiKey + secretKey + randomString + requestBody; } else { @@ -39,4 +42,12 @@ public static String generateHash(String hashString) { throw new CraftgateException(e); } } + + private static Gson buildGson() { + return new GsonBuilder() + .registerTypeAdapter(LocalDateTime.class, (com.google.gson.JsonSerializer) (localDateTime, typeOfSrc, context) -> + context.serialize(localDateTime.toString())) + .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> + LocalDateTime.parse(json.getAsString())) .create(); + } } From bfeee8a56e5ce75cdbafd556b73f031f9c0387d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Semih=20=C5=9Eahan?= Date: Fri, 24 Oct 2025 15:46:36 +0300 Subject: [PATCH 3/6] Update --- .../adapter/FileReportingAdapter.java | 9 +++++++ .../java/io/craftgate/model/ReportPeriod.java | 4 +-- .../java/io/craftgate/net/HttpClient.java | 14 ++--------- .../request/CreateReportRequest.java | 5 ++-- .../request/RetrieveReportRequest.java | 13 ++++++++++ .../request/common/HashGenerator.java | 10 +------- .../io/craftgate/request/common/Jsons.java | 25 +++++++++++++++++++ .../craftgate/sample/FileReportingSample.java | 16 ++++++++---- .../io/craftgate/sample/PayByLinkSample.java | 3 ++- 9 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 src/main/java/io/craftgate/request/RetrieveReportRequest.java create mode 100644 src/main/java/io/craftgate/request/common/Jsons.java diff --git a/src/main/java/io/craftgate/adapter/FileReportingAdapter.java b/src/main/java/io/craftgate/adapter/FileReportingAdapter.java index 0075ac07..9e000655 100644 --- a/src/main/java/io/craftgate/adapter/FileReportingAdapter.java +++ b/src/main/java/io/craftgate/adapter/FileReportingAdapter.java @@ -4,6 +4,7 @@ import io.craftgate.request.CreateReportRequest; import io.craftgate.request.RetrieveDailyPaymentReportRequest; import io.craftgate.request.RetrieveDailyTransactionReportRequest; +import io.craftgate.request.RetrieveReportRequest; import io.craftgate.request.common.RequestOptions; import io.craftgate.request.common.RequestQueryParamsBuilder; import io.craftgate.response.ReportDemandResponse; @@ -43,4 +44,12 @@ public ReportDemandResponse createReport(CreateReportRequest request) { request, ReportDemandResponse.class); } + + public byte[] retrieveReport(RetrieveReportRequest retrieveReportRequest, Long reportId) { + String query = RequestQueryParamsBuilder.buildQueryParam(retrieveReportRequest); + String path = "/file-reporting/v1/reports/" + reportId + query; + Map headers = createHeaders(path, requestOptions); + headers.put(CONTENT_TYPE, APPLICATION_OCTET_STREAM); + return HttpClient.get(requestOptions.getBaseUrl() + path, headers, byte[].class); + } } diff --git a/src/main/java/io/craftgate/model/ReportPeriod.java b/src/main/java/io/craftgate/model/ReportPeriod.java index d0d5b1ab..796ce0e1 100644 --- a/src/main/java/io/craftgate/model/ReportPeriod.java +++ b/src/main/java/io/craftgate/model/ReportPeriod.java @@ -2,7 +2,5 @@ public enum ReportPeriod { DAILY, - WEEKLY, - MONTHLY, - CUSTOM + INSTANT } diff --git a/src/main/java/io/craftgate/net/HttpClient.java b/src/main/java/io/craftgate/net/HttpClient.java index f7e8713b..763d2ced 100644 --- a/src/main/java/io/craftgate/net/HttpClient.java +++ b/src/main/java/io/craftgate/net/HttpClient.java @@ -1,9 +1,8 @@ package io.craftgate.net; import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializer; import io.craftgate.exception.CraftgateException; +import io.craftgate.request.common.Jsons; import io.craftgate.response.common.ErrorResponse; import io.craftgate.response.common.Response; @@ -12,7 +11,6 @@ import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; import java.util.Map; import java.util.Objects; @@ -23,7 +21,7 @@ public class HttpClient { private static final String ACCEPT = "Accept"; private static final int CONNECT_TIMEOUT = 10000; private static final int READ_TIMEOUT = 150000; - private static final Gson gson = buildGson(); + private static final Gson gson = Jsons.getGson(); private HttpClient() { } @@ -180,14 +178,6 @@ private static byte[] body(HttpURLConnection conn) throws IOException { } return body; } - - private static Gson buildGson() { - return new GsonBuilder() - .registerTypeAdapter(LocalDateTime.class, (com.google.gson.JsonSerializer) (localDateTime, typeOfSrc, context) -> - context.serialize(localDateTime.toString())) - .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> - LocalDateTime.parse(json.getAsString())) .create(); - } } class HttpResponse { diff --git a/src/main/java/io/craftgate/request/CreateReportRequest.java b/src/main/java/io/craftgate/request/CreateReportRequest.java index 9fc5ebbe..c094c1a2 100644 --- a/src/main/java/io/craftgate/request/CreateReportRequest.java +++ b/src/main/java/io/craftgate/request/CreateReportRequest.java @@ -22,7 +22,6 @@ public class CreateReportRequest { @Builder.Default private ReportType reportType = ReportType.TRANSACTION; - private ReportPeriod reportPeriod; - - private Long merchantPosId; + @Builder.Default + private ReportPeriod reportPeriod = ReportPeriod.INSTANT; } diff --git a/src/main/java/io/craftgate/request/RetrieveReportRequest.java b/src/main/java/io/craftgate/request/RetrieveReportRequest.java new file mode 100644 index 00000000..0f35afb5 --- /dev/null +++ b/src/main/java/io/craftgate/request/RetrieveReportRequest.java @@ -0,0 +1,13 @@ +package io.craftgate.request; + + +import io.craftgate.model.ReportFileType; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RetrieveReportRequest { + + private ReportFileType fileType; +} diff --git a/src/main/java/io/craftgate/request/common/HashGenerator.java b/src/main/java/io/craftgate/request/common/HashGenerator.java index 88d4e641..63089681 100644 --- a/src/main/java/io/craftgate/request/common/HashGenerator.java +++ b/src/main/java/io/craftgate/request/common/HashGenerator.java @@ -22,7 +22,7 @@ public static String generateHash(String baseUrl, String apiKey, String secretKe String decodedUrl = URLDecoder.decode(baseUrl + path, StandardCharsets.UTF_8.toString()); if (request != null) { - Gson gson = buildGson(); + Gson gson = Jsons.getGson(); String requestBody = gson.toJson(request); hashData = decodedUrl + apiKey + secretKey + randomString + requestBody; } else { @@ -42,12 +42,4 @@ public static String generateHash(String hashString) { throw new CraftgateException(e); } } - - private static Gson buildGson() { - return new GsonBuilder() - .registerTypeAdapter(LocalDateTime.class, (com.google.gson.JsonSerializer) (localDateTime, typeOfSrc, context) -> - context.serialize(localDateTime.toString())) - .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> - LocalDateTime.parse(json.getAsString())) .create(); - } } diff --git a/src/main/java/io/craftgate/request/common/Jsons.java b/src/main/java/io/craftgate/request/common/Jsons.java new file mode 100644 index 00000000..db338649 --- /dev/null +++ b/src/main/java/io/craftgate/request/common/Jsons.java @@ -0,0 +1,25 @@ +package io.craftgate.request.common; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonSerializer; + +import java.time.LocalDateTime; + +public final class Jsons { + + private static final Gson GSON = new GsonBuilder() + .registerTypeAdapter(LocalDateTime.class, (JsonSerializer) (localDateTime, typeOfSrc, context) -> + context.serialize(localDateTime.toString())) + .registerTypeAdapter(LocalDateTime.class, (JsonDeserializer) (json, typeOfT, context) -> + LocalDateTime.parse(json.getAsString())) + .create(); + + private Jsons() { + } + + public static Gson getGson() { + return GSON; + } +} \ No newline at end of file diff --git a/src/test/java/io/craftgate/sample/FileReportingSample.java b/src/test/java/io/craftgate/sample/FileReportingSample.java index 3928ff50..d87235a7 100644 --- a/src/test/java/io/craftgate/sample/FileReportingSample.java +++ b/src/test/java/io/craftgate/sample/FileReportingSample.java @@ -2,11 +2,10 @@ import io.craftgate.Craftgate; import io.craftgate.model.ReportFileType; -import io.craftgate.model.ReportPeriod; -import io.craftgate.model.ReportType; import io.craftgate.request.CreateReportRequest; import io.craftgate.request.RetrieveDailyPaymentReportRequest; import io.craftgate.request.RetrieveDailyTransactionReportRequest; +import io.craftgate.request.RetrieveReportRequest; import io.craftgate.response.ReportDemandResponse; import org.junit.jupiter.api.Test; @@ -46,13 +45,20 @@ void create_report_demand() { CreateReportRequest request = CreateReportRequest.builder() .startDate(LocalDateTime.now().minusDays(2)) .endDate(LocalDateTime.now()) - .reportType(ReportType.TRANSACTION) - .reportPeriod(ReportPeriod.DAILY) - .merchantPosId(1L) .build(); ReportDemandResponse response = craftgate.fileReporting().createReport(request); assertNotNull(response); assertNotNull(response.getId()); } + + @Test + void retrieve_report() { + RetrieveReportRequest retrieveReportRequest = RetrieveReportRequest.builder() + .fileType(ReportFileType.CSV) + .build(); + + String response = new String(craftgate.fileReporting().retrieveReport(retrieveReportRequest, 49L)); + assertNotNull(response); + } } diff --git a/src/test/java/io/craftgate/sample/PayByLinkSample.java b/src/test/java/io/craftgate/sample/PayByLinkSample.java index be5a5e02..d05697db 100644 --- a/src/test/java/io/craftgate/sample/PayByLinkSample.java +++ b/src/test/java/io/craftgate/sample/PayByLinkSample.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.Test; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.HashSet; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -35,6 +36,7 @@ void create_product() { .price(BigDecimal.TEN) .currency(Currency.TRY) .conversationId("my-conversationId") + .expiresAt(LocalDateTime.now().plusDays(2)) .externalId("my-externalId") .enabledInstallments(enabledInstallments) .build(); @@ -49,7 +51,6 @@ void create_product() { assertEquals(response.getEnabledInstallments(), request.getEnabledInstallments()); assertNotNull(response.getUrl()); assertNotNull(response.getToken()); - assertNotNull(response.getQrCodeUrl()); } @Test From b544557deec371670ab6af8d277e0150a9d13e54 Mon Sep 17 00:00:00 2001 From: furkanozmen Date: Fri, 24 Oct 2025 16:19:47 +0300 Subject: [PATCH 4/6] Remove QR code URL assertion from PayByLinkSample test --- src/test/java/io/craftgate/sample/PayByLinkSample.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/io/craftgate/sample/PayByLinkSample.java b/src/test/java/io/craftgate/sample/PayByLinkSample.java index d05697db..fd92f02d 100644 --- a/src/test/java/io/craftgate/sample/PayByLinkSample.java +++ b/src/test/java/io/craftgate/sample/PayByLinkSample.java @@ -81,7 +81,6 @@ void update_product() { assertEquals(response.getEnabledInstallments(), request.getEnabledInstallments()); assertNotNull(response.getUrl()); assertNotNull(response.getToken()); - assertNotNull(response.getQrCodeUrl()); } @Test From e5bb5dc8fcd2110a3da4169db0fa6cfa340c47e5 Mon Sep 17 00:00:00 2001 From: furkanozmen Date: Fri, 24 Oct 2025 17:26:37 +0300 Subject: [PATCH 5/6] Remove unused report periods and types from enums --- src/main/java/io/craftgate/model/ReportPeriod.java | 1 - src/main/java/io/craftgate/model/ReportType.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/io/craftgate/model/ReportPeriod.java b/src/main/java/io/craftgate/model/ReportPeriod.java index 796ce0e1..5f11519b 100644 --- a/src/main/java/io/craftgate/model/ReportPeriod.java +++ b/src/main/java/io/craftgate/model/ReportPeriod.java @@ -1,6 +1,5 @@ package io.craftgate.model; public enum ReportPeriod { - DAILY, INSTANT } diff --git a/src/main/java/io/craftgate/model/ReportType.java b/src/main/java/io/craftgate/model/ReportType.java index 82f956df..66620ceb 100644 --- a/src/main/java/io/craftgate/model/ReportType.java +++ b/src/main/java/io/craftgate/model/ReportType.java @@ -2,7 +2,5 @@ public enum ReportType { TRANSACTION, - SETTLEMENT, PAYMENT, - SUB_MERCHANT_MEMBER_WALLET_TX } From 2b10681b4343400daf7bb2bbb9dc0d3e404a20b4 Mon Sep 17 00:00:00 2001 From: furkanozmen Date: Mon, 29 Dec 2025 10:43:04 +0300 Subject: [PATCH 6/6] Enhance error handling by adding provider error details to CraftgateException and ErrorResponse --- .../exception/CraftgateException.java | 18 ++++++++++++++++++ src/main/java/io/craftgate/net/HttpClient.java | 11 ++++++++++- .../response/common/ErrorResponse.java | 1 + .../response/common/ProviderError.java | 10 ++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/craftgate/response/common/ProviderError.java diff --git a/src/main/java/io/craftgate/exception/CraftgateException.java b/src/main/java/io/craftgate/exception/CraftgateException.java index c8b686c2..44ce5fbe 100644 --- a/src/main/java/io/craftgate/exception/CraftgateException.java +++ b/src/main/java/io/craftgate/exception/CraftgateException.java @@ -14,12 +14,16 @@ public class CraftgateException extends RuntimeException { private final String errorCode; private final String errorDescription; private final String errorGroup; + private final String providerErrorCode; + private final String providerErrorDescription; public CraftgateException() { super(GENERAL_ERROR_DESCRIPTION); this.errorCode = GENERAL_ERROR_CODE; this.errorDescription = GENERAL_ERROR_DESCRIPTION; this.errorGroup = GENERAL_ERROR_GROUP; + this.providerErrorCode = null; + this.providerErrorDescription = null; } public CraftgateException(String errorCode, String errorDescription, String errorGroup) { @@ -27,6 +31,18 @@ public CraftgateException(String errorCode, String errorDescription, String erro this.errorCode = errorCode; this.errorDescription = errorDescription; this.errorGroup = errorGroup; + this.providerErrorCode = null; + this.providerErrorDescription = null; + } + + public CraftgateException(String errorCode, String errorDescription, String errorGroup, + String providerErrorCode, String providerErrorDescription) { + super(errorDescription); + this.errorCode = errorCode; + this.errorDescription = errorDescription; + this.errorGroup = errorGroup; + this.providerErrorCode = providerErrorCode; + this.providerErrorDescription = providerErrorDescription; } public CraftgateException(Throwable cause) { @@ -34,5 +50,7 @@ public CraftgateException(Throwable cause) { this.errorCode = GENERAL_ERROR_CODE; this.errorDescription = GENERAL_ERROR_DESCRIPTION; this.errorGroup = GENERAL_ERROR_GROUP; + this.providerErrorCode = null; + this.providerErrorDescription = null; } } diff --git a/src/main/java/io/craftgate/net/HttpClient.java b/src/main/java/io/craftgate/net/HttpClient.java index 763d2ced..3c72648d 100644 --- a/src/main/java/io/craftgate/net/HttpClient.java +++ b/src/main/java/io/craftgate/net/HttpClient.java @@ -86,7 +86,16 @@ private static void requireSuccess(HttpResponse httpResponse, Class respo response = gson.fromJson(new String(httpResponse.getBody(), StandardCharsets.UTF_8), Response.class); if (response != null && response.getErrors() != null) { ErrorResponse errors = response.getErrors(); - throw new CraftgateException(errors.getErrorCode(), errors.getErrorDescription(), errors.getErrorGroup()); + if (errors.getProviderError() != null) { + throw new CraftgateException( + errors.getErrorCode(), + errors.getErrorDescription(), + errors.getErrorGroup(), + errors.getProviderError().getErrorCode(), + errors.getProviderError().getErrorMessage()); + } + throw new CraftgateException(errors.getErrorCode(), errors.getErrorDescription(), + errors.getErrorGroup()); } throw new CraftgateException(); } diff --git a/src/main/java/io/craftgate/response/common/ErrorResponse.java b/src/main/java/io/craftgate/response/common/ErrorResponse.java index b778dc44..2f47f410 100644 --- a/src/main/java/io/craftgate/response/common/ErrorResponse.java +++ b/src/main/java/io/craftgate/response/common/ErrorResponse.java @@ -8,4 +8,5 @@ public class ErrorResponse { private String errorCode; private String errorDescription; private String errorGroup; + private ProviderError providerError; } diff --git a/src/main/java/io/craftgate/response/common/ProviderError.java b/src/main/java/io/craftgate/response/common/ProviderError.java new file mode 100644 index 00000000..260e6e9b --- /dev/null +++ b/src/main/java/io/craftgate/response/common/ProviderError.java @@ -0,0 +1,10 @@ +package io.craftgate.response.common; + +import lombok.Data; + +@Data +public class ProviderError { + + private String errorCode; + private String errorMessage; +}