WIP
[demos/kafka/outbox] / src / main / java / de / juplo / boot / data / jdbc / UserController.java
1 package de.juplo.boot.data.jdbc;
2
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5 import org.springframework.http.ResponseEntity;
6 import org.springframework.transaction.annotation.Transactional;
7 import org.springframework.web.bind.annotation.*;
8 import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
9 import org.springframework.web.util.UriComponents;
10
11 import java.time.LocalDateTime;
12
13 @RestController
14 @Transactional
15 @RequestMapping("/users")
16 public class UserController {
17
18     private static final Logger LOG = LoggerFactory.getLogger(UserController.class);
19
20
21     private final UserRepository repository;
22
23
24     public UserController(UserRepository repository) {
25         this.repository = repository;
26     }
27
28
29     @PostMapping
30     public ResponseEntity<Void> createUser(
31             ServletUriComponentsBuilder builder,
32             @RequestBody String username) {
33         String sanitizedUsername = UserController.sanitize(username);
34         User user = new User(sanitizedUsername, LocalDateTime.now(), false);
35
36         // Ein Fehler wegen doppeltem username verhindert das Speichern
37         repository.save(user);
38         user = repository.findByUsername(sanitizedUsername);
39
40         UriComponents uri =
41             builder
42                 .fromCurrentRequest()
43                 .pathSegment("{username}")
44                 .buildAndExpand(sanitizedUsername);
45         return ResponseEntity.created(uri.toUri()).build();
46     }
47
48     @GetMapping("{username}")
49     public ResponseEntity<User> getUser(@PathVariable String username) {
50         User user = repository.findByUsername(UserController.sanitize(username));
51
52         if (user == null)
53             return ResponseEntity.notFound().build();
54
55         return ResponseEntity.ok(user);
56     }
57
58     @DeleteMapping("{username}")
59     public ResponseEntity<User> removeUser(@PathVariable String username) {
60         User user = repository.findByUsername(UserController.sanitize(username));
61
62         if (user == null)
63             return ResponseEntity.notFound().build();
64
65         repository.delete(user);
66
67         return ResponseEntity.ok(user);
68     }
69
70     @GetMapping()
71     public ResponseEntity<Iterable<User>> getUsers() {
72         return ResponseEntity.ok(repository.findAll());
73     }
74
75
76     private static String sanitize(String string) {
77         if (string == null)
78             return "";
79
80         return string.trim().toLowerCase();
81     }
82 }