Skip to content

Commit 17cb1a0

Browse files
Tess Stoddardtessstoddard
authored andcommitted
fix: add challenges to p2p transfers feature
1 parent 5bee18d commit 17cb1a0

7 files changed

Lines changed: 138 additions & 5 deletions

File tree

mdx-models/src/main/java/com/mx/path/model/mdx/model/MdxLogMasker.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ private static void registerPayloadPatterns() {
5252
buildIdentificationPayloadPatterns();
5353
buildManagedCardsPayloadPatterns();
5454
buildOriginationPayloadPatterns();
55+
buildP2PTransferPayloadPatterns();
5556
buildPaymentPayloadPatterns();
5657
buildPayoutPayloadPatterns();
5758
buildProfilePayloadPatterns();
@@ -274,6 +275,12 @@ private static void buildOriginationPayloadPatterns() {
274275
MDX_PAYLOAD_REGEX.add(LogValueRegex.jsonString("login_token"));
275276
}
276277

278+
private static void buildP2PTransferPayloadPatterns() {
279+
// P2P Transfer - https://developer.mx.com/drafts/mdx/p2p_transfer/index.html#p2p-transfers
280+
MDX_PAYLOAD_REGEX.add(LogValueRegex.jsonString("recipient_verification_answer"));
281+
MDX_PAYLOAD_REGEX.add(LogValueRegex.jsonString("recipient_verification_question"));
282+
}
283+
277284
private static void buildPaymentPayloadPatterns() {
278285
// Payee - https://developer.mx.com/drafts/mdx/payment/#payees-payee-fields
279286
MDX_PAYLOAD_REGEX.add(LogValueRegex.jsonString("account_number"));

mdx-models/src/main/java/com/mx/path/model/mdx/model/p2p_transfer/RecurringP2PTransfer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
import lombok.EqualsAndHashCode;
88

99
import com.mx.path.model.mdx.model.MdxBase;
10+
import com.mx.path.model.mdx.model.MdxList;
11+
import com.mx.path.model.mdx.model.challenges.Challenge;
1012

1113
@Data
1214
@EqualsAndHashCode(callSuper = true)
1315
public class RecurringP2PTransfer extends MdxBase<RecurringP2PTransfer> {
1416
private String id;
1517
private BigDecimal amount;
18+
private MdxList<Challenge> challenges;
1619
private String confirmationId;
1720
private String deliveryMethod;
1821
private String durationType;

mdx-models/src/test/groovy/com/mx/path/model/mdx/model/MdxLogMaskerTest.groovy

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,20 @@ class MdxLogMaskerTest extends Specification {
526526
"\"login_token\":\"123456789\"" || "\"login_token\":\"**MASKED**\""
527527
}
528528

529+
@Unroll
530+
def "maskPayload() masks P2P Transfer JSON fields"() {
531+
when:
532+
String result = MdxLogMasker.maskPayload(payload)
533+
534+
then:
535+
result == expectedResult
536+
537+
where:
538+
payload || expectedResult
539+
"\"recipient_verification_answer\":\"an answer\"" || "\"recipient_verification_answer\":\"**MASKED**\""
540+
"\"recipient_verification_question\":\"a question\"" || "\"recipient_verification_question\":\"**MASKED**\""
541+
}
542+
529543
@Unroll
530544
def "maskPayload() masks Payee JSON fields"() {
531545
when:

mdx-web/src/main/java/com/mx/path/model/mdx/web/controller/P2PTransfersController.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ public class P2PTransfersController extends BaseController {
1818
@RequestMapping(value = "/users/{userId}/p2p_transfers", method = RequestMethod.POST, consumes = BaseController.MDX_MEDIA)
1919
public final ResponseEntity<P2PTransfer> create(@RequestBody P2PTransfer p2pTransferRequest) {
2020
AccessorResponse<P2PTransfer> response = gateway().p2pTransfers().create(p2pTransferRequest);
21-
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
21+
22+
// Return 202 if there are challenges
23+
P2PTransfer result = response.getResult();
24+
HttpStatus status = HttpStatus.OK;
25+
if (result.getChallenges() != null && !result.getChallenges().isEmpty()) {
26+
status = HttpStatus.ACCEPTED;
27+
}
28+
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), status);
2229
}
2330

2431
@RequestMapping(value = "/users/{userId}/p2p_transfers/{id}/cancel", method = RequestMethod.PUT)
@@ -42,6 +49,13 @@ public final ResponseEntity<MdxList<P2PTransfer>> list() {
4249
@RequestMapping(value = "/users/{userId}/p2p_transfers/{id}", method = RequestMethod.PUT, consumes = BaseController.MDX_MEDIA)
4350
public final ResponseEntity<P2PTransfer> update(@PathVariable("id") String p2pTransferId, @RequestBody P2PTransfer p2pTransferRequest) {
4451
AccessorResponse<P2PTransfer> response = gateway().p2pTransfers().update(p2pTransferId, p2pTransferRequest);
45-
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
52+
53+
// Return 202 if there are challenges
54+
P2PTransfer result = response.getResult();
55+
HttpStatus status = HttpStatus.OK;
56+
if (result.getChallenges() != null && !result.getChallenges().isEmpty()) {
57+
status = HttpStatus.ACCEPTED;
58+
}
59+
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), status);
4660
}
4761
}

mdx-web/src/main/java/com/mx/path/model/mdx/web/controller/RecurringP2PTransfersController.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ public class RecurringP2PTransfersController extends BaseController {
1818
@RequestMapping(value = "/users/{userId}/recurring_p2p_transfers", method = RequestMethod.POST, consumes = BaseController.MDX_MEDIA)
1919
public final ResponseEntity<RecurringP2PTransfer> create(@RequestBody RecurringP2PTransfer p2pTransferRequest) {
2020
AccessorResponse<RecurringP2PTransfer> response = gateway().p2pTransfers().recurring().create(p2pTransferRequest);
21-
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
21+
22+
// Return 202 if there are challenges
23+
RecurringP2PTransfer result = response.getResult();
24+
HttpStatus status = HttpStatus.OK;
25+
if (result.getChallenges() != null && !result.getChallenges().isEmpty()) {
26+
status = HttpStatus.ACCEPTED;
27+
}
28+
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), status);
2229
}
2330

2431
@RequestMapping(value = "/users/{userId}/recurring_p2p_transfers/{id}/cancel", method = RequestMethod.PUT)
@@ -42,6 +49,13 @@ public final ResponseEntity<MdxList<RecurringP2PTransfer>> list() {
4249
@RequestMapping(value = "/users/{userId}/recurring_p2p_transfers/{id}", method = RequestMethod.PUT, consumes = BaseController.MDX_MEDIA)
4350
public final ResponseEntity<RecurringP2PTransfer> update(@PathVariable("id") String p2pTransferId, @RequestBody RecurringP2PTransfer p2pTransferRequest) {
4451
AccessorResponse<RecurringP2PTransfer> response = gateway().p2pTransfers().recurring().update(p2pTransferId, p2pTransferRequest);
45-
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
52+
53+
// Return 202 if there are challenges
54+
RecurringP2PTransfer result = response.getResult();
55+
HttpStatus status = HttpStatus.OK;
56+
if (result.getChallenges() != null && !result.getChallenges().isEmpty()) {
57+
status = HttpStatus.ACCEPTED;
58+
}
59+
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), status);
4660
}
4761
}

mdx-web/src/test/groovy/com/mx/path/model/mdx/web/controller/P2PTransfersControllerTest.groovy

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.mx.path.gateway.accessor.AccessorResponse
99
import com.mx.path.gateway.api.Gateway
1010
import com.mx.path.gateway.api.p2p_transfer.P2PTransferGateway
1111
import com.mx.path.model.mdx.model.MdxList
12+
import com.mx.path.model.mdx.model.challenges.Challenge
1213
import com.mx.path.model.mdx.model.p2p_transfer.P2PTransfer
1314

1415
import org.springframework.http.HttpStatus
@@ -45,6 +46,26 @@ class P2PTransfersControllerTest extends Specification {
4546
verify(p2pTransferGateway).create(p2pTransfer) || true
4647
}
4748

49+
def "create with challenges"() {
50+
given:
51+
BaseController.setGateway(gateway)
52+
53+
def p2pTransfer = new P2PTransfer().tap {
54+
setChallenges(new MdxList<Challenge>().tap {
55+
add(new Challenge())
56+
})
57+
}
58+
doReturn(new AccessorResponse<P2PTransfer>().withResult(p2pTransfer)).when(p2pTransferGateway).create(p2pTransfer)
59+
60+
when:
61+
def result = subject.create(p2pTransfer)
62+
63+
then:
64+
result.statusCode == HttpStatus.ACCEPTED
65+
result.body == p2pTransfer
66+
verify(p2pTransferGateway).create(p2pTransfer) || true
67+
}
68+
4869
def "cancel interacts with gateway"() {
4970
given:
5071
BaseController.setGateway(gateway)
@@ -107,4 +128,24 @@ class P2PTransfersControllerTest extends Specification {
107128
result.body == p2pTransfer
108129
verify(p2pTransferGateway).update(id, p2pTransfer) || true
109130
}
131+
132+
def "update with challenges"() {
133+
given:
134+
BaseController.setGateway(gateway)
135+
def id = "transfer-1234"
136+
def p2pTransfer = new P2PTransfer().tap {
137+
setChallenges(new MdxList<Challenge>().tap {
138+
add(new Challenge())
139+
})
140+
}
141+
doReturn(new AccessorResponse<P2PTransfer>().withResult(p2pTransfer)).when(p2pTransferGateway).update(id, p2pTransfer)
142+
143+
when:
144+
def result = subject.update(id, p2pTransfer)
145+
146+
then:
147+
result.statusCode == HttpStatus.ACCEPTED
148+
result.body == p2pTransfer
149+
verify(p2pTransferGateway).update(id, p2pTransfer) || true
150+
}
110151
}

mdx-web/src/test/groovy/com/mx/path/model/mdx/web/controller/RecurringP2PTransfersControllerTest.groovy

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.mx.path.model.mdx.web.controller
22

3-
43
import static org.mockito.Mockito.doReturn
54
import static org.mockito.Mockito.mock
65
import static org.mockito.Mockito.spy
@@ -11,6 +10,7 @@ import com.mx.path.gateway.api.Gateway
1110
import com.mx.path.gateway.api.p2p_transfer.P2PTransferGateway
1211
import com.mx.path.gateway.api.p2p_transfer.RecurringP2PTransferGateway
1312
import com.mx.path.model.mdx.model.MdxList
13+
import com.mx.path.model.mdx.model.challenges.Challenge
1414
import com.mx.path.model.mdx.model.p2p_transfer.RecurringP2PTransfer
1515

1616
import org.springframework.http.HttpStatus
@@ -51,6 +51,26 @@ class RecurringP2PTransfersControllerTest extends Specification {
5151
verify(recurringP2PTransferGateway).create(p2pTransfer) || true
5252
}
5353

54+
def "create with challenges"() {
55+
given:
56+
BaseController.setGateway(gateway)
57+
58+
def p2pTransfer = new RecurringP2PTransfer().tap {
59+
setChallenges(new MdxList<Challenge>().tap {
60+
add(new Challenge())
61+
})
62+
}
63+
doReturn(new AccessorResponse<RecurringP2PTransfer>().withResult(p2pTransfer)).when(recurringP2PTransferGateway).create(p2pTransfer)
64+
65+
when:
66+
def result = subject.create(p2pTransfer)
67+
68+
then:
69+
result.statusCode == HttpStatus.ACCEPTED
70+
result.body == p2pTransfer
71+
verify(recurringP2PTransferGateway).create(p2pTransfer) || true
72+
}
73+
5474
def "cancel interacts with gateway"() {
5575
given:
5676
BaseController.setGateway(gateway)
@@ -113,4 +133,24 @@ class RecurringP2PTransfersControllerTest extends Specification {
113133
result.body == p2pTransfer
114134
verify(recurringP2PTransferGateway).update(id, p2pTransfer) || true
115135
}
136+
137+
def "update with challenges"() {
138+
given:
139+
BaseController.setGateway(gateway)
140+
def id = "transfer-1234"
141+
def p2pTransfer = new RecurringP2PTransfer().tap {
142+
setChallenges(new MdxList<Challenge>().tap {
143+
add(new Challenge())
144+
})
145+
}
146+
doReturn(new AccessorResponse<RecurringP2PTransfer>().withResult(p2pTransfer)).when(recurringP2PTransferGateway).update(id, p2pTransfer)
147+
148+
when:
149+
def result = subject.update(id, p2pTransfer)
150+
151+
then:
152+
result.statusCode == HttpStatus.ACCEPTED
153+
result.body == p2pTransfer
154+
verify(recurringP2PTransferGateway).update(id, p2pTransfer) || true
155+
}
116156
}

0 commit comments

Comments
 (0)