diff --git a/src/main/java/com/mercadopago/client/MercadoPagoClient.java b/src/main/java/com/mercadopago/client/MercadoPagoClient.java index d9487acd..03470cb1 100644 --- a/src/main/java/com/mercadopago/client/MercadoPagoClient.java +++ b/src/main/java/com/mercadopago/client/MercadoPagoClient.java @@ -1,5 +1,9 @@ package com.mercadopago.client; +import static java.util.Objects.nonNull; +import static org.apache.commons.collections.MapUtils.isNotEmpty; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + import com.google.gson.JsonObject; import com.mercadopago.MercadoPagoConfig; import com.mercadopago.core.MPRequestOptions; @@ -14,13 +18,14 @@ import com.mercadopago.net.UrlFormatter; import java.util.HashMap; import java.util.Map; -import java.util.Objects; /** Mercado Pago client class. */ public abstract class MercadoPagoClient { private static final String ACCEPT_HEADER_VALUE = "application/json"; private static final String CONTENT_TYPE_HEADER_VALUE = "application/json; charset=UTF-8"; + private static final String BEARER = "Bearer %s"; + private static final String OAUTH_TOKEN = "/oauth/token"; protected final MPHttpClient httpClient; @@ -51,18 +56,7 @@ public MercadoPagoClient(MPHttpClient httpClient) { * @throws MPException exception */ protected MPResponse send(MPRequest request) throws MPException, MPApiException { - String uri = UrlFormatter.format(request.getUri(), request.getQueryParams()); - - return httpClient.send( - MPRequest.builder() - .uri(uri) - .method(request.getMethod()) - .headers(addDefaultHeaders(request)) - .payload(request.getPayload()) - .connectionRequestTimeout(addConnectionRequestTimeout(request, null)) - .connectionTimeout(addConnectionTimeout(request, null)) - .socketTimeout(addSocketTimeout(request, null)) - .build()); + return this.send(request, null); } /** @@ -75,13 +69,19 @@ protected MPResponse send(MPRequest request) throws MPException, MPApiException */ protected MPResponse send(MPRequest request, MPRequestOptions requestOptions) throws MPException, MPApiException { - return this.send( - this.buildRequest( - request.getUri(), - request.getMethod(), - request.getPayload(), - request.getQueryParams(), - requestOptions)); + String uri = UrlFormatter.format(request.getUri(), request.getQueryParams()); + + return httpClient.send( + MPRequest.builder() + .uri(uri) + .accessToken(getAccessToken(requestOptions)) + .method(request.getMethod()) + .headers(addRequestHeaders(request, requestOptions)) + .payload(request.getPayload()) + .connectionRequestTimeout(addConnectionRequestTimeout(request, requestOptions)) + .connectionTimeout(addConnectionTimeout(request, requestOptions)) + .socketTimeout(addSocketTimeout(request, requestOptions)) + .build()); } /** @@ -150,7 +150,7 @@ protected MPResponse search( String path, MPSearchRequest searchRequest, MPRequestOptions requestOptions) throws MPException, MPApiException { Map queryParams = - Objects.nonNull(searchRequest) ? searchRequest.getParameters() : null; + nonNull(searchRequest) ? searchRequest.getParameters() : null; return this.send(path, HttpMethod.GET, null, queryParams, requestOptions); } @@ -212,11 +212,11 @@ private MPRequest buildRequest( } private int addSocketTimeout(MPRequest request, MPRequestOptions requestOptions) { - if (Objects.nonNull(requestOptions) && requestOptions.getSocketTimeout() > 0) { + if (nonNull(requestOptions) && requestOptions.getSocketTimeout() > 0) { return requestOptions.getSocketTimeout(); } - if (Objects.nonNull(request) && request.getSocketTimeout() > 0) { + if (nonNull(request) && request.getSocketTimeout() > 0) { return request.getSocketTimeout(); } @@ -224,11 +224,11 @@ private int addSocketTimeout(MPRequest request, MPRequestOptions requestOptions) } private int addConnectionTimeout(MPRequest request, MPRequestOptions requestOptions) { - if (Objects.nonNull(requestOptions) && requestOptions.getConnectionTimeout() > 0) { + if (nonNull(requestOptions) && requestOptions.getConnectionTimeout() > 0) { return requestOptions.getConnectionTimeout(); } - if (Objects.nonNull(request) && request.getConnectionTimeout() > 0) { + if (nonNull(request) && request.getConnectionTimeout() > 0) { return request.getConnectionTimeout(); } @@ -236,53 +236,81 @@ private int addConnectionTimeout(MPRequest request, MPRequestOptions requestOpti } private int addConnectionRequestTimeout(MPRequest request, MPRequestOptions requestOptions) { - if (Objects.nonNull(requestOptions) && requestOptions.getConnectionRequestTimeout() > 0) { + if (nonNull(requestOptions) && requestOptions.getConnectionRequestTimeout() > 0) { return requestOptions.getConnectionRequestTimeout(); } - if (Objects.nonNull(request) && request.getConnectionRequestTimeout() > 0) { + if (nonNull(request) && request.getConnectionRequestTimeout() > 0) { return request.getConnectionRequestTimeout(); } return MercadoPagoConfig.getConnectionRequestTimeout(); } - private Map addCustomHeaders(String uri, MPRequestOptions requestOptions) { - Map headers = new HashMap<>(); + private Map addRequestHeaders(MPRequest request, MPRequestOptions requestOptions) { - if (Objects.nonNull(requestOptions) && Objects.nonNull(requestOptions.getCustomHeaders())) { - for (Map.Entry entry : requestOptions.getCustomHeaders().entrySet()) { - headers.put(entry.getKey().toLowerCase(), entry.getValue()); - } + Map headers = + nonNull(request.getHeaders()) ? request.getHeaders() : new HashMap<>(); + + headers.putAll(addDefaultHeaders(request)); + + if (isNotBlank(MercadoPagoConfig.getCorporationId())) { + headers.put(Headers.CORPORATION_ID, MercadoPagoConfig.getCorporationId()); } - if (!uri.contains("/oauth/token")) { - headers.put(Headers.AUTHORIZATION, String.format("Bearer %s", getAccessToken(requestOptions))); + if (isNotBlank(MercadoPagoConfig.getIntegratorId())) { + headers.put(Headers.INTEGRATOR_ID, MercadoPagoConfig.getIntegratorId()); } + + if (isNotBlank(MercadoPagoConfig.getPlatformId())) { + headers.put(Headers.PLATFORM_ID, MercadoPagoConfig.getPlatformId()); + } + + if (nonNull(requestOptions) && isNotEmpty(requestOptions.getCustomHeaders()) ) { + for (Map.Entry header : requestOptions.getCustomHeaders().entrySet()) { + if (!headers.containsKey(header.getKey()) && !Headers.CONTENT_TYPE.equalsIgnoreCase(header.getKey())) { + headers.put(header.getKey().toLowerCase(), header.getValue()); + } + } + } + + headers.putAll(addCustomHeaders(request.getUri(), requestOptions)); return headers; } private Map addDefaultHeaders(MPRequest request) { - Map headers = - Objects.nonNull(request.getHeaders()) ? request.getHeaders() : new HashMap<>(); + Map headers = new HashMap<>(defaultHeaders); + if (shouldAddIdempotencyKey(request)) { + headers.put(Headers.IDEMPOTENCY_KEY, request.createIdempotencyKey()); + } - for (Map.Entry entry : defaultHeaders.entrySet()) { - headers.put(entry.getKey(), entry.getValue()); + if (!request.getUri().contains(OAUTH_TOKEN) && !headers.containsKey(Headers.AUTHORIZATION)) { + headers.put(Headers.AUTHORIZATION, String.format(BEARER, getAccessToken(null))); } + return headers; + } - if (shouldAddIdempotencyKey(request, headers)) { - headers.put(Headers.IDEMPOTENCY_KEY, request.createIdempotencyKey()); + private Map addCustomHeaders(String uri, MPRequestOptions requestOptions) { + Map headers = new HashMap<>(); + if (nonNull(requestOptions) && nonNull(requestOptions.getCustomHeaders())) { + for (Map.Entry entry : requestOptions.getCustomHeaders().entrySet()) { + headers.put(entry.getKey().toLowerCase(), entry.getValue()); + } } - if (!request.getUri().contains("/oauth/token") && !headers.containsKey(Headers.AUTHORIZATION)) { - headers.put(Headers.AUTHORIZATION, String.format("Bearer %s", getAccessToken(null))); + if (!uri.contains(OAUTH_TOKEN)) { + headers.put(Headers.AUTHORIZATION, String.format(BEARER, getAccessToken(requestOptions))); } return headers; } - private boolean shouldAddIdempotencyKey(MPRequest request, Map headers) { - boolean containsIdempotency = headers.containsKey(Headers.IDEMPOTENCY_KEY.toLowerCase()); + private boolean shouldAddIdempotencyKey(MPRequest request) { + + boolean containsIdempotency = false; + if (nonNull(request) && nonNull(request.getHeaders())) { + containsIdempotency = request.getHeaders().containsKey(Headers.IDEMPOTENCY_KEY.toLowerCase()); + } if (containsIdempotency) return false; @@ -292,8 +320,8 @@ private boolean shouldAddIdempotencyKey(MPRequest request, Map headers) { } private String getAccessToken(MPRequestOptions requestOptions) { - return Objects.nonNull(requestOptions) - && Objects.nonNull(requestOptions.getAccessToken()) + return nonNull(requestOptions) + && nonNull(requestOptions.getAccessToken()) && !requestOptions.getAccessToken().isEmpty() ? requestOptions.getAccessToken() : MercadoPagoConfig.getAccessToken(); diff --git a/src/test/java/com/mercadopago/client/preference/PreferenceClientIT.java b/src/test/java/com/mercadopago/client/preference/PreferenceClientIT.java index 47136559..f0f228e8 100644 --- a/src/test/java/com/mercadopago/client/preference/PreferenceClientIT.java +++ b/src/test/java/com/mercadopago/client/preference/PreferenceClientIT.java @@ -11,15 +11,20 @@ import com.mercadopago.client.common.AddressRequest; import com.mercadopago.client.common.IdentificationRequest; import com.mercadopago.client.common.PhoneRequest; +import com.mercadopago.core.MPRequestOptions; import com.mercadopago.exceptions.MPApiException; import com.mercadopago.exceptions.MPException; +import com.mercadopago.net.Headers; import com.mercadopago.net.MPElementsResourcesPage; import com.mercadopago.net.MPSearchRequest; import com.mercadopago.resources.preference.Preference; import com.mercadopago.resources.preference.PreferenceSearch; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; import org.junit.jupiter.api.Test; /** PreferenceClientIT class. */ @@ -82,7 +87,16 @@ void createSuccess() { void createWithRequestOptionsSuccess() { try { PreferenceRequest preferenceRequest = buildPreferenceRequest(); - Preference preference = client.create(preferenceRequest, buildRequestOptions()); + + String idempotency = UUID.randomUUID().toString(); + Map idempotencyKey = new HashMap<>(); + idempotencyKey.put(Headers.IDEMPOTENCY_KEY, idempotency); + MPRequestOptions mpRequestOptions = MPRequestOptions + .builder() + .customHeaders(idempotencyKey) + .build(); + + Preference preference = client.create(preferenceRequest, mpRequestOptions); assertNotNull(preference.getResponse()); assertEquals(CREATED, preference.getResponse().getStatusCode());