X-Git-Url: https://juplo.de/gitweb/?p=demos%2Fkafka%2Fdemos-kafka-payment-system-transfer;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fpayment%2Ftransfer%2Fports%2FTransferService.java;fp=src%2Fmain%2Fjava%2Fde%2Fjuplo%2Fkafka%2Fpayment%2Ftransfer%2Fports%2FTransferService.java;h=d4eb3effa7cec510a8b7fcd2c572f29b15613434;hp=0000000000000000000000000000000000000000;hb=0d1ffab6d4ff4a1d401a4b0b16bc30e0746a9441;hpb=951dcf0533551cccf48062c12e61192035a27a9a diff --git a/src/main/java/de/juplo/kafka/payment/transfer/ports/TransferService.java b/src/main/java/de/juplo/kafka/payment/transfer/ports/TransferService.java new file mode 100644 index 0000000..d4eb3ef --- /dev/null +++ b/src/main/java/de/juplo/kafka/payment/transfer/ports/TransferService.java @@ -0,0 +1,91 @@ +package de.juplo.kafka.payment.transfer.ports; + + +import de.juplo.kafka.payment.transfer.domain.Transfer; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.Optional; + +import static de.juplo.kafka.payment.transfer.domain.Transfer.State.CHECKED; +import static de.juplo.kafka.payment.transfer.domain.Transfer.State.CREATED; + + +@Slf4j +@RequiredArgsConstructor +public class TransferService implements CreateTransferUseCase, HandleStateChangeUseCase, GetTransferUseCase +{ + private final TransferRepository repository; + private final MessagingService messagingService; + + @Override + public void create(Long id, Long payer, Long payee, Integer amount) + { + repository + .get(id) + .ifPresentOrElse( + stored -> log.info( + "transfer already exisits: {}, ignoring: id={}, payer={}, payee={}, amount={}", + stored, + payer, + payee, + amount), + () -> + { + Transfer transfer = + Transfer + .builder() + .id(id) + .payer(payer) + .payee(payee) + .amount(amount) + .build(); + + log.info("creating transfer: {}", transfer); + repository.store(transfer); + messagingService.send(transfer.getId(), CREATED); + }); + } + + @Override + public void handleStateChange(Long id, Transfer.State state) + { + get(id) + .ifPresentOrElse( + transfer -> + { + switch (state) + { + case CREATED: + + transfer.setState(CREATED); + repository.store(transfer); + check(transfer); + break; + + case CHECKED: + + transfer.setState(CHECKED); + repository.store(transfer); + // TODO: What's next...? + break; + + default: + + log.warn("TODO: handle {} state {}", state.foreign ? "foreign" : "domain", state); + } + }, + () -> log.error("unknown transfer: {}", id)); + } + + private void check(Transfer transfer) + { + // TODO: Do some time consuming checks... + messagingService.send(transfer.getId(), CHECKED); + } + + public Optional get(Long id) + { + return repository.get(id); + } +}