Skip to content

Commit

Permalink
Merge pull request #844 from alphagov/pp_6657_project_payment_details…
Browse files Browse the repository at this point in the history
…_to_nested_blob

PP-6657 Project payment details to nested blob
  • Loading branch information
kbottla authored Jul 21, 2020
2 parents b1265c8 + 6759f16 commit c6c8ff6
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import uk.gov.pay.ledger.transaction.entity.TransactionEntity;
import uk.gov.pay.ledger.transaction.service.TransactionService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import static java.util.stream.Collectors.toMap;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
Expand All @@ -31,6 +31,7 @@ public RefundEventProcessor(EventService eventService, TransactionService transa
@Override
public void process(Event event) {
EventDigest refundEventDigest = eventService.getEventDigestForResource(event);
Optional<EventDigest> mayBePaymentEventDigest = Optional.empty();

/**
* Apply shared refund payment attributes to the refund digest
Expand All @@ -43,24 +44,35 @@ public void process(Event event) {
* for the digest can be removed.
*/
if (isNotBlank(refundEventDigest.getParentResourceExternalId())) {
Map<String, Object> fieldsFromPayment = getFieldsFromOriginalPayment(refundEventDigest.getParentResourceExternalId());
refundEventDigest.getEventPayload().putAll(fieldsFromPayment);
mayBePaymentEventDigest = getPaymentEventDigest(refundEventDigest.getParentResourceExternalId());
mayBePaymentEventDigest.ifPresent(paymentEventDigest -> {
Map<String, Object> fieldsFromPayment = getPaymentFieldsToProjectOnToRefund(paymentEventDigest);
refundEventDigest.getEventPayload().put("payment_details", fieldsFromPayment);
});
}

transactionService.upsertTransactionFor(refundEventDigest);
TransactionEntity refundTransactionEntity = transactionEntityFactory.create(refundEventDigest);

mayBePaymentEventDigest.ifPresent(paymentEventDigest -> {
TransactionEntity paymentTransactionEntity = transactionEntityFactory.create(paymentEventDigest);
refundTransactionEntity.setEntityFieldsFromOriginalPayment(paymentTransactionEntity);
});

transactionService.upsertTransaction(refundTransactionEntity);
}

private Map<String, Object> getFieldsFromOriginalPayment(String paymentExternalId) {
private Optional<EventDigest> getPaymentEventDigest(String paymentExternalId) {
EventDigest paymentEventDigest = null;
List<String> paymentsFieldsToCopyToRefunds = List.of("cardholder_name", "email", "description",
"card_brand", "last_digits_card_number", "first_digits_card_number", "reference",
"card_brand_label", "expiry_date", "card_type", "wallet_type");

try {
paymentEventDigest = eventService.getEventDigestForResource(paymentExternalId);
} catch (EmptyEventsException ignored) {
// no valid refund projection is possible without payment events, allow upstream to handle this
}
return Optional.ofNullable(paymentEventDigest);
}

private Map<String, Object> getPaymentFieldsToProjectOnToRefund(EventDigest paymentEventDigest) {
List<String> paymentsFieldsToCopyToRefunds = List.of("card_brand_label", "expiry_date", "card_type", "wallet_type");

var paymentPayloadIsEmpty = paymentEventDigest == null || paymentEventDigest.getEventPayload() == null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import uk.gov.pay.ledger.transaction.state.TransactionState;

import java.time.ZonedDateTime;
import java.util.Map;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
Expand Down Expand Up @@ -228,6 +229,16 @@ public String getGatewayPayoutId() {
return gatewayPayoutId;
}

public void setEntityFieldsFromOriginalPayment(TransactionEntity paymentTransaction) {
this.cardBrand = paymentTransaction.getCardBrand();
this.cardholderName = paymentTransaction.getCardholderName();
this.reference = paymentTransaction.getReference();
this.firstDigitsCardNumber = paymentTransaction.getFirstDigitsCardNumber();
this.lastDigitsCardNumber = paymentTransaction.getLastDigitsCardNumber();
this.description = paymentTransaction.getDescription();
this.email = paymentTransaction.email;
}

public static class Builder {
private Long fee;
private Long id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,10 @@ public void upsertTransactionFor(EventDigest eventDigest) {
transactionDao.upsert(transaction);
}

public void upsertTransaction(TransactionEntity transaction) {
transactionDao.upsert(transaction);
}

public TransactionEventResponse findTransactionEvents(String externalId, String gatewayAccountId,
boolean includeAllEvents, int statusVersion) {
Map<String, TransactionEntity> transactionEntityMap = getTransactionsAsMap(externalId, gatewayAccountId);
Expand All @@ -180,8 +184,7 @@ public TransactionEventResponse findTransactionEvents(String externalId, String
}
}

public Optional<TransactionView> findByGatewayTransactionId(String gatewayTransactionId, String paymentProvider
) {
public Optional<TransactionView> findByGatewayTransactionId(String gatewayTransactionId, String paymentProvider) {
TransactionSearchParams searchParams = new TransactionSearchParams();
searchParams.setGatewayTransactionId(gatewayTransactionId);
searchParams.setTransactionType(PAYMENT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import uk.gov.pay.ledger.event.model.TransactionEntityFactory;
import uk.gov.pay.ledger.event.service.EventService;
import uk.gov.pay.ledger.payout.service.PayoutService;
import uk.gov.pay.ledger.transaction.entity.TransactionEntity;
import uk.gov.pay.ledger.transaction.service.TransactionMetadataService;
import uk.gov.pay.ledger.transaction.service.TransactionService;

Expand Down Expand Up @@ -85,7 +86,7 @@ public void shouldUpsertTransactionIfResourceTypeIsRefund() {
eventDigestHandler.processEvent(event);

verify(eventService).getEventDigestForResource(event);
verify(transactionService).upsertTransactionFor(any(EventDigest.class));
verify(transactionService).upsertTransaction(any(TransactionEntity.class));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,12 @@ public void shouldHandleRefundEvent() throws InterruptedException {
assertThat(refund.getLastDigitsCardNumber(), is("4242"));
assertThat(refund.getFirstDigitsCardNumber(), is("424242"));
assertThat(refund.getReference(), is("aref"));
Map<String, String> transactionDetails = new Gson().fromJson(refund.getTransactionDetails(), Map.class);
assertThat(transactionDetails.get("reference"), is("aref"));
assertThat(transactionDetails.get("expiry_date"), is("11/21"));
assertThat(transactionDetails.get("card_type"), is("DEBIT"));
Map<String, Object> transactionDetails = new Gson().fromJson(refund.getTransactionDetails(), Map.class);
Map<String,String> paymentDetails = (Map<String, String>) transactionDetails.get("payment_details");

assertThat(paymentDetails.get("card_brand_label"), is("Visa"));
assertThat(paymentDetails.get("expiry_date"), is("11/21"));
assertThat(paymentDetails.get("card_type"), is("DEBIT"));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ public QueuePaymentEventFixture withDefaultEventDataForEventType(String eventTyp
.put("address_country", "GB")
.put("card_type", "DEBIT")
.put("card_brand", "visa")
.put("card_brand_label", "Visa")
.put("gateway_transaction_id", gatewayAccountId)
.put("corporate_surcharge", 5)
.put("total_amount", 1005)
Expand Down

0 comments on commit c6c8ff6

Please sign in to comment.