Automatically rebuild the state after a crash / restart
[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.CHECKED;
11 import static de.juplo.kafka.payment.transfer.domain.Transfer.State.CREATED;
12
13
14 @Slf4j
15 @RequiredArgsConstructor
16 public class TransferService implements CreateTransferUseCase, HandleStateChangeUseCase, GetTransferUseCase
17 {
18   private final TransferRepository repository;
19   private final MessagingService messagingService;
20
21   @Override
22   public void create(Transfer transfer)
23   {
24     repository
25         .get(transfer.getId())
26         .ifPresentOrElse(
27             stored -> log.info("transfer already exisits: {}, ignoring: {}", stored, transfer),
28             () ->
29             {
30               log.info("creating transfer: {}", transfer);
31               repository.store(transfer);
32               messagingService.send(transfer.getId(), CREATED);
33             });
34   }
35
36   @Override
37   public void handle(Transfer transfer)
38   {
39     Transfer.State state = transfer.getState();
40     switch (state)
41     {
42       case CREATED:
43         repository.store(transfer);
44         check(transfer);
45         break;
46
47       case CHECKED:
48         repository.store(transfer);
49         // TODO: What's next...?
50         break;
51
52       default:
53         log.warn("TODO: handle {} state {}", state.foreign ? "foreign" : "domain", state);
54     }
55   }
56
57   private void check(Transfer transfer)
58   {
59     // TODO: Do some time consuming checks...
60     messagingService.send(transfer.getId(), CHECKED);
61   }
62
63   public Optional<Transfer> get(Long id)
64   {
65     return repository.get(id);
66   }
67 }