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 @@ -120,4 +120,17 @@ public RsData<PostLikeResponseDto> 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<Boolean> getLike(
@PathVariable Long postId
) {
return RsData.successOf(postService.getLike(postId)); // code=200, message="success"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostLikeRepository extends JpaRepository<PostLike, Long> {
Boolean existsByPostAndUser(Post post, User user);

Optional<PostLike> findByPostAndUser(Post post, User user);
}
55 changes: 32 additions & 23 deletions src/main/java/com/back/domain/post/post/service/PostService.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,19 @@
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;
import org.springframework.transaction.support.TransactionSynchronization;
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 {
Expand Down Expand Up @@ -158,39 +160,35 @@ public PostResponseDto updatePost(Long postId, PostUpdateRequestDto reqBody, Lis
Map<Long, PostImage> existingById = post.getImages().stream()
.collect(Collectors.toMap(PostImage::getId, Function.identity()));

// 삭제할 이미지 찾기
List<PostImage> toDelete = post.getImages().stream()
// 삭제될 이미지 (DB + S3)
List<PostImage> toRemove = post.getImages().stream()
.filter(img -> !keepIds.contains(img.getId()))
.toList();

// 최종 이미지 리스트 구성
List<PostImage> finalImages = new ArrayList<>();
List<String> 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<String> deleteKeysAfterCommit = toDelete.stream()
.map(PostImage::getFileName)
.toList();

// DB에 반영
post.updateImages(finalImages);

// 트랜잭션 완료 후 처리
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
Expand Down Expand Up @@ -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<String> tagNames, Post post) {
for (String tagName : tagNames) {
Expand Down