Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 14 additions & 46 deletions src/main/java/com/abacatepay/AbacatePay.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,65 +3,33 @@
import com.abacatepay.clients.AbacatePayClient;
import com.abacatepay.clients.factories.AbacatePayClientFactory;
import com.abacatepay.model.IAbacatePay;
import com.abacatepay.model.IAbacatePayBilling;
import com.abacatepay.model.billing.CreateBillingData;
import com.abacatepay.model.billing.CreateBillingResponse;
import com.abacatepay.model.billing.ListBillingResponse;
import feign.FeignException;
import feign.RequestInterceptor;
import com.abacatepay.services.IAbacatePayBilling;
import com.abacatepay.services.IAbacatePayCustomer;
import com.abacatepay.services.impl.AbacatePayBilling;
import com.abacatepay.services.impl.AbacatePayCustomer;

public class AbacatePay implements IAbacatePay {

private static final String API_BASE_URL = "https://api.abacatepay.com/v1";

private final AbacatePayClient client;
private final String apiKey;
private final String userAgent;

public AbacatePay(String apiKey) {
this.apiKey = apiKey;
this.client = AbacatePayClientFactory.create(API_BASE_URL, requestInterceptor());
if (apiKey == null || apiKey.isEmpty()) {
throw new IllegalArgumentException("API key not provided");
}

//TODO: Pegar a versão do SDK dinamicamente
this.userAgent = "Java SDK (1.0.0)";
}

private RequestInterceptor requestInterceptor() {
return template -> {
if (apiKey == null || apiKey.isEmpty()) {
throw new IllegalArgumentException("API key not provided");
}

template.header("Authorization", "Bearer " + apiKey);
template.header("Content-Type", "application/json");
template.header("User-Agent", userAgent);
};
String userAgent = "Java SDK (1.0.0)";
this.client = AbacatePayClientFactory.create(API_BASE_URL, apiKey, userAgent);
}

@Override
public IAbacatePayBilling billing() {
return new AbacatePayBilling(client);
}

class AbacatePayBilling implements IAbacatePayBilling {

@Override
public CreateBillingResponse create(CreateBillingData data) {
try {
return client.create(data);
} catch (IllegalArgumentException | FeignException e) {
return new CreateBillingResponse(e.getMessage());
}
}

@Override
public ListBillingResponse list() {
try {
return client.list();
} catch (IllegalArgumentException | FeignException e) {
return new ListBillingResponse(e.getMessage());
}
}
}

return new AbacatePayBilling();
@Override
public IAbacatePayCustomer customer() {
return new AbacatePayCustomer(client);
}
}
13 changes: 11 additions & 2 deletions src/main/java/com/abacatepay/clients/AbacatePayClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,22 @@
import com.abacatepay.model.billing.CreateBillingData;
import com.abacatepay.model.billing.CreateBillingResponse;
import com.abacatepay.model.billing.ListBillingResponse;
import com.abacatepay.model.customer.CreateCustomerResponse;
import com.abacatepay.model.customer.CustomerMetadata;
import com.abacatepay.model.customer.ListCustomerResponse;
import feign.RequestLine;

public interface AbacatePayClient {

@RequestLine("GET /billing/list")
ListBillingResponse list();
ListBillingResponse listBillings();

@RequestLine("POST /billing/create")
CreateBillingResponse create(CreateBillingData body);
CreateBillingResponse createBilling(CreateBillingData body);

@RequestLine("POST /customer/create")
CreateCustomerResponse createCustomer(CustomerMetadata body);

@RequestLine("GET /customer/list")
ListCustomerResponse listCustomers();
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,26 @@ public class AbacatePayClientFactory {

private static final ObjectMapper MAPPER = new ObjectMapper();

public static AbacatePayClient create(
String baseUrl, RequestInterceptor requestInterceptor
) {
static {
MAPPER.registerModule(new JavaTimeModule());
}

public static AbacatePayClient create(
String baseUrl, String apiKey, String userAgent
) {
return Feign.builder()
.decoder(new JacksonDecoder(MAPPER))
.encoder(new JacksonEncoder(MAPPER))
.errorDecoder(new CustomExceptionDecoder())
.requestInterceptor(requestInterceptor)
.requestInterceptor(requestInterceptor(apiKey, userAgent))
.target(AbacatePayClient.class, baseUrl);
}

private static RequestInterceptor requestInterceptor(String apiKey, String userAgent) {
return template -> {
template.header("Authorization", "Bearer " + apiKey);
template.header("Content-Type", "application/json");
template.header("User-Agent", userAgent);
};
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/abacatepay/model/IAbacatePay.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.abacatepay.model;

import com.abacatepay.services.IAbacatePayBilling;
import com.abacatepay.services.IAbacatePayCustomer;

public interface IAbacatePay {
IAbacatePayBilling billing();
IAbacatePayCustomer customer();
}
16 changes: 3 additions & 13 deletions src/main/java/com/abacatepay/model/billing/Billing.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.abacatepay.model.billing;

import com.abacatepay.model.customer.Customer;
import com.abacatepay.utils.DateUtils;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
Expand All @@ -20,16 +22,10 @@ public class Billing {
private List<Product> products;
private BillingKind frequency;

@JsonFormat(timezone = "America/Sao_Paulo", pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
@JsonFormat(timezone = DateUtils.DATE_TIMEZONE_DEFAULT, pattern = DateUtils.DATE_FORMAT_PATTERN)
private LocalDateTime nextBilling;

private Customer customer;

@JsonFormat(timezone = "America/Sao_Paulo", pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private LocalDateTime createdAt;

@JsonFormat(timezone = "America/Sao_Paulo", pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private LocalDateTime updatedAt;
}

@Data
Expand All @@ -38,9 +34,3 @@ class Product {
private Integer quantity;
}

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
class Customer {
private String id;
private CustomerMetadata metadata;
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
package com.abacatepay.model.billing;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class CreateBillingResponse {

@JsonInclude(JsonInclude.Include.NON_NULL)
private String error;

@JsonInclude(JsonInclude.Include.NON_NULL)
private Billing billing;
private Billing data;

public CreateBillingResponse(String error) {
this.error = error;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.abacatepay.model.billing;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.NoArgsConstructor;

Expand All @@ -9,11 +8,8 @@
@Data
@NoArgsConstructor
public class ListBillingResponse {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String error;

@JsonInclude(JsonInclude.Include.NON_NULL)
private List<Billing> billings;
private List<Billing> data;

public ListBillingResponse(String error) {
this.error = error;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.abacatepay.model.customer;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class CreateCustomerResponse {
private CustomerMetadata data;
private String error;

public CreateCustomerResponse(String error) {
this.error = error;
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/abacatepay/model/customer/Customer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.abacatepay.model.customer;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Customer {
private String id;
private CustomerMetadata metadata;
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.abacatepay.model.billing;
package com.abacatepay.model.customer;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class CustomerMetadata {
private String name;
private String cellphone;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.abacatepay.model.customer;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
public class ListCustomerResponse {
private String error;
private List<Customer> data;

public ListCustomerResponse(String error) {
this.error = error;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.abacatepay.model;
package com.abacatepay.services;

import com.abacatepay.model.billing.CreateBillingData;
import com.abacatepay.model.billing.CreateBillingResponse;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/com/abacatepay/services/IAbacatePayCustomer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.abacatepay.services;

import com.abacatepay.model.customer.CreateCustomerResponse;
import com.abacatepay.model.customer.CustomerMetadata;
import com.abacatepay.model.customer.ListCustomerResponse;

public interface IAbacatePayCustomer {
CreateCustomerResponse create(CustomerMetadata data);
ListCustomerResponse list();
}
33 changes: 33 additions & 0 deletions src/main/java/com/abacatepay/services/impl/AbacatePayBilling.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.abacatepay.services.impl;

import com.abacatepay.clients.AbacatePayClient;
import com.abacatepay.model.billing.CreateBillingData;
import com.abacatepay.model.billing.CreateBillingResponse;
import com.abacatepay.model.billing.ListBillingResponse;
import com.abacatepay.services.IAbacatePayBilling;
import feign.FeignException;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class AbacatePayBilling implements IAbacatePayBilling {

private final AbacatePayClient client;

@Override
public CreateBillingResponse create(CreateBillingData data) {
try {
return client.createBilling(data);
} catch (IllegalArgumentException | FeignException e) {
return new CreateBillingResponse(e.getMessage());
}
}

@Override
public ListBillingResponse list() {
try {
return client.listBillings();
} catch (IllegalArgumentException | FeignException e) {
return new ListBillingResponse(e.getMessage());
}
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/abacatepay/services/impl/AbacatePayCustomer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.abacatepay.services.impl;

import com.abacatepay.clients.AbacatePayClient;
import com.abacatepay.model.customer.CreateCustomerResponse;
import com.abacatepay.model.customer.CustomerMetadata;
import com.abacatepay.model.customer.ListCustomerResponse;
import com.abacatepay.services.IAbacatePayCustomer;
import feign.FeignException;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class AbacatePayCustomer implements IAbacatePayCustomer {

private final AbacatePayClient client;

@Override
public CreateCustomerResponse create(CustomerMetadata data) {
try {
return client.createCustomer(data);
} catch (IllegalArgumentException | FeignException e) {
return new CreateCustomerResponse(e.getMessage());
}
}

@Override
public ListCustomerResponse list() {
try {
return client.listCustomers();
} catch (IllegalArgumentException | FeignException e) {
return new ListCustomerResponse(e.getMessage());
}
}
}
6 changes: 6 additions & 0 deletions src/main/java/com/abacatepay/utils/DateUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.abacatepay.utils;

public class DateUtils {
public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
public static final String DATE_TIMEZONE_DEFAULT = "America/Sao_Paulo";
}
Loading