WIP
[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.servlet.http.HttpServletRequest;
16 import javax.validation.Valid;
17 import java.net.URI;
18 import java.util.Date;
19 import java.util.HashMap;
20 import java.util.Map;
21 import java.util.Optional;
22
23
24 @RestController
25 @RequiredArgsConstructor
26 @Slf4j
27  public class TransferController
28 {
29   public final static String PATH = "/transfers";
30
31   private final TransferService service;
32
33
34   @PostMapping(
35       path = PATH,
36       consumes = MediaType.APPLICATION_JSON_VALUE,
37       produces = MediaType.APPLICATION_JSON_VALUE)
38   public ResponseEntity<?> transfer(@Valid @RequestBody TransferDTO transferDTO)
39   {
40     Transfer transfer =
41         Transfer
42             .builder()
43             .id(transferDTO.getId())
44             .payer(transferDTO.getPayer())
45             .payee(transferDTO.getPayee())
46             .amount(transferDTO.getAmount())
47             .build();
48
49     service.initiate(transfer);
50
51     return ResponseEntity.created(URI.create(PATH + "/" + transferDTO.getId())).build();
52   }
53
54   @GetMapping(
55       path = PATH + "/{id}",
56       produces = MediaType.APPLICATION_JSON_VALUE)
57   public ResponseEntity<TransferDTO> get(@PathVariable Long id)
58   {
59     return
60         service
61             .get(id)
62             .map(transfer -> ResponseEntity.ok(TransferDTO.of(transfer)))
63             .orElse(ResponseEntity.notFound().build());
64   }
65
66   @ResponseStatus(HttpStatus.BAD_REQUEST)
67   @ExceptionHandler(MethodArgumentNotValidException.class)
68   public Map<String, Object> handleValidationExceptions(
69       HttpServletRequest request,
70       MethodArgumentNotValidException e)
71   {
72     Map<String, Object> errorAttributes = new HashMap<>();
73     errorAttributes.put("status", HttpStatus.BAD_REQUEST.value());
74     errorAttributes.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase());
75     errorAttributes.put("path", request.getRequestURI());
76     errorAttributes.put("method", request.getMethod());
77     errorAttributes.put("timestamp", new Date());
78     Map<String, String> errors = new HashMap<>();
79     e.getBindingResult().getAllErrors().forEach((error) -> {
80       String fieldName = ((FieldError) error).getField();
81       String errorMessage = error.getDefaultMessage();
82       errors.put(fieldName, errorMessage);
83     });
84     errorAttributes.put("errors", errors);
85     errorAttributes.put("message", "Validation failed: Invalid message format, error count: " + errors.size());
86     return errorAttributes;
87   }
88 }