1 package de.juplo.kafka.payment.transfer.controller;
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.*;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.validation.Valid;
18 import java.util.Date;
19 import java.util.HashMap;
21 import java.util.Optional;
25 @RequiredArgsConstructor
27 public class TransferController
29 public final static String PATH = "/transfers";
31 private final TransferService service;
36 consumes = MediaType.APPLICATION_JSON_VALUE,
37 produces = MediaType.APPLICATION_JSON_VALUE)
38 public ResponseEntity<?> transfer(@Valid @RequestBody TransferDTO transferDTO)
43 .id(transferDTO.getId())
44 .payer(transferDTO.getPayer())
45 .payee(transferDTO.getPayee())
46 .amount(transferDTO.getAmount())
49 service.initiate(transfer);
51 return ResponseEntity.created(URI.create(PATH + "/" + transferDTO.getId())).build();
55 path = PATH + "/{id}",
56 produces = MediaType.APPLICATION_JSON_VALUE)
57 public ResponseEntity<TransferDTO> get(@PathVariable Long id)
62 .map(transfer -> ResponseEntity.ok(TransferDTO.of(transfer)))
63 .orElse(ResponseEntity.notFound().build());
66 @ResponseStatus(HttpStatus.BAD_REQUEST)
67 @ExceptionHandler(MethodArgumentNotValidException.class)
68 public Map<String, Object> handleValidationExceptions(
69 HttpServletRequest request,
70 MethodArgumentNotValidException e)
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("request", request.get)
78 errorAttributes.put("timestamp", new Date());
79 Map<String, String> errors = new HashMap<>();
80 e.getBindingResult().getAllErrors().forEach((error) -> {
81 String fieldName = ((FieldError) error).getField();
82 String errorMessage = error.getDefaultMessage();
83 errors.put(fieldName, errorMessage);
85 errorAttributes.put("errors", errors);
86 errorAttributes.put("message", "Validation failed: Invalid message format, error count: " + errors.size());
87 return errorAttributes;