TransferController sends a message, instead of calling TransferService
[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.GetTransferUseCase;
5 import de.juplo.kafka.payment.transfer.ports.HandleTransferUseCase;
6 import de.juplo.kafka.payment.transfer.ports.MessagingService;
7 import de.juplo.kafka.payment.transfer.ports.TransferRepository;
8 import lombok.RequiredArgsConstructor;
9 import lombok.extern.slf4j.Slf4j;
10
11 import java.util.Optional;
12
13 import static de.juplo.kafka.payment.transfer.domain.Transfer.State.CHECKED;
14 import static de.juplo.kafka.payment.transfer.domain.Transfer.State.CREATED;
15
16
17 @Slf4j
18 @RequiredArgsConstructor
19 public class TransferService implements HandleTransferUseCase, GetTransferUseCase
20 {
21   private final TransferRepository repository;
22   private final MessagingService messagingService;
23
24   private void create(Transfer transfer)
25   {
26     repository
27         .get(transfer.getId())
28         .ifPresentOrElse(
29             stored -> log.info("transfer already exisits: {}, ignoring: {}", stored, transfer),
30             () ->
31             {
32               repository.store(transfer);
33               transfer.setState(CREATED);
34               messagingService.send(transfer);
35             });
36   }
37
38   @Override
39   public void handle(Transfer transfer)
40   {
41     Transfer.State state = transfer.getState();
42     switch (state)
43     {
44       case RECEIVED:
45         repository.store(transfer);
46         create(transfer);
47         break;
48
49       case CREATED:
50         repository.store(transfer);
51         check(transfer);
52         break;
53
54       case CHECKED:
55         repository.store(transfer);
56         // TODO: What's next...?
57         break;
58
59       default:
60         log.warn("TODO: handle {} state {}", state.foreign ? "foreign" : "domain", state);
61     }
62   }
63
64   private void check(Transfer transfer)
65   {
66     // TODO: Do some time consuming checks...
67     transfer.setState(CHECKED);
68     messagingService.send(transfer);
69   }
70
71   public Optional<Transfer> get(Long id)
72   {
73     return repository.get(id);
74   }
75 }