Introduced different Events for the creation and the state-changes
[demos/kafka/demos-kafka-payment-system-transfer] / src / main / java / de / juplo / kafka / payment / transfer / domain / TransferService.java
1 package de.juplo.kafka.payment.transfer.domain;
2
3
4 import de.juplo.kafka.payment.transfer.ports.*;
5 import lombok.RequiredArgsConstructor;
6 import lombok.extern.slf4j.Slf4j;
7
8 import java.util.Optional;
9
10 import static de.juplo.kafka.payment.transfer.domain.Transfer.State.*;
11
12
13 @Slf4j
14 @RequiredArgsConstructor
15 public class TransferService implements CreateTransferUseCase, HandleStateChangeUseCase, GetTransferUseCase
16 {
17   private final TransferRepository repository;
18   private final MessagingService messagingService;
19
20   @Override
21   public void create(Transfer transfer)
22   {
23     repository
24         .get(transfer.getId())
25         .ifPresentOrElse(
26             stored -> log.info("transfer already exisits: {}, ignoring: {}", stored, transfer),
27             () ->
28             {
29               repository.store(transfer);
30               messagingService.send(transfer.getId(), CREATED);
31             });
32   }
33
34   @Override
35   public void handle(Transfer transfer)
36   {
37     Transfer.State state = transfer.getState();
38     switch (state)
39     {
40       case CREATED:
41         repository.store(transfer);
42         check(transfer);
43         break;
44
45       case CHECKED:
46         repository.store(transfer);
47         // TODO: What's next...?
48         break;
49
50       default:
51         log.warn("TODO: handle {} state {}", state.foreign ? "foreign" : "domain", state);
52     }
53   }
54
55   private void check(Transfer transfer)
56   {
57     // TODO: Do some time consuming checks...
58     messagingService.send(transfer.getId(), CHECKED);
59   }
60
61   public Optional<Transfer> get(Long id)
62   {
63     return repository.get(id);
64   }
65 }