diff --git a/src/main/java/com/brainpix/post/controller/CollaborationHubQueryController.java b/src/main/java/com/brainpix/post/controller/CollaborationHubQueryController.java index 0efeaf95..ce14f5a9 100644 --- a/src/main/java/com/brainpix/post/controller/CollaborationHubQueryController.java +++ b/src/main/java/com/brainpix/post/controller/CollaborationHubQueryController.java @@ -58,9 +58,11 @@ public ResponseEntity> applyCollabor + "
sortType : NEWEST, OLDEST, POPULAR") @PostMapping("/search") public ResponseEntity>> getCollaborationHubList( + @UserId Long userId, @RequestBody GetCollaborationHubListDto.Request request, @PageableDefault(page = 0, size = 6) Pageable pageable) { - GetCollaborationHubListDto.Parameter parameter = GetCollaborationHubListDtoConverter.toParameter(request, + GetCollaborationHubListDto.Parameter parameter = GetCollaborationHubListDtoConverter.toParameter(userId, + request, pageable); CommonPageResponse response = collaborationHubService.getCollaborationHubList( parameter); @@ -73,8 +75,8 @@ public ResponseEntity> getCollaborationHubDetail( @UserId Long userId, @PathVariable("collaborationId") Long collaborationId) { - GetCollaborationHubDetailDto.Parameter parameter = GetCollaborationHubDetailDtoConverter.toParameter( - collaborationId, userId); + GetCollaborationHubDetailDto.Parameter parameter = GetCollaborationHubDetailDtoConverter.toParameter(userId, + collaborationId); GetCollaborationHubDetailDto.Response response = collaborationHubService.getCollaborationHubDetail(parameter); return ResponseEntity.ok(ApiResponse.success(response)); } diff --git a/src/main/java/com/brainpix/post/controller/CommentController.java b/src/main/java/com/brainpix/post/controller/CommentController.java index 22e11552..213a1fb6 100644 --- a/src/main/java/com/brainpix/post/controller/CommentController.java +++ b/src/main/java/com/brainpix/post/controller/CommentController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.brainpix.api.ApiResponse; @@ -40,15 +39,16 @@ public class CommentController { private final CommentService commentService; - @SwaggerPageable @AllUser + @SwaggerPageable @Operation(summary = "댓글 목록 조회 API", description = "경로변수로 postId를 입력받아 해당 게시글의 댓글 목록을 조회합니다.
페이징을 위한 page와 size는 쿼리 파라미터로 입력받습니다.") @GetMapping public ResponseEntity>> getCommentList( + @UserId Long userId, @PathVariable("postId") Long postId, @PageableDefault(page = 0, size = 10) Pageable pageable ) { - GetCommentListDto.Parameter parameter = GetCommentListDtoConverter.toParameter(postId, pageable); + GetCommentListDto.Parameter parameter = GetCommentListDtoConverter.toParameter(userId, postId, pageable); CommonPageResponse response = commentService.getCommentList(parameter); return ResponseEntity.ok(ApiResponse.success(response)); } @@ -58,7 +58,7 @@ public ResponseEntity> @Operation(summary = "댓글 등록 API", description = "경로변수로 postId를 입력받아 해당 게시글에 댓글을 등록합니다.") @PostMapping public ResponseEntity> createComment(@PathVariable("postId") Long postId, - @RequestParam("userId") Long userId, + @UserId Long userId, @Valid @RequestBody CreateCommentDto.Request request) { CreateCommentDto.Parameter parameter = CreateCommentDtoConverter.toParameter(postId, userId, request); CreateCommentDto.Response response = commentService.createComment(parameter); diff --git a/src/main/java/com/brainpix/post/controller/IdeaMarketQueryController.java b/src/main/java/com/brainpix/post/controller/IdeaMarketQueryController.java index e9e71bc6..1f6f20c0 100644 --- a/src/main/java/com/brainpix/post/controller/IdeaMarketQueryController.java +++ b/src/main/java/com/brainpix/post/controller/IdeaMarketQueryController.java @@ -52,9 +52,10 @@ public class IdeaMarketQueryController { + "
sortType : NEWEST, OLDEST, POPULAR, HIGHEST_PRICE, LOWEST_PRICE") @PostMapping("/search") public ResponseEntity>> getIdeaList( + @UserId Long userId, @RequestBody @Valid GetIdeaListDto.Request request, @PageableDefault(page = 0, size = 6) Pageable pageable) { - GetIdeaListDto.Parameter parameter = GetIdeaListDtoConverter.toParameter(request, pageable); + GetIdeaListDto.Parameter parameter = GetIdeaListDtoConverter.toParameter(userId, request, pageable); CommonPageResponse response = ideaMarketService.getIdeaList(parameter); return ResponseEntity.ok(ApiResponse.success(response)); } @@ -75,10 +76,12 @@ public ResponseEntity> getIdeaDetail( @Operation(summary = "인기 아이디어 조회 [GET]", description = "쿼리 파라미터로 아이디어 마켓 타입과 페이징을 위한 page, size를 입력받아 인기 아이디어를 조회합니다.
type : IDEA_SOLUTION, MARKET_PLACE") @GetMapping("/search/popular") public ResponseEntity>> getPopularIdeaList( + @UserId Long userId, @ModelAttribute @ParameterObject @Valid GetPopularIdeaListDto.Request request, @PageableDefault(page = 0, size = 3) Pageable pageable ) { - GetPopularIdeaListDto.Parameter parameter = GetPopularIdeaListDtoConverter.toParameter(request, pageable); + GetPopularIdeaListDto.Parameter parameter = GetPopularIdeaListDtoConverter.toParameter(userId, request, + pageable); CommonPageResponse response = ideaMarketService.getPopularIdeaList( parameter); return ResponseEntity.ok(ApiResponse.success(response)); diff --git a/src/main/java/com/brainpix/post/controller/RequestTaskQueryController.java b/src/main/java/com/brainpix/post/controller/RequestTaskQueryController.java index da99698b..ae73ad67 100644 --- a/src/main/java/com/brainpix/post/controller/RequestTaskQueryController.java +++ b/src/main/java/com/brainpix/post/controller/RequestTaskQueryController.java @@ -47,9 +47,11 @@ public class RequestTaskQueryController { + "
sortType : NEWEST, OLDEST, POPULAR") @PostMapping("/search") public ResponseEntity>> getRequestTaskList( + @UserId Long userId, @RequestBody @Valid GetRequestTaskListDto.Request request, @PageableDefault(page = 0, size = 6) Pageable pageable) { - GetRequestTaskListDto.Parameter parameter = GetRequestTaskListDtoConverter.toParameter(request, pageable); + GetRequestTaskListDto.Parameter parameter = GetRequestTaskListDtoConverter.toParameter(userId, request, + pageable); CommonPageResponse response = requestTaskQueryService.getRequestTaskList( parameter); return ResponseEntity.ok(ApiResponse.success(response)); @@ -60,9 +62,11 @@ public ResponseEntitytype : OPEN_IDEA, TECH_ZONE") @GetMapping("/search/popular") public ResponseEntity>> getPopularRequestTaskList( + @UserId Long userId, @ModelAttribute @ParameterObject @Valid GetPopularRequestTaskListDto.Request request, @PageableDefault(page = 0, size = 3) Pageable pageable) { - GetPopularRequestTaskListDto.Parameter parameter = GetPopularRequestTaskListDtoConverter.toParameter(request, + GetPopularRequestTaskListDto.Parameter parameter = GetPopularRequestTaskListDtoConverter.toParameter(userId, + request, pageable); CommonPageResponse response = requestTaskQueryService.getPopularRequestTaskList( parameter); diff --git a/src/main/java/com/brainpix/post/converter/GetCollaborationHubDetailDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetCollaborationHubDetailDtoConverter.java index 68463f27..b136de78 100644 --- a/src/main/java/com/brainpix/post/converter/GetCollaborationHubDetailDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetCollaborationHubDetailDtoConverter.java @@ -12,17 +12,17 @@ public class GetCollaborationHubDetailDtoConverter { - public static GetCollaborationHubDetailDto.Parameter toParameter(Long collaborationId, Long userId) { + public static GetCollaborationHubDetailDto.Parameter toParameter(Long userId, Long collaborationId) { return GetCollaborationHubDetailDto.Parameter.builder() - .collaborationId(collaborationId) .userId(userId) + .collaborationId(collaborationId) .build(); } public static GetCollaborationHubDetailDto.Response toResponse(CollaborationHub collaborationHub, List collectionGathering, User writer, Long saveCount, - Long totalIdeas, Long totalCollaborations) { + Long totalIdeas, Long totalCollaborations, Boolean isSavedPost, Boolean isMyPost) { // 작성자 GetCollaborationHubDetailDto.Writer writerDto = toWriter(writer, totalIdeas, totalCollaborations); @@ -64,6 +64,8 @@ public static GetCollaborationHubDetailDto.Response toResponse(CollaborationHub .recruitments(recruitments) .openMembers(openMembers) .openMyProfile(collaborationHub.getOpenMyProfile()) + .isSavedPost(isSavedPost) + .isMyPost(isMyPost) .build(); } diff --git a/src/main/java/com/brainpix/post/converter/GetCollaborationHubListDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetCollaborationHubListDtoConverter.java index 27346395..f01995b5 100644 --- a/src/main/java/com/brainpix/post/converter/GetCollaborationHubListDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetCollaborationHubListDtoConverter.java @@ -15,7 +15,8 @@ import com.brainpix.profile.entity.Specialization; public class GetCollaborationHubListDtoConverter { - public static GetCollaborationHubListDto.Parameter toParameter(GetCollaborationHubListDto.Request request, + public static GetCollaborationHubListDto.Parameter toParameter(Long userId, + GetCollaborationHubListDto.Request request, Pageable pageable) { Specialization category = null; @@ -31,6 +32,7 @@ public static GetCollaborationHubListDto.Parameter toParameter(GetCollaborationH } return GetCollaborationHubListDto.Parameter.builder() + .userId(userId) .keyword(request.getKeyword()) .category(category) .onlyCompany(request.getOnlyCompany()) @@ -40,12 +42,12 @@ public static GetCollaborationHubListDto.Parameter toParameter(GetCollaborationH } public static CommonPageResponse toResponse( - Page CollaborationHubs) { + Page collaborationHubs) { - Page response = CollaborationHubs - .map(CollaborationHub -> { - CollaborationHub collaboration = (CollaborationHub)CollaborationHub[0]; // 실제 엔티티 객체 - Long saveCount = (Long)CollaborationHub[1]; // 저장 횟수 + Page response = collaborationHubs + .map(collaborationHub -> { + CollaborationHub collaboration = (CollaborationHub)collaborationHub[0]; // 실제 엔티티 객체 + Long saveCount = (Long)collaborationHub[1]; // 저장 횟수 LocalDateTime deadline = collaboration.getDeadline(); // 마감 기한 LocalDateTime now = LocalDateTime.now(); // 현재 시간 Long days = deadline.isBefore(now) ? 0L : ChronoUnit.DAYS.between(now, deadline); // D-DAY 계산 @@ -53,7 +55,10 @@ public static CommonPageResponse // 현재 인원 및 모집 인원 Long occupiedQuantity = collaboration.getOccupiedQuantity(); Long totalQuantity = collaboration.getTotalQuantity(); - return toCollaborationDetail(collaboration, saveCount, days, occupiedQuantity, totalQuantity); + + Boolean isSavedPost = (Boolean)collaborationHub[2]; + return toCollaborationDetail(collaboration, saveCount, days, occupiedQuantity, totalQuantity, + isSavedPost); } ); @@ -62,7 +67,7 @@ public static CommonPageResponse public static GetCollaborationHubListDto.CollaborationDetail toCollaborationDetail( CollaborationHub collaborationHub, Long saveCount, - Long deadline, Long occupiedQuantity, Long totalQuantity) { + Long deadline, Long occupiedQuantity, Long totalQuantity, Boolean isSavedPost) { return GetCollaborationHubListDto.CollaborationDetail.builder() .collaborationId(collaborationHub.getId()) .auth(collaborationHub.getPostAuth().toString()) @@ -77,6 +82,7 @@ public static GetCollaborationHubListDto.CollaborationDetail toCollaborationDeta .totalQuantity(totalQuantity) .saveCount(saveCount) .viewCount(collaborationHub.getViewCount()) + .isSavedPost(isSavedPost) .build(); } } diff --git a/src/main/java/com/brainpix/post/converter/GetCommentListDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetCommentListDtoConverter.java index 18489521..465653b0 100644 --- a/src/main/java/com/brainpix/post/converter/GetCommentListDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetCommentListDtoConverter.java @@ -13,19 +13,24 @@ public class GetCommentListDtoConverter { - public static GetCommentListDto.Parameter toParameter(Long postId, Pageable pageable) { + public static GetCommentListDto.Parameter toParameter(Long userId, Long postId, Pageable pageable) { return GetCommentListDto.Parameter.builder() + .userId(userId) .postId(postId) .pageable(pageable) .build(); } - public static CommonPageResponse toResponse(Page comments, Pageable pageable) { + public static CommonPageResponse toResponse(Page comments, Pageable pageable, + List isMyComments) { List commentDtoList = new ArrayList<>(); - for (Comment comment : comments) { - GetCommentListDto.Comment commentDto = GetCommentListDtoConverter.toComment(comment); + List commentList = comments.getContent(); + + for (int i = 0; i < commentList.size(); i++) { + GetCommentListDto.Comment commentDto = GetCommentListDtoConverter.toComment(commentList.get(i), + isMyComments.get(i)); // 자식 댓글인 경우 리스트에서 부모를 꺼내 자식 리스트에 추가 if (commentDto.getParentCommentId() != null && !commentDtoList.isEmpty()) { GetCommentListDto.Comment parent = commentDtoList.get(commentDtoList.size() - 1); @@ -42,7 +47,7 @@ public static CommonPageResponse toResponse(Page()) .createdDate(comment.getCreatedAt().toLocalDate()) + .isMyComment(isMyComment) .build(); } } diff --git a/src/main/java/com/brainpix/post/converter/GetIdeaDetailDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetIdeaDetailDtoConverter.java index 8945a8b7..e9b247c3 100644 --- a/src/main/java/com/brainpix/post/converter/GetIdeaDetailDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetIdeaDetailDtoConverter.java @@ -16,7 +16,7 @@ public static GetIdeaDetailDto.Parameter toParameter(Long ideaId, Long userId) { } public static GetIdeaDetailDto.Response toResponse(IdeaMarket ideaMarket, User writer, Long saveCount, - Long totalIdeas, Long totalCollaborations) { + Long totalIdeas, Long totalCollaborations, Boolean isSavedPost, Boolean isMyPost) { // 작성자 GetIdeaDetailDto.Writer writerDto = toWriter(writer, totalIdeas, totalCollaborations); @@ -41,6 +41,8 @@ public static GetIdeaDetailDto.Response toResponse(IdeaMarket ideaMarket, User w .writer(writerDto) .attachments(attachments) .openMyProfile(ideaMarket.getOpenMyProfile()) + .isSavedPost(isSavedPost) + .isMyPost(isMyPost) .build(); } diff --git a/src/main/java/com/brainpix/post/converter/GetIdeaListDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetIdeaListDtoConverter.java index c5347f24..3281fada 100644 --- a/src/main/java/com/brainpix/post/converter/GetIdeaListDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetIdeaListDtoConverter.java @@ -14,7 +14,7 @@ public class GetIdeaListDtoConverter { - public static GetIdeaListDto.Parameter toParameter(GetIdeaListDto.Request request, Pageable pageable) { + public static GetIdeaListDto.Parameter toParameter(Long userId, GetIdeaListDto.Request request, Pageable pageable) { IdeaMarketType type = null; Specialization category = null; @@ -31,6 +31,7 @@ public static GetIdeaListDto.Parameter toParameter(GetIdeaListDto.Request reques } return GetIdeaListDto.Parameter.builder() + .userId(userId) .type(type) .keyword(request.getKeyword()) .category(category) @@ -43,13 +44,13 @@ public static GetIdeaListDto.Parameter toParameter(GetIdeaListDto.Request reques public static CommonPageResponse toResponse(Page ideaMarkets) { Page response = ideaMarkets.map( - ideaMarket -> toIdeaDetail((IdeaMarket)ideaMarket[0], (Long)ideaMarket[1]) + ideaMarket -> toIdeaDetail((IdeaMarket)ideaMarket[0], (Long)ideaMarket[1], (Boolean)ideaMarket[2]) ); return CommonPageResponse.of(response); } - public static GetIdeaListDto.IdeaDetail toIdeaDetail(IdeaMarket ideaMarket, Long saveCount) { + public static GetIdeaListDto.IdeaDetail toIdeaDetail(IdeaMarket ideaMarket, Long saveCount, Boolean isSavedPost) { return GetIdeaListDto.IdeaDetail.builder() .ideaId(ideaMarket.getId()) .auth(ideaMarket.getPostAuth().toString()) @@ -61,6 +62,7 @@ public static GetIdeaListDto.IdeaDetail toIdeaDetail(IdeaMarket ideaMarket, Long .category(ideaMarket.getSpecialization().toString()) .saveCount(saveCount) .viewCount(ideaMarket.getViewCount()) + .isSavedPost(isSavedPost) .build(); } } diff --git a/src/main/java/com/brainpix/post/converter/GetPopularIdeaListDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetPopularIdeaListDtoConverter.java index 40c486f7..51f81b86 100644 --- a/src/main/java/com/brainpix/post/converter/GetPopularIdeaListDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetPopularIdeaListDtoConverter.java @@ -12,7 +12,7 @@ public class GetPopularIdeaListDtoConverter { - public static GetPopularIdeaListDto.Parameter toParameter(GetPopularIdeaListDto.Request request, + public static GetPopularIdeaListDto.Parameter toParameter(Long userId, GetPopularIdeaListDto.Request request, Pageable pageable) { IdeaMarketType type = null; @@ -23,6 +23,7 @@ public static GetPopularIdeaListDto.Parameter toParameter(GetPopularIdeaListDto. } return GetPopularIdeaListDto.Parameter.builder() + .userId(userId) .type(type) .pageable(pageable) .build(); @@ -31,13 +32,14 @@ public static GetPopularIdeaListDto.Parameter toParameter(GetPopularIdeaListDto. public static CommonPageResponse toResponse(Page ideaMarkets) { Page response = ideaMarkets.map( - ideaMarket -> toIdeaDetail((IdeaMarket)ideaMarket[0], (Long)ideaMarket[1]) + ideaMarket -> toIdeaDetail((IdeaMarket)ideaMarket[0], (Long)ideaMarket[1], (Boolean)ideaMarket[2]) ); return CommonPageResponse.of(response); } - public static GetPopularIdeaListDto.IdeaDetail toIdeaDetail(IdeaMarket ideaMarket, Long saveCount) { + public static GetPopularIdeaListDto.IdeaDetail toIdeaDetail(IdeaMarket ideaMarket, Long saveCount, + Boolean isSavedPost) { return GetPopularIdeaListDto.IdeaDetail.builder() .ideaId(ideaMarket.getId()) @@ -50,6 +52,7 @@ public static GetPopularIdeaListDto.IdeaDetail toIdeaDetail(IdeaMarket ideaMarke .category(ideaMarket.getSpecialization().toString()) .saveCount(saveCount) .viewCount(ideaMarket.getViewCount()) + .isSavedPost(isSavedPost) .build(); } } diff --git a/src/main/java/com/brainpix/post/converter/GetPopularRequestTaskListDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetPopularRequestTaskListDtoConverter.java index e419d2e9..4c111805 100644 --- a/src/main/java/com/brainpix/post/converter/GetPopularRequestTaskListDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetPopularRequestTaskListDtoConverter.java @@ -15,7 +15,8 @@ public class GetPopularRequestTaskListDtoConverter { - public static GetPopularRequestTaskListDto.Parameter toParameter(GetPopularRequestTaskListDto.Request request, + public static GetPopularRequestTaskListDto.Parameter toParameter(Long userId, + GetPopularRequestTaskListDto.Request request, Pageable pageable) { RequestTaskType type = null; @@ -27,6 +28,7 @@ public static GetPopularRequestTaskListDto.Parameter toParameter(GetPopularReque } return GetPopularRequestTaskListDto.Parameter.builder() + .userId(userId) .type(type) .pageable(pageable) .build(); @@ -34,7 +36,8 @@ public static GetPopularRequestTaskListDto.Parameter toParameter(GetPopularReque public static GetPopularRequestTaskListDto.RequestTaskDetail toRequestTaskDetail(RequestTask requestTask, Long saveCount, - Long deadline) { + Long deadline, Boolean isSavedPost) { + return GetPopularRequestTaskListDto.RequestTaskDetail.builder() .taskId(requestTask.getId()) .auth(requestTask.getPostAuth().toString()) @@ -46,6 +49,7 @@ public static GetPopularRequestTaskListDto.RequestTaskDetail toRequestTaskDetail .category(requestTask.getSpecialization().toString()) .saveCount(saveCount) .viewCount(requestTask.getViewCount()) + .isSavedPost(isSavedPost) .build(); } @@ -58,7 +62,8 @@ public static CommonPageResponse LocalDateTime deadline = task.getDeadline(); // 마감 기한 LocalDateTime now = LocalDateTime.now(); // 현재 시간 Long days = deadline.isBefore(now) ? 0L : ChronoUnit.DAYS.between(now, deadline); // D-DAY 계산 - return GetPopularRequestTaskListDtoConverter.toRequestTaskDetail(task, saveCount, days); + Boolean isSavedPost = (Boolean)requestTask[2]; // 게시글 저장 여부 + return GetPopularRequestTaskListDtoConverter.toRequestTaskDetail(task, saveCount, days, isSavedPost); } ); diff --git a/src/main/java/com/brainpix/post/converter/GetRequestTaskDetailDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetRequestTaskDetailDtoConverter.java index 9ad7ac5e..30a70997 100644 --- a/src/main/java/com/brainpix/post/converter/GetRequestTaskDetailDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetRequestTaskDetailDtoConverter.java @@ -19,7 +19,7 @@ public static GetRequestTaskDetailDto.Parameter toParameter(Long taskId, Long us } public static GetRequestTaskDetailDto.Response toResponse(RequestTask requestTask, User writer, Long saveCount, - Long totalIdeas, Long totalCollaborations) { + Long totalIdeas, Long totalCollaborations, Boolean isSavedPost, Boolean isMyPost) { // 작성자 GetRequestTaskDetailDto.Writer writerDto = toWriter(writer, totalIdeas, totalCollaborations); @@ -50,6 +50,8 @@ public static GetRequestTaskDetailDto.Response toResponse(RequestTask requestTas .attachments(requestTask.getAttachmentFileList()) .recruitments(recruitments) .openMyProfile(requestTask.getOpenMyProfile()) + .isSavedPost(isSavedPost) + .isMyPost(isMyPost) .build(); } diff --git a/src/main/java/com/brainpix/post/converter/GetRequestTaskListDtoConverter.java b/src/main/java/com/brainpix/post/converter/GetRequestTaskListDtoConverter.java index fa3f2bbc..dfafa02d 100644 --- a/src/main/java/com/brainpix/post/converter/GetRequestTaskListDtoConverter.java +++ b/src/main/java/com/brainpix/post/converter/GetRequestTaskListDtoConverter.java @@ -17,7 +17,7 @@ public class GetRequestTaskListDtoConverter { - public static GetRequestTaskListDto.Parameter toParameter(GetRequestTaskListDto.Request request, + public static GetRequestTaskListDto.Parameter toParameter(Long userId, GetRequestTaskListDto.Request request, Pageable pageable) { RequestTaskType type = null; @@ -36,6 +36,7 @@ public static GetRequestTaskListDto.Parameter toParameter(GetRequestTaskListDto. } return GetRequestTaskListDto.Parameter.builder() + .userId(userId) .type(type) .keyword(request.getKeyword()) .category(category) @@ -46,7 +47,7 @@ public static GetRequestTaskListDto.Parameter toParameter(GetRequestTaskListDto. } public static GetRequestTaskListDto.RequestTaskDetail toRequestTaskDetail(RequestTask requestTask, Long saveCount, - Long deadline) { + Long deadline, Boolean isSavedPost) { return GetRequestTaskListDto.RequestTaskDetail.builder() .taskId(requestTask.getId()) .auth(requestTask.getPostAuth().toString()) @@ -58,6 +59,7 @@ public static GetRequestTaskListDto.RequestTaskDetail toRequestTaskDetail(Reques .category(requestTask.getSpecialization().toString()) .saveCount(saveCount) .viewCount(requestTask.getViewCount()) + .isSavedPost(isSavedPost) .build(); } @@ -70,7 +72,8 @@ public static CommonPageResponse toResp LocalDateTime deadline = task.getDeadline(); // 마감 기한 LocalDateTime now = LocalDateTime.now(); // 현재 시간 Long days = deadline.isBefore(now) ? 0L : ChronoUnit.DAYS.between(now, deadline); // D-DAY 계산 - return GetRequestTaskListDtoConverter.toRequestTaskDetail(task, saveCount, days); + Boolean isSavedPost = (Boolean)requestTask[2]; // 게시글 저장 여부 + return GetRequestTaskListDtoConverter.toRequestTaskDetail(task, saveCount, days, isSavedPost); } ); diff --git a/src/main/java/com/brainpix/post/dto/GetCollaborationHubDetailDto.java b/src/main/java/com/brainpix/post/dto/GetCollaborationHubDetailDto.java index 0448269a..7995f02d 100644 --- a/src/main/java/com/brainpix/post/dto/GetCollaborationHubDetailDto.java +++ b/src/main/java/com/brainpix/post/dto/GetCollaborationHubDetailDto.java @@ -34,6 +34,8 @@ public static class Response { private List recruitments; // 모집 단위 private List openMembers; // 개최 인원 private Boolean openMyProfile; // 프로필 공개 여부 + private Boolean isSavedPost; // 게시글 저장 여부 + private Boolean isMyPost; // 내 게시글인지 여부 } @Builder diff --git a/src/main/java/com/brainpix/post/dto/GetCollaborationHubListDto.java b/src/main/java/com/brainpix/post/dto/GetCollaborationHubListDto.java index 05d2dcf0..20b066bd 100644 --- a/src/main/java/com/brainpix/post/dto/GetCollaborationHubListDto.java +++ b/src/main/java/com/brainpix/post/dto/GetCollaborationHubListDto.java @@ -23,6 +23,7 @@ public static class Request { @Builder @Getter public static class Parameter { + private Long userId; // 유저 ID private String keyword; // 검색 키워드 private Specialization category; // 카테고리 private Boolean onlyCompany; // 기업 공개 제외/기업 공개만 보기 @@ -45,5 +46,6 @@ public static class CollaborationDetail { private Long totalQuantity; // 전체 인원 private Long saveCount; // 저장수 private Long viewCount; // 조회수 + private Boolean isSavedPost; // 게시글 저장 여부 } } diff --git a/src/main/java/com/brainpix/post/dto/GetCommentListDto.java b/src/main/java/com/brainpix/post/dto/GetCommentListDto.java index a044ac14..8d4d6b53 100644 --- a/src/main/java/com/brainpix/post/dto/GetCommentListDto.java +++ b/src/main/java/com/brainpix/post/dto/GetCommentListDto.java @@ -13,6 +13,7 @@ public class GetCommentListDto { @Builder @Getter public static class Parameter { + private Long userId; // 유저 ID private Long postId; // 게시글 ID private Pageable pageable; // 페이징 기준 } @@ -27,5 +28,6 @@ public static class Comment { private Long parentCommentId; // 부모 댓글 ID private LocalDate createdDate; // 댓글 작성일 private List childComments; // Q&A 목록 + private Boolean isMyComment; // 내 댓글인지 여부 } } diff --git a/src/main/java/com/brainpix/post/dto/GetIdeaDetailDto.java b/src/main/java/com/brainpix/post/dto/GetIdeaDetailDto.java index 39a05586..79587e7a 100644 --- a/src/main/java/com/brainpix/post/dto/GetIdeaDetailDto.java +++ b/src/main/java/com/brainpix/post/dto/GetIdeaDetailDto.java @@ -34,6 +34,8 @@ public static class Response { private Writer writer; // 작성자 private List attachments; // 첨부 파일 목록 private Boolean openMyProfile; // 프로필 공개 여부 + private Boolean isSavedPost; // 저장한 게시글인지 여부 + private Boolean isMyPost; // 내 게시글인지 여부 } @Builder diff --git a/src/main/java/com/brainpix/post/dto/GetIdeaListDto.java b/src/main/java/com/brainpix/post/dto/GetIdeaListDto.java index 51909f15..b2cb271f 100644 --- a/src/main/java/com/brainpix/post/dto/GetIdeaListDto.java +++ b/src/main/java/com/brainpix/post/dto/GetIdeaListDto.java @@ -27,6 +27,7 @@ public static class Request { @Builder @Getter public static class Parameter { + private Long userId; // 유저 식별자 private IdeaMarketType type; // 아이디어 타입 private String keyword; // 검색 키워드 private Specialization category; // 카테고리 @@ -48,5 +49,6 @@ public static class IdeaDetail { private String category; // 게시글의 카테고리 private Long saveCount; // 저장수 private Long viewCount; // 조회수 + private Boolean isSavedPost; // 저장한 게시글인지 여부 } } diff --git a/src/main/java/com/brainpix/post/dto/GetPopularIdeaListDto.java b/src/main/java/com/brainpix/post/dto/GetPopularIdeaListDto.java index 7732d986..1f4ee18c 100644 --- a/src/main/java/com/brainpix/post/dto/GetPopularIdeaListDto.java +++ b/src/main/java/com/brainpix/post/dto/GetPopularIdeaListDto.java @@ -23,6 +23,7 @@ public static class Request { @Builder @Getter public static class Parameter { + private Long userId; // 유저 ID private IdeaMarketType type; // 아이디어 타입 (IDEA_SOLUTION, MARKET_PLACE) private Pageable pageable; // 페이징 기준 } @@ -40,5 +41,6 @@ public static class IdeaDetail { private String category; // 게시글의 카테고리 private Long saveCount; // 저장 횟수 private Long viewCount; // 조회수 + private Boolean isSavedPost; // 저장한 게시글인지 여부 } } diff --git a/src/main/java/com/brainpix/post/dto/GetPopularRequestTaskListDto.java b/src/main/java/com/brainpix/post/dto/GetPopularRequestTaskListDto.java index e8bdaa6a..861a3501 100644 --- a/src/main/java/com/brainpix/post/dto/GetPopularRequestTaskListDto.java +++ b/src/main/java/com/brainpix/post/dto/GetPopularRequestTaskListDto.java @@ -23,6 +23,7 @@ public static class Request { @Builder @Getter public static class Parameter { + private Long userId; // 유저 ID private RequestTaskType type; // 요청 과제 타입 private Pageable pageable; // 페이징 기준 } @@ -40,5 +41,6 @@ public static class RequestTaskDetail { private String category; // 게시글의 카테고리 private Long saveCount; // 저장수 private Long viewCount; // 조회수 + private Boolean isSavedPost; // 저장한 게시글인지 여부 } } diff --git a/src/main/java/com/brainpix/post/dto/GetRequestTaskDetailDto.java b/src/main/java/com/brainpix/post/dto/GetRequestTaskDetailDto.java index 58533f60..a5817173 100644 --- a/src/main/java/com/brainpix/post/dto/GetRequestTaskDetailDto.java +++ b/src/main/java/com/brainpix/post/dto/GetRequestTaskDetailDto.java @@ -33,6 +33,8 @@ public static class Response { private List attachments; // 첨부 파일 목록 private List recruitments; // 모집 단위 private Boolean openMyProfile; // 내 프로필 공개 여부 + private Boolean isSavedPost; // 저장한 게시글인지 여부 + private Boolean isMyPost; // 내 게시글인지 여부 } @Builder diff --git a/src/main/java/com/brainpix/post/dto/GetRequestTaskListDto.java b/src/main/java/com/brainpix/post/dto/GetRequestTaskListDto.java index 677e55dc..d2bef8bf 100644 --- a/src/main/java/com/brainpix/post/dto/GetRequestTaskListDto.java +++ b/src/main/java/com/brainpix/post/dto/GetRequestTaskListDto.java @@ -27,6 +27,7 @@ public static class Request { @Builder @Getter public static class Parameter { + private Long userId; // 유저 ID private RequestTaskType type; // 요청 과제 타입 private String keyword; // 검색 키워드 private Specialization category; // 카테고리 @@ -48,5 +49,6 @@ public static class RequestTaskDetail { private String category; // 게시글의 카테고리 private Long saveCount; // 저장수 private Long viewCount; // 조회수 + private Boolean isSavedPost; // 저장한 게시글인지 여부 } } diff --git a/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepository.java b/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepository.java index 314182ce..8afc41e2 100644 --- a/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepository.java +++ b/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepository.java @@ -9,7 +9,7 @@ public interface CollaborationHubCustomRepository { // 검색 기능을 포함한 협업 광장 조회 - Page findCollaborationListWithSaveCount(String keyword, + Page findCollaborationListWithSaveCount(Long userId, String keyword, Specialization category, Boolean onlyCompany, SortType sortType, Pageable pageable); } diff --git a/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepositoryImpl.java b/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepositoryImpl.java index 2f022929..7bc7ced9 100644 --- a/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepositoryImpl.java +++ b/src/main/java/com/brainpix/post/repository/CollaborationHubCustomRepositoryImpl.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Repository; import com.brainpix.post.entity.QSavedPost; +import com.brainpix.post.entity.collaboration_hub.CollaborationHub; import com.brainpix.post.entity.collaboration_hub.QCollaborationHub; import com.brainpix.post.enums.PostBooleanExpression; import com.brainpix.post.enums.SortType; @@ -16,6 +17,8 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.BooleanTemplate; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -30,7 +33,7 @@ public class CollaborationHubCustomRepositoryImpl implements CollaborationHubCus QSavedPost savedPost = QSavedPost.savedPost; @Override - public Page findCollaborationListWithSaveCount(String keyword, Specialization category, + public Page findCollaborationListWithSaveCount(Long userId, String keyword, Specialization category, Boolean onlyCompany, SortType sortType, Pageable pageable) { // 검색 조건 @@ -43,13 +46,24 @@ public Page findCollaborationListWithSaveCount(String keyword, Special ) .reduce(BooleanExpression::and) .orElse(null); - + // 정렬 조건 (기본 값은 최신순) OrderSpecifier order = sortType != null ? sortType.getOrder() : SortType.COLLABORATION_NEWEST.getOrder(); + // 저장 여부 판별을 위한 쿼리 + BooleanTemplate isSavedPost = Expressions.booleanTemplate( + "CASE WHEN EXISTS (SELECT 1 FROM SavedPost sp WHERE sp.post.id = {0} AND sp.user.id = {1}) " + + "THEN TRUE ELSE FALSE END", + collaborationHub.id, userId + ); + // 조회 결과 List queryResult = queryFactory - .select(collaborationHub, savedPost.count()) + .select( + collaborationHub, + savedPost.count(), + isSavedPost + ) .from(collaborationHub) .leftJoin(savedPost).on(collaborationHub.eq(savedPost.post)) .where(where) @@ -74,9 +88,10 @@ public Page findCollaborationListWithSaveCount(String keyword, Special private List parsingResult(List queryResult) { return queryResult.stream() .map(tuple -> { - Object[] objects = new Object[2]; - objects[0] = tuple.get(collaborationHub); - objects[1] = tuple.get(savedPost.count()); + Object[] objects = new Object[3]; + objects[0] = tuple.get(0, CollaborationHub.class); + objects[1] = tuple.get(1, Long.class); + objects[2] = tuple.get(2, Boolean.class); return objects; }) .toList(); diff --git a/src/main/java/com/brainpix/post/repository/CommentRepository.java b/src/main/java/com/brainpix/post/repository/CommentRepository.java index 4c39df47..bd4bb725 100644 --- a/src/main/java/com/brainpix/post/repository/CommentRepository.java +++ b/src/main/java/com/brainpix/post/repository/CommentRepository.java @@ -1,12 +1,8 @@ package com.brainpix.post.repository; -import java.util.List; - import org.springframework.data.jpa.repository.JpaRepository; import com.brainpix.post.entity.Comment; public interface CommentRepository extends JpaRepository, CommentCustomRepository { - - List findAllByParentCommentId(Long parentCommentId); } diff --git a/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepository.java b/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepository.java index edf418e2..55b97a1e 100644 --- a/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepository.java +++ b/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepository.java @@ -10,9 +10,10 @@ public interface IdeaMarketCustomRepository { // 검색 기능을 포함한 아이디어 조회 - Page findIdeaListWithSaveCount(IdeaMarketType ideaMarketType, String keyword, Specialization category, + Page findIdeaListWithSaveCount(Long userId, IdeaMarketType ideaMarketType, String keyword, + Specialization category, Boolean onlyCompany, SortType sortType, Pageable pageable); // (IDEA_SOLUTION, MARKET_PLACE)로 구분한 뒤, 모든 아이디어 중에서 저장순으로 조회 - Page findPopularIdeaListWithSaveCount(IdeaMarketType ideaMarketType, Pageable pageable); + Page findPopularIdeaListWithSaveCount(Long userId, IdeaMarketType ideaMarketType, Pageable pageable); } diff --git a/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepositoryImpl.java b/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepositoryImpl.java index 9d4b7145..93212dfe 100644 --- a/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepositoryImpl.java +++ b/src/main/java/com/brainpix/post/repository/IdeaMarketCustomRepositoryImpl.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Repository; import com.brainpix.post.entity.QSavedPost; +import com.brainpix.post.entity.idea_market.IdeaMarket; import com.brainpix.post.entity.idea_market.IdeaMarketType; import com.brainpix.post.entity.idea_market.QIdeaMarket; import com.brainpix.post.enums.PostBooleanExpression; @@ -17,6 +18,8 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.BooleanTemplate; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -34,7 +37,7 @@ public class IdeaMarketCustomRepositoryImpl implements IdeaMarketCustomRepositor // ideaMarketType으로 아이디어 유형을 구분한 뒤, // 검색 조건을 동적으로 적용하여 아이디어 목록을 조회합니다. @Override - public Page findIdeaListWithSaveCount(IdeaMarketType ideaMarketType, String keyword, + public Page findIdeaListWithSaveCount(Long userId, IdeaMarketType ideaMarketType, String keyword, Specialization category, Boolean onlyCompany, SortType sortType, Pageable pageable) { @@ -53,9 +56,20 @@ public Page findIdeaListWithSaveCount(IdeaMarketType ideaMarketType, S // 정렬 조건 (기본 값은 최신순) OrderSpecifier order = sortType != null ? sortType.getOrder() : SortType.IDEA_NEWEST.getOrder(); + // 저장 여부 판별을 위한 쿼리 + BooleanTemplate isSavedPost = Expressions.booleanTemplate( + "CASE WHEN EXISTS (SELECT 1 FROM SavedPost sp WHERE sp.post.id = {0} AND sp.user.id = {1}) " + + "THEN TRUE ELSE FALSE END", + ideaMarket.id, userId + ); + // 조회 결과 List queryResult = queryFactory - .select(ideaMarket, savedPost.count()) + .select( + ideaMarket, + savedPost.count(), + isSavedPost + ) .from(ideaMarket) .leftJoin(savedPost).on(ideaMarket.eq(savedPost.post)) .where(where) @@ -72,7 +86,7 @@ public Page findIdeaListWithSaveCount(IdeaMarketType ideaMarketType, S .leftJoin(savedPost).on(ideaMarket.eq(savedPost.post)) .where(where); - // 게시글-저장수를 쌍으로 저장 + // 게시글-저장수-저장여부를 쌍으로 저장 List result = parsingResult(queryResult); return PageableExecutionUtils.getPage(result, pageable, countQuery::fetchOne); @@ -82,7 +96,8 @@ public Page findIdeaListWithSaveCount(IdeaMarketType ideaMarketType, S // ideaMarketType으로 아이디어 유형을 구분한 뒤, // 모든 아이디어에서 저장순으로 조회합니다. @Override - public Page findPopularIdeaListWithSaveCount(IdeaMarketType ideaMarketType, Pageable pageable) { + public Page findPopularIdeaListWithSaveCount(Long userId, IdeaMarketType ideaMarketType, + Pageable pageable) { // 검색 조건 BooleanExpression where = Stream.of( @@ -96,9 +111,20 @@ public Page findPopularIdeaListWithSaveCount(IdeaMarketType ideaMarket // 정렬 조건 OrderSpecifier order = savedPost.count().desc(); + // 저장 여부 판별을 위한 쿼리 + BooleanTemplate isSavedPost = Expressions.booleanTemplate( + "CASE WHEN EXISTS (SELECT 1 FROM SavedPost sp WHERE sp.post.id = {0} AND sp.user.id = {1}) " + + "THEN TRUE ELSE FALSE END", + ideaMarket.id, userId + ); + // 조회 결과 List queryResult = queryFactory - .select(ideaMarket, savedPost.count()) + .select( + ideaMarket, + savedPost.count(), + isSavedPost + ) .from(ideaMarket) .leftJoin(savedPost).on(ideaMarket.eq(savedPost.post)) .where(where) @@ -114,7 +140,7 @@ public Page findPopularIdeaListWithSaveCount(IdeaMarketType ideaMarket .from(ideaMarket) .where(where); - // 게시글-저장수를 쌍으로 저장 + // 게시글-저장수-저장여부를 쌍으로 저장 List result = parsingResult(queryResult); return PageableExecutionUtils.getPage(result, pageable, countQuery::fetchOne); @@ -123,9 +149,10 @@ public Page findPopularIdeaListWithSaveCount(IdeaMarketType ideaMarket private List parsingResult(List queryResult) { return queryResult.stream() .map(tuple -> { - Object[] objects = new Object[2]; - objects[0] = tuple.get(ideaMarket); - objects[1] = tuple.get(savedPost.count()); + Object[] objects = new Object[3]; + objects[0] = tuple.get(0, IdeaMarket.class); + objects[1] = tuple.get(1, Long.class); + objects[2] = tuple.get(2, Boolean.class); return objects; }) .toList(); diff --git a/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepository.java b/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepository.java index bac7e399..591ec5d4 100644 --- a/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepository.java +++ b/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepository.java @@ -10,9 +10,10 @@ public interface RequestTaskCustomRepository { // 검색 기능을 포함한 요청 과제 조회 - Page findRequestTaskListWithSaveCount(RequestTaskType requestTaskType, String keyword, + Page findRequestTaskListWithSaveCount(Long userId, RequestTaskType requestTaskType, String keyword, Specialization category, Boolean onlyCompany, SortType sortType, Pageable pageable); // (OPEN_IDEA, TECH_ZONE)으로 구분한 뒤, 모든 요청 과제 중에서 저장순으로 조회 - Page findPopularRequestTaskListWithSaveCount(RequestTaskType requestTaskType, Pageable pageable); + Page findPopularRequestTaskListWithSaveCount(Long userId, RequestTaskType requestTaskType, + Pageable pageable); } diff --git a/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepositoryImpl.java b/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepositoryImpl.java index d45f5494..d2ed0f9f 100644 --- a/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepositoryImpl.java +++ b/src/main/java/com/brainpix/post/repository/RequestTaskCustomRepositoryImpl.java @@ -10,6 +10,7 @@ import com.brainpix.post.entity.QSavedPost; import com.brainpix.post.entity.request_task.QRequestTask; +import com.brainpix.post.entity.request_task.RequestTask; import com.brainpix.post.entity.request_task.RequestTaskType; import com.brainpix.post.enums.PostBooleanExpression; import com.brainpix.post.enums.SortType; @@ -17,6 +18,8 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.BooleanTemplate; +import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -31,7 +34,7 @@ public class RequestTaskCustomRepositoryImpl implements RequestTaskCustomReposit QSavedPost savedPost = QSavedPost.savedPost; @Override - public Page findRequestTaskListWithSaveCount(RequestTaskType requestTaskType, String keyword, + public Page findRequestTaskListWithSaveCount(Long userId, RequestTaskType requestTaskType, String keyword, Specialization category, Boolean onlyCompany, SortType sortType, Pageable pageable) { // 검색 조건 @@ -49,9 +52,20 @@ public Page findRequestTaskListWithSaveCount(RequestTaskType requestTa // 정렬 조건 OrderSpecifier order = savedPost.count().desc(); + // 저장 여부 판별을 위한 쿼리 + BooleanTemplate isSavedPost = Expressions.booleanTemplate( + "CASE WHEN EXISTS (SELECT 1 FROM SavedPost sp WHERE sp.post.id = {0} AND sp.user.id = {1}) " + + "THEN TRUE ELSE FALSE END", + requestTask.id, userId + ); + // 조회 결과 List queryResult = queryFactory - .select(requestTask, savedPost.count()) + .select( + requestTask, + savedPost.count(), + isSavedPost + ) .from(requestTask) .leftJoin(savedPost).on(requestTask.eq(savedPost.post)) .where(where) @@ -67,14 +81,15 @@ public Page findRequestTaskListWithSaveCount(RequestTaskType requestTa .from(requestTask) .where(where); - // 게시글-저장수를 쌍으로 저장 + // 게시글-저장수-저장여부를 쌍으로 저장 List result = parsingResult(queryResult); return PageableExecutionUtils.getPage(result, pageable, countQuery::fetchOne); } @Override - public Page findPopularRequestTaskListWithSaveCount(RequestTaskType requestTaskType, Pageable pageable) { + public Page findPopularRequestTaskListWithSaveCount(Long userId, RequestTaskType requestTaskType, + Pageable pageable) { // 검색 조건 BooleanExpression where = Stream.of( @@ -88,9 +103,20 @@ public Page findPopularRequestTaskListWithSaveCount(RequestTaskType re // 정렬 조건 OrderSpecifier order = savedPost.count().desc(); + // 저장 여부 판별을 위한 쿼리 + BooleanTemplate isSavedPost = Expressions.booleanTemplate( + "CASE WHEN EXISTS (SELECT 1 FROM SavedPost sp WHERE sp.post.id = {0} AND sp.user.id = {1}) " + + "THEN TRUE ELSE FALSE END", + requestTask.id, userId + ); + // 조회 결과 List queryResult = queryFactory - .select(requestTask, savedPost.count()) + .select( + requestTask, + savedPost.count(), + isSavedPost + ) .from(requestTask) .leftJoin(savedPost).on(requestTask.eq(savedPost.post)) .where(where) @@ -106,7 +132,7 @@ public Page findPopularRequestTaskListWithSaveCount(RequestTaskType re .from(requestTask) .where(where); - // 게시글-저장수를 쌍으로 저장 + // 게시글-저장수-저장여부를 쌍으로 저장 List result = parsingResult(queryResult); return PageableExecutionUtils.getPage(result, pageable, countQuery::fetchOne); @@ -115,9 +141,10 @@ public Page findPopularRequestTaskListWithSaveCount(RequestTaskType re private List parsingResult(List queryResult) { return queryResult.stream() .map(tuple -> { - Object[] objects = new Object[2]; - objects[0] = tuple.get(requestTask); - objects[1] = tuple.get(savedPost.count()); + Object[] objects = new Object[3]; + objects[0] = tuple.get(0, RequestTask.class); + objects[1] = tuple.get(1, Long.class); + objects[2] = tuple.get(2, Boolean.class); return objects; }) .toList(); diff --git a/src/main/java/com/brainpix/post/repository/SavedPostRepository.java b/src/main/java/com/brainpix/post/repository/SavedPostRepository.java index e4fdd730..b50269d2 100644 --- a/src/main/java/com/brainpix/post/repository/SavedPostRepository.java +++ b/src/main/java/com/brainpix/post/repository/SavedPostRepository.java @@ -9,8 +9,10 @@ import com.brainpix.user.entity.User; public interface SavedPostRepository extends JpaRepository, SavedPostRepositoryCustom { - + Long countByPostId(Long postId); Optional findByUserAndPost(User user, Post post); + + boolean existsByUserAndPost(User user, Post post); } \ No newline at end of file diff --git a/src/main/java/com/brainpix/post/service/CollaborationHubService.java b/src/main/java/com/brainpix/post/service/CollaborationHubService.java index 8f5fd7ae..7a9f6744 100644 --- a/src/main/java/com/brainpix/post/service/CollaborationHubService.java +++ b/src/main/java/com/brainpix/post/service/CollaborationHubService.java @@ -102,10 +102,15 @@ public void deleteCollaborationHub(Long collaborationId, Long userId) { public CommonPageResponse getCollaborationHubList( GetCollaborationHubListDto.Parameter parameter) { - // 협업 게시글-저장수 쌍으로 반환된 결과 + // 협업 게시글-저장수-저장여부 쌍으로 반환된 결과 Page result = collaborationHubRepository.findCollaborationListWithSaveCount( - parameter.getKeyword(), parameter.getCategory(), parameter.getOnlyCompany(), parameter.getSortType(), - parameter.getPageable()); + parameter.getUserId(), + parameter.getKeyword(), + parameter.getCategory(), + parameter.getOnlyCompany(), + parameter.getSortType(), + parameter.getPageable() + ); return GetCollaborationHubListDtoConverter.toResponse(result); } @@ -149,8 +154,14 @@ public GetCollaborationHubDetailDto.Response getCollaborationHubDetail( List collectionGatherings = collectionGatheringRepository.findByCollaborationHubId( collaborationHub.getId()); + // 저장한 게시글인지 확인 + Boolean isSavedPost = savedPostRepository.existsByUserAndPost(user, collaborationHub); + + // 내 게시글인지 확인 + Boolean isMyPost = writer == user; + return GetCollaborationHubDetailDtoConverter.toResponse(collaborationHub, collectionGatherings, writer, - saveCount, totalIdeas, totalCollaborations); + saveCount, totalIdeas, totalCollaborations, isSavedPost, isMyPost); } @Transactional diff --git a/src/main/java/com/brainpix/post/service/CommentService.java b/src/main/java/com/brainpix/post/service/CommentService.java index a7e06989..f60d0fd1 100644 --- a/src/main/java/com/brainpix/post/service/CommentService.java +++ b/src/main/java/com/brainpix/post/service/CommentService.java @@ -1,5 +1,7 @@ package com.brainpix.post.service; +import java.util.List; + import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,8 +49,14 @@ public CommonPageResponse getCommentList(GetCommentLi // 게시글에 연관된 모든 댓글을 조회 Page comments = commentRepository.findByParentPostId(post.getId(), parameter.getPageable()); + // 내가 쓴 댓글인지 여부 + List isMyComments = comments.stream() + .map(comment -> comment.getWriter().getId().equals(parameter.getUserId()) + ) + .toList(); + // dto 변환 - return GetCommentListDtoConverter.toResponse(comments, parameter.getPageable()); + return GetCommentListDtoConverter.toResponse(comments, parameter.getPageable(), isMyComments); } // 댓글 생성 diff --git a/src/main/java/com/brainpix/post/service/IdeaMarketService.java b/src/main/java/com/brainpix/post/service/IdeaMarketService.java index 633cd0a1..eee0b250 100644 --- a/src/main/java/com/brainpix/post/service/IdeaMarketService.java +++ b/src/main/java/com/brainpix/post/service/IdeaMarketService.java @@ -91,7 +91,8 @@ public void deleteIdeaMarket(Long ideaId, Long userId) { public CommonPageResponse getIdeaList(GetIdeaListDto.Parameter parameter) { // 아이디어-저장수 쌍으로 반환된 결과 - Page result = ideaMarketRepository.findIdeaListWithSaveCount(parameter.getType(), + Page result = ideaMarketRepository.findIdeaListWithSaveCount(parameter.getUserId(), + parameter.getType(), parameter.getKeyword(), parameter.getCategory(), parameter.getOnlyCompany(), parameter.getSortType(), parameter.getPageable()); @@ -133,7 +134,14 @@ public GetIdeaDetailDto.Response getIdeaDetail(GetIdeaDetailDto.Parameter parame + collectionGatheringRepository.countByJoinerIdAndInitialGathering( writer.getId(), true) + requestTaskPurchasingRepository.countByBuyerIdAndAccepted(writer.getId(), true); - return GetIdeaDetailDtoConverter.toResponse(ideaMarket, writer, saveCount, totalIdeas, totalCollaborations); + // 저장한 게시글인지 확인 + Boolean isSavedPost = savedPostRepository.existsByUserAndPost(user, ideaMarket); + + // 내 게시글인지 확인 + Boolean isMyPost = writer.equals(user); + + return GetIdeaDetailDtoConverter.toResponse(ideaMarket, writer, saveCount, totalIdeas, totalCollaborations, + isSavedPost, isMyPost); } // 저장순으로 아이디어를 조회합니다. @@ -142,7 +150,8 @@ public CommonPageResponse getPopularIdeaList( GetPopularIdeaListDto.Parameter parameter) { // 아이디어-저장수 쌍으로 반환된 결과 - Page ideaMarkets = ideaMarketRepository.findPopularIdeaListWithSaveCount(parameter.getType(), + Page ideaMarkets = ideaMarketRepository.findPopularIdeaListWithSaveCount(parameter.getUserId(), + parameter.getType(), parameter.getPageable()); return GetPopularIdeaListDtoConverter.toResponse(ideaMarkets); diff --git a/src/main/java/com/brainpix/post/service/RequestTaskQueryService.java b/src/main/java/com/brainpix/post/service/RequestTaskQueryService.java index 7fb5dc5e..1428196c 100644 --- a/src/main/java/com/brainpix/post/service/RequestTaskQueryService.java +++ b/src/main/java/com/brainpix/post/service/RequestTaskQueryService.java @@ -46,9 +46,15 @@ public CommonPageResponse getRequestTas GetRequestTaskListDto.Parameter parameter) { // 요청 과제-저장수 쌍으로 반환된 결과 - Page result = requestTaskRepository.findRequestTaskListWithSaveCount(parameter.getType(), - parameter.getKeyword(), parameter.getCategory(), parameter.getOnlyCompany(), parameter.getSortType(), - parameter.getPageable()); + Page result = requestTaskRepository.findRequestTaskListWithSaveCount( + parameter.getUserId(), + parameter.getType(), + parameter.getKeyword(), + parameter.getCategory(), + parameter.getOnlyCompany(), + parameter.getSortType(), + parameter.getPageable() + ); // dto로 변환 return GetRequestTaskListDtoConverter.toResponse(result); @@ -60,8 +66,11 @@ public CommonPageResponse getPop GetPopularRequestTaskListDto.Parameter parameter) { // 요청 과제-저장수 쌍으로 반환된 결과 - Page result = requestTaskRepository.findPopularRequestTaskListWithSaveCount(parameter.getType(), - parameter.getPageable()); + Page result = requestTaskRepository.findPopularRequestTaskListWithSaveCount( + parameter.getUserId(), + parameter.getType(), + parameter.getPageable() + ); // dto로 변환 return GetPopularRequestTaskListDtoConverter.toResponse(result); @@ -103,7 +112,13 @@ public GetRequestTaskDetailDto.Response getRequestTaskDetail( + collectionGatheringRepository.countByJoinerIdAndInitialGathering( writer.getId(), true) + requestTaskPurchasingRepository.countByBuyerIdAndAccepted(writer.getId(), true); + // 저장한 게시글인지 확인 + Boolean isSavedPost = savedPostRepository.existsByUserAndPost(user, requestTask); + + // 내 게시글인지 확인 + Boolean isMyPost = writer.equals(user); + return GetRequestTaskDetailDtoConverter.toResponse(requestTask, writer, saveCount, totalIdeas, - totalCollaborations); + totalCollaborations, isSavedPost, isMyPost); } }