Skip to content

Commit

Permalink
회원 정보 조회 기능 구현 (#137)
Browse files Browse the repository at this point in the history
* fix: (#121) 사용자 닉네임이 정확하기 반환되지 않는 오류 수정

* feat: (#81) 회원 정보 조회 기능 구현

* test: (#81) post,vote 개수에 대한 repository 검증 추가

* refactor: (#81) 회원정보 dto 변수명 변경

* test: (#81) 회원 정보 조회를 위한 컨트롤러 검증 추가

* refactor: (#81) swagger 설정용 어노테이션 추가

* refactor: (#81) 회원 정보 조회 검증에서 불필요한 코드 제거

* refactor: (#81) 불필요한 코드 제거 및 conflict 해결 도중 삭제된 테스트 추가
  • Loading branch information
jeomxon authored Jul 27, 2023
1 parent f8bc6db commit c5a0d58
Show file tree
Hide file tree
Showing 8 changed files with 233 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.votogether.domain.member.controller;

import com.votogether.domain.member.dto.MemberInfoResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.service.MemberService;
import com.votogether.global.jwt.Auth;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "회원", description = "회원 API")
@RequiredArgsConstructor
@RequestMapping("/members")
@RestController
public class MemberController {

private final MemberService memberService;

@Operation(summary = "회원 정보 조회", description = "회원 정보를 반환한다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "정보 조회 성공"),
@ApiResponse(responseCode = "400", description = "올바르지 않은 요청"),
})
@GetMapping("/me")
public ResponseEntity<MemberInfoResponse> findMemberInfo(@Auth final Member member) {
return ResponseEntity.ok(memberService.findMemberInfo(member));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.votogether.domain.member.dto;

public record MemberInfoResponse(
String nickname,
Integer point,
int postCount,
int voteCount
) {
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.votogether.domain.member.service;

import com.votogether.domain.member.dto.MemberInfoResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.repository.MemberRepository;
import com.votogether.domain.post.repository.PostRepository;
import com.votogether.domain.vote.repository.VoteRepository;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -12,6 +15,8 @@
public class MemberService {

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

@Transactional
public Member register(final Member member) {
Expand All @@ -28,4 +33,17 @@ public Member findById(final Long memberId) {
.orElseThrow(() -> new IllegalArgumentException("해당 Id를 가진 회원은 존재하지 않습니다."));
}

@Transactional(readOnly = true)
public MemberInfoResponse findMemberInfo(final Member member) {
final int numberOfPosts = postRepository.countByMember(member);
final int numberOfVotes = voteRepository.countByMember(member);

return new MemberInfoResponse(
member.getNickname(),
member.getPoint(),
numberOfPosts,
numberOfVotes
);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.votogether.domain.post.repository;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.entity.Post;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<Post, Long> {

int countByMember(final Member member);

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,6 @@ List<VoteStatus> findVoteCountByPostOptionIdGroupByAgeRangeAndGender(

List<Vote> findByMemberAndPostOptionIn(final Member member, final List<PostOption> postOptions);

int countByMember(final Member member);

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

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;

import com.votogether.domain.member.dto.MemberInfoResponse;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.service.MemberService;
import com.votogether.global.jwt.TokenProcessor;
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.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;

@Import(TokenProcessor.class)
@WebMvcTest(MemberController.class)
class MemberControllerTest {

@MockBean
MemberService memberService;

@Autowired
TokenProcessor tokenProcessor;

@BeforeEach
void setUp() {
RestAssuredMockMvc.standaloneSetup(new MemberController(memberService));
}

@Test
@DisplayName("회원 정보를 조회한다.")
void findMemberInfo() {
// given
MemberInfoResponse memberInfoResponse = new MemberInfoResponse(
"저문",
1234,
0,
0
);

given(memberService.findMemberInfo(any(Member.class))).willReturn(memberInfoResponse);

// when
MemberInfoResponse response = RestAssuredMockMvc
.given().log().all()
.when().get("/members/me")
.then().log().all()
.extract()
.as(MemberInfoResponse.class);

// then
assertAll(
() -> assertThat(response.nickname()).isEqualTo("저문"),
() -> assertThat(response.point()).isEqualTo(1234),
() -> assertThat(response.postCount()).isEqualTo(0),
() -> assertThat(response.voteCount()).isEqualTo(0)
);
}

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

import com.votogether.RepositoryTest;
import com.votogether.domain.member.entity.Gender;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.entity.SocialType;
import com.votogether.domain.member.repository.MemberRepository;
import com.votogether.domain.post.entity.Post;
import com.votogether.domain.post.entity.PostBody;
import com.votogether.fixtures.MemberFixtures;
import java.time.LocalDateTime;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand All @@ -17,33 +18,90 @@
class PostRepositoryTest {

@Autowired
PostRepository postRepository;
private PostRepository postRepository;

@Autowired
MemberRepository memberRepository;
private MemberRepository memberRepository;

@Test
@DisplayName("Post를 저장한다")
void save() {
// given
Member member = memberRepository.save(MemberFixtures.MALE_EARLY_10.get());
final PostBody postBody = PostBody.builder()
.title("title")
.content("content")
.build();

final Member member = Member.builder()
.gender(Gender.MALE)
.point(0)
.socialType(SocialType.KAKAO)
.nickname("user1")
.gender(Gender.MALE)
.birthday("0718")
.ageRange("10~14")
.socialType(SocialType.KAKAO)
.socialId("kakao@gmail.com")
.ageRange("30~39")
.birthday("0101")
.point(0)
.build();

final Post post = Post.builder()
.member(member)
.postBody(postBody)
.deadline(LocalDateTime.of(2100, 7, 12, 0, 0))
.build();

memberRepository.save(member);

// when
final Post savedPost = postRepository.save(post);

// then
assertThat(savedPost).isNotNull();
}

@Test
@DisplayName("해당 멤버가 작성한 글의 개수를 확인한다.")
void countByMember() {
// given
Member member = Member.builder()
.nickname("user1")
.gender(Gender.MALE)
.socialType(SocialType.KAKAO)
.socialId("kakao@gmail.com")
.ageRange("30~39")
.birthday("0101")
.point(0)
.build();

PostBody postBody = PostBody.builder()
.title("title")
.content("content")
.build();

Post post = Post.builder()
Post post1 = Post.builder()
.member(member)
.postBody(postBody)
.deadline(LocalDateTime.of(2100, 7, 12, 0, 0))
.build();

Post post2 = Post.builder()
.member(member)
.postBody(postBody)
.deadline(LocalDateTime.of(2100, 7, 12, 0, 0))
.build();

memberRepository.save(member);
postRepository.save(post1);
postRepository.save(post2);

// when
Post savedPost = postRepository.save(post);
int numberOfPosts = postRepository.countByMember(member);

// then
assertThat(savedPost).isNotNull();
assertThat(numberOfPosts).isEqualTo(2);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -252,4 +252,38 @@ void findVoteCountByPostOptionIdGroupByAgeRangeAndGender() {
);
}

@Test
@DisplayName("해당 회원이 투표한 개수를 반환한다.")
void countByMember() {
// given
Member member = memberRepository.save(MemberFixtures.MALE_LATE_10.get());
Member writer = memberRepository.save(MemberFixtures.MALE_20.get());
Post post = postRepository.save(
Post.builder()
.member(writer)
.postBody(PostBody.builder().title("title").content("content").build())
.deadline(LocalDateTime.of(2100, 7, 12, 0, 0))
.build()
);
PostOption postOption = postOptionRepository.save(
PostOption.builder()
.post(post)
.sequence(1)
.content("치킨")
.build()
);
Vote vote = Vote.builder()
.member(member)
.postOption(postOption)
.build();

voteRepository.save(vote);

// when
int numberOfVote = voteRepository.countByMember(member);

// then
assertThat(numberOfVote).isEqualTo(1);
}

}

0 comments on commit c5a0d58

Please sign in to comment.