diff --git a/demo/src/main/java/com/example/demo/controller/UserController.java b/demo/src/main/java/com/example/demo/controller/UserController.java index 1321a22..1f0ee4e 100644 --- a/demo/src/main/java/com/example/demo/controller/UserController.java +++ b/demo/src/main/java/com/example/demo/controller/UserController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.example.demo.dto.UserDto; import com.example.demo.entity.User; import com.example.demo.service.UserService; @@ -36,22 +37,31 @@ public class UserController { //build get all users REST API @GetMapping - public List getAllUsers(){ + public List getAllUsers(){ return userService.getAllUsers(); } //build get user by id REST API // http://localhost:8080/api/users/(id number goes here) @GetMapping("{id}") - public ResponseEntity getUserById(@PathVariable("id") Integer userId){ - return new ResponseEntity(userService.getUserById(userId), HttpStatus.OK); + public ResponseEntity getUserById(@PathVariable("id") Integer userId){ + return new ResponseEntity(userService.getUserById(userId), HttpStatus.OK); + } + + //build create favorite REST API + @PostMapping("/{userId}/favorites/{recipeId}") + public ResponseEntity saveFavorite( @PathVariable Integer userId, @PathVariable Integer recipeId) { + + UserDto updatedUser = userService.saveFavorite(userId, recipeId); + + return new ResponseEntity<>(updatedUser, HttpStatus.OK); } //build update user REST API // http://localhost:8080/api/users/(id number goes here) @PutMapping("{id}") - public ResponseEntity updateUser(@PathVariable("id") Integer userId, @RequestBody User user){ - return new ResponseEntity(userService.updateUser(user, userId), HttpStatus.OK); + public ResponseEntity updateUser(@PathVariable("id") Integer userId, @RequestBody User user){ + return new ResponseEntity(userService.updateUser(user, userId), HttpStatus.OK); } //build delete user REST API @@ -60,5 +70,13 @@ public class UserController { userService.deleteUser(userId); return new ResponseEntity("User deleted succesfully!", HttpStatus.OK); } + + //build delete favorite REST API + @DeleteMapping("/{userId}/favorites/{recipeId}") + public ResponseEntity deleteFavorite( @PathVariable Integer userId, @PathVariable Integer recipeId) { + + userService.deleteFavorite(userId, recipeId); + return new ResponseEntity("Favorite deleted succesfully!", HttpStatus.OK); + } } diff --git a/demo/src/main/java/com/example/demo/dto/UserDto.java b/demo/src/main/java/com/example/demo/dto/UserDto.java index 7941a83..7f41309 100644 --- a/demo/src/main/java/com/example/demo/dto/UserDto.java +++ b/demo/src/main/java/com/example/demo/dto/UserDto.java @@ -2,11 +2,15 @@ package com.example.demo.dto; public class UserDto { private Integer id; + private String username; + private String email; public UserDto() {} - public UserDto(Integer id) { + public UserDto(Integer id, String username, String email) { this.id = id; + this.username = username; + this.email = email; } public Integer getId() { @@ -16,4 +20,22 @@ public class UserDto { public void setId(Integer id) { this.id = id; } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + } diff --git a/demo/src/main/java/com/example/demo/entity/Recipe.java b/demo/src/main/java/com/example/demo/entity/Recipe.java index 8e88a69..20b3264 100644 --- a/demo/src/main/java/com/example/demo/entity/Recipe.java +++ b/demo/src/main/java/com/example/demo/entity/Recipe.java @@ -54,6 +54,10 @@ public class Recipe { joinColumns = {@JoinColumn(name = "recipe_id")}, inverseJoinColumns = {@JoinColumn(name = "tag_id")}) private Set tags = new HashSet<>(); + + // User is the manager for this relationship + @ManyToMany(fetch = FetchType.LAZY, mappedBy = "FavRecipes") + private Set users = new HashSet<>(); // Default constructor @@ -161,6 +165,14 @@ public class Recipe { public void setTags(Set tags) { this.tags = tags; } + + public Set getUsers() { + return users; + } + + public void setUsers(Set users) { + this.users = users; + } diff --git a/demo/src/main/java/com/example/demo/entity/User.java b/demo/src/main/java/com/example/demo/entity/User.java index b32a9a7..3eca2fc 100644 --- a/demo/src/main/java/com/example/demo/entity/User.java +++ b/demo/src/main/java/com/example/demo/entity/User.java @@ -4,6 +4,9 @@ import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.Table; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; import jakarta.persistence.OneToMany; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -37,6 +40,13 @@ public class User { // User Recipe relationship @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) private Set recipes = new HashSet<>(); + + // Favorite relationship and also junction table + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "favorites", + joinColumns = {@JoinColumn(name = "userId")}, + inverseJoinColumns = {@JoinColumn(name = "recipeId")}) + private Set FavRecipes = new HashSet<>(); // Constructors public User() {} @@ -67,4 +77,14 @@ public class User { public LocalDateTime getCreatedAt() { return createdAt; } public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + + public Set getFavRecipes() { + return FavRecipes; + } + + public void setFavRecipes(Set favRecipes) { + FavRecipes = favRecipes; + } + + } \ No newline at end of file diff --git a/demo/src/main/java/com/example/demo/service/Impl/RecipeServiceImpl.java b/demo/src/main/java/com/example/demo/service/Impl/RecipeServiceImpl.java index 02dc5f3..3d8fa8e 100644 --- a/demo/src/main/java/com/example/demo/service/Impl/RecipeServiceImpl.java +++ b/demo/src/main/java/com/example/demo/service/Impl/RecipeServiceImpl.java @@ -82,7 +82,7 @@ private TagRepo tagRepository; )) .toList(); - UserDto userDto = new UserDto(recipe.getUser().getId()); + UserDto userDto = new UserDto(recipe.getUser().getId(), recipe.getUser().getUsername(), recipe.getUser().getEmail()); return new RecipeDto( recipe.getTitle(), diff --git a/demo/src/main/java/com/example/demo/service/Impl/UserServiceImpl.java b/demo/src/main/java/com/example/demo/service/Impl/UserServiceImpl.java index b3467c0..d3cef4c 100644 --- a/demo/src/main/java/com/example/demo/service/Impl/UserServiceImpl.java +++ b/demo/src/main/java/com/example/demo/service/Impl/UserServiceImpl.java @@ -1,23 +1,44 @@ package com.example.demo.service.Impl; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.springframework.stereotype.Service; +import com.example.demo.dto.ImageDto; +import com.example.demo.dto.RecipeDto; +import com.example.demo.dto.RecipeIngredientDto; +import com.example.demo.dto.StepDto; +import com.example.demo.dto.TagDto; +import com.example.demo.dto.UserDto; +import com.example.demo.entity.Recipe; import com.example.demo.entity.User; import com.example.demo.exception.NotFoundException; +import com.example.demo.repository.RecipeRepo; import com.example.demo.repository.UserRepo; import com.example.demo.service.UserService; +import jakarta.transaction.Transactional; + @Service public class UserServiceImpl implements UserService{ private UserRepo userRepository; + private RecipeRepo recipeRepository; - public UserServiceImpl(UserRepo userRepository) { + public UserServiceImpl(UserRepo userRepository, RecipeRepo recipeRepository) { super(); this.userRepository = userRepository; + this.recipeRepository = recipeRepository; + } + + public UserDto convertToDto(User user) { + return new UserDto( + user.getId(), + user.getUsername(), + user.getEmail() + ); } @Override @@ -26,19 +47,42 @@ public class UserServiceImpl implements UserService{ } @Override - public List getAllUsers() { - return userRepository.findAll(); - } - - @Override - public User getUserById(Integer Id) { + public List getAllUsers() { - return userRepository.findById(Id).orElseThrow(() -> - new NotFoundException("User", "id", Id)); + List list = new ArrayList<>(); + for (User user : userRepository.findAll()) { + UserDto userDto = convertToDto(user); + list.add(userDto); + } + + return list; } @Override - public User updateUser(User user, Integer Id) { + public UserDto getUserById(Integer Id) { + + return convertToDto(userRepository.findById(Id).orElseThrow(() -> + new NotFoundException("User", "id", Id))); + } + + @Override + @Transactional + public UserDto saveFavorite(Integer userId, Integer recipeId) { + User existingUser = userRepository.findById(userId).orElseThrow( + () -> new NotFoundException("User", "id", userId)); + + Recipe existingRecipe = recipeRepository.findById(recipeId).orElseThrow( + () -> new NotFoundException("Recipe", "id", recipeId)); + + existingUser.getFavRecipes().add(existingRecipe); + userRepository.save(existingUser); + + + return convertToDto(existingUser); + } + + @Override + public UserDto updateUser(User user, Integer Id) { User existingUser = userRepository.findById(Id).orElseThrow( () -> new NotFoundException("User", "id", Id)); @@ -48,7 +92,7 @@ public class UserServiceImpl implements UserService{ userRepository.save(existingUser); - return existingUser; + return convertToDto(existingUser); } @Override @@ -58,4 +102,20 @@ public class UserServiceImpl implements UserService{ userRepository.deleteById(Id); } + @Override + @Transactional + public void deleteFavorite(Integer userId, Integer recipeId) { + User existingUser = userRepository.findById(userId).orElseThrow( + () -> new NotFoundException("User", "id", userId)); + + Recipe existingRecipe = recipeRepository.findById(recipeId).orElseThrow( + () -> new NotFoundException("Recipe", "id", recipeId)); + userRepository.save(existingUser); + + existingUser.getFavRecipes().remove(existingRecipe); + + } + + + } diff --git a/demo/src/main/java/com/example/demo/service/UserService.java b/demo/src/main/java/com/example/demo/service/UserService.java index d1c627b..d4de0ea 100644 --- a/demo/src/main/java/com/example/demo/service/UserService.java +++ b/demo/src/main/java/com/example/demo/service/UserService.java @@ -2,12 +2,16 @@ package com.example.demo.service; import java.util.List; +import com.example.demo.dto.UserDto; import com.example.demo.entity.User; public interface UserService { + UserDto convertToDto(User user); User saveUser(User user); - List getAllUsers(); - User getUserById(Integer Id); - User updateUser(User user, Integer Id); + List getAllUsers(); + UserDto getUserById(Integer Id); + UserDto saveFavorite(Integer userId, Integer recipeId); + UserDto updateUser(User user, Integer Id); void deleteUser(Integer Id); + void deleteFavorite(Integer userId, Integer recipeId); }