diff --git a/README.md b/README.md index cf33a41..8820ddf 100644 --- a/README.md +++ b/README.md @@ -520,3 +520,17 @@ N] [Generate IBAN API](https://developer.mastercard.com/send-cross-border/docume - OI calls the service to generate the IBAN but the country is not entered in acceptable format, use case 14 - OI calls the service to generate the IBAN but the Bank Identifier is incorrect, use case 15 - The above use cases just shows two the examples of error handling + +O] [Endpoint Guide API](https://developer.mastercard.com/cross-border-services/documentation/api-ref/endpoint-guide-adapter_api/): + +> Case 1: **Test Endpoint Guide API for TEG data with encryption** +- OI can call this method to get details of TEG data for a specific corridor +- In this use case, we need to pass payment type, destination payment instrument, destination country and destination currency as request headers. A successful response would result with TEG data. + +> Case 2: **Error scenario** +- OI calls the service to get TEG data but the corridor details are incorrect +- API results in error response as resource unknown + +> Case 3: **Test Endpoint Guide API for BEG data with encryption** +- OI can call this method to get details of TEG data for a specific corridor +- In this use case, we need to pass payment type, destination payment instrument, destination country and destination currency as request headers. A successful response would result with BEG data. diff --git a/src/main/java/com/mastercard/crossborder/api/config/DetailsDeserializer.java b/src/main/java/com/mastercard/crossborder/api/config/DetailsDeserializer.java new file mode 100644 index 0000000..659a2f4 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/config/DetailsDeserializer.java @@ -0,0 +1,41 @@ +package com.mastercard.crossborder.api.config; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.mastercard.crossborder.api.rest.response.Detail; +import com.mastercard.crossborder.api.rest.response.Details; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DetailsDeserializer extends JsonDeserializer
{ + @Override + public Details deserialize(JsonParser p, DeserializationContext ctxt) + throws IOException, JsonProcessingException { + JsonNode node = p.getCodec().readTree(p); + + Details details = new Details(); + + if (node.isArray()) { + // Deserialize as a list of Detail objects + List detailList = new ArrayList<>(); + for (JsonNode detailNode : node) { + Detail detail = p.getCodec().treeToValue(detailNode, Detail.class); + detailList.add(detail); + } + details.setDetails(detailList); + } else if (node.isObject()) { + // Deserialize as a single Detail object + Detail detail = p.getCodec().treeToValue(node, Detail.class); + details.setDetails(Collections.singletonList(detail)); + } + + return details; + } +} diff --git a/src/main/java/com/mastercard/crossborder/api/config/JacksonConfig.java b/src/main/java/com/mastercard/crossborder/api/config/JacksonConfig.java new file mode 100644 index 0000000..9ea7eee --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/config/JacksonConfig.java @@ -0,0 +1,21 @@ +package com.mastercard.crossborder.api.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.mastercard.crossborder.api.rest.response.Details; +import org.springframework.context.annotation.Primary; + +@Configuration +public class JacksonConfig { + @Bean + @Primary + public ObjectMapper objectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + SimpleModule module = new SimpleModule(); + module.addDeserializer(Details.class, new DetailsDeserializer()); + objectMapper.registerModule(module); + return objectMapper; + } +} diff --git a/src/main/java/com/mastercard/crossborder/api/constants/MastercardHttpHeaders.java b/src/main/java/com/mastercard/crossborder/api/constants/MastercardHttpHeaders.java index af5ebb8..8b7e10b 100644 --- a/src/main/java/com/mastercard/crossborder/api/constants/MastercardHttpHeaders.java +++ b/src/main/java/com/mastercard/crossborder/api/constants/MastercardHttpHeaders.java @@ -1,7 +1,10 @@ package com.mastercard.crossborder.api.constants; public enum MastercardHttpHeaders { - ENCRYPTED_HEADER("x-encrypted"); + ENCRYPTED_HEADER("x-encrypted"), + PARTNER_REF_ID("Partner-Ref-Id"), + SPECIFICATION_TYPE("Specification-Type"); + private final String text; MastercardHttpHeaders(String text) { diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/EndpointGuideAdapterApi.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/EndpointGuideAdapterApi.java new file mode 100644 index 0000000..302c46e --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/EndpointGuideAdapterApi.java @@ -0,0 +1,33 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api; + +import com.mastercard.crossborder.api.exception.ServiceException; +import com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.EndpointGuideResponse; +import com.mastercard.crossborder.api.service.RestClientService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +@Component +public class EndpointGuideAdapterApi { + @Autowired + RestClientService restClientService; // NOSONAR + private static final Logger logger = LoggerFactory.getLogger(EndpointGuideAdapterApi.class); + public static final String ENDPOINT_GUIDE_ADAPTER_URL="crossborder/endpoint-guide/specifications?payment_type={paymentType}&destination_payment_instrument={destinationPaymentInstrument}&destination_country={destinationCountry}&destination_currency={destinationCurrency}"; + + public List getEndpointWithEncryption(HttpHeaders headers, Map requestParams) throws ServiceException { + logger.info("Calling Endpoint guide adapter api with encryption"); + return (List) restClientService.serviceEncryption(ENDPOINT_GUIDE_ADAPTER_URL,headers, HttpMethod.GET, requestParams,null, List.class, true, EndpointGuideResponse.class); + } + + public List getEndpoint(HttpHeaders headers, Map requestParams) throws ServiceException { + logger.info("Calling Endpoint guide adapter api "); + return (List) restClientService.service(ENDPOINT_GUIDE_ADAPTER_URL,headers, HttpMethod.GET, requestParams,null, List.class, true,EndpointGuideResponse.class); + } + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/BaseResponse.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/BaseResponse.java new file mode 100644 index 0000000..681bc4d --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/BaseResponse.java @@ -0,0 +1,15 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Getter; +import lombok.Setter; +import org.springframework.http.HttpStatus; + +@Getter +@Setter +public class BaseResponse { + @JsonIgnore + private String correlationId; + @JsonIgnore + private HttpStatus responseCode; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/DestinationPaymentInstrument.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/DestinationPaymentInstrument.java new file mode 100644 index 0000000..7113861 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/DestinationPaymentInstrument.java @@ -0,0 +1,5 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response; + +public enum DestinationPaymentInstrument { + BANK, CASH, CARD, EWALLET, MWALLET, BANKWIRE +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/EndpointGuideResponse.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/EndpointGuideResponse.java new file mode 100644 index 0000000..6bef587 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/EndpointGuideResponse.java @@ -0,0 +1,28 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi.BusinessBeg; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.SneakyThrows; + + +@EqualsAndHashCode(callSuper = true) +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class EndpointGuideResponse extends BaseResponse { + private PaymentType paymentType; + private String destinationCountry; + private String destinationCurrency; + private DestinationPaymentInstrument destinationPaymentInstrument; + private Technical technical; + private BusinessBeg business; + + @SneakyThrows + @Override + public String toString() { + return new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY).writeValueAsString(this); + } +} + diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/Field.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/Field.java new file mode 100644 index 0000000..873519b --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/Field.java @@ -0,0 +1,132 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + + + +@Data +@JsonInclude(JsonInclude.Include.NON_DEFAULT) +public class Field { + private String fieldName; + private String mandatory; + private String validationPattern; + private String additionalFieldId; + private String additionalFieldName; + private String specialNotes; + private Date effectiveDate; + private Date lastUpdatedTime; + private String lastUpdateComments; + private List supportedValues; + + private Field(FieldBuilder fieldBuilder) { + this.additionalFieldId=fieldBuilder.additionalFieldId; + this.additionalFieldName=fieldBuilder.additionalFieldName; + this.fieldName=fieldBuilder.fieldName; + this.mandatory=fieldBuilder.mandatory; + this.validationPattern=fieldBuilder.validationPattern; + this.specialNotes=fieldBuilder.specialNotes; + this.effectiveDate = fieldBuilder.effectiveDate; + this.lastUpdatedTime = fieldBuilder.lastUpdatedTime; + this.lastUpdateComments = fieldBuilder.lastUpdateComments; + this.supportedValues=fieldBuilder.supportedValues; + + } + + public Field() { + + } + + public String getSpecialNotes() { + specialNotes= specialNotes!=null?specialNotes. + replaceAll("(?i)\\[\\s*(Payment|Quote)\\s+(Req|Resp)\\s*-\\s*[MO]\\s*\\]\\s*", "") + .replaceAll("\\s+", " ") // Replace multiple spaces/newlines with a single space + .trim():null; + specialNotes= specialNotes==null?"":specialNotes; + if (specialNotes.isEmpty()){ + specialNotes=null; + } + return specialNotes; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Field field = (Field) o; + return Objects.equals(fieldName, field.fieldName) && Objects.equals(additionalFieldId, field.additionalFieldId); + } + + @Override + public int hashCode() { + return Objects.hash(fieldName, additionalFieldId); + } + + public static class FieldBuilder { + private String fieldName; + private String mandatory; + private String validationPattern; + private String additionalFieldId; + private String additionalFieldName; + private String specialNotes; + private Date effectiveDate; + private Date lastUpdatedTime; + private String lastUpdateComments; + private List supportedValues; + + public FieldBuilder setMandatory(String mandatory) { + this.mandatory = mandatory; + return this; + } + + public FieldBuilder setFieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } + + public FieldBuilder setValidationPattern(String validationPattern) { + this.validationPattern = validationPattern; + return this; + } + + public FieldBuilder setAdditionalFieldId(String additionalFieldId) { + this.additionalFieldId = additionalFieldId; + return this; + } + + public FieldBuilder setAdditionalFieldName(String additionalFieldName) { + this.additionalFieldName = additionalFieldName; + return this; + } + + public FieldBuilder setSpecialNotes(String specialNotes) { + this.specialNotes = specialNotes; + return this; + } + public void setEffectiveDate(Date effectiveDate) { + this.effectiveDate = effectiveDate; + } + public void setLastUpdatedTime(Date lastUpdatedTime) { + this.lastUpdatedTime = lastUpdatedTime; + } + + public void setLastUpdateComments(String lastUpdateComments) { + this.lastUpdateComments = lastUpdateComments; + } + + public FieldBuilder setSupportedValues(List supportedValues) { + this.supportedValues = supportedValues; + return this; + } + + public Field build() { + return new Field(this); + } + } +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/PaymentType.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/PaymentType.java new file mode 100644 index 0000000..50af8c3 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/PaymentType.java @@ -0,0 +1,5 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response; + +public enum PaymentType { + B2P, B2B, G2P, P2P, P2B +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/SupportedValues.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/SupportedValues.java new file mode 100644 index 0000000..c06de7a --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/SupportedValues.java @@ -0,0 +1,12 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class SupportedValues { + + private String id; + private String name; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/Technical.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/Technical.java new file mode 100644 index 0000000..71c7931 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/Technical.java @@ -0,0 +1,13 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.List; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class Technical { + private String specialNotes; + private String lastUpdatedTime; + private List fields; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/AmountDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/AmountDTO.java new file mode 100644 index 0000000..db81bb1 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/AmountDTO.java @@ -0,0 +1,11 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import lombok.Data; +import org.springframework.stereotype.Component; + +@Data +@Component +public class AmountDTO { + private double value; + private String currency; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BegFieldDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BegFieldDTO.java new file mode 100644 index 0000000..612b7ac --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BegFieldDTO.java @@ -0,0 +1,26 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class BegFieldDTO { + + private String begFieldMappingId; + private String endPointId; + private String region; + private Boolean recipientNotification; + private String channelReach; + private String deliveryTime; + private String notes; + private String country; + private String channels; + private String onTheFlyWalletCreation; + private String registrationRequirements; + private Boolean isInternal; + //Need to do its mapping from the RSD API Response + private String serviceType; + private String paymentType; + private String destinationCurrency; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BrandDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BrandDTO.java new file mode 100644 index 0000000..ae9cfc0 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BrandDTO.java @@ -0,0 +1,18 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@NoArgsConstructor +public class BrandDTO { + private String brandId; + private String endpointId; + private String brandName; + + public BrandDTO(String brandName) { + this.brandName = brandName; + } +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/Business.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/Business.java new file mode 100644 index 0000000..122e9f8 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/Business.java @@ -0,0 +1,49 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class Business { + + private BegFieldDTO begField; + private String endPointId; + private String status; + private List supportedCustomerType; + private List brand; + private List documentation; + private List preApprovedRequirement; + private CashPickupDTO cashPickup; + private List clearingHouseDetail; + private List clearingPaymentInFormation; + private List flowType; + private ReceiveAmountLimitDTO receiveAmountLimit; + private ReceivingInstitutionDTO receivingInstitution; + private List restrictedFlow; + private SendAmountLimitDTO sendAmountLimit; + private List supportedFxModel; + + @Override + public String toString() { + return "Business{" + + "begField=" + begField + + ", supportedCustomerType=" + supportedCustomerType + + ", brand=" + brand + + ", documentation=" + documentation + + ", preApprovedRequirement=" + preApprovedRequirement + + ", cashPickup=" + cashPickup + + ", clearingHouseDetail=" + clearingHouseDetail + + ", clearingPaymentInFormation=" + clearingPaymentInFormation + + ", flowType=" + flowType + + ", receiveAmountLimit=" + receiveAmountLimit + + ", receivingInstitution=" + receivingInstitution + + ", restrictedFlow=" + restrictedFlow + + ", sendAmountLimit=" + sendAmountLimit + + ", supportedFxModel=" + supportedFxModel + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BusinessBeg.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BusinessBeg.java new file mode 100644 index 0000000..2dc4824 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BusinessBeg.java @@ -0,0 +1,37 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class BusinessBeg { + + private String region; + private List supportedCustomerTypes; + private String supportedFxModel; + private Boolean recipientNotification; + private List flowTypes; + private String channelReach; + private String deliveryTime; + private String notes; + private List brands; + private String channels; + private String onFlyWalletCreation; + private List restrictedFlows; + private String registrationRequirements; + private ClearingPaymentInformationDTO clearingPaymentInformation; + @JsonProperty(value="cashPickupInformation", access = JsonProperty.Access.WRITE_ONLY) + private CashPickupDTO cashPickup; + private ReceivingInstitutionDTO receivingInstitution; + private LimitDTO sendTransactionAmountLimit; + private LimitDTO receiveTransactionAmountLimit; + @JsonProperty(value = "clearingSystemDetails", access = JsonProperty.Access.WRITE_ONLY) + private List clearingHouseDetails; + private List documentations; + private List preApprovedRequirements; + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BusinessNew.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BusinessNew.java new file mode 100644 index 0000000..832db53 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/BusinessNew.java @@ -0,0 +1,34 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class BusinessNew { + + private String region; + private List supportedCustomerTypes; + private String supportedFxModel; + private Boolean recipientNotification; + private List flowTypes; + private String channelReach; + private String deliveryTime; + private String notes; + private List brands; + private String channels; + private String onFlyWalletCreation; + private List restrictedFlows; + private String registrationRequirements; + private ClearingPaymentInformationDTO clearingPaymentInformation; + private CashPickupDTO cashPickup; + private ReceivingInstitutionDTO receivingInstitution; + private LimitDTO sendAmountLimit; + private LimitDTO receiveAmountLimit; + private List clearingHouseDetails; + private List documentations; + private List preApprovedRequirements; + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/CashPickupDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/CashPickupDTO.java new file mode 100644 index 0000000..732219f --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/CashPickupDTO.java @@ -0,0 +1,16 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class CashPickupDTO { + private String cashPickupId; + private String endpointId; + private String payoutCapability; + private String availability; + private String maxTimeAllowed; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ClearingHouseDetailDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ClearingHouseDetailDTO.java new file mode 100644 index 0000000..0769ebd --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ClearingHouseDetailDTO.java @@ -0,0 +1,20 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class ClearingHouseDetailDTO { + private String clearingHouseDetailId; + private String endpointId; + private String name; + private String cutoffTime; + private String processingStartTime; + private List processingDaysOfWeeks; + private AmountDTO maxLimit; + private AmountDTO minLimit; + private String deliveryTime; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ClearingPaymentInformationDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ClearingPaymentInformationDTO.java new file mode 100644 index 0000000..28d1589 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ClearingPaymentInformationDTO.java @@ -0,0 +1,16 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class ClearingPaymentInformationDTO { + + private String clearingPaymentInformationId; + private String endpointId; + private Boolean remitterName; + private Boolean paymentInformation; + private int characterLimit; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/DocumentationDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/DocumentationDTO.java new file mode 100644 index 0000000..700649d --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/DocumentationDTO.java @@ -0,0 +1,16 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class DocumentationDTO { + private String documentationId; + private String endpointId; + private String documentationType; + private Boolean isRequired; + private String process; + private String requirementsThreshold; + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/FlowTypeDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/FlowTypeDTO.java new file mode 100644 index 0000000..828e73c --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/FlowTypeDTO.java @@ -0,0 +1,17 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class FlowTypeDTO { + private String flowTypeId; + private String endpointId; + private String flowtypeName; + + public Boolean getIsResellerFlowSupported() { + return "Reseller flows".equalsIgnoreCase(flowtypeName); + } +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/LimitDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/LimitDTO.java new file mode 100644 index 0000000..8659707 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/LimitDTO.java @@ -0,0 +1,11 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class LimitDTO { + private AmountDTO minLimit; + private AmountDTO maxLimit; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/PreApprovedRequirementDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/PreApprovedRequirementDTO.java new file mode 100644 index 0000000..4f0fcb8 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/PreApprovedRequirementDTO.java @@ -0,0 +1,19 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class PreApprovedRequirementDTO { + private String preApprovedRequirementId; + private String endpointId; + private String requirementType; + private Boolean isRequired; + private String requestedInformation; + private String notes; + private String averageRSPResponseTime; + +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ReceiveAmountLimitDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ReceiveAmountLimitDTO.java new file mode 100644 index 0000000..ef5dbfc --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ReceiveAmountLimitDTO.java @@ -0,0 +1,18 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class ReceiveAmountLimitDTO { + private String receiveAmountLimitId; + private String endpointId; + private BigDecimal minAmount; + private BigDecimal maxAmount; + private String currency; + private String limitType; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ReceivingInstitutionDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ReceivingInstitutionDTO.java new file mode 100644 index 0000000..8a0e6af --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/ReceivingInstitutionDTO.java @@ -0,0 +1,15 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class ReceivingInstitutionDTO { + private String receivingInstitutionId; + private String endpointId; + private String code; + private String name; + private String preferredRSPOwner; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/RestrictedFlowDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/RestrictedFlowDTO.java new file mode 100644 index 0000000..5e0883a --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/RestrictedFlowDTO.java @@ -0,0 +1,13 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class RestrictedFlowDTO { + private String restrictedFlowId; + private String endpointId; + private String restrictedFlowName; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SendAmountLimitDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SendAmountLimitDTO.java new file mode 100644 index 0000000..19808a7 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SendAmountLimitDTO.java @@ -0,0 +1,18 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class SendAmountLimitDTO { + private String sendAmountLimitId; + private String endpointId; + private BigDecimal minAmount; + private BigDecimal maxAmount; + private String currency; + private String limitType; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SupportedCustomerTypeDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SupportedCustomerTypeDTO.java new file mode 100644 index 0000000..f9604a9 --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SupportedCustomerTypeDTO.java @@ -0,0 +1,14 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class SupportedCustomerTypeDTO { + private String supportedCustomerTypeId; + private String endpointId; + private String supportedCustomer; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SupportedFxModelDTO.java b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SupportedFxModelDTO.java new file mode 100644 index 0000000..f95b16e --- /dev/null +++ b/src/main/java/com/mastercard/crossborder/api/rest/endpoint/guide/adapter/api/response/begapi/SupportedFxModelDTO.java @@ -0,0 +1,14 @@ +package com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.begapi; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + + +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) + +public class SupportedFxModelDTO { + private String supportedFxModelId; + private String endpointId; + private String supportedFxModelName; +} diff --git a/src/main/java/com/mastercard/crossborder/api/rest/response/Detail.java b/src/main/java/com/mastercard/crossborder/api/rest/response/Detail.java index f1488dd..819660b 100644 --- a/src/main/java/com/mastercard/crossborder/api/rest/response/Detail.java +++ b/src/main/java/com/mastercard/crossborder/api/rest/response/Detail.java @@ -1,6 +1,7 @@ package com.mastercard.crossborder.api.rest.response; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.ToString; @@ -13,6 +14,7 @@ propOrder = {"name", "value"} ) @ToString +@JsonIgnoreProperties(ignoreUnknown = true) public class Detail implements Serializable { private static final long serialVersionUID = 1L; private String name = null; diff --git a/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java b/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java index 59ffa83..1140abb 100644 --- a/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java +++ b/src/main/java/com/mastercard/crossborder/api/service/impl/RestClientServiceImpl.java @@ -14,6 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -25,7 +26,7 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import org.w3c.dom.Document; -import java.io.IOException; + import javax.ws.rs.core.MediaType; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -54,6 +55,8 @@ import java.util.Map; import static com.mastercard.crossborder.api.constants.MastercardHttpHeaders.ENCRYPTED_HEADER; +import static com.mastercard.crossborder.api.constants.MastercardHttpHeaders.PARTNER_REF_ID; +import static com.mastercard.crossborder.api.constants.MastercardHttpHeaders.SPECIFICATION_TYPE; @Component public class RestClientServiceImpl implements RestClientService { @@ -61,19 +64,18 @@ public class RestClientServiceImpl implements RestClientService { private static final Logger logger = LoggerFactory.getLogger(RestClientServiceImpl.class); private DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); private TransformerFactory tf = TransformerFactory.newInstance(); - private ObjectMapper mapper = new ObjectMapper(); - + private ObjectMapper mapper; private MastercardApiConfig mastercardApiConfig; @Autowired - public RestClientServiceImpl(MastercardApiConfig mastercardApiConfig) { - this.mastercardApiConfig = mastercardApiConfig; - } + public RestClientServiceImpl(@Qualifier("objectMapper") ObjectMapper mapper, MastercardApiConfig mastercardApiConfig) { + this.mapper = mapper; + this.mastercardApiConfig = mastercardApiConfig;} @Override - public T service(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams,Object request, Class responseClass,boolean isListResponse,Class listElementClass) throws ServiceException{ + public T service(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams, Object request, Class responseClass, boolean isListResponse, Class listElementClass) throws ServiceException { - String url = buildURL(baseURL, requestParams); + String url = buildURL(baseURL, requestParams); String requestStr = convertToString(headers, request); @@ -81,7 +83,7 @@ public T service(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map String oAuthString = authenticate(url, httpMethod, requestStr); /*Build requestEntity */ - HttpEntity> requestEntity = generateRequestEntity(Boolean.FALSE , headers, requestStr, oAuthString); + HttpEntity> requestEntity = generateRequestEntity(Boolean.FALSE, headers, requestStr, oAuthString); logger.info("Request payload : {}", requestEntity); /*make API call*/ @@ -89,30 +91,30 @@ public T service(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map T response = callCrossBorderAPI(url, httpMethod, requestParams, requestEntity, responseClass); String responseLog = convertToString(headers, response); logger.info("Response payload : {}", responseLog); - if(isListResponse && listElementClass!=null) { - return (T) mapAccountValues(responseLog,listElementClass,headers,responseClass); + if (isListResponse && listElementClass != null) { + return (T) mapAccountValues(responseLog, listElementClass, headers, responseClass); } return response; - }catch (HttpClientErrorException | HttpServerErrorException he){ + } catch (HttpClientErrorException | HttpServerErrorException he) { T errors = getContentFromString(headers, he.getResponseBodyAsString(), (Class) Errors.class); - throw new ServiceException(he.getResponseBodyAsString(), (Errors)errors ); + throw new ServiceException(he.getResponseBodyAsString(), (Errors) errors); } } @Override - public T service(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams,Object request, Class responseClass) throws ServiceException{ - return service(baseURL,headers,httpMethod,requestParams,request,responseClass,false,null); + public T service(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams, Object request, Class responseClass) throws ServiceException { + return service(baseURL, headers, httpMethod, requestParams, request, responseClass, false, null); } @Override - public T serviceEncryption(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams, Object request, Class responseClass) throws ServiceException{ - return serviceEncryption(baseURL,headers,httpMethod,requestParams,request,responseClass,false,null); - } + public T serviceEncryption(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams, Object request, Class responseClass) throws ServiceException { + return serviceEncryption(baseURL, headers, httpMethod, requestParams, request, responseClass, false, null); + } @Override - public T serviceEncryption(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams, Object request, Class responseClass,boolean isListResponse,Class listElementClass) throws ServiceException{ + public T serviceEncryption(String baseURL, HttpHeaders headers, HttpMethod httpMethod, Map requestParams, Object request, Class responseClass, boolean isListResponse, Class listElementClass) throws ServiceException { - if(mastercardApiConfig.getRunWithEncryptedPayload().booleanValue()) { + if (mastercardApiConfig.getRunWithEncryptedPayload().booleanValue()) { String url = buildURL(baseURL, requestParams); @@ -128,29 +130,29 @@ public T serviceEncryption(String baseURL, HttpHeaders headers, HttpMethod httpM HttpEntity> requestEntity = generateRequestEntity(Boolean.TRUE, headers, requestBody, oAuthString); logger.info("Encrypted Request payload : {}", requestEntity); - try{ + try { T response = callCrossBorderAPI(url, httpMethod, requestParams, requestEntity, (Class) EncryptedPayload.class); /*Decrypt the response payload and return*/ if (null != response) { - + logger.info("Encrypted Response payload : {}", ((EncryptedPayload) response).getData()); - String responseStr = EncryptionUtils.jweDecrypt(((EncryptedPayload) response).getData(), mastercardApiConfig.getDecryptionKeyFile(),mastercardApiConfig.getDecryptionKeyAlias(),mastercardApiConfig.getDecryptionKeyPassword()); - logger.info("Decrypted Response payload: {}:",responseStr); - if(isListResponse && listElementClass!=null) { - return (T) mapAccountValues(responseStr,listElementClass,requestEntity.getHeaders(),responseClass); + String responseStr = EncryptionUtils.jweDecrypt(((EncryptedPayload) response).getData(), mastercardApiConfig.getDecryptionKeyFile(), mastercardApiConfig.getDecryptionKeyAlias(), mastercardApiConfig.getDecryptionKeyPassword()); + if (isListResponse && listElementClass != null) { + return (T) mapAccountValues(responseStr, listElementClass, requestEntity.getHeaders(), responseClass); } return getContentFromString(headers, responseStr, responseClass); } - }catch (HttpClientErrorException he){ + } catch (HttpClientErrorException he) { T errors = getContentFromString(headers, he.getResponseBodyAsString(), (Class) Errors.class); - throw new ServiceException(he.getResponseBodyAsString(), (Errors)errors ); + throw new ServiceException(he.getResponseBodyAsString(), (Errors) errors); } } return null; } - private String buildURL(String baseURL, Map requestParams){ - String builtURL = UriComponentsBuilder.fromHttpUrl( mastercardApiConfig.getEndPointURL() + "/" + baseURL).uriVariables(requestParams).build().toUriString(); + private String buildURL(String baseURL, Map requestParams) { + + String builtURL = UriComponentsBuilder.fromHttpUrl(mastercardApiConfig.getEndPointURL() + "/" + baseURL).uriVariables(requestParams).build().toUriString(); logger.info("requestURL : {}", builtURL); return builtURL; } @@ -160,7 +162,8 @@ private String authenticate(String url, HttpMethod httpMethod, String requestStr try { PrivateKey privateKey = AuthenticationUtils.loadSigningKey(mastercardApiConfig.getP12File().getFile().getAbsolutePath(), mastercardApiConfig.getKeyAlias(), mastercardApiConfig.getKeyPassword()); return OAuth.getAuthorizationHeader(new URI(url), httpMethod.name(), requestStr, StandardCharsets.UTF_8, mastercardApiConfig.getConsumerKey(), privateKey); - }catch (IOException | KeyStoreException | CertificateException | NoSuchProviderException | NoSuchAlgorithmException | URISyntaxException | UnrecoverableKeyException e){ + } catch (IOException | KeyStoreException | CertificateException | NoSuchProviderException | + NoSuchAlgorithmException | URISyntaxException | UnrecoverableKeyException e) { throw new ServiceException(e.getMessage()); } @@ -168,41 +171,46 @@ private String authenticate(String url, HttpMethod httpMethod, String requestStr private HttpEntity> generateRequestEntity(Boolean encrypt, HttpHeaders headers, String requestStr, String oAuthString) { HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.add("x-mc-routing","nextgen-apigw"); + httpHeaders.add("x-mc-routing", "nextgen-apigw"); httpHeaders.add(HttpHeaders.AUTHORIZATION, oAuthString); //if content type is not already added, use application_xml - if(headers.getContentType() !=null && headers.containsKey(HttpHeaders.CONTENT_TYPE)) + if (headers.getContentType() != null && headers.containsKey(HttpHeaders.CONTENT_TYPE)) httpHeaders.add(HttpHeaders.CONTENT_TYPE, headers.getContentType().toString()); // NOSONAR else httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML); + if (headers.containsKey(PARTNER_REF_ID.toString())) + httpHeaders.add(PARTNER_REF_ID.toString(), headers.getFirst(PARTNER_REF_ID.toString())); + headers.getAccept(); + if (headers.containsKey(HttpHeaders.ACCEPT)) + httpHeaders.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); + if(headers.containsKey(SPECIFICATION_TYPE.toString())) + httpHeaders.add(SPECIFICATION_TYPE.toString(), headers.getFirst(SPECIFICATION_TYPE.toString())); //Below header need to be added to process the encryption request if (processForEncryption(encrypt)) - { httpHeaders.add(ENCRYPTED_HEADER.toString(), "true"); - } + return (HttpEntity>) new HttpEntity(requestStr, httpHeaders); // NOSONAR } - private String getEncryptedRequestBody(HttpHeaders headers, String requestStr)throws ServiceException { - String encryptedStr ; - if (null != requestStr && processForEncryption(Boolean.TRUE) && headers.containsKey(HttpHeaders.CONTENT_TYPE) ) - { + private String getEncryptedRequestBody(HttpHeaders headers, String requestStr) throws ServiceException { + String encryptedStr; + if (null != requestStr && processForEncryption(Boolean.TRUE) && headers.containsKey(HttpHeaders.CONTENT_TYPE)) { if (headers.getContentType() != null && MediaType.APPLICATION_XML.equals(headers.getContentType().toString())) { // NOSONAR encryptedStr = EncryptionUtils.jweEncrypt(requestStr, mastercardApiConfig.getCertificateFile(), mastercardApiConfig.getEncryptionFP(), MediaType.APPLICATION_XML); return "\n" + "" + encryptedStr + ""; } - if(headers.getContentType() != null && MediaType.APPLICATION_JSON.equals(headers.getContentType().toString())) { // NOSONAR + if (headers.getContentType() != null && MediaType.APPLICATION_JSON.equals(headers.getContentType().toString())) { // NOSONAR encryptedStr = EncryptionUtils.jweEncrypt(requestStr, mastercardApiConfig.getCertificateFile(), mastercardApiConfig.getEncryptionFP(), MediaType.APPLICATION_JSON); - return "{\"encrypted_payload\":{\"data\":"+"\"" + encryptedStr +"\""+"}}"; + return "{\"encrypted_payload\":{\"data\":" + "\"" + encryptedStr + "\"" + "}}"; } } return null; } - private T callCrossBorderAPI(String url, HttpMethod httpMethod, Map requestParams, HttpEntity> requestEntity, Class responseClass) { + private T callCrossBorderAPI(String url, HttpMethod httpMethod, Map requestParams, HttpEntity> requestEntity, Class responseClass) { RestTemplate restTemplate = new RestTemplate(); T response; switch (httpMethod) { @@ -221,44 +229,42 @@ private T callCrossBorderAPI(String url, HttpMethod httpMethod, Map responseClass) throws ServiceException { - if( headers.getContentType() != null && MediaType.APPLICATION_XML.equals(headers.getContentType().toString())){ // NOSONAR + if (headers.getContentType() != null && MediaType.APPLICATION_XML.equals(headers.getContentType().toString())) { // NOSONAR return convertStringToXMLDocument(responseBodyAsString, responseClass); } - if( headers.getContentType() != null && MediaType.APPLICATION_JSON.equals(headers.getContentType().toString())){ // NOSONAR - return convertStringToJSON(responseBodyAsString,responseClass); + if (headers.getContentType() != null && MediaType.APPLICATION_JSON.equals(headers.getContentType().toString())) { // NOSONAR + return convertStringToJSON(responseBodyAsString, responseClass); } return null; } - private T convertStringToXMLDocument( String xmlString, Class responseClass) throws ServiceException - { + private T convertStringToXMLDocument(String xmlString, Class responseClass) throws ServiceException { try { JAXBContext jaxbContext = JAXBContext.newInstance(responseClass); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); return (T) jaxbUnmarshaller.unmarshal(new StringReader(xmlString)); - }catch(JAXBException e) { + } catch (JAXBException e) { throw new ServiceException(e.getMessage()); } } - private T convertStringToJSON( String jsonString, Class responseClass) throws ServiceException - { + + private T convertStringToJSON(String jsonString, Class responseClass) throws ServiceException { try { return mapper.readValue(jsonString, responseClass); - } - catch ( IOException e){ + } catch (IOException e) { throw new ServiceException(e.getMessage()); } } private String convertToString(HttpHeaders headers, Object data) throws ServiceException { - if(data != null){ + if (data != null) { if (headers.getContentType() != null && MediaType.APPLICATION_JSON.equals(headers.getContentType().toString())) { // NOSONAR return convertJsonToString(data); } @@ -268,13 +274,14 @@ private String convertToString(HttpHeaders headers, Object data) throws ServiceE } return null; } + private String convertDocumentToString(Object obj) throws ServiceException { - if(null == obj) + if (null == obj) return ""; Document document = createXMLDocument(obj); Transformer transformer; - if(null != document ) { + if (null != document) { try { transformer = tf.newTransformer(); StringWriter writer = new StringWriter(); @@ -287,7 +294,7 @@ private String convertDocumentToString(Object obj) throws ServiceException { return ""; } - public String convertJsonToString(Object jsonObject) throws ServiceException{ + public String convertJsonToString(Object jsonObject) throws ServiceException { try { return mapper.writeValueAsString(jsonObject); @@ -296,27 +303,30 @@ public String convertJsonToString(Object jsonObject) throws ServiceException{ } } - private Document createXMLDocument(Object request) throws ServiceException{ + private Document createXMLDocument(Object request) throws ServiceException { try { Document doc = dbf.newDocumentBuilder().newDocument(); JAXBContext context = JAXBContext.newInstance(request.getClass()); context.createMarshaller().marshal(request, doc); return doc; - }catch (ParserConfigurationException | JAXBException e){ + } catch (ParserConfigurationException | JAXBException e) { throw new ServiceException(e.getMessage()); } } - private List mapAccountValues(String response,Class listElementClass ,HttpHeaders headers,Class responseClass) throws ServiceException { + + private List mapAccountValues(String response, Class listElementClass, HttpHeaders headers, Class responseClass) throws ServiceException { if (headers.getContentType() != null && MediaType.APPLICATION_XML.equals(headers.getContentType().toString())) { // NOSONAR - return (List) convertStringToXMLDocument(response,responseClass); + return (List) convertStringToXMLDocument(response, responseClass); } if (headers.getContentType() != null && MediaType.APPLICATION_JSON.equals(headers.getContentType().toString())) { // NOSONAR try { CollectionType listType = - mapper.getTypeFactory().constructCollectionType(ArrayList.class,listElementClass); + mapper.getTypeFactory().constructCollectionType(ArrayList.class, listElementClass); return mapper.readValue(response, listType); - }catch(IOException e){ + } catch (JsonProcessingException e) { logger.warn("Error while processing response"); + } catch (IOException e) { + throw new RuntimeException(e); } } return new ArrayList<>(); diff --git a/src/test/java/com/mastercard/crossborder/api/endpoint/guide/adapter/api/EndpointGuideAdapterApiTest.java b/src/test/java/com/mastercard/crossborder/api/endpoint/guide/adapter/api/EndpointGuideAdapterApiTest.java new file mode 100644 index 0000000..e9080e4 --- /dev/null +++ b/src/test/java/com/mastercard/crossborder/api/endpoint/guide/adapter/api/EndpointGuideAdapterApiTest.java @@ -0,0 +1,135 @@ +package com.mastercard.crossborder.api.endpoint.guide.adapter.api; + +import com.mastercard.crossborder.api.config.MastercardApiConfig; +import com.mastercard.crossborder.api.endpoint.guide.adapter.api.helper.EndpointGuideAdapter; +import com.mastercard.crossborder.api.exception.ServiceException; +import com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.EndpointGuideAdapterApi; +import com.mastercard.crossborder.api.rest.endpoint.guide.adapter.api.response.EndpointGuideResponse; +import com.mastercard.crossborder.api.rest.response.Error; +import com.mastercard.crossborder.api.rest.response.Errors; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.ws.rs.core.MediaType; +import java.util.List; +import java.util.Map; + +import static com.mastercard.crossborder.api.constants.MastercardHttpHeaders.PARTNER_REF_ID; +import static com.mastercard.crossborder.api.constants.MastercardHttpHeaders.SPECIFICATION_TYPE; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MastercardApiConfig.class) +public class EndpointGuideAdapterApiTest { + private static final Logger logger = LoggerFactory.getLogger(EndpointGuideAdapterApiTest.class); + + @Autowired + private MastercardApiConfig apiConfig; + @Autowired + private EndpointGuideAdapterApi endpointGuideAdapterApi; + + private String partnerId; + + @Before + public void init() { + this.partnerId = apiConfig.getPartnerId(); + } + + @Test + public void testEndpointGuideAdapterApiWithEncryption() { + logger.info("Running Endpoint Guide Adapter Api"); + try { + + Map requestParams = EndpointGuideAdapter.getCorrectRequestParams(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + httpHeaders.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); + httpHeaders.add(PARTNER_REF_ID.toString(), partnerId); + httpHeaders.add(SPECIFICATION_TYPE.toString(),"TEG"); + List endpointGuideResponse = endpointGuideAdapterApi.getEndpointWithEncryption(httpHeaders, requestParams); + if (endpointGuideResponse != null) { + logger.info("Retrieve Endpoint is Successful"); + assertEquals("AED", endpointGuideResponse.get(0).getDestinationCurrency()); + assertEquals("ARE", endpointGuideResponse.get(0).getDestinationCountry()); + assertEquals("BANK", endpointGuideResponse.get(0).getDestinationPaymentInstrument().toString()); + assertEquals("P2P", endpointGuideResponse.get(0).getPaymentType().toString()); + } else { + logger.info("Retrieve Endpoint failed"); + Assert.fail("Retrieve Endpoint failed"); + } + } catch (Exception e) { + logger.error("Retrieve endpoint failed {}", e.getMessage()); + fail(e.getMessage()); + } + } + + @Test + public void testEndpointGuideAdapterApiFailure() { + logger.info("Running Endpoint Guide Adapter Api"); + try { + + Map requestParams = EndpointGuideAdapter.getIncorrectRequestParams(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + httpHeaders.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); + httpHeaders.add(PARTNER_REF_ID.toString(), partnerId); + httpHeaders.add(SPECIFICATION_TYPE.toString(),"TEG"); + endpointGuideAdapterApi.getEndpoint(httpHeaders, requestParams); + logger.error("Endpoint Guide Adapter Api failed due to Resource Unknown"); + fail("Endpoint Guide Adapter Api failed due to Resource Unknown"); + } catch (ServiceException serviceException) { + logger.error("service error: {}",serviceException.getMessage()); + Errors errors = serviceException.getErrors(); + List errorList = errors.getErrorList(); + logger.info("Error Response >>>>>>>>>>>>>>>> " + errorList.get(0)); + if (errorList != null && !errorList.isEmpty()) { + assertEquals("Endpoint", errorList.get(0).getSource()); + assertEquals("RESOURCE_UNKNOWN", errorList.get(0).getReasonCode()); + } else { + logger.error("Endpoint Guide Adapter Api request is failed for errors : {}", serviceException.getMessage()); + fail(serviceException.getMessage()); + } + } catch (Exception e) { + logger.error("Retrieve endpoint failed {}", e.getMessage()); + fail(e.getMessage()); + } + } + + @Test + public void testEndpointGuideAdapterApiWithEncryptionBEG() { + logger.info("Running Endpoint Guide Adapter Api"); + try { + Map requestParams = EndpointGuideAdapter.getBegRequestParams(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + httpHeaders.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); + httpHeaders.add(PARTNER_REF_ID.toString(), partnerId); + httpHeaders.add(SPECIFICATION_TYPE.toString(),"BEG"); + List endpointGuideResponse = endpointGuideAdapterApi.getEndpointWithEncryption(httpHeaders, requestParams); + if (endpointGuideResponse != null) { + logger.info("Retrieve Endpoint is Successful"); + assertEquals("PKR", endpointGuideResponse.get(0).getDestinationCurrency()); + assertEquals("PAK", endpointGuideResponse.get(0).getDestinationCountry()); + assertEquals("BANK", endpointGuideResponse.get(0).getDestinationPaymentInstrument().toString()); + assertEquals("P2P", endpointGuideResponse.get(0).getPaymentType().toString()); + assertNotNull(endpointGuideResponse.get(0).getBusiness()); + } else { + logger.info("Retrieve Endpoint failed"); + Assert.fail("Retrieve Endpoint failed"); + } + } catch (Exception e) { + logger.error("Retrieve endpoint failed {}", e.getMessage()); + fail(e.getMessage()); + } + } +} diff --git a/src/test/java/com/mastercard/crossborder/api/endpoint/guide/adapter/api/helper/EndpointGuideAdapter.java b/src/test/java/com/mastercard/crossborder/api/endpoint/guide/adapter/api/helper/EndpointGuideAdapter.java new file mode 100644 index 0000000..6019857 --- /dev/null +++ b/src/test/java/com/mastercard/crossborder/api/endpoint/guide/adapter/api/helper/EndpointGuideAdapter.java @@ -0,0 +1,34 @@ +package com.mastercard.crossborder.api.endpoint.guide.adapter.api.helper; + +import java.util.HashMap; +import java.util.Map; + +public class EndpointGuideAdapter { + + public static Map getCorrectRequestParams() { + Map requestParams = new HashMap<>(); + requestParams.put("paymentType", "P2P"); + requestParams.put("destinationPaymentInstrument", "BANK"); + requestParams.put("destinationCountry", "ARE"); + requestParams.put("destinationCurrency", "AED"); + return requestParams; + } + + public static Map getBegRequestParams() { + Map requestParams = new HashMap<>(); + requestParams.put("paymentType", "P2P"); + requestParams.put("destinationPaymentInstrument", "BANK"); + requestParams.put("destinationCountry", "PAK"); + requestParams.put("destinationCurrency", "PKR"); + return requestParams; + } + + public static Map getIncorrectRequestParams() { + Map requestParams = new HashMap<>(); + requestParams.put("paymentType", "P2P"); + requestParams.put("destinationPaymentInstrument", "BANK"); + requestParams.put("destinationCountry", "USA"); + requestParams.put("destinationCurrency", "INR"); + return requestParams; + } +}