Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@
import lombok.Getter;

import com.mx.path.core.common.accessor.API;
import com.mx.path.core.common.accessor.AccessorMethodNotImplementedException;
import com.mx.path.core.common.gateway.GatewayAPI;
import com.mx.path.core.common.gateway.GatewayClass;
import com.mx.path.gateway.accessor.Accessor;
import com.mx.path.gateway.accessor.AccessorResponse;
import com.mx.path.model.mdx.model.MdxList;
import com.mx.path.model.mdx.model.p2p_transfer.P2PTransfer;

/**
* Accessor base for p2p transfer operations
Expand All @@ -31,6 +35,69 @@ public class P2PTransferBaseAccessor extends Accessor {
@Getter(AccessLevel.PROTECTED)
private RecipientBaseAccessor recipients;

public P2PTransferBaseAccessor() {
}

/**
* Create a P2P transfer
*
* @param p2pTransfer
* @return
*/
@GatewayAPI
@API(description = "Create a P2P transfer")
public AccessorResponse<P2PTransfer> create(P2PTransfer p2pTransfer) {
throw new AccessorMethodNotImplementedException();
}

/**
* Delete a P2P transfer
*
* @param id
* @return
*/
@GatewayAPI
@API(description = "Delete a P2P transfer")
public AccessorResponse<Void> delete(String id) {
throw new AccessorMethodNotImplementedException();
}

/**
* Get a P2P Transfer
*
* @param id
* @return
*/
@GatewayAPI
@API(description = "Get a P2P transfer")
public AccessorResponse<P2PTransfer> get(String id) {
throw new AccessorMethodNotImplementedException();
}

/**
* List all P2P transfers
*
* @return
*/
@GatewayAPI
@API(description = "List all P2P transfers")
public AccessorResponse<MdxList<P2PTransfer>> list() {
throw new AccessorMethodNotImplementedException();
}

/**
* Update a P2P transfer
*
* @param id
* @param p2pTransfer
* @return
*/
@GatewayAPI
@API(description = "Update a P2P transfer")
public AccessorResponse<P2PTransfer> update(String id, P2PTransfer p2pTransfer) {
throw new AccessorMethodNotImplementedException();
}

/**
* Accessor for account operations
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
import com.mx.path.model.mdx.model.ondemand.mixins.TransactionsPageMixin;
import com.mx.path.model.mdx.model.origination.Origination;
import com.mx.path.model.mdx.model.p2p_transfer.Duration;
import com.mx.path.model.mdx.model.p2p_transfer.P2PTransfer;
import com.mx.path.model.mdx.model.payment.Bill;
import com.mx.path.model.mdx.model.payment.Enrollment;
import com.mx.path.model.mdx.model.payment.Merchant;
Expand Down Expand Up @@ -392,6 +393,10 @@ private static void registerP2PTransferModels(GsonBuilder builder) {
builder.registerTypeAdapter(com.mx.path.model.mdx.model.p2p_transfer.Recipient.class, new ModelWrappableSerializer("recipient"));
builder.registerTypeAdapter(new TypeToken<MdxList<com.mx.path.model.mdx.model.p2p_transfer.Recipient>>() {
}.getType(), new ModelWrappableSerializer("recipients"));
// P2P Transfers
builder.registerTypeAdapter(P2PTransfer.class, new ModelWrappableSerializer("p2p_transfer"));
builder.registerTypeAdapter(new TypeToken<MdxList<P2PTransfer>>() {
}.getType(), new ModelWrappableSerializer("p2p_transfers"));
}

private static void registerPaymentsModels(GsonBuilder builder) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.mx.path.model.mdx.model.p2p_transfer;

import java.math.BigDecimal;
import java.time.LocalDate;

import lombok.Data;
import lombok.EqualsAndHashCode;

import com.mx.path.model.mdx.model.MdxBase;
import com.mx.path.model.mdx.model.MdxList;
import com.mx.path.model.mdx.model.challenges.Challenge;

@Data
@EqualsAndHashCode(callSuper = true)
public class P2PTransfer extends MdxBase<P2PTransfer> {
private String id;
private String accountId;
private BigDecimal amount;
private MdxList<Challenge> challenges;
private String confirmationId;
private String deliveryMethod;
private String memo;
private String recipientId;
private String recipientVerificationAnswer;
private String recipientVerificationQuestion;
private LocalDate sendOn;
private LocalDate sentOn;
private String status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.mx.path.model.mdx.web.controller;

import com.mx.path.gateway.accessor.AccessorResponse;
import com.mx.path.model.mdx.model.MdxList;
import com.mx.path.model.mdx.model.p2p_transfer.P2PTransfer;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "{clientId}", produces = BaseController.MDX_MEDIA)
public class P2PTransfersController extends BaseController {
@RequestMapping(value = "/users/{userId}/p2p_transfers", method = RequestMethod.POST, consumes = BaseController.MDX_MEDIA)
public final ResponseEntity<P2PTransfer> create(@RequestBody P2PTransfer p2pTransferRequest) {
AccessorResponse<P2PTransfer> response = gateway().p2pTransfers().create(p2pTransferRequest);
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
}

@RequestMapping(value = "/users/{userId}/p2p_transfers/{id}", method = RequestMethod.DELETE)
public final ResponseEntity<?> delete(@PathVariable("id") String p2pTransferId) {
AccessorResponse<Void> response = gateway().p2pTransfers().delete(p2pTransferId);
return new ResponseEntity<>(createMultiMapForResponse(response.getHeaders()), HttpStatus.NO_CONTENT);
}

@RequestMapping(value = "/users/{userId}/p2p_transfers/{id}", method = RequestMethod.GET)
public final ResponseEntity<P2PTransfer> get(@PathVariable("id") String p2pTransferId) {
AccessorResponse<P2PTransfer> response = gateway().p2pTransfers().get(p2pTransferId);
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
}

@RequestMapping(value = "/users/{userId}/p2p_transfers", method = RequestMethod.GET)
public final ResponseEntity<MdxList<P2PTransfer>> list() {
AccessorResponse<MdxList<P2PTransfer>> response = gateway().p2pTransfers().list();
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
}

@RequestMapping(value = "/users/{userId}/p2p_transfers/{id}", method = RequestMethod.PUT, consumes = BaseController.MDX_MEDIA)
public final ResponseEntity<P2PTransfer> update(@PathVariable("id") String p2pTransferId, @RequestBody P2PTransfer p2pTransferRequest) {
AccessorResponse<P2PTransfer> response = gateway().p2pTransfers().update(p2pTransferId, p2pTransferRequest);
return new ResponseEntity<>(response.getResult().wrapped(), createMultiMapForResponse(response.getHeaders()), HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package com.mx.path.model.mdx.web.controller

import static org.mockito.Mockito.doReturn
import static org.mockito.Mockito.mock
import static org.mockito.Mockito.spy
import static org.mockito.Mockito.verify

import com.mx.path.gateway.accessor.AccessorResponse
import com.mx.path.gateway.api.Gateway
import com.mx.path.gateway.api.p2p_transfer.P2PTransferGateway
import com.mx.path.model.mdx.model.MdxList
import com.mx.path.model.mdx.model.p2p_transfer.P2PTransfer

import org.springframework.http.HttpStatus

import spock.lang.Specification

class P2PTransfersControllerTest extends Specification {
P2PTransfersController subject
Gateway gateway
P2PTransferGateway p2pTransferGateway

def setup() {
subject = new P2PTransfersController()
p2pTransferGateway = mock(P2PTransferGateway)
gateway = spy(Gateway.builder().clientId("client-1234").p2pTransfers(p2pTransferGateway).build())
}

def cleanup() {
BaseController.clearGateway()
}

def "create interacts with gateway"() {
given:
BaseController.setGateway(gateway)
def p2pTransfer = new P2PTransfer()
doReturn(new AccessorResponse<P2PTransfer>().withResult(p2pTransfer)).when(p2pTransferGateway).create(p2pTransfer)

when:
def result = subject.create(p2pTransfer)

then:
HttpStatus.OK == result.statusCode
result.body == p2pTransfer
verify(p2pTransferGateway).create(p2pTransfer) || true
}

def "delete interacts with gateway"() {
given:
BaseController.setGateway(gateway)
def id = "transfer-1234"
doReturn(new AccessorResponse<Void>()).when(p2pTransferGateway).delete(id)

when:
def result = subject.delete(id)

then:
HttpStatus.NO_CONTENT == result.statusCode
verify(p2pTransferGateway).delete(id) || true
}

def "get interacts with gateway"() {
given:
BaseController.setGateway(gateway)
def id = "transfer-1234"
def p2pTransfer = new P2PTransfer()
doReturn(new AccessorResponse<P2PTransfer>().withResult(p2pTransfer)).when(p2pTransferGateway).get(id)

when:
def result = subject.get(id)

then:
HttpStatus.OK == result.statusCode
result.body == p2pTransfer
verify(p2pTransferGateway).get(id) || true
}

def "list interacts with gateway"() {
given:
BaseController.setGateway(gateway)
def p2pTransfers = new MdxList().tap {
add(new P2PTransfer())
}
doReturn(new AccessorResponse<MdxList<P2PTransfer>>().withResult(p2pTransfers)).when(p2pTransferGateway).list()

when:
def result = subject.list()

then:
HttpStatus.OK == result.statusCode
result.body == p2pTransfers
verify(p2pTransferGateway).list() || true
}

def "update interacts with gateway"() {
given:
BaseController.setGateway(gateway)
def id = "transfer-1234"
def p2pTransfer = new P2PTransfer()
doReturn(new AccessorResponse<P2PTransfer>().withResult(p2pTransfer)).when(p2pTransferGateway).update(id, p2pTransfer)

when:
def result = subject.update(id, p2pTransfer)

then:
HttpStatus.OK == result.statusCode
result.body == p2pTransfer
verify(p2pTransferGateway).update(id, p2pTransfer) || true
}
}