diff --git a/backend/src/main/java/net/pengcook/category/domain/Category.java b/backend/src/main/java/net/pengcook/category/domain/Category.java index f17dbb05..79c07045 100644 --- a/backend/src/main/java/net/pengcook/category/domain/Category.java +++ b/backend/src/main/java/net/pengcook/category/domain/Category.java @@ -7,11 +7,13 @@ import jakarta.persistence.Id; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) +@Getter public class Category { @Id diff --git a/backend/src/main/java/net/pengcook/category/domain/CategoryRecipe.java b/backend/src/main/java/net/pengcook/category/domain/CategoryRecipe.java index dfe914b9..222534b1 100644 --- a/backend/src/main/java/net/pengcook/category/domain/CategoryRecipe.java +++ b/backend/src/main/java/net/pengcook/category/domain/CategoryRecipe.java @@ -8,6 +8,7 @@ import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import net.pengcook.recipe.domain.Recipe; @@ -22,6 +23,7 @@ public class CategoryRecipe { @ManyToOne @JoinColumn(name = "category_id") + @Getter private Category category; @ManyToOne diff --git a/backend/src/main/java/net/pengcook/category/dto/CategoryResponse.java b/backend/src/main/java/net/pengcook/category/dto/CategoryResponse.java new file mode 100644 index 00000000..6523aaa8 --- /dev/null +++ b/backend/src/main/java/net/pengcook/category/dto/CategoryResponse.java @@ -0,0 +1,10 @@ +package net.pengcook.category.dto; + +import net.pengcook.category.domain.Category; + +public record CategoryResponse(long categoryId, String categoryName) { + + public CategoryResponse(Category category) { + this(category.getId(), category.getName()); + } +} diff --git a/backend/src/main/java/net/pengcook/category/repository/CategoryRecipeRepository.java b/backend/src/main/java/net/pengcook/category/repository/CategoryRecipeRepository.java index 6b17e491..e91d5623 100644 --- a/backend/src/main/java/net/pengcook/category/repository/CategoryRecipeRepository.java +++ b/backend/src/main/java/net/pengcook/category/repository/CategoryRecipeRepository.java @@ -18,4 +18,6 @@ public interface CategoryRecipeRepository extends JpaRepository findRecipeIdsByCategoryName(String categoryName, Pageable pageable); void deleteByRecipe(Recipe recipe); + + List findAllByRecipeId(Long recipeId); } diff --git a/backend/src/main/java/net/pengcook/category/service/CategoryService.java b/backend/src/main/java/net/pengcook/category/service/CategoryService.java index 0364f488..8bdabf8c 100644 --- a/backend/src/main/java/net/pengcook/category/service/CategoryService.java +++ b/backend/src/main/java/net/pengcook/category/service/CategoryService.java @@ -7,6 +7,7 @@ import net.pengcook.category.repository.CategoryRecipeRepository; import net.pengcook.category.repository.CategoryRepository; import net.pengcook.recipe.domain.Recipe; +import net.pengcook.category.dto.CategoryResponse; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,6 +28,15 @@ public void deleteCategoryRecipe(Recipe recipe) { categoryRecipeRepository.deleteByRecipe(recipe); } + @Transactional(readOnly = true) + public List findCategoryByRecipe(Recipe recipe) { + List categoryRecipes = categoryRecipeRepository.findAllByRecipeId(recipe.getId()); + return categoryRecipes.stream() + .map(CategoryRecipe::getCategory) + .map(CategoryResponse::new) + .toList(); + } + private void saveCategoryRecipe(Recipe recipe, String name) { Category category = categoryRepository.findByName(name) .orElseGet(() -> categoryRepository.save(new Category(name))); diff --git a/backend/src/main/java/net/pengcook/comment/domain/Comment.java b/backend/src/main/java/net/pengcook/comment/domain/Comment.java index a28013ba..f391cd8f 100644 --- a/backend/src/main/java/net/pengcook/comment/domain/Comment.java +++ b/backend/src/main/java/net/pengcook/comment/domain/Comment.java @@ -12,14 +12,14 @@ import lombok.Getter; import lombok.NoArgsConstructor; import net.pengcook.recipe.domain.Recipe; -import net.pengcook.user.domain.AuthorAble; +import net.pengcook.user.domain.Ownable; import net.pengcook.user.domain.User; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class Comment implements AuthorAble { +public class Comment implements Ownable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -42,7 +42,7 @@ public Comment(User user, Recipe recipe, String message, LocalDateTime createdAt } @Override - public long getAuthorId() { + public long getOwnerId() { return user.getId(); } } diff --git a/backend/src/main/java/net/pengcook/ingredient/dto/IngredientResponse.java b/backend/src/main/java/net/pengcook/ingredient/dto/IngredientResponse.java new file mode 100644 index 00000000..41a27006 --- /dev/null +++ b/backend/src/main/java/net/pengcook/ingredient/dto/IngredientResponse.java @@ -0,0 +1,15 @@ +package net.pengcook.ingredient.dto; + +import net.pengcook.ingredient.domain.IngredientRecipe; +import net.pengcook.ingredient.domain.Requirement; + +public record IngredientResponse(long ingredientId, String ingredientName, Requirement requirement) { + + public IngredientResponse(IngredientRecipe ingredientRecipe) { + this( + ingredientRecipe.getIngredient().getId(), + ingredientRecipe.getIngredient().getName(), + ingredientRecipe.getRequirement() + ); + } +} diff --git a/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java b/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java index 63918ed1..970caec4 100644 --- a/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java +++ b/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java @@ -9,7 +9,9 @@ import net.pengcook.ingredient.domain.IngredientRecipe; import net.pengcook.ingredient.domain.Requirement; import net.pengcook.ingredient.dto.IngredientCreateRequest; +import net.pengcook.ingredient.dto.IngredientResponse; import net.pengcook.ingredient.exception.InvalidNameException; +import net.pengcook.ingredient.repository.IngredientRecipeRepository; import net.pengcook.ingredient.repository.IngredientRepository; import net.pengcook.recipe.domain.Recipe; import org.springframework.stereotype.Service; @@ -21,6 +23,7 @@ public class IngredientService { private final IngredientRepository ingredientRepository; + private final IngredientRecipeRepository ingredientRecipeRepository; private final IngredientRecipeService ingredientRecipeService; private final IngredientSubstitutionService ingredientSubstitutionService; @@ -32,6 +35,14 @@ public void register(List requests, Recipe recipe) { } } + @Transactional(readOnly = true) + public List findIngredientByRecipe(Recipe recipe) { + return ingredientRecipeRepository.findAllByRecipeId(recipe.getId()) + .stream() + .map(IngredientResponse::new) + .toList(); + } + private void registerOne(IngredientCreateRequest request, Recipe recipe) { Ingredient ingredient = registerOrGetIngredient(request.name()); IngredientRecipe ingredientRecipe = registerIngredientRecipe(recipe, request, ingredient); @@ -87,5 +98,4 @@ private boolean hasDuplicateName(List names) { HashSet nonDuplicate = new HashSet<>(names); return (names.size() != nonDuplicate.size()); } - } diff --git a/backend/src/main/java/net/pengcook/recipe/domain/Recipe.java b/backend/src/main/java/net/pengcook/recipe/domain/Recipe.java index 6f1a656a..b48500fe 100644 --- a/backend/src/main/java/net/pengcook/recipe/domain/Recipe.java +++ b/backend/src/main/java/net/pengcook/recipe/domain/Recipe.java @@ -14,13 +14,14 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import net.pengcook.user.domain.Ownable; import net.pengcook.user.domain.User; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Getter -public class Recipe { +public class Recipe implements Ownable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -97,6 +98,11 @@ public void decreaseCommentCount() { commentCount--; } + @Override + public long getOwnerId() { + return author.getId(); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/backend/src/main/java/net/pengcook/recipe/dto/AuthorResponse.java b/backend/src/main/java/net/pengcook/recipe/dto/AuthorResponse.java index 20337693..bad01f95 100644 --- a/backend/src/main/java/net/pengcook/recipe/dto/AuthorResponse.java +++ b/backend/src/main/java/net/pengcook/recipe/dto/AuthorResponse.java @@ -1,4 +1,10 @@ package net.pengcook.recipe.dto; +import net.pengcook.user.domain.User; + public record AuthorResponse(long authorId, String authorName, String authorImage) { + + public AuthorResponse(User author) { + this(author.getId(), author.getUsername(), author.getImage()); + } } diff --git a/backend/src/main/java/net/pengcook/recipe/dto/CategoryResponse.java b/backend/src/main/java/net/pengcook/recipe/dto/CategoryResponse.java deleted file mode 100644 index 16af5ccd..00000000 --- a/backend/src/main/java/net/pengcook/recipe/dto/CategoryResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package net.pengcook.recipe.dto; - -public record CategoryResponse(long categoryId, String categoryName) { -} diff --git a/backend/src/main/java/net/pengcook/recipe/dto/IngredientResponse.java b/backend/src/main/java/net/pengcook/recipe/dto/IngredientResponse.java deleted file mode 100644 index 20d441fa..00000000 --- a/backend/src/main/java/net/pengcook/recipe/dto/IngredientResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.pengcook.recipe.dto; - -import net.pengcook.ingredient.domain.Requirement; - -public record IngredientResponse(long ingredientId, String ingredientName, Requirement requirement) { -} diff --git a/backend/src/main/java/net/pengcook/recipe/dto/RecipeDataResponse.java b/backend/src/main/java/net/pengcook/recipe/dto/RecipeDataResponse.java deleted file mode 100644 index 06d9491c..00000000 --- a/backend/src/main/java/net/pengcook/recipe/dto/RecipeDataResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.pengcook.recipe.dto; - -import java.time.LocalDateTime; -import java.time.LocalTime; -import net.pengcook.ingredient.domain.Requirement; -import net.pengcook.user.domain.AuthorAble; - -public record RecipeDataResponse( - long recipeId, - String title, - long authorId, - String authorName, - String authorImage, - LocalTime cookingTime, - String thumbnail, - int difficulty, - int likeCount, - int commentCount, - String description, - LocalDateTime createdAt, - long categoryId, - String categoryName, - long ingredientId, - String ingredientName, - Requirement ingredientRequirement -) implements AuthorAble { - - @Override - public long getAuthorId() { - return authorId; - } -} diff --git a/backend/src/main/java/net/pengcook/recipe/dto/RecipeDescriptionResponse.java b/backend/src/main/java/net/pengcook/recipe/dto/RecipeDescriptionResponse.java index d367955f..3b015cb2 100644 --- a/backend/src/main/java/net/pengcook/recipe/dto/RecipeDescriptionResponse.java +++ b/backend/src/main/java/net/pengcook/recipe/dto/RecipeDescriptionResponse.java @@ -4,6 +4,9 @@ import java.time.LocalTime; import java.util.List; import net.pengcook.authentication.domain.UserInfo; +import net.pengcook.category.dto.CategoryResponse; +import net.pengcook.ingredient.dto.IngredientResponse; +import net.pengcook.recipe.domain.Recipe; public record RecipeDescriptionResponse( long recipeId, @@ -24,25 +27,25 @@ public record RecipeDescriptionResponse( public RecipeDescriptionResponse( UserInfo userInfo, - RecipeDataResponse firstResponse, + Recipe recipe, List category, List ingredient, boolean isLike ) { this( - firstResponse.recipeId(), - firstResponse.title(), - new AuthorResponse(firstResponse.authorId(), firstResponse.authorName(), firstResponse.authorImage()), - firstResponse.cookingTime(), - firstResponse.thumbnail(), - firstResponse.difficulty(), - firstResponse.likeCount(), - firstResponse.commentCount(), - firstResponse.description(), - firstResponse.createdAt(), + recipe.getId(), + recipe.getTitle(), + new AuthorResponse(recipe.getAuthor()), + recipe.getCookingTime(), + recipe.getThumbnail(), + recipe.getDifficulty(), + recipe.getLikeCount(), + recipe.getCommentCount(), + recipe.getDescription(), + recipe.getCreatedAt(), category, ingredient, - userInfo.isSameUser(firstResponse.authorId()), + userInfo.isSameUser(recipe.getAuthor().getId()), isLike ); } diff --git a/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeResponse.java b/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeResponse.java index 572d8d8d..d05dc7a0 100644 --- a/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeResponse.java +++ b/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeResponse.java @@ -1,7 +1,7 @@ package net.pengcook.recipe.dto; import java.time.LocalDateTime; -import net.pengcook.user.domain.AuthorAble; +import net.pengcook.user.domain.Ownable; public record RecipeHomeResponse( long recipeId, @@ -13,10 +13,10 @@ public record RecipeHomeResponse( int likeCount, int commentCount, LocalDateTime createdAt -) implements AuthorAble { +) implements Ownable { @Override - public long getAuthorId() { + public long getOwnerId() { return authorId; } } diff --git a/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeWithMineResponse.java b/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeWithMineResponse.java index 7bca43cc..b87b2579 100644 --- a/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeWithMineResponse.java +++ b/backend/src/main/java/net/pengcook/recipe/dto/RecipeHomeWithMineResponse.java @@ -4,6 +4,9 @@ import java.time.LocalTime; import java.util.List; import net.pengcook.authentication.domain.UserInfo; +import net.pengcook.category.dto.CategoryResponse; +import net.pengcook.ingredient.dto.IngredientResponse; +import net.pengcook.recipe.domain.Recipe; public record RecipeHomeWithMineResponse( long recipeId, @@ -23,25 +26,25 @@ public record RecipeHomeWithMineResponse( public RecipeHomeWithMineResponse( UserInfo userInfo, - RecipeDataResponse firstResponse, + Recipe recipe, List category, List ingredient ) { this( - firstResponse.recipeId(), - firstResponse.title(), - new AuthorResponse(firstResponse.authorId(), firstResponse.authorName(), firstResponse.authorImage()), - firstResponse.cookingTime(), - firstResponse.thumbnail(), - firstResponse.difficulty(), - firstResponse.likeCount(), - firstResponse.commentCount(), - firstResponse.description(), - firstResponse.createdAt(), + recipe.getId(), + recipe.getTitle(), + new AuthorResponse(recipe.getAuthor()), + recipe.getCookingTime(), + recipe.getThumbnail(), + recipe.getDifficulty(), + recipe.getLikeCount(), + recipe.getCommentCount(), + recipe.getDescription(), + recipe.getCreatedAt(), category, ingredient, - userInfo.isSameUser(firstResponse.authorId()) + userInfo.isSameUser(recipe.getAuthor().getId()) ); } } diff --git a/backend/src/main/java/net/pengcook/recipe/repository/RecipeRepository.java b/backend/src/main/java/net/pengcook/recipe/repository/RecipeRepository.java index 577df0ee..4726678f 100644 --- a/backend/src/main/java/net/pengcook/recipe/repository/RecipeRepository.java +++ b/backend/src/main/java/net/pengcook/recipe/repository/RecipeRepository.java @@ -3,7 +3,6 @@ import jakarta.annotation.Nullable; import java.util.List; import net.pengcook.recipe.domain.Recipe; -import net.pengcook.recipe.dto.RecipeDataResponse; import net.pengcook.recipe.dto.RecipeHomeResponse; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -48,34 +47,7 @@ List findRecipeIdsByCategoryAndKeyword( @Param("userId") @Nullable Long userId ); - @Query(""" - SELECT new net.pengcook.recipe.dto.RecipeDataResponse( - r.id, - r.title, - r.author.id, - r.author.username, - r.author.image, - r.cookingTime, - r.thumbnail, - r.difficulty, - r.likeCount, - r.commentCount, - r.description, - r.createdAt, - c.id, - c.name, - i.id, - i.name, - ir.requirement - ) - FROM Recipe r - JOIN FETCH CategoryRecipe cr ON cr.recipe = r - JOIN FETCH Category c ON cr.category = c - JOIN FETCH IngredientRecipe ir ON ir.recipe = r - JOIN FETCH Ingredient i ON ir.ingredient = i - WHERE r.id IN :recipeIds - """) - List findRecipeData(List recipeIds); + List findAllByIdIn(List recipeIds); @Query(""" SELECT new net.pengcook.recipe.dto.RecipeHomeResponse( @@ -94,35 +66,6 @@ List findRecipeIdsByCategoryAndKeyword( """) List findRecipeDataV1(List recipeIds); - @Query(""" - SELECT new net.pengcook.recipe.dto.RecipeDataResponse( - r.id, - r.title, - r.author.id, - r.author.username, - r.author.image, - r.cookingTime, - r.thumbnail, - r.difficulty, - r.likeCount, - r.commentCount, - r.description, - r.createdAt, - c.id, - c.name, - i.id, - i.name, - ir.requirement - ) - FROM Recipe r - JOIN FETCH CategoryRecipe cr ON cr.recipe = r - JOIN FETCH Category c ON cr.category = c - JOIN FETCH IngredientRecipe ir ON ir.recipe = r - JOIN FETCH Ingredient i ON ir.ingredient = i - WHERE r.id = :recipeId - """) - List findRecipeData(long recipeId); - @Query(""" SELECT r.id FROM Recipe r diff --git a/backend/src/main/java/net/pengcook/recipe/service/RecipeService.java b/backend/src/main/java/net/pengcook/recipe/service/RecipeService.java index 3759dbd5..46942d4e 100644 --- a/backend/src/main/java/net/pengcook/recipe/service/RecipeService.java +++ b/backend/src/main/java/net/pengcook/recipe/service/RecipeService.java @@ -1,25 +1,22 @@ package net.pengcook.recipe.service; import java.time.LocalTime; -import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import net.pengcook.authentication.domain.UserInfo; +import net.pengcook.category.dto.CategoryResponse; import net.pengcook.category.service.CategoryService; import net.pengcook.comment.service.CommentService; import net.pengcook.image.service.ImageClientService; +import net.pengcook.ingredient.dto.IngredientResponse; import net.pengcook.ingredient.service.IngredientRecipeService; import net.pengcook.ingredient.service.IngredientService; import net.pengcook.like.repository.RecipeLikeRepository; import net.pengcook.like.service.RecipeLikeService; import net.pengcook.recipe.domain.Recipe; -import net.pengcook.recipe.dto.CategoryResponse; -import net.pengcook.recipe.dto.IngredientResponse; import net.pengcook.recipe.dto.PageRecipeRequest; -import net.pengcook.recipe.dto.RecipeDataResponse; import net.pengcook.recipe.dto.RecipeDescriptionResponse; import net.pengcook.recipe.dto.RecipeHomeResponse; import net.pengcook.recipe.dto.RecipeHomeWithMineResponse; @@ -27,6 +24,7 @@ import net.pengcook.recipe.dto.RecipeRequest; import net.pengcook.recipe.dto.RecipeResponse; import net.pengcook.recipe.dto.RecipeUpdateRequest; +import net.pengcook.recipe.exception.NotFoundException; import net.pengcook.recipe.exception.UnauthorizedException; import net.pengcook.recipe.repository.RecipeRepository; import net.pengcook.recipe.repository.RecipeStepRepository; @@ -70,8 +68,7 @@ public List readRecipes(UserInfo userInfo, PageRecip pageRecipeRequest.userId() ); - List recipeDataResponses = recipeRepository.findRecipeData(recipeIds); - return convertToMainRecipeResponses(userInfo, recipeDataResponses); + return getRecipeHomeWithMineResponses(userInfo, recipeIds); } @Transactional(readOnly = true) @@ -135,9 +132,8 @@ private List findRecipeIdsBySingleCondition(PageRecipeRequest pageRecipeRe @Transactional(readOnly = true) public List readLikeRecipes(UserInfo userInfo) { List likeRecipeIds = likeRepository.findRecipeIdsByUserId(userInfo.getId()); - List recipeDataResponses = recipeRepository.findRecipeData(likeRecipeIds); - return convertToMainRecipeResponses(userInfo, recipeDataResponses); + return getRecipeHomeWithMineResponses(userInfo, likeRecipeIds); } @Transactional(readOnly = true) @@ -218,16 +214,13 @@ public void updateRecipe(UserInfo userInfo, Long recipeId, RecipeUpdateRequest r @Transactional(readOnly = true) public RecipeDescriptionResponse readRecipeDescription(UserInfo userInfo, long recipeId) { - List recipeDataResponses = recipeRepository.findRecipeData(recipeId); + Recipe recipe = recipeRepository.findById(recipeId) + .orElseThrow(() -> new NotFoundException("존재하지 않는 레시피입니다.")); + List categories = categoryService.findCategoryByRecipe(recipe); + List ingredients = ingredientService.findIngredientByRecipe(recipe); boolean isLike = likeRepository.existsByUserIdAndRecipeId(userInfo.getId(), recipeId); - return new RecipeDescriptionResponse( - userInfo, - recipeDataResponses.getFirst(), - getCategoryResponses(recipeDataResponses), - getIngredientResponses(recipeDataResponses), - isLike - ); + return new RecipeDescriptionResponse(userInfo, recipe, categories, ingredients, isLike); } @Transactional @@ -245,44 +238,16 @@ public void deleteRecipe(UserInfo userInfo, long recipeId) { }); } - private List convertToMainRecipeResponses( - UserInfo userInfo, - List recipeDataResponses - ) { - Collection> groupedRecipeData = recipeDataResponses.stream() - .collect(Collectors.groupingBy(RecipeDataResponse::recipeId)) - .values(); - - return groupedRecipeData.stream() - .map(data -> getMainRecipeResponse(userInfo, data)) + private List getRecipeHomeWithMineResponses(UserInfo userInfo, List recipeIds) { + List recipes = recipeRepository.findAllByIdIn(recipeIds); + return recipes.stream() + .map(recipe -> { + List categories = categoryService.findCategoryByRecipe(recipe); + List ingredients = ingredientService.findIngredientByRecipe(recipe); + return new RecipeHomeWithMineResponse(userInfo, recipe, categories, ingredients); + }) .sorted(Comparator.comparing(RecipeHomeWithMineResponse::recipeId).reversed()) - .collect(Collectors.toList()); - } - - private RecipeHomeWithMineResponse getMainRecipeResponse(UserInfo userInfo, - List groupedResponses) { - RecipeDataResponse firstResponse = groupedResponses.getFirst(); - - return new RecipeHomeWithMineResponse( - userInfo, - firstResponse, - getCategoryResponses(groupedResponses), - getIngredientResponses(groupedResponses) - ); - } - - private List getIngredientResponses(List groupedResponses) { - return groupedResponses.stream() - .map(r -> new IngredientResponse(r.ingredientId(), r.ingredientName(), r.ingredientRequirement())) - .distinct() - .collect(Collectors.toList()); - } - - private List getCategoryResponses(List groupedResponses) { - return groupedResponses.stream() - .map(r -> new CategoryResponse(r.categoryId(), r.categoryName())) - .distinct() - .collect(Collectors.toList()); + .toList(); } private void verifyRecipeOwner(UserInfo userInfo, Recipe recipe) { diff --git a/backend/src/main/java/net/pengcook/user/aop/BlockedUserFilterAspect.java b/backend/src/main/java/net/pengcook/user/aop/BlockedUserFilterAspect.java index 74e783ac..b382e93f 100644 --- a/backend/src/main/java/net/pengcook/user/aop/BlockedUserFilterAspect.java +++ b/backend/src/main/java/net/pengcook/user/aop/BlockedUserFilterAspect.java @@ -4,7 +4,7 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import net.pengcook.authentication.domain.UserInfo; -import net.pengcook.user.domain.AuthorAble; +import net.pengcook.user.domain.Ownable; import net.pengcook.user.domain.BlockedUserGroup; import net.pengcook.user.service.UserService; import org.aspectj.lang.ProceedingJoinPoint; @@ -22,64 +22,64 @@ public class BlockedUserFilterAspect { private final UserService userService; - @Pointcut("execution(java.util.List net.pengcook..repository..*(..))") - public void repositoryMethodsReturningAuthorAbleList() { + @Pointcut("execution(java.util.List net.pengcook..repository..*(..))") + public void repositoryMethodsReturningOwnableList() { } - @Around("repositoryMethodsReturningAuthorAbleList()") + @Around("repositoryMethodsReturningOwnableList()") public Object filterBlockedAuthorsFromList(ProceedingJoinPoint joinPoint) throws Throwable { - List authorAbles = (List) joinPoint.proceed(); + List ownables = (List) joinPoint.proceed(); UserInfo userInfo = getCurrentUserInfo(); if (userInfo == null) { - return authorAbles; + return ownables; } BlockedUserGroup blockedUserGroup = userService.getBlockedUserGroup(userInfo.getId()); - return filterBlockedUsers(authorAbles, blockedUserGroup); + return filterBlockedUsers(ownables, blockedUserGroup); } - @Pointcut("execution(java.util.Optional net.pengcook..repository..*(..))") - public void repositoryMethodsReturningOptionalAuthorAble() { + @Pointcut("execution(java.util.Optional net.pengcook..repository..*(..))") + public void repositoryMethodsReturningOptionalOwnable() { } - @Around("repositoryMethodsReturningOptionalAuthorAble()") + @Around("repositoryMethodsReturningOptionalOwnable()") public Object filterBlockedAuthorFromOptional(ProceedingJoinPoint joinPoint) throws Throwable { - Optional authorAbleOptional = (Optional) joinPoint.proceed(); + Optional ownableOptional = (Optional) joinPoint.proceed(); UserInfo userInfo = getCurrentUserInfo(); - if (userInfo == null || authorAbleOptional.isEmpty()) { - return authorAbleOptional; + if (userInfo == null || ownableOptional.isEmpty()) { + return ownableOptional; } BlockedUserGroup blockedUserGroup = userService.getBlockedUserGroup(userInfo.getId()); - if (blockedUserGroup.isBlocked(authorAbleOptional.get().getAuthorId())) { + if (blockedUserGroup.isBlocked(ownableOptional.get().getOwnerId())) { return Optional.empty(); } - return authorAbleOptional; + return ownableOptional; } - @Pointcut("execution(net.pengcook.user.domain.AuthorAble+ net.pengcook..repository..*(..))") - public void repositoryMethodsReturningAuthorAble() { + @Pointcut("execution(net.pengcook.user.domain.Ownable+ net.pengcook..repository..*(..))") + public void repositoryMethodsReturningOwnable() { } - @Around("repositoryMethodsReturningAuthorAble()") + @Around("repositoryMethodsReturningOwnable()") public Object filterBlockedAuthor(ProceedingJoinPoint joinPoint) throws Throwable { - AuthorAble authorAble = (AuthorAble) joinPoint.proceed(); + Ownable ownable = (Ownable) joinPoint.proceed(); UserInfo userInfo = getCurrentUserInfo(); if (userInfo == null) { - return authorAble; + return ownable; } BlockedUserGroup blockedUserGroup = userService.getBlockedUserGroup(userInfo.getId()); - if (blockedUserGroup.isBlocked(authorAble.getAuthorId())) { + if (blockedUserGroup.isBlocked(ownable.getOwnerId())) { return null; } - return authorAble; + return ownable; } private UserInfo getCurrentUserInfo() { @@ -91,9 +91,9 @@ private UserInfo getCurrentUserInfo() { } } - private List filterBlockedUsers(List authorAbles, BlockedUserGroup blockedUserGroup) { - return authorAbles.stream() - .filter(item -> !blockedUserGroup.isBlocked(item.getAuthorId())) + private List filterBlockedUsers(List ownables, BlockedUserGroup blockedUserGroup) { + return ownables.stream() + .filter(item -> !blockedUserGroup.isBlocked(item.getOwnerId())) .toList(); } } diff --git a/backend/src/main/java/net/pengcook/user/domain/AuthorAble.java b/backend/src/main/java/net/pengcook/user/domain/AuthorAble.java deleted file mode 100644 index 278d2041..00000000 --- a/backend/src/main/java/net/pengcook/user/domain/AuthorAble.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.pengcook.user.domain; - -public interface AuthorAble { - - long getAuthorId(); -} diff --git a/backend/src/main/java/net/pengcook/user/domain/Ownable.java b/backend/src/main/java/net/pengcook/user/domain/Ownable.java new file mode 100644 index 00000000..9098e8ee --- /dev/null +++ b/backend/src/main/java/net/pengcook/user/domain/Ownable.java @@ -0,0 +1,6 @@ +package net.pengcook.user.domain; + +public interface Ownable { + + long getOwnerId(); +} diff --git a/backend/src/test/java/net/pengcook/recipe/controller/RecipeControllerTest.java b/backend/src/test/java/net/pengcook/recipe/controller/RecipeControllerTest.java index 83a18623..4c98d9fa 100644 --- a/backend/src/test/java/net/pengcook/recipe/controller/RecipeControllerTest.java +++ b/backend/src/test/java/net/pengcook/recipe/controller/RecipeControllerTest.java @@ -21,8 +21,8 @@ import net.pengcook.ingredient.domain.Requirement; import net.pengcook.ingredient.dto.IngredientCreateRequest; import net.pengcook.recipe.dto.AuthorResponse; -import net.pengcook.recipe.dto.CategoryResponse; -import net.pengcook.recipe.dto.IngredientResponse; +import net.pengcook.category.dto.CategoryResponse; +import net.pengcook.ingredient.dto.IngredientResponse; import net.pengcook.recipe.dto.RecipeDescriptionResponse; import net.pengcook.recipe.dto.RecipeHomeResponse; import net.pengcook.recipe.dto.RecipeHomeWithMineResponse; diff --git a/backend/src/test/java/net/pengcook/user/aop/BlockedUserFilterAspectTest.java b/backend/src/test/java/net/pengcook/user/aop/BlockedUserFilterAspectTest.java index 764759b8..ac95dcef 100644 --- a/backend/src/test/java/net/pengcook/user/aop/BlockedUserFilterAspectTest.java +++ b/backend/src/test/java/net/pengcook/user/aop/BlockedUserFilterAspectTest.java @@ -30,7 +30,7 @@ void setUp() { @Test @WithLoginUser(email = "loki@pengcook.net") @DisplayName("레시피 목록을 조회할때 차단한 사용자들의 레시피가 보이지 않는다.") - void filterAuthorAbles() { + void filterOwnables() { List authorIds = RestAssured.given().log().all() .queryParam("pageNumber", 0) .queryParam("pageSize", 10)