f7f9ff5c67f2c933f8c24d45ee0858015dbf9e18
[demos/kafka/demos-kafka-payment-system-transfer] / transfer / src / main / java / de / juplo / kafka / payment / transfer / controller / TransferController.java
1 package de.juplo.kafka.payment.transfer.controller;
2
3
4 import de.juplo.kafka.payment.transfer.domain.Transfer;
5 import de.juplo.kafka.payment.transfer.domain.TransferService;
6 import lombok.RequiredArgsConstructor;
7 import lombok.extern.slf4j.Slf4j;
8 import org.springframework.http.HttpStatus;
9 import org.springframework.http.MediaType;
10 import org.springframework.http.ResponseEntity;
11 import org.springframework.validation.FieldError;
12 import org.springframework.web.bind.MethodArgumentNotValidException;
13 import org.springframework.web.bind.annotation.*;
14
15 import javax.validation.Valid;
16 import java.net.URI;
17 import java.util.HashMap;
18 import java.util.Map;
19 import java.util.Optional;
20
21
22 @RestController
23 @RequiredArgsConstructor
24 @Slf4j
25  public class TransferController
26 {
27   public final static String PATH = "/transfers";
28
29   private final TransferService service;
30
31
32   @PostMapping(
33       path = PATH,
34       consumes = MediaType.APPLICATION_JSON_VALUE,
35       produces = MediaType.APPLICATION_JSON_VALUE)
36   public ResponseEntity<?> transfer(@Valid @RequestBody TransferDTO transferDTO)
37   {
38     Transfer transfer =
39         Transfer
40             .builder()
41             .id(transferDTO.getId())
42             .payer(transferDTO.getPayer())
43             .payee(transferDTO.getPayee())
44             .amount(transferDTO.getAmount())
45             .build();
46
47     service.initiate(transfer);
48
49     return ResponseEntity.created(URI.create(PATH + "/" + transferDTO.getId())).build();
50   }
51
52   @GetMapping(
53       path = PATH + "/{id}",
54       produces = MediaType.APPLICATION_JSON_VALUE)
55   public ResponseEntity<TransferDTO> get(@PathVariable Long id)
56   {
57     return
58         service
59             .get(id)
60             .map(transfer -> ResponseEntity.ok(TransferDTO.of(transfer)))
61             .orElse(ResponseEntity.notFound().build());
62   }
63
64   @ResponseStatus(HttpStatus.BAD_REQUEST)
65   @ExceptionHandler(MethodArgumentNotValidException.class)
66   public Map<String, String> handleValidationExceptions(
67       MethodArgumentNotValidException ex) {
68     Map<String, String> errors = new HashMap<>();
69     ex.getBindingResult().getAllErrors().forEach((error) -> {
70       String fieldName = ((FieldError) error).getField();
71       String errorMessage = error.getDefaultMessage();
72       errors.put(fieldName, errorMessage);
73     });
74     return errors;
75   }
76 }