From 2a9646e87b50fd0eaaaa1a98df425c82930624c9 Mon Sep 17 00:00:00 2001
From: theutrama <jonaskoch3@gmx.de>
Date: Sat, 29 May 2021 15:31:25 +0200
Subject: [PATCH] updates/ fixes

---
 data/demo.mv.db                               | Bin 28672 -> 24576 bytes
 src/main/java/com/quackr/demo/user/User.java  |  16 ++++--
 .../com/quackr/demo/user/UserController.java  |  23 +++++++--
 .../com/quackr/demo/user/UserRepository.java  |   6 +++
 .../com/quackr/demo/user/UserService.java     |  48 ++++++++++++++++++
 src/main/resources/application.properties     |   5 +-
 6 files changed, 91 insertions(+), 7 deletions(-)

diff --git a/data/demo.mv.db b/data/demo.mv.db
index 48b78e205563195cf8a3d851906185290eda3b40..af0b988bb1e79148e9d69e18f5f74a08beecf0ac 100644
GIT binary patch
literal 24576
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

literal 28672
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

diff --git a/src/main/java/com/quackr/demo/user/User.java b/src/main/java/com/quackr/demo/user/User.java
index 45ecb23..a761197 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 abf4b09..d73f128 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 61b2dec..f83668a 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 2e9d7ae..b20ab38 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 243a167..6efb8f1 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
-- 
GitLab