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 zcmeaUGSW%P$xqIP(ZQKjsaA#t1_nCG8KrsIR^~~@I>|+;i6yBiR)*%5CI*SgX=z4D zI%)YuxrrrKhB{@bMa7x<d0>TUIjJSd8L359Miv%nDW>LzTnwXNGz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnho0LtwQ3Kj2X?>VVM@7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GZ|{2p}f;VXFXgQuC|~b#fC6tWu11auX}8ObiTk@=_~Gtju%@ z64O(QtqgUF^7Biq3{#Vn4M4ysEyYBqBr`YF%G^BB)W|f^5@k_9L1vzFeraBbm4O1a z0T%-Ua~(?&gD3+h*du!8Nd|D1A)IBznwwalX9y;Z!K4Y8GzF7pY#`YbLkMLAp^SO* z5_41aa`Ka05=#=fVI1GY0ysM;HBA&Oo?nof7gCg%SDct!l9``Z4AEMWn3R*MXMoHx z<^!uQ%}dGm$xqiaMCBT>fr3@fm>o=|7)@dX`^m~Y$pE@U!$b!XIXRhSslL#d0kH$1 z(Sj6di3SGH*fN607AUR^3=IuZ%n-3<XkcQYQ<_&=oSNcT5(Zz&VSp5a20DlsM7YTi z>Lz0}HyIij=-_aZITkmWfE{IKVv6J@Bhy4vEN((xYGR1wrUmeDf-Pk+MROCfiww|{ zHhP-20J{hyO`Ahqgh=C<p=N{>YDP#d1Sb<KtjWX*noPi{$|@&636{b@?4Z;%aPk4M zLCH`7lzgn<$p^YF2Oew2X>wo%5F=sBc95h|^&4U8XEb9pVKiklWHe?<F=9$FWJ)pS zHB5!%asyD1fOwE7GfGQN_I8boH&S9?V6kUE!ypFFgNezooR^paXQjefY2aKp)N&&{ zl_e%aQ$Bib#F@&l<i#X#B16rKCT0d^D5(s4-b_qGq_V_hq*Mman~5n<7gCltlOPd| zk~dAvO_P$KIRUA>NK8R;Qwoxs5TTX|brU6dGYL!H1i2^`>LO6yG%+_#Hh}VxU6_jG z!c-&|E{ByKiD^(58j(_ZV6PaHAXx^KW8g(Cvco_QH6<c?(~ulGtO^lm+5#0KyoM<z zkdy}E<)+fTd`ki6MFRs<V?z^OLm1B}Ejf|qt*=oFMnhmU1V%$(Gz3O!2*A2{#_+}m z*7fujDaPg|7D-7|??A)sNAJ!dbtOsawjo@P+(o0dvtj0ewijGtzjKL^mBG-+*u<1U zkX6ykF)uweC(+9{wJ19^Co~bvbI1kr^pf*)y%Qm9K~^O%^^(-$5_Jy{i68`7mA!p4 zlQR-ibG*G0le3HS^TKl>e1|LuA7qYCE|eq4s^a08lbGifQd*RmmmZv$lbGjF0%n8M zc_%{Hf~=|@-uX$XUQR`oiFqZ#+4)JS4oP4(SXnlN&A`Co#*{{=H<bqKO(hwO_NG#4 z(VIf_TyXWKaQ64GWEg0B7iV7z+#$d*?twHGlZf268ZteXnXoPvd?3pVt&0U3V#G0M z1nNA4J6Yzm7|$A3ovLI+HwrSCJKFz;4}K+%_Wz+{*{FknhM0qZ^cX~hmWQAo|7ibz zq_%xW{XH52qaiRF0wXyDF#F%gJ!trTdh=vsa}!e<_W#kRn34MbpcXh}l9Y(4WQ6OH zr;TC#b!yX~`TrJ{Ze}(}_uq^`kVR2JEh5-8M8P@8)iK01-YL}6$3?-&z(9~iNkNIX zg%KjI5E|?nq~PhM;O8Hr;2Pl>91^Uc6zr&^5bWp^qM&YSoNR1rZkS|jl4y{WY+<0T z;NckTp`dPLYL=F2Zfa?6nPOmRVPR=tXl`y`WSDB6Vw`A}WN49SX=!MXoMxJmmSkd@ zmSS#{YLsedVUlE=Y;J67U~HhS;OOG(=_kmdtf0W#!VGnbv!k<ztBXR2qmz%Tf>J=J zlaHsflAaRCiAow=pfCfoJzbO(JpDoxTwL88Lw!ON{9GeK6v7;RLR}Ty{DY7*21f>m zxcbHiy9S23`Z>GCn;AJ-7+IRS#v41Cn8us97#PG`npv90JDHigIaxTn8M`<+DuF}7 zFVx3J0Yt=y_{YQSftf?84LT67xOoNzhs66i`noD9ggFK|dpHJZ7#nE9?T0G!aU@2S ztFNP{4_<RXp@?dk5t3zGnu07U3d+2B(5Rr6UloEw9D_m>!aYMg6pW1(oLqhU{oI2= zp$d*=K^9d7MP3i6r2#>nzK%hW3f``fNMQ^WjfYIKEBN~%$$>njqybA6nu0893aY&2 zjy@r-LD-X#f}@Lzg0sJ0a7d6NC=DS}8A34LNJ#-|Daa`Z;}typTwEiNtcR+CI&F0R zAF>(;=Xem70+bdbR-^O(piwmBY4*|i|D61!LAi)%wEsVn8@;1`9}R)g5Eu=C(GXyO z_5Tt5Z{!{{qW^DhY;Iyg!~Q?|(rKjrKWK6e(*H*+{Kv8o6SVN(9I?nU33&lDs1HjE z4C?>au@ob%|3|DiM&1c9#OKIiGtfk@Or_HdG`z<FpV+k^ZDJRatcVy^!dz>QG%KEj zJk*466KqL~Ihvd3ze8cT&N4%WCPw@Jqy7KU_5Uav<3`v26WByF+W#MI`;LadXb6mk hz-S1J=n#PQ{}KIfME~DN2j2g;G&43gv7|x&9{`lA=dJ(% 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