Skip to content

Commit

Permalink
refactor: (#515) ranking 도메인 패키지로 변경
Browse files Browse the repository at this point in the history
  • Loading branch information
aiaiaiai1 committed Sep 8, 2023
1 parent 9db3cd2 commit 056f762
Show file tree
Hide file tree
Showing 14 changed files with 230 additions and 108 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.votogether.domain.member.dto.request.MemberDetailRequest;
import com.votogether.domain.member.dto.request.MemberNicknameUpdateRequest;
import com.votogether.domain.member.dto.response.MemberInfoResponse;
import com.votogether.domain.member.dto.response.RankingResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.service.MemberService;
import com.votogether.global.jwt.Auth;
Expand Down Expand Up @@ -38,12 +37,6 @@ public ResponseEntity<Void> changeNickname(
return ResponseEntity.ok().build();
}

@GetMapping("/me/ranking")
public ResponseEntity<RankingResponse> getRanking(@Auth final Member member) {
final RankingResponse response = memberService.getRanking(member);
return ResponseEntity.ok(response);
}

@PatchMapping("/me/detail")
public ResponseEntity<Void> updateDetails(
@Valid @RequestBody final MemberDetailRequest request,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.votogether.domain.member.dto.request.MemberDetailRequest;
import com.votogether.domain.member.dto.request.MemberNicknameUpdateRequest;
import com.votogether.domain.member.dto.response.MemberInfoResponse;
import com.votogether.domain.member.dto.response.RankingResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.global.exception.ExceptionResponse;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -35,10 +34,6 @@ ResponseEntity<Void> changeNickname(
final Member member
);

@Operation(summary = "랭킹 조회", description = "회원 랭킹 정보를 조회한다.")
@ApiResponse(responseCode = "200", description = "회원 랭킹 정보 조회 성공")
ResponseEntity<RankingResponse> getRanking(final Member member);

@Operation(summary = "회원 상세 정보 변경", description = "회원의 상세 정보를 변경한다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "회원 상세 정보 변경 성공"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import com.votogether.domain.member.dto.request.MemberDetailRequest;
import com.votogether.domain.member.dto.response.MemberInfoResponse;
import com.votogether.domain.member.dto.response.RankingResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.entity.MemberCategory;
import com.votogether.domain.member.entity.vo.ActivityRecord;
import com.votogether.domain.member.entity.vo.Nickname;
import com.votogether.domain.member.exception.MemberExceptionType;
import com.votogether.domain.member.repository.MemberCategoryRepository;
Expand All @@ -21,9 +19,7 @@
import com.votogether.domain.vote.repository.VoteRepository;
import com.votogether.global.exception.BadRequestException;
import com.votogether.global.exception.NotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -69,32 +65,6 @@ public MemberInfoResponse findMemberInfo(final Member member) {
);
}

@Transactional(readOnly = true)
public RankingResponse getRanking(final Member member) {
final RankingBoard rankingBoard = getRankingBoard();
return new RankingResponse(
rankingBoard.getRanking(member),
member.getNickname(),
rankingBoard.getActivityRecord(member).getPostCount(),
rankingBoard.getActivityRecord(member).getVoteCount(),
rankingBoard.getScore(member)
);
}

private RankingBoard getRankingBoard() {
final List<Member> members = memberRepository.findAll();
final List<Integer> postCounts = postRepository.findCountsByMembers(members);
final List<Integer> voteCounts = voteRepository.findCountsByMembers(members);

final Map<Member, ActivityRecord> passionBoard = new HashMap<>();

for (int i = 0; i < members.size(); i++) {
passionBoard.put(members.get(i), new ActivityRecord(postCounts.get(i), voteCounts.get(i)));
}

return new RankingBoard(passionBoard);
}

@Transactional
public void changeNickname(final Member member, final String nickname) {
validateExistentNickname(nickname);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.votogether.domain.member.service;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.entity.vo.ActivityRecord;
import com.votogether.domain.ranking.domain.ActivityRecord;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.votogether.domain.ranking.controller;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.ranking.dto.response.RankingResponse;
import com.votogether.domain.ranking.service.RankingService;
import com.votogether.global.jwt.Auth;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
public class RankingController implements RankingControllerDocs {

private final RankingService rankingService;

@GetMapping("members/me/ranking")
public ResponseEntity<RankingResponse> getRanking(@Auth final Member member) {
final RankingResponse response = rankingService.getRanking(member);
return ResponseEntity.ok(response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.votogether.domain.ranking.controller;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.ranking.dto.response.RankingResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;

@Tag(name = "랭킹", description = "랭킹 API")
public interface RankingControllerDocs {

@Operation(summary = "랭킹 조회", description = "회원 랭킹 정보를 조회한다.")
@ApiResponse(responseCode = "200", description = "회원 랭킹 정보 조회 성공")
ResponseEntity<RankingResponse> getRanking(final Member member);

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.votogether.domain.member.entity.vo;
package com.votogether.domain.ranking.domain;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.votogether.domain.member.dto.response;
package com.votogether.domain.ranking.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.votogether.domain.ranking.service;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.repository.MemberRepository;
import com.votogether.domain.member.service.RankingBoard;
import com.votogether.domain.post.repository.PostRepository;
import com.votogether.domain.ranking.domain.ActivityRecord;
import com.votogether.domain.ranking.dto.response.RankingResponse;
import com.votogether.domain.vote.repository.VoteRepository;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Service
public class RankingService {

private final MemberRepository memberRepository;
private final PostRepository postRepository;
private final VoteRepository voteRepository;

@Transactional(readOnly = true)
public RankingResponse getRanking(final Member member) {
final RankingBoard rankingBoard = getRankingBoard();
return new RankingResponse(
rankingBoard.getRanking(member),
member.getNickname(),
rankingBoard.getActivityRecord(member).getPostCount(),
rankingBoard.getActivityRecord(member).getVoteCount(),
rankingBoard.getScore(member)
);
}

private RankingBoard getRankingBoard() {
final List<Member> members = memberRepository.findAll();
final List<Integer> postCounts = postRepository.findCountsByMembers(members);
final List<Integer> voteCounts = voteRepository.findCountsByMembers(members);

final Map<Member, ActivityRecord> passionBoard = new HashMap<>();

for (int i = 0; i < members.size(); i++) {
passionBoard.put(members.get(i), new ActivityRecord(postCounts.get(i), voteCounts.get(i)));
}

return new RankingBoard(passionBoard);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import com.votogether.domain.member.dto.request.MemberDetailRequest;
import com.votogether.domain.member.dto.request.MemberNicknameUpdateRequest;
import com.votogether.domain.member.dto.response.MemberInfoResponse;
import com.votogether.domain.member.dto.response.RankingResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.entity.vo.Gender;
import com.votogether.domain.member.entity.vo.SocialType;
Expand Down Expand Up @@ -248,31 +247,4 @@ void deleteMember() throws Exception {
.statusCode(HttpStatus.NO_CONTENT.value());
}

@Test
@DisplayName("회원의 랭킹 순위를 가져온다.")
void getRanking() throws Exception {
// given
Member member = MemberFixtures.MALE_20.get();
RankingResponse response = new RankingResponse(3, "익명의손님1", 1, 1, 6);

TokenPayload tokenPayload = new TokenPayload(1L, 1L, 1L);
given(tokenProcessor.resolveToken(anyString())).willReturn("token");
given(tokenProcessor.parseToken(anyString())).willReturn(tokenPayload);
given(memberService.findById(anyLong())).willReturn(member);

given(memberService.getRanking(member)).willReturn(response);

// when, then
RankingResponse result = RestAssuredMockMvc
.given().log().all()
.headers(HttpHeaders.AUTHORIZATION, "Bearer token")
.when().get("/members/me/ranking")
.then().log().all()
.statusCode(HttpStatus.OK.value())
.extract()
.as(RankingResponse.class);

assertThat(result).isEqualTo(response);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;

import com.votogether.domain.member.entity.vo.ActivityRecord;
import com.votogether.domain.member.service.RankingBoard;
import com.votogether.domain.ranking.domain.ActivityRecord;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.DisplayName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import com.votogether.domain.category.entity.Category;
import com.votogether.domain.category.repository.CategoryRepository;
import com.votogether.domain.member.dto.request.MemberDetailRequest;
import com.votogether.domain.member.dto.response.RankingResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.entity.MemberCategory;
import com.votogether.domain.member.entity.vo.Gender;
Expand Down Expand Up @@ -460,37 +459,4 @@ void deleteWithReportedNickname() {

}

@Test
@DisplayName("회원의 랭킹을 조회한다.")
void getRanking() {
// given
Member member = memberTestPersister.builder().save();
Member member1 = memberTestPersister.builder().save();
Member member2 = memberTestPersister.builder().save();
Member member3 = memberTestPersister.builder().save();
Member member4 = memberTestPersister.builder().save();

postTestPersister.builder().writer(member).save();
postTestPersister.builder().writer(member1).save();
postTestPersister.builder().writer(member2).save();
postTestPersister.builder().writer(member3).save();

voteTestPersister.builder().member(member).save();
voteTestPersister.builder().member(member2).save();
voteTestPersister.builder().member(member3).save();
voteTestPersister.builder().member(member3).save();
voteTestPersister.builder().member(member4).save();

// when
RankingResponse response = memberService.getRanking(member);

// then (score: 6,5,7,6,1)
assertAll(
() -> assertThat(response.ranking()).isEqualTo(2),
() -> assertThat(response.postCount()).isEqualTo(1),
() -> assertThat(response.voteCount()).isEqualTo(1),
() -> assertThat(response.score()).isEqualTo(6)
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.votogether.domain.ranking.controller;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.service.MemberService;
import com.votogether.domain.ranking.dto.response.RankingResponse;
import com.votogether.domain.ranking.service.RankingService;
import com.votogether.global.jwt.TokenPayload;
import com.votogether.global.jwt.TokenProcessor;
import com.votogether.test.fixtures.MemberFixtures;
import io.restassured.module.mockmvc.RestAssuredMockMvc;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.web.context.WebApplicationContext;

@WebMvcTest(RankingController.class)
class RankingControllerTest {

@MockBean
RankingService rankingService;

@MockBean
MemberService memberService;

@MockBean
TokenProcessor tokenProcessor;

@BeforeEach
void setUp(final WebApplicationContext webApplicationContext) {
RestAssuredMockMvc.standaloneSetup(new RankingController(rankingService));
RestAssuredMockMvc.webAppContextSetup(webApplicationContext);
}

@Test
@DisplayName("회원의 랭킹 순위를 가져온다.")
void getRanking() throws Exception {
// given
Member member = MemberFixtures.MALE_20.get();
RankingResponse response = new RankingResponse(3, "익명의손님1", 1, 1, 6);

TokenPayload tokenPayload = new TokenPayload(1L, 1L, 1L);
given(tokenProcessor.resolveToken(anyString())).willReturn("token");
given(tokenProcessor.parseToken(anyString())).willReturn(tokenPayload);
given(memberService.findById(anyLong())).willReturn(member);

given(rankingService.getRanking(member)).willReturn(response);

// when, then
RankingResponse result = RestAssuredMockMvc
.given().log().all()
.headers(HttpHeaders.AUTHORIZATION, "Bearer token")
.when().get("/members/me/ranking")
.then().log().all()
.statusCode(HttpStatus.OK.value())
.extract()
.as(RankingResponse.class);

assertThat(result).isEqualTo(response);
}

}
Loading

0 comments on commit 056f762

Please sign in to comment.