diff --git a/src/main/java/io/craftgate/adapter/FileReportingAdapter.java b/src/main/java/io/craftgate/adapter/FileReportingAdapter.java index 31d72198..9e000655 100644 --- a/src/main/java/io/craftgate/adapter/FileReportingAdapter.java +++ b/src/main/java/io/craftgate/adapter/FileReportingAdapter.java @@ -1,10 +1,13 @@ 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.RetrieveReportRequest; import io.craftgate.request.common.RequestOptions; import io.craftgate.request.common.RequestQueryParamsBuilder; +import io.craftgate.response.ReportDemandResponse; import java.util.Map; @@ -32,4 +35,21 @@ 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); + } + + 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 new file mode 100644 index 00000000..5f11519b --- /dev/null +++ b/src/main/java/io/craftgate/model/ReportPeriod.java @@ -0,0 +1,5 @@ +package io.craftgate.model; + +public enum ReportPeriod { + INSTANT +} 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..66620ceb --- /dev/null +++ b/src/main/java/io/craftgate/model/ReportType.java @@ -0,0 +1,6 @@ +package io.craftgate.model; + +public enum ReportType { + TRANSACTION, + PAYMENT, +} diff --git a/src/main/java/io/craftgate/net/HttpClient.java b/src/main/java/io/craftgate/net/HttpClient.java index e1eb06e0..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,12 +178,6 @@ private static byte[] body(HttpURLConnection conn) throws IOException { } return body; } - - private static Gson buildGson() { - return new GsonBuilder() - .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 new file mode 100644 index 00000000..c094c1a2 --- /dev/null +++ b/src/main/java/io/craftgate/request/CreateReportRequest.java @@ -0,0 +1,27 @@ +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; + + @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 cc98445b..63089681 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 = Jsons.getGson(); String requestBody = gson.toJson(request); hashData = decodedUrl + apiKey + secretKey + randomString + requestBody; } else { 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/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..d87235a7 100644 --- a/src/test/java/io/craftgate/sample/FileReportingSample.java +++ b/src/test/java/io/craftgate/sample/FileReportingSample.java @@ -2,11 +2,15 @@ import io.craftgate.Craftgate; import io.craftgate.model.ReportFileType; +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; import java.time.LocalDate; +import java.time.LocalDateTime; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -35,4 +39,26 @@ 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()) + .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..fd92f02d 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 @@ -80,7 +81,6 @@ void update_product() { assertEquals(response.getEnabledInstallments(), request.getEnabledInstallments()); assertNotNull(response.getUrl()); assertNotNull(response.getToken()); - assertNotNull(response.getQrCodeUrl()); } @Test