import de.juplo.kafka.payment.transfer.domain.Transfer;
import de.juplo.kafka.payment.transfer.ports.GetTransferUseCase;
-import de.juplo.kafka.payment.transfer.ports.InitiateTransferUseCase;
+import de.juplo.kafka.payment.transfer.ports.ReceiveTransferUseCase;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.context.request.async.DeferredResult;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
{
public final static String PATH = "/transfers";
- private final InitiateTransferUseCase initiateTransferUseCase;
+ private final ReceiveTransferUseCase receiveTransferUseCase;
private final GetTransferUseCase getTransferUseCase;
path = PATH,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<?> transfer(@Valid @RequestBody TransferDTO transferDTO)
+ public DeferredResult<ResponseEntity<?>> transfer(
+ HttpServletRequest request,
+ @Valid @RequestBody TransferDTO transferDTO)
{
Transfer transfer =
Transfer
.amount(transferDTO.getAmount())
.build();
- initiateTransferUseCase.initiate(transfer);
+ DeferredResult<ResponseEntity<?>> result = new DeferredResult<>();
+
+ receiveTransferUseCase
+ .receive(transfer)
+ .thenApply(
+ $ ->
+ ResponseEntity
+ .created(URI.create(PATH + "/" + transferDTO.getId()))
+ .build())
+ .thenAccept(
+ responseEntity -> result.setResult(responseEntity))
+ .exceptionally(
+ e ->
+ {
+ result.setErrorResult(e);
+ return null;
+ });
- return ResponseEntity.created(URI.create(PATH + "/" + transferDTO.getId())).build();
+ return result;
}
@GetMapping(