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 @@ -35,4 +35,16 @@ default List<PostImage> toEntityList(List<String> uploadedUrls, Post post) {
.collect(Collectors.toList());
}

// List<PostImage> → List<String> 변환
default List<String> toImageUrls(List<PostImage> postImages) {
if (postImages == null || postImages.isEmpty()) {
return Collections.emptyList();
}

return postImages.stream()
.filter(img -> img.getDeletedAt() == null)
.map(PostImage::getImageUrl)
.collect(Collectors.toList());
}

}
35 changes: 9 additions & 26 deletions src/main/java/com/hyetaekon/hyetaekon/post/mapper/PostMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.Objects;
import java.util.stream.Collectors;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = PostImageMapper.class)
public interface PostMapper {

// ✅ 게시글 목록용 DTO 변환
Expand All @@ -34,30 +34,13 @@ public interface PostMapper {
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void updatePostFromDto(PostUpdateRequestDto updateDto, @MappingTarget Post post);

// ✅ 게시글 상세 보기용 DTO (imageUrls 수동으로 처리)
// 상세용 DTO (default 메서드 내부에 userId 수동 추가)
default PostDetailResponseDto toPostDetailDto(Post post) {
return PostDetailResponseDto.builder()
.postId(post.getId())
.userId(post.getUser().getId()) // 🔥 추가
.nickName(post.getUser().getNickname())
.title(post.getTitle())
.content(post.getDisplayContent())
.createdAt(post.getCreatedAt())
.postType(post.getPostType().getKoreanName())
.recommendCnt(post.getRecommendCnt())
.viewCnt(post.getViewCnt())
.urlTitle(post.getUrlTitle())
.urlPath(post.getUrlPath())
.tags(post.getTags())
.imageUrls(
post.getPostImages().stream()
.filter(img -> img.getDeletedAt() == null)
.map(PostImage::getImageUrl)
.collect(Collectors.toList())
)
.recommended(false)
.build();
}
@Mapping(source = "id", target = "postId")
@Mapping(source = "user.id", target = "userId")
@Mapping(source = "user.nickname", target = "nickName")
@Mapping(target = "content", expression = "java(post.getDisplayContent())")
@Mapping(source = "postType.koreanName", target = "postType")
@Mapping(target = "recommended", constant = "false")
@Mapping(source = "postImages", target = "imageUrls")
PostDetailResponseDto toPostDetailDto(Post post);

}
36 changes: 22 additions & 14 deletions src/main/java/com/hyetaekon/hyetaekon/post/service/PostService.java
Original file line number Diff line number Diff line change
Expand Up @@ -141,15 +141,15 @@ public PostDetailResponseDto createPost(PostCreateRequestDto requestDto, Long us
List<PostImage> postImages = processPostImages(requestDto.getImages(), savedPost);
if (!postImages.isEmpty()) {
postImageRepository.saveAll(postImages);
savedPost.setPostImages(postImages); // ✅ 이 줄이 핵심
savedPost.setPostImages(postImages);
}
}

// 게시글 작성 포인트 부여
userPointService.addPointForAction(userId, PointActionType.POST_CREATION);
log.info("사용자 {}에게 게시글 작성 포인트가 부여되었습니다.", userId);

return postMapper.toPostDetailDto(savedPost); // ✅ Mapper가 imageUrls 포함해서 반환
return postMapper.toPostDetailDto(savedPost);
}


Expand Down Expand Up @@ -177,21 +177,29 @@ public PostDetailResponseDto updatePost(Long postId, PostUpdateRequestDto update

// 이미지 업데이트 처리
if (updateDto.getImages() != null && !updateDto.getImages().isEmpty()) {
// 기존 이미지 soft delete 처리
List<PostImage> existingImages = postImageRepository.findByPostAndDeletedAtIsNull(post);
for (PostImage image : existingImages) {
image.softDelete();
}
postImageRepository.saveAll(existingImages);
updatePostImages(post, updateDto.getImages());
}

// 새 이미지 추가
List<PostImage> newImages = processPostImages(updateDto.getImages(), post);
if (!newImages.isEmpty()) {
postImageRepository.saveAll(newImages);
}
// 업데이트 후 최신 상태로 다시 조회
Post updatedPost = postRepository.findByIdAndDeletedAtIsNull(postId)
.orElseThrow(() -> new EntityNotFoundException("게시글을 찾을 수 없습니다"));

return postMapper.toPostDetailDto(updatedPost);
}

private void updatePostImages(Post post, List<MultipartFile> newImages) {
// 기존 이미지 soft delete 처리
List<PostImage> existingImages = postImageRepository.findByPostAndDeletedAtIsNull(post);
for (PostImage image : existingImages) {
image.softDelete();
}
postImageRepository.saveAll(existingImages);

return postMapper.toPostDetailDto(post);
// 새 이미지 추가
List<PostImage> newPostImages = processPostImages(newImages, post);
if (!newPostImages.isEmpty()) {
postImageRepository.saveAll(newPostImages);
}
}

/**
Expand Down
Empty file.