diff --git a/src/main/java/com/dnd/gongmuin/credit_history/CreditHistory.java b/src/main/java/com/dnd/gongmuin/credit_history/domain/CreditHistory.java similarity index 96% rename from src/main/java/com/dnd/gongmuin/credit_history/CreditHistory.java rename to src/main/java/com/dnd/gongmuin/credit_history/domain/CreditHistory.java index 7507d326..8e8795d9 100644 --- a/src/main/java/com/dnd/gongmuin/credit_history/CreditHistory.java +++ b/src/main/java/com/dnd/gongmuin/credit_history/domain/CreditHistory.java @@ -1,4 +1,4 @@ -package com.dnd.gongmuin.credit_history; +package com.dnd.gongmuin.credit_history.domain; import static jakarta.persistence.FetchType.*; diff --git a/src/main/java/com/dnd/gongmuin/credit_history/CreditType.java b/src/main/java/com/dnd/gongmuin/credit_history/domain/CreditType.java similarity index 65% rename from src/main/java/com/dnd/gongmuin/credit_history/CreditType.java rename to src/main/java/com/dnd/gongmuin/credit_history/domain/CreditType.java index fc8fc959..11d8c5f0 100644 --- a/src/main/java/com/dnd/gongmuin/credit_history/CreditType.java +++ b/src/main/java/com/dnd/gongmuin/credit_history/domain/CreditType.java @@ -1,4 +1,4 @@ -package com.dnd.gongmuin.credit_history; +package com.dnd.gongmuin.credit_history.domain; import java.util.Arrays; @@ -27,4 +27,15 @@ public static CreditType of(String input) { private boolean isEqual(String input) { return input.equals(this.label); } + + public static CreditType fromDetail(String detail) { + return Arrays.stream(values()) + .filter(type -> type.isDetailEqual(detail)) + .findAny() + .orElseThrow(IllegalArgumentException::new); + } + + private boolean isDetailEqual(String input) { + return input.equals(this.detail); + } } diff --git a/src/main/java/com/dnd/gongmuin/credit_history/dto/CreditHistoryMapper.java b/src/main/java/com/dnd/gongmuin/credit_history/dto/CreditHistoryMapper.java index 46e78927..609c3cfc 100644 --- a/src/main/java/com/dnd/gongmuin/credit_history/dto/CreditHistoryMapper.java +++ b/src/main/java/com/dnd/gongmuin/credit_history/dto/CreditHistoryMapper.java @@ -1,7 +1,7 @@ package com.dnd.gongmuin.credit_history.dto; -import com.dnd.gongmuin.credit_history.CreditHistory; -import com.dnd.gongmuin.credit_history.CreditType; +import com.dnd.gongmuin.credit_history.domain.CreditHistory; +import com.dnd.gongmuin.credit_history.domain.CreditType; import com.dnd.gongmuin.member.domain.Member; import lombok.AccessLevel; diff --git a/src/main/java/com/dnd/gongmuin/credit_history/repository/CreditHistoryRepository.java b/src/main/java/com/dnd/gongmuin/credit_history/repository/CreditHistoryRepository.java index cb0f194d..644e32cd 100644 --- a/src/main/java/com/dnd/gongmuin/credit_history/repository/CreditHistoryRepository.java +++ b/src/main/java/com/dnd/gongmuin/credit_history/repository/CreditHistoryRepository.java @@ -2,7 +2,7 @@ import org.springframework.data.jpa.repository.JpaRepository; -import com.dnd.gongmuin.credit_history.CreditHistory; +import com.dnd.gongmuin.credit_history.domain.CreditHistory; public interface CreditHistoryRepository extends JpaRepository { } diff --git a/src/main/java/com/dnd/gongmuin/credit_history/service/CreditHistoryService.java b/src/main/java/com/dnd/gongmuin/credit_history/service/CreditHistoryService.java index e3601ba0..815fcf65 100644 --- a/src/main/java/com/dnd/gongmuin/credit_history/service/CreditHistoryService.java +++ b/src/main/java/com/dnd/gongmuin/credit_history/service/CreditHistoryService.java @@ -6,7 +6,7 @@ import org.springframework.transaction.annotation.Transactional; import com.dnd.gongmuin.answer.domain.Answer; -import com.dnd.gongmuin.credit_history.CreditType; +import com.dnd.gongmuin.credit_history.domain.CreditType; import com.dnd.gongmuin.credit_history.dto.CreditHistoryMapper; import com.dnd.gongmuin.credit_history.repository.CreditHistoryRepository; import com.dnd.gongmuin.question_post.domain.QuestionPost; diff --git a/src/main/java/com/dnd/gongmuin/member/controller/MemberController.java b/src/main/java/com/dnd/gongmuin/member/controller/MemberController.java index 84baffef..f916ba4a 100644 --- a/src/main/java/com/dnd/gongmuin/member/controller/MemberController.java +++ b/src/main/java/com/dnd/gongmuin/member/controller/MemberController.java @@ -7,15 +7,17 @@ import org.springframework.web.bind.annotation.PatchMapping; 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.dnd.gongmuin.common.dto.PageResponse; import com.dnd.gongmuin.member.domain.Member; import com.dnd.gongmuin.member.dto.request.UpdateMemberProfileRequest; -import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsByMemberResponse; -import com.dnd.gongmuin.member.dto.response.BookmarksByMemberResponse; +import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsResponse; +import com.dnd.gongmuin.member.dto.response.BookmarksResponse; +import com.dnd.gongmuin.member.dto.response.CreditHistoryResponse; import com.dnd.gongmuin.member.dto.response.MemberProfileResponse; -import com.dnd.gongmuin.member.dto.response.QuestionPostsByMemberResponse; +import com.dnd.gongmuin.member.dto.response.QuestionPostsResponse; import com.dnd.gongmuin.member.service.MemberService; import io.swagger.v3.oas.annotations.Operation; @@ -54,10 +56,10 @@ public ResponseEntity updateMemberProfile( @Operation(summary = "작성한 질문 전체 조회 API", description = "작성한 질문을 전체 조회한다.") @ApiResponse(useReturnTypeSchema = true) @GetMapping("/question-posts") - public ResponseEntity> getQuestionPostsByMember( + public ResponseEntity> getQuestionPostsByMember( @AuthenticationPrincipal Member member, Pageable pageable) { - PageResponse response = + PageResponse response = memberService.getQuestionPostsByMember(member, pageable); return ResponseEntity.ok(response); @@ -66,10 +68,10 @@ public ResponseEntity> getQuestionPo @Operation(summary = "댓글 단 질문 전체 조회 API", description = "댓글 단 질문을 전체 조회한다.") @ApiResponse(useReturnTypeSchema = true) @GetMapping("/question-posts/answers") - public ResponseEntity> getAnsweredQuestionPostsByMember( + public ResponseEntity> getAnsweredQuestionPostsByMember( @AuthenticationPrincipal Member member, Pageable pageable) { - PageResponse response = + PageResponse response = memberService.getAnsweredQuestionPostsByMember(member, pageable); return ResponseEntity.ok(response); @@ -78,13 +80,26 @@ public ResponseEntity> getAn @Operation(summary = "스크랩 질문 전체 조회 API", description = "스크랩한 질문을 전체 조회한다.") @ApiResponse(useReturnTypeSchema = true) @GetMapping("/question-posts/bookmarks") - public ResponseEntity> getBookmarksByMember( + public ResponseEntity> getBookmarksByMember( @AuthenticationPrincipal Member member, Pageable pageable) { - PageResponse response = + PageResponse response = memberService.getBookmarksByMember(member, pageable); return ResponseEntity.ok(response); } + @Operation(summary = "크레딧 목록 전체 조회 API", description = "타입에 맞는 크레딧 목록을 전체 조회한다.") + @ApiResponse(useReturnTypeSchema = true) + @GetMapping("/credit/histories") + public ResponseEntity> getCreditHistoryByMember( + @RequestParam("type") String type, + @AuthenticationPrincipal Member member, + Pageable pageable) { + PageResponse response = + memberService.getCreditHistoryByMember(type, member, pageable); + + return ResponseEntity.ok(response); + } + } diff --git a/src/main/java/com/dnd/gongmuin/member/domain/Member.java b/src/main/java/com/dnd/gongmuin/member/domain/Member.java index 1eb57471..99483057 100644 --- a/src/main/java/com/dnd/gongmuin/member/domain/Member.java +++ b/src/main/java/com/dnd/gongmuin/member/domain/Member.java @@ -24,8 +24,6 @@ @NoArgsConstructor(access = PROTECTED) public class Member extends TimeBaseEntity { - @Column(name = "profile_image_no", nullable = false) - private final int profileImageNo = setRandomNumber(); @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "member_id") @@ -48,6 +46,8 @@ public class Member extends TimeBaseEntity { private int credit; @Column(name = "role", nullable = false) private String role; + @Column(name = "profile_image_no", nullable = false) + private final int profileImageNo = setRandomNumber(); @Builder(access = PRIVATE) private Member(String nickname, String socialName, JobGroup jobGroup, JobCategory jobCategory, String socialEmail, diff --git a/src/main/java/com/dnd/gongmuin/member/dto/response/AnsweredQuestionPostsByMemberResponse.java b/src/main/java/com/dnd/gongmuin/member/dto/response/AnsweredQuestionPostsResponse.java similarity index 73% rename from src/main/java/com/dnd/gongmuin/member/dto/response/AnsweredQuestionPostsByMemberResponse.java rename to src/main/java/com/dnd/gongmuin/member/dto/response/AnsweredQuestionPostsResponse.java index 436cbac4..75122460 100644 --- a/src/main/java/com/dnd/gongmuin/member/dto/response/AnsweredQuestionPostsByMemberResponse.java +++ b/src/main/java/com/dnd/gongmuin/member/dto/response/AnsweredQuestionPostsResponse.java @@ -4,26 +4,26 @@ import com.dnd.gongmuin.question_post.domain.QuestionPost; import com.querydsl.core.annotations.QueryProjection; -public record AnsweredQuestionPostsByMemberResponse( +public record AnsweredQuestionPostsResponse( Long questionPostId, - String title, - String content, + String questionTitle, + String questionContent, String jobGroup, int reward, String questionPostCreatedAt, boolean isChosen, - int savedTotalCount, - int recommendTotalCount, + int bookmarkCount, + int recommendCount, Long answerId, String answerContent, String answerCreatedAt ) { @QueryProjection - public AnsweredQuestionPostsByMemberResponse( + public AnsweredQuestionPostsResponse( QuestionPost questionPost, - int savedTotalCount, - int recommendTotalCount, + int bookmarkCount, + int recommendCount, Answer answer) { this( questionPost.getId(), @@ -33,8 +33,8 @@ public AnsweredQuestionPostsByMemberResponse( questionPost.getReward(), questionPost.getCreatedAt().toString(), questionPost.getIsChosen(), - savedTotalCount, - recommendTotalCount, + bookmarkCount, + recommendCount, answer.getId(), answer.getContent(), answer.getCreatedAt().toString() diff --git a/src/main/java/com/dnd/gongmuin/member/dto/response/BookmarksByMemberResponse.java b/src/main/java/com/dnd/gongmuin/member/dto/response/BookmarksResponse.java similarity index 69% rename from src/main/java/com/dnd/gongmuin/member/dto/response/BookmarksByMemberResponse.java rename to src/main/java/com/dnd/gongmuin/member/dto/response/BookmarksResponse.java index f1efb4a9..19337f8c 100644 --- a/src/main/java/com/dnd/gongmuin/member/dto/response/BookmarksByMemberResponse.java +++ b/src/main/java/com/dnd/gongmuin/member/dto/response/BookmarksResponse.java @@ -3,22 +3,22 @@ import com.dnd.gongmuin.question_post.domain.QuestionPost; import com.querydsl.core.annotations.QueryProjection; -public record BookmarksByMemberResponse( +public record BookmarksResponse( Long questionPostId, - String title, - String content, + String questionTitle, + String questionContent, String jobGroup, int reward, String createdAt, boolean isChosen, - int savedTotalCount, - int recommendTotalCount + int bookmarkCount, + int recommendCount ) { @QueryProjection - public BookmarksByMemberResponse( + public BookmarksResponse( QuestionPost questionPost, - int savedTotalCount, - int recommendTotalCount + int bookmarkCount, + int recommendCount ) { this( questionPost.getId(), @@ -28,8 +28,8 @@ public BookmarksByMemberResponse( questionPost.getReward(), questionPost.getCreatedAt().toString(), questionPost.getIsChosen(), - savedTotalCount, - recommendTotalCount + bookmarkCount, + recommendCount ); } } diff --git a/src/main/java/com/dnd/gongmuin/member/dto/response/CreditHistoryResponse.java b/src/main/java/com/dnd/gongmuin/member/dto/response/CreditHistoryResponse.java new file mode 100644 index 00000000..f999aecd --- /dev/null +++ b/src/main/java/com/dnd/gongmuin/member/dto/response/CreditHistoryResponse.java @@ -0,0 +1,21 @@ +package com.dnd.gongmuin.member.dto.response; + +import com.dnd.gongmuin.credit_history.domain.CreditHistory; +import com.querydsl.core.annotations.QueryProjection; + +public record CreditHistoryResponse( + Long id, + String type, + String detail, + int amount +) { + @QueryProjection + public CreditHistoryResponse(CreditHistory creditHistory) { + this( + creditHistory.getId(), + creditHistory.getType().getLabel(), + creditHistory.getDetail(), + creditHistory.getAmount() + ); + } +} diff --git a/src/main/java/com/dnd/gongmuin/member/dto/response/QuestionPostsByMemberResponse.java b/src/main/java/com/dnd/gongmuin/member/dto/response/QuestionPostsResponse.java similarity index 68% rename from src/main/java/com/dnd/gongmuin/member/dto/response/QuestionPostsByMemberResponse.java rename to src/main/java/com/dnd/gongmuin/member/dto/response/QuestionPostsResponse.java index c2b7bb71..bb75d35c 100644 --- a/src/main/java/com/dnd/gongmuin/member/dto/response/QuestionPostsByMemberResponse.java +++ b/src/main/java/com/dnd/gongmuin/member/dto/response/QuestionPostsResponse.java @@ -3,23 +3,23 @@ import com.dnd.gongmuin.question_post.domain.QuestionPost; import com.querydsl.core.annotations.QueryProjection; -public record QuestionPostsByMemberResponse( +public record QuestionPostsResponse( Long questionPostId, - String title, - String content, + String questionTitle, + String questionContent, String jobGroup, int reward, String createdAt, boolean isChosen, - int savedTotalCount, - int recommendTotalCount + int bookmarkCount, + int recommendCount ) { @QueryProjection - public QuestionPostsByMemberResponse( + public QuestionPostsResponse( QuestionPost questionPost, - int savedTotalCount, - int recommendTotalCount + int bookmarkCount, + int recommendCount ) { this( questionPost.getId(), @@ -29,8 +29,8 @@ public QuestionPostsByMemberResponse( questionPost.getReward(), questionPost.getCreatedAt().toString(), questionPost.getIsChosen(), - savedTotalCount, - recommendTotalCount + bookmarkCount, + recommendCount ); } } diff --git a/src/main/java/com/dnd/gongmuin/member/repository/MemberCustom.java b/src/main/java/com/dnd/gongmuin/member/repository/MemberCustom.java index 50343bca..6ee8af30 100644 --- a/src/main/java/com/dnd/gongmuin/member/repository/MemberCustom.java +++ b/src/main/java/com/dnd/gongmuin/member/repository/MemberCustom.java @@ -4,14 +4,17 @@ import org.springframework.data.domain.Slice; import com.dnd.gongmuin.member.domain.Member; -import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsByMemberResponse; -import com.dnd.gongmuin.member.dto.response.BookmarksByMemberResponse; -import com.dnd.gongmuin.member.dto.response.QuestionPostsByMemberResponse; +import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsResponse; +import com.dnd.gongmuin.member.dto.response.BookmarksResponse; +import com.dnd.gongmuin.member.dto.response.CreditHistoryResponse; +import com.dnd.gongmuin.member.dto.response.QuestionPostsResponse; public interface MemberCustom { - Slice getQuestionPostsByMember(Member member, Pageable pageable); + Slice getQuestionPostsByMember(Member member, Pageable pageable); - Slice getAnsweredQuestionPostsByMember(Member member, Pageable pageable); + Slice getAnsweredQuestionPostsByMember(Member member, Pageable pageable); - Slice getBookmarksByMember(Member member, Pageable pageable); + Slice getBookmarksByMember(Member member, Pageable pageable); + + Slice getCreditHistoryByMember(String type, Member member, Pageable pageable); } diff --git a/src/main/java/com/dnd/gongmuin/member/repository/MemberCustomImpl.java b/src/main/java/com/dnd/gongmuin/member/repository/MemberCustomImpl.java index 67b81666..fd63d282 100644 --- a/src/main/java/com/dnd/gongmuin/member/repository/MemberCustomImpl.java +++ b/src/main/java/com/dnd/gongmuin/member/repository/MemberCustomImpl.java @@ -1,5 +1,7 @@ package com.dnd.gongmuin.member.repository; +import static com.dnd.gongmuin.credit_history.domain.QCreditHistory.*; + import java.util.List; import org.springframework.data.domain.Pageable; @@ -7,17 +9,21 @@ import org.springframework.data.domain.SliceImpl; import com.dnd.gongmuin.answer.domain.QAnswer; +import com.dnd.gongmuin.credit_history.domain.CreditType; import com.dnd.gongmuin.member.domain.Member; -import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsByMemberResponse; -import com.dnd.gongmuin.member.dto.response.BookmarksByMemberResponse; -import com.dnd.gongmuin.member.dto.response.QAnsweredQuestionPostsByMemberResponse; -import com.dnd.gongmuin.member.dto.response.QBookmarksByMemberResponse; -import com.dnd.gongmuin.member.dto.response.QQuestionPostsByMemberResponse; -import com.dnd.gongmuin.member.dto.response.QuestionPostsByMemberResponse; +import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsResponse; +import com.dnd.gongmuin.member.dto.response.BookmarksResponse; +import com.dnd.gongmuin.member.dto.response.CreditHistoryResponse; +import com.dnd.gongmuin.member.dto.response.QAnsweredQuestionPostsResponse; +import com.dnd.gongmuin.member.dto.response.QBookmarksResponse; +import com.dnd.gongmuin.member.dto.response.QCreditHistoryResponse; +import com.dnd.gongmuin.member.dto.response.QQuestionPostsResponse; +import com.dnd.gongmuin.member.dto.response.QuestionPostsResponse; import com.dnd.gongmuin.post_interaction.domain.InteractionType; import com.dnd.gongmuin.post_interaction.domain.QInteraction; import com.dnd.gongmuin.post_interaction.domain.QInteractionCount; import com.dnd.gongmuin.question_post.domain.QQuestionPost; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -29,13 +35,13 @@ public class MemberCustomImpl implements MemberCustom { private final JPAQueryFactory queryFactory; @Override - public Slice getQuestionPostsByMember(Member member, Pageable pageable) { + public Slice getQuestionPostsByMember(Member member, Pageable pageable) { QQuestionPost qp = QQuestionPost.questionPost; QInteractionCount saved = new QInteractionCount("SAVED"); QInteractionCount recommend = new QInteractionCount("RECOMMEND"); - List content = queryFactory - .select(new QQuestionPostsByMemberResponse( + List content = queryFactory + .select(new QQuestionPostsResponse( qp, saved.count.coalesce(0).as("savedTotalCount"), recommend.count.coalesce(0).as("recommendTotalCount") @@ -57,7 +63,7 @@ public Slice getQuestionPostsByMember(Member memb } @Override - public Slice getAnsweredQuestionPostsByMember( + public Slice getAnsweredQuestionPostsByMember( Member member, Pageable pageable) { QQuestionPost qp = QQuestionPost.questionPost; QInteractionCount saved = new QInteractionCount("SAVED"); @@ -65,9 +71,9 @@ public Slice getAnsweredQuestionPostsByMe QAnswer aw1 = new QAnswer("answer1"); QAnswer aw2 = new QAnswer("answer2"); - List content = + List content = queryFactory - .select(new QAnsweredQuestionPostsByMemberResponse( + .select(new QAnsweredQuestionPostsResponse( qp, saved.count.coalesce(0).as("savedTotalCount"), recommend.count.coalesce(0).as("recommendTotalCount"), @@ -104,14 +110,14 @@ public Slice getAnsweredQuestionPostsByMe } @Override - public Slice getBookmarksByMember(Member member, Pageable pageable) { + public Slice getBookmarksByMember(Member member, Pageable pageable) { QQuestionPost qp = QQuestionPost.questionPost; QInteraction ir = QInteraction.interaction; QInteractionCount saved = new QInteractionCount("SAVED"); QInteractionCount recommend = new QInteractionCount("RECOMMEND"); - List content = queryFactory - .select(new QBookmarksByMemberResponse( + List content = queryFactory + .select(new QBookmarksResponse( qp, saved.count.coalesce(0).as("savedTotalCount"), recommend.count.coalesce(0).as("recommendTotalCount") @@ -134,6 +140,36 @@ public Slice getBookmarksByMember(Member member, Page return new SliceImpl<>(content, pageable, hasNext); } + @Override + public Slice getCreditHistoryByMember(String type, Member member, + Pageable pageable) { + List content = queryFactory + .select(new QCreditHistoryResponse( + creditHistory + )) + .from(creditHistory) + .where( + creditHistory.member.eq(member), + creditTypeEq(type) + ) + .orderBy(creditHistory.createdAt.desc()) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize() + 1L) + .fetch(); + + boolean hasNext = hasNext(pageable.getPageSize(), content); + + return new SliceImpl<>(content, pageable, hasNext); + } + + private BooleanExpression creditTypeEq(String type) { + if (type == null || type.isEmpty() || "전체".equals(type)) { + return null; + } + + return creditHistory.type.in(CreditType.fromDetail(type)); + } + private boolean hasNext(int pageSize, List content) { if (content.size() <= pageSize) { return false; diff --git a/src/main/java/com/dnd/gongmuin/member/service/MemberService.java b/src/main/java/com/dnd/gongmuin/member/service/MemberService.java index 18ddf61f..9424ca47 100644 --- a/src/main/java/com/dnd/gongmuin/member/service/MemberService.java +++ b/src/main/java/com/dnd/gongmuin/member/service/MemberService.java @@ -15,10 +15,11 @@ import com.dnd.gongmuin.member.domain.Member; import com.dnd.gongmuin.member.dto.MemberMapper; import com.dnd.gongmuin.member.dto.request.UpdateMemberProfileRequest; -import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsByMemberResponse; -import com.dnd.gongmuin.member.dto.response.BookmarksByMemberResponse; +import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsResponse; +import com.dnd.gongmuin.member.dto.response.BookmarksResponse; +import com.dnd.gongmuin.member.dto.response.CreditHistoryResponse; import com.dnd.gongmuin.member.dto.response.MemberProfileResponse; -import com.dnd.gongmuin.member.dto.response.QuestionPostsByMemberResponse; +import com.dnd.gongmuin.member.dto.response.QuestionPostsResponse; import com.dnd.gongmuin.member.exception.MemberErrorCode; import com.dnd.gongmuin.member.repository.MemberRepository; import com.dnd.gongmuin.security.oauth2.Oauth2Response; @@ -90,10 +91,10 @@ public MemberProfileResponse updateMemberProfile(UpdateMemberProfileRequest requ } } - public PageResponse getQuestionPostsByMember( + public PageResponse getQuestionPostsByMember( Member member, Pageable pageable) { try { - Slice responsePage = + Slice responsePage = memberRepository.getQuestionPostsByMember(member, pageable); return PageMapper.toPageResponse(responsePage); @@ -102,10 +103,10 @@ public PageResponse getQuestionPostsByMember( } } - public PageResponse getAnsweredQuestionPostsByMember( + public PageResponse getAnsweredQuestionPostsByMember( Member member, Pageable pageable) { try { - Slice responsePage = + Slice responsePage = memberRepository.getAnsweredQuestionPostsByMember(member, pageable); return PageMapper.toPageResponse(responsePage); @@ -114,10 +115,10 @@ public PageResponse getAnsweredQuestionPo } } - public PageResponse getBookmarksByMember( + public PageResponse getBookmarksByMember( Member member, Pageable pageable) { try { - Slice responsePage = + Slice responsePage = memberRepository.getBookmarksByMember(member, pageable); return PageMapper.toPageResponse(responsePage); @@ -125,4 +126,17 @@ public PageResponse getBookmarksByMember( throw new NotFoundException(MemberErrorCode.QUESTION_POSTS_BY_MEMBER_FAILED); } } + + public PageResponse getCreditHistoryByMember(String type, Member member, + Pageable pageable) { + try { + Slice responsePage = + memberRepository.getCreditHistoryByMember(type, member, pageable); + + return PageMapper.toPageResponse(responsePage); + } catch (Exception e) { + throw new NotFoundException(MemberErrorCode.QUESTION_POSTS_BY_MEMBER_FAILED); + } + + } } \ No newline at end of file diff --git a/src/test/java/com/dnd/gongmuin/credit_history/fixture/CreditHistoryFixture.java b/src/test/java/com/dnd/gongmuin/credit_history/fixture/CreditHistoryFixture.java index dbae2307..60e39971 100644 --- a/src/test/java/com/dnd/gongmuin/credit_history/fixture/CreditHistoryFixture.java +++ b/src/test/java/com/dnd/gongmuin/credit_history/fixture/CreditHistoryFixture.java @@ -1,7 +1,7 @@ package com.dnd.gongmuin.credit_history.fixture; -import com.dnd.gongmuin.credit_history.CreditHistory; -import com.dnd.gongmuin.credit_history.CreditType; +import com.dnd.gongmuin.credit_history.domain.CreditHistory; +import com.dnd.gongmuin.credit_history.domain.CreditType; import com.dnd.gongmuin.member.domain.Member; import lombok.AccessLevel; diff --git a/src/test/java/com/dnd/gongmuin/credit_history/service/CreditHistoryServiceTest.java b/src/test/java/com/dnd/gongmuin/credit_history/service/CreditHistoryServiceTest.java index af74c85f..45fc899e 100644 --- a/src/test/java/com/dnd/gongmuin/credit_history/service/CreditHistoryServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/credit_history/service/CreditHistoryServiceTest.java @@ -15,8 +15,8 @@ import com.dnd.gongmuin.common.fixture.AnswerFixture; import com.dnd.gongmuin.common.fixture.MemberFixture; import com.dnd.gongmuin.common.fixture.QuestionPostFixture; -import com.dnd.gongmuin.credit_history.CreditHistory; -import com.dnd.gongmuin.credit_history.CreditType; +import com.dnd.gongmuin.credit_history.domain.CreditHistory; +import com.dnd.gongmuin.credit_history.domain.CreditType; import com.dnd.gongmuin.credit_history.fixture.CreditHistoryFixture; import com.dnd.gongmuin.credit_history.repository.CreditHistoryRepository; import com.dnd.gongmuin.question_post.domain.QuestionPost; diff --git a/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java b/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java index 78820fe9..9f1a66d9 100644 --- a/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/member/controller/MemberControllerTest.java @@ -21,6 +21,10 @@ import com.dnd.gongmuin.common.fixture.MemberFixture; import com.dnd.gongmuin.common.fixture.QuestionPostFixture; import com.dnd.gongmuin.common.support.ApiTestSupport; +import com.dnd.gongmuin.credit_history.domain.CreditHistory; +import com.dnd.gongmuin.credit_history.domain.CreditType; +import com.dnd.gongmuin.credit_history.fixture.CreditHistoryFixture; +import com.dnd.gongmuin.credit_history.repository.CreditHistoryRepository; import com.dnd.gongmuin.member.domain.Member; import com.dnd.gongmuin.member.dto.request.UpdateMemberProfileRequest; import com.dnd.gongmuin.member.repository.MemberRepository; @@ -50,8 +54,12 @@ class MemberControllerTest extends ApiTestSupport { @Autowired InteractionRepository interactionRepository; + @Autowired + CreditHistoryRepository creditHistoryRepository; + @AfterEach void tearDown() { + creditHistoryRepository.deleteAll(); answerRepository.deleteAll(); memberRepository.deleteAll(); questionPostRepository.deleteAll(); @@ -131,11 +139,11 @@ void getQuestionPostsByMember() throws Exception { .andDo(MockMvcResultHandlers.print()) .andExpect(jsonPath("$.size").value(2)) .andExpect(jsonPath("$.content[0].questionPostId").value(questionPost3.getId())) - .andExpect(jsonPath("$.content[0].savedTotalCount").value(30)) - .andExpect(jsonPath("$.content[0].recommendTotalCount").value(40)) + .andExpect(jsonPath("$.content[0].bookmarkCount").value(30)) + .andExpect(jsonPath("$.content[0].recommendCount").value(40)) .andExpect(jsonPath("$.content[1].questionPostId").value(questionPost1.getId())) - .andExpect(jsonPath("$.content[1].savedTotalCount").value(10)) - .andExpect(jsonPath("$.content[1].recommendTotalCount").value(20)); + .andExpect(jsonPath("$.content[1].bookmarkCount").value(10)) + .andExpect(jsonPath("$.content[1].recommendCount").value(20)); } @DisplayName("로그인 된 회원이 댓글 단 질문을 전체 조회한다.") @@ -201,4 +209,125 @@ void getBookmarksByMember() throws Exception { .andExpect(jsonPath("$.content[0].questionPostId").value(questionPost3.getId())) .andExpect(jsonPath("$.content[1].questionPostId").value(questionPost1.getId())); } + + @DisplayName("회원의 전체 크레딧 내역을 조회한다.") + @Test + void getCreditHistoryByMember() throws Exception { + // given + Member member2 = MemberFixture.member2(); + memberRepository.save(member2); + + QuestionPost questionPost1 = QuestionPostFixture.questionPost(loginMember); + QuestionPost questionPost2 = QuestionPostFixture.questionPost(member2); + questionPostRepository.saveAll(List.of(questionPost1, questionPost2)); + + Answer answer1 = AnswerFixture.answer(questionPost1.getId(), member2); + Answer answer2 = AnswerFixture.answer(questionPost2.getId(), loginMember); + answerRepository.saveAll(List.of(answer1, answer2)); + + CreditHistory ch1 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost1.getMember()); + CreditHistory ch2 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer1.getMember()); + CreditHistory ch3 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost2.getMember()); + CreditHistory ch4 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer2.getMember()); + creditHistoryRepository.saveAll(List.of(ch1, ch2, ch3, ch4)); + + // when // then + mockMvc.perform(get("/api/members/credit/histories") + .param("type", "전체") + .cookie(accessToken) + ) + .andExpect(status().isOk()) + .andDo(MockMvcResultHandlers.print()) + .andExpect(jsonPath("$.size").value(2)) + .andExpect(jsonPath("$.content[0].id").value(ch4.getId())) + .andExpect(jsonPath("$.content[0].type").value(ch4.getType().getLabel())) + .andExpect(jsonPath("$.content[0].detail").value(ch4.getDetail())) + .andExpect(jsonPath("$.content[0].amount").value(ch4.getAmount())) + .andExpect(jsonPath("$.content[1].id").value(ch1.getId())) + .andExpect(jsonPath("$.content[1].type").value(ch1.getType().getLabel())) + .andExpect(jsonPath("$.content[1].detail").value(ch1.getDetail())) + .andExpect(jsonPath("$.content[1].amount").value(ch1.getAmount())); + } + + @DisplayName("회원의 전체 크레딧 출금 내역을 조회한다.") + @Test + void getCreditHistoryByMemberInWithdrawal() throws Exception { + // given + Member member2 = MemberFixture.member2(); + memberRepository.save(member2); + + QuestionPost questionPost1 = QuestionPostFixture.questionPost(loginMember); + QuestionPost questionPost2 = QuestionPostFixture.questionPost(member2); + questionPostRepository.saveAll(List.of(questionPost1, questionPost2)); + + Answer answer1 = AnswerFixture.answer(questionPost1.getId(), member2); + Answer answer2 = AnswerFixture.answer(questionPost2.getId(), loginMember); + answerRepository.saveAll(List.of(answer1, answer2)); + + CreditHistory ch1 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost1.getMember()); + CreditHistory ch2 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer1.getMember()); + CreditHistory ch3 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost2.getMember()); + CreditHistory ch4 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer2.getMember()); + creditHistoryRepository.saveAll(List.of(ch1, ch2, ch3, ch4)); + + // when // then + mockMvc.perform(get("/api/members/credit/histories") + .param("type", "출금") + .cookie(accessToken) + ) + .andExpect(status().isOk()) + .andDo(MockMvcResultHandlers.print()) + .andExpect(jsonPath("$.size").value(1)) + .andExpect(jsonPath("$.content[0].id").value(ch1.getId())) + .andExpect(jsonPath("$.content[0].type").value(ch1.getType().getLabel())) + .andExpect(jsonPath("$.content[0].detail").value(ch1.getDetail())) + .andExpect(jsonPath("$.content[0].amount").value(ch1.getAmount())); + } + + @DisplayName("회원의 전체 크레딧 입금 내역을 조회한다.") + @Test + void getCreditHistoryByMemberInDeposit() throws Exception { + // given + Member member2 = MemberFixture.member2(); + memberRepository.save(member2); + + QuestionPost questionPost1 = QuestionPostFixture.questionPost(loginMember); + QuestionPost questionPost2 = QuestionPostFixture.questionPost(member2); + questionPostRepository.saveAll(List.of(questionPost1, questionPost2)); + + Answer answer1 = AnswerFixture.answer(questionPost1.getId(), member2); + Answer answer2 = AnswerFixture.answer(questionPost2.getId(), loginMember); + answerRepository.saveAll(List.of(answer1, answer2)); + + CreditHistory ch1 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost1.getMember()); + CreditHistory ch2 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer1.getMember()); + CreditHistory ch3 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost2.getMember()); + CreditHistory ch4 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer2.getMember()); + creditHistoryRepository.saveAll(List.of(ch1, ch2, ch3, ch4)); + + // when // then + mockMvc.perform(get("/api/members/credit/histories") + .param("type", "입금") + .cookie(accessToken) + ) + .andExpect(status().isOk()) + .andDo(MockMvcResultHandlers.print()) + .andExpect(jsonPath("$.size").value(1)) + .andExpect(jsonPath("$.content[0].id").value(ch4.getId())) + .andExpect(jsonPath("$.content[0].type").value(ch4.getType().getLabel())) + .andExpect(jsonPath("$.content[0].detail").value(ch4.getDetail())) + .andExpect(jsonPath("$.content[0].amount").value(ch4.getAmount())); + } } diff --git a/src/test/java/com/dnd/gongmuin/member/repository/MemberRepositoryTest.java b/src/test/java/com/dnd/gongmuin/member/repository/MemberRepositoryTest.java index e388d57a..ca2c7628 100644 --- a/src/test/java/com/dnd/gongmuin/member/repository/MemberRepositoryTest.java +++ b/src/test/java/com/dnd/gongmuin/member/repository/MemberRepositoryTest.java @@ -21,10 +21,15 @@ import com.dnd.gongmuin.common.fixture.MemberFixture; import com.dnd.gongmuin.common.fixture.QuestionPostFixture; import com.dnd.gongmuin.common.support.DataJpaTestSupport; +import com.dnd.gongmuin.credit_history.domain.CreditHistory; +import com.dnd.gongmuin.credit_history.domain.CreditType; +import com.dnd.gongmuin.credit_history.fixture.CreditHistoryFixture; +import com.dnd.gongmuin.credit_history.repository.CreditHistoryRepository; import com.dnd.gongmuin.member.domain.Member; -import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsByMemberResponse; -import com.dnd.gongmuin.member.dto.response.BookmarksByMemberResponse; -import com.dnd.gongmuin.member.dto.response.QuestionPostsByMemberResponse; +import com.dnd.gongmuin.member.dto.response.AnsweredQuestionPostsResponse; +import com.dnd.gongmuin.member.dto.response.BookmarksResponse; +import com.dnd.gongmuin.member.dto.response.CreditHistoryResponse; +import com.dnd.gongmuin.member.dto.response.QuestionPostsResponse; import com.dnd.gongmuin.post_interaction.domain.Interaction; import com.dnd.gongmuin.post_interaction.domain.InteractionCount; import com.dnd.gongmuin.post_interaction.domain.InteractionType; @@ -52,8 +57,12 @@ class MemberRepositoryTest extends DataJpaTestSupport { @Autowired InteractionRepository interactionRepository; + @Autowired + private CreditHistoryRepository creditHistoryRepository; + @AfterEach void tearDown() { + creditHistoryRepository.deleteAll(); answerRepository.deleteAll(); interactionCountRepository.deleteAll(); questionPostRepository.deleteAll(); @@ -88,18 +97,18 @@ void getQuestionPostsByMember() { questionPostRepository.saveAll(List.of(questionPost1, questionPost2, questionPost3)); // when - Slice postsByMember = memberRepository.getQuestionPostsByMember(member1, + Slice postsByMember = memberRepository.getQuestionPostsByMember(member1, pageRequest); // then Assertions.assertAll( () -> assertThat(postsByMember).hasSize(2), - () -> assertThat(postsByMember).extracting(QuestionPostsByMemberResponse::title) + () -> assertThat(postsByMember).extracting(QuestionPostsResponse::questionTitle) .containsExactly( questionPost2.getTitle(), questionPost1.getTitle() ), - () -> assertThat(postsByMember).extracting(QuestionPostsByMemberResponse::questionPostId) + () -> assertThat(postsByMember).extracting(QuestionPostsResponse::questionPostId) .containsExactly( questionPost2.getId(), questionPost1.getId() @@ -131,28 +140,28 @@ void getQuestionPostsByMemberWithInteractionCount() { interactionCountRepository.saveAll(List.of(interactionCount1, interactionCount2)); // when - Slice postsByMember = memberRepository.getQuestionPostsByMember(member1, + Slice postsByMember = memberRepository.getQuestionPostsByMember(member1, pageRequest); // then Assertions.assertAll( () -> assertThat(postsByMember).hasSize(2), - () -> assertThat(postsByMember).extracting(QuestionPostsByMemberResponse::questionPostId) + () -> assertThat(postsByMember).extracting(QuestionPostsResponse::questionPostId) .containsExactly( questionPost2.getId(), questionPost1.getId() ), - () -> assertThat(postsByMember).extracting(QuestionPostsByMemberResponse::title) + () -> assertThat(postsByMember).extracting(QuestionPostsResponse::questionTitle) .containsExactly( questionPost2.getTitle(), questionPost1.getTitle() ), - () -> assertThat(postsByMember).extracting(QuestionPostsByMemberResponse::savedTotalCount) + () -> assertThat(postsByMember).extracting(QuestionPostsResponse::bookmarkCount) .containsExactly( 0, 10 ), - () -> assertThat(postsByMember).extracting(QuestionPostsByMemberResponse::recommendTotalCount) + () -> assertThat(postsByMember).extracting(QuestionPostsResponse::recommendCount) .containsExactly( 0, 20 @@ -180,23 +189,23 @@ void getAnsweredQuestionPostsByMember() { answerRepository.saveAll(List.of(answer1, answer2, answer3, answer4)); // when - Slice postsByMember = + Slice postsByMember = memberRepository.getAnsweredQuestionPostsByMember(member1, pageRequest); // then Assertions.assertAll( () -> assertThat(postsByMember).hasSize(2), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::title) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::questionTitle) .containsExactly( questionPost3.getTitle(), questionPost1.getTitle() ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::questionPostId) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::questionPostId) .containsExactly( questionPost3.getId(), questionPost1.getId() ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::answerId) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::answerId) .containsExactly( answer4.getId(), answer1.getId() @@ -234,33 +243,33 @@ void getAnsweredQuestionPostsByMemberWithInteractionCount() { interactionCountRepository.saveAll(List.of(interactionCount1, interactionCount2)); // when - Slice postsByMember = + Slice postsByMember = memberRepository.getAnsweredQuestionPostsByMember(member1, pageRequest); // then Assertions.assertAll( () -> assertThat(postsByMember).hasSize(2), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::title) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::questionTitle) .containsExactly( questionPost3.getTitle(), questionPost1.getTitle() ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::questionPostId) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::questionPostId) .containsExactly( questionPost3.getId(), questionPost1.getId() ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::answerId) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::answerId) .containsExactly( answer4.getId(), answer1.getId() ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::savedTotalCount) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::bookmarkCount) .containsExactly( 0, 10 ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::recommendTotalCount) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::recommendCount) .containsExactly( 0, 20 @@ -297,7 +306,7 @@ void whenNoAnsweredQuestionPosts_thenGetQuestionPosts() { interactionCountRepository.saveAll(List.of(interactionCount1, interactionCount2)); // when - Slice postsByMember = + Slice postsByMember = memberRepository.getAnsweredQuestionPostsByMember(member2, pageRequest); // then @@ -329,21 +338,21 @@ void whenAnsweredQuestionPosts_thenGetQuestionPostsAtRecently() { answerRepository.save(answer2); // when - Slice postsByMember = + Slice postsByMember = memberRepository.getAnsweredQuestionPostsByMember(member1, pageRequest); // then Assertions.assertAll( () -> assertThat(postsByMember).hasSize(1), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::answerId) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::answerId) .containsExactly( answer2.getId() ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::answerCreatedAt) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::answerCreatedAt) .containsExactly( answer2.getUpdatedAt().toString() ), - () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsByMemberResponse::answerContent) + () -> assertThat(postsByMember).extracting(AnsweredQuestionPostsResponse::answerContent) .containsExactly( answer2.getContent() ) @@ -374,22 +383,173 @@ void getBookmarksByMember() { interactionRepository.saveAll(List.of(interaction1, interaction2, interaction3, interaction4)); // when - Slice bookmarksByMember = memberRepository.getBookmarksByMember(member1, + Slice bookmarksByMember = memberRepository.getBookmarksByMember(member1, pageRequest); // then Assertions.assertAll( () -> assertThat(bookmarksByMember).hasSize(2), - () -> assertThat(bookmarksByMember).extracting(BookmarksByMemberResponse::questionPostId) + () -> assertThat(bookmarksByMember).extracting(BookmarksResponse::questionPostId) .containsExactly( questionPost2.getId(), questionPost1.getId() ), - () -> assertThat(bookmarksByMember).extracting(BookmarksByMemberResponse::title) + () -> assertThat(bookmarksByMember).extracting(BookmarksResponse::questionTitle) .containsExactly( questionPost2.getTitle(), questionPost1.getTitle() ) ); } + + @DisplayName("회원의 전체 크리뎃 내역을 조회한다.") + @Test + void getCreditHistoryByMember() { + // given + Member member1 = MemberFixture.member(); + Member member2 = MemberFixture.member2(); + memberRepository.saveAll(List.of(member1, member2)); + + QuestionPost questionPost1 = QuestionPostFixture.questionPost(member1); + Answer answer1 = AnswerFixture.answer(questionPost1.getId(), member2); + QuestionPost questionPost2 = QuestionPostFixture.questionPost(member2); + Answer answer2 = AnswerFixture.answer(questionPost2.getId(), member1); + + CreditHistory ch1 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost1.getMember()); + CreditHistory ch2 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer1.getMember()); + CreditHistory ch3 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost2.getMember()); + CreditHistory ch4 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer2.getMember()); + creditHistoryRepository.saveAll(List.of(ch1, ch2, ch3, ch4)); + + // when + Slice creditHistoryByMember = memberRepository.getCreditHistoryByMember( + null, + member1, + pageRequest + ); + + // then + Assertions.assertAll( + () -> assertThat(creditHistoryByMember).hasSize(2), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::id) + .containsExactly( + ch4.getId(), + ch1.getId() + ), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::type) + .containsExactly( + ch4.getType().getLabel(), + ch1.getType().getLabel() + ), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::detail) + .containsExactly( + ch4.getDetail(), + ch1.getDetail() + ) + ); + } + + @DisplayName("회원의 전체 크레딧 출금 내역을 조회한다.") + @Test + void getCreditHistoryByMemberInWithdrawal() { + // given + Member member1 = MemberFixture.member(); + Member member2 = MemberFixture.member2(); + memberRepository.saveAll(List.of(member1, member2)); + + QuestionPost questionPost1 = QuestionPostFixture.questionPost(member1); + Answer answer1 = AnswerFixture.answer(questionPost1.getId(), member2); + QuestionPost questionPost2 = QuestionPostFixture.questionPost(member2); + Answer answer2 = AnswerFixture.answer(questionPost2.getId(), member1); + + CreditHistory ch1 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost1.getMember()); + CreditHistory ch2 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer1.getMember()); + CreditHistory ch3 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost2.getMember()); + CreditHistory ch4 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer2.getMember()); + List creditHistories = creditHistoryRepository.saveAll(List.of(ch1, ch2, ch3, ch4)); + for (CreditHistory ch : creditHistories) { + System.out.println("ch.getId() = " + ch.getId()); + System.out.println("ch.getType().getDetail() = " + ch.getType().getDetail()); + } + + // when + Slice creditHistoryByMember = memberRepository.getCreditHistoryByMember( + "출금", + member1, + pageRequest + ); + + // then + Assertions.assertAll( + () -> assertThat(creditHistoryByMember).hasSize(1), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::id) + .containsExactly( + ch1.getId() + ), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::type) + .containsExactly( + ch1.getType().getLabel() + ), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::detail) + .containsExactly( + ch1.getDetail() + ) + ); + } + + @DisplayName("회원의 전체 크리뎃 입금 내역을 조회한다.") + @Test + void getCreditHistoryByMemberInDeposit() { + // given + Member member1 = MemberFixture.member(); + Member member2 = MemberFixture.member2(); + memberRepository.saveAll(List.of(member1, member2)); + + QuestionPost questionPost1 = QuestionPostFixture.questionPost(member1); + Answer answer1 = AnswerFixture.answer(questionPost1.getId(), member2); + QuestionPost questionPost2 = QuestionPostFixture.questionPost(member2); + Answer answer2 = AnswerFixture.answer(questionPost2.getId(), member1); + + CreditHistory ch1 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost1.getMember()); + CreditHistory ch2 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer1.getMember()); + CreditHistory ch3 = CreditHistoryFixture.creditHistory(CreditType.CHOOSE, questionPost1.getReward(), + questionPost2.getMember()); + CreditHistory ch4 = CreditHistoryFixture.creditHistory(CreditType.CHOSEN, questionPost1.getReward(), + answer2.getMember()); + creditHistoryRepository.saveAll(List.of(ch1, ch2, ch3, ch4)); + + // when + Slice creditHistoryByMember = memberRepository.getCreditHistoryByMember( + "입금", + member1, + pageRequest + ); + + // then + Assertions.assertAll( + () -> assertThat(creditHistoryByMember).hasSize(1), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::id) + .containsExactly( + ch4.getId() + ), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::type) + .containsExactly( + ch4.getType().getLabel() + ), + () -> assertThat(creditHistoryByMember).extracting(CreditHistoryResponse::detail) + .containsExactly( + ch4.getDetail() + ) + ); + } } \ No newline at end of file