diff --git a/src/main/java/supernova/whokie/groupmember/controller/GroupMemberController.java b/src/main/java/supernova/whokie/groupmember/controller/GroupMemberController.java index 59ca3def..15b063e9 100644 --- a/src/main/java/supernova/whokie/groupmember/controller/GroupMemberController.java +++ b/src/main/java/supernova/whokie/groupmember/controller/GroupMemberController.java @@ -24,6 +24,8 @@ import supernova.whokie.groupmember.service.GroupMemberService; import supernova.whokie.groupmember.service.dto.GroupMemberModel; +import java.util.List; + @RestController @RequiredArgsConstructor @RequestMapping("/api/group") @@ -51,17 +53,27 @@ public GlobalResponse expelGroupMember( } @GetMapping("/{group-id}/member") - public PagingResponse getGroupMemberList( + public PagingResponse getGroupMemberPaging( @PageableDefault(page = 0, size = 10, sort = "createdAt", direction = Sort.Direction.ASC) Pageable pageable, @PathVariable("group-id") @NotNull @Min(1) Long groupId, @Authenticate Long userId ) { - Page model = groupMemberService.getGroupMembers(pageable, userId, + Page model = groupMemberService.getGroupMemberPaging(pageable, userId, groupId); Page response = model.map(GroupMemberResponse.Member::from); return PagingResponse.from(response); } + @GetMapping("/{group-id}/member/list") + public GroupMemberResponse.Members getGroupMemberList( + @PathVariable("group-id") @NotNull @Min(1) Long groupId, + @Authenticate Long userId + ) { + List model = groupMemberService.getGroupMemberList(userId, groupId); + List members = model.stream().map(GroupMemberResponse.Member::from).toList(); + return GroupMemberResponse.Members.from(members); + } + @PostMapping("/join") public GlobalResponse joinGroup( @RequestBody @Valid GroupMemberRequest.Join request, diff --git a/src/main/java/supernova/whokie/groupmember/controller/dto/GroupMemberResponse.java b/src/main/java/supernova/whokie/groupmember/controller/dto/GroupMemberResponse.java index 4111bce2..a1c338a8 100644 --- a/src/main/java/supernova/whokie/groupmember/controller/dto/GroupMemberResponse.java +++ b/src/main/java/supernova/whokie/groupmember/controller/dto/GroupMemberResponse.java @@ -1,12 +1,25 @@ package supernova.whokie.groupmember.controller.dto; import java.time.LocalDate; +import java.util.List; + import lombok.Builder; import supernova.whokie.groupmember.GroupRole; import supernova.whokie.groupmember.service.dto.GroupMemberModel; public class GroupMemberResponse { + @Builder + public record Members( + List members + ) { + public static Members from(List members) { + return Members.builder() + .members(members) + .build(); + } + } + @Builder public record Member( Long groupMemberId, diff --git a/src/main/java/supernova/whokie/groupmember/infrastructure/repository/GroupMemberRepository.java b/src/main/java/supernova/whokie/groupmember/infrastructure/repository/GroupMemberRepository.java index 7368c00e..496e643a 100644 --- a/src/main/java/supernova/whokie/groupmember/infrastructure/repository/GroupMemberRepository.java +++ b/src/main/java/supernova/whokie/groupmember/infrastructure/repository/GroupMemberRepository.java @@ -21,9 +21,8 @@ public interface GroupMemberRepository extends JpaRepository @Query("SELECT g FROM GroupMember g WHERE g.group.id = :groupId") Page findAllByGroupId(Pageable pageable, Long groupId); - @Query("SELECT g FROM GroupMember g JOIN FETCH g.user WHERE g.user.id != :userId AND g.group.id = :groupId ORDER BY function('RAND')") - List getRandomGroupMemberJoinFetch(@Param("userId") Long userId, - @Param("groupId") Long groupId, Pageable pageable); + @Query("SELECT g FROM GroupMember g JOIN FETCH g.user WHERE g.user.id != :userId AND g.group.id = :groupId") + List getGroupMemberJoinFetch(@Param("userId") Long userId, @Param("groupId") Long groupId); Boolean existsByUserIdAndGroupId(Long userId, Long groupId); diff --git a/src/main/java/supernova/whokie/groupmember/service/GroupMemberReaderService.java b/src/main/java/supernova/whokie/groupmember/service/GroupMemberReaderService.java index de8659c1..7d77fa9b 100644 --- a/src/main/java/supernova/whokie/groupmember/service/GroupMemberReaderService.java +++ b/src/main/java/supernova/whokie/groupmember/service/GroupMemberReaderService.java @@ -32,7 +32,7 @@ public boolean isGroupMemberExist(Long userId, Long groupId) { } @Transactional(readOnly = true) - public Page getGroupMembers(Pageable pageable, Long userId, Long groupId) { + public Page getGroupMemberPaging(Pageable pageable, Long userId, Long groupId) { if (!groupMemberRepository.existsByUserIdAndGroupId(userId, groupId)) { throw new EntityNotFoundException(MessageConstants.GROUP_MEMBER_NOT_FOUND_MESSAGE); } @@ -41,10 +41,12 @@ public Page getGroupMembers(Pageable pageable, Long userId, Long gr } @Transactional(readOnly = true) - public List getRandomGroupMembersByGroupId(Long userId, Long groupId, - Pageable pageable) { - return groupMemberRepository.getRandomGroupMemberJoinFetch(userId, - groupId, pageable); + public List getGroupMembersList(Long userId, Long groupId) { + if (!groupMemberRepository.existsByUserIdAndGroupId(userId, groupId)) { + throw new EntityNotFoundException(MessageConstants.GROUP_MEMBER_NOT_FOUND_MESSAGE); + } + + return groupMemberRepository.getGroupMemberJoinFetch(userId, groupId); } @Transactional(readOnly = true) diff --git a/src/main/java/supernova/whokie/groupmember/service/GroupMemberService.java b/src/main/java/supernova/whokie/groupmember/service/GroupMemberService.java index 5501c562..bac77300 100644 --- a/src/main/java/supernova/whokie/groupmember/service/GroupMemberService.java +++ b/src/main/java/supernova/whokie/groupmember/service/GroupMemberService.java @@ -18,6 +18,8 @@ import supernova.whokie.user.Users; import supernova.whokie.user.service.UserReaderService; +import java.util.List; + @Service @RequiredArgsConstructor public class GroupMemberService { @@ -72,9 +74,9 @@ public void joinGroup(GroupMemberCommand.Join command, Long userId) { @Transactional(readOnly = true) - public Page getGroupMembers(Pageable pageable, Long userId, - Long groupId) { - Page groupMembers = groupMemberReaderService.getGroupMembers(pageable, userId, + public Page getGroupMemberPaging(Pageable pageable, Long userId, + Long groupId) { + Page groupMembers = groupMemberReaderService.getGroupMemberPaging(pageable, userId, groupId); return groupMembers.map(entity -> { String imageUrl = entity.getUser().getImageUrl(); @@ -85,6 +87,19 @@ public Page getGroupMembers(Pageable pageable, Long use }); } + @Transactional(readOnly = true) + public List getGroupMemberList(Long userId, Long groupId) { + List groupMembers = groupMemberReaderService.getGroupMembersList(userId, groupId); + + return groupMembers.stream().map(entity -> { + String imageUrl = entity.getUser().getImageUrl(); + if (entity.getUser().isImageUrlStoredInS3()) { + imageUrl = s3Service.getSignedUrl(imageUrl); + } + return GroupMemberModel.Member.from(entity, imageUrl); + }).toList(); + } + @Transactional public void expelMember(Long userId, GroupMemberCommand.Expel command) { GroupMember leader = groupMemberReaderService.getByUserIdAndGroupId(userId, diff --git a/src/main/java/supernova/whokie/question/controller/QuestionController.java b/src/main/java/supernova/whokie/question/controller/QuestionController.java index 436e48b8..071a4bc9 100644 --- a/src/main/java/supernova/whokie/question/controller/QuestionController.java +++ b/src/main/java/supernova/whokie/question/controller/QuestionController.java @@ -37,11 +37,11 @@ public class QuestionController { @GetMapping("/group/{group-id}/question/random") public QuestionResponse.GroupQuestions getGroupQuestionList( + @PageableDefault(page = 0, size = 5) Pageable pageable, @PathVariable("group-id") @NotNull @Min(1) Long groupId, @Authenticate Long userId ) { - List groupQuestions = questionService.getGroupQuestions(userId, - groupId); + List groupQuestions = questionService.getGroupQuestions(userId, groupId, pageable); return QuestionResponse.GroupQuestions.from(groupQuestions); } diff --git a/src/main/java/supernova/whokie/question/service/QuestionService.java b/src/main/java/supernova/whokie/question/service/QuestionService.java index 5c5f7195..f5734413 100644 --- a/src/main/java/supernova/whokie/question/service/QuestionService.java +++ b/src/main/java/supernova/whokie/question/service/QuestionService.java @@ -2,7 +2,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,7 +11,6 @@ import supernova.whokie.groupmember.service.GroupMemberReaderService; import supernova.whokie.question.Question; import supernova.whokie.question.QuestionStatus; -import supernova.whokie.question.constants.QuestionConstants; import supernova.whokie.question.service.dto.QuestionCommand; import supernova.whokie.question.service.dto.QuestionModel; @@ -50,15 +48,13 @@ public Page getGroupQuestionPaging(Long userId, Long groupId } @Transactional(readOnly = true) - public List getGroupQuestions(Long userId, Long groupId) { + public List getGroupQuestions(Long userId, Long groupId, Pageable pageable) { if (!groupMemberReaderService.isGroupMemberExist(userId, groupId)) { throw new EntityNotFoundException(MessageConstants.GROUP_MEMBER_NOT_FOUND_MESSAGE); } - Pageable pageable = PageRequest.of(0, QuestionConstants.QUESTION_LIMIT); - List randomQuestions = questionReaderService.getRandomGroupQuestions(groupId, - pageable); + List randomQuestions = questionReaderService.getRandomGroupQuestions(groupId, pageable); return randomQuestions.stream() .map(QuestionModel.GroupQuestion::from) diff --git a/src/test/java/supernova/whokie/answer/AnswerIntegrationTest.java b/src/test/java/supernova/whokie/answer/AnswerIntegrationTest.java index a82ac0ff..a0b7c4c4 100644 --- a/src/test/java/supernova/whokie/answer/AnswerIntegrationTest.java +++ b/src/test/java/supernova/whokie/answer/AnswerIntegrationTest.java @@ -245,6 +245,7 @@ void answerToGroupQuestionTest() throws Exception { @DisplayName("해당 월에 질문이 있는 날짜 반환 테스트") void getAnswerRecordDaysTest() throws Exception { LocalDate date = LocalDate.of(2024, 11, 1); // 해당 월 전체 조회 + int todayDay = LocalDate.now().getDayOfMonth(); mockMvc.perform(get("/api/answer/record/days") .param("date", date.toString()) @@ -252,7 +253,7 @@ void getAnswerRecordDaysTest() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.days").isArray()) - .andExpect(jsonPath("$.days").value(org.hamcrest.Matchers.containsInAnyOrder(8))); + .andExpect(jsonPath("$.days").value(org.hamcrest.Matchers.containsInAnyOrder(todayDay))); } diff --git a/src/test/java/supernova/whokie/groupmember/service/GroupMemberServiceTest.java b/src/test/java/supernova/whokie/groupmember/service/GroupMemberServiceTest.java index 71f3da14..df0d567f 100644 --- a/src/test/java/supernova/whokie/groupmember/service/GroupMemberServiceTest.java +++ b/src/test/java/supernova/whokie/groupmember/service/GroupMemberServiceTest.java @@ -109,7 +109,7 @@ void expelMember() { @Test @DisplayName("그룹 내 멤버 조회") - void getGroupMembers() throws Exception { + void getGroupMemberPaging() throws Exception { // given Field createdAtField = BaseTimeEntity.class.getDeclaredField("createdAt"); createdAtField.setAccessible(true); @@ -117,11 +117,11 @@ void getGroupMembers() throws Exception { createdAtField.set(member, LocalDateTime.now()); Pageable pageable = PageRequest.of(0, 10, Sort.by("createdAt").ascending()); Page page = new PageImpl<>(List.of(leader, member)); - given(groupMemberReaderService.getGroupMembers(pageable, userId, groupId)) + given(groupMemberReaderService.getGroupMemberPaging(pageable, userId, groupId)) .willReturn(page); // when - Page members = groupMemberService.getGroupMembers(pageable, userId, + Page members = groupMemberService.getGroupMemberPaging(pageable, userId, groupId); // then diff --git a/src/test/java/supernova/whokie/question/QuestionIntegrationTest.java b/src/test/java/supernova/whokie/question/QuestionIntegrationTest.java index e66300b2..db214b41 100644 --- a/src/test/java/supernova/whokie/question/QuestionIntegrationTest.java +++ b/src/test/java/supernova/whokie/question/QuestionIntegrationTest.java @@ -123,7 +123,7 @@ void getGroupQuestionTest() throws Exception { .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.questions").isArray()) - .andExpect(jsonPath("$.questions.length()").value(10)) + .andExpect(jsonPath("$.questions.length()").value(5)) .andDo(result -> { String responseContent = result.getResponse().getContentAsString(); System.out.println("questions 내용: " + responseContent); diff --git a/src/test/java/supernova/whokie/question/service/QuestionServiceTest.java b/src/test/java/supernova/whokie/question/service/QuestionServiceTest.java index ad620efd..83731737 100644 --- a/src/test/java/supernova/whokie/question/service/QuestionServiceTest.java +++ b/src/test/java/supernova/whokie/question/service/QuestionServiceTest.java @@ -18,7 +18,6 @@ import supernova.whokie.question.Question; import supernova.whokie.question.QuestionStatus; import supernova.whokie.question.constants.QuestionConstants; -import supernova.whokie.question.controller.dto.QuestionResponse; import supernova.whokie.question.service.dto.QuestionCommand; import supernova.whokie.question.service.dto.QuestionModel; import supernova.whokie.user.Gender; @@ -93,30 +92,6 @@ void getCommonQuestionTest() { ); } - @Test - @DisplayName("랜덤 그룹 질문 조회 테스트") - void getGroupQuestionTest() { - // given - Long userId = 1L; - Long groupId = 1L; - - // when - when(groupMemberReaderService.isGroupMemberExist(eq(userId), eq(groupId))) - .thenReturn(true); - when(questionReaderService.getRandomGroupQuestions(eq(groupId), any(Pageable.class))) - .thenReturn(questions); - - List groupQuestionList = questionService.getGroupQuestions( - userId, groupId); - QuestionResponse.GroupQuestions groupQuestions = QuestionResponse.GroupQuestions.from( - groupQuestionList); - - // then - assertAll( - () -> assertEquals(10, groupQuestions.questions().size()) - ); - } - @Test @DisplayName("그룹 질문 생성 테스트") void createQuestionTest() {