1 package de.juplo.boot.data.jdbc;
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5 import org.springframework.context.ApplicationEventPublisher;
6 import org.springframework.dao.IncorrectResultSizeDataAccessException;
7 import org.springframework.http.ResponseEntity;
8 import org.springframework.transaction.annotation.Transactional;
9 import org.springframework.web.bind.annotation.*;
10 import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
11 import org.springframework.web.util.UriComponents;
13 import java.time.Clock;
14 import java.time.LocalDateTime;
15 import java.time.ZonedDateTime;
17 import static de.juplo.boot.data.jdbc.UserStatus.CREATED;
18 import static de.juplo.boot.data.jdbc.UserStatus.DELETED;
22 @RequestMapping("/users")
23 public class UserController {
25 private static final Logger LOG = LoggerFactory.getLogger(UserController.class);
28 private final UserRepository repository;
29 private final Clock clock;
30 private final ApplicationEventPublisher publisher;
33 public UserController(
34 UserRepository repository,
36 ApplicationEventPublisher publisher)
38 this.repository = repository;
40 this.publisher = publisher;
45 public ResponseEntity<Void> createUser(
46 ServletUriComponentsBuilder builder,
47 @RequestBody String username) {
48 String sanitizedUsername = UserController.sanitize(username);
49 User user = new User(sanitizedUsername, LocalDateTime.now(), false);
51 LOG.info("Request to create user: {}", user);
53 repository.save(user);
54 publisher.publishEvent(
59 ZonedDateTime.now(clock)));
61 // Triggers an IncorrectResultSizeDataAccessException, if the user already existed!
62 user = repository.findByUsername(sanitizedUsername);
67 .pathSegment("{username}")
68 .buildAndExpand(sanitizedUsername);
69 return ResponseEntity.created(uri.toUri()).build();
72 @GetMapping("{username}")
73 public ResponseEntity<User> getUser(@PathVariable String username) {
74 User user = repository.findByUsername(UserController.sanitize(username));
77 return ResponseEntity.notFound().build();
79 return ResponseEntity.ok(user);
82 @DeleteMapping("{username}")
83 public ResponseEntity<User> removeUser(@PathVariable String username) {
84 User user = repository.findByUsername(UserController.sanitize(username));
87 return ResponseEntity.notFound().build();
89 repository.delete(user);
90 publisher.publishEvent(
95 ZonedDateTime.now(clock)));
97 return ResponseEntity.ok(user);
101 public ResponseEntity<Iterable<User>> getUsers() {
102 return ResponseEntity.ok(repository.findAll());
106 private static String sanitize(String string) {
110 return string.trim().toLowerCase();
114 public ResponseEntity<?> incorrectResultSizeDataAccessException(
115 IncorrectResultSizeDataAccessException e
118 LOG.info("User already exists!");
119 return ResponseEntity.badRequest().build();