From 1bd62ff3ca67da590669c6ac237a5b1968b59df6 Mon Sep 17 00:00:00 2001 From: Romain Mallard Date: Thu, 18 Jun 2026 18:44:18 +0200 Subject: [PATCH] FEAT: deleteRoom endpoint and ResponseEntity usage --- data/hotel.sqlite | Bin 4927488 -> 4927488 bytes .../mallardromain/hotel/config/AppConfig.java | 16 +++++ .../hotel/config/DatabaseSeeder.java | 5 +- .../hotel/config/SecurityConfig.java | 9 +-- .../hotel/controller/RoomController.java | 62 ++++++++++++++---- .../com/mallardromain/hotel/model/Room.java | 2 +- .../com/mallardromain/hotel/model/User.java | 12 ++++ .../hotel/security/JWTFilter.java | 36 +++++----- .../hotel/service/RoomService.java | 18 ++--- .../hotel/service/UserService.java | 2 +- 10 files changed, 109 insertions(+), 53 deletions(-) create mode 100644 src/main/java/com/mallardromain/hotel/config/AppConfig.java diff --git a/data/hotel.sqlite b/data/hotel.sqlite index 9c93398c32e321b4b01da87e75a53afeecc76651..40c625224ca9831b210a73bcc164d1ce9d3e610b 100644 GIT binary patch delta 3288 zcmeIz&r=d{9LDj56;N74C0oVJEh)7OaS4!uNI+KNhtrapOox`;)g^w#vY>WJ>(ES> zau~;Rho(z6nmTv$W*)qE=#OZ|OOG>My7UJGhu0pT!*}*QpPe6{^gHlwq(4XyT`e%c z2ZA8nd(&7gU9yU!(fIRFy?nKaupuH~%g-hE_ z+VsfAPPLAmKl^l4>q{uTV5@VBz6t-u!9vGvo6P0 zHk++WGv#f5amklX`-FWihch~#`w+YleB8!IUfE7$qlnj}XG1w~2t zv`l7;D@2wv3%n-RG&Z68Yb`0%Qrz5X-BT^{jg2Vh;^xcAdR|!O6|NLzvu-gzw<1-; zaXF@@OABdnv$`aojlDWOdVPAN13i$?1qLvJ3A&*N%y14Uus|nq)Y53yl|kRb;c z_)G|yZO>#v3gO?4vVNPeUZeeF!eazKc76!i$<9w9J3ipUe$RZd=fm;9Va&&I9CcK( zm%K&ileZG^B-j(%7hUMQ-U}uN{F&VApTeY!IVbTD?MZ}twlA5bdTuG4!X*!S!T(ot zwe_&m<9|n~pmV%24>PCLo(oDI!UyvIOWo`9wS$nyX)}<}p+I*3F+N?friYoQ@IeLDh zD63mdxz*ZQgdZ1UTk9MVUMa!v&a>&S=na#ouZ|;lYn|}9gze@oP z9vA`!yx;>r1Rw}!AOtLgAp%hth7lNrF*pn7fP-;34-*iB3lN6{T!bWCg3E9PQg9Wn z!6Zz getRooms() { - return service.findAll(); + public ResponseEntity getRooms() { + try{ + List roomList = service.findAll(); + return ResponseEntity.ok(roomList); + } catch(RuntimeException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } + } - @PostMapping - public Room createRoom(@RequestBody Room room){ - return service.createRoom(room); + @PostMapping("/create") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity createRoom(@RequestBody Room room){ + try{ + Room createdRoom = service.createRoom(room); + return ResponseEntity.ok(createdRoom); + } catch(RuntimeException e){ + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } } - @PutMapping("/{id}/clean") - public Room setRoomClean( - @PathVariable Integer id - ){ - return service.setRoomClean(id); + public ResponseEntity setRoomClean(@PathVariable Integer id){ + try{ + Room updatedRoom = service.setRoomClean(id); + return ResponseEntity.ok(updatedRoom); + } catch (RuntimeException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } } @PutMapping("/{id}/dirty") - public Room setRoomDirty( - @PathVariable Integer id - ){ - return service.setRoomDirty(id); + public ResponseEntity setRoomDirty(@PathVariable Integer id) { + try { + Room updatedRoom = service.setRoomDirty(id); + return ResponseEntity.ok(updatedRoom); + } catch (RuntimeException e){ + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } + } + + @DeleteMapping("/delete/{id}") + @PreAuthorize("hasRole('ADMIN')") // Keep the boss door locked! + public ResponseEntity deleteRoom(@PathVariable Integer id) { + try{ + service.deleteRoom(id); + return ResponseEntity.ok("Room successfully deleted!"); + } catch (RuntimeException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage()); + } + + } } diff --git a/src/main/java/com/mallardromain/hotel/model/Room.java b/src/main/java/com/mallardromain/hotel/model/Room.java index 3ccd823..d3662d5 100644 --- a/src/main/java/com/mallardromain/hotel/model/Room.java +++ b/src/main/java/com/mallardromain/hotel/model/Room.java @@ -19,7 +19,7 @@ public class Room { } - public Room(Integer id, String number, String status){ + public Room(String number, String status){ //this.id = id; id is/should be generated by the DB this.number = number; this.status = status; diff --git a/src/main/java/com/mallardromain/hotel/model/User.java b/src/main/java/com/mallardromain/hotel/model/User.java index da36a7e..2612f3f 100644 --- a/src/main/java/com/mallardromain/hotel/model/User.java +++ b/src/main/java/com/mallardromain/hotel/model/User.java @@ -14,6 +14,9 @@ public class User { private String password; + @Column(nullable = false) + private String role = "USER"; + public User(){ } @@ -46,4 +49,13 @@ public class User { public void setPassword(String password){ this.password = password; } + + public String getRole(){ + return role; + } + + public void setRole(String role){ + this.role = role; + } + } diff --git a/src/main/java/com/mallardromain/hotel/security/JWTFilter.java b/src/main/java/com/mallardromain/hotel/security/JWTFilter.java index 76ff351..2cd5872 100644 --- a/src/main/java/com/mallardromain/hotel/security/JWTFilter.java +++ b/src/main/java/com/mallardromain/hotel/security/JWTFilter.java @@ -5,6 +5,8 @@ import java.util.Collections; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.WebAuthenticationDetails; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; @@ -23,9 +25,11 @@ import jakarta.servlet.http.HttpServletResponse; public class JWTFilter extends OncePerRequestFilter { private final JWTService jwtService; + private final UserDetailsService userDetailsService; - public JWTFilter(JWTService jwtService){ + public JWTFilter(JWTService jwtService, UserDetailsService userDetailsService){ this.jwtService = jwtService; + this.userDetailsService = userDetailsService; } @Override @@ -35,14 +39,9 @@ public class JWTFilter extends OncePerRequestFilter { FilterChain filterChain ) throws ServletException, IOException { - String authHeader = request - .getHeader("Authorization"); - - if ( authHeader == null - || - !authHeader.startsWith("Bearer ") - ) { + String authHeader = request.getHeader("Authorization"); + if ( authHeader == null || !authHeader.startsWith("Bearer ") ) { filterChain.doFilter(request, response); return; } @@ -51,23 +50,18 @@ public class JWTFilter extends OncePerRequestFilter { if (jwtService.isTockenValid(token)){ - String username = jwtService - .extractUsername(token); + String username = jwtService.extractUsername(token); - UsernamePasswordAuthenticationToken auth = - new UsernamePasswordAuthenticationToken( - username, + UserDetails userDetails = userDetailsService.loadUserByUsername(username); + + UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken( + userDetails, null, - Collections.emptyList() - ); - - auth.setDetails( - new WebAuthenticationDetailsSource() - .buildDetails(request) + userDetails.getAuthorities() ); - SecurityContextHolder.getContext() - .setAuthentication(auth); + auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request) ); + SecurityContextHolder.getContext().setAuthentication(auth); } filterChain.doFilter(request, response); diff --git a/src/main/java/com/mallardromain/hotel/service/RoomService.java b/src/main/java/com/mallardromain/hotel/service/RoomService.java index d4b13ea..d5b13bd 100644 --- a/src/main/java/com/mallardromain/hotel/service/RoomService.java +++ b/src/main/java/com/mallardromain/hotel/service/RoomService.java @@ -22,14 +22,7 @@ public class RoomService { return repo.findAll(); } - public Room createRoomTest() { - - Room room = new Room( - 666, - "test", - "clean" - ); - + public Room createRoomTest(Room room) { return repo.save(room); } @@ -47,7 +40,7 @@ public class RoomService { return repo.save(room); } - public Room setRoomDirty(Integer id){ + public Room setRoomDirty(Integer id){ Room room = repo.findById(id) .orElseThrow(() -> new RuntimeException("Room not found")); @@ -57,4 +50,11 @@ public class RoomService { return repo.save(room); } + public void deleteRoom(Integer id) { + if (!repo.existsById(id)) { + throw new RuntimeException("Room with ID " + id + " not found"); + } + repo.deleteById(id); + } + } \ No newline at end of file diff --git a/src/main/java/com/mallardromain/hotel/service/UserService.java b/src/main/java/com/mallardromain/hotel/service/UserService.java index 8b7b153..9c6ea49 100644 --- a/src/main/java/com/mallardromain/hotel/service/UserService.java +++ b/src/main/java/com/mallardromain/hotel/service/UserService.java @@ -40,7 +40,7 @@ public class UserService implements UserDetailsService { .map(user -> org.springframework.security.core.userdetails.User .withUsername(user.getUsername()) .password(user.getPassword()) - .authorities("USER") // Default role + .authorities("ROLE_" + user.getRole().toUpperCase()) // Default role .build() ) .orElseThrow(() -> new UsernameNotFoundException("User not found in DB"));