diff --git a/data/demo.mv.db b/data/demo.mv.db index 48b78e205563195cf8a3d851906185290eda3b40..af0b988bb1e79148e9d69e18f5f74a08beecf0ac 100644 Binary files a/data/demo.mv.db and b/data/demo.mv.db differ diff --git a/src/main/java/com/quackr/demo/user/User.java b/src/main/java/com/quackr/demo/user/User.java index 45ecb23821d1d44269e6ed7c0e77119d26c33401..a7611971b7da28a181fe4b19bb65aa247cd5af6d 100644 --- a/src/main/java/com/quackr/demo/user/User.java +++ b/src/main/java/com/quackr/demo/user/User.java @@ -11,7 +11,7 @@ public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "userId", unique = true) - private int userId; + private Long userId; @Column(name = "first_name", nullable = false) private String first_name; @@ -37,11 +37,11 @@ public class User implements Serializable { } - public int getUserId() { + public Long getUserId() { return userId; } - public void setUserId(int id) { + public void setUserId(Long id) { this.userId = id; } @@ -77,4 +77,14 @@ public class User implements Serializable { this.username = username; } + @Override + public String toString() { + return "User{" + + "userId=" + userId + + ", first_name='" + first_name + '\'' + + ", last_name='" + last_name + '\'' + + ", email='" + email + '\'' + + ", username='" + username + '\'' + + '}'; + } } diff --git a/src/main/java/com/quackr/demo/user/UserController.java b/src/main/java/com/quackr/demo/user/UserController.java index abf4b09c3c00b66b2ca351d6387654302817c357..d73f1286d35a6eacd3ef4323ed2372c885ed2efe 100644 --- a/src/main/java/com/quackr/demo/user/UserController.java +++ b/src/main/java/com/quackr/demo/user/UserController.java @@ -1,9 +1,7 @@ package com.quackr.demo.user; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -22,4 +20,23 @@ public class UserController { public List<User> getUsers(){ return userService.getUsers(); } + + @PostMapping + public void registerNewUser(@RequestBody User user){ + userService.addNewUser(user); + } + + @DeleteMapping(path = "{userId}") + public void deleteUser(@PathVariable("userId") Long userId){ + userService.deleteUser(userId); + } + + @PutMapping(path = "{userId}") + public void updateUser(@PathVariable("userId") Long userId, + @RequestParam(required = false) String first_name, + @RequestParam(required = false) String last_name, + @RequestParam(required = false) String email, + @RequestParam(required = false) String username){ + userService.updateUser(userId, first_name, last_name, email, username); + } } diff --git a/src/main/java/com/quackr/demo/user/UserRepository.java b/src/main/java/com/quackr/demo/user/UserRepository.java index 61b2dec9941a973005c0fc0f1ee8b46211c6aa59..f83668a841bfeb4804b73d1e6b8658f8bb1a3345 100644 --- a/src/main/java/com/quackr/demo/user/UserRepository.java +++ b/src/main/java/com/quackr/demo/user/UserRepository.java @@ -1,9 +1,15 @@ package com.quackr.demo.user; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface UserRepository extends JpaRepository<User, Long> { + @Query("SELECT u FROM User u WHERE u.email = ?1") + Optional<User> findUserByEmail(String email); + } diff --git a/src/main/java/com/quackr/demo/user/UserService.java b/src/main/java/com/quackr/demo/user/UserService.java index 2e9d7ae69d4169d5528f7636cad75f5a0d8f89a4..b20ab38a990b4017fac652ba2d15f832b9bb380b 100644 --- a/src/main/java/com/quackr/demo/user/UserService.java +++ b/src/main/java/com/quackr/demo/user/UserService.java @@ -6,8 +6,11 @@ import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.transaction.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.Optional; @Service public class UserService { @@ -24,4 +27,49 @@ public class UserService { return userRepository.findAll(); } + public void addNewUser(User user) { + Optional<User> userOptional = userRepository.findUserByEmail(user.getEmail()); + if(userOptional.isPresent()){ + throw new IllegalStateException("email already taken"); + } + userRepository.save(user); + System.out.println(user); + } + + public void deleteUser(Long userId) { + boolean exists = userRepository.existsById(userId); + if(!exists){ + throw new IllegalStateException("user with id "+ userId+ " does not exist"); + } + userRepository.deleteById(userId); + } + + @Transactional + public void updateUser(Long userId, String firstName, String lastName, String email, String username) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new IllegalStateException("user with "+ userId + " does not exist")); + + + if(firstName != null && firstName.length()>0 && !Objects.equals(user.getFirst_name(), firstName)){ + user.setFirst_name(firstName); + } + + if(lastName != null && lastName.length()>0 && !Objects.equals(user.getLast_name(), lastName)){ + user.setLast_name(lastName); + } + + if(email != null && email.length()>0 && !Objects.equals(user.getEmail(),email)){ + Optional<User> optionalUser = userRepository.findUserByEmail(email); + if(optionalUser.isPresent()){ + throw new IllegalStateException("email is already taken"); + } + user.setEmail(email); + } + + if(username != null && username.length()>0 && !Objects.equals(user.getUsername(),username)){ + //usernames can be used more than once + System.out.println("username update"); + user.setUsername(username); + } + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 243a167fc84d3ca13b93a3fca6fcebafc2d52293..6efb8f195bc1b99fefaa7936012b523040a39767 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,4 +6,7 @@ spring.datasource.password=password spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.h2.console.enabled=true spring.datasource.initialization-mode=always -spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl \ No newline at end of file +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +spring.jpa.show-sql=true + +server.error.include-message=always \ No newline at end of file