diff --git a/src/main/java/com/ftm/server/adapter/in/web/post/dto/response/LoadPostDetailResponse.java b/src/main/java/com/ftm/server/adapter/in/web/post/dto/response/LoadPostDetailResponse.java index c66beee..959a599 100644 --- a/src/main/java/com/ftm/server/adapter/in/web/post/dto/response/LoadPostDetailResponse.java +++ b/src/main/java/com/ftm/server/adapter/in/web/post/dto/response/LoadPostDetailResponse.java @@ -19,6 +19,7 @@ public class LoadPostDetailResponse { private final Integer viewCount; private final Integer likeCount; private final Boolean userLikeYn; + private final Boolean userBookmarkYn; @JsonFormat(pattern = "yyyy-MM-dd HH:mm", shape = JsonFormat.Shape.STRING) private final LocalDateTime createdAt; @@ -50,6 +51,7 @@ private LoadPostDetailResponse(PostDetailVo postDetailVo) { this.postProducts = postDetailVo.getProducts().stream().map(PostProductResponse::from).toList(); this.userLikeYn = postDetailVo.getUserLikeYn(); + this.userBookmarkYn = postDetailVo.getUserBookmarkYn(); } public static LoadPostDetailResponse from(PostDetailVo postDetailVo) { diff --git a/src/main/java/com/ftm/server/adapter/out/persistence/adapter/post/PostDomainPersistenceAdapter.java b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/post/PostDomainPersistenceAdapter.java index ab9f4da..8edca35 100644 --- a/src/main/java/com/ftm/server/adapter/out/persistence/adapter/post/PostDomainPersistenceAdapter.java +++ b/src/main/java/com/ftm/server/adapter/out/persistence/adapter/post/PostDomainPersistenceAdapter.java @@ -43,7 +43,8 @@ public class PostDomainPersistenceAdapter DeleteProductLikePort, LoadPostLikePort, SavePostLikePort, - DeletePostLikePort { + DeletePostLikePort, + LoadBookmarkForPostPort { private final PostRepository postRepository; private final PostImageRepository postImageRepository; @@ -53,6 +54,7 @@ public class PostDomainPersistenceAdapter private final UserImageRepository userImageRepository; private final ProductLikeRepository productLikeRepository; private final PostLikeRepository postLikeRepository; + private final BookmarkRepository bookmarkRepository; private final PostMapper postMapper; private final PostImageMapper postImageMapper; @@ -185,6 +187,11 @@ public List loadUserPickAllPostsByLatest( .toList(); } + @Override + public Boolean existsBookmarkByUserIdAndPostId(FindBookmarkByUserIdAndPostIdQuery query) { + return bookmarkRepository.existsByUserIdAndPostId(query.getUserId(), query.getPostId()); + } + @Override public List loadPostIdAndBookmarkYn(FindByPostIdsAndUserQuery query) { return postRepository.findPostIdWithBookmarkYn(query); diff --git a/src/main/java/com/ftm/server/application/port/out/persistence/post/LoadBookmarkForPostPort.java b/src/main/java/com/ftm/server/application/port/out/persistence/post/LoadBookmarkForPostPort.java new file mode 100644 index 0000000..4e8f621 --- /dev/null +++ b/src/main/java/com/ftm/server/application/port/out/persistence/post/LoadBookmarkForPostPort.java @@ -0,0 +1,7 @@ +package com.ftm.server.application.port.out.persistence.post; + +import com.ftm.server.application.query.FindBookmarkByUserIdAndPostIdQuery; + +public interface LoadBookmarkForPostPort { + Boolean existsBookmarkByUserIdAndPostId(FindBookmarkByUserIdAndPostIdQuery query); +} diff --git a/src/main/java/com/ftm/server/application/service/post/LoadPostDetailService.java b/src/main/java/com/ftm/server/application/service/post/LoadPostDetailService.java index 7f57671..2d1a57f 100644 --- a/src/main/java/com/ftm/server/application/service/post/LoadPostDetailService.java +++ b/src/main/java/com/ftm/server/application/service/post/LoadPostDetailService.java @@ -7,8 +7,10 @@ import com.ftm.server.common.exception.CustomException; import com.ftm.server.common.response.enums.ErrorResponseCode; import com.ftm.server.domain.entity.*; +import com.ftm.server.domain.enums.UserRole; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -29,6 +31,7 @@ public class LoadPostDetailService implements LoadPostDetailUseCase { private final LoadUserImageForPostPort loadUserImageForPostPort; private final UpdatePostPort updatePostPort; private final LoadPostLikePort loadPostLikePort; + private final LoadBookmarkForPostPort loadBookmarkForPostPort; @Override @Transactional @@ -50,12 +53,17 @@ public PostDetailVo execute(Long userId, FindByIdQuery query) { .loadUserById(FindByIdQuery.of(post.getUserId())) .orElseThrow(() -> CustomException.USER_NOT_FOUND); - // 유저 이미지 조회 + // 유저 이미지 조회 (SYSTEM 유저 -> default image) + Optional userImageOpt = + loadUserImageForPostPort.loadUserImageByUserId(FindByUserIdQuery.of(user.getId())); UserImage userImage = - loadUserImageForPostPort - .loadUserImageByUserId(FindByUserIdQuery.of(user.getId())) - .orElseThrow( - () -> new CustomException(ErrorResponseCode.USER_IMAGE_NOT_FOUND)); + userImageOpt.orElseGet( + () -> { + if (user.getRole() == UserRole.SYSTEM) { + return UserImage.defaultForSystem(user.getId()); + } + throw new CustomException(ErrorResponseCode.USER_IMAGE_NOT_FOUND); + }); // 게시글 이미지 목록 조회 List postImages = @@ -70,18 +78,31 @@ public PostDetailVo execute(Long userId, FindByIdQuery query) { loadPostProductImagePort.loadPostProductImagesByPostProductIds( FindByIdsQuery.from( postProducts.stream().map(PostProduct::getId).toList())); - Map postProductImageMap = postProductImages.stream() .collect( Collectors.toMap( PostProductImage::getPostProductId, Function.identity())); + // 유저 게시글 좋아요 여부 Boolean userLikeYn = userId != null && loadPostLikePort.findPostLikeByUser(userId, query.getId()).getLikeYn(); + // 북마크 여부 + Boolean bookmarkYn = + userId != null + && loadBookmarkForPostPort.existsBookmarkByUserIdAndPostId( + FindBookmarkByUserIdAndPostIdQuery.of(user.getId(), post.getId())); + return PostDetailVo.from( - post, user, userImage, postImages, postProducts, postProductImageMap, userLikeYn); + post, + user, + userImage, + postImages, + postProducts, + postProductImageMap, + userLikeYn, + bookmarkYn); } } diff --git a/src/main/java/com/ftm/server/application/vo/post/PostDetailVo.java b/src/main/java/com/ftm/server/application/vo/post/PostDetailVo.java index 0a9a48d..146d65a 100644 --- a/src/main/java/com/ftm/server/application/vo/post/PostDetailVo.java +++ b/src/main/java/com/ftm/server/application/vo/post/PostDetailVo.java @@ -23,6 +23,7 @@ public class PostDetailVo { private final List postImages; private final List products; private final Boolean userLikeYn; + private final Boolean userBookmarkYn; private PostDetailVo( Post post, @@ -30,7 +31,8 @@ private PostDetailVo( UserImage userImage, List postImages, List products, - Boolean userLikeYn) { + Boolean userLikeYn, + Boolean userBookmarkYn) { this.postId = post.getId(); this.title = post.getTitle(); this.content = post.getContent(); @@ -44,6 +46,7 @@ private PostDetailVo( this.postImages = postImages; this.products = products; this.userLikeYn = userLikeYn; + this.userBookmarkYn = userBookmarkYn; } public static PostDetailVo from( @@ -53,13 +56,15 @@ public static PostDetailVo from( List postImages, List postProducts, Map postProductImageMap, - Boolean userLikeYn) { + Boolean userLikeYn, + Boolean userBookmarkYn) { return new PostDetailVo( post, user, userImage, postImages, PostProductDetailVo.listFrom(postProducts, postProductImageMap), - userLikeYn); + userLikeYn, + userBookmarkYn); } } diff --git a/src/main/java/com/ftm/server/domain/entity/UserImage.java b/src/main/java/com/ftm/server/domain/entity/UserImage.java index 75d1004..560fc00 100644 --- a/src/main/java/com/ftm/server/domain/entity/UserImage.java +++ b/src/main/java/com/ftm/server/domain/entity/UserImage.java @@ -51,6 +51,10 @@ public static UserImage createUserImage(Long userId) { .build(); } + public static UserImage defaultForSystem(Long userId) { + return createUserImage(userId); + } + public void updateDefaultUserImage() { this.objectKey = PropertiesHolder.USER_DEFAULT_IMAGE; } diff --git a/src/test/java/com/ftm/server/post/LoadPostDetailTest.java b/src/test/java/com/ftm/server/post/LoadPostDetailTest.java index 3c4f549..cf5d3aa 100644 --- a/src/test/java/com/ftm/server/post/LoadPostDetailTest.java +++ b/src/test/java/com/ftm/server/post/LoadPostDetailTest.java @@ -66,6 +66,9 @@ public class LoadPostDetailTest extends BaseTest { fieldWithPath("data.viewCount").type(NUMBER).description("게시글 조회수"), fieldWithPath("data.likeCount").type(NUMBER).description("게시글 좋아요 수"), fieldWithPath("data.userLikeYn").type(BOOLEAN).description("사용자 게시글 좋아요 여부"), + fieldWithPath("data.userBookmarkYn") + .type(BOOLEAN) + .description("사용자 게시글 북마크 여부"), fieldWithPath("data.createdAt").type(STRING).description("게시글 생성 날짜"), fieldWithPath("data.updatedAt").type(STRING).description("게시글 수정 날짜"), fieldWithPath("data.postImages[]").type(ARRAY).description("게시글 이미지 목록 정보"),