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