Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: 회원 탈퇴 시, 쿠키 삭제 및 비즈니스 로직 리팩토링 #278

Merged
merged 4 commits into from
Oct 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public EnvelopeResponse<CreateMemberTokensResDto> login(
AuthenticatedMember authenticatedMember = memberService.createMemberByOauthIdentifier(postMemberReqDto);
CreateMemberTokensResDto createMemberTokensResDto = authService.createToken(authenticatedMember);

Member member = memberService.saveTokenByMember(authenticatedMember, createMemberTokensResDto);
Member member = memberService.saveTokenByMember(authenticatedMember.getMemberId(), createMemberTokensResDto);

cookieProvider.setResponseWithCookies(
response,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.ssafy.ssafsound.domain.member.controller;

import com.ssafy.ssafsound.domain.auth.dto.AuthenticatedMember;
import com.ssafy.ssafsound.domain.auth.service.CookieProvider;
import com.ssafy.ssafsound.domain.auth.validator.Authentication;
import com.ssafy.ssafsound.domain.member.dto.*;
import com.ssafy.ssafsound.domain.member.service.MemberService;
import com.ssafy.ssafsound.global.common.response.EnvelopeResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

@RestController
Expand All @@ -16,6 +18,7 @@
public class MemberController {

private final MemberService memberService;
private final CookieProvider cookieProvider;

@GetMapping
public EnvelopeResponse<GetMemberResDto> getMemberInformation(
Expand Down Expand Up @@ -165,9 +168,11 @@ public EnvelopeResponse<Void> changeMemberNickname(
}

@DeleteMapping
public EnvelopeResponse<Void> leaveMember(@Authentication AuthenticatedMember authenticatedMember) {
public EnvelopeResponse<Void> leaveMember(
@Authentication AuthenticatedMember authenticatedMember,
HttpServletResponse response) {
memberService.leaveMember(authenticatedMember.getMemberId());

cookieProvider.setResponseWithCookies(response, null, null);
return EnvelopeResponse.<Void>builder()
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByOauthIdentifier(String oauthIdentifier);
Member findByOauthIdentifier(String oauthIdentifier);

boolean existsByNickname(String nickname);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;

Expand All @@ -55,33 +56,30 @@ public class MemberService {

@Transactional
public AuthenticatedMember createMemberByOauthIdentifier(PostMemberReqDto postMemberReqDto) {
Optional<Member> optionalMember = memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier());
Member member;
if (optionalMember.isPresent()) {
member = optionalMember.get();
if (isInvalidOauthLogin(member, postMemberReqDto)) {
throw new MemberException(MemberErrorInfo.MEMBER_OAUTH_NOT_FOUND);
} else if(isDeletedMember(member)) {
throw new MemberException(MemberErrorInfo.MEMBER_DELETED);
}
return AuthenticatedMember.from(member);
} else {
Member member = memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier());

if (Objects.isNull(member)) {
MemberRole memberRole = findMemberRoleByRoleName("user");
member = postMemberReqDto.createMember();
member.setMemberRole(memberRole);
return AuthenticatedMember.from(memberRepository.save(member));
} else if (isInvalidOauthLogin(member, postMemberReqDto)) {
throw new MemberException(MemberErrorInfo.MEMBER_OAUTH_NOT_FOUND);
} else if (isDeletedMember(member)) {
throw new MemberException(MemberErrorInfo.MEMBER_DELETED);
}

return AuthenticatedMember.from(member);
}

@Transactional
public Member saveTokenByMember(
AuthenticatedMember authenticatedMember,
Long memberId,
CreateMemberTokensResDto createMemberTokensResDto) {
Member member = memberRepository.findById(authenticatedMember.getMemberId())
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new MemberException(MemberErrorInfo.MEMBER_NOT_FOUND_BY_ID));

Optional<MemberToken> memberTokenOptional = memberTokenRepository
.findById(authenticatedMember.getMemberId());
Optional<MemberToken> memberTokenOptional = memberTokenRepository.findById(memberId);

memberTokenOptional.ifPresentOrElse(
memberToken -> changeMemberTokens(memberToken, createMemberTokensResDto),
Expand Down Expand Up @@ -204,6 +202,7 @@ public void leaveMember(Long memberId) {
Member member = getMemberByMemberIdOrThrowException(memberId);
member.setAccountStateDeleted();
member.changeNickname("@" + member.getId());
memberTokenRepository.deleteById(memberId);
applicationEventPublisher.publishEvent(new MemberLeavedEvent(member.getId()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ void Given_OauthIdentifier_When_SaveMember_Then_Success() {
Member member = memberFixture.createGeneralMember();
PostMemberReqDto postMemberReqDto = memberFixture.createPostMemberReqDto();
given(memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier()))
.willReturn(Optional.empty());
.willReturn(null);
given(memberRoleRepository.findByRoleType("user")).willReturn(Optional.of(member.getRole()));
given(memberRepository.save(any())).willReturn(member);

Expand All @@ -102,7 +102,7 @@ void Given_ExistOauthIdentifier_When_FindMember_Then_Success() {
Member member = memberFixture.createGeneralMember();
PostMemberReqDto postMemberReqDto = memberFixture.createPostMemberReqDto();
given(memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier()))
.willReturn(Optional.of(member));
.willReturn(member);
//when
AuthenticatedMember response = memberService.createMemberByOauthIdentifier(postMemberReqDto);

Expand All @@ -122,7 +122,7 @@ void Given_OauthIdentifier_When_CompareIncorrectRequest_Then_ThrowException() {
PostMemberReqDto postMemberReqDto = memberFixture.createPostMemberReqDto();
Member member = memberFixture.createInitializerMember();
given(memberRepository.findByOauthIdentifier(postMemberReqDto.getOauthIdentifier()))
.willReturn(Optional.of(member));
.willReturn(member);

//when, then
assertThrows(MemberException.class,
Expand All @@ -138,65 +138,58 @@ void Given_OauthIdentifier_When_CompareIncorrectRequest_Then_ThrowException() {
void Given_Tokens_When_InitializeMember_Then_Success() {
//given
Member member = memberFixture.createInitializerMember();
AuthenticatedMember authenticatedMember = AuthenticatedMember.from(member);
given(memberTokenRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.empty());
given(memberRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.of(member));
given(memberTokenRepository.findById(member.getId())).willReturn(Optional.empty());
given(memberRepository.findById(member.getId())).willReturn(Optional.of(member));

//when
Member response = memberService
.saveTokenByMember(authenticatedMember, memberFixture.createMemberTokensResDto());
Member response = memberService.saveTokenByMember(member.getId(), memberFixture.createMemberTokensResDto());

//then
assertAll(
() -> assertEquals(response.getId(), authenticatedMember.getMemberId()),
() -> assertEquals(response.getRole().getRoleType(), authenticatedMember.getMemberRole())
() -> assertEquals(response.getId(), member.getId()),
() -> assertEquals(response.getRole().getRoleType(), member.getRole().getRoleType())
);


//verify
verify(memberTokenRepository, times(1))
.findById(authenticatedMember.getMemberId());
verify(memberRepository, times(1))
.findById(authenticatedMember.getMemberId());
verify(memberTokenRepository, times(1)).findById(member.getId());
verify(memberRepository, times(1)).findById(member.getId());
}

@Test
@DisplayName("Member가 토큰을 발급한 적이 있다면 새로운 토큰들로 저장한다.")
void Given_Tokens_When_JoinedMember_Then_SuccessExchangeTokens() {
//given
MemberToken memberToken = memberFixture.createMemberToken();
AuthenticatedMember authenticatedMember = AuthenticatedMember.from(memberToken.getMember());
given(memberRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.of(memberToken.getMember()));
given(memberTokenRepository.findById(authenticatedMember.getMemberId()))
.willReturn(Optional.of(memberToken));
MemberToken memberToken = memberFixture.createMemberToken(memberFixture.createGeneralMember());
Long memberId = memberToken.getId();
given(memberRepository.findById(memberId)).willReturn(Optional.of(memberToken.getMember()));
given(memberTokenRepository.findById(memberId)).willReturn(Optional.of(memberToken));

//when
Member response = memberService.saveTokenByMember(authenticatedMember, memberFixture.createMemberTokensResDto());
Member response = memberService.saveTokenByMember(memberToken.getId(), memberFixture.createMemberTokensResDto());

//then
assertAll(
() -> assertEquals(response.getId(), authenticatedMember.getMemberId()),
() -> assertEquals(response.getRole().getRoleType(), authenticatedMember.getMemberRole())
() -> assertEquals(response.getId(), memberId),
() -> assertEquals(response.getRole().getRoleType(), memberToken.getMember().getRole().getRoleType())
);

//verify
verify(memberRepository, times(1)).findById(authenticatedMember.getMemberId());
verify(memberTokenRepository, times(1)).findById(authenticatedMember.getMemberId());
verify(memberRepository, times(1)).findById(memberId);
verify(memberTokenRepository, times(1)).findById(memberId);
}

@Test
@DisplayName("가입이 안된 Member라면 토큰 발급을 시도하면 예외가 발생한다.")
void Given_Member_When_NotJoinedMember_Then_ThrowMemberException() {
//given
AuthenticatedMember authenticatedMember = AuthenticatedMember.from(memberFixture.createInitializerMember());
Long memberId = authenticatedMember.getMemberId();
given(memberRepository.findById(any())).willReturn(Optional.empty());

//when, then
assertThrows(MemberException.class,
() -> memberService.saveTokenByMember(authenticatedMember, memberFixture.createMemberTokensResDto()));
() -> memberService.saveTokenByMember(memberId, memberFixture.createMemberTokensResDto()));

//verify
verify(memberRepository, times(1)).findById(authenticatedMember.getMemberId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,10 @@ public CreateMemberTokensResDto createMemberTokensResDto() {
.build();
}

public MemberToken createMemberToken() {
public MemberToken createMemberToken(Member member) {
return MemberToken.builder()
.member(createGeneralMember())
.id(member.getId())
.member(member)
.accessToken(AuthFixture.accessToken)
.refreshToken(AuthFixture.refreshToken)
.build();
Expand Down
Loading