Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public class PostDomainPersistenceAdapter
DeleteProductLikePort,
LoadPostLikePort,
SavePostLikePort,
DeletePostLikePort {
DeletePostLikePort,
LoadBookmarkForPostPort {

private final PostRepository postRepository;
private final PostImageRepository postImageRepository;
Expand All @@ -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;
Expand Down Expand Up @@ -185,6 +187,11 @@ public List<BookmarkYnWrapperVo> loadUserPickAllPostsByLatest(
.toList();
}

@Override
public Boolean existsBookmarkByUserIdAndPostId(FindBookmarkByUserIdAndPostIdQuery query) {
return bookmarkRepository.existsByUserIdAndPostId(query.getUserId(), query.getPostId());
}

@Override
public List<PostIdAndBookmarkYnVo> loadPostIdAndBookmarkYn(FindByPostIdsAndUserQuery query) {
return postRepository.findPostIdWithBookmarkYn(query);
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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<UserImage> 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<PostImage> postImages =
Expand All @@ -70,18 +78,31 @@ public PostDetailVo execute(Long userId, FindByIdQuery query) {
loadPostProductImagePort.loadPostProductImagesByPostProductIds(
FindByIdsQuery.from(
postProducts.stream().map(PostProduct::getId).toList()));

Map<Long, PostProductImage> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,16 @@ public class PostDetailVo {
private final List<PostImage> postImages;
private final List<PostProductDetailVo> products;
private final Boolean userLikeYn;
private final Boolean userBookmarkYn;

private PostDetailVo(
Post post,
User user,
UserImage userImage,
List<PostImage> postImages,
List<PostProductDetailVo> products,
Boolean userLikeYn) {
Boolean userLikeYn,
Boolean userBookmarkYn) {
this.postId = post.getId();
this.title = post.getTitle();
this.content = post.getContent();
Expand All @@ -44,6 +46,7 @@ private PostDetailVo(
this.postImages = postImages;
this.products = products;
this.userLikeYn = userLikeYn;
this.userBookmarkYn = userBookmarkYn;
}

public static PostDetailVo from(
Expand All @@ -53,13 +56,15 @@ public static PostDetailVo from(
List<PostImage> postImages,
List<PostProduct> postProducts,
Map<Long, PostProductImage> postProductImageMap,
Boolean userLikeYn) {
Boolean userLikeYn,
Boolean userBookmarkYn) {
return new PostDetailVo(
post,
user,
userImage,
postImages,
PostProductDetailVo.listFrom(postProducts, postProductImageMap),
userLikeYn);
userLikeYn,
userBookmarkYn);
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/ftm/server/domain/entity/UserImage.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
3 changes: 3 additions & 0 deletions src/test/java/com/ftm/server/post/LoadPostDetailTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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("게시글 이미지 목록 정보"),
Expand Down
Loading