Skip to content

Commit 50e6f39

Browse files
committed
[EA3-138] feature: 내가 등록한 모집글 페이징 조회 추가
1 parent 17475f7 commit 50e6f39

File tree

7 files changed

+120
-11
lines changed

7 files changed

+120
-11
lines changed

src/main/java/grep/neogul_coder/domain/main/controller/MainController.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import grep.neogul_coder.domain.main.controller.dto.response.MainResponse;
44
import grep.neogul_coder.domain.recruitment.post.controller.dto.response.RecruitmentPostPagingInfo;
55
import grep.neogul_coder.domain.recruitment.post.service.RecruitmentPostService;
6-
import grep.neogul_coder.domain.study.controller.StudySpecification;
76
import grep.neogul_coder.domain.study.controller.dto.response.StudyItemResponse;
87
import grep.neogul_coder.domain.study.service.StudyService;
98
import grep.neogul_coder.global.auth.Principal;
@@ -28,11 +27,11 @@ public class MainController implements MainSpecification {
2827

2928
@GetMapping
3029
public ApiResponse<MainResponse> getMain(@PageableDefault(size = 10) Pageable pageable,
31-
@AuthenticationPrincipal Principal userDetails) {
30+
@AuthenticationPrincipal Principal userDetails) {
3231
Long userId = userDetails.getUserId();
3332

3433
List<StudyItemResponse> myStudies = studyService.getMyStudies(userId);
35-
RecruitmentPostPagingInfo recruitingStudies = recruitmentPostService.getPagingInfo(pageable);
34+
RecruitmentPostPagingInfo recruitingStudies = recruitmentPostService.getPagingInfo(pageable, null);
3635
MainResponse response = MainResponse.from(myStudies, recruitingStudies);
3736

3837
return ApiResponse.success(response);

src/main/java/grep/neogul_coder/domain/recruitment/post/controller/RecruitmentPostController.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@ public class RecruitmentPostController implements RecruitmentPostSpecification {
2424

2525
@GetMapping
2626
public ApiResponse<RecruitmentPostPagingInfo> getPagingInfo(@PageableDefault(size = 10) Pageable pageable) {
27-
RecruitmentPostPagingInfo response = recruitmentPostService.getPagingInfo(pageable);
27+
RecruitmentPostPagingInfo response = recruitmentPostService.getPagingInfo(pageable, null);
28+
return ApiResponse.success(response);
29+
}
30+
31+
@GetMapping("/me")
32+
public ApiResponse<RecruitmentPostPagingInfo> getMyPostPagingInfo(@PageableDefault(size = 10) Pageable pageable,
33+
@AuthenticationPrincipal Principal userDetails) {
34+
RecruitmentPostPagingInfo response = recruitmentPostService.getPagingInfo(pageable, userDetails.getUserId());
2835
return ApiResponse.success(response);
2936
}
3037

src/main/java/grep/neogul_coder/domain/recruitment/post/controller/RecruitmentPostSpecification.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,45 @@ public interface RecruitmentPostSpecification {
2626
@Operation(summary = "모집 상태 변경", description = "모집글의 상태를 변경 합니다.")
2727
ApiResponse<Long> changeStatus(long recruitmentPostId, RecruitmentPostStatusUpdateRequest request, Principal userDetails);
2828

29+
@Operation(
30+
summary = "내가 등록한 모집글 페이징 조회",
31+
description = """
32+
내가 등록한 모집글 목록을 페이징하여 조회합니다.
33+
34+
✅ 요청 예시:
35+
`GET /recruitment-posts/me?page=0&size=5`
36+
37+
✅ 응답 예시:
38+
```json
39+
{
40+
"data": {
41+
"postInfos": [
42+
{
43+
"subject": "자바 스터디 모집 합니다!",
44+
"content": "자바 스터디는 주 3회 오후 6시에 진행 됩니다.",
45+
"category": "IT",
46+
"studyType": "온라인",
47+
"status": "모집중",
48+
"commentCount": 3,
49+
"createAt": "2025-07-15"
50+
},
51+
{
52+
"subject": "이펙티브 자바 함께 읽어요",
53+
"content": "이펙티브 자바 3판을 함께 읽으며 토론하는 스터디입니다.",
54+
"category": "개발",
55+
"studyType": "오프라인",
56+
"status": "모집완료",
57+
"commentCount": 5,
58+
"createAt": "2025-07-10"
59+
}
60+
]
61+
}
62+
}
63+
```
64+
"""
65+
)
66+
ApiResponse<RecruitmentPostPagingInfo> getMyPostPagingInfo(Pageable pageable, Principal userDetails);
67+
2968
@Operation(
3069
summary = "모집글 페이징 조회",
3170
description = """

src/main/java/grep/neogul_coder/domain/recruitment/post/controller/dto/response/RecruitmentPostPagingInfo.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
import grep.neogul_coder.domain.study.Study;
66
import io.swagger.v3.oas.annotations.media.Schema;
77
import lombok.Getter;
8+
import lombok.ToString;
89

910
import java.time.LocalDate;
1011
import java.util.Collections;
1112
import java.util.List;
1213
import java.util.Map;
1314

15+
@ToString
1416
@Getter
1517
public class RecruitmentPostPagingInfo {
1618

@@ -34,9 +36,13 @@ public static RecruitmentPostPagingInfo of(List<RecruitmentPost> recruitmentPost
3436
return new RecruitmentPostPagingInfo(postInfos);
3537
}
3638

39+
@ToString
3740
@Getter
3841
static class RecruitmentPostInfo {
3942

43+
@Schema(example = "3", description = "모집글 식별자")
44+
private long recruitmentPostId;
45+
4046
@Schema(example = "자바 스터디 모집 합니다!", description = "제목")
4147
private String subject;
4248

@@ -59,6 +65,7 @@ static class RecruitmentPostInfo {
5965
private LocalDate createAt;
6066

6167
private RecruitmentPostInfo(RecruitmentPost post, Study study, List<RecruitmentPostComment> comments) {
68+
this.recruitmentPostId = post.getId();
6269
this.subject = post.getSubject();
6370
this.content = post.getContent();
6471
this.category = study.getCategory().name();

src/main/java/grep/neogul_coder/domain/recruitment/post/repository/RecruitmentPostQueryRepository.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,24 @@ public RecruitmentPostWithStudyInfo findPostWithStudyInfo(Long recruitmentPostId
5151
).fetchOne();
5252
}
5353

54-
public List<RecruitmentPost> findPaging(Pageable pageable) {
54+
public List<RecruitmentPost> findAllByFilter(Pageable pageable) {
5555
return queryFactory.selectFrom(recruitmentPost)
5656
.where(recruitmentPost.activated.isTrue())
5757
.offset(pageable.getOffset())
5858
.limit(pageable.getPageSize())
5959
.orderBy(recruitmentPost.createdDate.desc())
6060
.fetch();
6161
}
62+
63+
public List<RecruitmentPost> findAllByFilter(Pageable pageable, Long userId) {
64+
return queryFactory.selectFrom(recruitmentPost)
65+
.where(
66+
recruitmentPost.userId.eq(userId),
67+
recruitmentPost.activated.isTrue()
68+
)
69+
.offset(pageable.getOffset())
70+
.limit(pageable.getPageSize())
71+
.orderBy(recruitmentPost.createdDate.desc())
72+
.fetch();
73+
}
6274
}

src/main/java/grep/neogul_coder/domain/recruitment/post/service/RecruitmentPostService.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import grep.neogul_coder.domain.recruitment.comment.controller.dto.response.CommentsWithWriterInfo;
55
import grep.neogul_coder.domain.recruitment.comment.repository.RecruitmentPostCommentQueryRepository;
66
import grep.neogul_coder.domain.recruitment.post.RecruitmentPost;
7-
import grep.neogul_coder.domain.recruitment.post.controller.dto.response.RecruitmentPostWithStudyInfo;
87
import grep.neogul_coder.domain.recruitment.post.controller.dto.response.RecruitmentPostInfo;
98
import grep.neogul_coder.domain.recruitment.post.controller.dto.response.RecruitmentPostPagingInfo;
9+
import grep.neogul_coder.domain.recruitment.post.controller.dto.response.RecruitmentPostWithStudyInfo;
1010
import grep.neogul_coder.domain.recruitment.post.repository.RecruitmentPostQueryRepository;
1111
import grep.neogul_coder.domain.recruitment.post.repository.RecruitmentPostRepository;
1212
import grep.neogul_coder.domain.recruitment.post.service.request.RecruitmentPostStatusUpdateServiceRequest;
@@ -53,8 +53,8 @@ public RecruitmentPostInfo get(long recruitmentPostId) {
5353
return new RecruitmentPostInfo(postInfo, comments, applications.size());
5454
}
5555

56-
public RecruitmentPostPagingInfo getPagingInfo(Pageable pageable) {
57-
List<RecruitmentPost> recruitmentPosts = postQueryRepository.findPaging(pageable);
56+
public RecruitmentPostPagingInfo getPagingInfo(Pageable pageable, Long userId) {
57+
List<RecruitmentPost> recruitmentPosts = findPostsFilteredByUser(pageable, userId);
5858
List<Long> recruitmentPostIds = extractId(recruitmentPosts);
5959

6060
List<Study> studies = findConnectedStudiesFrom(recruitmentPosts);
@@ -97,6 +97,13 @@ private List<CommentsWithWriterInfo> findCommentsWithWriterInfo(RecruitmentPost
9797
return applyWithdrawnUserNameChanges(comments, withdrawnUserComments);
9898
}
9999

100+
private List<RecruitmentPost> findPostsFilteredByUser(Pageable pageable, Long userId) {
101+
if (userId == null) {
102+
return postQueryRepository.findAllByFilter(pageable);
103+
}
104+
return postQueryRepository.findAllByFilter(pageable, userId);
105+
}
106+
100107
private List<CommentsWithWriterInfo> withdrawnUserChangeNameFrom(List<CommentsWithWriterInfo> comments) {
101108
return comments.stream()
102109
.filter(info -> !info.isActivated())

src/test/java/grep/neogul_coder/domain/recruitment/post/service/RecruitmentPostServiceTest.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ void get_WhenWithdrawnUser_ThenNicknameUpdate() {
140140
commentRepository.saveAll(comments);
141141

142142
user1.delete();
143-
em.flush(); em.clear();
143+
em.flush();
144+
em.clear();
144145

145146
//when
146147
RecruitmentPostInfo response = recruitmentPostService.get(post.getId());
@@ -176,8 +177,7 @@ void getPagingInfo() {
176177

177178
//when
178179
PageRequest pageable = PageRequest.of(0, 2);
179-
RecruitmentPostPagingInfo result = recruitmentPostService.getPagingInfo(pageable);
180-
System.out.println("result = " + result);
180+
RecruitmentPostPagingInfo result = recruitmentPostService.getPagingInfo(pageable, null);
181181

182182
//then
183183
assertThat(result.getPostInfos()).hasSize(2)
@@ -188,6 +188,44 @@ void getPagingInfo() {
188188
);
189189
}
190190

191+
@DisplayName("내가 작성한 모집글과 관련된 정보들을 페이징 조회 합니다.")
192+
@Test
193+
void getPagingInfo_WhenWrittenByUser() {
194+
//given
195+
User myUser = createUser("myNickname");
196+
User user2 = createUser("회원");
197+
userRepository.saveAll(List.of(myUser, user2));
198+
199+
Study study1 = createStudy("자바 스터디", Category.IT, ONLINE);
200+
Study study2 = createStudy("클라이밍 동아리", Category.HOBBY, OFFLINE);
201+
studyRepository.saveAll(List.of(study1, study2));
202+
203+
RecruitmentPost post1 = createRecruitmentPost(study1.getId(), user2.getId(), "모집글 제목1", "내용1", IN_PROGRESS);
204+
RecruitmentPost post2 = createRecruitmentPost(study2.getId(), myUser.getId(), "모집글 제목2", "내용2", IN_PROGRESS);
205+
RecruitmentPost post3 = createRecruitmentPost(study2.getId(), myUser.getId(), "모집글 제목3", "내용3", IN_PROGRESS);
206+
recruitmentPostRepository.saveAll(List.of(post1, post2, post3));
207+
208+
List<RecruitmentPostComment> comments = List.of(
209+
createPostComment(post1, user2.getId(), "댓글1"),
210+
createPostComment(post2, user2.getId(), "댓글2"),
211+
createPostComment(post2, userId, "댓글3")
212+
);
213+
commentRepository.saveAll(comments);
214+
215+
//when
216+
PageRequest pageable = PageRequest.of(0, 2);
217+
RecruitmentPostPagingInfo result = recruitmentPostService.getPagingInfo(pageable, myUser.getId());
218+
System.out.println("result = " + result);
219+
220+
//then
221+
assertThat(result.getPostInfos()).hasSize(2)
222+
.extracting("category", "subject", "commentCount")
223+
.containsExactlyInAnyOrder(
224+
Tuple.tuple(Category.HOBBY.name(), "모집글 제목2", 2),
225+
Tuple.tuple(Category.HOBBY.name(), "모집글 제목3", 0)
226+
);
227+
}
228+
191229
@DisplayName("모집글을 수정 합니다.")
192230
@TestFactory
193231
Collection<DynamicTest> update() {

0 commit comments

Comments
 (0)