diff --git a/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanApi.java b/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanApi.java index 74de7fbb7..19b542887 100644 --- a/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanApi.java +++ b/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanApi.java @@ -121,6 +121,24 @@ ResponseEntity getCallvanPosts( @UserId Integer userId ); + @ApiResponseCodes({ + OK, + NOT_FOUND_ARTICLE + }) + @Operation(summary = "콜밴 게시글 요약 정보 조회", description = """ + ### 콜밴 게시글 요약 정보 조회 API + 목록 갱신을 위해 콜밴 게시글 목록 조회에서 출력되는 각 게시글을 단건으로 조회합니다. + + #### 비즈니스 로직 + 1. 존재하지 않는 게시글(`NOT_FOUND_ARTICLE`)이면 예외가 발생합니다. + 2. 로그인된 사용자의 경우, 해당 콜벤 게시글에 합류한 상태면 `isJoined` 필드가 true로 표시됩니다. + """) + @GetMapping("/posts/{postId}/summary") + ResponseEntity getCallvanPostSummary( + @PathVariable Integer postId, + @UserId Integer userId + ); + @ApiResponseCodes({ OK, NOT_FOUND_ARTICLE, diff --git a/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanController.java b/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanController.java index 485bf0a2a..241b1cc46 100644 --- a/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanController.java +++ b/src/main/java/in/koreatech/koin/domain/callvan/controller/CallvanController.java @@ -16,6 +16,7 @@ import in.koreatech.koin.domain.callvan.dto.CallvanPostCreateResponse; import in.koreatech.koin.domain.callvan.dto.CallvanPostDetailResponse; import in.koreatech.koin.domain.callvan.dto.CallvanPostSearchResponse; +import in.koreatech.koin.domain.callvan.dto.CallvanPostSearchResponse.CallvanPostResponse; import in.koreatech.koin.domain.callvan.dto.CallvanUserReportCreateRequest; import in.koreatech.koin.domain.callvan.model.enums.CallvanLocation; import in.koreatech.koin.domain.callvan.model.filter.CallvanAuthorFilter; @@ -82,6 +83,15 @@ public ResponseEntity getCallvanPosts( return ResponseEntity.ok().body(response); } + @GetMapping("/posts/{postId}/summary") + public ResponseEntity getCallvanPostSummary( + @PathVariable Integer postId, + @UserId Integer userId + ) { + CallvanPostResponse response = callvanPostQueryService.getCallvanPostSummary(postId, userId); + return ResponseEntity.ok(response); + } + @GetMapping("/posts/{postId}") public ResponseEntity getCallvanPostDetail( @PathVariable Integer postId, diff --git a/src/main/java/in/koreatech/koin/domain/callvan/service/CallvanPostQueryService.java b/src/main/java/in/koreatech/koin/domain/callvan/service/CallvanPostQueryService.java index 79a18c400..2c9bcd395 100644 --- a/src/main/java/in/koreatech/koin/domain/callvan/service/CallvanPostQueryService.java +++ b/src/main/java/in/koreatech/koin/domain/callvan/service/CallvanPostQueryService.java @@ -115,4 +115,11 @@ public CallvanPostDetailResponse getCallvanPostDetail(Integer postId, Integer us return CallvanPostDetailResponse.from(callvanPost, userId, reportedUserIds); } + + public CallvanPostSearchResponse.CallvanPostResponse getCallvanPostSummary(Integer postId, Integer userId) { + CallvanPost callvanPost = callvanPostRepository.getById(postId); + boolean isJoined = + userId != null && callvanParticipantRepository.existsByPostIdAndMemberIdAndIsDeletedFalse(postId, userId); + return CallvanPostSearchResponse.CallvanPostResponse.from(callvanPost, isJoined, userId); + } }