Skip to content

Commit 4b5e975

Browse files
authored
[feat] 사용자가 해당 게시글에 추천을 했는지 여부 확인하는 api 구현#315
[feat] 사용자가 해당 게시글에 추천을 했는지 여부 확인하는 api 구현#315
2 parents 19baa9c + 690756b commit 4b5e975

File tree

3 files changed

+47
-23
lines changed

3 files changed

+47
-23
lines changed

src/main/java/com/back/domain/post/post/controller/PostController.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,17 @@ public RsData<PostLikeResponseDto> toggleLike(
120120
) {
121121
return RsData.successOf(postService.toggleLike(postId)); // code=200, message="success"
122122
}
123+
124+
/**
125+
* 사용자가 해당 게시글을 추천(좋아요)했는지 여부 확인 API
126+
* @param postId 확인할 게시글 ID
127+
* @return 사용자의 추천 여부 (true/false)
128+
*/
129+
@GetMapping("/{postId}/like")
130+
@Operation(summary = "사용자가 해당 게시글 추천 여부 확인")
131+
public RsData<Boolean> getLike(
132+
@PathVariable Long postId
133+
) {
134+
return RsData.successOf(postService.getLike(postId)); // code=200, message="success"
135+
}
123136
}

src/main/java/com/back/domain/post/post/repository/PostLikeRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@
77
import org.springframework.data.jpa.repository.JpaRepository;
88

99
public interface PostLikeRepository extends JpaRepository<PostLike, Long> {
10+
Boolean existsByPostAndUser(Post post, User user);
11+
1012
Optional<PostLike> findByPostAndUser(Post post, User user);
1113
}

src/main/java/com/back/domain/post/post/service/PostService.java

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,19 @@
2424
import com.back.global.file.dto.UploadedFileDto;
2525
import com.back.global.file.service.FileService;
2626
import com.back.global.rq.Rq;
27+
import java.util.List;
28+
import java.util.Map;
29+
import java.util.NoSuchElementException;
30+
import java.util.Optional;
31+
import java.util.function.Function;
32+
import java.util.stream.Collectors;
2733
import lombok.RequiredArgsConstructor;
2834
import org.springframework.stereotype.Service;
2935
import org.springframework.transaction.annotation.Transactional;
3036
import org.springframework.transaction.support.TransactionSynchronization;
3137
import org.springframework.transaction.support.TransactionSynchronizationManager;
3238
import org.springframework.web.multipart.MultipartFile;
3339

34-
import java.util.*;
35-
import java.util.function.Function;
36-
import java.util.stream.Collectors;
37-
3840
@Service
3941
@RequiredArgsConstructor
4042
public class PostService {
@@ -158,39 +160,35 @@ public PostResponseDto updatePost(Long postId, PostUpdateRequestDto reqBody, Lis
158160
Map<Long, PostImage> existingById = post.getImages().stream()
159161
.collect(Collectors.toMap(PostImage::getId, Function.identity()));
160162

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

166-
// 최종 이미지 리스트 구성
167-
List<PostImage> finalImages = new ArrayList<>();
168+
List<String> deleteKeysAfterCommit = toRemove.stream()
169+
.map(PostImage::getFileName)
170+
.toList();
171+
172+
toRemove.forEach(img -> img.updatePost(null)); // 관계 해제
173+
post.getImages().removeAll(toRemove); // orphanRemoval 트리거
174+
175+
// 유지할 이미지 정렬
168176
int order = 0;
169177
for (Long keepId : keepIds) {
170178
PostImage img = existingById.get(keepId);
171-
if (img != null) {
172-
img.updateSortOrder(order++);
173-
finalImages.add(img);
174-
}
179+
if (img != null) img.updateSortOrder(order++);
175180
}
181+
182+
// 새 이미지 추가
176183
for (UploadedFileDto u : uploaded) {
177-
finalImages.add(PostImage.builder()
184+
post.getImages().add(PostImage.builder()
178185
.post(post)
179186
.fileName(u.fileName())
180187
.url(u.url())
181188
.sortOrder(order++)
182-
.build()
183-
);
189+
.build());
184190
}
185191

186-
// 삭제 예정 key 모음
187-
List<String> deleteKeysAfterCommit = toDelete.stream()
188-
.map(PostImage::getFileName)
189-
.toList();
190-
191-
// DB에 반영
192-
post.updateImages(finalImages);
193-
194192
// 트랜잭션 완료 후 처리
195193
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
196194
@Override
@@ -272,6 +270,17 @@ public PostLikeResponseDto toggleLike(Long postId) {
272270
}
273271
}
274272

273+
// 사용자가 해당 게시글 여부 확인 로직
274+
@Transactional(readOnly = true)
275+
public Boolean getLike(Long postId) {
276+
User user = rq.getActor();
277+
278+
Post post = postRepository.findById(postId)
279+
.orElseThrow(() -> new NoSuchElementException("해당 게시글을 찾을 수 없습니다. ID: " + postId));
280+
281+
return postLikeRepository.existsByPostAndUser(post, user);
282+
}
283+
275284
// 태그 추가 메서드
276285
private void addTag(List<String> tagNames, Post post) {
277286
for (String tagName : tagNames) {

0 commit comments

Comments
 (0)