diff --git a/src/main/java/com/back/domain/post/post/controller/PostController.java b/src/main/java/com/back/domain/post/post/controller/PostController.java index 2198d14..864437f 100644 --- a/src/main/java/com/back/domain/post/post/controller/PostController.java +++ b/src/main/java/com/back/domain/post/post/controller/PostController.java @@ -120,4 +120,17 @@ public RsData toggleLike( ) { return RsData.successOf(postService.toggleLike(postId)); // code=200, message="success" } + + /** + * 사용자가 해당 게시글을 추천(좋아요)했는지 여부 확인 API + * @param postId 확인할 게시글 ID + * @return 사용자의 추천 여부 (true/false) + */ + @GetMapping("/{postId}/like") + @Operation(summary = "사용자가 해당 게시글 추천 여부 확인") + public RsData getLike( + @PathVariable Long postId + ) { + return RsData.successOf(postService.getLike(postId)); // code=200, message="success" + } } diff --git a/src/main/java/com/back/domain/post/post/repository/PostLikeRepository.java b/src/main/java/com/back/domain/post/post/repository/PostLikeRepository.java index f0a8bd4..8cc1ae1 100644 --- a/src/main/java/com/back/domain/post/post/repository/PostLikeRepository.java +++ b/src/main/java/com/back/domain/post/post/repository/PostLikeRepository.java @@ -7,5 +7,7 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface PostLikeRepository extends JpaRepository { + Boolean existsByPostAndUser(Post post, User user); + Optional findByPostAndUser(Post post, User user); } diff --git a/src/main/java/com/back/domain/post/post/service/PostService.java b/src/main/java/com/back/domain/post/post/service/PostService.java index 603016f..83b146f 100644 --- a/src/main/java/com/back/domain/post/post/service/PostService.java +++ b/src/main/java/com/back/domain/post/post/service/PostService.java @@ -24,6 +24,12 @@ import com.back.global.file.dto.UploadedFileDto; import com.back.global.file.service.FileService; import com.back.global.rq.Rq; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,10 +37,6 @@ import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.web.multipart.MultipartFile; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - @Service @RequiredArgsConstructor public class PostService { @@ -158,39 +160,35 @@ public PostResponseDto updatePost(Long postId, PostUpdateRequestDto reqBody, Lis Map existingById = post.getImages().stream() .collect(Collectors.toMap(PostImage::getId, Function.identity())); - // 삭제할 이미지 찾기 - List toDelete = post.getImages().stream() + // 삭제될 이미지 (DB + S3) + List toRemove = post.getImages().stream() .filter(img -> !keepIds.contains(img.getId())) .toList(); - // 최종 이미지 리스트 구성 - List finalImages = new ArrayList<>(); + List deleteKeysAfterCommit = toRemove.stream() + .map(PostImage::getFileName) + .toList(); + + toRemove.forEach(img -> img.updatePost(null)); // 관계 해제 + post.getImages().removeAll(toRemove); // orphanRemoval 트리거 + + // 유지할 이미지 정렬 int order = 0; for (Long keepId : keepIds) { PostImage img = existingById.get(keepId); - if (img != null) { - img.updateSortOrder(order++); - finalImages.add(img); - } + if (img != null) img.updateSortOrder(order++); } + + // 새 이미지 추가 for (UploadedFileDto u : uploaded) { - finalImages.add(PostImage.builder() + post.getImages().add(PostImage.builder() .post(post) .fileName(u.fileName()) .url(u.url()) .sortOrder(order++) - .build() - ); + .build()); } - // 삭제 예정 key 모음 - List deleteKeysAfterCommit = toDelete.stream() - .map(PostImage::getFileName) - .toList(); - - // DB에 반영 - post.updateImages(finalImages); - // 트랜잭션 완료 후 처리 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override @@ -272,6 +270,17 @@ public PostLikeResponseDto toggleLike(Long postId) { } } + // 사용자가 해당 게시글 여부 확인 로직 + @Transactional(readOnly = true) + public Boolean getLike(Long postId) { + User user = rq.getActor(); + + Post post = postRepository.findById(postId) + .orElseThrow(() -> new NoSuchElementException("해당 게시글을 찾을 수 없습니다. ID: " + postId)); + + return postLikeRepository.existsByPostAndUser(post, user); + } + // 태그 추가 메서드 private void addTag(List tagNames, Post post) { for (String tagName : tagNames) {