diff --git a/src/main/java/com/brainpix/post/dto/PostCollaborationResponse.java b/src/main/java/com/brainpix/post/dto/PostCollaborationResponse.java index 1199659e..7695ebed 100644 --- a/src/main/java/com/brainpix/post/dto/PostCollaborationResponse.java +++ b/src/main/java/com/brainpix/post/dto/PostCollaborationResponse.java @@ -26,10 +26,11 @@ public record PostCollaborationResponse( Long saveCount, Long viewCount, Long totalQuantity, - Long occupiedQuantity + Long occupiedQuantity, + boolean isSavedPost ) { public static PostCollaborationResponse from(CollaborationHub collaborationHub, Long saveCount, - Long totalQuantity, Long occupiedQuantity) { + Long totalQuantity, Long occupiedQuantity, boolean isSavedPost) { return new PostCollaborationResponse( collaborationHub.getId(), collaborationHub.getPostAuth(), @@ -42,7 +43,8 @@ public static PostCollaborationResponse from(CollaborationHub collaborationHub, saveCount, collaborationHub.getViewCount(), totalQuantity, - occupiedQuantity + occupiedQuantity, + isSavedPost ); } } diff --git a/src/main/java/com/brainpix/post/dto/PostIdeaMarketResponse.java b/src/main/java/com/brainpix/post/dto/PostIdeaMarketResponse.java index 0c81e421..c6c0bec0 100644 --- a/src/main/java/com/brainpix/post/dto/PostIdeaMarketResponse.java +++ b/src/main/java/com/brainpix/post/dto/PostIdeaMarketResponse.java @@ -14,9 +14,10 @@ public record PostIdeaMarketResponse( Long price, Specialization specialization, Long saveCount, - Long viewCount + Long viewCount, + boolean isSavedPost ) { - public static PostIdeaMarketResponse from(IdeaMarket ideaMarket, Long saveCount) { + public static PostIdeaMarketResponse from(IdeaMarket ideaMarket, Long saveCount, boolean isSavedPost) { return new PostIdeaMarketResponse( ideaMarket.getId(), ideaMarket.getPostAuth(), @@ -27,7 +28,8 @@ public static PostIdeaMarketResponse from(IdeaMarket ideaMarket, Long saveCount) ideaMarket.getPrice().getPrice(), ideaMarket.getSpecialization(), saveCount, - ideaMarket.getViewCount() + ideaMarket.getViewCount(), + isSavedPost ); } } \ No newline at end of file diff --git a/src/main/java/com/brainpix/post/dto/PostRequestTaskResponse.java b/src/main/java/com/brainpix/post/dto/PostRequestTaskResponse.java index c91ff4c2..5ea910f1 100644 --- a/src/main/java/com/brainpix/post/dto/PostRequestTaskResponse.java +++ b/src/main/java/com/brainpix/post/dto/PostRequestTaskResponse.java @@ -24,9 +24,10 @@ public record PostRequestTaskResponse( LocalDateTime deadline, Specialization specialization, Long saveCount, - Long viewCount + Long viewCount, + boolean isSavedPost ) { - public static PostRequestTaskResponse from(RequestTask requestTask, Long saveCount) { + public static PostRequestTaskResponse from(RequestTask requestTask, Long saveCount, boolean isSavedPost) { return new PostRequestTaskResponse( requestTask.getId(), requestTask.getPostAuth(), @@ -37,7 +38,8 @@ public static PostRequestTaskResponse from(RequestTask requestTask, Long saveCou requestTask.getDeadline(), requestTask.getSpecialization(), saveCount, - requestTask.getViewCount() + requestTask.getViewCount(), + isSavedPost ); } } diff --git a/src/main/java/com/brainpix/post/repository/SavedPostRepository.java b/src/main/java/com/brainpix/post/repository/SavedPostRepository.java index b50269d2..45b02923 100644 --- a/src/main/java/com/brainpix/post/repository/SavedPostRepository.java +++ b/src/main/java/com/brainpix/post/repository/SavedPostRepository.java @@ -15,4 +15,6 @@ public interface SavedPostRepository extends JpaRepository, Sav Optional findByUserAndPost(User user, Post post); boolean existsByUserAndPost(User user, Post post); + + boolean existsByUserIdAndPostId(Long userId, Long postId); } \ No newline at end of file diff --git a/src/main/java/com/brainpix/post/service/SavedPostService.java b/src/main/java/com/brainpix/post/service/SavedPostService.java index e1cea5d4..9bea1e41 100644 --- a/src/main/java/com/brainpix/post/service/SavedPostService.java +++ b/src/main/java/com/brainpix/post/service/SavedPostService.java @@ -65,7 +65,8 @@ public Page findSavedRequestTasks(long userId, Pageable .map(savedPost -> { RequestTask requestTask = (RequestTask)savedPost.getPost(); Long saveCount = savedPostRepository.countByPostId(requestTask.getId()); - return PostRequestTaskResponse.from(requestTask, saveCount); + boolean isSavedPost = savedPostRepository.existsByUserIdAndPostId(userId, requestTask.getId()); + return PostRequestTaskResponse.from(requestTask, saveCount, isSavedPost); }); } @@ -77,7 +78,8 @@ public Page findSavedIdeaMarkets(long userId, Pageable p .map(savedPost -> { IdeaMarket ideaMarket = (IdeaMarket)savedPost.getPost(); Long saveCount = savedPostRepository.countByPostId(ideaMarket.getId()); - return PostIdeaMarketResponse.from(ideaMarket, saveCount); + boolean isSavedPost = savedPostRepository.existsByUserIdAndPostId(userId, ideaMarket.getId()); + return PostIdeaMarketResponse.from(ideaMarket, saveCount, isSavedPost); }); } @@ -89,13 +91,14 @@ public Page findSavedCollaborationHubs(long userId, P .map(savedPost -> { CollaborationHub collaborationHub = (CollaborationHub)savedPost.getPost(); Long saveCount = savedPostRepository.countByPostId(collaborationHub.getId()); + boolean isSavedPost = savedPostRepository.existsByUserIdAndPostId(userId, collaborationHub.getId()); // 엔티티 메서드를 호출하여 모집 데이터의 합산 계산 long totalQuantity = collaborationHub.getTotalQuantity(); long occupiedQuantity = collaborationHub.getOccupiedQuantity(); return PostCollaborationResponse.from(collaborationHub, saveCount, totalQuantity, - occupiedQuantity); + occupiedQuantity, isSavedPost); }); } } diff --git a/src/main/java/com/brainpix/post/service/mypost/MyCollaborationHubService.java b/src/main/java/com/brainpix/post/service/mypost/MyCollaborationHubService.java index 76c44142..fa8ffc1c 100644 --- a/src/main/java/com/brainpix/post/service/mypost/MyCollaborationHubService.java +++ b/src/main/java/com/brainpix/post/service/mypost/MyCollaborationHubService.java @@ -43,9 +43,11 @@ public Page findCollaborationPosts(long userId, Pagea return collaborationHubRepository.findByWriter(writer, pageable) .map(collaborationHub -> { Long saveCount = savedPostRepository.countByPostId(collaborationHub.getId()); + boolean isSavedPost = savedPostRepository.existsByUserIdAndPostId(userId, collaborationHub.getId()); long totalQuantity = collaborationHub.getTotalQuantity(); long occupiedQuantity = collaborationHub.getOccupiedQuantity(); - return PostCollaborationResponse.from(collaborationHub, saveCount, totalQuantity, occupiedQuantity); + return PostCollaborationResponse.from(collaborationHub, saveCount, totalQuantity, occupiedQuantity, + isSavedPost); }); } diff --git a/src/main/java/com/brainpix/post/service/mypost/MyIdeaMarketService.java b/src/main/java/com/brainpix/post/service/mypost/MyIdeaMarketService.java index 225de98d..3f43e320 100644 --- a/src/main/java/com/brainpix/post/service/mypost/MyIdeaMarketService.java +++ b/src/main/java/com/brainpix/post/service/mypost/MyIdeaMarketService.java @@ -39,7 +39,8 @@ public Page findIdeaMarketPosts(long userId, Pageable pa return ideaMarketRepository.findByWriter(writer, pageable) .map(ideaMarket -> { Long saveCount = savedPostRepository.countByPostId(ideaMarket.getId()); - return PostIdeaMarketResponse.from(ideaMarket, saveCount); + boolean isSavedPost = savedPostRepository.existsByUserIdAndPostId(userId, ideaMarket.getId()); + return PostIdeaMarketResponse.from(ideaMarket, saveCount, isSavedPost); }); } diff --git a/src/main/java/com/brainpix/post/service/mypost/MyRequestTaskService.java b/src/main/java/com/brainpix/post/service/mypost/MyRequestTaskService.java index ea1cf644..7d86e9b0 100644 --- a/src/main/java/com/brainpix/post/service/mypost/MyRequestTaskService.java +++ b/src/main/java/com/brainpix/post/service/mypost/MyRequestTaskService.java @@ -42,7 +42,8 @@ public Page findReqeustTaskPosts(long userId, Pageable return requestTaskRepository.findByWriter(writer, pageable) .map(requestTask -> { Long saveCount = savedPostRepository.countByPostId(requestTask.getId()); - return PostRequestTaskResponse.from(requestTask, saveCount); + boolean isSavedPost = savedPostRepository.existsByUserIdAndPostId(userId, requestTask.getId()); + return PostRequestTaskResponse.from(requestTask, saveCount, isSavedPost); }); } diff --git a/src/main/java/com/brainpix/profile/controller/PublicProfileController.java b/src/main/java/com/brainpix/profile/controller/PublicProfileController.java index 84cf034e..c6d02f76 100644 --- a/src/main/java/com/brainpix/profile/controller/PublicProfileController.java +++ b/src/main/java/com/brainpix/profile/controller/PublicProfileController.java @@ -17,6 +17,7 @@ import com.brainpix.profile.dto.PublicProfileResponseDto; import com.brainpix.profile.service.PublicProfileService; import com.brainpix.security.authorization.AllUser; +import com.brainpix.security.authorization.UserId; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -59,9 +60,10 @@ public ResponseEntity> getPublicCompanyPr @SwaggerPageable public ResponseEntity>> getPostsByUser( @PathVariable Long userId, + @UserId Long currentUserId, @PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable) { CommonPageResponse pageResponse = - CommonPageResponse.of(publicProfileService.getPostsByUser(userId, pageable)); + CommonPageResponse.of(publicProfileService.getPostsByUser(userId, currentUserId, pageable)); return ResponseEntity.ok(ApiResponse.success(pageResponse)); } } diff --git a/src/main/java/com/brainpix/profile/converter/ProfilePostConverter.java b/src/main/java/com/brainpix/profile/converter/ProfilePostConverter.java index 211504f9..57613e3d 100644 --- a/src/main/java/com/brainpix/profile/converter/ProfilePostConverter.java +++ b/src/main/java/com/brainpix/profile/converter/ProfilePostConverter.java @@ -13,7 +13,8 @@ public class ProfilePostConverter { /** * 요청 과제 미리보기용 DTO 변환 */ - public PublicProfileResponseDto.PostPreviewDto toRequestTaskPreviewDto(RequestTask task, long savedCount) { + public PublicProfileResponseDto.PostPreviewDto toRequestTaskPreviewDto(RequestTask task, long savedCount, + boolean isSavePost) { String openScope = parseOpenScope(task.getPostAuth()); return PublicProfileResponseDto.PostPreviewDto.builder() @@ -27,13 +28,15 @@ public PublicProfileResponseDto.PostPreviewDto toRequestTaskPreviewDto(RequestTa .deadline(task.getDeadline()) .thumbnailImage(task.getFirstImage()) .writerImageUrl(task.getWriter().getProfileImage()) + .isSavedPost(isSavePost) .build(); } /** * 아이디어 마켓 미리보기용 DTO 변환 */ - public PublicProfileResponseDto.PostPreviewDto toIdeaMarketPreviewDto(IdeaMarket market, long savedCount) { + public PublicProfileResponseDto.PostPreviewDto toIdeaMarketPreviewDto(IdeaMarket market, long savedCount, + boolean isSavePost) { String openScope = parseOpenScope(market.getPostAuth()); return PublicProfileResponseDto.PostPreviewDto.builder() @@ -47,13 +50,15 @@ public PublicProfileResponseDto.PostPreviewDto toIdeaMarketPreviewDto(IdeaMarket .thumbnailImage(market.getFirstImage()) .writerImageUrl(market.getWriter().getProfileImage()) .price(market.getPrice().getPrice()) + .isSavedPost(isSavePost) .build(); } /** * 협업 광장 미리보기용 DTO 변환 */ - public PublicProfileResponseDto.PostPreviewDto toCollaborationHubPreviewDto(CollaborationHub hub, long savedCount) { + public PublicProfileResponseDto.PostPreviewDto toCollaborationHubPreviewDto(CollaborationHub hub, long savedCount, + boolean isSavePost) { long currentMembers = hub.getOccupiedQuantity(); long totalMembers = hub.getTotalQuantity(); String openScope = parseOpenScope(hub.getPostAuth()); @@ -71,6 +76,7 @@ public PublicProfileResponseDto.PostPreviewDto toCollaborationHubPreviewDto(Coll .currentMembers(currentMembers) .totalMembers(totalMembers) .writerImageUrl(hub.getWriter().getProfileImage()) + .isSavedPost(isSavePost) .build(); } diff --git a/src/main/java/com/brainpix/profile/dto/PublicProfileResponseDto.java b/src/main/java/com/brainpix/profile/dto/PublicProfileResponseDto.java index 3a6eaa04..6a035fa8 100644 --- a/src/main/java/com/brainpix/profile/dto/PublicProfileResponseDto.java +++ b/src/main/java/com/brainpix/profile/dto/PublicProfileResponseDto.java @@ -40,6 +40,7 @@ public static class PostPreviewDto { private Long price; // (아이디어 마켓 전용) private Long currentMembers; // (협업 광장 전용) private Long totalMembers; // (협업 광장 전용) + private boolean isSavedPost; } } diff --git a/src/main/java/com/brainpix/profile/service/PublicProfileService.java b/src/main/java/com/brainpix/profile/service/PublicProfileService.java index 1b1ac5a9..911cf4cd 100644 --- a/src/main/java/com/brainpix/profile/service/PublicProfileService.java +++ b/src/main/java/com/brainpix/profile/service/PublicProfileService.java @@ -105,7 +105,8 @@ public CompanyProfileResponseDto getPublicCompanyProfile(Long userId) { .build(); } - public Page getPostsByUser(Long userId, Pageable pageable) { + public Page getPostsByUser(Long userId, Long currentUserId, + Pageable pageable) { User user = userRepository.findById(userId) .orElseThrow(() -> new BrainPixException( com.brainpix.api.code.error.CommonErrorCode.RESOURCE_NOT_FOUND)); @@ -113,12 +114,13 @@ public Page getPostsByUser(Long userId, return postRepository.findByWriter(user, pageable) .map(post -> { long savedCount = savedPostRepository.countByPostId(post.getId()); + boolean isSavedPost = savedPostRepository.existsByUserIdAndPostId(currentUserId, post.getId()); if (post instanceof RequestTask) { - return postConverter.toRequestTaskPreviewDto((RequestTask)post, savedCount); + return postConverter.toRequestTaskPreviewDto((RequestTask)post, savedCount, isSavedPost); } else if (post instanceof IdeaMarket) { - return postConverter.toIdeaMarketPreviewDto((IdeaMarket)post, savedCount); + return postConverter.toIdeaMarketPreviewDto((IdeaMarket)post, savedCount, isSavedPost); } else if (post instanceof CollaborationHub) { - return postConverter.toCollaborationHubPreviewDto((CollaborationHub)post, savedCount); + return postConverter.toCollaborationHubPreviewDto((CollaborationHub)post, savedCount, isSavedPost); } throw new BrainPixException(CommonErrorCode.RESOURCE_NOT_FOUND); });