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.LocalDateTime;
15 import static de.juplo.boot.data.jdbc.UserEvent.Type.CREATED;
16 import static de.juplo.boot.data.jdbc.UserEvent.Type.DELETED;
20 @RequestMapping("/users")
21 public class UserController {
23 private static final Logger LOG = LoggerFactory.getLogger(UserController.class);
26 private final UserRepository repository;
27 private final ApplicationEventPublisher publisher;
30 public UserController(
31 UserRepository repository,
32 ApplicationEventPublisher publisher)
34 this.repository = repository;
35 this.publisher = publisher;
40 public ResponseEntity<Void> createUser(
41 ServletUriComponentsBuilder builder,
42 @RequestBody String username) {
43 String sanitizedUsername = UserController.sanitize(username);
44 User user = new User(sanitizedUsername, LocalDateTime.now(), false);
46 // Triggering a unique-error for username prevents persistence
47 repository.save(user);
48 publisher.publishEvent(new UserEvent(this, CREATED, sanitizedUsername));
49 user = repository.findByUsername(sanitizedUsername);
54 .pathSegment("{username}")
55 .buildAndExpand(sanitizedUsername);
56 return ResponseEntity.created(uri.toUri()).build();
59 @GetMapping("{username}")
60 public ResponseEntity<User> getUser(@PathVariable String username) {
61 User user = repository.findByUsername(UserController.sanitize(username));
64 return ResponseEntity.notFound().build();
66 return ResponseEntity.ok(user);
69 @DeleteMapping("{username}")
70 public ResponseEntity<User> removeUser(@PathVariable String username) {
71 User user = repository.findByUsername(UserController.sanitize(username));
74 return ResponseEntity.notFound().build();
76 repository.delete(user);
77 publisher.publishEvent(new UserEvent(this, DELETED, username));
79 return ResponseEntity.ok(user);
83 public ResponseEntity<Iterable<User>> getUsers() {
84 return ResponseEntity.ok(repository.findAll());
88 private static String sanitize(String string) {
92 return string.trim().toLowerCase();
96 public ResponseEntity<?> incorrectResultSizeDataAccessException(
97 IncorrectResultSizeDataAccessException e
100 LOG.info("User already exists!");
101 return ResponseEntity.badRequest().build();